/*
Theme Name:   BSP Corp Child
Theme URI:    https://www.bspcorp.co
Description:  Thème enfant Divi 5 pour la refonte bspcorp.co: BSP Corp, Zoho Premium Partner. Tout le CSS custom du site vit dans ce fichier.
Author:       Clément Gendron
Author URI:   https://www.bspcorp.co
Template:     Divi
Version:      0.2.0
License:      GNU General Public License v2 or later
License URI:  http://www.gnu.org/licenses/gpl-2.0.html
Text Domain:  bsp-corp-child
*/

/* =============================================================
   BSP CORP: FEUILLE DE STYLE DU THÈME ENFANT
   -------------------------------------------------------------
   Fichier unique, éditable depuis WordPress :
   Apparence → Thèmes → Éditeur de fichiers du thème → style.css

   SOMMAIRE: les bandeaux ci-dessous découpent le fichier.
   Cherche le numéro pour sauter directement à une partie.

     01 · TOKENS            variables de design (couleurs, typo, espacements)
     02 · BASE              typographie globale, éléments de base
     03 · DIVI OVERRIDES    neutralisation des styles Divi par défaut
     04 · COMPONENTS        composants BSP réutilisables (.bsp-*)
     05 · UTILITIES         classes utilitaires
     06 · HOME              page d'accueil, section par section

   Le JavaScript est dans assets/js/bsp-custom.js
   (même éditeur, dossier « assets »).
   ============================================================= */



/* =============================================================
   01: TOKENS · Variables de design
   (anciennement assets/css/01-tokens.css)
   ============================================================= */

/* Taille unique des titres de bandeau (accueil, blogue, étude de cas, équipe) : un seul réglage. */
:root { --bsp-banner-title-size: clamp(34px, 2.8vw, 50px); }

:root {

	/* --- Couleurs de marque ---------------------------------------
	   Valeurs reprises de la maquette de référence index-2.html.
	   Les jetons portent leur RÔLE, pas leur teinte : le jour où
	   l'accent change, seul ce bloc bouge.
	   Contrastes mesurés (WCAG 2.1) :
	     accent sur fond général  5,74:1  → conforme AA
	     accent clair sur fond    8,10:1  → conforme AAA
	     blanc sur --bsp-accent-fill  5,03:1  → conforme AA (aplat assombri exprès)
	   --------------------------------------------------------------- */
	--bsp-accent:       #118CFE;        /* accent sur fond sombre */
	--bsp-accent-hover: #45AEFF;        /* survol, variante claire */
	--bsp-accent-rgb:   17, 140, 254;   /* pour les rgba() */
	--bsp-brand-blue:   #1057B7;        /* bleu de marque : fond des bandeaux (« clients », valeurs des études de cas). Fourni par Clément le 21 sept. 2026: identique dans les deux thèmes. Les BOUTONS gardent --bsp-accent-fill. Blanc dessus : 6,8:1 (AA) */
	--bsp-accent-fill:  #0D6DC4;        /* aplat portant du texte blanc: 5,25:1, conforme AA */
	--bsp-accent-fill-hover: #0A5497;   /* survol du même aplat: 7,70:1 */
	--bsp-bg-deep:      #061E3C;        /* fond de marque profond: bleu 213°, 19 sept. 2026 (était #061147, teinte 230°) */

	/* --- Fonds --- */
	--bsp-bg:         #0a0d14;   /* fond général dark */
	--bsp-bg-footer:  #060810;   /* fond footer */
	--bsp-footer-surface: #1B1E27; /* surface du pied de page (la maquette), un ton au-dessus de --bsp-bg-footer ; suit le thème */

	/* --- Texte --- */
	--bsp-text:       #ffffff;
	--bsp-text-soft:  rgba(255, 255, 255, 0.72);
	--bsp-body:       #cdd2da; /* texte courant : gris clair, plus de blanc pur (5 oct. 2026) */
	--bsp-text-faint: rgba(255, 255, 255, 0.6);

	/* --- Typographie --- */
	--bsp-font-display: 'Playfair Display', Georgia, serif;          /* titres hero, stats */
	--bsp-font-label:   'Montserrat', Helvetica, Arial, sans-serif;  /* nav, eyebrow, boutons */
	--bsp-font-body:    'Source Sans 3', 'Source Sans Pro', Helvetica, Arial, sans-serif;

	/* --- Espacements ------------------------------------------------
	   Une échelle, pas des valeurs choisies au cas par cas. Quatre
	   crans suffisent, et les rôles nommés en dessous y pointent :
	   changer un cran change tout le site d'un coup.

	   ⚠️ Ces valeurs s'appliquent élément par élément, JAMAIS par une
	   règle globale du genre « tous les modules à zéro ». Une remise à
	   zéro ancrée sur un parent compte deux classes et écrase les
	   règles à une seule : on obtient alors des marges écrites et sans
	   effet, ce qui est pire qu'aucune marge du tout.
	   ----------------------------------------------------------------- */
	--bsp-space-1:      12px;         /* entre deux lignes d'un même bloc */
	--bsp-space-2:      22px;         /* entre un surtitre et son titre */
	--bsp-space-3:      28px;         /* sous un titre suivi de contenu */
	--bsp-space-4:      40px;         /* avant un bouton, ou entre deux blocs */

	--bsp-space-title:  var(--bsp-space-3);   /* air sous un titre de section */
	--bsp-gutter:       80px;         /* marge latérale standard (nav, hero, stats, footer) */
	--bsp-section-pad:  72px 80px;    /* padding sections stats / case study */

	/* --- Rayons & ombres --- */
	--bsp-radius:       12px;

	/* --- Transitions --- */
	--bsp-ease:         cubic-bezier(0.22, 1, 0.36, 1);
	--bsp-speed:        0.3s;

	/* --- Surfaces et bordures (ajouté le 13 septembre 2026) ----------
	   Introduits pour le catalogue de blogue, mais nommés par leur rôle
	   et non par leur page : une carte est une carte partout.
	   --bsp-accent-text est l'accent quand il porte du TEXTE fin. En
	   sombre, --bsp-accent suffit (5,74:1). En clair il retombe à
	   3,38:1, non conforme AA: d'où la bascule vers --bsp-accent-fill
	   (#0D6DC4, 5,25:1) dans le bloc 01bis. Le contraste se calcule, il
	   ne s'estime pas.
	   ----------------------------------------------------------------- */
	--bsp-surface:        rgba(255, 255, 255, 0.03);
	--bsp-surface-deep:   #050710;
	--bsp-border:         rgba(255, 255, 255, 0.08);
	--bsp-border-subtle:  rgba(255, 255, 255, 0.06);
	--bsp-section-rule:   1px solid rgba(255, 255, 255, 0.08);   /* filet entre sections */
	--bsp-border-strong:  rgba(255, 255, 255, 0.18);
	--bsp-text-quiet:     rgba(255, 255, 255, 0.56);
	--bsp-chip-associe-bg: rgba(255, 255, 255, 0.09); /* puce associée à la sélection */
	--bsp-accent-text:    var(--bsp-accent);
	--bsp-logo-filter:    none;

	/* Fond des zones-image: bandeaux photo, et les rangées de puces
	   posées dessus. Il ne bascule PAS avec le thème : ces zones portent
	   du texte blanc sur photo dans les deux modes, et la nav y flotte en
	   permanence. Redéclaré à l'identique dans le bloc clair pour que
	   l'intention se lise là aussi, plutôt que de se déduire d'une absence. */
	--bsp-bg-media:       #0a0d14;
}

/* =============================================================
   01bis: TOKENS · Mode clair (data-bsp-theme="light")
   -------------------------------------------------------------
   Activé par le bouton bascule de l'en-tête global (voir la
   sous-partie « HEADER: THEME TOGGLE » sous 02 NAVIGATION).
   Couverture actuelle : en-tête + nav + footer global. Les autres
   sections recevront leurs propres surcharges au fur et à mesure
   qu'elles seront reconstruites (voir NOTES-ACCUEIL.md): le
   defaut du site reste le mode sombre tant qu'une section n'a pas
   ete couverte ici.
   ============================================================= */
:root[data-bsp-theme="light"] {
	--bsp-bg:         #F1F0ED;
	--bsp-bg-footer:  #E8E6E1;
	--bsp-footer-surface: var(--bsp-bg-footer);
	--bsp-text:       #0d1526;
	--bsp-text-soft:  rgba(40, 46, 56, 0.88); /* charcoal enrichi, pas tout a fait noir (5 oct. 2026) */
	--bsp-body:       #2b313b;
	--bsp-text-faint: rgba(13, 21, 38, 0.66);

	/* Surfaces claires: ajouté le 13 septembre 2026 avec le catalogue. */
	--bsp-surface:        #ffffff;
	--bsp-surface-deep:   #E8E6E1;
	--bsp-border:         rgba(13, 21, 38, 0.10);
	--bsp-border-subtle:  rgba(13, 21, 38, 0.08);
	--bsp-section-rule:   1px solid rgba(13, 21, 38, 0.08);
	--bsp-border-strong:  rgba(13, 21, 38, 0.18);
	--bsp-text-quiet:     rgba(13, 21, 38, 0.66);
	--bsp-chip-associe-bg: rgba(13, 21, 38, 0.07);   /* même rôle : le blanc translucide devient un sombre translucide */
	--bsp-accent-text:    var(--bsp-accent-fill);
	--bsp-logo-filter:    invert(1);

	/* Volontairement identique au mode sombre : voir :root. Une
	   zone-image reste sombre en mode clair. */
	--bsp-bg-media:       #0a0d14;
}

/* Responsive : gouttière réduite sous 1024px */
@media (max-width: 1024px) {

	/* HERO: on resserre les marges latérales et on raccourcit la
	   course de défilement : sur un écran tactile, 320vh de piste
	   demandent trop de gestes avant que le logiciel apparaisse. */
	.bsp-hero-wrapper.et_pb_section {
		height: 260vh;
	}

	.bsp-hero-content.et_pb_column,
	.bsp-hero-reveal,
	.bsp-hero-cue {
		left: 40px;
	}

	.bsp-hero-content.et_pb_column {
		max-width: calc(100% - 80px);
	}

	:root {
		--bsp-gutter: 40px;
		--bsp-section-pad: 56px 40px;
	}
}

@media (max-width: 640px) {
	:root {
		--bsp-gutter: 24px;
		--bsp-section-pad: 48px 24px;
	}
}


/* =============================================================
   02: BASE · Typographie et éléments globaux
   (anciennement assets/css/02-base.css)
   ============================================================= */

body {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	color: var(--bsp-text);
	background-color: var(--bsp-bg);
	-webkit-font-smoothing: antialiased;
}

h1, h2, h3 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	color: var(--bsp-text);
	line-height: 1.1;
}

h1 em, h2 em, h3 em {
	font-style: italic;
	color: var(--bsp-accent);
}

h4, h5, h6 {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	color: var(--bsp-text);
}

a {
	color: var(--bsp-accent);
	transition: color var(--bsp-speed) var(--bsp-ease);
}

a:hover {
	color: var(--bsp-accent-hover);
}

::selection {
	background: rgba(var(--bsp-accent-rgb), 0.35);
	color: var(--bsp-text);
}


/* =============================================================
   03: DIVI OVERRIDES · Neutralisation des styles Divi
   (anciennement assets/css/03-divi-overrides.css)
   ============================================================= */

/* Largeur pleine par défaut pour nos sections full-bleed */
.bsp-full-bleed {
	max-width: 100%;
	padding-left: 0;
	padding-right: 0;
}

/* Conteneur standard BSP : gouttière 80px, pas la largeur Divi par défaut */
.bsp-container {
	padding-left: var(--bsp-gutter);
	padding-right: var(--bsp-gutter);
	max-width: none;
}

/* Corps de texte type case study : colonne lisible centrée */
.bsp-narrow {
	max-width: 1200px;
	margin-left: auto;
	margin-right: auto;
}


/* =============================================================
   04: COMPONENTS · Composants BSP réutilisables
   (anciennement assets/css/04-components.css)
   ============================================================= */

/* ---------- Eyebrow (surtitre) ---------- */
.bsp-eyebrow {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 13px;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--bsp-accent);
}

/* ---------- Boutons ---------- */
.bsp-btn-primary,
.bsp-btn-primary.et_pb_button {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	background: var(--bsp-accent-fill);
	color: #fff;
	border: none;
	border-radius: var(--bsp-radius);
	transition: background var(--bsp-speed) var(--bsp-ease);
}

.bsp-btn-primary:hover,
.bsp-btn-primary.et_pb_button:hover {
	background: var(--bsp-accent-hover);
}

.bsp-btn-ghost,
.bsp-btn-ghost.et_pb_button {
	font-family: var(--bsp-font-label);
	font-weight: 600;
	background: transparent;
	color: var(--bsp-text);
	border: 1px solid rgba(255, 255, 255, 0.35);
	border-radius: var(--bsp-radius);
	transition: border-color var(--bsp-speed) var(--bsp-ease), color var(--bsp-speed) var(--bsp-ease);
}

.bsp-btn-ghost:hover,
.bsp-btn-ghost.et_pb_button:hover {
	border-color: var(--bsp-accent);
	color: var(--bsp-accent);
}

/* ---------- Bouton icone rond (Font Awesome) -- module Bouton natif Divi ----------
   Marche a suivre, partout sur le site, pour ce type de bouton :
   1. Ajouter un module Bouton (natif Divi), pas un module Texte.
   2. Dans Contenu > Bouton, choisir une icone Font Awesome (fleche), et vider
      le texte du bouton (icone seule).
   3. Renseigner l URL du bouton (Lien vers ...).
   4. Avancer > Attributs > Classe CSS : ajouter la classe bsp-btn-round-arrow
   Nom d attribut unique, a reutiliser partout desormais pour ce composant. */
/* Police FontAwesome auto-hebergee (fichiers deja fournis par Divi), chargee
   independamment du systeme de detection dynamique de Divi -- necessaire car
   aucune icone n'est choisie via l'UI Divi (l'icone est injectee en CSS pur). */
@font-face {
	font-family: "FontAwesome";
	font-style: normal;
	font-weight: 900;
	font-display: swap;
	src: url("/wp-content/themes/Divi/core/admin/fonts/fontawesome/fa-solid-900.woff2") format("woff2"),
	     url("/wp-content/themes/Divi/core/admin/fonts/fontawesome/fa-solid-900.woff") format("woff"),
	     url("/wp-content/themes/Divi/core/admin/fonts/fontawesome/fa-solid-900.ttf") format("truetype");
}

/* Bouton rond icone (flèche) -- reutilisable partout via Attributs > Classe CSS.
   Prefixe "body #page-container" : c'est le meme niveau de specificite que le CSS
   genere automatiquement par Divi pour ses modules (qui utilise ce meme prefixe),
   donc nos regles gagnent enfin de façon fiable, sans deviner avec des !important
   empiles au hasard. Plus de position:absolute : le bouton reste dans le flux
   normal, pousse en bas de la carte par .bsp-partners-card (flex-column + margin-
   top:auto sur le wrapper, voir plus haut) -- plus simple et plus robuste. */
body #page-container .bsp-btn-round-arrow,
body #page-container a.bsp-btn-round-arrow.et_pb_button {
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	position: relative !important;
	width: 40px !important;
	height: 40px !important;
	min-width: 40px !important;
	max-width: 40px !important;
	padding: 0 !important;
	margin: 0 !important;
	border: 1px solid var(--bsp-border) !important;
	border-radius: 50% !important;
	background: transparent !important;
	color: var(--bsp-text) !important;
	font-size: 0 !important;
	line-height: 1 !important;
	box-sizing: border-box !important;
	transition: background var(--bsp-speed) var(--bsp-ease), border-color var(--bsp-speed) var(--bsp-ease), transform var(--bsp-speed) var(--bsp-ease) !important;
}
/* Icone fleche en masque SVG (pas une police d icone) -- Divi reinitialise
   "content" sur les pseudo-elements des boutons avec une regle encore plus
   specifique que la notre des qu aucune icone n est choisie dans son UI ; le
   masque CSS contourne totalement ce probleme (Divi n y touche pas).
   "color" pilote la couleur du masque via currentColor -- pale au repos,
   blanc au survol, comme les autres regles de la classe. */
body #page-container .bsp-btn-round-arrow::before,
body #page-container a.bsp-btn-round-arrow.et_pb_button::before {
	content: "" !important;
	display: block !important;
	position: absolute !important;
	top: 50% !important; left: 50% !important;
	transform: translate(-50%, -50%) !important;
	width: 16px !important; height: 16px !important;
	background-color: currentColor !important;
	color: var(--bsp-text-faint) !important;
	opacity: 1 !important;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.25%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%274%27%20y1%3D%2712%27%20x2%3D%2719%27%20y2%3D%2712%27/%3E%3Cpolyline%20points%3D%2712%205%2019%2012%2012%2019%27/%3E%3C/svg%3E") !important;
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.25%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%274%27%20y1%3D%2712%27%20x2%3D%2719%27%20y2%3D%2712%27/%3E%3Cpolyline%20points%3D%2712%205%2019%2012%2012%2019%27/%3E%3C/svg%3E") !important;
	-webkit-mask-size: contain !important;
	mask-size: contain !important;
	-webkit-mask-repeat: no-repeat !important;
	mask-repeat: no-repeat !important;
	-webkit-mask-position: center !important;
	mask-position: center !important;
	transition: background-color var(--bsp-speed) var(--bsp-ease), color var(--bsp-speed) var(--bsp-ease) !important;
}
body #page-container .bsp-btn-round-arrow:hover::before,
body #page-container a.bsp-btn-round-arrow.et_pb_button:hover::before {
	color: #fff !important;
}
body #page-container .bsp-btn-round-arrow:hover,
body #page-container a.bsp-btn-round-arrow.et_pb_button:hover {
	background: var(--bsp-accent-fill) !important;
	border-color: var(--bsp-accent-fill) !important;
	transform: translateX(4px) !important;
}

/* ---------- Section stats (4 chiffres clés) ---------- */
.bsp-stats {
	background: var(--bsp-bg);
	padding: var(--bsp-section-pad);
}

.bsp-stat-number {
	font-family: var(--bsp-font-display);
	font-weight: 900;
	font-size: clamp(48px, 6vw, 88px);
	color: var(--bsp-accent);
	line-height: 1;
}

.bsp-stat-label {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 21px;
	color: var(--bsp-text-soft);
	margin-top: 8px;
}

/* ---------- Barre de résultats (case study) ---------- */
.bsp-results-bar {
	background: var(--bsp-brand-blue);
	color: #fff;
}

/* ---------- Citation ---------- */
.bsp-quote {
	font-family: var(--bsp-font-display);
	font-style: italic;
	font-size: clamp(22px, 2.6vw, 32px);
	line-height: 1.4;
	color: var(--bsp-text);
}

.bsp-quote-author {
	font-family: var(--bsp-font-label);
	font-weight: 600;
	font-size: 14px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--bsp-text-faint);
}

/* ---------- Feature dot (liste de modules/solutions) ---------- */
.bsp-feature-dot::before {
	content: '';
	display: inline-block;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	background: var(--bsp-accent);
	margin-right: 14px;
	flex-shrink: 0;
}

/* ---------- Vidéo embarquée (Zoho WorkDrive) ---------- */
.bsp-video-embed {
	aspect-ratio: 16 / 9;
	max-width: 900px;
	margin: 0 auto;
	border-radius: var(--bsp-radius);
	overflow: hidden;
}

/* =============================================================
   HERO SLIDER (accueil): structure reproduite en section Code Divi.
   JS : assets/js/bsp-custom.js. Détails : KB §4.2–4.4.
   ============================================================= */

.bsp-hero-wrapper {
	height: 200vh; /* capte 100vh de scroll pour l'animation */
}

.bsp-hero {
	position: sticky;
	top: 0;
	height: 100vh;
	overflow: hidden;
	--pos: 87.5%;
}

.bsp-hero::after {
	content: '';
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 180px;
	background: linear-gradient(to bottom, transparent 0%, var(--bsp-bg) 100%);
	pointer-events: none;
}

.bsp-hero-layer {
	position: absolute;
	inset: 0;
	background-size: cover;
	background-position: center;
}

.bsp-hero-layer--interface {
	clip-path: inset(0 0 0 var(--pos));
}

.bsp-hero-divider {
	position: absolute;
	top: 0;
	bottom: 0;
	left: var(--pos);
	width: 2px;
	background: linear-gradient(to bottom, rgba(255,255,255,0.6) 0%, rgba(255,255,255,0.5) 70%, transparent 100%);
}


/* =============================================================
   05: UTILITIES · Classes utilitaires
   (anciennement assets/css/05-utilities.css)
   ============================================================= */

.bsp-text-center  { text-align: center; }
.bsp-text-amber   { color: var(--bsp-accent); }
.bsp-text-soft    { color: var(--bsp-text-soft); }

.bsp-bg-dark      { background-color: var(--bsp-bg); }
.bsp-bg-marine    { background-color: var(--bsp-bg-deep); }
.bsp-bg-footer    { background-color: var(--bsp-bg-footer); }

.bsp-mt-0 { margin-top: 0; }
.bsp-mb-0 { margin-bottom: 0; }

/* Masquer visuellement mais rester accessible aux lecteurs d'écran */
.bsp-sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}


/* =============================================================
   ⚠️  POURQUOI DES « !important » SUR LES MARGES DE COMPOSANT
   -------------------------------------------------------------
   Divi génère du CSS par module qu'il injecte dans la page. Il
   gagne l'arbitrage contre cette feuille, quelle que soit la
   spécificité employée ici : une règle injectée en dernier, avec
   un sélecteur identique, est quand même rejetée. Mesuré, pas
   supposé: voir _dev-tools/bsp-espacement-sonde.php.

   Ordre de chargement corrigé dans functions.php : insuffisant.
   Le « !important » est donc un repli ASSUMÉ et BORNÉ :
     · uniquement sur les marges,
     · uniquement sur nos classes de composant,
     · jamais sur une couleur, une taille ou une position.

   Conséquence à connaître : pour surcharger une de ces marges, il
   faudra un « !important » à son tour. C'est le prix payé, et il
   est documenté pour que personne ne le découvre par surprise.
   ============================================================= */

/* =============================================================
   06: HOME · Page d'accueil
   (anciennement assets/css/06-home.css)
   ============================================================= */

/* =============================================================
   00 · NEUTRALISATION DIVI: commune à toutes les sections home
   ============================================================= */

/* Divi ajoute un padding vertical de 4% sur chaque section et
   limite les rangées à 1080px. Nos sections sont full-bleed et
   gèrent elles-mêmes leur padding. */
.bsp-home-section.et_pb_section {
	padding: 0;
	margin: 0;
}

.bsp-home-section .et_pb_row {
	width: 100%;
	max-width: none;
	margin: 0;
	padding: 0;
}

/* Remise à zéro des marges que Divi ajoute à ses modules. ⚠️ Elle
   compte DEUX classes : toute marge de composant déclarée à une seule
   classe perd contre elle. C'est pour cette raison que les règles de
   composant ci-dessous sont toutes préfixées par « .bsp-home-section »,
   elles reviennent ainsi à égalité, et gagnent par leur position plus
   bas dans le fichier. Ne pas retirer ce préfixe sans retirer cette
   remise à zéro d'abord. */
.bsp-home-section .et_pb_module {
	margin-bottom: 0;
}

/* Divi 4 ferme ses rangées avec un clearfix ::before / ::after,
   indispensable puisque ses colonnes sont flottantes.
   Dans les rangées que l'on transforme en grille CSS (les six
   ci-dessous), les colonnes ne flottent plus : le clearfix n'a
   plus d'utilité et, devenu cellule de grille, il décalerait
   toute la grille. On ne le neutralise QUE là.
   NE PAS étendre ce sélecteur à toutes les rangées : sans
   clearfix, une rangée à colonnes flottantes retombe à une
   hauteur de 0 et sa section disparaît. */
.bsp-home-stats-grid.et_pb_row::before,
.bsp-home-stats-grid.et_pb_row::after,
.bsp-home-transform-row.et_pb_row::before,
.bsp-home-transform-row.et_pb_row::after,
.bsp-home-why-grid.et_pb_row::before,
.bsp-home-why-grid.et_pb_row::after,
.bsp-home-solutions-grid.et_pb_row::before,
.bsp-home-solutions-grid.et_pb_row::after,
.bsp-home-contact-row.et_pb_row::before,
.bsp-home-contact-row.et_pb_row::after,
.bsp-home-footer-top.et_pb_row::before,
.bsp-home-footer-top.et_pb_row::after {
	display: none;
}

/* Divi peint un fond blanc sur les sections par défaut, et rogne
   volontiers ce qui dépasse. Le hero est « sticky » : le moindre
   overflow caché sur un ancêtre le décolle et l'animation meurt. */
.bsp-hero-wrapper.et_pb_section,
.bsp-hero-wrapper .et_pb_column,
.bsp-hero-wrapper .et_pb_module,
.bsp-hero-wrapper .et_pb_code_inner {
	overflow: visible;
}

/* Les modules Texte de Divi héritent d'une couleur/typo par
   défaut : on laisse notre CSS de composant décider. */
.bsp-home-section .et_pb_text_inner > *:last-child {
	margin-bottom: 0;
}


/* =============================================================
   01 · HERO « PROFONDEUR »: défilement vertical
   -------------------------------------------------------------
   Fidèle à la maquette index-2.html. Le mouvement suit le
   défilement de la page : ce n'est pas un carrousel.

   Structure Divi :
     Section  .bsp-hero-wrapper   piste de défilement, 320vh
       Rangée .bsp-hero  #depthHero   collée en haut, 100vh
         Col. .bsp-hero-layers    les calques animés (module Code)
         Col. .bsp-hero-content   le texte éditable (modules natifs)

   ⚠️ PIÈGE : la section DOIT être plus haute que l'écran. C'est
   elle qui fournit la course du défilement ; le script calcule
   « hauteur de la section − hauteur de la fenêtre ». Si Divi lui
   donne une hauteur automatique, la division tombe à zéro et le
   hero reste parfaitement immobile: sans aucune erreur.
   ============================================================= */

.bsp-hero-wrapper.et_pb_section {
	position: relative;
	height: 320vh;
	padding: 0;
	background: var(--bsp-bg);
	overflow: visible;
}

.bsp-hero.et_pb_row {
	position: sticky;
	/* Connecté, la barre d'admin WordPress (32 px, 46 px sur mobile) est fixe en
	   haut : un hero collé à top:0 glissait dessous et la navigation était
	   rognée. WordPress publie sa hauteur dans --wp-admin--admin-bar--height ;
	   sans barre (visiteur), la variable n'existe pas et le décalage est nul. */
	top: var(--wp-admin--admin-bar--height, 0px);
	width: 100%;
	max-width: none;
	height: calc(100vh - var(--wp-admin--admin-bar--height, 0px));
	margin: 0;
	padding: 0;
	overflow: hidden;
	background: var(--bsp-bg);
}

/* Les colonnes deviennent des boîtes de positionnement : Divi les
   fait flotter par défaut, ce qui casserait l'empilement. */
.bsp-hero .et_pb_column {
	position: static;
	width: 100% !important;
	margin: 0 !important;
	float: none;
}

/* ⚠️ LE PIÈGE QUI A COÛTÉ UNE HEURE.
   Divi pose « position: relative » sur ses modules. Le module Code
   devenait donc le référent des calques positionnés en absolu,
   et comme TOUS ses enfants sont eux-mêmes en absolu, sa propre
   hauteur retombait à zéro. Les calques héritaient donc d'une boîte
   de 1280 × 0 : fond invisible, silhouette impossible à calculer,
   « translateY(100%) » valant 100 % de rien, et « top: 50% » valant
   zéro. Un seul défaut, six symptômes.

   En le remettant en flux, le référent redevient la rangée collée,
   qui fait bien un écran de haut. */
.bsp-hero-code.et_pb_module,
.bsp-hero-code .et_pb_code_inner {
	position: static;
}

.bsp-hero::after {
	content: '';
	position: absolute;
	bottom: 0;
	left: 0;
	right: 0;
	height: 180px;
	background: linear-gradient(to bottom, transparent 0%, var(--bsp-bg) 100%);
	z-index: 9;
	pointer-events: none;
}

/* ---- Calque 1 · le fond -------------------------------------- */
.bsp-hero-bg {
	position: absolute;
	inset: 0;
	z-index: 1;
	opacity: 0;
	transform: scale(1.06);
	transition: opacity 1.6s ease, transform 2.4s ease;
}

.bsp-hero-bg img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 30%;
}

.bsp-hero-bg::after {
	content: '';
	position: absolute;
	inset: 0;
	background:
		linear-gradient(to bottom, rgba(10, 12, 20, 0.4) 0%, rgba(10, 12, 20, 0.05) 30%, rgba(10, 12, 20, 0.6) 100%),
		linear-gradient(to right, rgba(10, 12, 20, 0.35) 0%, transparent 30%, transparent 70%, rgba(10, 12, 20, 0.35) 100%);
}

.bsp-hero.in-view .bsp-hero-bg {
	opacity: 1;
	transform: scale(1);
}

/* ---- Calque 2 · le titre géant ------------------------------- */
/* Son texte est recopié en JavaScript depuis le titre éditable :
   une seule phrase à modifier, et pas de second <h1> dans la page.

   ⚠️ Structure calquée EXACTEMENT sur la maquette index-2.html, en deux
   niveaux distincts: ne pas les refusionner en un seul :
     .bsp-hero-giant        = conteneur flex, centre seulement (~ .depth-title)
     .bsp-hero-giant-inner  = boîte de texte, width:100% (~ .depth-title h1)
   Avant cette séparation, le JS injectait le texte directement dans le
   conteneur flex. Sans élément de bloc dédié portant width:100%, la boîte
   anonyme créée par le flex ne s'étirait pas sur toute la largeur : elle se
   réduisait au contenu, et le texte se retrouvait éclaté en deux blocs
   (blanc à gauche, bleu à droite) au lieu d'un paragraphe centré unique.
   Corrigé le 21 août 2026. Le wrapper .bsp-hero-giant-inner est créé par
   bsp-custom.js: il n'existe pas dans le balisage du module Code Divi. */
.bsp-hero-giant {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0 60px;
	pointer-events: none;
}

.bsp-hero-giant-inner {
	display: block;
	width: 100%;
	font-family: var(--bsp-font-display);
	font-weight: 800;
	/* Taille d'origine de la maquette index-2.html (.depth-title h1).
	   Un correctif antérieur l'avait réduite à 5.6vw/94px en pensant
	   corriger un retour à la ligne indésirable: en réalité la maquette
	   est censée déborder sur plusieurs lignes à cette taille, dans les
	   mêmes conditions (.bsp-hero.et_pb_row a le même overflow:hidden à
	   100vh que .depth-hero dans la maquette). Restauré le 21 août 2026. */
	font-size: clamp(40px, 8vw, 132px);
	line-height: 0.98;
	letter-spacing: -0.02em;
	color: #fff;
	text-align: center;
	text-shadow: 0 6px 40px rgba(0, 0, 0, 0.35);
	opacity: 0;
	transform: translateY(26px);
	transition: opacity 1.3s ease .3s, transform 1.3s ease .3s;
}

.bsp-hero-giant-inner em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-hero.in-view .bsp-hero-giant-inner {
	opacity: 1;
	transform: translateY(0);
}

/* Once settled, the giant title fades out in favor of the left-side
   block. Fixed 2026-09-10 (reported by Clément): this fade (.9s, no
   delay) and the left-side block's fade-in below (1s, .1s delay) nearly
   fully overlapped: both titles stayed visible at the same time during
   the transition, which read as the second title bleeding through the
   first instead of replacing it. Shortened to .5s so the giant title is
   essentially gone before the left-side block starts appearing (see its
   delay increased to .5s below). */
.bsp-hero.settled .bsp-hero-giant-inner {
	opacity: 0;
	transform: translateY(-18px);
	transition: opacity .5s ease, transform .5s ease;
}

/* ---- Calque 3 · la personne détourée -------------------------- */
/* Vrai PNG détouré (foothills-homme.webp), au même cadrage que le
   fond : la transparence isole la silhouette nativement. C'est elle
   qui passe DEVANT le titre et donne la profondeur. Aucun découpage
   n'est calculé: la version antérieure le faisait au clip-path,
   c'était fragile et inutile. */
.bsp-hero-person {
	position: absolute;
	inset: 0;
	z-index: 3;
	opacity: 0;
	transition: opacity 3s ease .6s;
}

.bsp-hero-person img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 30%;
	filter: drop-shadow(0 24px 46px rgba(0, 0, 0, 0.4));
}

.bsp-hero.in-view .bsp-hero-person {
	opacity: 1;
}

/* Fades out together with the giant title, never before it: otherwise
   the title would end up alone in front of it. Duration matched to
   .bsp-hero-giant-inner (.5s, see above) so they truly disappear
   together. */
.bsp-hero.settled .bsp-hero-person {
	opacity: 0;
	transition: opacity .5s ease;
}

/* ---- Voile sombre à gauche ------------------------------------
   Le texte se pose sur une photo claire : sans voile, il devient
   illisible dès que le sujet est lumineux. Le dégradé est porté par
   un pseudo-élément du module Code: qui est en flux, donc son
   pseudo-élément se positionne sur la rangée, au-dessus des deux
   calques d'image et sous le panneau logiciel, qui a le sien. */
.bsp-hero-code::after {
	content: '';
	position: absolute;
	inset: 0;
	z-index: 4;
	pointer-events: none;
	background: linear-gradient(
		to right,
		rgba(10, 12, 20, 0.72) 0%,
		rgba(10, 12, 20, 0.55) 24%,
		rgba(10, 12, 20, 0.18) 50%,
		transparent 68%
	);
}

/* ---- Le bloc de texte de gauche ------------------------------- */
/* C'est la colonne Divi elle-même : les modules à l'intérieur
   restent donc éditables un par un. */
.bsp-hero-content.et_pb_column {
	position: absolute;
	z-index: 6;
	top: 50%;
	left: 100px;
	transform: translateY(-46%);
	width: 100% !important;
	max-width: 580px;
	opacity: 0;
	pointer-events: none;
	transition: opacity 1s ease .1s, transform 1s ease .1s;
}

/* Dès que le panneau monte, l'opacité suit le défilement, sans transition
   (une transition de 1 s traînerait derrière la molette). */
.bsp-hero.is-rising .bsp-hero-content.et_pb_column { transition: transform 1s ease .5s; }
.bsp-hero.is-covered .bsp-hero-content.et_pb_column { pointer-events: none; }

/* Delay increased from .1s to .5s on 2026-09-10: the giant title takes
   .5s to disappear (see .bsp-hero-giant-inner above): this block should
   only start appearing once that fade-out is nearly done, otherwise the
   two titles overlap visually. */
.bsp-hero.settled .bsp-hero-content.et_pb_column {
	/* --bsp-hero-fade (1 → 0) est écrit par bsp-custom.js pendant que le panneau
	   logiciel monte : le texte s'efface avant d'être recouvert. */
	opacity: var(--bsp-hero-fade, 1);
	transform: translateY(-52%);
	pointer-events: auto;
	transition: opacity 1s ease .5s, transform 1s ease .5s;
}

/* Valeurs relevées au pixel sur bsp-maquette-v1/index-2.html.
   L'ombre portée vient de la maquette : elle décolle le surtitre de
   la photo sans avoir à assombrir tout le voile. */
.bsp-hero-eyebrow,
.bsp-hero-eyebrow p {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11.7px;
	letter-spacing: 0.38em;
	text-transform: uppercase;
	color: var(--bsp-accent);
	text-shadow: 0 1px 4px rgba(0, 0, 0, 0.95), 0 2px 14px rgba(0, 0, 0, 0.8);
	margin-bottom: 0;
}

.bsp-hero-content .bsp-hero-eyebrow {
	margin-bottom: var(--bsp-space-2) !important;
}

/* 20 px sous le titre, 52 px sous l'accroche : la maquette place
   12 px sous l'accroche puis 40 px au-dessus du bloc de boutons.
   Nos boutons étant des modules distincts, les deux se cumulent ici. */
.bsp-hero-content .bsp-hero-title {
	margin-bottom: 20px !important;
}

/* Le titre ne porte aucune marge propre : c'est le module qui la
   porte, pour que l'espacement se règle à un seul endroit. */
.bsp-hero-content .bsp-hero-title h1 {
	margin: 0;
	padding: 0;
}

.bsp-hero-title h1 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: var(--bsp-banner-title-size);
	line-height: 1.05;
	color: #fff;
	letter-spacing: -0.02em;
	padding-bottom: 0;
}

.bsp-hero-title h1 em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-hero-lead,
.bsp-hero-lead p {
	font-family: var(--bsp-font-body);
	font-size: 23.5px;
	font-weight: 600;
	color: rgba(255, 255, 255, 0.88);
	line-height: 1.5;
	margin-bottom: 0;
}

.bsp-hero-content .bsp-hero-lead {
	margin-bottom: 52px !important;
}

/* Le bouton et le lien discret dessous. La colonne devient une grille à deux
   pistes : titre, accroche et surtitre occupent toute la largeur ; le bouton
   et le lien partagent la piste 1, dont la largeur est celle du plus large des
   deux (le bouton). Le lien est donc centré SUR le bouton, à distance égale de
   ses deux bords, quelle que soit la longueur de son texte. */
.bsp-hero-content.et_pb_column {
	display: grid;
	grid-template-columns: max-content 1fr;
	justify-items: stretch;
}
.bsp-hero-content.et_pb_column > * { grid-column: 1 / -1; }
.bsp-hero-content.et_pb_column > .et_pb_button_module_wrapper { grid-column: 1; text-align: center; margin: 0; }
.bsp-hero-content.et_pb_column > .et_pb_button_module_wrapper:has(> .bsp-hero-cta-2) { margin-top: 20px; }

/* Le second n'est pas un bouton mais un lien discret: le
   « btn-ghost » de la maquette. On annule l'habillage de Divi,
   et on remplace sa flèche maison par notre caractère : une seule
   source d'icônes sur le projet. */
.bsp-hero-cta-2 .et_pb_button,
a.bsp-hero-cta-2.et_pb_button {
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent !important;
	font-family: var(--bsp-font-body);
	font-size: 14px;
	font-weight: 400;
	letter-spacing: 0;
	color: rgba(255, 255, 255, 0.55);
	transition: color 0.2s;
}

.bsp-hero-cta-2 .et_pb_button:hover,
a.bsp-hero-cta-2.et_pb_button:hover {
	color: #fff;
	background: transparent !important;
	border: 0 !important;
	padding: 0 !important;
}

.bsp-hero-cta-2 .et_pb_button::after,
a.bsp-hero-cta-2.et_pb_button::after {
	content: ' →' !important;
	font-family: inherit !important;
	font-size: inherit !important;
	line-height: inherit !important;
	opacity: 1 !important;
	position: static !important;
	margin-left: 0 !important;
}

/* ---- Indication de défilement --------------------------------- */
.bsp-hero-cue {
	position: absolute;
	bottom: 32px;
	left: 100px;
	z-index: 30;
	display: flex;
	align-items: center;
	gap: 10px;
	opacity: 0;
	transition: opacity 1s ease 1.3s;
}

.bsp-hero.in-view .bsp-hero-cue {
	opacity: var(--bsp-hero-fade, 1);
}
.bsp-hero.is-rising .bsp-hero-cue { transition: none; }

.bsp-hero-cue .cue-line {
	width: 1px;
	height: 40px;
	background: linear-gradient(to bottom, rgba(255, 255, 255, 0.5), transparent);
}

.bsp-hero-cue .cue-txt {
	font-family: var(--bsp-font-label);
	font-size: 8px;
	font-weight: 700;
	letter-spacing: 0.28em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.4);
	writing-mode: vertical-rl;
}

/* ---- Calque 4 · le logiciel qui monte du bas ------------------- */
/* Sa position verticale est écrite par le script à chaque
   défilement : de translateY(100%) à translateY(0). */
.bsp-hero-software {
	position: absolute;
	inset: 0;
	z-index: 5;
	overflow: hidden;
	transform: translateY(100%);
	will-change: transform;
}

.bsp-hero-software img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center top;
	display: block;
}

.bsp-hero-software::after {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(to right, rgba(10, 12, 20, 0.86) 0%, rgba(10, 12, 20, 0.55) 30%, rgba(10, 12, 20, 0.1) 55%, transparent 75%);
}

.bsp-hero-reveal {
	position: absolute;
	z-index: 8;
	left: 100px;
	top: 50%;
	max-width: 520px;
	opacity: 0;
	will-change: opacity, transform;
}

.bsp-hero-reveal .reveal-eyebrow {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 9px;
	letter-spacing: 0.38em;
	text-transform: uppercase;
	color: var(--bsp-accent);
	margin-bottom: 20px;
}

.bsp-hero-reveal .reveal-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: var(--bsp-banner-title-size);
	line-height: 1.05;
	color: #fff;
	letter-spacing: -0.02em;
	margin-bottom: 20px;
}

.bsp-hero-reveal .reveal-title em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-hero-reveal .reveal-text {
	font-family: var(--bsp-font-body);
	font-size: 23.5px;
	font-weight: 600;
	color: rgba(255, 255, 255, 0.88);
	line-height: 1.5;
	max-width: 480px;
	margin-bottom: 0;
}


/* =============================================================
   02 · NAVIGATION (superposée au hero)
   -------------------------------------------------------------
   Vit dans le même module Code que le hero, car elle est
   positionnée en absolu par-dessus l'image.
   À DÉPLACER dans un en-tête global Divi Theme Builder dès que
   les autres pages seront construites: voir NOTES-ACCUEIL.md.
   ============================================================= */

.bsp-home-nav {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	z-index: 50;
	height: 72px;
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 0 var(--bsp-gutter);
}

/* Voile dégradé sous la nav pour garder les liens lisibles */
.bsp-home-nav::before {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 140px;
	background: linear-gradient(to bottom, rgba(10, 12, 20, 0.6) 0%, transparent 100%);
	pointer-events: none;
	z-index: -1;
}

.bsp-home-nav a {
	text-decoration: none;
}

/* --- Logo --- */
.bsp-home-nav-logo {
	display: flex;
	align-items: center;
	gap: 6px;
}

.bsp-home-nav-logo img {
	height: 36px;
	width: auto;
}

.bsp-home-nav-logo-text {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 14px;
	color: rgba(255, 255, 255, 0.45);
	letter-spacing: 0.05em;
}

/* Le point coloré est un élément de marque intentionnel (KB §2.4) */
.bsp-home-nav-logo-dot {
	color: var(--bsp-accent);
	font-size: 36px;
	line-height: 0;
	vertical-align: middle;
}

/* --- Liens centrés --- */
.bsp-home-nav-links {
	display: flex;
	align-items: center;
	gap: 36px;
	list-style: none;
	margin: 0;
	padding: 0;
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	/* Typographie posée explicitement : la nav est déplacée du module Divi
	   vers <body> quand elle devient collante et héritait alors d'un autre
	   line-height, ce qui décalait les liens. */
	font-size: 12px;
	line-height: 26px;
}

/* Divi (critical CSS) donne aux <ul> du module un padding et des puces ;
   la même liste hors du module (nav collante, dans <body>) n'en a pas.
   On neutralise dans les deux contextes pour que les liens ne bougent pas. */
.bsp-home-nav ul.bsp-home-nav-links {
	padding: 0;
	margin: 0;
	list-style: none;
}

.bsp-home-nav-links > li {
	line-height: 26px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.bsp-home-nav-links a {
	font-family: var(--bsp-font-label);
	font-weight: 600;
	font-size: 12px;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.7);
	text-decoration: underline;
	text-underline-offset: 4px;
	text-decoration-color: transparent;
	transition: color 0.2s, text-decoration-color 0.2s;
}

.bsp-home-nav-links a:hover {
	color: #fff;
	text-decoration-color: rgba(255, 255, 255, 0.4);
}

/* --- Sous-menu « Expertise » --- */
.bsp-home-nav-dropdown {
	position: relative;
}

.bsp-home-nav-dropdown > a {
	display: flex;
	align-items: center;
	gap: 5px;
}

/* Chevron en pur CSS (pas d'icône à charger) */
.bsp-home-nav-dropdown > a::after {
	content: '';
	display: block;
	width: 5px;
	height: 5px;
	border-right: 1.5px solid currentColor;
	border-bottom: 1.5px solid currentColor;
	transform: rotate(45deg) translateY(-2px);
	transition: transform 0.2s;
}

.bsp-home-nav-dropdown:hover > a::after {
	transform: rotate(-135deg) translateY(-2px);
}

.bsp-home-nav-dropdown-menu {
	position: absolute;
	top: 100%;
	left: 50%;
	transform: translateX(-50%) translateY(-4px);
	padding-top: 12px;
	min-width: 240px;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.2s, transform 0.2s;
	z-index: 200;
}

.bsp-home-nav-dropdown:hover .bsp-home-nav-dropdown-menu {
	opacity: 1;
	pointer-events: all;
	transform: translateX(-50%) translateY(0);
}

.bsp-home-nav-dropdown-inner {
	background: rgba(8, 11, 22, 0.97);
	backdrop-filter: blur(16px);
	-webkit-backdrop-filter: blur(16px);
	border: 1px solid rgba(255, 255, 255, 0.08);
	border-radius: var(--bsp-radius);
	padding: 8px;
}

.bsp-home-nav-dropdown-item {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 10px 14px;
	border-radius: 8px;
	font-family: var(--bsp-font-label);
	font-weight: 600;
	font-size: 11px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.55);
	transition: background 0.15s, color 0.15s;
	white-space: nowrap;
}

.bsp-home-nav-dropdown-item:hover {
	background: rgba(var(--bsp-accent-rgb), 0.1);
	color: #fff;
}

.bsp-home-nav-dropdown-item.is-active {
	color: var(--bsp-accent);
}

.bsp-home-nav-dropdown-dot {
	width: 6px;
	height: 6px;
	border-radius: 50%;
	background: var(--bsp-accent);
	flex-shrink: 0;
	opacity: 0.5;
}

.bsp-home-nav-dropdown-item.is-active .bsp-home-nav-dropdown-dot {
	opacity: 1;
}

.bsp-home-nav-dropdown-divider {
	height: 1px;
	background: rgba(255, 255, 255, 0.06);
	margin: 4px 8px;
}

/* --- Bloc de droite : CTA + sélecteur de langue --- */
.bsp-home-nav-right {
	display: flex;
	align-items: center;
	gap: 20px;
}

.bsp-home-nav-cta {
	background: var(--bsp-accent-fill);
	color: #fff;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	padding: 10px 22px;
	border-radius: 100px;
	transition: background 0.2s;
}

.bsp-home-nav-cta:hover {
	background: var(--bsp-accent-hover);
	color: #fff;
}

/* Petits écrans: ajouté le 16 septembre 2026. À 390 px, « Contact us »
   passait sur deux lignes et chevauchait le logo et la bascule de thème
   (constaté sur la page d'article, mais l'en-tête est global). Correctif
   minimal : le bouton ne se coupe plus et l'espacement se resserre. Le
   vrai menu mobile (burger) reste à concevoir: voir PROJET.md. */
.bsp-home-nav-cta { white-space: nowrap; }
@media (max-width: 480px) {
	.bsp-home-nav-right { gap: 10px; }
	.bsp-home-nav-cta { padding: 8px 14px; letter-spacing: 0.06em; }
}

/* Placeholder FR/EN: sera remplacé par le switcher WPML */
.bsp-home-nav-lang {
	display: flex;
	align-items: center;
	gap: 6px;
	font-family: var(--bsp-font-label);
	font-weight: 600;
	font-size: 11px;
	letter-spacing: 0.08em;
}

.bsp-home-nav-lang a {
	color: rgba(255, 255, 255, 0.4);
	transition: color 0.2s;
}

.bsp-home-nav-lang a:hover,
.bsp-home-nav-lang a.is-active {
	color: #fff;
}

.bsp-home-nav-lang-sep {
	color: rgba(255, 255, 255, 0.2);
	font-size: 10px;
}

/* --- Bouton bascule thème clair / sombre -------------------------
   Ajouté au tout début du bloc .bsp-home-nav-right. Les icônes
   soleil/lune sont deux <svg> inline dans le même bouton ; seule
   celle qui correspond à l'action possible (« bascule vers ») est
   visible, pilotée par [data-bsp-theme] sur <html> (bsp-custom.js,
   initThemeToggle). Etat par defaut = sombre = icone soleil visible
   (« cliquer pour le mode clair »). --------------------------------- */
.bsp-theme-toggle {
	--bsp-toggle-size: 34px;
	width: var(--bsp-toggle-size);
	height: var(--bsp-toggle-size);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	border-radius: 50%;
	border: 1px solid rgba(255, 255, 255, 0.16);
	background: rgba(255, 255, 255, 0.06);
	color: #fff;
	cursor: pointer;
	transition: background 0.2s, border-color 0.2s, color 0.2s;
	appearance: none;
	-webkit-appearance: none;
}

.bsp-theme-toggle:hover {
	background: rgba(255, 255, 255, 0.14);
	border-color: rgba(255, 255, 255, 0.3);
}

.bsp-theme-toggle-icon {
	width: 16px;
	height: 16px;
	pointer-events: none;
}

.bsp-theme-toggle-icon--sun circle,
.bsp-theme-toggle-icon--sun path {
	fill: none;
	stroke: currentColor;
	stroke-width: 1.8;
	stroke-linecap: round;
}

.bsp-theme-toggle-icon--moon path {
	fill: currentColor;
}

.bsp-theme-toggle-icon--moon {
	display: none;
}

:root[data-bsp-theme="light"] .bsp-theme-toggle-icon--sun {
	display: none;
}

:root[data-bsp-theme="light"] .bsp-theme-toggle-icon--moon {
	display: block;
}

/* --- Surcharges mode clair : nav -----------------------------------
   La nav utilise des rgba() figés (pas les tokens ci-dessus) pour
   son fond semi-transparent superposé au hero ; le mode clair a
   donc besoin de ses propres surcharges ici, section par section. */
:root[data-bsp-theme="light"] .bsp-theme-toggle {
	border-color: rgba(13, 21, 38, 0.16);
	background: rgba(13, 21, 38, 0.05);
	color: #0d1526;
}

:root[data-bsp-theme="light"] .bsp-theme-toggle:hover {
	background: rgba(13, 21, 38, 0.1);
	border-color: rgba(13, 21, 38, 0.3);
}

:root[data-bsp-theme="light"] .bsp-home-nav::before {
	background: linear-gradient(to bottom, rgba(241, 240, 237, 0.75) 0%, transparent 100%);
}

:root[data-bsp-theme="light"] .bsp-home-nav-logo-text {
	color: rgba(13, 21, 38, 0.66);
}

:root[data-bsp-theme="light"] .bsp-home-nav-links a {
	color: rgba(13, 21, 38, 0.7);
}

:root[data-bsp-theme="light"] .bsp-home-nav-links a:hover {
	color: #0d1526;
	text-decoration-color: rgba(13, 21, 38, 0.62);
}

:root[data-bsp-theme="light"] .bsp-home-nav-dropdown-inner {
	background: rgba(241, 240, 237, 0.97);
	border-color: rgba(13, 21, 38, 0.08);
}

:root[data-bsp-theme="light"] .bsp-home-nav-dropdown-item {
	color: rgba(13, 21, 38, 0.55);
}

:root[data-bsp-theme="light"] .bsp-home-nav-dropdown-item:hover {
	color: #0d1526;
}

:root[data-bsp-theme="light"] .bsp-home-nav-dropdown-divider {
	background: rgba(13, 21, 38, 0.06);
}

:root[data-bsp-theme="light"] .bsp-home-nav-lang a {
	color: rgba(13, 21, 38, 0.62);
}

:root[data-bsp-theme="light"] .bsp-home-nav-lang a:hover,
:root[data-bsp-theme="light"] .bsp-home-nav-lang a.is-active {
	color: #0d1526;
}

:root[data-bsp-theme="light"] .bsp-home-nav-lang-sep {
	color: rgba(13, 21, 38, 0.2);
}

/* Le logotype (BSP-logo-blanc-1coul.webp) est un aplat blanc à une
   seule couleur : on l'inverse en mode clair plutôt que de livrer
   un second fichier image. */
:root[data-bsp-theme="light"] .bsp-home-nav-logo img {
	filter: invert(1);
}

/* --- Nav au-dessus d'un bandeau qui reste sombre ---------------------
   Ajouté le 16 septembre 2026. La couverture d'article et le bandeau
   du catalogue gardent un fond sombre dans les deux thèmes (zones-
   image, texte blanc sur photo). En mode clair, les surcharges
   ci-dessus passaient la nav en encre sombre PAR-DESSUS ce fond
   sombre : logo noir, liens gris foncé, illisibles (constaté à
   l'écran). Sur ces gabarits, la nav garde donc ses couleurs de mode
   sombre. Elle est en position absolue et ne suit pas le défilement :
   elle ne se retrouve jamais au-dessus d'une zone claire. Le menu
   déroulant, lui, a son propre fond plein et garde le mode clair. */
:root[data-bsp-theme="light"] :is(body.single-project, body.single-case-study, body.post-type-archive-case-study, body.bsp-has-page-hero, body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho) .bsp-home-nav {
	/* Borné à la barre de navigation (corrigé le 16 septembre 2026) : le
	   pied de page réutilise .bsp-home-nav-logo-text, et la première
	   version de ce bloc passait « corp. » en blanc sur le fond crème du
	   pied de page (1,1:1 mesuré). */
	&::before {
		background: linear-gradient(to bottom, rgba(10, 12, 20, 0.6) 0%, transparent 100%);
	}
	& .bsp-home-nav-logo img { filter: none; }
	& .bsp-home-nav-logo-text { color: rgba(255, 255, 255, 0.45); }
	& .bsp-home-nav-links > li > a { color: rgba(255, 255, 255, 0.7); }
	& .bsp-home-nav-links > li > a:hover {
		color: #fff;
		text-decoration-color: rgba(255, 255, 255, 0.4);
	}
	& .bsp-home-nav-lang a { color: rgba(255, 255, 255, 0.4); }
	& .bsp-home-nav-lang a:hover,
	& .bsp-home-nav-lang a.is-active { color: #fff; }
	& .bsp-home-nav-lang-sep { color: rgba(255, 255, 255, 0.2); }
	& .bsp-theme-toggle {
		border-color: rgba(255, 255, 255, 0.16);
		background: rgba(255, 255, 255, 0.06);
		color: #fff;
	}
	& .bsp-theme-toggle:hover {
		background: rgba(255, 255, 255, 0.14);
		border-color: rgba(255, 255, 255, 0.3);
	}
}


/* =============================================================
   03 · STATS: « An evolved expertise »
   -------------------------------------------------------------
   Section Divi : « Stats » >
     rangée 1 (1 colonne)  : module Texte  = titre + filet
     rangée 2 (4 colonnes) : 4 modules Texte = les 4 chiffres
   Le comptage 0 -> valeur est animé par bsp-custom.js
   (data-bsp-count sur le <span>).
   ============================================================= */

.bsp-home-stats.et_pb_section {
	background: var(--bsp-bg);
	padding: 72px var(--bsp-gutter);
}

/* En-tête : titre à gauche, filet horizontal qui remplit le reste */
.bsp-home-stats-header .et_pb_text_inner {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: var(--bsp-gutter);
	margin-bottom: 48px;
}

.bsp-home-stats-title {
	margin: 0 0 var(--bsp-space-title);
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(36px, 4vw, 56px);
	color: var(--bsp-text);
	line-height: 1.05;
	letter-spacing: -0.01em;
	max-width: 400px;
	margin: 0;
}

.bsp-home-stats-title em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-home-section .bsp-home-stats-divider {
	flex: 1;
	height: 1px;
	background: var(--bsp-border);
	align-self: center;
	margin-top: 8px !important;
}

/* Rangée Divi 4 colonnes transformée en grille (voir bloc 00) */
.bsp-home-stats-grid.et_pb_row {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	border-top: 1px solid var(--bsp-border-subtle);
}

.bsp-home-stats-grid .et_pb_column {
	width: auto !important;
	margin: 0 !important;
	float: none;
	padding: 36px 32px 36px 0;
	border-right: 1px solid var(--bsp-border-subtle);
}

.bsp-home-stats-grid .et_pb_column:last-child {
	border-right: none;
}

.bsp-home-stats-grid .et_pb_column + .et_pb_column {
	padding-left: 32px;
}

.bsp-home-stat-num {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(56px, 6vw, 84px);
	color: var(--bsp-text);
	line-height: 1;
	letter-spacing: -0.02em;
}

/* Le « + » devant le chiffre reste droit, pas en italique */
.bsp-home-stat-num em {
	font-style: normal;
	color: inherit;
}

/* Le « #1 » est le seul chiffre coloré */
.bsp-home-stat-num em.is-accent {
	color: var(--bsp-accent-text);
}

.bsp-home-section .bsp-home-stat-label {
	font-family: var(--bsp-font-body);
	font-size: 20px;
	font-weight: 400;
	color: var(--bsp-text);
	margin-top: 10px !important;
	line-height: 1.4;
}


/* =============================================================
   04 · TRANSFORMATION: texte + diagramme écosystème Zoho
   -------------------------------------------------------------
   Section Divi : « Transformation » > rangée 2 colonnes
     colonne gauche : modules Texte + module Bouton (natifs)
     colonne droite : module Code (diagramme animé: aucun
                      équivalent natif Divi)
   ============================================================= */

.bsp-home-transform.et_pb_section {
	background: var(--bsp-bg);
	padding: 100px var(--bsp-gutter);
}

.bsp-home-transform-row.et_pb_row {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: var(--bsp-gutter);
	align-items: center;
}

.bsp-home-transform-row .et_pb_column {
	width: auto !important;
	margin: 0 !important;
	float: none;
}

.bsp-home-transform-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(32px, 3vw, 44px);
	color: var(--bsp-text);
	line-height: 1.15;
	letter-spacing: -0.01em;
	margin: 0 0 32px;
}

.bsp-home-transform-title em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-home-transform-body p {
	font-family: var(--bsp-font-body);
	font-size: 23.5px;
	color: var(--bsp-text-soft);
	line-height: 1.4;
	margin-bottom: 20px;
	max-width: 480px;
}

.bsp-home-transform-body p:last-child {
	margin-bottom: 0;
}

/* Bouton Divi natif restylé en pilule ambre */
.bsp-home-section .bsp-home-transform-cta {
	margin-top: 36px !important;
}

/* ---------- Diagramme écosystème ---------- */

.bsp-home-eco {
	position: relative;
	width: 100%;
	aspect-ratio: 1 / 1;
}

/* Trame de points, masquée en cercle */
.bsp-home-eco::before {
	content: '';
	position: absolute;
	inset: 0;
	background-image: radial-gradient(rgba(255, 255, 255, 0.08) 1px, transparent 1px);
	background-size: 28px 28px;
	border-radius: 50%;
	mask-image: radial-gradient(circle, #000 60%, transparent 85%);
	-webkit-mask-image: radial-gradient(circle, #000 60%, transparent 85%);
}

.bsp-home-eco-glow {
	position: absolute;
	top: 50%;
	left: 50%;
	width: 46%;
	height: 46%;
	transform: translate(-50%, -50%);
	background: radial-gradient(circle, rgba(var(--bsp-accent-rgb), 0.16) 0%, transparent 70%);
	pointer-events: none;
}

/* L'anneau tourne très lentement ; le JS le fige au survol d'un nœud */
.bsp-home-eco-ring {
	position: absolute;
	inset: 0;
	animation: bspEcoSpin 140s linear infinite;
}

.bsp-home-eco-ring.is-frozen {
	animation-play-state: paused;
}

@keyframes bspEcoSpin {
	from { transform: rotate(0deg); }
	to   { transform: rotate(360deg); }
}

@keyframes bspEcoSpinReverse {
	from { transform: rotate(0deg); }
	to   { transform: rotate(-360deg); }
}

/* Un « bras » = le trait pointillé du centre vers un nœud */
.bsp-home-eco-arm {
	position: absolute;
	top: 50%;
	left: 50%;
	width: var(--radius, 39%);
	height: 0;
	transform-origin: 0 0;
	animation: bspArmGrow 12s ease-in-out infinite;
	animation-delay: var(--delay, 0s);
}

.bsp-home-eco-arm:hover {
	animation-play-state: paused;
}

@keyframes bspArmGrow {
	0%, 12%, 100% { width: var(--radius, 39%); }
	5%            { width: calc(var(--radius, 39%) + 9%); }
}

/* Deux profondeurs : « front » plus gros et lisible, « back » discret */
.bsp-home-eco-arm.is-front { z-index: 6; }
.bsp-home-eco-arm.is-front .bsp-home-eco-node { width: 17px; height: 17px; }
.bsp-home-eco-arm.is-front .bsp-home-eco-label { font-size: 12px; }

.bsp-home-eco-arm.is-back { z-index: 1; }
.bsp-home-eco-arm.is-back .bsp-home-eco-node { width: 10px; height: 10px; }
.bsp-home-eco-arm.is-back .bsp-home-eco-label { font-size: 9px; opacity: 0.82; }

/* Un bras = un trait pointillé bleu, du centre vers un nœud. Le trait est à 0 % d'opacité au centre (il ne passe jamais derrière
   le logo Zoho) et à 100 % au niveau de l'application : le masque
   dégradé porte sur le trait. */
.bsp-home-eco-arm::before {
	content: '';
	position: absolute;
	left: 0;
	width: 100%;
	-webkit-mask-image: linear-gradient(to right, transparent 0%, transparent 32%, #000 100%);
	mask-image: linear-gradient(to right, transparent 0%, transparent 32%, #000 100%);
}

/* Trait pointillé de 1 px */
.bsp-home-eco-arm::before {
	top: -1px;
	height: 3px;
	background:
		repeating-linear-gradient(90deg, rgba(var(--bsp-accent-rgb), 0.7) 0 6px, transparent 6px 10px)
		0 50% / 100% 1px no-repeat;
	animation: bspLinePulse 12s ease-in-out infinite;
	animation-delay: var(--delay, 0s);
}

.bsp-home-eco-arm:hover::before {
	animation-play-state: paused;
}

@keyframes bspLinePulse {
	0%, 12%, 100% { background-size: 100% 1px; }
	5%            { background-size: 100% 2px; }
}

/* Contre-rotation : le nœud reste droit pendant que l'anneau tourne */
.bsp-home-eco-node-counter {
	position: absolute;
	top: 0;
	left: 100%;
	/* Point de rotation = extrémité exacte du trait. Sans cela, la boîte
	   (13 px) pivotait autour de SON centre : le point décrivait un petit
	   cercle autour de l'extrémité du trait et s'en éloignait au fil
	   du tour (dérive signalée le 20 sept. 2026). */
	width: 0;
	height: 0;
	transform-origin: 0 0;
	animation: bspEcoSpinReverse 140s linear infinite;
}

.bsp-home-eco-ring.is-frozen .bsp-home-eco-node-counter {
	animation-play-state: paused;
}

/* La boîte fait exactement la taille du point, pour que le trait
   pointe pile sur son centre. Le libellé est positionné à part. */
.bsp-home-eco-node {
	position: relative;
	width: 13px;
	height: 13px;
	transform: translate(-50%, -50%) rotate(var(--node-angle, 0deg));
}

/* Zone de survol généreuse et invisible : évite les zones mortes
   entre le point, le libellé et l'info-bulle */
.bsp-home-eco-hotspot {
	position: absolute;
	top: -14px;
	bottom: -42px;
	left: -55px;
	right: -55px;
}

.bsp-home-eco-dot {
	position: absolute;
	inset: 0;
	border-radius: 50%;
	background: var(--bsp-accent);
	animation: bspNodePulse 12s ease-in-out infinite;
}

.bsp-home-eco-node:hover .bsp-home-eco-dot {
	animation-play-state: paused;
	transform: scale(1);
	box-shadow: 0 0 0 0 rgba(var(--bsp-accent-rgb), 0);
}

@keyframes bspNodePulse {
	0%, 12%, 100% { box-shadow: 0 0 0 0 rgba(var(--bsp-accent-rgb), 0); transform: scale(1); }
	5%            { box-shadow: 0 0 18px 7px rgba(var(--bsp-accent-rgb), 0.85); transform: scale(1.5); }
}

.bsp-home-eco-label {
	position: absolute;
	top: calc(100% + 10px);
	left: 50%;
	transform: translateX(-50%);
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 10px;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--bsp-text);
	white-space: nowrap;
	animation: bspLabelZoom 12s ease-in-out infinite;
	animation-delay: var(--delay, 0s);
}

/* Au survol : la rotation se fige et le libellé grossit.
   translateX(-50%) reste seul responsable de l'horizontalité,
   quelle que soit la position du nœud sur l'anneau. */
.bsp-home-eco-node:hover .bsp-home-eco-label {
	animation-play-state: paused;
	transform: translateX(-50%) scale(1.5);
	text-shadow: 0 0 16px rgba(var(--bsp-accent-rgb), 0.9);
	z-index: 25;
}

@keyframes bspLabelZoom {
	0%, 12%, 100% { transform: translateX(-50%) scale(1);    text-shadow: none; }
	5%            { transform: translateX(-50%) scale(1.35); text-shadow: 0 0 14px rgba(var(--bsp-accent-rgb), 0.9); }
}

/* Info-bulle métier: toujours horizontale, jamais tournée */
.bsp-home-eco-tooltip {
	position: absolute;
	top: calc(100% + 38px);
	left: 50%;
	transform: translateX(-50%) translateY(4px) scale(1);
	width: 200px;
	padding: 12px 16px;
	background: rgba(8, 11, 22, 0.97);
	border: 1px solid rgba(var(--bsp-accent-rgb), 0.35);
	border-radius: 10px;
	text-align: center;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.2s ease, transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
	z-index: 20;
}

.bsp-home-eco-node:hover .bsp-home-eco-tooltip {
	opacity: 1;
	transform: translateX(-50%) translateY(0) scale(1.05);
	pointer-events: auto;
	border-color: rgba(var(--bsp-accent-rgb), 0.75);
	box-shadow: 0 14px 34px rgba(0, 0, 0, 0.5), 0 0 26px rgba(var(--bsp-accent-rgb), 0.4);
}

.bsp-home-section .bsp-home-eco-tooltip-app {
	display: block;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 10px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--bsp-accent-hover);
	margin-bottom: 6px !important;
}

.bsp-home-eco-tooltip-desc {
	display: block;
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 15.5px;
	line-height: 1.45;
	letter-spacing: normal;
	text-transform: none;
	color: rgba(255, 255, 255, 0.85);
}

/* Cube Zoho au centre */
.bsp-home-eco-hub {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	width: 300px;
	max-width: 40%;
	z-index: 4;
	display: flex;
	align-items: center;
	justify-content: center;
}

.bsp-home-eco-hub img {
	width: 100%;
	height: auto;
	max-height: 100px;
	object-fit: contain;
}

/* Logo Zoho : version blanche en mode sombre, version aux couleurs
   d'origine (rouge / vert / bleu / jaune, charte Zoho) en mode clair. */
.bsp-home-eco-hub .bsp-zoho-mark--color { display: none; }
:root[data-bsp-theme="light"] .bsp-home-eco-hub .bsp-zoho-mark--white { display: none; }
:root[data-bsp-theme="light"] .bsp-home-eco-hub .bsp-zoho-mark--color { display: block; }


/* =============================================================
   05 · PROJETS: carrousel horizontal continu
   -------------------------------------------------------------
   Section Divi : « Projets » >
     rangée 1 : modules Texte (surtitre + titre)
     rangée 2 : module Code (défilement infini piloté en JS,
                le module Slider de Divi ne fait pas de marquee)
   ============================================================= */

.bsp-home-projects.et_pb_section {
	background: var(--bsp-bg);
	padding: 100px 0 96px;
	overflow: hidden;
}

.bsp-home-projects-header.et_pb_row {
	padding: 0 100px;
	margin-bottom: 44px;
}

.bsp-home-section .bsp-home-eyebrow {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 9px;
	letter-spacing: 0.38em;
	text-transform: uppercase;
	color: var(--bsp-accent);
	margin-bottom: 18px !important;
}

.bsp-home-projects-title {
	margin: 0 0 var(--bsp-space-title);
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(28px, 3vw, 44px);
	color: var(--bsp-text);
	letter-spacing: -0.01em;
	margin: 0;
}

.bsp-home-projects-title em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

/* Fondu latéral aux deux extrémités du carrousel */
.bsp-home-marquee {
	overflow: hidden;
	width: 100%;
	padding: 40px 0;
	-webkit-mask-image: linear-gradient(to right, transparent 0%, #000 6%, #000 94%, transparent 100%);
	mask-image: linear-gradient(to right, transparent 0%, #000 6%, #000 94%, transparent 100%);
}

.bsp-home-marquee-track {
	display: flex;
	align-items: center;
	width: max-content;
	gap: 28px;
	will-change: transform;
}

.bsp-home-project-card {
	position: relative;
	z-index: 1;
	display: block;
	flex-shrink: 0;
	width: 336px;
	aspect-ratio: 3 / 2;
	border-radius: 14px;
	overflow: hidden;
	box-shadow: 0 19px 48px rgba(0, 0, 0, 0.4);
	transition: transform 0.4s ease, box-shadow 0.4s ease;
}

.bsp-home-project-card:hover {
	transform: translateY(-6px) scale(1.3);
	box-shadow: 0 30px 70px rgba(0, 0, 0, 0.65), 0 60px 130px rgba(0, 0, 0, 0.4);
	z-index: 5;
}

.bsp-home-project-card img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	filter: grayscale(0);
	transition: filter 0.4s ease;
}

/* Dès qu'une vignette est survolée, les autres passent en N&B */
.bsp-home-marquee-track:has(.bsp-home-project-card:hover) .bsp-home-project-card:not(:hover) img {
	filter: grayscale(1);
}

/* Bouton réel superposé au bouton dessiné dans l'image */
.bsp-home-project-btn {
	position: absolute;
	z-index: 3;
	left: 195px;
	bottom: 22px;
	height: 24px;
	padding: 0 13px 0 3px;
	display: flex;
	align-items: center;
	gap: 6px;
	background: var(--bsp-accent);            /* maquette : #7ECCF8 (bleu) */
	border-radius: 100px;
	box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25);
}

.bsp-home-project-btn-icon {
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background: #fff;
	color: var(--bsp-bg-deep);
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 10px;
	flex-shrink: 0;
	transition: transform 0.35s cubic-bezier(0.2, 0.8, 0.2, 1), background-color 0.35s ease, color 0.35s ease;
}

.bsp-home-project-card:hover .bsp-home-project-btn-icon {
	transform: rotate(-45deg) scale(1.12);
	background: var(--bsp-bg-deep);
	color: #fff;
}

.bsp-home-project-btn-text {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 10px;
	color: #fff;
	white-space: nowrap;
}

/* Survol : voile marine + description du projet */
.bsp-home-project-overlay {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 30px 28px 60px;
	background: linear-gradient(180deg, rgba(6, 30, 60, 0.82) 0%, rgba(6, 30, 60, 0.94) 100%);
	opacity: 0;
	transition: opacity 0.35s ease;
	pointer-events: none;
}

.bsp-home-project-card:hover .bsp-home-project-overlay {
	opacity: 1;
}

.bsp-home-project-desc {
	font-family: var(--bsp-font-body);
	font-weight: 600;
	font-size: 22px;
	line-height: 1.5;
	color: var(--bsp-body);
	text-align: center;
	text-shadow: 0 2px 10px rgba(0, 0, 0, 0.35);
}


/* =============================================================
   06 · POURQUOI BSP: grille de 6 arguments numérotés
   -------------------------------------------------------------
   Section Divi : « Pourquoi BSP » >
     rangée 1 (1 colonne)  : module Texte = surtitre + titre
     rangée 2 (3 colonnes) : 3 modules Texte
     rangée 3 (3 colonnes) : 3 modules Texte
   ============================================================= */

.bsp-home-why.et_pb_section {
	background: var(--bsp-bg);
	padding: 100px 100px 110px;
}

.bsp-home-why-header.et_pb_row {
	max-width: 640px;
	margin: 0 auto 56px;
	text-align: center;
}

.bsp-home-why-title {
	margin: 0 0 var(--bsp-space-title);
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(32px, 3.4vw, 48px);
	color: var(--bsp-text);
	line-height: 1.2;
	letter-spacing: -0.01em;
	margin: 0;
}

.bsp-home-why-title em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-home-why-grid.et_pb_row {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 40px;
	max-width: 1200px;
	margin: 0 auto;
}

/* Deuxième rangée de la grille : même gabarit, collée à la 1re */
.bsp-home-why-grid.et_pb_row + .bsp-home-why-grid.et_pb_row {
	margin-top: 40px;
}

.bsp-home-why-grid .et_pb_column {
	width: auto !important;
	margin: 0 !important;
	float: none;
	border-top: 1px solid var(--bsp-border);
	padding-top: 24px;
}

.bsp-home-section .bsp-home-why-num {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 40px;
	line-height: 1;
	color: var(--bsp-accent);
	margin-bottom: 18px !important;
}

.bsp-home-section .bsp-home-why-item-title {
	font-family: var(--bsp-font-label);
	font-weight: 800;
	font-size: 16px;
	letter-spacing: 0.01em;
	color: var(--bsp-text);
	margin-bottom: 12px !important;
}

.bsp-home-why-desc {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 19.5px;
	line-height: 1.45;
	color: var(--bsp-body);
	margin: 0;
}


/* =============================================================
   07 · SOLUTIONS ZOHO: 6 cartes
   -------------------------------------------------------------
   Section Divi : « Solutions » >
     rangée 1 (1 colonne)  : module Texte = titre
     rangée 2 (3 colonnes) : 3 modules Texte = cartes 1-3
     rangée 3 (3 colonnes) : 3 modules Texte = cartes 4-6
   L'image de fond est réglée sur la SECTION Divi (natif), avec
   une opacité gérée ici.
   ============================================================= */

.bsp-home-solutions.et_pb_section {
	position: relative;
	overflow: hidden;
	background-color: var(--bsp-bg);
	padding: 100px 100px 110px;
}

/* Voile sombre par-dessus l'image de fond de la section */
.bsp-home-solutions.et_pb_section::before {
	content: '';
	position: absolute;
	inset: 0;
	background: rgba(10, 13, 20, 0.84);
	z-index: 0;
	pointer-events: none;
}

.bsp-home-solutions .et_pb_row {
	position: relative;
	z-index: 1;
}

.bsp-home-solutions-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(32px, 3.4vw, 48px);
	color: #fff;
	line-height: 1.2;
	letter-spacing: -0.01em;
	text-align: center;
	max-width: 780px;
	margin: 0 auto 56px;
}

.bsp-home-solutions-title em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-home-solutions-grid.et_pb_row {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 28px;
	max-width: 1200px;
	margin: 0 auto;
}

.bsp-home-solutions-grid.et_pb_row + .bsp-home-solutions-grid.et_pb_row {
	margin-top: 28px;
}

.bsp-home-solutions-grid .et_pb_column {
	width: auto !important;
	margin: 0 !important;
	float: none;
	display: flex;
	flex-direction: column;
}

/* La CARTE est la colonne. Elle contient un module par élément,
   icône, titre, description, mention, expert, bouton: pour que
   chacun s'édite séparément dans le constructeur, sans HTML à la
   main. Les classes vivent sur les modules, jamais dans le texte. */
.bsp-home-solution-card {
	width: 100%;
	background: linear-gradient(160deg, rgba(var(--bsp-accent-rgb), 0.08) 0%, rgba(0, 0, 0, 0.45) 40%);
	border: 1px solid rgba(255, 255, 255, 0.08);
	border-radius: 14px;
	padding: 34px 28px;
	transition: border-color 0.2s, background 0.2s;
}




/* Survol : la carte passe en aplat d'accent. Le survol porte
   maintenant sur toute la carte, rembourrage compris: avant, il
   s'arrêtait au contenu et « sautait » près des bords. */
.bsp-home-solution-card:hover {
	background: var(--bsp-accent-fill);
	border-color: var(--bsp-accent-fill);
}

.bsp-home-solution-card:hover .bsp-home-solution-icon {
	color: #fff;
}

/* Pas de remise à zéro globale des marges des modules ici : une règle
   comme « .bsp-home-solution-card > .et_pb_module { margin-bottom: 0 } »
   compte deux classes et écrase donc les marges posées plus bas par
   « .bsp-home-solution-icon », « -name », « -desc » et « -tag », qui n'en
   comptent qu'une. Tout l'espacement interne de la carte disparaissait.
   Chaque élément déclare sa propre marge, et le dernier: le bouton,
   la remet à zéro lui-même. */

/* Boîte de l'icône Font Awesome (kit CCM-UI-Kit, style Light).
   La taille se règle ICI, sur le conteneur, et pas sur la balise <i> :
   Font Awesome dessine ses icônes à « 1em » via la propriété raccourcie
   « font », qui écrase toute font-size posée sur la balise elle-même.
   C'est pour ça que les icônes sortaient à 16 px. Une seule valeur à
   changer pour toutes les icônes de carte. */
.bsp-home-section .bsp-home-solution-icon {
	font-size: 42px;
	line-height: 1;
	margin-bottom: 22px !important;
	color: var(--bsp-accent);
}

.bsp-home-solution-icon i {
	line-height: 1;
}

.bsp-home-section .bsp-home-solution-name {
	margin-top: 8px !important;
	margin-bottom: 18px !important;
}

.bsp-home-solution-name h3 {
	font-family: var(--bsp-font-label);
	font-weight: 800;
	font-size: 17px;
	line-height: 1.3;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #fff;
	padding-bottom: 0;
}

.bsp-home-section .bsp-home-solution-desc {
	margin-bottom: 22px !important;
	min-height: 48px;
	flex-grow: 1;
}

.bsp-home-solution-desc,
.bsp-home-solution-desc p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 21px;
	line-height: 1.4;
	color: var(--bsp-body);
}

.bsp-home-solution-desc p:last-child {
	margin-bottom: 0;
}

.bsp-home-section .bsp-home-solution-tag {
	margin-bottom: 18px !important;
}

.bsp-home-solution-tag,
.bsp-home-solution-tag p {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 10px;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.55);
	margin-bottom: 0;
}

/* « Learn more » est un module Bouton : l'éditeur dispose d'un
   champ pour le texte et d'un champ pour l'adresse, au lieu d'un
   <a href> à modifier dans du texte riche. Le style par défaut de
   Divi est ramené à un simple lien. */
.bsp-home-section .bsp-home-solution-link {
	/* « margin-top: auto » colle le lien au bas de la carte quand elle a
	   du mou. Depuis que les cartes s'ajustent à leur contenu, ce mou peut
	   être nul : le rembourrage garantit l'air dans tous les cas. */
	margin-top: auto !important;
	padding-top: 16px;
	margin-bottom: 0 !important;
	text-align: left;
}

/* Selon la version de Divi, la classe de module se retrouve soit sur
   l'enveloppe du module, soit directement sur le lien. Les deux cas
   sont couverts, sinon le bouton garde son habillage Divi par défaut
   (cadre bleu) au lieu de ressembler à un lien. */
.bsp-home-solution-link .et_pb_button,
a.bsp-home-solution-link.et_pb_button {
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent !important;
	font-family: var(--bsp-font-body);
	font-size: 13px;
	font-weight: 600;
	letter-spacing: 0;
	color: #fff;
	transition: color 0.2s;
}

.bsp-home-solution-link .et_pb_button:hover,
a.bsp-home-solution-link.et_pb_button:hover {
	color: var(--bsp-accent-hover);
	background: transparent !important;
	border: 0 !important;
	padding: 0 !important;
}

/* Divi ajoute sa propre flèche au bouton, tirée de sa police
   d'icônes. On la remplace par notre caractère : une seule source
   d'icônes sur le projet, et rien à charger pour une flèche. */
.bsp-home-solution-link .et_pb_button::after,
a.bsp-home-solution-link.et_pb_button::after {
	content: ' →' !important;
	font-family: inherit !important;
	font-size: inherit !important;
	line-height: inherit !important;
	opacity: 1 !important;
	position: static !important;
	margin-left: 0 !important;
}

/* Expert de la carte : un seul module Texte, avec l'image en ligne.
   Le module Blurb aurait été plus propre, mais le convertisseur de Divi
   le laisse en mode Divi 4: voir le commentaire dans le générateur. */
.bsp-home-section .bsp-home-solution-expert {
	margin-bottom: 18px !important;
	padding-top: 18px;
	border-top: 1px solid rgba(255, 255, 255, 0.08);
	font-family: var(--bsp-font-body);
	font-size: 15.5px;
	line-height: 1.4;
	color: rgba(255, 255, 255, 0.5);
}

.bsp-home-solution-expert .et_pb_text_inner {
	display: flex;
	align-items: center;
	gap: 12px;
}

.bsp-home-solution-expert p {
	margin-bottom: 0;
}

.bsp-home-solution-expert strong {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 13px;
	color: #fff;
}

.bsp-home-solution-expert-photo {
	width: 44px;
	height: 44px;
	border-radius: 50%;
	object-fit: cover;
	object-position: top center;
	flex-shrink: 0;
	background: var(--bsp-bg);
	border: 1px solid rgba(var(--bsp-accent-rgb), 0.4);
}



/* =============================================================
   08 · CLIENTS: bandeau de logos défilant
   -------------------------------------------------------------
   Section Divi : « Clients » > 1 colonne > module Code.
   Fond : le bleu de marque #1057B7 (jeton --bsp-brand-blue), identique
   en clair et en sombre ; logos et titre restent blancs dessus.
   ============================================================= */

.bsp-home-clients.et_pb_section {
	background: var(--bsp-brand-blue);
	padding: 64px 0 88px;
}

.bsp-home-section .bsp-home-clients-eyebrow {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 18px;
	letter-spacing: 0.2em;
	text-transform: uppercase;
	color: #fff;
	text-align: center;
	margin-bottom: 40px !important;
}

.bsp-home-clients-marquee {
	overflow: hidden;
	width: 100%;
	-webkit-mask-image: linear-gradient(to right, transparent 0%, #000 8%, #000 92%, transparent 100%);
	mask-image: linear-gradient(to right, transparent 0%, #000 8%, #000 92%, transparent 100%);
}

/* Ici le défilement est en CSS pur : la piste contient deux fois
   la même série de logos, on translate de -50% à 0. */
.bsp-home-clients-track {
	display: flex;
	align-items: center;
	width: max-content;
	gap: 96px;
	animation: bspClientsScroll 32s linear infinite;
}

.bsp-home-clients-marquee:hover .bsp-home-clients-track {
	animation-play-state: paused;
}

@keyframes bspClientsScroll {
	from { transform: translateX(-50%); }
	to   { transform: translateX(0%); }
}

.bsp-home-clients-track img {
	height: 45px;
	width: auto;
	flex-shrink: 0;
	opacity: 0.75;
	transition: opacity 0.2s;
}

.bsp-home-clients-track img:hover {
	opacity: 1;
}

.bsp-home-clients-track a {
	display: flex;
	align-items: center;
	flex-shrink: 0;
}


/* =============================================================
   09 · CONTACT: prise de rendez-vous
   -------------------------------------------------------------
   Section Divi : « Contact » > rangée 2 colonnes
     colonne gauche : modules Texte + module Formulaire de
                      contact Divi (natif: pas de code custom)
     colonne droite : vide (l'image de fond de section occupe
                      l'espace, comme dans la maquette)
   ============================================================= */

.bsp-home-contact.et_pb_section {
	position: relative;
	background-color: #0d1018;
	padding: 110px 100px;
	overflow: hidden;
}

/* Voile dégradé par-dessus l'image de fond de la section */
.bsp-home-contact.et_pb_section::before {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(13, 16, 24, 0.55) 0%, rgba(13, 16, 24, 0.88) 100%);
	z-index: 0;
	pointer-events: none;
}

.bsp-home-contact-row.et_pb_row {
	position: relative;
	z-index: 1;
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 90px;
	max-width: 1300px;
	margin: 0 auto;
	align-items: center;
}

.bsp-home-contact-row .et_pb_column {
	width: auto !important;
	margin: 0 !important;
	float: none;
}

.bsp-home-contact-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(30px, 3.2vw, 46px);
	line-height: 1.15;
	color: #fff;
	letter-spacing: -0.01em;
	margin: 0 0 22px;
}

.bsp-home-contact-title em {
	font-style: italic;
	color: var(--bsp-accent-hover);
}

.bsp-home-contact-subtitle {
	font-family: var(--bsp-font-body);
	font-size: 22px;
	font-weight: 400;
	color: var(--bsp-body);
	line-height: 1.4;
	max-width: 460px;
	margin: 0 0 36px;
}

/* ---------- Formulaire de contact Divi, restylé ----------
   On garde le module natif (validation, anti-spam, envoi mail
   gérés par Divi) et on aligne uniquement son apparence. */

.bsp-home-contact-form.et_pb_contact_form_container {
	margin: 0;
	max-width: 480px;
}

.bsp-home-contact-form .et_pb_contact_main_title {
	display: none;
}

/* Divi empile les champs en flottants. On passe le formulaire en
   flex pour reproduire la rangée « nom + courriel » de la maquette :
   les champs marqués fullwidth_field="off" côté module reçoivent la
   classe .et_pb_contact_field_half et occupent une demi-largeur. */
.bsp-home-contact-form .et_pb_contact_form {
	display: flex;
	flex-wrap: wrap;
	column-gap: 16px;
}

/* NOTE QA finale : ce formulaire Divi sera remplacé par un formulaire Zoho
   intégré en iframe (voir QA-revue-finale.md). */
.bsp-home-contact-form .et_pb_contact_form:not(.et_block_module) .et_pb_contact_field {
	width: 100%;
	float: none;
	padding: 0 0 28px;
	margin: 0;
}

.bsp-home-contact-form .et_pb_contact_form:not(.et_block_module) .et_pb_contact_field_half {
	width: calc(50% - 8px);
}

/* Le bouton d'envoi occupe sa propre ligne, aligné à gauche */
.bsp-home-contact-form .et_pb_contact_right,
.bsp-home-contact-form .et_contact_bottom_container {
	width: 100%;
	float: none;
	text-align: left;
	margin: 12px 0 0;
	padding: 0;
}

/* !important assumé : Divi applique un fond gris clair (#eee) aux
   champs de formulaire avec une spécificité supérieure. C'est le
   seul endroit du fichier qui en a besoin. */
.bsp-home-contact-form input[type="text"],
.bsp-home-contact-form input[type="email"],
.bsp-home-contact-form textarea,
.bsp-home-contact-form .et_pb_contact_field textarea {
	width: 100%;
	background-color: rgba(255, 255, 255, 0.04) !important;
	border: 1px solid rgba(255, 255, 255, 0.16) !important;
	border-radius: 10px;
	padding: 14px 16px;
	color: #fff !important;
	font-family: var(--bsp-font-body);
	font-size: 14px;
	transition: border-color 0.2s, background-color 0.2s;
}

.bsp-home-contact-form textarea,
.bsp-home-contact-form .et_pb_contact_field textarea {
	resize: vertical;
	min-height: 120px;
}

.bsp-home-contact-form input::placeholder,
.bsp-home-contact-form textarea::placeholder {
	color: rgba(255, 255, 255, 0.45);
	opacity: 1;
}

.bsp-home-contact-form input:focus,
.bsp-home-contact-form textarea:focus {
	outline: none;
	border-color: var(--bsp-accent) !important;
	background-color: rgba(255, 255, 255, 0.07) !important;
}

/* Bouton d'envoi : même pilule ambre que les autres CTA */
.bsp-home-contact-form .et_pb_contact_submit.et_pb_button {
	background: var(--bsp-accent-fill);
	color: #fff;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 12px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	padding: 14px 30px;
	border: none;
	border-radius: 100px;
	transition: background 0.2s;
}

.bsp-home-contact-form .et_pb_contact_submit.et_pb_button:hover {
	background: var(--bsp-accent-hover);
	padding: 14px 30px;          /* neutralise l'animation de padding Divi */
}

.bsp-home-contact-form .et_pb_contact_submit.et_pb_button::after {
	display: none;               /* neutralise la flèche Divi au survol */
}

.bsp-home-section .bsp-home-contact-note {
	font-family: var(--bsp-font-body);
	font-size: 15.5px;
	color: rgba(255, 255, 255, 0.4);
	margin-top: 14px !important;
}


/* =============================================================
   10 · FOOTER
   -------------------------------------------------------------
   Divi section: "Footer" >
     row 1 (2 columns): brand + link columns
     row 2 (1 column):  copyright + social links
   TO MOVE into a global Divi Theme Builder footer once the other
   pages are built: see NOTES-ACCUEIL.md.
   ============================================================= */

/* Deliberately lighter than --bsp-bg-footer (#060810): this is the
   maquette's value, which visually detaches the footer from the body. */
.bsp-home-footer.et_pb_section {
	background: #1B1E27;
	border-top: var(--bsp-section-rule);
	padding: 72px var(--bsp-gutter) 32px;
}

.bsp-home-footer-top.et_pb_row {
	display: grid;
	grid-template-columns: minmax(260px, 1fr) 2fr;
	gap: 60px;
	padding-bottom: 56px;
	border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}

.bsp-home-footer-top .et_pb_column {
	width: auto !important;
	margin: 0 !important;
	float: none;
}

.bsp-home-section .bsp-home-footer-logo {
	display: flex;
	align-items: center;
	gap: 6px;
	margin-bottom: 24px !important;
}

.bsp-home-footer-logo img {
	height: 28px;
	opacity: 0.85;
}

.bsp-home-footer-logo .bsp-home-nav-logo-text {
	color: #fff;
}

/* The brand dot keeps its footer size (18px, see KB §2.4) */
.bsp-home-footer-logo .bsp-home-nav-logo-dot {
	font-size: 18px;
	color: var(--bsp-accent);
}

.bsp-home-footer-tagline {
	font-family: var(--bsp-font-body);
	font-size: 17px;
	font-style: italic;
	line-height: 1.5;
	max-width: 260px;
	color: rgba(255, 255, 255, 0.62); /* 4,4:1 → ≥ 6:1 sur le fond du pied de page (16 sept. 2026) */
	margin: 0 0 24px;
}

.bsp-home-footer-badge {
	height: 40px;
	width: auto;
	opacity: 0.95;
}

/* Link menu: WP nav menu shared with the header (footer-menu location),
   rendered by BSP_Nav_Walker_Footer (includes/nav-walkers.php): a single
   WP menu drives both the header and the footer (Clément's decision,
   2026-09-07).
   Corrected 2026-09-10 (second pass), matching Clément's maquette
   screenshot exactly: one column per top-level item, laid out side by
   side: Case Study / Expertise / Blog / About / Contact. Expertise is
   the only item with children: they stack, dot-marked, inside its own
   column (.bsp-footer-menu-col), underneath its label.
   This is deliberate flex layout, not CSS `column-width` auto-flow: the
   original bug (2026-09-09) was the browser splitting Expertise's 6
   children across two auto-generated columns. An intermediate fix
   (earlier today) removed columns altogether, rendering one flat list,
   also wrong, since the footer is supposed to be columnar, per the
   maquette. */
.bsp-footer-menu {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	gap: 56px;
	max-width: 100%;
	width: 100%;
}

/* One top-level item + its children (if any): see
   BSP_Nav_Walker_Footer::start_el()/end_el(). */
.bsp-footer-menu-col {
	display: flex;
	flex-direction: column;
	gap: 14px;
}

.bsp-footer-menu-link {
	display: block;
	font-family: var(--bsp-font-body);
	font-size: 18px;
	color: rgba(255, 255, 255, 0.65);
	text-decoration: none;
	transition: color 0.15s;
	white-space: nowrap;
}

.bsp-footer-menu-link:hover {
	color: var(--bsp-accent);
}

.bsp-footer-menu-link--parent {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.85);
}

/* Child (expertise) links: small accent dot in front, mirroring the
   header dropdown's own .bsp-home-nav-dropdown-dot treatment. */
.bsp-footer-menu-link--child {
	display: flex;
	align-items: center;
	gap: 10px;
}

.bsp-footer-menu-dot {
	width: 5px;
	height: 5px;
	border-radius: 50%;
	background: var(--bsp-accent);
	opacity: 0.6;
	flex-shrink: 0;
}

/* Footer bottom */
.bsp-home-footer-bottom .et_pb_text_inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	padding-top: 28px;
	flex-wrap: wrap;
}

.bsp-home-footer-copy {
	font-family: var(--bsp-font-body);
	font-size: 15.5px;
	color: rgba(255, 255, 255, 0.60) /* 3,2:1 → ≥ 5,5:1 (16 sept. 2026) */;
	margin: 0;
}

.bsp-home-footer-legal {
	display: flex;
	align-items: center;
	gap: 28px;
	flex-wrap: wrap;
}

.bsp-home-footer-privacy {
	font-family: var(--bsp-font-body);
	font-size: 15.5px;
	color: rgba(255, 255, 255, 0.62);
	text-decoration: underline;
	text-underline-offset: 3px;
	transition: color 0.15s;
}

.bsp-home-footer-privacy:hover {
	color: #fff;
}

.bsp-home-footer-social {
	display: flex;
	gap: 14px;
}

.bsp-home-footer-social a {
	width: 32px;
	height: 32px;
	border-radius: 50%;
	display: flex;
	align-items: center;
	justify-content: center;
	background: rgba(255, 255, 255, 0.06);
	color: rgba(255, 255, 255, 0.6);
	transition: background 0.15s, color 0.15s;
}

.bsp-home-footer-social a:hover {
	background: var(--bsp-accent-fill);
	color: #fff;
}

.bsp-home-footer-social svg {
	width: 15px;
	height: 15px;
	fill: currentColor;
}


/* --- Surcharges mode clair : footer global --------------------------
   Même logique que la nav : le footer utilise des rgba() figés sur
   fond sombre, pas les tokens --bsp-text ; surcharge dédiée. */
:root[data-bsp-theme="light"] .bsp-home-footer.et_pb_section {
	background: var(--bsp-bg-footer);
	border-top-color: rgba(13, 21, 38, 0.08);
}

:root[data-bsp-theme="light"] .bsp-home-footer-top.et_pb_row {
	border-bottom-color: rgba(13, 21, 38, 0.08);
}

:root[data-bsp-theme="light"] .bsp-home-footer-logo .bsp-home-nav-logo-text {
	color: #0d1526;
}

:root[data-bsp-theme="light"] .bsp-home-footer-logo img {
	filter: invert(1);
}

:root[data-bsp-theme="light"] .bsp-home-footer-tagline {
	color: rgba(13, 21, 38, 0.72) /* 3,3:1 → ≥ 6:1 (16 sept. 2026) */;
}

:root[data-bsp-theme="light"] .bsp-footer-menu-link--parent {
	color: rgba(13, 21, 38, 0.75);
}

:root[data-bsp-theme="light"] .bsp-footer-menu-link {
	color: rgba(13, 21, 38, 0.65);
}

:root[data-bsp-theme="light"] .bsp-footer-menu-link:hover {
	color: var(--bsp-accent-fill);
}

:root[data-bsp-theme="light"] .bsp-home-footer-copy {
	color: rgba(13, 21, 38, 0.68) /* 2,5:1 → ≥ 5,5:1 */;
}

:root[data-bsp-theme="light"] .bsp-home-footer-privacy {
	color: rgba(13, 21, 38, 0.72) /* 3,8:1 → ≥ 6:1 */;
}

:root[data-bsp-theme="light"] .bsp-home-footer-privacy:hover {
	color: #0d1526;
}

:root[data-bsp-theme="light"] .bsp-home-footer-social a {
	background: rgba(13, 21, 38, 0.06);
	color: rgba(13, 21, 38, 0.6);
}

:root[data-bsp-theme="light"] .bsp-home-footer-social a:hover {
	background: var(--bsp-accent-fill);
	color: #fff;
}


/* =============================================================
   11 · BOUTONS COMMUNS À LA PAGE
   -------------------------------------------------------------
   Le module Bouton de Divi est natif ; on ne fait qu'aligner son
   apparence sur la pilule ambre de la maquette.
   ============================================================= */

.bsp-home-btn.et_pb_button,
a.bsp-home-btn {
	background: var(--bsp-accent-fill);
	color: #fff;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 12px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	padding: 14px 30px;
	border: none;
	border-radius: 100px;
	transition: background 0.2s;
	text-decoration: none;
	display: inline-block;
}

.bsp-home-btn.et_pb_button:hover,
a.bsp-home-btn:hover {
	/* On assombrit au survol au lieu d'éclaircir : éclaircir un aplat
	   sous du texte blanc dégrade le contraste au lieu de l'améliorer
	   (--bsp-accent-hover donnerait 2,40:1). */
	background: var(--bsp-accent-fill-hover);
	color: #fff;
	padding: 14px 30px;
	border: none;
}

/* Divi ajoute une flèche en pseudo-élément au survol : on la retire,
   la maquette n'en a pas sur le bouton plein. */
.bsp-home-btn.et_pb_button::after {
	display: none !important;
}


/* =============================================================
   12 · RESPONSIVE
   -------------------------------------------------------------
   La maquette est dessinée pour le desktop uniquement. Les
   règles ci-dessous sont un premier passage raisonnable, à
   affiner avec Clément sur maquettes mobiles.
   ============================================================= */

@media (max-width: 1280px) {

	.bsp-home-projects-header.et_pb_row,
	.bsp-home-why.et_pb_section,
	.bsp-home-solutions.et_pb_section,
	.bsp-home-contact.et_pb_section {
		padding-left: var(--bsp-gutter);
		padding-right: var(--bsp-gutter);
	}
}

@media (max-width: 1024px) {

	/* Nav : liens centrés déplacés en flux normal (menu mobile à
	   construire dans le Theme Builder). */
	.bsp-home-nav-links {
		display: none;
	}

	/* HERO sur mobile : on abandonne l'animation de profondeur.
	   Une piste de défilement de plusieurs écrans sur un téléphone
	   demande trop de gestes avant d'atteindre le contenu, et le
	   « sticky » se comporte mal sur iOS. On garde une image de
	   fond fixe et le bloc de texte, lisible immédiatement. */
	.bsp-hero-wrapper.et_pb_section {
		height: auto;
	}

	.bsp-hero.et_pb_row {
		position: relative;
		height: auto;
		min-height: 100vh;
	}

	.bsp-hero-content.et_pb_column {
		position: relative;
		top: auto;
		left: auto;
		transform: none;
		opacity: 1;
		pointer-events: auto;
		max-width: none;
		padding: 120px var(--bsp-gutter) 80px;
	}

	.bsp-hero.settled .bsp-hero-content.et_pb_column {
		transform: none;
	}

	.bsp-hero-giant,
	.bsp-hero-person,
	.bsp-hero-software,
	.bsp-hero-reveal,
	.bsp-hero-cue {
		display: none;
	}

	/* Grilles : 2 colonnes */
	.bsp-home-stats-grid.et_pb_row,
	.bsp-home-why-grid.et_pb_row,
	.bsp-home-solutions-grid.et_pb_row {
		grid-template-columns: repeat(2, 1fr);
	}

	/* Empilement des sections en 2 colonnes */
	.bsp-home-transform-row.et_pb_row,
	.bsp-home-contact-row.et_pb_row,
	.bsp-home-footer-top.et_pb_row {
		grid-template-columns: 1fr;
		gap: 48px;
	}

	.bsp-home-stats-header .et_pb_text_inner {
		flex-direction: column;
		gap: 24px;
	}

	.bsp-home-stats-divider {
		width: 100%;
		flex: none;
	}
}

@media (max-width: 640px) {

	/* Grilles : 1 colonne */
	.bsp-home-stats-grid.et_pb_row,
	.bsp-home-why-grid.et_pb_row,
	.bsp-home-solutions-grid.et_pb_row {
		grid-template-columns: 1fr;
	}

	.bsp-home-stats-grid .et_pb_column {
		border-right: none;
		border-bottom: 1px solid rgba(255, 255, 255, 0.07);
		padding: 28px 0;
	}

	.bsp-home-stats-grid .et_pb_column + .et_pb_column {
		padding-left: 0;
	}

	.bsp-home-solution-card {
		min-height: 0;
		padding: 32px 24px;
	}

	.bsp-home-project-card {
		width: 260px;
	}

	/* Pas d'agrandissement au survol sur écran tactile */
	.bsp-home-project-card:hover {
		transform: none;
	}

	.bsp-footer-menu {
		max-width: none;
		flex-direction: column;
		gap: 32px;
	}

	.bsp-footer-menu-link {
		white-space: normal;
	}

	.bsp-home-footer-bottom .et_pb_text_inner {
		flex-direction: column;
		align-items: flex-start;
	}
}


/* =============================================================
   13 · ACCESSIBILITÉ: respect de « réduire les animations »
   ============================================================= */

@media (prefers-reduced-motion: reduce) {

	/* Bandeau du catalogue : ni fondu d'apparition, ni fondu enchaîné
	   d'une photo à l'autre. Ajouté le 14 septembre 2026. */
	.bsp-blog-catalog .filter-banner-bg-img { animation: none !important; }

	::view-transition-old(bsp-banner-photo),
	::view-transition-new(bsp-banner-photo) { animation: none !important; }

	.bsp-home-eco-ring,
	.bsp-home-eco-node-counter,
	.bsp-home-eco-arm,
	.bsp-home-eco-arm::before,
	.bsp-home-eco-dot,
	.bsp-home-eco-label,
	.bsp-home-clients-track {
		animation: none !important;
	}

	.bsp-home-project-card,
	.bsp-home-project-card img,
	.bsp-hero-content.et_pb_column {
		transition: none !important;
	}
}

/* Impression : aucune animation ne tourne sur une page imprimée. Une
   photo qui compte sur un fondu pour devenir visible resterait donc
   absente du papier, et le bandeau perdrait son sujet.
   Ajouté le 14 septembre 2026. */
@media print {
	.bsp-blog-catalog .filter-banner-bg-img { animation: none !important; }
}

/* =============================================================
   NAV COLLANTE SUR L'ACCUEIL: fix Clément, 10 septembre 2026
   -------------------------------------------------------------
   La nav de la page d'accueil vit DANS le hero (position: absolute,
   comme le veut la convention des maquettes : elle défile avec la
   photo). Bug signalé : passé le hero, il n'y avait plus de nav du
   tout. bsp-custom.js (initStickyNav) ajoute/retire .is-fixed
   exactement au moment où le hero sticky relâche sa fixation.
   Portée à .bsp-hero-layers .bsp-home-nav uniquement : les autres
   pages utilisent le header global Divi (#100), déjà fixe
   nativement: cette règle ne les touche pas.
   ============================================================= */
.bsp-home-nav.is-fixed {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	width: 100%;
	z-index: 500;
	/* Barre à ~50 % d'opacité (demande de Clément) au lieu de ~100 % */
	background: rgba(10, 13, 20, 0.5);
	backdrop-filter: blur(10px);
	-webkit-backdrop-filter: blur(10px);
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
	transition: background 0.25s ease, box-shadow 0.25s ease;
}

/* Décalage sous la barre d'admin WP (visible seulement en étant
   connecté) : sans ça, la nav fixe se retrouve sous les 32px de la
   admin bar (z-index 99999), qui masque les liens du milieu. Un
   visiteur non connecté ne voit jamais ce cas. */
body.admin-bar .bsp-home-nav.is-fixed {
	top: 32px;
}

/* Mode clair : la barre collante est blanche à 60 % d'opacité (40 % de
   transparence) au lieu du gris obtenu avec le fond sombre. */
:root[data-bsp-theme="light"] .bsp-home-nav.is-fixed {
	background: rgba(255, 255, 255, 0.6);
	box-shadow: 0 8px 24px rgba(15, 20, 30, 0.08);
}
@media screen and (max-width: 782px) {
	body.admin-bar .bsp-home-nav.is-fixed {
		top: 46px;
	}
}

/* =============================================================
   07: CASE STUDY · template for the "case-study" CPT
   -------------------------------------------------------------
   First rollout: Foothills Nurseries (script _dev-tools/
   bsp-build-case-study-foothills.php, 2026-09-10, overnight).
   Reuses the tokens and components from section 04 (.bsp-eyebrow,
   .bsp-btn-primary, .bsp-btn-ghost, .bsp-quote, .bsp-quote-author,
   .bsp-feature-dot, .bsp-results-bar): this section only adds the
   layout specific to this template.
   This page has NO embedded nav or footer: it goes through the
   global Divi header/footer (#100), like every page other than
   the homepage.
   ============================================================= */

/* ---------- Full-bleed hero (video or background image) ---------- */
.bsp-cs-hero {
	position: relative;
	width: 100%;
	aspect-ratio: 16 / 9;
	display: flex;
	align-items: flex-end;
	padding: 0 var(--bsp-gutter) 100px;
	overflow: hidden;
	background: var(--bsp-bg-deep);
}
.bsp-cs-hero-bg { position: absolute; inset: 0; }
.bsp-cs-hero-bg img,
.bsp-cs-hero-bg iframe {
	position: absolute; inset: 0;
	width: 100%; height: 100%;
	object-fit: cover;
	border: none;
	pointer-events: none;
}
.bsp-cs-hero-bg::after {
	content: '';
	position: absolute; inset: 0;
	background:
		linear-gradient(to top, rgba(6,8,16,0.97) 0%, rgba(6,8,16,0.55) 50%, rgba(6,8,16,0.25) 100%),
		linear-gradient(to right, rgba(6,8,16,0.7) 0%, transparent 65%);
}
.bsp-cs-hero-bg::before {
	content: '';
	position: absolute; top: 0; left: 0; right: 0; height: 90px;
	background: linear-gradient(to bottom, rgba(6,8,16,0.97) 0%, transparent 100%);
	z-index: 1;
}
.bsp-cs-video-fade {
	position: absolute; inset: 0; background: #000; opacity: 0;
	pointer-events: none; transition: opacity 0.4s ease; z-index: 2;
}
.bsp-cs-hero-content { position: relative; z-index: 10; max-width: 780px; }
.bsp-cs-kicker { display: flex; align-items: center; gap: 16px; margin-bottom: 28px; }
.bsp-cs-kicker-tag {
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 9px;
	letter-spacing: 0.35em; text-transform: uppercase; color: var(--bsp-accent);
	/* simple titre : sans bulle */
}
.bsp-cs-kicker-divider { width: 32px; height: 1px; background: rgba(255,255,255,0.2); }
.bsp-cs-kicker-label {
	font-family: var(--bsp-font-label); font-weight: 600; font-size: 11px;
	letter-spacing: 0.15em; text-transform: uppercase; color: rgba(255,255,255,0.55);
}
.bsp-cs-hero-title {
	font-family: var(--bsp-font-display); font-weight: 800;
	font-size: var(--bsp-banner-title-size); line-height: 1.05; letter-spacing: -0.02em;
	color: var(--bsp-text); margin-bottom: 24px;
}
.bsp-cs-hero-title em { font-style: italic; color: var(--bsp-accent-hover); }
.bsp-cs-hero-sub {
	font-family: var(--bsp-font-body); font-size: 23.5px; font-weight: 400;
	color: rgba(255,255,255,0.62); line-height: 1.4; max-width: 600px;
}
.bsp-cs-hero-meta {
	position: absolute; bottom: 100px; right: var(--bsp-gutter); z-index: 10;
	display: flex; flex-direction: column; align-items: flex-end; gap: 18px;
}
.bsp-cs-meta-label {
	font-family: var(--bsp-font-label); font-size: 11px; font-weight: 700;
	letter-spacing: 0.25em; text-transform: uppercase; color: rgba(255,255,255,0.28); margin-bottom: 4px;
}
.bsp-cs-meta-value {
	font-family: var(--bsp-font-label); font-size: 17px; font-weight: 600;
	color: rgba(255,255,255,0.72); letter-spacing: 0.04em; text-align: right;
}
.bsp-cs-sound-btn {
	position: absolute; top: 84px; right: var(--bsp-gutter); z-index: 60;
	background: rgba(0,0,0,0.5); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
	border: 1px solid rgba(255,255,255,0.25); border-radius: 100px; color: #fff;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: .08em;
	text-transform: uppercase; padding: 10px 20px; cursor: pointer;
	display: flex; align-items: center; gap: 8px; transition: background .2s;
}
.bsp-cs-sound-btn:hover { background: rgba(0,0,0,0.7); }
@keyframes bspCsPulseRing {
	0%   { box-shadow: 0 0 0 0 rgba(255,255,255,0.4); }
	70%  { box-shadow: 0 0 0 10px rgba(255,255,255,0); }
	100% { box-shadow: 0 0 0 0 rgba(255,255,255,0); }
}
.bsp-cs-sound-btn.is-muted { animation: bspCsPulseRing 2s ease-out infinite; }

/* ---------- Results bar: extends .bsp-results-bar (already defined in §04) ---------- */
.bsp-results-bar {
	padding: 0 var(--bsp-gutter);
	display: grid;
	grid-template-columns: repeat(4, 1fr);
}
.bsp-result-item { padding: 50px; border-right: 1px solid rgba(255,255,255,0.22); }
.bsp-result-item:last-child { border-right: none; }
.bsp-result-num {
	font-family: var(--bsp-font-display); font-weight: 800;
	font-size: clamp(36px, 3.4vw, 52px); color: #fff; line-height: 1; letter-spacing: -0.02em;
}
.bsp-result-label {
	font-family: var(--bsp-font-body); font-size: 18px; font-weight: 400;
	color: rgba(255,255,255,0.75); margin-top: 8px; line-height: 1.45;
}

/* ---------- Case study body ---------- */
.bsp-cs-body { max-width: 1200px; margin: 0 auto; padding: 0 var(--bsp-gutter); }
.bsp-cs-split {
	display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: start;
	margin-top: 100px; margin-bottom: 100px;
}
.bsp-cs-section-title {
	font-family: var(--bsp-font-display); font-weight: 800;
	font-size: clamp(28px, 2.6vw, 42px); line-height: 1.12; letter-spacing: -0.02em; color: var(--bsp-text);
}
.bsp-cs-section-title em { font-style: italic; color: var(--bsp-accent-hover); }
.bsp-cs-text p {
	font-family: var(--bsp-font-body); font-size: 22px; font-weight: 400;
	color: var(--bsp-text-soft); line-height: 1.4; margin-bottom: 20px;
}
.bsp-cs-text p:last-child { margin-bottom: 0; }

/* ---------- Framed quote: extends .bsp-quote / .bsp-quote-author (§04) ---------- */
.bsp-cs-quote-card {
	background: rgba(var(--bsp-accent-rgb), 0.06);
	border-left: 3px solid var(--bsp-accent);
	padding: 48px 56px;
	margin-bottom: 100px;
	border-radius: 0 var(--bsp-radius) var(--bsp-radius) 0;
}
.bsp-cs-quote-card .bsp-quote { display: block; margin-bottom: 28px; }
.bsp-cs-quote-card .bsp-quote em { font-style: normal; color: var(--bsp-accent-hover); }
.bsp-cs-quote-center {
	text-align: center; max-width: 740px; margin: 0 auto 100px;
}
.bsp-cs-quote-center .bsp-quote { display: block; margin-bottom: 24px; font-size: clamp(19px, 2vw, 26px); color: rgba(255,255,255,0.85); }
.bsp-cs-quote-author-row { display: flex; align-items: center; gap: 14px; }
.bsp-cs-quote-center .bsp-cs-quote-author-row { justify-content: center; }
.bsp-cs-avatar {
	width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0;
	background: rgba(var(--bsp-accent-rgb), 0.15); border: 2px solid rgba(var(--bsp-accent-rgb), 0.35);
	display: flex; align-items: center; justify-content: center;
	font-family: var(--bsp-font-label); font-weight: 800; font-size: 13px; color: var(--bsp-accent);
}
.bsp-cs-quote-author-name { font-family: var(--bsp-font-label); font-weight: 700; font-size: 13px; color: var(--bsp-text); letter-spacing: 0.03em; }

/* ---------- Feature modules: extends .bsp-feature-dot (§04) ---------- */
.bsp-cs-features { display: flex; flex-direction: column; gap: 16px; }
.bsp-cs-feature {
	background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.07);
	border-radius: var(--bsp-radius); padding: 22px 26px;
	display: flex; gap: 18px; align-items: flex-start; transition: border-color .2s;
}
.bsp-cs-feature:hover { border-color: rgba(var(--bsp-accent-rgb), 0.3); }
.bsp-cs-feature .bsp-feature-dot::before { margin-top: 6px; margin-right: 0; }
.bsp-cs-feature-title {
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 13px;
	letter-spacing: 0.03em; color: var(--bsp-text); margin-bottom: 5px;
}
.bsp-cs-feature-desc { font-family: var(--bsp-font-body); font-size: 18px; font-weight: 400; color: var(--bsp-text-faint); line-height: 1.6; }

.bsp-cs-divider { height: 1px; background: rgba(255,255,255,0.07); margin-bottom: 100px; }

/* ---------- Closing CTA: reuses .bsp-btn-primary / .bsp-btn-ghost (§04) ---------- */
.bsp-cs-cta-card {
	background: rgba(var(--bsp-accent-rgb), 0.06); border: 1px solid rgba(var(--bsp-accent-rgb), 0.18);
	border-radius: 12px; padding: 64px 72px; margin-bottom: 100px;
	display: flex; align-items: center; justify-content: space-between; gap: 48px;
}
.bsp-cs-cta-eyebrow {
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 9px;
	letter-spacing: 0.35em; text-transform: uppercase; color: var(--bsp-accent); margin-bottom: 16px;
}
.bsp-cs-cta-title {
	font-family: var(--bsp-font-display); font-weight: 800;
	font-size: clamp(26px, 2.4vw, 38px); color: var(--bsp-text); line-height: 1.1; letter-spacing: -0.01em;
}
.bsp-cs-cta-title em { font-style: italic; color: var(--bsp-accent-hover); }
.bsp-cs-cta-actions { display: flex; flex-direction: column; gap: 14px; flex-shrink: 0; align-items: stretch; }
.bsp-cs-cta-actions .bsp-btn-primary,
.bsp-cs-cta-actions .bsp-btn-ghost {
	font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
	padding: 16px 36px; border-radius: 100px; text-align: center; white-space: nowrap;
}
.bsp-cs-cta-actions .bsp-btn-ghost { border: none; padding: 0; }
.bsp-cs-cta-actions .bsp-btn-ghost::after { content: ' →'; }

/* ---------- Responsive: Socle rule from Aug 27: built alongside, never bolted on after ---------- */
@media screen and (max-width: 980px) {
	.bsp-cs-hero { aspect-ratio: auto; min-height: 640px; padding: 0 32px 60px; }
	.bsp-cs-hero-meta { position: static; align-items: flex-start; flex-direction: row; flex-wrap: wrap; margin-top: 32px; gap: 24px; }
	.bsp-cs-sound-btn { right: 32px; }
	.bsp-results-bar { grid-template-columns: repeat(2, 1fr); padding: 0 32px; }
	.bsp-result-item { border-right: none; border-bottom: 1px solid rgba(255,255,255,0.22); }
	.bsp-result-item:nth-child(2n) { border-right: none; }
	.bsp-cs-body { padding: 0 32px; }
	.bsp-cs-split { grid-template-columns: 1fr; gap: 40px; margin-top: 64px; margin-bottom: 64px; }
	.bsp-cs-quote-card { padding: 32px; margin-bottom: 64px; }
	.bsp-cs-cta-card { flex-direction: column; align-items: flex-start; padding: 40px 32px; margin-bottom: 64px; }
	.bsp-cs-cta-actions { width: 100%; }
}
@media screen and (max-width: 600px) {
	.bsp-results-bar { grid-template-columns: 1fr; }
	.bsp-result-item { border-bottom: 1px solid rgba(255,255,255,0.22); }
}


/* =============================================================
   12: CATALOGUE DE BLOGUE
   Source : maquettes/BSP Web Site/blog-catalogue.html (4 septembre)
   Markup : includes/blog-catalog-cards.php
   -------------------------------------------------------------
   Portée : archive du CPT « project » (libellé Blog) et archives
   des taxonomies « expertise » / « application_zoho ».

   ⚠️ Révisé le 13 septembre 2026, après passage à Divi 5.13. Le markup
   n'est PAS produit par un shortcode : les cartes sont des modules Divi
   (Loop Builder + Group), et le filtre est le module natif Post Filter,
   apparu en 5.10. Les classes ci-dessous s'accrochent via le champ
   « Classes CSS » de chaque module: ce que le socle demande : les
   classes vivent sur les modules, le style vit ici.

   Le sélecteur racine .bsp-blog-catalog est une classe à poser sur la
   SECTION du gabarit, pas un conteneur généré.

   Les jetons de la maquette (--amber, --bg, --surface…) ne sont
   PAS repris sous leurs noms d'origine : le thème enfant a déjà
   son système --bsp-*, et deux systèmes de jetons pour une même
   couleur finissent toujours par diverger. La correspondance :
     --amber   → --bsp-accent          --bg      → --bsp-bg
     --amber2  → --bsp-accent-hover    --surface → --bsp-surface
     --marine  → --bsp-bg-deep         --text    → --bsp-text
   L'accent portant du texte fin passe par --bsp-accent-text, qui
   s'assombrit en mode clair pour rester conforme AA.

   Tout est préfixé .bsp-blog-catalog : le catalogue ne doit rien
   imposer aux autres gabarits, qui n'ont pas encore été repris.
   ============================================================= */

.bsp-blog-catalog { background: var(--bsp-bg); color: var(--bsp-text); }
.bsp-blog-catalog a { text-decoration: none; color: inherit; }
.bsp-blog-catalog img { display: block; max-width: 100%; }

/* Divi pose ses propres marges sur les titres et paragraphes des
   modules. On les neutralise ICI, élément par élément, jamais par une
   remise à zéro globale ancrée sur le parent : une règle à deux
   classes écraserait les règles à une seule et rendrait inertes les
   marges écrites plus bas. */
.bsp-blog-catalog h1,
.bsp-blog-catalog h3,
.bsp-blog-catalog p { margin: 0; padding: 0; }

/* ── Bandeau contextuel ──────────────────────────────────────
   Pleine largeur par débordement viewport : le gabarit Divi qui
   l'accueille a ses propres gouttières, et le bandeau doit les
   ignorer. La nav du site flotte par-dessus (position absolue),
   d'où le dégagement de 130px sous le titre. */
.bsp-blog-catalog .filters { padding: 0 var(--bsp-gutter); }

.bsp-blog-catalog .filter-banner {
	position: relative;
	left: 50%; right: 50%;
	margin-left: -50vw; margin-right: -50vw;
	width: 100vw;
	height: calc(100vh / 2);
	min-height: 320px;
	margin-bottom: -112px; /* les rangées de puces chevauchent le bas du bandeau */
	overflow: hidden;
	background:
		radial-gradient(circle at 18% 25%, rgba(var(--bsp-accent-rgb), 0.28), transparent 55%),
		radial-gradient(circle at 85% 75%, rgba(69, 174, 255, 0.18), transparent 50%),
		linear-gradient(135deg, #0B2A4A 0%, var(--bsp-bg-deep) 60%, var(--bsp-bg-media) 100%);
}

/* Le bandeau et les puces restent en palette sombre quel que soit le
   thème : ce sont des zones-image, pensées pour du texte blanc sur
   photo, et la nav transparente flotte en permanence dessus. */
.bsp-blog-catalog .filter-banner-bg-img {
	position: absolute; inset: 0; z-index: 0;
	width: 100%; height: 100%;
	object-fit: cover;
	/* Sujet à DROITE sur les photos du 16 septembre 2026 (le mur dégagé
	   est à gauche, sous le titre). Ancrage à droite : sur un écran
	   étroit, le recadrage coupe le mur avant de couper les personnes.
	   Ancrage en HAUT : à 1800 px de large, le bandeau (≈ 3,7:1) est plus
	   étiré que les photos, qui sont toutes recadrées au format 3:1 de
	   finance-administration (2171×724) depuis le 16 septembre. Centré,
	   le recadrage vertical rognerait le haut des têtes ; or les 112 px
	   du bas sont de toute façon recouverts par les rangées de puces.
	   Une photo de bandeau se livre donc en 2171×724, sujet à droite,
	   têtes à ~10 % du haut. Sources non recadrées : _originaux/blog_images/. Les photos du 14 septembre avaient le
	   sujet à gauche et l'ancrage inverse. */
	object-position: right top;

	/* Fondu d'apparition.
	   Il remplace une transition qui ne s'est jamais jouée : PHP imprimait
	   la classe `is-visible` directement dans le balisage, si bien que
	   l'image naissait déjà à son état final. Une transition n'a alors
	   rien à franchir: elle ne se déclenche pas, et la photo apparaissait
	   d'un coup. Une animation, elle, part au rendu.
	   Le dégradé de marque du bandeau reste visible dessous pendant le
	   fondu : une photo lente à décoder n'expose jamais de vide.
	   Constaté et réglé le 14 septembre 2026. */
	animation: bspBannerPhotoFade .7s ease-out both;

	/* Nom de transition de vue : d'une expertise à l'autre, la photo se
	   fond dans la suivante au lieu d'être remplacée sèchement.
	   Voir le bloc @view-transition juste après. */
	view-transition-name: bsp-banner-photo;
}

@keyframes bspBannerPhotoFade {
	from { opacity: 0; }
	to   { opacity: 1; }
}

/* ── Racine du blogue : image de l'article du mois en fond flouté ──
   19 septembre 2026 (demande de Clément). Même traitement que la
   couverture d'un article (section 13) : flou 24 px, opacité 0,5, image
   agrandie de 12 % pour que le halo transparent du flou sorte du cadre.
   Le voile de marque (.filter-banner-overlay) reste au-dessus et garde le
   titre lisible : sous le titre (0-40 % de la largeur) le voile est à
   0,88 → 0,55 ; contraste calculé sur l'image la plus claire du site
   (fond lavande) : titre blanc ≈ 11:1, sur-titre bleu ≈ 5,4:1.
   Animation propre : bspBannerPhotoFade finit à opacity: 1 en
   fill-mode both, ce qui écraserait l'opacité voulue. */
.bsp-blog-catalog .filter-banner-bg-img--flou {
	--bsp-flou-blur: 24px;
	--bsp-flou-opacity: 0.5;
	object-position: center;
	filter: blur(var(--bsp-flou-blur));
	opacity: var(--bsp-flou-opacity);
	transform: scale(1.12);
	animation: bspBannerFlouFade .7s ease-out both;
}
@keyframes bspBannerFlouFade {
	from { opacity: 0; }
	to   { opacity: var(--bsp-flou-opacity); }
}

/* La zone claire de l'image passe sous la nav (en haut à droite) : « FR »,
   volontairement atténué, tombait à ≈ 2,2:1 (≈ 3,9:1 sur le fond bleu
   d'origine). Voile de tête ajouté, uniquement avec le fond flou ; les deux
   dégradés d'origine du voile sont repris à l'identique. */
.bsp-blog-catalog .filter-banner.has-flou .filter-banner-overlay {
	background:
		linear-gradient(180deg, rgba(6,30,60,0.55) 0%, transparent 38%),
		linear-gradient(100deg, rgba(6,22,46,0.92) 0%, rgba(6,22,46,0.82) 30%, rgba(6,22,46,0.62) 55%, rgba(6,22,46,0.48) 100%),
		linear-gradient(0deg, rgba(6,30,60,0.45) 0%, transparent 34%);
}

/* ── Fondu enchaîné d'une photo à l'autre ─────────────────────
   Les puces de filtre sont de vrais liens : changer d'expertise
   recharge la page, et sans rien la photo est remplacée net.

   `@view-transition` demande au navigateur de photographier l'avant et
   l'après d'une navigation interne, puis de fondre l'un dans l'autre.
   En CSS, sans une ligne de script.

   L'opt-in est forcément au niveau du document : CSS n'offre aucun
   moyen de le limiter à une page. On neutralise donc l'animation de la
   racine: tout le site continue de changer de page instantanément,
   exactement comme aujourd'hui: et seuls les éléments explicitement
   nommés s'animent. Ici, la photo du bandeau, et elle seule.

   Aller d'« aucune expertise » (pas de photo) vers une expertise ne
   joue que la moitié « new » : un fondu d'entrée. Le retour ne joue que
   la moitié « old » : un fondu de sortie. C'est le comportement voulu.

   Navigateurs sans la fonctionnalité : rien ne se passe, la page se
   charge comme avant.

   ── DÉSACTIVÉ POUR L'INSTANT, ET POURQUOI ────────────────────
   Un navigateur saute toute transition de vue quand le document n'est
   pas visible : fenêtre en arrière-plan, onglet inactif, minimisée. Le
   14 septembre 2026, la fenêtre Chrome du poste était au second plan,
   et l'effet n'a donc pas pu être observé une seule fois: ni en clair,
   ni en sombre.

   La règle du Socle vaut ici comme pour les deux modes : ce qui n'a pas
   été regardé n'est pas validé. Et l'opt-in porte sur tout le site, pas
   sur cette seule page: ce n'est pas le genre de chose qu'on laisse
   active sans l'avoir vue tourner.

   Pour le rallumer : retirer les deux marqueurs de commentaire
   ci-dessous. Le fondu d'apparition, lui, est actif et vérifié. */

/*
@view-transition { navigation: auto; }

::view-transition-old(root),
::view-transition-new(root) {
	animation: none;
	mix-blend-mode: normal;
}

::view-transition-old(bsp-banner-photo),
::view-transition-new(bsp-banner-photo) {
	animation-duration: .55s;
	animation-timing-function: ease;
}
*/

.bsp-blog-catalog .filter-banner-overlay {
	position: absolute; inset: 0; z-index: 1;
	pointer-events: none;
	/* Voile allégé par rapport à la maquette. Constaté le 14 septembre :
	   sur les cinq photos fournies, le sujet: des personnes au travail,
	   occupe la moitié GAUCHE du cadre, c'est-à-dire exactement la zone
	   que le voile d'origine couvrait à 80 %. Résultat : on ne voyait
	   qu'un mur vide à droite, et la photo semblait absente alors qu'elle
	   était bien là. Le voile descend donc à 0,58 au plus fort, ce qui
	   laisse le sujet lisible tout en gardant le titre blanc largement
	   au-dessus du seuil.

	   16 septembre 2026: voile redensifié. Les nouvelles photos mettent
	   le sujet à DROITE et un mur clair à gauche, exactement sous le texte.
	   Contrastes calculés (luminance WCAG, 98e centile des pixels sous
	   chaque texte, sur les six photos recadrées, bandeau de 1800×484,
	   1280×350 et 1024×378) : avec l'ancien voile, le titre blanc tombait
	   à 2,3:1 et le sur-titre bleu (10 px) à 1,6:1. Avec celui-ci :
	   titre ≥ 4,2:1 (texte large, seuil 3:1), sur-titre ≥ 4,6:1. Le voile s'annule à 70 % de la largeur, et la zone du
	   sujet garde environ 80 % de sa luminosité.
	   Couleur fixe et non jeton : le bandeau reste en palette sombre dans
	   les deux thèmes (voir plus haut), c'est la même teinte #061E3C que
	   son dégradé de marque. */
	background:
		linear-gradient(100deg, rgba(6,22,46,0.92) 0%, rgba(6,22,46,0.82) 30%, rgba(6,22,46,0.62) 55%, rgba(6,22,46,0.48) 100%),
		linear-gradient(0deg, rgba(6,30,60,0.45) 0%, transparent 34%);
}

.bsp-blog-catalog .filter-banner-app-logo {
	position: absolute; z-index: 3;
	top: 0; right: 60px;
	width: 54%; height: 90%;
	object-fit: contain; object-position: top right;
	filter: brightness(0) invert(1);
	opacity: 0;
	transition: opacity .3s ease;
	pointer-events: none;
}
.bsp-blog-catalog .filter-banner-app-logo.is-visible { opacity: .25; }

/* pointer-events: none fixed 2026-09-16 (reported by Clement on staging):
   this block covers the full page width from y:0, i.e. the same band as
   the site's absolutely-positioned header nav (see the comment on
   .filters above -- "la nav flotte par-dessus"). Its own top padding
   (130px) is empty space with no visible content, but being a plain
   positioned box it still captured clicks meant for the header links
   underneath -- confirmed with document.elementFromPoint() landing on
   this div instead of the nav. Nothing inside this block is interactive
   (eyebrow label + title, both plain text), so disabling pointer events
   on the whole block is safe and lets clicks fall through to the header. */
.bsp-blog-catalog .filter-banner-content {
	position: absolute; top: 0; left: 0; right: 0; z-index: 2;
	padding: 130px var(--bsp-gutter) 0;
	pointer-events: none;
}
.bsp-blog-catalog .filter-banner-eyebrow {
	font-family: var(--bsp-font-label);
	font-weight: 700; font-size: 10px;
	letter-spacing: .25em; text-transform: uppercase;
	color: var(--bsp-accent-hover);
	margin-bottom: 10px;
}
.bsp-blog-catalog .filter-banner-title {
	font-family: var(--bsp-font-display);
	font-weight: 800; font-size: var(--bsp-banner-title-size); line-height: 1.08;
	color: #fff; max-width: 760px;
}

/* ── Rangées de puces ───────────────────────────────────────── */
/* Deux exigences qui semblaient s'opposer, et le réglage qui les tient
   ensemble :

   1. Un dégradé doit relier la photo du bandeau au fond de page: sans
      lui, la coupure est nette et laide.
   2. Les puces doivent être lisibles dans les DEUX thèmes, et la zone
      doit suivre le thème : fond clair et texte sombre en mode clair.

   La première version fixait la zone en sombre : lisible, mais la
   coupure réapparaissait et le mode clair ne suivait plus. La version
   d'avant faisait l'inverse : dégradé correct, puces illisibles en clair.

   Le réglage : le dégradé se joue dans les 112 px de chevauchement
   avec le bandeau (voir `margin-bottom: -112px` sur .filter-banner), et
   les puces commencent APRÈS, sur un fond plein `var(--bsp-bg)`. Le
   dégradé se joue donc entièrement au-dessus des puces, jamais dessous.
   Les stops sont en pixels : le nombre de rangées de puces et leurs
   retours à la ligne ne doivent rien changer à la transition. */
.bsp-blog-catalog .filter-rows {
	position: relative;
	left: 50%; right: 50%;
	margin-left: -50vw; margin-right: -50vw;
	width: 100vw;
	z-index: 1;
	padding: 128px calc(var(--bsp-gutter) + 24px) 44px;
	/* Fondu photo → fond de page, revu le 19 septembre 2026 (Clément) : en
	   mode clair, le dégradé linéaire de 112 px passait par une bande grise
	   étalée, avec des paliers visibles (banding). Deux corrections :
	   1. plus court: les 40 premiers pixels laissent la photo intacte et le
	      fondu ne joue que sur les 72 derniers (40 → 112 px), qui restent
	      exactement ceux du chevauchement : les puces ne bougent pas ;
	   2. progressif: 9 paliers suivant une courbe smoothstep (3t² − 2t³)
	      au lieu d'une pente constante, pour que l'œil ne voie ni début ni
	      fin de dégradé. La couleur cible reste le jeton --bsp-bg, donc le
	      fondu suit le thème (sombre #0a0d14, clair #F1F0ED). */
	background: linear-gradient(180deg,
		color-mix(in srgb, var(--bsp-bg) 0%, transparent) 76px,
		color-mix(in srgb, var(--bsp-bg) 4%, transparent) 80.5px,
		color-mix(in srgb, var(--bsp-bg) 16%, transparent) 85px,
		color-mix(in srgb, var(--bsp-bg) 32%, transparent) 89.5px,
		color-mix(in srgb, var(--bsp-bg) 50%, transparent) 94px,
		color-mix(in srgb, var(--bsp-bg) 68%, transparent) 98.5px,
		color-mix(in srgb, var(--bsp-bg) 84%, transparent) 103px,
		color-mix(in srgb, var(--bsp-bg) 96%, transparent) 107.5px,
		var(--bsp-bg) 112px,
		var(--bsp-bg) 100%);
}
.bsp-blog-catalog .filter-row { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.bsp-blog-catalog .filter-row + .filter-row { margin-top: 16px; }
/* La maquette fige ce libellé en rgba(255,255,255,0.32) : illisible en
   mode clair, et déjà sous le seuil AA en sombre (2,83:1 mesuré) pour un
   texte de 10px en capitales très espacées: le pire cas de lisibilité.
   Il passe donc au jeton de texte discret, qui bascule avec le thème. */
.bsp-blog-catalog .et_pb_post_filter__item-label,
.bsp-blog-catalog .filter-label {
	font-family: var(--bsp-font-label);
	font-weight: 700; font-size: 10px;
	letter-spacing: .2em; text-transform: uppercase;
	color: var(--bsp-text-soft);
	width: 168px; flex-shrink: 0;
}
/* `flex: 1 1 0` + `min-width: 0` : sans ça, la rangée de 19 puces
   « Application Zoho » dépasse la largeur disponible et bascule sous son
   libellé, alors que la maquette garde le libellé à gauche et fait
   retourner les puces à la ligne entre elles. */
.bsp-blog-catalog .et_pb_post_filter__controls,
.bsp-blog-catalog .filter-chips {
	display: flex; gap: 10px; flex-wrap: wrap;
	flex: 1 1 0; min-width: 0;
}

/* Puces de filtre. Deux familles de sélecteurs pour une seule
   apparence : .chip (maquette) et les classes réellement émises par le
   module natif Post Filter de Divi 5.13, en contrôle « button ». On
   stylise le module natif ici plutôt que dans ses options de design,
   parce qu'un réglage posé dans le constructeur devient introuvable,
   et parce que régler les rembourrages là-bas déclenche la génération
   de CSS par module, que le thème enfant doit ensuite surcharger.

   ⚠️ L'état sélectionné reste à brancher : la classe ou l'attribut que
   Divi pose sur une puce active n'est pas déductible du code serveur, il
   se lit sur le DOM une fois le module posé. Une ligne à ajouter ici, pas
   ailleurs. */
.bsp-blog-catalog .et_pb_post_filter__item-control-button,
.bsp-blog-catalog .chip {
	display: inline-flex; align-items: center; gap: 7px;
	font-family: var(--bsp-font-label);
	font-weight: 600; font-size: 12px;
	/* Jetons, et non blanc translucide : les puces reposent sur le fond
	   de page, qui bascule. Un blanc fixe donnait blanc sur blanc. */
	color: var(--bsp-text-soft);
	background: transparent;
	border: 1px solid var(--bsp-border-strong);
	padding: 9px 16px;
	border-radius: 100px;
	cursor: pointer;
	white-space: nowrap;
	transition: color .2s, border-color .2s, background .2s;
}
/* Troisième état: puce ASSOCIÉE à la sélection de l'autre axe (19
   septembre 2026). Sélectionner une expertise teinte ses applications,
   et inversement ; toutes les puces restent visibles, pour qu'on sache
   « qui est quoi ». Trois états : contour (inactive) · teintée (associée)
   · bleue (active). Le fond passe par un jeton redéfini dans les deux
   thèmes : blanc translucide en sombre, sombre translucide en clair. Le
   texte passe aussi au jeton plein : la teinte seule ne suffit pas à
   distinguer l'état (lecteurs d'écran : texte masqué ajouté côté PHP).
   Déclarée AVANT :hover et .is-active, qui l'emportent à spécificité égale. */
.bsp-blog-catalog .chip.is-associe {
	background: var(--bsp-chip-associe-bg);
	color: var(--bsp-text);
}
.bsp-blog-catalog .et_pb_post_filter__item-control-button:hover,
.bsp-blog-catalog .chip:hover {
	color: var(--bsp-text);
	border-color: var(--bsp-accent);
	background: rgba(var(--bsp-accent-rgb), 0.10);
}
/* Aplat portant du texte blanc : --bsp-accent donne 3,23:1, sous le
   seuil AA. --bsp-accent-fill est l'aplat assombri déjà documenté dans
   le bloc de jetons à 5,25:1. Le contraste se calcule, il ne s'estime pas. */
.bsp-blog-catalog .chip.is-active { color: #fff; background: var(--bsp-accent-fill); border-color: var(--bsp-accent-fill); }
.bsp-blog-catalog .et_pb_post_filter__item-control-button:focus-visible,
.bsp-blog-catalog .chip:focus-visible { outline: 2px solid var(--bsp-accent-hover); outline-offset: 3px; }
/* Carte « sujet du mois » et puces de filtre (liens réels) : sans ceci, le
   focus clavier était invisible (outline: none mesuré le 16 septembre 2026). */
.bsp-blog-catalog :is(.card-featured, .filter-rows a):focus-visible {
	outline: 2px solid var(--bsp-accent-text);
	outline-offset: 3px;
}

/* ── Mosaïque ────────────────────────────────────────────────
   Un grand format + une grappe de quatre vignettes, puis une paire
   de formats horizontaux. Rompt volontairement la grille à trois
   colonnes égales. */
.bsp-blog-catalog .catalogue { padding: 56px var(--bsp-gutter) 60px; }

.bsp-blog-catalog .mosaic-top {
	display: grid;
	grid-template-columns: 1.55fr 1fr;
	gap: 24px;
	margin-bottom: 24px;
}
.bsp-blog-catalog .mosaic-top .card-featured { height: 540px; }

.bsp-blog-catalog .mini-cluster {
	display: grid;
	grid-template-columns: 1fr 1fr;
	grid-template-rows: 1fr 1fr;
	gap: 16px;
	height: 540px;
}

.bsp-blog-catalog .mosaic-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-bottom: 24px; }
.bsp-blog-catalog .card-duo { height: 262px; }
.bsp-blog-catalog .card-duo .card-body { padding: 28px 32px 24px; }
.bsp-blog-catalog .card-duo .card-title { font-size: 22px; }
.bsp-blog-catalog .card-duo .card-dek { font-size: 17.5px; -webkit-line-clamp: 2; margin-bottom: 14px; }

.bsp-blog-catalog .cat-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }

/* ── Cartes ─────────────────────────────────────────────────── */
.bsp-blog-catalog .cat-card,
.bsp-blog-catalog .card-featured,
.bsp-blog-catalog .mini-card {
	background: var(--bsp-surface);
	border: 1px solid var(--bsp-border);
	border-radius: 8px;
	overflow: hidden;
	display: flex;
	flex-direction: column;
	transition: border-color .25s, transform .25s;
}
.bsp-blog-catalog .cat-card:hover,
.bsp-blog-catalog .card-featured:hover,
.bsp-blog-catalog .mini-card:hover {
	border-color: rgba(var(--bsp-accent-rgb), 0.4);
	transform: translateY(-3px);
}

.bsp-blog-catalog .card-featured { display: grid; grid-template-columns: 1.05fr 1fr; }
.bsp-blog-catalog .card-featured .card-media { width: 100%; height: 100%; aspect-ratio: unset; }
.bsp-blog-catalog .card-featured .card-body { padding: 40px 40px 32px; position: relative; }
.bsp-blog-catalog .card-featured .card-title { font-size: 30px; }
.bsp-blog-catalog .card-featured .card-dek { font-size: 19.5px; -webkit-line-clamp: 3; }

/* Les visuels de couverture repris de l'ancien site portent souvent du
   texte : « contain » les garde entiers, « cover » les couperait. */
.bsp-blog-catalog .card-media {
	position: relative;
	aspect-ratio: 16 / 10;
	overflow: hidden;
	background: var(--bsp-surface-deep);
	display: flex; align-items: center; justify-content: center;
}
.bsp-blog-catalog .card-media img {
	width: 100%; height: 100%;
	object-fit: contain; object-position: center;
	transition: transform .3s ease;
}
.bsp-blog-catalog .card-featured:hover .card-media img,
.bsp-blog-catalog .mini-card:hover .card-media img { transform: scale(1.02); }

.bsp-blog-catalog .card-body { padding: 26px 26px 22px; display: flex; flex-direction: column; flex: 1; position: relative; }

.bsp-blog-catalog .card-tags { display: flex; align-items: baseline; flex-wrap: wrap; gap: 7px; margin-bottom: 12px; }
.bsp-blog-catalog .card-metier {
	font-family: var(--bsp-font-label);
	font-weight: 700; font-size: 9px;
	letter-spacing: .26em; text-transform: uppercase;
	color: var(--bsp-accent-text);
}
.bsp-blog-catalog .card-apps {
	font-family: var(--bsp-font-label);
	font-weight: 600; font-size: 9px;
	letter-spacing: .22em; text-transform: uppercase;
	color: var(--bsp-text-quiet);
}
.bsp-blog-catalog .card-tags-sep { color: var(--bsp-text-quiet); font-size: 9px; }

.bsp-blog-catalog .card-title {
	font-family: var(--bsp-font-display);
	font-weight: 800; font-size: 21px; line-height: 1.22;
	letter-spacing: -0.005em;
	color: var(--bsp-text);
	margin-bottom: 10px;
}
.bsp-blog-catalog .card-dek {
	font-family: var(--bsp-font-body);
	font-size: 17.5px; line-height: 1.55;
	color: var(--bsp-text-soft);
	margin-bottom: 18px; flex: 1;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

.bsp-blog-catalog .card-meta { padding-top: 16px; margin-top: 22px; border-top: 1px solid var(--bsp-border-subtle); }
.bsp-blog-catalog .meta-text { font-size: 11.5px; line-height: 1.4; color: var(--bsp-text-faint); }
.bsp-blog-catalog .meta-text .meta-name { color: var(--bsp-text-soft); font-weight: 600; }
.bsp-blog-catalog .meta-sep { opacity: .5; }

/* Ancrée dans le coin bas-droit plutôt que dans le flux : évite un
   grand vide quand la carte est plus haute que son texte. */
.bsp-blog-catalog .card-arrow-row { position: absolute; right: 26px; bottom: 22px; }
.bsp-blog-catalog .card-arrow {
	width: 30px; height: 30px; border-radius: 50%;
	border: 1px solid var(--bsp-border);
	display: flex; align-items: center; justify-content: center;
	font-size: 13px; color: var(--bsp-text-faint);
	transition: border-color .2s, color .2s, background .2s;
}
.bsp-blog-catalog .cat-card:hover .card-arrow,
.bsp-blog-catalog .card-featured:hover .card-arrow {
	border-color: var(--bsp-accent); background: var(--bsp-accent); color: #fff;
}

/* Vignettes de grappe : la boîte est trop large et trop courte pour
   accueillir l'image entière sans bandes noires: on remplit. */
.bsp-blog-catalog .mini-card .card-media { height: 64%; flex-shrink: 0; aspect-ratio: unset; }
.bsp-blog-catalog .mini-card .card-media img { object-fit: cover; object-position: top; }
.bsp-blog-catalog .mini-card .card-body { padding: 14px 16px 16px; justify-content: center; }
.bsp-blog-catalog .mini-card .card-tags { margin-bottom: 6px; gap: 5px; }
.bsp-blog-catalog .mini-card .card-metier { font-size: 8px; letter-spacing: .2em; }
.bsp-blog-catalog .mini-card .card-apps { font-size: 8px; letter-spacing: .18em; }
.bsp-blog-catalog .mini-card .card-title {
	font-size: 14px; line-height: 1.28; margin-bottom: 0;
	display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}

/* ── Pagination client et état vide ─────────────────────────── */
.bsp-blog-catalog .load-more { display: flex; justify-content: center; margin-top: 48px; }
.bsp-blog-catalog .btn-outline {
	font-family: var(--bsp-font-label);
	font-weight: 700; font-size: 12px;
	letter-spacing: .12em; text-transform: uppercase;
	color: var(--bsp-text);
	background: none;
	border: 1px solid var(--bsp-border-strong);
	padding: 15px 34px; border-radius: 100px;
	cursor: pointer;
	transition: border-color .2s, background .2s;
}
.bsp-blog-catalog .btn-outline:hover { border-color: var(--bsp-accent); background: rgba(var(--bsp-accent-rgb), 0.08); }
.bsp-blog-catalog .cat-empty { text-align: center; color: var(--bsp-text-faint); padding: 72px 0; }

/* Carte masquée par le filtre. `hidden` seul ne suffit pas : les
   cartes sont en display:flex/grid, qui l'emporte sur display:none. */
.bsp-blog-catalog [hidden] { display: none !important; }

/* ── Responsive ─────────────────────────────────────────────── */
@media (max-width: 1280px) {
	.bsp-blog-catalog .cat-grid { grid-template-columns: repeat(2, 1fr); }
	.bsp-blog-catalog .card-featured .card-title { font-size: 26px; }
}

@media (max-width: 1024px) {
	.bsp-blog-catalog .filter-banner { height: 42vh; margin-bottom: -96px; }
	.bsp-blog-catalog .filter-banner-content { padding-top: 110px; }
	.bsp-blog-catalog .filter-rows { padding: 20px var(--bsp-gutter) 64px; }
	.bsp-blog-catalog .filter-label { width: 100%; }

	/* La mosaïque n'a plus la largeur pour tenir : la vedette passe en
	   pleine largeur et la grappe redevient une rangée de quatre. */
	.bsp-blog-catalog .mosaic-top { grid-template-columns: 1fr; }
	.bsp-blog-catalog .mosaic-top .card-featured { height: auto; grid-template-columns: 1fr 1fr; }
	.bsp-blog-catalog .mini-cluster { height: auto; grid-template-rows: auto; }
	.bsp-blog-catalog .mini-card .card-media { height: auto; aspect-ratio: 16 / 10; }
	.bsp-blog-catalog .card-duo { height: auto; }
}

@media (max-width: 640px) {
	.bsp-blog-catalog .filter-banner { height: 38vh; min-height: 260px; margin-bottom: -80px; }
	.bsp-blog-catalog .filter-banner-content { padding-top: 96px; }
	.bsp-blog-catalog .filter-banner-app-logo { display: none; }
	/* Voile plus large sur mobile (16 septembre 2026) : le bandeau étroit
	   ramène le sujet sous le texte. Calculé à 640, 480 et 390 px sur les
	   six photos recadrées : sur-titre ≥ 5,2:1, titre ≥ 3,5:1 (texte
	   large, seuil 3:1) ; le voile desktop laissait le sur-titre à 4,1:1.
	   Recalculé avec le cadrage ci-dessous : sur-titre ≥ 5,1:1, titre ≥ 4,1:1. */
	/* Cadrage mobile : sur un bandeau étroit, une photo 3:1 ne montre que
	   40 à 60 % de sa largeur. Ancrée tout à droite, elle coupait l'une des
	   deux personnes à 390 px (HR & Operations). Les sujets sont centrés
	   vers 65-75 % de la largeur : 90 % les garde dans le cadre de 390 à
	   640 px. Mesuré le 16 septembre 2026. */
	.bsp-blog-catalog .filter-banner-bg-img { object-position: 90% top; }
	.bsp-blog-catalog .filter-banner-overlay {
		background:
			linear-gradient(100deg, rgba(6,30,60,0.92) 0%, rgba(6,30,60,0.80) 40%, rgba(6,30,60,0.30) 60%, transparent 80%),
			linear-gradient(0deg, rgba(6,30,60,0.45) 0%, transparent 34%);
	}

	.bsp-blog-catalog .catalogue { padding: 40px var(--bsp-gutter) 48px; }
	.bsp-blog-catalog .cat-grid,
	.bsp-blog-catalog .mosaic-duo,
	.bsp-blog-catalog .mini-cluster { grid-template-columns: 1fr; }
	.bsp-blog-catalog .mosaic-top .card-featured { grid-template-columns: 1fr; }
	.bsp-blog-catalog .card-featured .card-body { padding: 24px; }
	.bsp-blog-catalog .card-featured .card-title { font-size: 22px; }
	.bsp-blog-catalog .card-arrow-row { display: none; }
}

/* Pendant un filtrage, la mosaïque n'a plus de sens : le lot de
   résultats devient une grille uniforme. Les cartes gardent leur
   markup: seules leurs proportions sont ramenées au format standard,
   le temps du filtrage. */
.bsp-blog-catalog.is-filtering .card-featured {
	display: flex;
	grid-template-columns: none;
	height: auto;
}
.bsp-blog-catalog.is-filtering .card-featured .card-media,
.bsp-blog-catalog.is-filtering .mini-card .card-media {
	height: auto;
	aspect-ratio: 16 / 10;
}
.bsp-blog-catalog.is-filtering .mini-card .card-media img { object-fit: contain; }
.bsp-blog-catalog.is-filtering .card-featured .card-body,
.bsp-blog-catalog.is-filtering .card-duo .card-body { padding: 26px 26px 22px; }
.bsp-blog-catalog.is-filtering .card-featured .card-title,
.bsp-blog-catalog.is-filtering .card-duo .card-title,
.bsp-blog-catalog.is-filtering .mini-card .card-title { font-size: 21px; }
.bsp-blog-catalog.is-filtering .card-duo { height: auto; }

/* =============================================================
   12bis: CATALOGUE : habillage des modules Divi du gabarit #247
   -------------------------------------------------------------
   Le gabarit est construit en modules Divi (Loop Builder + Group),
   conformément à la règle « composants Divi, pas de module Code ».
   Rien n'est à régler dans le constructeur : tout le style vit ici.

   ⚠️ Pourquoi des sélecteurs STRUCTURELS et non les classes d'ordre
   de Divi. Mesuré le 13 septembre 2026 : Divi incrémente ses indices
   à chaque itération de la boucle: la 1re carte porte
   `et_pb_text_0_tb_body`, la 2e `et_pb_text_5_tb_body`, la 3e
   `et_pb_text_10_tb_body`… Une règle écrite sur `_0_` n'habille donc
   que le premier article, ce qui se voit tout de suite et se
   diagnostique mal. La position dans la carte, elle, est stable :

     enfant 1  <image>    visuel de couverture
     enfant 2  <text>     Expertise (taxonomie)
     enfant 3  <text>     Applications Zoho (taxonomie)
     enfant 4  <heading>  titre de l'article
     enfant 5  <text>     accroche (ACF sous_titre)
     enfant 6  <text>     auteur
     enfant 7  <text>     date

   Si un module est ajouté ou déplacé dans la carte, ces positions
   bougent : on relit le DOM et on corrige ici, à un seul endroit.

   La maquette met Expertise et Apps sur une même ligne, de même
   qu'auteur et date, alors que le markup les empile. La carte passe
   donc en grille CSS et chaque module est placé par zone: la mise
   en page voulue sans toucher au markup, donc chaque texte reste un
   module éditable dans Divi.
   ============================================================= */

:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l {

	/* La section porte un fond blanc réglé dans le constructeur, qui
	   ignore la bascule clair/sombre. On le rend au jeton : le
	   réglage natif reste en place, mais la couleur suit le thème. */
	& .et_pb_section { background-color: var(--bsp-bg); }

	/* La colonne de la boucle : sa grille (rangées de trois cartes) vient du
	   réglage Divi `--flex-direction: row` posé sur `.et_pb_column_N`, à UNE
	   classe. Le critical CSS inline de Divi remet `column` à la spécificité
	   1-3-0 et empilait toutes les cartes en une colonne. Le préfixe de ce
	   bloc suffit à le battre : on ne rend ici que la valeur que le
	   constructeur avait déjà choisie. */
	& .et_pb_column:has(> .et_pb_group) { flex-direction: row; }

	& .et_pb_column > .et_pb_group { gap: 24px; }

	/* ── La carte ─────────────────────────────────────────── */
	& .et_pb_column > .et_pb_group {
		position: relative;
		/* Flex à retour à la ligne, et non grille. Mesuré : en grille à
		   deux colonnes, une expertise au libellé long (« Ventes &
		   Relations clients ») laisse 34 px à la colonne voisine sur une
		   carte de 340, et « CRM » s'affiche une lettre par ligne. En
		   flex, la paire tient sur une ligne quand elle rentre et passe à
		   la ligne quand elle ne rentre pas: le comportement de la
		   maquette. C'est aussi ce que le Group de Divi fait déjà
		   nativement : on règle son flex, on ne le remplace pas. */
		display: flex;
		/* Le Group de Divi est en flex-direction:column par défaut. Sur
		   un axe vertical, `flex: 0 0 100%` vaut 100 % de la HAUTEUR :
		   le visuel montait à 767 px dans une carte de 340 de large, et
		   poussait tout le texte hors du cadre. On repasse l'axe en
		   ligne: la carte reste un empilement, mais les paires
		   Expertise/Apps et auteur/date peuvent enfin partager une
		   ligne, comme dans la maquette. */
		flex-direction: row;
		flex-wrap: wrap;
		align-content: flex-start;
		align-items: flex-start;
		background: var(--bsp-surface);
		border: 1px solid var(--bsp-border);
		border-radius: 8px;
		overflow: hidden;
		transition: border-color .25s var(--bsp-ease), transform .25s var(--bsp-ease);
	}
	/* Fond légèrement bleuté au survol, comme les cartes d'expertise de
	   la page d'accueil (accent à 10 %) : le même geste doit se lire de
	   la même façon d'une page à l'autre. */
	& .et_pb_column > .et_pb_group:hover {
		background: rgba(var(--bsp-accent-rgb), 0.10);
		border-color: rgba(var(--bsp-accent-rgb), 0.45);
		transform: translateY(-3px);
	}
	& .et_pb_column > .et_pb_group > * { min-width: 0; }

	/* ── Visuel: « contain » et non « cover » : les couvertures
	     reprises de l'ancien site portent du texte. ─────────── */
	& .et_pb_column > .et_pb_group > .et_pb_image {
		flex: 0 0 100%;
		order: 1;
		width: 100%;
		max-width: 100%;
		margin: 0 0 18px;
		/* Format des visuels d'articles (3:2) et image qui remplit le cadre
		   (24 octobre 2026) : avant, 16:10 + « contain » laissait des bandes
		   grises (clair) ou noires (sombre) de chaque côté. */
		aspect-ratio: 3 / 2;
		overflow: hidden;
		background: var(--bsp-surface-deep);
		display: block;
	}
	& .et_pb_column > .et_pb_group > .et_pb_image .et_pb_image_wrap {
		display: block; width: 100%; height: 100%; max-width: 100%;
	}
	& .et_pb_column > .et_pb_group > .et_pb_image img {
		width: 100%; height: 100%; max-width: 100%; display: block;
		object-fit: cover; object-position: center;
		transition: transform .3s var(--bsp-ease);
	}
	& .et_pb_column > .et_pb_group:hover > .et_pb_image img { transform: scale(1.02); }

	/* ── Expertise · Applications Zoho ────────────────────── */
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(2),
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(3) {
		margin: 0 0 12px;
		align-self: baseline;
		max-width: 100%;
	}
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(2) { flex: 0 0 auto; order: 2; padding-left: 26px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(3) { flex: 1 1 auto; order: 3; padding: 0 26px 0 7px; }

	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(2) .et_pb_text_inner p {
		font-family: var(--bsp-font-label);
		font-weight: 700; font-size: 9px;
		letter-spacing: .26em; text-transform: uppercase;
		color: var(--bsp-accent-text);
		margin: 0; padding: 0;
	}
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(3) .et_pb_text_inner p {
		font-family: var(--bsp-font-label);
		font-weight: 600; font-size: 9px;
		letter-spacing: .22em; text-transform: uppercase;
		color: var(--bsp-text-quiet);
		margin: 0; padding: 0;
	}
	/* Le séparateur « · » de la maquette n'appartient à aucun texte
	   éditable : un pseudo-élément, pas un module de plus. Il est
	   accroché à la FIN de l'expertise et non au début des apps :
	   quand le libellé est long (« Ventes & Relations clients »), la
	   paire passe à la ligne, et un « · » orphelin en tête de ligne se
	   lit comme une coquille. En fin de ligne, il se lit comme une
	   suite: le cas se produit sur trois des cinq expertises. */
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(2) .et_pb_text_inner p::after {
		content: "·"; color: var(--bsp-text-faint); margin-left: 7px;
	}
	/* Pas de séparateur si l'article ne porte aucune application Zoho :
	   un « · » suivi de rien est un défaut visible. */
	& .et_pb_column > .et_pb_group:has(> .et_pb_text:nth-child(3) .et_pb_text_inner p:empty) > .et_pb_text:nth-child(2) .et_pb_text_inner p::after {
		content: none;
	}

	/* ── Titre ────────────────────────────────────────────── */
	& .et_pb_column > .et_pb_group > .et_pb_heading { flex: 0 0 100%; order: 4; margin: 0 0 10px; padding: 0 26px; }
	& .et_pb_column > .et_pb_group > .et_pb_heading .et_pb_module_header {
		font-family: var(--bsp-font-display);
		font-weight: 800; font-size: 21px; line-height: 1.22;
		letter-spacing: -0.005em;
		color: var(--bsp-text);
		margin: 0; padding: 0;
	}

	/* ── Accroche ─────────────────────────────────────────── */
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(5) { flex: 0 0 100%; order: 5; margin: 0 0 18px; padding: 0 26px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(5) .et_pb_text_inner p {
		font-family: var(--bsp-font-body);
		font-size: 17.5px; line-height: 1.55;
		color: var(--bsp-text-soft);
		margin: 0; padding: 0;
		display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
	}

	/* ── Pied de carte : auteur · date, filet continu ──────
	     Les deux cellules sont voisines sur la même rangée : leurs
	     bordures hautes se rejoignent en un seul filet. */
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6),
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) {
		margin: 22px 0 0;
		padding-top: 16px; padding-bottom: 22px;
		border-top: 1px solid var(--bsp-border-subtle);
	}
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6) { flex: 0 0 auto; order: 6; padding-left: 26px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) { flex: 1 1 auto; order: 7; padding-right: 26px; padding-left: 6px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6) .et_pb_text_inner p,
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) .et_pb_text_inner p {
		font-family: var(--bsp-font-body);
		font-size: 11.5px; line-height: 1.4;
		color: var(--bsp-text-faint);
		margin: 0; padding: 0;
	}
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6) .et_pb_text_inner p {
		color: var(--bsp-text-soft); font-weight: 600;
	}

	/* ── Flèche de survol: pseudo-élément, aucun module ajouté ──
	   Pourquoi pas un vrai bouton Divi (règle du socle) : la carte
	   entière (.et_pb_group) est deja un lien cliquable (option Group >
	   Lien). Imbriquer un second <a> dedans force Divi a le sortir du
	   Group au rendu (HTML natif interdit les liens imbriques), ce qui
	   casse sa position -- essaye et constate le 27 sept. 2026. Le
	   cercle reste donc decoratif, mais reprend le style visuel du
	   bsp-btn-round-arrow (taille, bordure, icone, remplissage au
	   survol) pour l uniformite avec les Partenaires. ── */
	& .et_pb_column > .et_pb_group::after {
		content: "";
		position: absolute; right: 26px; bottom: 18px;
		width: 40px; height: 40px; border-radius: 50%;
		border: 1px solid var(--bsp-border);
		background-color: transparent;
		background-repeat: no-repeat;
		background-position: center;
		background-size: 16px 16px;
		background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27rgba(255,255,255,0.45)%27%20stroke-width%3D%272.25%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%274%27%20y1%3D%2712%27%20x2%3D%2719%27%20y2%3D%2712%27/%3E%3Cpolyline%20points%3D%2712%205%2019%2012%2012%2019%27/%3E%3C/svg%3E");
		transition: border-color .2s, background-color .2s, background-image .2s;
		pointer-events: none;
	}
	& .et_pb_column > .et_pb_group:hover::after {
		border-color: var(--bsp-accent-fill); background-color: var(--bsp-accent-fill);
		background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27%23ffffff%27%20stroke-width%3D%272.25%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%274%27%20y1%3D%2712%27%20x2%3D%2719%27%20y2%3D%2712%27/%3E%3Cpolyline%20points%3D%2712%205%2019%2012%2012%2019%27/%3E%3C/svg%3E");
	}

	/* ── Responsive: desktop-first, comme Divi 5 ─────────── */
	@media (max-width: 640px) {
		& .et_pb_column > .et_pb_group::after { display: none; }
		& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) { padding-left: 26px; }
	}
}

/* -------------------------------------------------------------
   Surcharges bornées.
   Divi génère une règle par module depuis les réglages du
   constructeur (`.et_pb_heading_0_tb_body … h1 { color:#0d1526 }`),
   posée pour l'ancien fond blanc de la section. Elle gagne
   l'arbitrage et fige le texte en bleu nuit sur fond sombre.

   La couleur doit suivre le jeton de thème, ce qu'un réglage du
   constructeur ne sait pas faire. On la reprend donc ici: mais
   `!important` reste borné à la seule propriété concernée et à nos
   sélecteurs, jamais en balayage. Le jour où quelqu'un veut changer
   ces couleurs, c'est ici, pas dans le constructeur.
   ------------------------------------------------------------- */
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l {
	& .et_pb_column > .et_pb_group > .et_pb_heading .et_pb_module_header { color: var(--bsp-text) !important; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(2) .et_pb_text_inner p { color: var(--bsp-accent-text) !important; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(3) .et_pb_text_inner p { color: var(--bsp-text-quiet) !important; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(5) .et_pb_text_inner p { color: var(--bsp-text-soft) !important; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6) .et_pb_text_inner p { color: var(--bsp-text-soft) !important; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) .et_pb_text_inner p { color: var(--bsp-text-faint) !important; }
}


/* =============================================================
   13: PAGE D'ARTICLE (CPT « project », gabarit Theme Builder #228)
   Source : maquettes/BSP Web Site/maquette-article-blog.html
   -------------------------------------------------------------
   Refait le 16 septembre 2026. Ce qui a changé, et pourquoi :

   · Sélecteurs par CLASSE, plus par indice Divi. Les modules du
     gabarit portent déjà des classes lisibles (bsp-article-cover,
     -title, -lead, -body, -author…) : elles survivent à l'ajout ou au
     retrait d'un module, contrairement à « et_pb_text_4_tb_body ».

   · Le gabarit portait deux modules Code avec du CSS en dur
     (#3a3f52, #16192a…) et des fonds de section réglés au
     constructeur (#0a0d14, #F5F4F1). Retirés du gabarit : tout le
     style vit ici, et la zone de lecture suit les jetons du thème.

   · Le défaut signalé: texte blanc sur fond blanc: venait de là :
     le fond crème était figé par Divi, mais les h3 du corps (286 dans
     le contenu importé) prenaient la couleur globale des titres,
     blanche en mode sombre. Le module « Post Content » n'a pas de
     .et_pb_text_inner : les anciennes règles ne l'atteignaient pas.

   · Écart assumé avec la maquette : elle fige la zone de lecture en
     clair. Consigne de Clément : clair ET sombre fonctionnent. En
     clair, la zone reprend quasiment la teinte de la maquette
     (--bsp-bg #F1F0ED contre #F5F4F1) ; en sombre, elle suit le site.
     La couverture, elle, reste sombre dans les deux thèmes : c'est
     une zone-image, texte blanc sur photo.
   ============================================================= */

body.single-project {

	/* ── Couverture ─────────────────────────────────────────── */
	& .bsp-article-cover.et_pb_section {
		position: relative;
		/* Hauteur MINIMALE, pas fixe : une section figée laissait la
		   rangée déborder vers le haut, titre sous la navigation
		   (mesuré le 13 septembre). */
		min-height: max(400px, 56vh);
		display: flex;
		flex-direction: column;
		justify-content: flex-end;
		overflow: hidden;
		background-color: var(--bsp-bg-media);
		/* 130 px en haut : la navigation flotte par-dessus. */
		padding: 130px var(--bsp-gutter) calc(32px + var(--bsp-cover-fade, 0px));
	}
	& .bsp-article-cover > .et_pb_row {
		/* NON positionnée : un référent ici décalerait le visuel du
		   rembourrage de la section. Ce sont les modules qui passent
		   au-dessus du voile. */
		position: static;
		margin: auto 0 0;
		padding: 0;
		width: 100%;
		max-width: 100%;
	}
	& .bsp-article-cover .et_pb_column { position: static; }

	/* Couverture : FOND FLOUTÉ + PHOTO NETTE À DROITE.
	   Demandes de Clément, 16 septembre 2026 : l'image mise en avant sert
	   de bandeau d'arrière-plan flouté et estompé, ET la photo nette reste
	   en haut à droite. Le gabarit #228 porte donc deux modules Image
	   natifs liés à la même image mise en avant :
	     .bsp-article-cover-bg   le fond (décoratif, aria-hidden, alt vide) ;
	     l'autre module Image    la photo nette.

	   Réglages du fond, en variables :
	     --bsp-cover-blur     intensité du flou (en px : CSS ne connaît pas
	                          de pourcentage ; 24 px efface le texte des visuels) ;
	     --bsp-cover-opacity  part de l'image dans le fond sombre.
	   Contrastes calculés sur 7 couvertures réelles, à 1280 et 390 px, avec
	   le voile ci-dessous (98e centile sous chaque texte) :
	     opacité 0,3 → titre ≥ 12,6:1, textes ≥ 7,9:1
	     opacité 0,5 → titre ≥ 8,4:1,  textes ≥ 5,5:1   ← retenue
	     opacité 0,8 → sur-titre et bouton ≈ 3,3:1 : NON CONFORME. */
	& .bsp-article-cover.et_pb_section {
		--bsp-cover-blur: 24px;
		--bsp-cover-opacity: 0.5;
	}

	/* Fond flouté: toute la couverture. Divi pose sa propre position sur
	   .et_pb_image et gagne l'arbitrage : surcharges bornées à ce module. */
	& .bsp-article-cover .et_pb_image.bsp-article-cover-bg {
		position: absolute !important;
		inset: 0 !important;
		z-index: 0 !important;
		width: 100% !important;
		height: 100% !important;
		margin: 0 !important;
		padding: 0 !important;
		overflow: hidden;
		pointer-events: none;
	}
	& .bsp-article-cover .bsp-article-cover-bg .et_pb_image_wrap,
	& .bsp-article-cover .bsp-article-cover-bg img {
		display: block;
		width: 100%;
		height: 100%;
		max-width: 100%;
	}
	& .bsp-article-cover .bsp-article-cover-bg img {
		object-fit: cover;
		object-position: center;
		filter: blur(var(--bsp-cover-blur));
		opacity: var(--bsp-cover-opacity);
		/* Un flou déborde en halo transparent sur les bords : on agrandit
		   l'image pour que ce halo sorte du cadre. */
		transform: scale(1.12);
	}
	/* Voile : plus dense en bas et à gauche, sous le texte. */
	& .bsp-article-cover::before {
		content: "";
		position: absolute;
		inset: 0;
		z-index: 1;
		pointer-events: none;
		background:
			linear-gradient(90deg, rgba(6,10,20,0.55) 0%, rgba(6,10,20,0.25) 60%, rgba(6,10,20,0) 100%),
			linear-gradient(180deg, rgba(6,10,20,0.30) 0%, rgba(6,10,20,0.30) 40%, rgba(6,10,20,0.75) 100%);
	}

	/* Dégradé couverture → zone de lecture (Clément, 16 septembre 2026),
	   dans les deux thèmes : le bas de la couverture se fond dans le fond
	   de page (--bsp-bg), crème en clair, sombre en sombre. Sous le texte
	   (z-index 1) : le rembourrage bas de la section est agrandi pour que
	   l'auteur et la date restent au-dessus du dégradé: du texte blanc
	   posé sur la partie crème serait illisible en mode clair. */
	& .bsp-article-cover.et_pb_section { --bsp-cover-fade: var(--bsp-banner-fade); }
	& .bsp-article-cover::after {
		content: "";
		position: absolute;
		/* -1px : la couverture finit sur un demi-pixel (823,5 mesuré) et
		   laissait un filet du fond flouté entre les deux sections. */
		left: 0; right: 0; bottom: -1px;
		height: calc(var(--bsp-cover-fade) + 1px);
		z-index: 1;
		pointer-events: none;
		/* Paliers intermédiaires en color-mix plutôt qu'un simple
		   « transparent → fond » : la transition est plus douce, et un
		   « transparent » pur (noir transparent) grisait le milieu. */
		background: var(--bsp-banner-fade-gradient);
	}

	/* Photo nette: moitié droite, entière (« contain » : un visuel qui
	   porte du texte ne se recadre pas). */
	& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) {
		position: absolute !important;
		inset: 120px var(--bsp-gutter) calc(24px + var(--bsp-cover-fade, 0px)) 52% !important;
		z-index: 2 !important;
		width: auto !important;
		height: auto !important;
		margin: 0 !important;
		padding: 0 !important;
	}
	& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) .et_pb_image_wrap,
	& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) img {
		display: block;
		width: 100%;
		height: 100%;
		max-width: 100%;
	}
	& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) img {
		object-fit: contain;
		object-position: right center;
		border-radius: 8px;
		filter: drop-shadow(0 18px 40px rgba(0, 0, 0, 0.45));
	}

	/* Le texte reste dans la moitié gauche. */
	& .bsp-article-cover .et_pb_module:not(.et_pb_image) {
		position: relative;
		z-index: 2;
		max-width: min(760px, calc(48vw - var(--bsp-gutter) - 24px));
	}

	/* Pastilles Expertise · Application Zoho. Aplat --bsp-accent-fill
	   et non l'accent à 90 % de la maquette : texte blanc de 10 px,
	   5,25:1 contre 3,2:1. */
	& .bsp-article-cover-tags { margin: 0 0 16px; }
	& .bsp-article-cover-tags .et_pb_text_inner {
		display: flex;
		flex-wrap: wrap;
		align-items: center;
		gap: 9px;
	}
	& .bsp-article-cover-tags span {
		display: inline-block;
		font-family: var(--bsp-font-label);
		font-weight: 700;
		font-size: 10px;
		line-height: 1.2;
		letter-spacing: .18em;
		text-transform: uppercase;
		color: #fff;
		background: var(--bsp-accent-fill);
		padding: 7px 14px;
		border-radius: 100px;
		margin: 0;
	}
	& .bsp-article-cover-tags span.alt {
		background: rgba(255, 255, 255, 0.14);
		backdrop-filter: blur(6px);
	}
	/* Un article sans application Zoho ne doit pas montrer une pastille vide. */
	& .bsp-article-cover-tags span:empty { display: none; }

	& .bsp-article-title { margin: 0 0 14px; }
	& .bsp-article-title h1 {
		font-family: var(--bsp-font-display);
		font-weight: 800;
		font-size: clamp(28px, 2.7vw, 42px);
		line-height: 1.16;
		letter-spacing: 0;
		color: #fff;
		margin: 0;
		padding: 0;
	}

	& .bsp-article-subtitle { margin: 0 0 16px; max-width: 640px; }
	& .bsp-article-subtitle h2 {
		font-family: var(--bsp-font-body);
		font-weight: 400;
		font-size: 22px;
		line-height: 1.55;
		letter-spacing: 0;
		color: rgba(255, 255, 255, 0.82);
		margin: 0;
		padding: 0;
	}
	& .bsp-article-subtitle:has(h2:empty) { display: none; }

	/* Auteur · date, sur une ligne. */
	& .bsp-article-author-cover,
	& .bsp-article-date-cover {
		display: inline-block;
		vertical-align: baseline;
		margin: 0;
	}
	& .bsp-article-author-cover .et_pb_text_inner,
	& .bsp-article-date-cover .et_pb_text_inner {
		font-family: var(--bsp-font-body);
		font-size: 17px;
		line-height: 1.5;
		/* Mesuré : le module date, en inline-block, se rétrécissait à
		   101 px et renvoyait l'année à la ligne. */
		white-space: nowrap;
	}
	/* Divi enveloppe le texte dans un <p> (wpautop) : en bloc, il poussait
	   le séparateur « · » sur sa propre ligne, au-dessus de la date. */
	& :is(.bsp-article-author-cover, .bsp-article-date-cover) .et_pb_text_inner p {
		display: inline;
		margin: 0;
		padding: 0;
		font: inherit;
		color: inherit;
	}
	& .bsp-article-author-cover .et_pb_text_inner { color: #fff; font-weight: 600; }
	& .bsp-article-date-cover .et_pb_text_inner { color: rgba(255, 255, 255, 0.70); }
	& .bsp-article-date-cover .et_pb_text_inner::before {
		content: "·";
		margin: 0 8px;
		opacity: .7;
	}

	/* ── Retour au blogue ───────────────────────────────────────
	   Deux modules Button natifs (demande de Clément, 16 septembre
	   2026), classe posée au constructeur sur le lien lui-même :
	   « --top » dans la couverture, avant les pastilles ; « --bottom »
	   après la signature. Lien vers /blog/, modifiable dans Divi.
	   La flèche est décorative : ajoutée en CSS, pas dans le texte. */
	& .bsp-article-cover .et_pb_button_module_wrapper {
		position: relative;
		z-index: 2;
		margin: 0 0 18px;
	}
	& a.bsp-article-back.et_pb_button,
	& a.bsp-article-back.et_pb_button:hover {
		display: inline-flex;
		align-items: center;
		gap: 10px;
		font-family: var(--bsp-font-label);
		font-weight: 700;
		letter-spacing: .12em;
		text-transform: uppercase;
		text-decoration: none;
		border-radius: 100px;
		transition: background .2s, color .2s, border-color .2s;
	}
	/* Divi ajoute sa propre icône en ::after au survol : retirée. */
	& a.bsp-article-back.et_pb_button::after { content: none !important; display: none !important; }
	/* Divi réserve ::before à son icône de gauche (display:none, police
	   ETmodules, position absolue, opacité 0) et gagne l'arbitrage :
	   !important borné à ce pseudo-élément, mesuré le 16 septembre. */
	& a.bsp-article-back.et_pb_button::before {
		content: "←" !important;
		display: inline-block !important;
		position: static !important;
		opacity: 1 !important;
		margin: 0 !important;
		font-family: var(--bsp-font-body) !important;
		font-size: 1.35em !important;
		line-height: 1 !important;
		letter-spacing: 0;
		/* Divi y pose translateY(-50%) pour son icône absolue : la flèche
		   remontait de 8 px une fois remise dans le flux. */
		transform: none !important;
		transition: transform .2s;
	}
	& a.bsp-article-back.et_pb_button:hover::before { transform: translateX(-3px) !important; }
	& a.bsp-article-back.et_pb_button:focus-visible {
		outline: 2px solid var(--bsp-accent-hover);
		outline-offset: 3px;
	}

	/* Haut : lien discret sur la couverture, qui reste sombre dans les
	   deux thèmes: texte blanc 80 % sur #0a0d14. */
	& a.bsp-article-back--top.et_pb_button,
	& a.bsp-article-back--top.et_pb_button:hover {
		font-size: 11px !important;
		color: rgba(255, 255, 255, 0.80) !important;
		background: transparent !important;
		border: 1px solid rgba(255, 255, 255, 0.22) !important;
		padding: 8px 16px 8px 12px !important;
	}
	& a.bsp-article-back--top.et_pb_button:hover {
		color: #fff !important;
		border-color: rgba(255, 255, 255, 0.55) !important;
	}

	/* Bas : bouton plein, l'aplat accent qui porte du texte blanc
	   (5,25:1), assombri au survol plutôt qu'éclairci (7,70:1). */
	& .bsp-article-cover ~ .et_pb_section .et_pb_button_module_wrapper { margin: 40px 0 0; }
	& a.bsp-article-back--bottom.et_pb_button,
	& a.bsp-article-back--bottom.et_pb_button:hover {
		font-size: 12px !important;
		color: #fff !important;
		background: var(--bsp-accent-fill) !important;
		border: 0 !important;
		padding: 14px 28px 14px 22px !important;
	}
	& a.bsp-article-back--bottom.et_pb_button:hover {
		background: var(--bsp-accent-fill-hover) !important;
	}

	/* ── Zone de lecture ────────────────────────────────────── */
	/* La section qui suit la couverture. Pas de classe posée au
	   constructeur sur celle-ci : on la vise par sa position, stable
	   sur un gabarit qui n'est pas une boucle. */
	& .bsp-article-cover ~ .et_pb_section {
		border-top: 0;
		background-color: var(--bsp-bg);
		color: var(--bsp-text-soft);
		padding: 64px 24px 96px;
	}
	& .bsp-article-cover ~ .et_pb_section > .et_pb_row {
		width: 100%;
		max-width: 720px;
		margin: 0 auto;
		padding: 0;
	}

	/* Chapô: Playfair italique, comme la maquette. */
	& .bsp-article-lead { margin: 0 0 36px; }
	& .bsp-article-lead .et_pb_text_inner,
	& .bsp-article-lead .et_pb_text_inner p {
		font-family: var(--bsp-font-display);
		font-style: italic;
		font-weight: 700;
		font-size: 21px;
		line-height: 1.4;
		color: var(--bsp-body);
	}
	& .bsp-article-lead .et_pb_text_inner p { margin: 0 0 16px; }
	& .bsp-article-lead .et_pb_text_inner p:last-child { margin-bottom: 0; }

	/* Corps de l'article: module natif Post Content. */
	& .bsp-article-body {
		font-family: var(--bsp-font-body);
		font-size: 21.5px;
		line-height: 1.4;
		color: var(--bsp-text-soft);
	}
	/* Le contenu importé de l'ancien site (Avada) porte des styles en
	   ligne : couleurs, polices et tailles en variables qui n'existent
	   plus ici, fonds de surlignage. Ils n'ont rien à décider dans le
	   gabarit. !important obligatoire contre un attribut style, et borné
	   à ces quatre propriétés dans le corps de l'article. */
	& .bsp-article-body [style] {
		color: inherit !important;
		background-color: transparent !important;
		font-family: inherit !important;
		font-size: inherit !important;
	}

	& .bsp-article-body p {
		font-size: inherit;
		line-height: inherit;
		color: inherit;
		margin: 0 0 24px;
		padding: 0;
	}
	& .bsp-article-body :is(h1, h2, h3, h4, h5, h6) {
		color: var(--bsp-text);
		letter-spacing: 0;
		padding: 0;
	}
	& .bsp-article-body :is(h1, h2) {
		font-family: var(--bsp-font-display);
		font-weight: 800;
		font-size: 26px;
		line-height: 1.3;
		margin: 48px 0 18px;
	}
	& .bsp-article-body h3 {
		font-family: var(--bsp-font-display);
		font-weight: 800;
		font-size: 22px;
		line-height: 1.35;
		margin: 44px 0 16px;
	}
	& .bsp-article-body :is(h4, h5, h6) {
		font-family: var(--bsp-font-label);
		font-weight: 700;
		font-size: 15px;
		line-height: 1.45;
		letter-spacing: .02em;
		margin: 32px 0 12px;
	}
	& .bsp-article-body > :is(h1, h2, h3, h4):first-child { margin-top: 0; }
	& .bsp-article-body :is(b, strong) { color: var(--bsp-text); font-weight: 700; }
	& .bsp-article-body :is(h1, h2, h3, h4, h5, h6) :is(b, strong) { font-weight: inherit; }

	& .bsp-article-body a {
		color: var(--bsp-accent-text);
		text-decoration: underline;
		text-underline-offset: 3px;
		text-decoration-thickness: 1px;
	}
	& .bsp-article-body a:hover { text-decoration-thickness: 2px; }
	& .bsp-article-body a:focus-visible {
		outline: 2px solid var(--bsp-accent-text);
		outline-offset: 2px;
		border-radius: 2px;
	}

	& .bsp-article-body :is(ul, ol) {
		margin: 0 0 28px;
		padding: 0 0 0 22px;
	}
	& .bsp-article-body ul { list-style: disc; }
	& .bsp-article-body ol { list-style: decimal; }
	& .bsp-article-body li {
		color: inherit;
		margin: 0 0 10px;
		padding-left: 4px;
		line-height: 1.75;
	}
	& .bsp-article-body li::marker { color: var(--bsp-accent-text); }
	& .bsp-article-body li > p { margin: 0; }

	/* Citation détachée: filet accent, comme la maquette. */
	& .bsp-article-body blockquote {
		margin: 40px 0;
		padding: 6px 0 6px 28px;
		border: 0;
		border-left: 3px solid var(--bsp-accent);
		background: none;
		font-family: var(--bsp-font-display);
		font-style: italic;
		font-weight: 700;
		font-size: 22px;
		line-height: 1.5;
		color: var(--bsp-text);
	}
	& .bsp-article-body blockquote p { margin: 0 0 12px; }
	& .bsp-article-body blockquote p:last-child { margin-bottom: 0; }

	& .bsp-article-body img {
		display: block;
		max-width: 100%;
		height: auto;
		border-radius: 8px;
		margin: 12px 0 28px;
	}
	/* Images posées dans un titre par l'ancien éditeur. */
	& .bsp-article-body :is(h1, h2, h3, h4) img { margin: 16px 0; }

	/* Signature de fin d'article: la carte auteur de la maquette. */
	& .bsp-article-author {
		margin: 56px 0 0;
		padding: 28px 0 0;
		border-top: 1px solid var(--bsp-border);
	}
	& .bsp-article-author .et_pb_text_inner {
		font-family: var(--bsp-font-label);
		font-size: 13px;
		letter-spacing: .02em;
		color: var(--bsp-text-soft);
	}
	& .bsp-article-author .et_pb_text_inner strong {
		display: block;
		margin-top: 4px;
		font-size: 15px;
		font-weight: 700;
		color: var(--bsp-text);
	}

	/* ── Responsive: desktop-first, comme Divi 5 ───────────── */
	@media (max-width: 1024px) {
		/* Sous 1024 px, la photo nette reprend sa place dans le flux,
		   entre le bouton « Retour au blogue » et les pastilles ; le fond
		   flouté reste derrière toute la couverture. */
		& .bsp-article-cover.et_pb_section {
			display: block;
			min-height: 0;
			--bsp-cover-fade: var(--bsp-banner-fade);
			padding: 96px var(--bsp-gutter) calc(24px + var(--bsp-cover-fade));
		}
		& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) {
			position: relative !important;
			inset: auto !important;
			height: auto !important;
			margin: 0 0 28px !important;
		}
		& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) .et_pb_image_wrap,
		& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) img {
			height: auto;
		}
		& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) img {
			max-height: 52vh;
			object-position: center;
		}
		& .bsp-article-cover .et_pb_module:not(.et_pb_image) { max-width: 100%; }
	}
	@media (max-width: 640px) {
		& .bsp-article-cover.et_pb_section { --bsp-cover-fade: var(--bsp-banner-fade); padding: 88px var(--bsp-gutter) calc(20px + var(--bsp-cover-fade)); }
		& .bsp-article-cover .et_pb_image:not(.bsp-article-cover-bg) { margin-bottom: 22px !important; }
		& .bsp-article-subtitle h2 { font-size: 15px; }
		& .bsp-article-cover ~ .et_pb_section { padding: 44px var(--bsp-gutter) 64px; }
		& .bsp-article-lead .et_pb_text_inner,
		& .bsp-article-lead .et_pb_text_inner p { font-size: 23.5px; }
		& .bsp-article-body { font-size: 21px; }
		& .bsp-article-body :is(h1, h2) { font-size: 23px; }
		& .bsp-article-body h3 { font-size: 20px; }
		& .bsp-article-body blockquote { font-size: 19px; padding-left: 20px; }
	}
}

/* Cartes de la grille cliquables: 16 septembre 2026.
   Le gabarit #247 porte désormais deux liens natifs « Loop Post Link » :
   sur le groupe (toute la carte, lien JavaScript de Divi, classe
   et_clickable) et sur l'image (vrai <a>, suivi par les moteurs et
   atteignable au clavier). Sans ces deux règles, la carte cliquable ne
   montrait ni curseur ni focus. */
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l {
	& [data-loop-item].et_clickable { cursor: pointer; }
	& [data-loop-item] .et_pb_image a:focus-visible {
		outline: 2px solid var(--bsp-accent-text);
		outline-offset: 4px;
		border-radius: 6px;
	}
	& [data-loop-item]:focus-within {
		border-color: rgba(var(--bsp-accent-rgb), 0.45);
	}
}

/* Combinaison de filtres sans résultat : la boucle Divi rend malgré tout
   une carte vide, qui se lit comme un défaut d'affichage. On la masque et
   on affiche le message à la place: voir includes/blog-filtres.php. */
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l {
	& .bsp-blog-catalog.is-empty ~ * .et_pb_column > .et_pb_group,
	& .bsp-blog-catalog.is-empty + * .et_pb_column > .et_pb_group { display: none; }
	& .bsp-blog-catalog .cat-empty {
		text-align: center;
		color: var(--bsp-text-faint);
		font-family: var(--bsp-font-body);
		padding: 72px var(--bsp-gutter);
	}
}


/* =============================================================
   12ter: LE SUJET DU MOIS
   Bloc vedette du catalogue : image à gauche, texte à droite,
   pleine largeur, au-dessus de la grille d'articles.
   Markup : includes/blog-filtres.php
   -------------------------------------------------------------
   L'article mis en avant suit le filtre actif, et il est exclu
   de la grille en dessous: sinon il apparaît deux fois, ce qui
   se lit comme un doublon et non comme une mise en avant.
   ============================================================= */

/* Aligné sur la rangée Divi, pas sur la gouttière du thème.
   Mesuré : la rangée du gabarit fait `width: 80%; max-width: 1080px`,
   centrée. Le bloc est injecté À CÔTÉ de la section, donc il ne
   bénéficie d'aucune de ces contraintes et prenait toute la largeur,
   il dépassait la grille des trois colonnes des deux côtés. On reprend
   exactement les mêmes valeurs : à tout moment, le sujet du mois occupe
   la largeur des trois colonnes, ni plus ni moins. */
.bsp-blog-catalog .sujet-du-mois {
	width: 80%;
	max-width: 1080px;
	margin: 0 auto;
	padding: 64px 0 0;
}
.bsp-blog-catalog .sujet-eyebrow {
	font-family: var(--bsp-font-label);
	font-weight: 700; font-size: 10px;
	letter-spacing: .2em; text-transform: uppercase;
	color: var(--bsp-accent-text);
	margin: 0 0 10px;
}
.bsp-blog-catalog .sujet-intro {
	font-family: var(--bsp-font-body);
	font-size: 19.5px; line-height: 1.45;
	color: var(--bsp-text-soft);
	max-width: 640px;
	margin: 0 0 28px;
}

/* La carte vedette hérite de .card-featured (section 12) : grille
   1,05fr / 1fr, image à gauche. On lui donne seulement une hauteur
   minimale, pour que le visuel ait la présence attendue d'un sujet
   du mois, et le comportement de survol des autres cartes. */
.bsp-blog-catalog .sujet-du-mois .card-featured {
	min-height: 340px;
	text-decoration: none;
	color: inherit;
}
.bsp-blog-catalog .sujet-du-mois .card-title { font-size: 30px; }
.bsp-blog-catalog .sujet-du-mois .card-dek {
	font-size: 19.5px;
	-webkit-line-clamp: 3;
}

/* Survol : fond légèrement bleuté, comme les cartes d'expertise de la
   page d'accueil: même valeur d'accent à 10 %, pour que le geste se
   lise pareil d'une page à l'autre. */
.bsp-blog-catalog .cat-card:hover,
.bsp-blog-catalog .card-featured:hover,
.bsp-blog-catalog .mini-card:hover {
	background: rgba(var(--bsp-accent-rgb), 0.10);
	border-color: rgba(var(--bsp-accent-rgb), 0.45);
}

@media (max-width: 900px) {
	.bsp-blog-catalog .sujet-du-mois .card-featured {
		grid-template-columns: 1fr;
		min-height: 0;
	}
	.bsp-blog-catalog .sujet-du-mois .card-featured .card-media { aspect-ratio: 16 / 9; }
	.bsp-blog-catalog .sujet-du-mois .card-title { font-size: 24px; }
}
@media (max-width: 640px) {
	.bsp-blog-catalog .sujet-du-mois { padding-top: 44px; width: auto; margin: 0 var(--bsp-gutter); }
	.bsp-blog-catalog .sujet-du-mois .card-featured .card-body { padding: 24px; }
}

/* =============================================================
   07: CASE STUDY · Gabarit d'étude de cas (single-case-study.php)
   -------------------------------------------------------------
   Calqué sur maquettes/foothills.html, adapté aux jetons du site
   (l'accent de la maquette était l'or/amber d'une palette testée ;
   le site réel a tranché pour le bleu --bsp-accent, voir 01 TOKENS).
   Racine .bsp-case-study : même convention de préfixe que
   .bsp-blog-catalog plus haut. La zone héros (vidéo/image) reste
   sombre à texte blanc dans les deux modes -- comme les bandeaux du
   catalogue -- via --bsp-bg-media, qui ne bascule jamais.
   Ajouté le 16 septembre 2026.
   ============================================================= */

.bsp-case-study { background: var(--bsp-bg); color: var(--bsp-text); }

/* ── Héros ── */
.bsp-case-study .cs-hero {
	position: relative;
	width: 100%;
	/* 16:9 au plus, mais jamais plus haut que l'écran : sinon le titre, le
	   « Go back » et les infos en surimpression passent sous le pli. Le
	   dégagement du bas (130 px) reste visible dans la fenêtre. */
	height: min(56.25vw, calc(100svh - var(--wp-admin--admin-bar--height, 0px)));
	min-height: 640px;
	display: flex;
	align-items: flex-end;
	--cs-hero-bottom: 130px;   /* dégagement sous le contenu : « Go back » et bouton son s'alignent dessus */
	padding: 0 var(--bsp-gutter) var(--cs-hero-bottom);
	overflow: hidden;
	background: var(--bsp-bg-media);
	color: #fff;
}
.bsp-case-study .cs-hero-bg { position: absolute; inset: 0; container-type: size; overflow: hidden; }
.bsp-case-study .cs-hero-bg img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 30%;
}
/* Vidéo en iframe (lecteur WorkDrive) : un iframe ne sait pas « couvrir »
   (object-fit ne s'applique pas), il laisserait des bandes noires dès que
   l'en-tête n'est plus en 16:9. On le dimensionne donc comme une vidéo 16:9
   qui couvre toute la zone : pleine largeur, rognée en hauteur si besoin. */
.bsp-case-study .cs-hero-bg iframe {
	position: absolute;
	top: 50%; left: 50%;
	width: max(100cqw, 177.78cqh);    /* 16/9 de la hauteur */
	height: max(100cqh, 56.25cqw);    /* 9/16 de la largeur */
	transform: translate(-50%, -50%);
	border: 0;
	max-width: none;        /* sinon iframe { max-width: 100% } l'empêche de couvrir en portrait */
	pointer-events: none;   /* fond animé : aucune interaction, comme avant */
}
.bsp-case-study .cs-hero-bg::after {
	content: '';
	position: absolute;
	inset: 0;
	background:
		linear-gradient(to top, rgba(6,8,16,0.87) 0%, rgba(6,8,16,0.5) 50%, rgba(6,8,16,0.23) 100%),
		linear-gradient(to right, rgba(6,8,16,0.63) 0%, transparent 65%);   /* voile allégé de 10 % le 20 sept. 2026 */
}
.bsp-case-study .cs-hero-content { position: relative; z-index: 10; max-width: 780px; }
.bsp-case-study .cs-hero-kicker { display: flex; align-items: center; gap: 16px; margin-bottom: var(--bsp-space-3); }
.bsp-case-study .kicker-tag {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 9px;
	letter-spacing: 0.35em;
	text-transform: uppercase;
	color: var(--bsp-accent);
	/* Simple titre : pas de bulle ni de contour, on le prendrait pour un bouton. */
}
.bsp-case-study .kicker-divider { width: 32px; height: 1px; background: rgba(255,255,255,0.2); }
.bsp-case-study .kicker-label {
	font-family: var(--bsp-font-label);
	font-weight: 600;
	font-size: 11px;
	letter-spacing: 0.15em;
	text-transform: uppercase;
	color: rgba(255,255,255,0.55);
}
.bsp-case-study .cs-hero-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: var(--bsp-banner-title-size);
	line-height: 1.05;
	letter-spacing: -0.02em;
	color: #fff;
	margin-bottom: var(--bsp-space-3);
}
.bsp-case-study .cs-hero-title em { font-style: italic; color: var(--bsp-accent-hover); }
.bsp-case-study .cs-hero-sub {
	font-size: 23.5px;
	font-weight: 400;
	color: rgba(255,255,255,0.62);
	line-height: 1.4;
	max-width: 600px;
}
.bsp-case-study .cs-hero-meta {
	position: absolute;
	bottom: 130px;
	right: var(--bsp-gutter);
	z-index: 10;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 18px;
}
.bsp-case-study .meta-item { text-align: right; }   /* libellé et valeur alignés à droite, sur le même bord */
.bsp-case-study .meta-label {
	font-family: var(--bsp-font-label);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.25em;
	text-transform: uppercase;
	color: rgba(255,255,255,0.28);
	margin-bottom: 4px;
}
.bsp-case-study .meta-value {
	font-family: var(--bsp-font-label);
	font-size: 17px;
	font-weight: 600;
	color: rgba(255,255,255,0.72);
	letter-spacing: 0.04em;
	text-align: right;
}

/* ── Barre de résultats ── */
.bsp-case-study .results-bar {
	background: var(--bsp-brand-blue);
	padding: 0 var(--bsp-gutter);
	display: grid;
	grid-template-columns: repeat(4, 1fr);
}
.bsp-case-study .result-item { padding: 50px; border-right: 1px solid rgba(255,255,255,0.22); }
.bsp-case-study .result-item:last-child { border-right: none; }
.bsp-case-study .result-num {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(34px, 3.5vw, 50px);
	color: #fff;
	line-height: 1;
	letter-spacing: -0.02em;
	font-variant-numeric: tabular-nums;
}
.bsp-case-study .result-label { font-size: 14px; font-weight: 400; color: rgba(255,255,255,0.85); margin-top: 8px; line-height: 1.45; }

/* ── Corps ── */
.bsp-case-study .cs-body { max-width: 1200px; margin: 0 auto; padding: 0 var(--bsp-gutter); }
.bsp-case-study .section-label {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 9px;
	letter-spacing: 0.35em;
	text-transform: uppercase;
	color: var(--bsp-accent-text);
	margin-bottom: 20px;
}
.bsp-case-study .cs-split {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 80px;
	align-items: start;
	margin-top: 100px;
	margin-bottom: 100px;
}
.bsp-case-study .cs-section-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(28px, 2.8vw, 42px);
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--bsp-text);
}
.bsp-case-study .cs-section-title em { font-style: italic; color: var(--bsp-accent-text); }
.bsp-case-study .cs-text p { font-size: 22px; font-weight: 400; color: var(--bsp-text-soft); line-height: 1.4; margin-bottom: 20px; }
.bsp-case-study .cs-text p:last-child { margin-bottom: 0; }

.bsp-case-study .cs-quote {
	background: rgba(var(--bsp-accent-rgb), 0.06);
	border-left: 3px solid var(--bsp-accent);
	padding: 48px 56px;
	margin-bottom: 100px;
	border-radius: 0 var(--bsp-radius) var(--bsp-radius) 0;
}
.bsp-case-study .cs-quote blockquote {
	font-family: var(--bsp-font-display);
	font-size: clamp(20px, 2.2vw, 28px);
	font-weight: 700;
	font-style: italic;
	color: var(--bsp-text);
	line-height: 1.45;
	margin-bottom: 28px;
}
.bsp-case-study .cs-quote blockquote em { color: var(--bsp-accent-text); font-style: normal; }
.bsp-case-study .quote-author { display: flex; align-items: center; gap: 14px; }
.bsp-case-study .author-avatar {
	width: 44px; height: 44px; border-radius: 50%;
	background: rgba(var(--bsp-accent-rgb), 0.15);
	border: 2px solid rgba(var(--bsp-accent-rgb), 0.35);
	display: flex; align-items: center; justify-content: center;
	font-family: var(--bsp-font-label); font-weight: 800; font-size: 13px;
	color: var(--bsp-accent-text); flex-shrink: 0;
}
.bsp-case-study .author-name { font-family: var(--bsp-font-label); font-weight: 700; font-size: 13px; color: var(--bsp-text); letter-spacing: 0.03em; }
.bsp-case-study .author-title { font-size: 13px; font-weight: 400; color: var(--bsp-text-faint); margin-top: 2px; }

.bsp-case-study .cs-features { display: flex; flex-direction: column; gap: 16px; }
.bsp-case-study .cs-feature {
	background: var(--bsp-surface);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	padding: 22px 26px;
	display: flex; gap: 18px; align-items: flex-start;
	transition: border-color var(--bsp-speed) var(--bsp-ease);
}
.bsp-case-study .cs-feature:hover { border-color: rgba(var(--bsp-accent-rgb), 0.4); }
.bsp-case-study .cs-feature-icon { width: 10px; height: 10px; border-radius: 50%; background: var(--bsp-accent); flex-shrink: 0; margin-top: 6px; }
.bsp-case-study .cs-feature-title { font-family: var(--bsp-font-label); font-weight: 700; font-size: 13px; letter-spacing: 0.03em; color: var(--bsp-text); margin-bottom: 5px; }
.bsp-case-study .cs-feature-desc { font-size: 18px; font-weight: 400; color: var(--bsp-text-soft); line-height: 1.6; }

.bsp-case-study .cs-divider { height: 1px; background: var(--bsp-border-subtle); margin-bottom: 100px; }

.bsp-case-study .cs-quote-center { text-align: center; max-width: 740px; margin: 0 auto 100px; }
.bsp-case-study .cs-quote-center blockquote {
	font-family: var(--bsp-font-display);
	font-size: clamp(19px, 2vw, 26px);
	font-weight: 700; font-style: italic;
	color: var(--bsp-text); line-height: 1.5; margin-bottom: 24px;
}
.bsp-case-study .cs-quote-center blockquote em { color: var(--bsp-accent-text); font-style: normal; }
.bsp-case-study .cs-quote-center .quote-author { justify-content: center; }

.bsp-case-study .cs-cta {
	background: rgba(var(--bsp-accent-rgb), 0.06);
	border: 1px solid rgba(var(--bsp-accent-rgb), 0.18);
	border-radius: var(--bsp-radius);
	padding: 64px 72px;
	display: flex; align-items: center; justify-content: space-between; gap: 48px;
	margin-bottom: 100px;
}
.bsp-case-study .cs-cta-eyebrow { font-family: var(--bsp-font-label); font-weight: 700; font-size: 9px; letter-spacing: 0.35em; text-transform: uppercase; color: var(--bsp-accent-text); margin-bottom: 16px; }
.bsp-case-study .cs-cta-title { font-family: var(--bsp-font-display); font-weight: 800; font-size: clamp(26px, 2.5vw, 38px); color: var(--bsp-text); line-height: 1.1; letter-spacing: -0.01em; }
.bsp-case-study .cs-cta-title em { font-style: italic; color: var(--bsp-accent-text); }
.bsp-case-study .cs-cta-actions { display: flex; flex-direction: column; gap: 14px; flex-shrink: 0; }
.bsp-case-study .btn-primary {
	background: var(--bsp-accent-fill); color: #fff;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
	padding: 16px 36px; border-radius: 100px; text-align: center;
	transition: background var(--bsp-speed) var(--bsp-ease); white-space: nowrap;
}
.bsp-case-study .btn-primary:hover { background: var(--bsp-accent-fill-hover); color: #fff; }
.bsp-case-study .btn-ghost { font-size: 14px; color: var(--bsp-text-faint); text-align: center; transition: color var(--bsp-speed) var(--bsp-ease); }
.bsp-case-study .btn-ghost:hover { color: var(--bsp-text); }
.bsp-case-study .btn-ghost::after { content: ' →'; }

@media (max-width: 1024px) {
	.bsp-case-study .cs-split { grid-template-columns: 1fr; gap: 40px; margin-top: 64px; margin-bottom: 64px; }
	.bsp-case-study .results-bar { grid-template-columns: repeat(2, 1fr); }
	.bsp-case-study .result-item:nth-child(2) { border-right: none; }
	.bsp-case-study .cs-cta { flex-direction: column; align-items: flex-start; padding: 40px; }
}
@media (max-width: 640px) {
	.bsp-case-study .cs-hero { height: auto; min-height: 0; aspect-ratio: 4 / 5; --cs-hero-bottom: 64px; }
	.bsp-case-study .cs-hero-meta { position: static; align-items: flex-start; margin-top: 24px; }
	.bsp-case-study .meta-item, .bsp-case-study .meta-value { text-align: left; }
	.bsp-case-study .results-bar { grid-template-columns: 1fr 1fr; }
}

/* =============================================================
   08: TEAM · Page Équipe ([bsp_team_page], includes/team-page.php)
   -------------------------------------------------------------
   Grille de plusieurs membres par section d'expertise réelle --
   PAS le gabarit "une personne géante par section" de
   maquettes/equipe-2.html (voir la demande de Clément, 16
   septembre 2026 : une vraie équipe, pas une personne mise en
   avant). Seuls les jetons de design et l'esprit du bandeau
   d'intro sont repris. Cartes dans la même famille visuelle que
   .bsp-blog-catalog .cat-card (mêmes jetons de surface/bordure),
   pour que le site ait un seul vocabulaire de carte.
   Ajouté le 16 septembre 2026.
   ============================================================= */

.bsp-team-page { background: var(--bsp-bg); color: var(--bsp-text); padding: 0 0 var(--bsp-space-4); }

/* ── Bandeau d'intro ── */
.bsp-team-page .team-hero {
	max-width: 900px;
	margin: 0 auto;
	padding: 120px var(--bsp-gutter) 72px;
	text-align: center;
}
.bsp-team-page .team-hero-eyebrow {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: 0.25em;
	text-transform: uppercase;
	color: var(--bsp-accent-text);
	margin-bottom: var(--bsp-space-2);
}
.bsp-team-page .team-hero-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: var(--bsp-banner-title-size);
	line-height: 1.05;
	color: var(--bsp-text);
	margin-bottom: var(--bsp-space-3);
}
.bsp-team-page .team-hero-title em { font-style: italic; color: var(--bsp-accent-text); }
.bsp-team-page .team-hero-desc {
	font-size: 22px;
	font-weight: 400;
	color: var(--bsp-text-soft);
	line-height: 1.4;
	max-width: 560px;
	margin: 0 auto var(--bsp-space-4);
}
.bsp-team-page .team-hero-stats { display: flex; justify-content: center; gap: 56px; }
.bsp-team-page .team-stat-num {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 36px;
	line-height: 1;
	color: var(--bsp-text);
	font-variant-numeric: tabular-nums;
}
.bsp-team-page .team-stat-num em { font-style: normal; color: var(--bsp-accent-text); }
.bsp-team-page .team-stat-label {
	font-family: var(--bsp-font-label);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.15em;
	text-transform: uppercase;
	color: var(--bsp-text-faint);
	margin-top: 6px;
}

/* ── Sections par domaine ── */
.bsp-team-page .team-section {
	max-width: 1200px;
	margin: 0 auto;
	padding: 56px var(--bsp-gutter) 0;
	border-top: 1px solid var(--bsp-border-subtle);
}
.bsp-team-page .team-section:first-of-type { border-top: none; }
.bsp-team-page .team-section-header {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 24px;
	margin-bottom: 32px;
}
.bsp-team-page .team-section-title {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(22px, 2.2vw, 30px);
	color: var(--bsp-text);
}
.bsp-team-page .team-section-count {
	font-family: var(--bsp-font-label);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--bsp-text-faint);
	white-space: nowrap;
}

/* ── Grille de cartes ── */
.bsp-team-page .team-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: 20px;
	padding-bottom: 56px;
}
.bsp-team-page .team-card {
	background: var(--bsp-surface);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	overflow: hidden;
	display: flex;
	flex-direction: column;
	transition: border-color var(--bsp-speed) var(--bsp-ease), background var(--bsp-speed) var(--bsp-ease);
}
.bsp-team-page .team-card:hover {
	border-color: rgba(var(--bsp-accent-rgb), 0.45);
	background: rgba(var(--bsp-accent-rgb), 0.06);
}
.bsp-team-page .team-card-photo { aspect-ratio: 4 / 5; overflow: hidden; background: var(--bsp-bg-media); }
.bsp-team-page .team-card-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.bsp-team-page .team-card-body { padding: 18px 20px 20px; }
.bsp-team-page .team-card-name { font-family: var(--bsp-font-label); font-weight: 700; font-size: 15px; color: var(--bsp-text); letter-spacing: 0.01em; }
.bsp-team-page .team-card-role { font-size: 13px; font-weight: 400; color: var(--bsp-accent-text); margin-top: 3px; }
.bsp-team-page .team-card-bio { font-size: 17px; font-weight: 400; color: var(--bsp-text-soft); line-height: 1.55; margin-top: 10px; }
.bsp-team-page .team-card-linkedin {
	display: inline-block;
	margin-top: 12px;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 10px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--bsp-text-faint);
}
.bsp-team-page .team-card-linkedin:hover { color: var(--bsp-accent); }

/* ── CTA de clôture ── */
.bsp-team-page .team-cta {
	max-width: 1200px;
	margin: 72px auto 0;
	padding: 56px var(--bsp-gutter);
	background: rgba(var(--bsp-accent-rgb), 0.06);
	border: 1px solid rgba(var(--bsp-accent-rgb), 0.18);
	border-radius: var(--bsp-radius);
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 40px;
}
.bsp-team-page .team-cta-eyebrow { font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--bsp-accent-text); margin-bottom: 14px; }
.bsp-team-page .team-cta-title { font-family: var(--bsp-font-display); font-weight: 800; font-size: clamp(22px, 2.4vw, 34px); color: var(--bsp-text); line-height: 1.15; }
.bsp-team-page .team-cta-title em { font-style: italic; color: var(--bsp-accent-text); }
.bsp-team-page .team-cta .btn-primary {
	background: var(--bsp-accent-fill); color: #fff;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
	padding: 16px 32px; border-radius: 100px; white-space: nowrap;
	transition: background var(--bsp-speed) var(--bsp-ease);
}
.bsp-team-page .team-cta .btn-primary:hover { background: var(--bsp-accent-fill-hover); color: #fff; }

@media (max-width: 900px) {
	.bsp-team-page .team-hero { padding-top: 88px; }
	.bsp-team-page .team-section { padding-left: var(--bsp-gutter); padding-right: var(--bsp-gutter); }
	.bsp-team-page .team-cta { flex-direction: column; align-items: flex-start; }
}
@media (max-width: 640px) {
	.bsp-team-page .team-hero-stats { gap: 32px; }
	.bsp-team-page .team-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 14px; }
}


/* ── Ouverture du blogue : photo générique + texte HTML (19 sept. 2026) ──
   Racine /blog/ uniquement, sans filtre. Photo claire (mur à gauche, sujet à
   droite) : voile bleu de marque à gauche pour garder le texte blanc lisible,
   dans les deux thèmes (le bandeau reste en palette sombre). */
.bsp-blog-catalog .filter-banner.has-intro { height: max(440px, 26.5vw); } /* 3,77:1 : photo 2172×724 + bande de puces, comme la maquette */
.bsp-blog-catalog .filter-banner-bg-img--intro { object-position: 78% top; }
.bsp-blog-catalog .filter-banner.has-intro .filter-banner-overlay {
	background:
		linear-gradient(180deg, rgba(6,30,60,0.55) 0%, transparent 30%),
		linear-gradient(100deg, rgba(6,30,60,0.94) 0%, rgba(6,30,60,0.86) 34%, rgba(6,30,60,0.45) 52%, transparent 72%),
		linear-gradient(0deg, rgba(6,30,60,0.45) 0%, transparent 34%);
}
.bsp-blog-catalog .filter-banner.has-intro .filter-banner-eyebrow {
	display: flex; align-items: center; gap: 14px;
	font-size: 12px; color: var(--bsp-accent-hover); margin-bottom: 18px;
}
.bsp-blog-catalog .filter-banner-sep { flex: 0 1 450px; height: 1px; background: rgba(var(--bsp-accent-rgb),0.6); }
.bsp-blog-catalog .filter-banner-title em { font-style: normal; color: var(--bsp-accent-hover); }
.bsp-blog-catalog .filter-banner.has-intro .filter-banner-title { max-width: 720px; }
.bsp-blog-catalog .filter-banner-sub {
	font-family: var(--bsp-font-body); font-size: 23.5px; font-weight: 400; line-height: 1.5;
	color: rgba(255,255,255,0.88); max-width: 560px; margin-top: 18px;
}
@media (max-width: 640px) {
	.bsp-blog-catalog .filter-banner.has-intro { height: auto; min-height: 460px; }
	.bsp-blog-catalog .filter-banner-sub { font-size: 21px; }
}

/* Icônes d'expertise (Font Awesome Light) : la taille se règle sur le
   conteneur, jamais sur la balise <i> (font: 1em la réinitialise). */
.bsp-blog-catalog .chip .chip-icon { font-size: 15px; line-height: 1; display: inline-flex; margin-right: 8px; }


/* ── Avatar d'auteur sur les cartes (19 sept. 2026) ──────────────────
   Rond de 28 px : photo de la fiche équipe, sinon cercle générique
   (icône Font Awesome Light). Taille d'icône sur le conteneur. */
.meta-avatar {
	display: inline-flex; align-items: center; justify-content: center;
	width: 28px; height: 28px; border-radius: 50%; overflow: hidden;
	vertical-align: middle; margin-right: 8px; flex: 0 0 auto;
	background: var(--bsp-chip-associe-bg);
	border: 1px solid var(--bsp-border-subtle);
	color: var(--bsp-text-faint);
	font-size: 13px; line-height: 1;
}
.meta-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.meta-avatar + .meta-name { vertical-align: middle; }

/* Logo Zoho, très petit, sous le libellé « Application Zoho ». Le fichier
   est blanc : en mode clair on le passe en gris foncé pour qu'il reste visible. */
.bsp-blog-catalog .filter-label-col { width: 168px; flex-shrink: 0; }
.bsp-blog-catalog .filter-label-col .filter-label { width: auto; }
.bsp-blog-catalog .filter-zoho-mark { display: block; height: 26px; width: auto; margin-top: 10px; opacity: .7; }
:root[data-bsp-theme="light"] .bsp-blog-catalog .filter-zoho-mark { filter: brightness(0); opacity: .45; }
:root[data-bsp-theme="light"] .bsp-blog-catalog .filter-zoho-mark img { filter: brightness(0); opacity: .45; }

.bsp-blog-catalog .filter-bsp-mark {
	display: block;
	height: 26px;
	width: auto;
	margin-top: 10px;
	opacity: .7;
}
:root[data-bsp-theme="light"] .bsp-blog-catalog .filter-bsp-mark {
	filter: brightness(0);
	opacity: .45;
}

/* ── Hauteur des cartes : optimisation légère, surtout le pied auteur ·
   date (19 sept. 2026). Filet et rangée resserrés, écart de groupe
   24 → 18 px, auteur et date tenus sur une seule ligne. Structure et
   photo encadrée inchangées. */
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l {
	& .et_pb_column > .et_pb_group { gap: 8px 0; }
	& .et_pb_column > .et_pb_group > .et_pb_image { margin-bottom: 14px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(5) { margin-bottom: 12px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6),
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) { margin-top: 8px; padding-top: 10px; padding-bottom: 12px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6) { flex: 0 1 auto; padding-left: 26px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) { flex: 1 1 auto; padding-left: 4px; padding-right: 36px; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(7) .et_pb_text_inner p { white-space: nowrap; }
	& .et_pb_column > .et_pb_group > .et_pb_text:nth-child(6) .et_pb_text_inner p { display: flex; align-items: center; white-space: nowrap; }
	& .et_pb_column > .et_pb_group::after { bottom: 12px; }
}

/* ── Étude de cas : section « image pleine largeur » (19 sept. 2026) ── */
.bsp-case-study .cs-figure { margin: 56px 0; }
.bsp-case-study .cs-figure img { display: block; width: 100%; height: auto; border-radius: 8px; }
.bsp-case-study .cs-figure figcaption { margin-top: 12px; font-size: 17px; color: var(--bsp-text-faint); }


/* =============================================================
   Étude de cas: gabarit Theme Builder (20 septembre 2026)
   Les modules Divi (section > rangée > colonne > texte) portent le balisage
   de la maquette ; on neutralise seulement l'emballage de Divi pour que les
   règles .bsp-case-study ci-dessus s'appliquent telles quelles.
   Emplacements vides (résultats, points forts, citations, méta) : masqués.
   ============================================================= */
body.bsp-case-study,
body.bsp-case-study #page-container,
body.bsp-case-study #main-content,
body.bsp-case-study .et-l--body { background: var(--bsp-bg) !important; color: var(--bsp-text); }
body.bsp-case-study .bsp-cs-section.et_pb_section { padding: 0 !important; background: transparent !important; }
body.bsp-case-study .bsp-cs-section .et_pb_row { width: 100% !important; max-width: none !important; padding: 0 !important; }
body.bsp-case-study .bsp-cs-section .et_pb_column { margin: 0 !important; padding: 0 !important; }
body.bsp-case-study .bsp-cs-section .et_pb_module { margin: 0 !important; }
body.bsp-case-study .bsp-cs-section .et_pb_text_inner { color: inherit; }
body.bsp-case-study .bsp-cs-section.cs-body.et_pb_section { max-width: 1200px; margin: 0 auto; padding: 0 var(--bsp-gutter) !important; }
body.bsp-case-study .cs-body .cs-body { padding: 0; }

body.bsp-case-study .result-item:has(.result-num:empty),
body.bsp-case-study .cs-feature:has(.cs-feature-title:empty),
body.bsp-case-study .meta-item:has(.meta-value:empty),
body.bsp-case-study .et_pb_row:has(.cs-quote blockquote:empty),
body.bsp-case-study .et_pb_row:has(.cs-quote-center blockquote:empty),
body.bsp-case-study .kicker-label:empty,
body.bsp-case-study .cs-cta-eyebrow:empty,
body.bsp-case-study .cs-hero-sub:empty { display: none; }
body.bsp-case-study .results-bar { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); grid-auto-flow: column; }
body.bsp-case-study .cs-hero-kicker:has(.kicker-label:empty) .kicker-divider { display: none; }
body.bsp-case-study .author-avatar:empty { display: none; }
body.bsp-case-study .cs-hero-bg iframe[src=""], body.bsp-case-study .cs-hero-bg img[src=""] { display: none; }

/* =============================================================
   En-tête et pied de page GLOBAUX: règle de structure (20 sept. 2026)

   Ces deux gabarits Theme Builder sont partagés par toutes les pages.
   Leur remise à zéro (section sans padding, rangée pleine largeur) était
   écrite à deux classes, et cela suffisait tant que Divi servait son CSS
   depuis un fichier statique. Quand Divi sert à la place son « CSS critique »
   en ligne, il émet ses règles génériques préfixées « .et-db #et-boc .et-l »
   (padding 54px, fond blanc, rangée à 80 % / 1080px) : plus spécifiques, elles
   l'emportent et l'en-tête comme le pied se cassent. Cela dépend de la page
   et de l'état du cache de Divi, pas du contenu : n'importe quelle page
   nouvelle peut y tomber.
   RÈGLE : les règles qui structurent l'en-tête et le pied sont préfixées
   par « .et-db #et-boc .et-l.et-l--header » / « .et-l--footer », donc plus
   spécifiques que celles de Divi dans les deux modes. Aucune règle par
   page, aucun !important. Ne pas les réécrire par page.
   ============================================================= */
.et-db #et-boc .et-l.et-l--header .bsp-home-section.et_pb_section {
	padding: 0;
	margin: 0;
	background-color: transparent;
}
.et-db #et-boc .et-l.et-l--header .bsp-home-section .et_pb_row,
.et-db #et-boc .et-l.et-l--footer .bsp-home-section .et_pb_row {
	width: 100%;
	max-width: none;
	margin: 0;
	padding: 0;
}
.et-db #et-boc .et-l.et-l--header .bsp-home-section .et_pb_column,
.et-db #et-boc .et-l.et-l--footer .bsp-home-section .et_pb_column { margin: 0; padding: 0; }
.et-db #et-boc .et-l.et-l--footer .bsp-home-footer.et_pb_section {
	background-color: var(--bsp-footer-surface);
	padding: 72px var(--bsp-gutter) 32px;
	margin: 0;
}
.et-db #et-boc .et-l.et-l--footer .bsp-home-footer-top.et_pb_row { padding-bottom: 56px; }
.et-db #et-boc .et-l.et-l--header .bsp-home-section .et_pb_module,
.et-db #et-boc .et-l.et-l--footer .bsp-home-section .et_pb_module { margin-bottom: 0; }
/* Le clearfix de Divi devient une cellule de la grille du pied de page (voir plus haut). */
.et-db #et-boc .et-l.et-l--footer .bsp-home-footer-top.et_pb_row::before,
.et-db #et-boc .et-l.et-l--footer .bsp-home-footer-top.et_pb_row::after { display: none; }

/* Fonds des sections des gabarits Blog (catalogue, article): même règle de structure
   que l'en-tête et le pied ci-dessus : le fond blanc générique de Divi
   (« .et-db #et-boc .et-l .et_pb_section », CSS critique) l'emporterait sur les
   règles à faible spécificité plus haut, et la page passerait au blanc dans les deux thèmes.
   Fonds seulement : réécrire aussi les paddings changerait la cascade des blocs
   de carte (vérifié : la grille se décale). */
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l .et_pb_section { background-color: var(--bsp-bg); }
body.single-project.et-db #et-boc .et-l .bsp-article-cover.et_pb_section { background-color: var(--bsp-bg-media); }
body.single-project.et-db #et-boc .et-l .bsp-article-cover ~ .et_pb_section { background-color: var(--bsp-bg); }


/* =============================================================
   Case Studies: page de liste (Theme Builder « Case Studies Archive Page »,
   corps #679, Loop Builder). 20 septembre 2026.
   Une grande carte rectangulaire par étude : photo à gauche, texte à droite.
   Les règles de structure (padding, largeur, marges de Divi) sont préfixées
   « .et-db #et-boc .et-l » : voir la règle d'en-tête / pied plus haut.
   ============================================================= */
body.post-type-archive-case-study { background: var(--bsp-bg); color: var(--bsp-text); }

.et-db #et-boc .et-l.et-l--body :is(.bsp-page-hero, .bsp-cs-list).et_pb_section { padding: 0; background-color: transparent; }
.et-db #et-boc .et-l.et-l--body :is(.bsp-page-hero, .bsp-cs-list) .et_pb_row { width: 100%; max-width: none; padding: 0; margin: 0; }
.et-db #et-boc .et-l.et-l--body :is(.bsp-page-hero, .bsp-cs-list) .et_pb_column { margin: 0; padding: 0; }
.et-db #et-boc .et-l.et-l--body :is(.bsp-page-hero, .bsp-cs-list) .et_pb_module { margin-bottom: 0; }

/* Bandeau : reste sombre dans les deux thèmes, comme les autres bandeaux. */
.bsp-page-hero .ph-inner {
	background: linear-gradient(135deg, var(--bsp-bg-deep) 0%, var(--bsp-bg-media) 100%);
	color: #fff;
	/* Même gabarit que l'ouverture du blog : hauteur, départ du texte à
	   130 px, fondu de bas de bandeau (voir « Bandeaux de page »). */
	box-sizing: border-box;
	min-height: var(--bsp-banner-min-h);
	padding: 130px var(--bsp-gutter) calc(var(--bsp-banner-fade) + 48px);
}
.bsp-page-hero .ph-eyebrow {
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 10px;
	letter-spacing: 0.35em; text-transform: uppercase; color: var(--bsp-accent-hover);
	margin-bottom: var(--bsp-space-2);
}
.bsp-page-hero .ph-title {
	font-family: var(--bsp-font-display); font-weight: 800;
	font-size: var(--bsp-banner-title-size); line-height: 1.05; letter-spacing: -0.02em;
	color: #fff; max-width: 760px; margin: 0 0 var(--bsp-space-3); padding: 0;
}
.bsp-page-hero .ph-title em { font-style: italic; color: var(--bsp-accent-hover); }
.bsp-page-hero .ph-sub { font-size: 23.5px; font-weight: 400; line-height: 1.4; color: rgba(255,255,255,0.68); max-width: 620px; margin: 0; }

/* Liste */
.et-db #et-boc .et-l.et-l--body .bsp-cs-list.et_pb_section { padding: 72px var(--bsp-gutter) 110px; }
.et-db #et-boc .et-l.et-l--body .bsp-cs-list .et_pb_column { display: flex; flex-direction: column; gap: 32px; }

.et-db #et-boc .et-l.et-l--body .bsp-cs-card.et_pb_group {
	position: relative;
	display: grid;
	grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
	width: 100%;
	min-height: 380px;
	padding: 0;
	gap: 0;
	overflow: hidden;
	background: var(--bsp-surface);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	cursor: pointer;
	transition: border-color var(--bsp-speed) var(--bsp-ease), transform var(--bsp-speed) var(--bsp-ease);
}
.bsp-cs-card:hover { border-color: rgba(var(--bsp-accent-rgb), 0.45); transform: translateY(-3px); }

.bsp-cs-card .cs-card-media.et_pb_image { position: relative; margin: 0; overflow: hidden; min-height: 100%; }
.bsp-cs-card .cs-card-media .et_pb_image_wrap,
.bsp-cs-card .cs-card-media img { display: block; width: 100%; height: 100%; max-width: none; }
.bsp-cs-card .cs-card-media img { object-fit: cover; object-position: center 30%; transition: transform 0.8s var(--bsp-ease); }
.bsp-cs-card:hover .cs-card-media img { transform: scale(1.04); }
.bsp-cs-card .cs-card-media::after {
	content: ''; position: absolute; inset: 0; pointer-events: none;
	background: linear-gradient(to right, transparent 60%, rgba(6,8,16,0.35) 100%);
}

.bsp-cs-card .cs-card-body.et_pb_text { position: relative; display: flex; flex-direction: column; justify-content: center; padding: 56px 72px 56px 60px; }
.bsp-cs-card .cs-card-body .et_pb_text_inner { display: flex; flex-direction: column; justify-content: center; }
.bsp-cs-card .cs-card-kicker { display: flex; align-items: center; gap: 14px; margin-bottom: var(--bsp-space-2); }
.bsp-cs-card .cs-card-sector {
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 10px;
	letter-spacing: 0.25em; text-transform: uppercase; color: var(--bsp-accent-text);
}
.bsp-cs-card .cs-card-sep { width: 28px; height: 1px; background: var(--bsp-border-strong); }
.bsp-cs-card .cs-card-client {
	font-family: var(--bsp-font-label); font-weight: 600; font-size: 11px;
	letter-spacing: 0.12em; text-transform: uppercase; color: var(--bsp-text-faint);
}
.bsp-cs-card .cs-card-title {
	font-family: var(--bsp-font-display); font-weight: 800;
	font-size: clamp(28px, 2.6vw, 40px); line-height: 1.1; letter-spacing: -0.02em;
	color: var(--bsp-text); margin: 0 0 var(--bsp-space-1); padding: 0;
}
.bsp-cs-card .cs-card-title em { font-style: italic; color: var(--bsp-accent-text); }
.bsp-cs-card .cs-card-sub {
	font-size: 22px; font-weight: 400; line-height: 1.4; color: var(--bsp-text-soft);
	max-width: 52ch; margin: 0; padding: 0;
	display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.bsp-cs-card .cs-card-arrow {
	position: absolute; right: 40px; bottom: 36px;
	width: 44px; height: 44px; display: grid; place-items: center;
	border: 1px solid var(--bsp-border-strong); border-radius: 50%;
	color: var(--bsp-text); font-size: 18px;
	transition: background var(--bsp-speed) var(--bsp-ease), color var(--bsp-speed) var(--bsp-ease), border-color var(--bsp-speed) var(--bsp-ease), transform var(--bsp-speed) var(--bsp-ease);
}
.bsp-cs-card:hover .cs-card-arrow { background: var(--bsp-accent-fill); border-color: var(--bsp-accent-fill); color: #fff; transform: translateX(4px); }

@media (max-width: 1024px) {
	.bsp-page-hero .ph-inner { padding: 150px 40px 64px; }
	.et-db #et-boc .et-l.et-l--body .bsp-cs-list.et_pb_section { padding: 48px 24px 80px; }
	.et-db #et-boc .et-l.et-l--body .bsp-cs-card.et_pb_group { grid-template-columns: 1fr; min-height: 0; }
	.bsp-cs-card .cs-card-media.et_pb_image { aspect-ratio: 16 / 9; min-height: 0; }
	.bsp-cs-card .cs-card-body.et_pb_text { padding: 36px 32px 88px; }
}


/* =============================================================
   Étude de cas: vidéo du héros (commandes), « Go back », et
   bandeau de la liste : image floue + lumière discrète. 20 septembre 2026.
   ============================================================= */

/* Vidéo fichier : même cadrage que l'image et l'iframe du héros. */
.bsp-case-study .cs-hero-bg video.cs-hero-video {
	position: absolute; inset: 0; width: 100%; height: 100%;
	object-fit: cover; object-position: center 30%;
}

/* Commandes : lecture / pause au centre, son en bas au centre (au niveau de « Go back »). */
.bsp-case-study .cs-video-controls {
	/* Lecture/pause et son côte à côte, en bas au centre, au niveau de « Go back ». */
	position: absolute; left: 0; right: 0; bottom: var(--cs-hero-bottom); z-index: 20;
	display: flex; justify-content: center; align-items: center; gap: 14px;
	pointer-events: none;
}
.bsp-case-study .cs-vc-btn {
	pointer-events: auto;
	display: grid; place-items: center;
	border: 1px solid rgba(255,255,255,0.28);
	background: rgba(6,8,16,0.42);
	-webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
	color: #fff; border-radius: 50%; cursor: pointer; padding: 0;
	transition: opacity var(--bsp-speed) var(--bsp-ease), background var(--bsp-speed) var(--bsp-ease), transform var(--bsp-speed) var(--bsp-ease);
}
.bsp-case-study .cs-vc-btn:hover { background: rgba(var(--bsp-accent-rgb), 0.55); }
.bsp-case-study .cs-vc-btn:focus-visible { outline: 2px solid #fff; outline-offset: 3px; opacity: 1; }
.bsp-case-study .cs-vc-btn :is(i, svg) { font-size: 20px; line-height: 1; height: 1em; width: auto; }
.bsp-case-study .cs-vc-playpause, .bsp-case-study .cs-vc-mute { width: 46px; height: 46px; }   /* même taille, même style */

/* Une seule icône à la fois, selon l'état. */
.bsp-case-study .cs-vc-playpause .fa-play,
.bsp-case-study .cs-vc-mute .fa-volume-high { display: none; }
.bsp-case-study .cs-hero.is-paused .cs-vc-playpause .fa-pause { display: none; }
.bsp-case-study .cs-hero.is-paused .cs-vc-playpause .fa-play { display: block; padding-left: 3px; }
.bsp-case-study .cs-hero:not(.is-muted) .cs-vc-mute .fa-volume-xmark { display: none; }
.bsp-case-study .cs-hero:not(.is-muted) .cs-vc-mute .fa-volume-high { display: block; }


/* « Go back » et lien vers la liste, sous le titre. */
.bsp-case-study .cs-hero-nav { display: flex; align-items: center; gap: 22px; margin-top: var(--bsp-space-3); flex-wrap: wrap; }
.bsp-case-study .cs-back-btn {
	display: inline-flex; align-items: center; gap: 10px;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 10px;
	letter-spacing: 0.22em; text-transform: uppercase;
	color: #fff; text-decoration: none;
	padding: 10px 18px; border: 1px solid rgba(255,255,255,0.3); border-radius: 100px;
	background: rgba(255,255,255,0.06);
	transition: background var(--bsp-speed) var(--bsp-ease), border-color var(--bsp-speed) var(--bsp-ease);
}
.bsp-case-study .cs-back-btn:hover { background: rgba(var(--bsp-accent-rgb), 0.4); border-color: rgba(255,255,255,0.5); color: #fff; }
.bsp-case-study .cs-back-btn :is(i, svg) { font-size: 12px; height: 1em; width: auto; }
.bsp-case-study .cs-back-link { font-size: 13px; color: rgba(255,255,255,0.6); text-decoration: underline; text-underline-offset: 4px; text-decoration-color: rgba(255,255,255,0.25); }
.bsp-case-study .cs-back-link:hover { color: #fff; text-decoration-color: rgba(255,255,255,0.6); }

/* Bandeau de la liste : image très floue + deux nappes de lumière qui dérivent (13 s et 17 s, image 19 s).
   Reste sombre dans les deux thèmes ; sans image, le dégradé bleu seul + la lumière. */
.bsp-page-hero .ph-inner { position: relative; overflow: hidden; isolation: isolate; }
.bsp-page-hero .ph-bg { position: absolute; inset: 0; z-index: -2; overflow: hidden; }
.bsp-page-hero .ph-bg img {
	width: 100%; height: 100%; object-fit: cover;
	filter: blur(44px) saturate(1.15);
	transform: scale(1.25);
	opacity: 0.26;
	will-change: transform, opacity;
	animation: bspListDrift 19s ease-in-out infinite alternate;
}
.bsp-page-hero .ph-glow { position: absolute; inset: 0; z-index: -1; pointer-events: none; overflow: hidden; }
.bsp-page-hero .ph-glow i {
	position: absolute; border-radius: 50%; mix-blend-mode: screen; filter: blur(30px);
	will-change: transform;
}
.bsp-page-hero .ph-glow i:nth-child(1) {
	width: 58vw; height: 58vw; max-width: 900px; max-height: 900px; left: -8%; top: -60%;
	background: radial-gradient(circle, rgba(46,120,255,0.30) 0%, transparent 62%);
	animation: bspListGlowA 13s ease-in-out infinite alternate;
}
.bsp-page-hero .ph-glow i:nth-child(2) {
	width: 46vw; height: 46vw; max-width: 720px; max-height: 720px; right: -6%; bottom: -70%;
	background: radial-gradient(circle, rgba(90,190,255,0.20) 0%, transparent 60%);
	animation: bspListGlowB 17s ease-in-out infinite alternate;
}
@keyframes bspListGlowA { from { transform: translate3d(0, 0, 0) scale(1); } to { transform: translate3d(14vw, 14%, 0) scale(1.12); } }
@keyframes bspListGlowB { from { transform: translate3d(0, 0, 0) scale(1.05); } to { transform: translate3d(-12vw, -18%, 0) scale(0.94); } }
/* Dérive très lente de l'image floue (léger zoom + déplacement + respiration de l'opacité). */
@keyframes bspListDrift {
	0%   { transform: scale(1.25) translate3d(-2.5%, -1.5%, 0); opacity: 0.22; }
	100% { transform: scale(1.42) translate3d(2.5%, 2%, 0);     opacity: 0.32; }
}
@media (prefers-reduced-motion: reduce) { .bsp-page-hero .ph-glow i, .bsp-page-hero .ph-bg img { animation: none; } }
.bsp-page-hero .ph-inner > :not(.ph-bg):not(.ph-glow) { position: relative; z-index: 1; }

@media (max-width: 1024px) {
}

/* Barre de résultats : le filet sépare des voisins visibles ; les emplacements vides (masqués) ne laissent plus de filet orphelin à droite. */
body.bsp-case-study .result-item { border-right: none; }
body.bsp-case-study .result-item + .result-item { border-left: 1px solid rgba(255,255,255,0.22); }

/* =============================================================
   EN-TÊTES DE PAGE: surtitre + filet bleu (référence : le blog)
   -------------------------------------------------------------
   Un seul geste pour tous les bandeaux : surtitre Montserrat 12 px
   suivi d'un filet de 1 px à l'accent (60 %). Le blog le porte par un
   <span class="filter-banner-sep"> ; les autres bandeaux le tirent d'un
   ::after, sans toucher au balisage des modules Divi. Une page qui a
   besoin d'un autre gabarit reçoit sa propre classe, jamais une
   retouche de celle-ci.
   ============================================================= */
.bsp-page-hero .ph-eyebrow,
.bsp-team-page .team-hero-eyebrow {
	display: flex; align-items: center; gap: 14px;
	font-size: 12px; letter-spacing: 0.25em;
}
.bsp-page-hero .ph-eyebrow { margin-bottom: 18px; }
.bsp-page-hero .ph-eyebrow::after,
.bsp-team-page .team-hero-eyebrow::before,
.bsp-team-page .team-hero-eyebrow::after {
	content: ""; height: 1px; background: rgba(var(--bsp-accent-rgb), 0.6);
}
.bsp-page-hero .ph-eyebrow::after { flex: 0 1 450px; }
/* Titre centré (équipe) : un filet de chaque côté, plus court. */
.bsp-team-page .team-hero-eyebrow { justify-content: center; }
.bsp-team-page .team-hero-eyebrow::before,
.bsp-team-page .team-hero-eyebrow::after { flex: 0 1 90px; }

/* =============================================================
   BANDEAUX DE PAGE: hauteur et fondu communs (référence : le blog)
   -------------------------------------------------------------
   Directive de Clément (20 sept. 2026) : tout élément répétitif du site
   se règle UNE fois et se lit pareil partout. Les bandeaux (blog,
   liste des case studies, héros d'une étude de cas, couverture d'article)
   partagent donc :
     · --bsp-banner-min-h         hauteur minimale (celle du blog) ;
     · --bsp-banner-fade          longueur du fondu vers le fond de page ;
     · --bsp-banner-fade-gradient le fondu lui-même : 9 paliers suivant
       une courbe smoothstep (3t² − 2t³), vers --bsp-bg: donc crème en
       clair, sombre en sombre, sans bande grise ni paliers visibles.
   Les paliers sont en pourcentage de la longueur : changer le jeton
   change tous les fondus ensemble. Un nouveau bandeau ajoute son
   sélecteur à la liste ci-dessous, il n'invente pas son propre dégradé.
   UN SEUL CHIFFRE pour tout le site : 36 px, à toutes les largeurs (réduit de moitié le 20 sept. 2026, base de référence = le fondu réel du blog, 72 px). Le blog garde ses paliers en pixels, mêmes valeurs : de 76 à 112 px dans la rangée de puces. Si le jeton change, le blog se recalcule à la main : c'est la seule exception, notée ici.
   ============================================================= */
:root {
	--bsp-banner-min-h: max(440px, 26.5vw);
	--bsp-banner-fade: 36px;
	--bsp-banner-fade-gradient: linear-gradient(180deg,
		color-mix(in srgb, var(--bsp-bg) 0%, transparent) 0%,
		color-mix(in srgb, var(--bsp-bg) 4%, transparent) 12.5%,
		color-mix(in srgb, var(--bsp-bg) 16%, transparent) 25%,
		color-mix(in srgb, var(--bsp-bg) 32%, transparent) 37.5%,
		color-mix(in srgb, var(--bsp-bg) 50%, transparent) 50%,
		color-mix(in srgb, var(--bsp-bg) 68%, transparent) 62.5%,
		color-mix(in srgb, var(--bsp-bg) 84%, transparent) 75%,
		color-mix(in srgb, var(--bsp-bg) 96%, transparent) 87.5%,
		var(--bsp-bg) 100%);
}
@media (max-width: 640px)  { :root { --bsp-banner-min-h: 460px; } }

.bsp-page-hero .ph-inner::after,
.bsp-case-study .cs-hero::after {
	content: "";
	position: absolute; left: 0; right: 0; bottom: -1px; /* -1 px : pas de filet entre deux sections */
	height: calc(var(--bsp-banner-fade) + 1px);
	z-index: 1; pointer-events: none;
	background: var(--bsp-banner-fade-gradient);
}

/* =============================================================
   PAGES: bandeau commun + gabarits Theme Builder « All Pages » et
   « Expertise Pages » (20 septembre 2026). Voir includes/page-templates.php.
   -------------------------------------------------------------
   Le bandeau (.bsp-page-hero, classes .ph-*) est le MÊME que celui de la
   liste des case studies : hauteur, titre, filet du surtitre, fond flou
   animé et fondu viennent des blocs partagés plus haut. Ici ne vivent que
   ce que les pages ajoutent : le fond de page, le contenu sous le bandeau
   et le gabarit d'expertise. Règles de structure préfixées
   « .et-db #et-boc .et-l » (critical CSS de Divi).
   ============================================================= */
body.bsp-has-page-hero { background: var(--bsp-bg); color: var(--bsp-text); }
/* Divi peint #main-content en blanc : on le rend au jeton de fond, dans les deux thèmes. */
body.bsp-has-page-hero #main-content { background-color: var(--bsp-bg); }

/* Contenu libre de la page (Post Content) sous le bandeau. */
.et-db #et-boc .et-l.et-l--body .bsp-page-body.et_pb_section { padding: 0; background-color: transparent; }
.bsp-page-body .et_pb_post_content { padding-block: 40px 96px; }
.bsp-page-body .et_pb_post_content > :is(p, h1, h2, h3, h4, h5, h6, ul, ol, blockquote, table) {
	max-width: 860px; margin-inline: auto; padding-inline: var(--bsp-gutter); box-sizing: content-box;
}

/* Page Équipe : le bandeau porte déjà surtitre, titre et accroche ; on garde les chiffres et les grilles. */
body.bsp-has-page-hero .bsp-team-page .team-hero :is(.team-hero-eyebrow, .team-hero-title, .team-hero-desc) { display: none; }
body.bsp-has-page-hero .bsp-team-page .team-hero { padding-top: 56px; }

/* ── Gabarit d'expertise ── */
.et-db #et-boc .et-l.et-l--body .bsp-xp-section.et_pb_section { padding: 0; background-color: transparent; }
.et-db #et-boc .et-l.et-l--body .bsp-xp-section .et_pb_row { width: 100%; max-width: none; padding: 0; margin: 0; }
.et-db #et-boc .et-l.et-l--body .bsp-xp-section .et_pb_column { margin: 0; padding: 0; }
.et-db #et-boc .et-l.et-l--body .bsp-xp-section .et_pb_module { margin-bottom: 0; }

.bsp-xp-section .xp-intro { padding: 72px var(--bsp-gutter) 8px; }
.bsp-xp-section .xp-h2 {
	font-family: var(--bsp-font-display); font-weight: 800; font-size: clamp(26px, 2.4vw, 36px);
	line-height: 1.15; letter-spacing: -0.01em; color: var(--bsp-text); max-width: 760px; margin: 0 0 20px; padding: 0;
}
.bsp-xp-section .xp-h2 em { font-style: italic; color: var(--bsp-accent-text); }
.bsp-xp-section .xp-intro-text { font-size: 23.5px; line-height: 1.4; color: var(--bsp-text-soft); max-width: 760px; }
.bsp-xp-section .xp-intro-text p { margin: 0 0 1em; padding: 0; }

.bsp-xp-section .xp-grid {
	display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px;
	padding: 40px var(--bsp-gutter) 8px;
}
.bsp-xp-section .xp-card {
	background: var(--bsp-surface); border: 1px solid var(--bsp-border); border-radius: var(--bsp-radius);
	padding: 30px 32px 32px;
}
.bsp-xp-section .xp-card-title { font-family: var(--bsp-font-display); font-weight: 700; font-size: 21px; line-height: 1.25; color: var(--bsp-text); margin: 0 0 12px; padding: 0; }
.bsp-xp-section .xp-card-text { font-size: 19.5px; line-height: 1.45; color: var(--bsp-text-soft); margin: 0; }


/* Appel à l'action : bande sombre dans les deux thèmes (comme les bandeaux). */
.bsp-xp-section .xp-cta {
	display: flex; align-items: center; justify-content: space-between; gap: 32px; flex-wrap: wrap;
	margin: 56px var(--bsp-gutter) 110px; padding: 44px 52px; border-radius: var(--bsp-radius);
	background: linear-gradient(135deg, var(--bsp-bg-deep) 0%, var(--bsp-bg-media) 100%); color: #fff;
}
.bsp-xp-section .xp-cta-title { font-family: var(--bsp-font-display); font-weight: 800; font-size: clamp(22px, 2.2vw, 30px); line-height: 1.2; color: #fff; margin: 0; padding: 0; }
.bsp-xp-section .xp-cta-title em { font-style: italic; color: var(--bsp-accent-hover); }
.bsp-xp-section .xp-cta-btn {
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
	background: var(--bsp-accent-fill); color: #fff; padding: 16px 32px; border-radius: 100px; white-space: nowrap;
	transition: background var(--bsp-speed) var(--bsp-ease);
}
.bsp-xp-section .xp-cta-btn:hover { background: var(--bsp-accent-fill-hover); color: #fff; }

@media (max-width: 1024px) { .bsp-xp-section .xp-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) {
	.bsp-xp-section .xp-grid { grid-template-columns: 1fr; }
	.bsp-xp-section .xp-cta { padding: 32px 28px; }
}

/* Défilement horizontal : aucune page ne doit se déplacer de gauche à droite.
   Signalé sur l'accueil (≈ 216 px de course à 1920 px) : des pistes en défilement
   (marquee des projets, fond du hero à l'échelle) dépassent la fenêtre. `clip`,
   contrairement à `hidden`, ne crée pas de conteneur de défilement : le hero
   `position: sticky` continue de fonctionner. */
html, body { overflow-x: clip; }


/* =============================================================
   FILET ENTRE SECTIONS: une seule règle, tout le site
   -------------------------------------------------------------
   Toute section Divi qui en suit une autre reçoit le même filet
   de 1 px (jeton --bsp-section-rule, clair et sombre). Une section
   ajoutée plus tard, sur n'importe quelle page, l'hérite d'office :
   ne jamais déclarer de border-top sur une section individuelle.
   Exceptions voulues : la section qui suit un bandeau de page (le
   dégradé du bandeau se fond dans le fond : un filet le couperait),
   et la section qui suit le hero animé de l'accueil
   (le panneau monte par-dessus). La bande bleue « Companies that trust us »
   est encadrée de deux filets (essai demandé le 20 sept. 2026).
   ============================================================= */
.et_builder_inner_content > .et_pb_section + .et_pb_section {
	border-top: var(--bsp-section-rule);
	/* Le fond (couleur ou photo) s'arrête au bord intérieur : sans cela,
	   une photo de fond passait sous le filet et le rendait blanc et dur
	   (constaté sous « Solutions », 20 sept. 2026). */
	background-clip: padding-box;
}
.et_builder_inner_content > .bsp-hero-wrapper + .et_pb_section,
.et_builder_inner_content > .bsp-article-cover + .et_pb_section,
.et_builder_inner_content > :is(.bsp-page-hero, .cs-hero, .filter-banner, .et_pb_section:has(.bsp-page-hero, .cs-hero, .filter-banner)) + .et_pb_section {
	border-top: 0;
}


/* ════════════════════════════════════════
   PAGE DNA / ABOUT -- corps de page (/about/dna/)
   Ajoute par Claude, 22 sept. 2026, a la demande de Clement : contenu de
   la page sous l'en-tete existant (.bsp-page-hero, NON modifie ici -- ni
   structure, ni degrade, ni hauteur, ni photo). Base sur la maquette
   approuvee novatize-inspired/index.html (stats, historique, bureaux,
   valeurs, team-cta). Shortcode [bsp_dna_page], voir includes/functions.php.
════════════════════════════════════════ */
.bsp-dna-page { background: var(--bsp-bg); }

.bsp-dna-stats-grid { display: grid; grid-template-columns: repeat(4,1fr); max-width: 1240px; margin: 0 auto; gap: 24px; text-align: left; }

.bsp-dna-history { padding: var(--bsp-section-pad); max-width: 1240px; margin: 0 auto; }
.bsp-dna-history-grid { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 72px; align-items: start; }
.bsp-dna-history-grid h2 { font-family: var(--bsp-font-display); font-weight: 800; font-size: clamp(26px,2.6vw,34px); line-height: 1.2; color: var(--bsp-text); max-width: 640px; margin-bottom: var(--bsp-space-3); }
.bsp-dna-history-grid p { font-family: var(--bsp-font-body); font-weight: 400; font-size: 20px; line-height: 1.45; color: var(--bsp-text-soft); max-width: 60ch; margin-bottom: var(--bsp-space-2); }
.bsp-dna-history-grid strong { color: var(--bsp-text); font-weight: 600; }
.bsp-dna-quote { border-left: 3px solid var(--bsp-accent); padding: 2px 0 2px 26px; font-family: var(--bsp-font-display); font-style: italic; font-weight: 700; font-size: 20px; line-height: 1.5; color: var(--bsp-text); }
.bsp-dna-quote span { display: block; margin-top: 16px; font-family: var(--bsp-font-label); font-style: normal; font-weight: 600; font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--bsp-text-faint); }

.bsp-dna-offices { background: var(--bsp-surface); border-top: var(--bsp-section-rule); border-bottom: var(--bsp-section-rule); padding: var(--bsp-section-pad); }
.bsp-dna-offices-intro { max-width: 640px; margin: 0 auto 48px; }
.bsp-dna-offices-intro p.eyebrow { font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: .26em; text-transform: uppercase; color: var(--bsp-accent-hover); margin-bottom: var(--bsp-space-2); }
.bsp-dna-offices-intro h2 { font-family: var(--bsp-font-display); font-weight: 800; font-size: 28px; color: var(--bsp-text); margin-bottom: 0; }
.bsp-dna-offices-intro p.desc { font-family: var(--bsp-font-body); font-weight: 400; font-size: 19.5px; line-height: 1.45; color: var(--bsp-text-soft); max-width: 52ch; margin-top: 14px; }
.bsp-dna-office-grid { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 280px 280px; gap: 18px; max-width: 1240px; margin: 0 auto; }
.bsp-dna-office-tile { position: relative; overflow: hidden; border-radius: var(--bsp-radius); }
.bsp-dna-office-tile img { width: 100%; height: 100%; object-fit: cover; transform: scale(1.02); transition: transform .8s var(--bsp-ease); }
.bsp-dna-office-tile:hover img { transform: scale(1.08); }
.bsp-dna-office-tile::after { content: ''; position: absolute; inset: 0; background: linear-gradient(180deg, transparent 38%, rgba(5,7,13,.92) 100%); pointer-events: none; }
.bsp-dna-office-info { position: absolute; left: 0; right: 0; bottom: 0; padding: 20px 22px; z-index: 2; }
.bsp-dna-office-name { font-family: var(--bsp-font-display); font-weight: 800; font-size: 20px; color: #fff; margin-bottom: 3px; }
.bsp-dna-office-role { font-family: var(--bsp-font-label); font-weight: 600; font-size: 10.5px; letter-spacing: .07em; text-transform: uppercase; color: var(--bsp-accent-hover); }

.bsp-dna-values { padding: var(--bsp-section-pad); max-width: 1240px; margin: 0 auto; }
.bsp-dna-values-grid { display: grid; grid-template-columns: 0.85fr 1.15fr; gap: 64px; align-items: start; }
.bsp-dna-values-intro p.eyebrow { font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: .26em; text-transform: uppercase; color: var(--bsp-accent-hover); margin-bottom: var(--bsp-space-2); }
.bsp-dna-values-intro h2 { font-family: var(--bsp-font-display); font-weight: 800; font-size: 28px; color: var(--bsp-text); }
.bsp-dna-values-intro p.desc { font-family: var(--bsp-font-body); font-weight: 400; font-size: 19.5px; line-height: 1.45; color: var(--bsp-text-soft); max-width: 38ch; margin: 18px 0 28px; }
.bsp-dna-values-intro a.btn-link { display: inline-flex; align-items: center; gap: 8px; font-family: var(--bsp-font-label); font-weight: 700; font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--bsp-text); padding-bottom: 4px; border-bottom: 1px solid var(--bsp-accent); transition: gap .2s var(--bsp-ease), color .2s var(--bsp-ease); }
.bsp-dna-values-intro a.btn-link:hover { gap: 12px; color: var(--bsp-accent-hover); }
.bsp-dna-value-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
.bsp-dna-value-card { background: var(--bsp-surface-deep); border: 1px solid var(--bsp-border); border-radius: var(--bsp-radius); padding: 30px 28px; transition: border-color .25s var(--bsp-ease), transform .25s var(--bsp-ease); }
.bsp-dna-value-card:hover { border-color: var(--bsp-accent); transform: translateY(-4px); }
.bsp-dna-value-card--wide { grid-column: 1 / -1; display: grid; grid-template-columns: auto 1fr; gap: 28px; align-items: center; }
.bsp-dna-value-num { font-family: var(--bsp-font-display); font-weight: 800; font-size: 14px; color: var(--bsp-accent-hover); margin-bottom: 14px; }
.bsp-dna-value-card--wide .bsp-dna-value-num { margin-bottom: 0; grid-row: 1/3; font-size: 34px; align-self: center; }
.bsp-dna-value-card h3 { font-family: var(--bsp-font-display); font-weight: 800; font-size: 19px; color: var(--bsp-text); margin-bottom: 10px; }
.bsp-dna-value-card p { font-family: var(--bsp-font-body); font-weight: 400; font-size: 17.5px; line-height: 1.65; color: var(--bsp-text-soft); }

.bsp-dna-team-cta-wrap { padding: 0 var(--bsp-gutter) var(--bsp-section-pad); max-width: 1240px; margin: 0 auto; }
.bsp-dna-team-cta { display: grid; grid-template-columns: 1fr 1fr; background: var(--bsp-surface-deep); border: 1px solid var(--bsp-border); border-radius: var(--bsp-radius); overflow: hidden; }
.bsp-dna-team-cta-media { position: relative; min-height: 340px; overflow: hidden; }
.bsp-dna-team-cta-media img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--bsp-ease); }
.bsp-dna-team-cta:hover .bsp-dna-team-cta-media img { transform: scale(1.06); }
.bsp-dna-team-cta-media::after { content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 1; background: radial-gradient(circle at 14% 20%, rgba(var(--bsp-accent-rgb),.26), transparent 52%), radial-gradient(circle at 88% 82%, rgba(69,174,255,.16), transparent 48%), linear-gradient(150deg, #0d1f4d 0%, var(--bsp-bg-deep) 55%, #080b13 100%); opacity: .2; mix-blend-mode: screen; }
.bsp-dna-team-cta-body { padding: 56px; display: flex; flex-direction: column; justify-content: center; }
.bsp-dna-team-cta-body h2 { font-family: var(--bsp-font-display); font-weight: 800; font-size: 27px; color: var(--bsp-text); margin-bottom: 16px; max-width: 420px; }
.bsp-dna-team-cta-body p { font-family: var(--bsp-font-body); font-weight: 400; font-size: 19px; line-height: 1.45; color: var(--bsp-text-soft); margin-bottom: 28px; max-width: 420px; }
.bsp-dna-btn-primary { display: inline-flex; align-self: flex-start; align-items: center; gap: 10px; background: var(--bsp-accent-fill); color: #fff; font-family: var(--bsp-font-label); font-weight: 700; font-size: 12px; letter-spacing: .09em; text-transform: uppercase; padding: 16px 30px; border-radius: 100px; transition: background .2s var(--bsp-ease), transform .15s var(--bsp-ease); white-space: nowrap; }
.bsp-dna-btn-primary:hover { background: var(--bsp-accent-hover); }

@media (max-width: 980px) {
  .bsp-dna-history-grid, .bsp-dna-team-cta, .bsp-dna-values-grid { grid-template-columns: 1fr; }
  .bsp-dna-value-cards { grid-template-columns: 1fr; }
  .bsp-dna-value-card--wide { grid-template-columns: 1fr; text-align: left; }
  .bsp-dna-value-card--wide .bsp-dna-value-num { grid-row: auto; margin-bottom: 14px; }
  .bsp-dna-office-grid { grid-template-rows: 220px 220px; }
  .bsp-dna-stats-grid { grid-template-columns: 1fr 1fr; gap: 32px 24px; }
}
@media (max-width: 600px) {
  .bsp-dna-office-grid { grid-template-columns: 1fr; grid-template-rows: none; gap: 12px; }
  .bsp-dna-office-tile { height: 200px; }
  .bsp-dna-stats-grid { grid-template-columns: 1fr; }
}

/* -- Correction du 22 sept. 2026 (Claude) : la section Divi generee automatiquement
   autour du contenu "Post Content" (bsp_dna_page / bsp_team_page) garde le fond
   blanc par defaut de Divi (.et_pb_section), ce qui cree un bandeau blanc entre
   le header et le contenu sombre. Corrige ici, scope strictement aux sections qui
   enveloppent ces deux shortcodes -- n'affecte aucune autre section du site. */
.et_pb_section:has(.bsp-dna-page),
.et_pb_section:has(.bsp-team-page),
.et_pb_section:has(.bsp-partners-page) {
	background-color: transparent;
}

/* -- Mode photo du bandeau de page (BSP page hero) -- ajoute le 22 sept. 2026 (Claude).
   Par defaut, .bsp-page-hero affiche le degrade de marque + les deux halos lumineux qui
   derivent (.ph-glow). Pour poser une VRAIE photo nette a la place (sans qu'elle ne
   rentre en collision avec le degrade et les halos), un seul point de reglage :

   1. Dans le Divi Builder, sur la SECTION elle-meme (celle qui porte deja la classe
      bsp-page-hero -- pas la Ligne, pas le Module) : Conception > Arriere-plan > Image.
   2. Toujours sur cette meme Section, onglet Avance > Classes CSS : ajouter has-photo
      a cote de bsp-page-hero (les deux classes doivent etre presentes ensemble).

   Ne jamais poser l'image sur la Ligne ou le Module : .ph-inner (degrade) les recouvre
   entierement en production (hauteur/largeur 100%, aucun espacement reel), l'image y
   serait invisible -- ou visible seulement par a-coups dans l'editeur Divi a cause de
   son espacement de confort propre a l'edition, qui ne correspond pas au rendu final. */
.bsp-page-hero.has-photo .ph-inner { background: none; }
.bsp-page-hero.has-photo .ph-bg,
.bsp-page-hero.has-photo .ph-glow { display: none; }
.bsp-page-hero.has-photo .ph-inner::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	/* Meme filtre que .filter-banner-overlay (blog) -- standard du site pour
	   tout en-tete avec photo : dense a gauche (sous le texte), s'estompe vers
	   la droite (sur le sujet de la photo). Voir P-002 pour la regle. */
	background:
		linear-gradient(100deg, rgba(6,22,46,0.92) 0%, rgba(6,22,46,0.82) 30%, rgba(6,22,46,0.62) 55%, rgba(6,22,46,0.48) 100%);
}

/* -- Photos d'en-tete des pages Expertise individuelles (22 sept. 2026, Claude) ----
   Meme traitement visuel que .has-photo (voir plus haut), mais applique par ID de
   page plutot que par la classe has-photo elle-meme : ces 6 pages (Customer Service,
   Sales & Marketing, Finance & Administration, HR & Operations, Development &
   Integration, AI & Analytics) partagent TOUTES le meme template Divi Theme Builder
   ("Expertise Pages"), donc poser une photo directement sur la Section via le Divi
   Builder l'appliquerait aux 6 pages a la fois (meme piege que celui deja constate
   entre DNA et Team sur le template "All Pages", voir P-002). Cible ici par ID de
   page (body.page-id-XX), donc chaque page garde sa propre photo sans toucher au
   template partage ni risquer de deborder sur les autres pages qui l'utilisent. */
body.page-id-68 .bsp-page-hero {
	/* Customer Service */
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/blog/customer-service.webp");
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
}
body.page-id-70 .bsp-page-hero {
	/* Sales & Marketing */
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/blog/sales-marketing.webp");
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
}
body.page-id-72 .bsp-page-hero {
	/* Finance & Administration */
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/blog/finance-administration.webp");
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
}
body.page-id-74 .bsp-page-hero {
	/* HR & Operations */
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/blog/hr-operations.webp");
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
}
body.page-id-76 .bsp-page-hero {
	/* Development & Integration */
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/blog/development-integration.webp");
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
}
body.page-id-80 .bsp-page-hero {
	/* AI & Analytics */
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/blog/ai-analytics.webp");
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
}

body.page-id-68 .bsp-page-hero .ph-inner,
body.page-id-70 .bsp-page-hero .ph-inner,
body.page-id-72 .bsp-page-hero .ph-inner,
body.page-id-74 .bsp-page-hero .ph-inner,
body.page-id-76 .bsp-page-hero .ph-inner,
body.page-id-80 .bsp-page-hero .ph-inner {
	background: none;
}
body.page-id-68 .bsp-page-hero .ph-bg,
body.page-id-70 .bsp-page-hero .ph-bg,
body.page-id-72 .bsp-page-hero .ph-bg,
body.page-id-74 .bsp-page-hero .ph-bg,
body.page-id-76 .bsp-page-hero .ph-bg,
body.page-id-80 .bsp-page-hero .ph-bg,
body.page-id-68 .bsp-page-hero .ph-glow,
body.page-id-70 .bsp-page-hero .ph-glow,
body.page-id-72 .bsp-page-hero .ph-glow,
body.page-id-74 .bsp-page-hero .ph-glow,
body.page-id-76 .bsp-page-hero .ph-glow,
body.page-id-80 .bsp-page-hero .ph-glow {
	display: none;
}
body.page-id-68 .bsp-page-hero .ph-inner::before,
body.page-id-70 .bsp-page-hero .ph-inner::before,
body.page-id-72 .bsp-page-hero .ph-inner::before,
body.page-id-74 .bsp-page-hero .ph-inner::before,
body.page-id-76 .bsp-page-hero .ph-inner::before,
body.page-id-80 .bsp-page-hero .ph-inner::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	/* Meme filtre que .filter-banner-overlay / .has-photo (voir plus haut). */
	background:
		linear-gradient(100deg, rgba(6,22,46,0.92) 0%, rgba(6,22,46,0.82) 30%, rgba(6,22,46,0.62) 55%, rgba(6,22,46,0.48) 100%);
}



/* -- Photos d'en-tete ADN et Contact (3 oct. 2026, Claude) ---------------------
   Meme mecanisme que les pages Expertise ci-dessus (voir commentaire du 22 sept.) :
   cible par ID de page (DNA=842 partage le template "All Pages" avec Team/Partners,
   Contact=424 a son propre template), jamais la classe has-photo elle-meme. */
body.page-id-842 #page-container .bsp-page-hero,
body.page-id-842 .bsp-page-hero {
	/* ADN -- equipe BSP (salon GITEX / stand Zoho). !important : le Section partage
	   "All Pages" (DNA/Team/Partners) porte deja un background-image Divi (genere
	   avec un selecteur ID, plus specifique qu'une simple classe -- voir le meme
	   constat deja documente pour .et_pb_section.CLASS ailleurs dans ce fichier). */
	background-image: linear-gradient(90deg, rgba(9,16,34,.9) 0%, rgba(9,16,34,.78) 26%, rgba(9,16,34,.3) 44%, rgba(9,16,34,0) 60%), url("/wp-content/themes/bsp-corp-child/assets/images/dna/dna-header-booth2.jpg") !important; /* voile a gauche : masque l'affiche derriere le titre */
	background-size: cover !important;
	background-position: center 22% !important;
	background-repeat: no-repeat !important;
}
body.page-id-424 #page-container .bsp-page-hero,
body.page-id-424 .bsp-page-hero {
	/* Contact -- photo de bureau (placeholder en attendant de vraies photos BSP) */
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/contact/contact-header-office-wide.jpg") !important;
	background-size: cover !important;
	background-position: center 28% !important;
	background-repeat: no-repeat !important;
}
body.page-id-842 .bsp-page-hero .ph-inner,
body.page-id-424 .bsp-page-hero .ph-inner {
	background: none;
}
body.page-id-842 .bsp-page-hero .ph-bg,
body.page-id-424 .bsp-page-hero .ph-bg,
body.page-id-842 .bsp-page-hero .ph-glow,
body.page-id-424 .bsp-page-hero .ph-glow {
	display: none;
}
body.page-id-842 .bsp-page-hero .ph-inner::before,
body.page-id-424 .bsp-page-hero .ph-inner::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	/* Meme filtre que .filter-banner-overlay / .has-photo (voir plus haut). */
	background:
		linear-gradient(100deg, rgba(6,22,46,0.92) 0%, rgba(6,22,46,0.82) 30%, rgba(6,22,46,0.62) 55%, rgba(6,22,46,0.48) 100%);
}

/* -- Photo d'en-tete Team (3 oct. 2026, Claude) --------------------------------
   Meme mecanisme que ADN/Contact ci-dessus (voir commentaire du 3 oct.) :
   photo de bureau reelle (reunion/laptop), pas un portrait individuel -- aucune
   identite a confirmer necessaire pour ce choix. */
body.page-id-584 #page-container .bsp-page-hero,
body.page-id-584 .bsp-page-hero {
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/team/team-header.jpg") !important;
	background-size: cover !important;
	background-position: center 58% !important;
	background-repeat: no-repeat !important;
}
body.page-id-584 .bsp-page-hero .ph-inner { background: none; }
body.page-id-584 .bsp-page-hero .ph-bg,
body.page-id-584 .bsp-page-hero .ph-glow { display: none; }
body.page-id-584 .bsp-page-hero .ph-inner::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	background:
		linear-gradient(100deg, rgba(6,22,46,0.92) 0%, rgba(6,22,46,0.82) 30%, rgba(6,22,46,0.62) 55%, rgba(6,22,46,0.48) 100%);
}

/* -- Uniformisation du gabarit de contenu (22 sept. 2026, Claude) --------------
   Le patron « Post Content » partage par DNA/Team/Partners (voir P-002 Phase 6) injecte
   le contenu propre de chaque page dans une Section > Row > Column > Text generee par
   Divi. Cette Row (et sa Row parente du template partage, elle aussi limitee a 1080px
   par defaut) recoit la classe Divi et_pb_gutters3 sur la Row interne (largeur 80%
   d'une ligne deja plafonnee a 1080px, soit 864px sur un ecran 1920px) -- alors que le
   contenu reel a l'interieur (.bsp-dna-page, .bsp-team-page, futur .bsp-partners-page)
   gere deja lui-meme tout son espacement lateral via --bsp-gutter sur chacune de ses
   sections. Ce wrapper Divi n'ajoutait donc qu'une contrainte de largeur inutile et
   incoherente avec le reste du site (comparer a .bsp-home-section plus haut, qui suit
   deja ce meme principe pour l'accueil). On la neutralise ici. */
.et_pb_row:has(.bsp-dna-page),
.et_pb_row:has(.bsp-team-page),
.et_pb_row:has(.bsp-partners-page) {
	width: 100% !important;
	max-width: none !important;
}

/* Meme uniformisation pour le blog (.bsp-blog-catalog) : le « sujet du mois » et la
   grille des articles etaient volontairement calques sur la largeur par defaut de
   Divi (1080px) pour rester alignes entre eux (voir commentaire plus haut) -- mais
   cela cree la meme incoherence avec l'accueil sur grand ecran. On bascule les deux
   sur le meme patron full-bleed + --bsp-gutter que l'accueil, en gardant leur
   alignement mutuel intact (les deux utilisent --bsp-gutter). */
.bsp-blog-catalog .sujet-du-mois {
	width: auto;
	max-width: none;
	margin: 0;
	padding: 64px var(--bsp-gutter) 0;
}
body.post-type-archive-project .et_flex_row {
	width: auto !important;
	max-width: none !important;
}
body.post-type-archive-project .et_flex_row > .et_pb_column {
	padding-left: var(--bsp-gutter);
	padding-right: var(--bsp-gutter);
	box-sizing: border-box;
}

/* ════════════════════════════════════════
   PAGE PARTNERS -- corps de page (/about/partners/)
   Ajoute par Claude, 22 sept. 2026, a la demande de Clement : contenu de la page
   sous l'en-tete existant (.bsp-page-hero, non modifie ici). Meme patron que la
   page DNA (Phase 6) : shortcode [bsp_partners_page], voir functions.php. Logos
   partenaires uploades le 22 sept. (IDs 894-897).
════════════════════════════════════════ */
.bsp-partners-page { background: var(--bsp-bg); }

.bsp-partners-intro {
	max-width: 1240px;
	margin: 0 auto;
	padding: var(--bsp-section-pad);
	padding-bottom: 0;
}
.bsp-partners-intro .eyebrow,
.bsp-partners-spotlight-body .eyebrow,
.bsp-partners-grid-intro .eyebrow {
	display: block;
	font-family: var(--bsp-font-body);
	font-weight: 700;
	font-size: 12.5px;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--bsp-accent-hover);
	margin-bottom: 10px;
}
.bsp-partners-intro h2,
.bsp-partners-grid-intro h2 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(26px,2.6vw,34px);
	line-height: 1.2;
	color: var(--bsp-text);
	max-width: 640px;
	margin-bottom: var(--bsp-space-2);
}
.bsp-partners-intro .desc,
.bsp-partners-grid-intro .desc {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 20px;
	line-height: 1.45;
	color: var(--bsp-text-soft);
	max-width: 60ch;
}

.bsp-partners-spotlight {
	max-width: 1240px;
	margin: var(--bsp-space-3) auto 0;
	padding: 48px;
	display: grid;
	grid-template-columns: 0.8fr 1.2fr;
	gap: 56px;
	align-items: center;
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
}
.bsp-partners-spotlight-media {
	display: flex;
	align-items: center;
	justify-content: center;
}
/* Photo reelle (3 oct. 2026, Claude) -- la vignette gauche de ce bloc
   pointait vers un badge "Zoho-Premium-partner-white.png" jamais televerse
   (404, naturalWidth/Height = 0, invisible en prod -- case noire vide).
   Remplacee par une photo reelle (evenement Zoholics India) en fond de
   la case, qui s'etire maintenant sur toute la hauteur de la Rangee. */
body.page-id-800 .bsp-partners-spotlight-media {
	align-self: stretch;
	min-height: 280px;
	border-radius: calc(var(--bsp-radius) - 4px);
	background-image: url("/wp-content/themes/bsp-corp-child/assets/images/partners/partners-spotlight-zoholics.jpg");
	background-size: cover;
	background-position: center 30%;
	overflow: hidden;
}
body.page-id-800 .bsp-partners-spotlight-media img { display: none; }
@media (max-width: 900px) {
	body.page-id-800 .bsp-partners-spotlight-media { min-height: 200px; }
}
.bsp-partners-spotlight-media img {
	width: 100%;
	max-width: 220px;
	height: auto;
}
.bsp-partners-spotlight-body h2 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(24px,2.4vw,30px);
	line-height: 1.2;
	color: var(--bsp-text);
	margin-bottom: var(--bsp-space-2);
}
.bsp-partners-spotlight-body p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 20px;
	line-height: 1.45;
	color: var(--bsp-text-soft);
	max-width: 58ch;
	margin-bottom: var(--bsp-space-3);
}
.bsp-partners-spotlight-stats {
	display: grid;
	grid-template-columns: repeat(3,1fr);
	gap: 20px;
	max-width: 440px;
}
.bsp-partners-spotlight-stats .bsp-stat-number {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 24px;
	color: var(--bsp-text);
	margin: 0;
}
.bsp-partners-spotlight-stats .bsp-stat-label {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 15.5px;
	line-height: 1.4;
	color: var(--bsp-text-soft);
	margin: 4px 0 0;
}

.bsp-partners-grid-section {
	max-width: 1240px;
	margin: var(--bsp-space-3) auto 0;
	padding: 0 var(--bsp-gutter) var(--bsp-section-pad);
}
.bsp-partners-grid-intro { max-width: 640px; margin-bottom: var(--bsp-space-3); }
.bsp-partners-cards {
	display: grid;
	grid-template-columns: repeat(3,1fr);
	gap: 22px;
}
.bsp-partners-card {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	padding: 30px 28px 28px;
	transition: border-color .25s var(--bsp-ease), transform .25s var(--bsp-ease);
}
/* Le bouton rond est pousse tout en bas, aligne a droite, sans position:absolute --
   evite la bataille de specificite contre le CSS genere par Divi (voir plus bas). */
.bsp-partners-card .et_pb_button_module_wrapper {
	margin-top: auto !important;
	padding-top: 24px !important;
	align-self: flex-end !important;
}
/* Survol harmonise avec les cartes "Solutions" de la page d'accueil
   (.bsp-home-solution-card:hover) : aplat d'accent sur toute la carte,
   pas seulement une bordure. Le texte est deja blanc/blanc attenue --
   on le repasse en blanc plein pour rester lisible sur le bleu. Le bouton
   rond garde son propre style, juste rendu plus visible sur le fond bleu
   tant qu'il n'est pas lui-meme survole. */
.bsp-partners-card:hover {
	background: var(--bsp-accent-fill);
	border-color: var(--bsp-accent-fill);
	transform: translateY(-4px);
}
.bsp-partners-card:hover p { color: #fff; }
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button {
	border-color: rgba(255, 255, 255, 0.55) !important;
}
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow::before,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button::before {
	color: rgba(255, 255, 255, 0.85) !important;
}
/* Boite logo de taille fixe (largeur ET hauteur) : les logos partenaires ont des
   ratios tres differents (Zefranchise plus carre, Capto/Contraste en largeur) --
   une hauteur seule ne suffit pas a les uniformiser visuellement, l'un paraissait
   ecrase a cote des autres. Le logo garde son ratio (object-fit: contain) mais
   la BOITE, elle, fait toujours la meme taille pour les trois cartes. */
.bsp-partners-card-logo-wrap {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 136px;
	height: 60px;
	background: #fff;
	border-radius: 10px;
	padding: 10px 16px;
	margin-bottom: 20px;
}
.bsp-partners-card-logo-wrap img,
.bsp-partners-card-logo { display: block; max-height: 36px; max-width: 100%; height: auto; width: auto; object-fit: contain; }
.bsp-partners-card h3 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 18px;
	color: var(--bsp-text);
	margin-bottom: 10px;
}
.bsp-partners-card p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 19px;
	line-height: 1.45;
	color: var(--bsp-text-soft);
}

/* --- Partners (post 800) -- logos "Team behind the team" en Divi 5 natif
   (3 oct. 2026, Claude) -------------------------------------------------
   Cette page a deja ete convertie en blocs Divi 5 natifs (wp:divi/*), donc
   pas de shortcode D4 a spliter en REST ici : correctif en CSS pur, cible
   directement le <img> dans chaque colonne .bsp-partners-card (pas de wrap
   .bsp-partners-card-logo-wrap dans le contenu reel -- les logos avaient
   des ratios tres differents, affiches a leur taille native, et illisibles
   en fond sombre pour les logos sombres/fins (ex. contraste-logo.png). */
.bsp-partners-card img {
	display: block;
	box-sizing: border-box;
	width: 136px;
	height: 60px;
	max-width: 100%;
	background: #fff;
	border-radius: 10px;
	padding: 10px 16px;
	object-fit: contain;
	margin: 0 0 20px;
}


@media (max-width: 980px) {
	.bsp-partners-spotlight { grid-template-columns: 1fr; padding: 32px; gap: 28px; }
	.bsp-partners-spotlight-media img { max-width: 160px; }
	.bsp-partners-cards { grid-template-columns: 1fr; }
}

.bsp-partners-spotlight,
.bsp-partners-spotlight-box {
	position: relative;
	overflow: hidden;
}
/* Retiré: Phase 17, 22 sept. 2026 (demande client « éléments toujours éditables »)
   Le fond photo + dégradé était géré ici via un ::before positionné en absolu avec
   opacity:0.2 sur le pseudo-élément: invisible dans le Divi Builder, donc non éditable.
   Remplacé par le fond natif Divi : Background Image (photo « image.jpg ») + Background
   Gradient (135deg, #0B1220→0% à #050710→100%, « Place Above Background Image » activé),
   configurés dans le panneau Content › Background de la Row .bsp-partners-spotlight-box.
   Les propriétés position:relative et overflow:hidden restent sur le sélecteur de bloc
   ci-dessus: elles sont toujours nécessaires pour le clip des coins arrondis et le
   contexte de superposition des enfants. */
.bsp-partners-spotlight > *,
.bsp-partners-spotlight-box > * {
	position: relative;
	z-index: 1;
}


/* ════════════════════════════════════════
   PHASE 16: Partners en modules Divi natifs (shortcodes et_pb_*)
   Remplace le hook :has(.bsp-partners-page) (disparu avec le retrait du
   shortcode PHP) par des classes directes sur les Sections/Rows Divi.
   Le patron de conteneur (1240px centre) est repris tel quel de l'existant.
   ════════════════════════════════════════ */
.et_pb_section.bsp-partners-section {
	background-color: transparent;
}
.et_pb_row.bsp-partners-row {
	width: 100% !important;
	max-width: 1240px !important;
	margin-left: auto !important;
	margin-right: auto !important;
}
/* Correctif (session suivante, signale par le client) : sans !important,
   la CSS injectee par Divi pour cette Row (calculee a partir de sa
   column_structure) regagnait l'arbitrage et repoussait la Row a 100% du
   viewport (1800px) au lieu du 1240px centre voulu -- meme categorie de
   bug que le correctif DNA Phase 17 (.et_pb_row_1_tb_body /
   Rows-grilles). Consequence visuelle directe : le rayon de 12px de
   ".bsp-partners-spotlight-box" devenait imperceptible sur une boite
   aussi large, lisible comme un bandeau noir carre plutot qu'une carte
   arrondie centree. */
.et_pb_row.bsp-partners-row-intro {
	padding: 72px 80px 0;
}
.et_pb_row.bsp-partners-spotlight-box {
	margin-top: var(--bsp-space-3);
	padding: 48px;
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
}
.et_pb_row.bsp-partners-grid-intro-row {
	margin-top: var(--bsp-space-3);
	padding: 0 80px;
}
.et_pb_row.bsp-partners-cards-row {
	padding: 0 80px 72px;
	margin-top: var(--bsp-space-2);
}
@media (max-width: 980px) {
	.et_pb_row.bsp-partners-spotlight-box { padding: 32px; }
	.et_pb_row.bsp-partners-row-intro,
	.et_pb_row.bsp-partners-grid-intro-row,
	.et_pb_row.bsp-partners-cards-row { padding-left: 32px; padding-right: 32px; }
}


/* =============================================================
   PAGE DNA: reconstruction en modules Divi 4 natifs (22 sept. 2026,
   Claude, session suivante). Le shortcode PHP [bsp_dna_page] n'est
   plus utilise pour le corps de cette page -- meme patron que
   Partners (voir P-002 Phase 16), applique a DNA. Ces regles
   remplacent l'ancien wrapper generique .et_pb_section:has(.bsp-dna-page)
   (Phase 7/9), devenu inerte puisque .bsp-dna-page n'apparait plus
   dans le DOM de cette page. Classes de contenu (.bsp-dna-*, .bsp-stat-*)
   inchangees et reutilisees telles quelles par la nouvelle structure. */

.et_pb_section.bsp-dna-history,
.et_pb_section.bsp-dna-values,
.et_pb_section.bsp-dna-team-cta-wrap {
	background-color: transparent;
}

.et_pb_section.bsp-stats .et_pb_row,
.et_pb_section.bsp-dna-history .et_pb_row,
.et_pb_section.bsp-dna-offices .et_pb_row,
.et_pb_section.bsp-dna-values .et_pb_row,
.et_pb_section.bsp-dna-team-cta-wrap .et_pb_row {
	width: 100%;
	max-width: none;
}

/* Modules Image natifs (bureaux + photo equipe) : force le wrapper
   Divi a occuper tout l'espace de la tuile/du cadre, pour que
   .bsp-dna-office-tile img / .bsp-dna-team-cta-media img (deja en
   width:100%;height:100%;object-fit:cover) se calculent correctement
   -- sans ce point d'ancrage, un wrapper Divi en hauteur "auto"
   empeche le pourcentage de hauteur de s'appliquer. */
.bsp-dna-office-tile .et_pb_image,
.bsp-dna-office-tile .et_pb_image_wrap,
.bsp-dna-team-cta-media .et_pb_image,
.bsp-dna-team-cta-media .et_pb_image_wrap {
	position: absolute;
	inset: 0;
}


/* Correctif complementaire (meme session) : la Row du template
   partage "All Pages" qui enveloppe le module Post Content
   (.et_pb_row_1_tb_body, voir P-002 Phase 6/9) etait neutralisee
   via ":has(.bsp-dna-page)" -- selecteur devenu inerte pour DNA
   depuis la reconstruction en modules natifs ci-dessus (cette classe
   n'existe plus dans le DOM). Reprise directe par nom de classe stable,
   qui couvre aussi Team et Partners (meme template partage) au passage.
   !important necessaire : CSS injecte par Divi par module gagne
   l'arbitrage sinon (voir note plus haut dans ce fichier). */
.et_pb_row_1_tb_body {
	width: 100% !important;
	max-width: none !important;
}


/* Correctif complementaire (meme session, suite) : Divi injecte une
   largeur par colonne (calculee depuis la structure de la Row) qui
   gagne l'arbitrage contre nos regles de grille CSS (.bsp-dna-*-grid),
   meme probleme de fond que celui documente plus haut dans ce fichier
   pour les marges -- ici applique a la largeur des Rows/Colonnes.
   !important requis, mesure en verifiant le rendu reel de la page DNA. */
.et_pb_row.bsp-dna-stats-grid,
.et_pb_row.bsp-dna-history-grid,
.et_pb_row.bsp-dna-values-grid,
.et_pb_row.bsp-dna-office-grid {
	max-width: 1240px !important;
	margin-left: auto !important;
	margin-right: auto !important;
}
.et_pb_row.bsp-dna-stats-grid > .et_pb_column,
.et_pb_row.bsp-dna-history-grid > .et_pb_column,
.et_pb_row.bsp-dna-values-grid > .et_pb_column,
.et_pb_row.bsp-dna-office-grid > .et_pb_column {
	width: 100% !important;
}


/* Correctif (session suivante, signale par le client) : la Row "Offices --
   section intro" (eyebrow/heading/desc) a perdu son traitement centre
   etroit d'origine (max-width:640px; margin:0 auto 48px) a cause du reset
   generique ".et_pb_section.bsp-dna-offices .et_pb_row { width:100%;
   max-width:none; }" plus haut, qui la capture aussi (specificite plus
   elevee). Contrairement aux Rows -grid (stats/history/values/office),
   cette Row n'a jamais recu son propre correctif !important -- oubli
   corrige ici. */
.et_pb_row.bsp-dna-offices-intro {
	max-width: 640px !important;
	margin: 0 auto 48px !important;
}


/* =============================================================
   CONTACT: page Contact (post_content pousse via REST, meme
   methode shortcode classique Divi 4 que DNA/Partners). Reutilise
   --bsp-section-pad, --bsp-radius, --bsp-surface*, --bsp-border*,
   .bsp-eyebrow, .bsp-btn-round-arrow deja definis plus haut.
   ============================================================= */
.bsp-contact-page { background: var(--bsp-bg); }

/* Correctif fond blanc Divi (meme piege que Phase 7/17) -- les Sections
   et_pb_section portant module_class="bsp-contact-page"/"bsp-contact-form-section"/
   "bsp-contact-offices" perdent la guerre de specificite contre le fond blanc
   genere par Divi. Prefixe body #page-container + !important, comme pour les
   boutons (voir regle-socle-boutons-divi.md). */
body #page-container .et_pb_section.bsp-contact-page,
body #page-container .et_pb_section.bsp-contact-form-section,
body #page-container .et_pb_section.bsp-contact-offices {
	background-color: transparent !important;
}

/* --- Options (Sales / Support) --- */
.bsp-contact-options { padding: var(--bsp-section-pad); max-width: 1240px; margin: 0 auto; }
.et_pb_row.bsp-contact-options-grid {
	display: grid !important;
	grid-template-columns: 1fr 1fr !important;
	max-width: 1240px !important;
	margin: 0 auto !important;
	width: 100% !important;
	gap: 24px;
}
.et_pb_row.bsp-contact-options-grid > .et_pb_column { width: 100% !important; }

.bsp-contact-option-card {
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	padding: 36px 34px;
	height: 100%;
	display: flex;
	flex-direction: column;
	transition: border-color var(--bsp-speed) var(--bsp-ease), transform var(--bsp-speed) var(--bsp-ease);
}
.bsp-contact-option-card:hover { border-color: var(--bsp-accent); transform: translateY(-4px); }
.bsp-contact-option-card h3 {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 15px;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--bsp-text);
	margin-bottom: 14px;
	max-width: 30ch;
}
.bsp-contact-option-card p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 19px;
	line-height: 1.45;
	color: var(--bsp-text-soft);
	margin-bottom: 0;
}
.bsp-contact-option-card .et_pb_button_module_wrapper {
	margin-top: auto !important;
	padding-top: 24px;
	align-self: flex-end !important;
}

/* --- General request / form --- */
.bsp-contact-form-section {
	padding: var(--bsp-section-pad);
	background: var(--bsp-surface);
	border-top: var(--bsp-section-rule);
	border-bottom: var(--bsp-section-rule);
}
.bsp-contact-form-intro { max-width: 640px; margin: 0 auto; text-align: center; }
.bsp-contact-form-intro h2 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 28px;
	color: var(--bsp-text);
	margin-bottom: var(--bsp-space-2);
}
.bsp-contact-form-intro p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 19.5px;
	line-height: 1.45;
	color: var(--bsp-text-soft);
	margin: 0 auto;
	max-width: 52ch;
}
.bsp-contact-form-wrap {
	max-width: 760px;
	margin: var(--bsp-space-4) auto 0;
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	overflow: hidden;
}
.bsp-contact-form-wrap iframe {
	display: block;
	width: 100%;
	min-height: 920px;
	border: none;
}

/* --- Form + coordonnees compactes (3 oct. 2026, Claude) -----------------
   Remplace l'ancienne section "Offices showcase" en bandeaux pleine largeur
   par une colonne compacte a droite du formulaire : le formulaire redevient
   le point focal de la page, les 4 bureaux restent visibles sans "disparaitre"
   en bas de page (retour client du 3 oct.). Reutilise .bsp-contact-form-intro/
   .bsp-contact-form-wrap ci-dessus, simplement desaxes (plus centres). */
.et_pb_row.bsp-contact-form-row {
	display: grid !important;
	grid-template-columns: 1.15fr 0.85fr !important;
	gap: 56px;
	max-width: 1240px !important;
	margin: 0 auto !important;
	width: 100% !important;
	align-items: start;
}
.et_pb_row.bsp-contact-form-row > .et_pb_column { width: 100% !important; }
.bsp-contact-form-row .bsp-contact-form-intro {
	max-width: none;
	text-align: left;
	margin: 0;
}
.bsp-contact-form-row .bsp-contact-form-intro p { margin: 0; max-width: 46ch; }
.bsp-contact-form-row .bsp-contact-form-wrap { margin: var(--bsp-space-4) 0 0; max-width: none; }

.bsp-contact-office-list-wrap { padding-top: 2px; }
.bsp-contact-office-list-wrap > .bsp-eyebrow { display: block; margin-bottom: var(--bsp-space-2); }
.bsp-contact-office-list-wrap h3 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 22px;
	color: var(--bsp-text);
	margin: 0 0 var(--bsp-space-3);
}
.bsp-contact-office-list { display: flex; flex-direction: column; }
.bsp-contact-office-item {
	display: flex;
	align-items: baseline;
	gap: 16px;
	padding: 16px 0;
	border-top: 1px solid var(--bsp-border-subtle);
}
.bsp-contact-office-item:first-child { border-top: none; padding-top: 0; }
.bsp-contact-office-item .ol-icon {
	flex: none;
	width: 46px;
	height: 46px;
	object-fit: contain;
	opacity: 1;
	align-self: center;
}
:root[data-bsp-theme="light"] .bsp-contact-office-item .ol-icon { filter: invert(1); }
.bsp-contact-office-item { align-items: center; }
.bsp-contact-office-item .ol-idx {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 12px;
	letter-spacing: .06em;
	color: var(--bsp-accent);
	flex: none;
	width: 22px;
}
.bsp-contact-office-item .ol-body { flex: 1; }
.bsp-contact-office-item .ol-city {
	font-family: var(--bsp-font-display);
	font-weight: 700;
	font-size: 17px;
	line-height: 1.25;
	color: var(--bsp-text);
	margin: 0 0 2px;
	padding: 0;
}
.bsp-contact-office-item .ol-meta {
	font-family: var(--bsp-font-body);
	font-size: 17.5px;
	line-height: 1.4;
	color: var(--bsp-text-soft);
	margin: 0;
	padding: 0;
}
.bsp-contact-office-item .ol-meta .ol-dot { color: var(--bsp-text-faint); margin: 0 6px; }

@media (max-width: 900px) {
	.et_pb_row.bsp-contact-form-row { grid-template-columns: 1fr !important; gap: 36px; }
	.bsp-contact-office-list-wrap { padding-top: 0; }
}


/* --- Office cards --- */
.bsp-contact-offices { padding: var(--bsp-section-pad); max-width: 1240px; margin: 0 auto; }
.bsp-contact-offices-intro { max-width: 640px; margin: 0 auto var(--bsp-space-4); text-align: center; }
.bsp-contact-offices-intro h2 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 26px;
	color: var(--bsp-text);
}
.et_pb_row.bsp-contact-offices-grid {
	display: grid !important;
	grid-template-columns: repeat(4, 1fr) !important;
	max-width: 1240px !important;
	margin: 0 auto !important;
	width: 100% !important;
	gap: 18px;
}
.et_pb_row.bsp-contact-offices-grid > .et_pb_column { width: 100% !important; }

.bsp-contact-office-card {
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	padding: 28px 24px;
	text-align: left;
	transition: border-color var(--bsp-speed) var(--bsp-ease);
}
.bsp-contact-office-card:hover { border-color: var(--bsp-accent); }
.bsp-contact-office-card::before {
	content: "";
	display: block;
	width: 22px;
	height: 22px;
	margin-bottom: 16px;
	background-color: currentColor;
	color: var(--bsp-accent-hover);
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%271.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M21%2010c0%207-9%2012-9%2012s-9-5-9-12a9%209%200%201%201%2018%200z%27/%3E%3Ccircle%20cx%3D%2712%27%20cy%3D%2710%27%20r%3D%273%27/%3E%3C/svg%3E") !important;
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%271.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M21%2010c0%207-9%2012-9%2012s-9-5-9-12a9%209%200%201%201%2018%200z%27/%3E%3Ccircle%20cx%3D%2712%27%20cy%3D%2710%27%20r%3D%273%27/%3E%3C/svg%3E") !important;
	-webkit-mask-size: contain !important;
	mask-size: contain !important;
	-webkit-mask-repeat: no-repeat !important;
	mask-repeat: no-repeat !important;
}
.bsp-contact-office-card h3 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 19px;
	color: var(--bsp-text);
	margin-bottom: 4px;
}
.bsp-contact-office-card p {
	font-family: var(--bsp-font-label);
	font-weight: 600;
	font-size: 11px;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--bsp-text-faint);
	margin: 0;
}

@media (max-width: 1024px) {
	.et_pb_row.bsp-contact-options-grid { grid-template-columns: 1fr !important; }
	.et_pb_row.bsp-contact-offices-grid { grid-template-columns: repeat(2, 1fr) !important; }
}
@media (max-width: 640px) {
	.et_pb_row.bsp-contact-offices-grid { grid-template-columns: 1fr !important; }
}

/* --- Offices showcase v2 (serpentine / "mode S", 3 oct 2026) -----
   Proposition en remplacement de la grille 4 cartes ci-dessus, a la
   demande du client : design plus epure que les cartes generiques,
   avec les 4 illustrations "ligne" (Chateau Frontenac, Texas/
   Woodlands, mosquee Hassan II/Casablanca, temple/Chennai) en
   filigrane plutot que des images de synthese. Bandeaux pleine
   largeur alternes gauche/droite (lecture en S) au lieu d'un
   quadrillage. La grille .bsp-contact-offices-grid / .bsp-contact-
   office-card ci-dessus reste en place (non supprimee) le temps que
   le client valide -- seule la Row "Offices -- city cards" du
   shortcode a ete remplacee par "Offices -- showcase". */
body #page-container .et_pb_section.bsp-contact-offices > .et_pb_row {
	width: 100% !important;
	max-width: 1120px !important;
	margin: 0 auto !important;
	padding: 0 !important;
}

.bsp-offices-showcase {
	display: flex;
	flex-direction: column;
	margin-top: var(--bsp-space-4);
}
.bsp-office-band {
	position: relative;
	display: flex;
	align-items: center;
	gap: 56px;
	min-height: 240px;
	padding: 52px 8px;
	border-top: var(--bsp-section-rule);
	overflow: hidden;
}
.bsp-office-band:first-child { border-top: none; }
.bsp-office-band:nth-child(even) { flex-direction: row-reverse; }

.bsp-office-band-watermark {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	z-index: 0;
	white-space: nowrap;
	pointer-events: none;
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(56px, 10vw, 170px);
	letter-spacing: 0.01em;
	text-transform: uppercase;
	color: var(--bsp-text);
	opacity: 0.045;
	transition: opacity var(--bsp-speed) var(--bsp-ease);
}
.bsp-office-band:hover .bsp-office-band-watermark { opacity: 0.075; }

.bsp-office-band-art {
	position: relative;
	z-index: 1;
	flex-shrink: 0;
	width: clamp(150px, 20vw, 280px);
	height: auto;
	opacity: 0.92;
}
:root[data-bsp-theme="light"] .bsp-office-band-art { filter: invert(1); }

.bsp-office-band-content {
	position: relative;
	z-index: 1;
	flex: 1;
	max-width: 360px;
}
.bsp-office-band:nth-child(even) .bsp-office-band-content { text-align: right; margin-left: auto; }

.bsp-office-band-index {
	display: block;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 12px;
	letter-spacing: .16em;
	color: var(--bsp-accent-text);
	margin-bottom: var(--bsp-space-1);
}
.bsp-office-band-content h3 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 34px;
	color: var(--bsp-text);
	margin: 0 0 4px;
}
.bsp-office-band-content p {
	font-family: var(--bsp-font-label);
	font-weight: 600;
	font-size: 12px;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--bsp-text-faint);
	margin: 0;
}

@media (max-width: 768px) {
	.bsp-office-band,
	.bsp-office-band:nth-child(even) {
		flex-direction: column;
		text-align: center;
		gap: 24px;
		padding: 40px 16px;
	}
	.bsp-office-band:nth-child(even) .bsp-office-band-content { text-align: center; margin-left: 0; }
	.bsp-office-band-art { width: clamp(120px, 40vw, 200px); }
	.bsp-office-band-watermark { font-size: clamp(40px, 16vw, 90px); }
}



/* =============================================================
   EXPERTISE: page overview (66) + 6 pages de domaine (68/70/72/
   74/76/80). Memes tokens --bsp-*, meme patron script-first que
   Contact (voir P-004). Photos de bandeau deja en place par page
   (body.page-id-XX, Phase 13 de P-002) -- rien a toucher ici.
   ============================================================= */

/* --- Overview (66) : grille des 6 domaines, patron "Solutions" accueil --- */
.bsp-expertise-overview-intro { padding: var(--bsp-section-pad); padding-bottom: 0; max-width: 760px; margin: 0 auto; text-align: center; }
.bsp-expertise-overview-intro p { font-family: var(--bsp-font-body); font-weight: 400; font-size: 21px; line-height: 1.4; color: var(--bsp-text-soft); margin: 0 auto; }

.et_pb_row.bsp-expertise-domains-grid {
	display: grid !important;
	grid-template-columns: repeat(3, 1fr) !important;
	max-width: 1240px !important;
	margin: 0 auto !important;
	width: 100% !important;
	gap: 22px;
}
.et_pb_row.bsp-expertise-domains-grid > .et_pb_column { width: 100% !important; }

.bsp-expertise-domain-card {
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	padding: 32px 30px;
	height: 100%;
	display: flex;
	flex-direction: column;
	transition: border-color var(--bsp-speed) var(--bsp-ease), transform var(--bsp-speed) var(--bsp-ease);
}
.bsp-expertise-domain-card:hover { border-color: var(--bsp-accent); transform: translateY(-4px); }
.bsp-expertise-domain-card h3 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 19px;
	color: var(--bsp-text);
	margin-bottom: 10px;
}
.bsp-expertise-domain-card p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 17.5px;
	line-height: 1.65;
	color: var(--bsp-text-soft);
	margin-bottom: 0;
}
.bsp-expertise-domain-card .et_pb_button_module_wrapper {
	margin-top: auto !important;
	padding-top: 20px;
	align-self: flex-end !important;
}

/* --- Pages de domaine individuelles : intro + 6 features + 3 produits + CTA --- */
.bsp-expertise-domain-intro { padding: var(--bsp-section-pad); padding-bottom: 0; max-width: 760px; margin: 0 auto; text-align: center; }
.bsp-expertise-domain-intro p { font-family: var(--bsp-font-body); font-weight: 400; font-size: 21px; line-height: 1.4; color: var(--bsp-text-soft); margin: 0 auto; }

.et_pb_row.bsp-expertise-features-grid {
	display: grid !important;
	grid-template-columns: repeat(2, 1fr) !important;
	max-width: 1240px !important;
	margin: var(--bsp-space-4) auto 0 !important;
	width: 100% !important;
	gap: 18px;
}
.et_pb_row.bsp-expertise-features-grid > .et_pb_column { width: 100% !important; }

.bsp-expertise-feature-card {
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	padding: 26px 26px 24px;
	transition: border-color var(--bsp-speed) var(--bsp-ease);
}
.bsp-expertise-feature-card:hover { border-color: var(--bsp-accent); }
.bsp-expertise-feature-card h3 {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 12.5px;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--bsp-accent-hover);
	margin-bottom: 10px;
}
.bsp-expertise-feature-card p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 18px;
	line-height: 1.65;
	color: var(--bsp-text-soft);
	margin: 0;
}

.bsp-expertise-products-section { padding: var(--bsp-section-pad); background: var(--bsp-surface); border-top: var(--bsp-section-rule); border-bottom: var(--bsp-section-rule); }
.bsp-expertise-products-intro { max-width: 640px; margin: 0 auto var(--bsp-space-4); text-align: center; }
.bsp-expertise-products-intro h2 { font-family: var(--bsp-font-display); font-weight: 800; font-size: 26px; color: var(--bsp-text); }

.et_pb_row.bsp-expertise-products-grid {
	display: grid !important;
	grid-template-columns: repeat(3, 1fr) !important;
	max-width: 1240px !important;
	margin: 0 auto !important;
	width: 100% !important;
	gap: 18px;
}
.et_pb_row.bsp-expertise-products-grid > .et_pb_column { width: 100% !important; }

.bsp-expertise-product-card {
	background: var(--bsp-surface-deep);
	border: 1px solid var(--bsp-border);
	border-radius: var(--bsp-radius);
	padding: 26px 24px;
}
.bsp-expertise-product-card h3 {
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: 17px;
	color: var(--bsp-text);
	margin-bottom: 8px;
}
.bsp-expertise-product-card p {
	font-family: var(--bsp-font-body);
	font-weight: 400;
	font-size: 17.5px;
	line-height: 1.6;
	color: var(--bsp-text-soft);
	margin: 0;
}

.bsp-expertise-cta { padding: var(--bsp-section-pad); max-width: 760px; margin: 0 auto; text-align: center; }
.bsp-expertise-cta h2 { font-family: var(--bsp-font-display); font-weight: 800; font-size: 28px; color: var(--bsp-text); margin-bottom: var(--bsp-space-2); }
.bsp-expertise-cta p { font-family: var(--bsp-font-body); font-weight: 400; font-size: 19.5px; line-height: 1.45; color: var(--bsp-text-soft); margin: 0 auto var(--bsp-space-4); max-width: 52ch; }
.bsp-expertise-cta .et_pb_button_module_wrapper { display: flex; justify-content: center; }

/* --- CTA "Schedule a consultation" deplace en haut de page + "built with"
   (3 oct. 2026, Claude) -- retour client : le bandeau CTA doit etre en haut,
   pas en bas ; bouton renomme et restyle façon pastille "Contact Us" de
   l'en-tete (voir .bsp-home-nav-cta plus haut) ; ajout d'une rangee de
   badges "Built with" listant les produits Zoho realellement couverts par
   la page (memes noms que la section Produits plus bas, pas de logos
   graphiques -- aucun asset de marque Zoho officiel en main cote agent,
   a remplacer par de vraies icones si le client en fournit). */
.et_pb_row.bsp-expertise-top-cta {
	display: flex !important;
	align-items: center !important;
	justify-content: space-between !important;
	gap: 24px;
	flex-wrap: wrap;
	max-width: 1240px !important;
	margin: 0 auto !important;
	width: 100% !important;
}
.et_pb_row.bsp-expertise-top-cta > .et_pb_column { width: auto !important; }
.bsp-expertise-top-cta-section { padding: var(--bsp-section-pad); padding-bottom: var(--bsp-space-4); }
.bsp-expertise-stack { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.bsp-expertise-stack .stack-label {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--bsp-text-faint);
}
.bsp-expertise-stack-badges { display: flex; gap: 8px; flex-wrap: wrap; }
.bsp-expertise-stack-badge {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11.5px;
	letter-spacing: .03em;
	color: var(--bsp-text-soft);
	border: 1px solid var(--bsp-border);
	border-radius: 100px;
	padding: 7px 16px;
	background: var(--bsp-surface-deep);
}

.bsp-btn-pill-header,
.bsp-btn-pill-header.et_pb_button {
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	background: var(--bsp-accent-fill);
	color: #fff;
	border: none;
	border-radius: 100px;
	padding: 14px 30px;
	transition: background var(--bsp-speed) var(--bsp-ease);
}
.bsp-btn-pill-header:hover,
.bsp-btn-pill-header.et_pb_button:hover { background: var(--bsp-accent-hover); color: #fff; }

@media (max-width: 640px) {
	.bsp-expertise-top-cta { flex-direction: column; align-items: flex-start; }
}

/* Espacements resserres corriges (retour client 3 oct.) -- cartes trop
   collees entre elles et avec le texte au-dessus. */
.et_pb_row.bsp-expertise-features-grid,
.et_pb_row.bsp-expertise-products-grid { gap: 26px; }
.et_pb_row.bsp-expertise-features-grid { margin-top: 48px !important; }
.et_pb_row.bsp-expertise-products-grid { margin-top: 20px !important; }
.bsp-expertise-domain-intro { padding-bottom: var(--bsp-space-2); }


/* Correctif fond blanc Divi (meme piege que Contact, voir P-004) -- a
   prevoir d'office pour toute nouvelle Section avec module_class propre. */
body #page-container .et_pb_section.bsp-expertise-overview,
body #page-container .et_pb_section.bsp-expertise-domain,
body #page-container .et_pb_section.bsp-expertise-top-cta-section,
body #page-container .et_pb_section.bsp-expertise-products-section {
	background-color: transparent !important;
}

/* Correctif "double padding" (meme famille que Phase 9 de P-002) -- nos
   classes de contenu (.bsp-expertise-domain-intro, .bsp-expertise-cta,
   etc.) portent deja leur propre padding/--bsp-section-pad ; sans ceci,
   le padding vertical par defaut de Divi (4% Section + gouttiere par
   defaut de la Row) s'additionne par-dessus et cree un vide excessif
   entre sections. */
body #page-container .et_pb_section.bsp-expertise-overview,
body #page-container .et_pb_section.bsp-expertise-domain,
body #page-container .et_pb_section.bsp-expertise-top-cta-section,
body #page-container .et_pb_section.bsp-expertise-products-section {
	padding: 0 !important;
}
body #page-container .et_pb_section.bsp-expertise-overview > .et_pb_row:not(.bsp-expertise-domains-grid),
body #page-container .et_pb_section.bsp-expertise-domain > .et_pb_row:not(.bsp-expertise-features-grid),
body #page-container .et_pb_section.bsp-expertise-top-cta-section > .et_pb_row:not(.bsp-expertise-top-cta),
body #page-container .et_pb_section.bsp-expertise-products-section > .et_pb_row:not(.bsp-expertise-products-grid) {
	width: 100% !important;
	max-width: none !important;
	padding: 0 !important;
}
/* Les Rows-grilles gardent leur propre max-width/margin (voir plus haut) --
   seul le padding par defaut de Divi est neutralise ici, jamais la largeur. */
body #page-container .et_pb_section.bsp-expertise-overview > .et_pb_row.bsp-expertise-domains-grid,
body #page-container .et_pb_section.bsp-expertise-domain > .et_pb_row.bsp-expertise-features-grid,
body #page-container .et_pb_section.bsp-expertise-top-cta-section > .et_pb_row.bsp-expertise-top-cta,
body #page-container .et_pb_section.bsp-expertise-products-section > .et_pb_row.bsp-expertise-products-grid {
	padding: 0 !important;
}

@media (max-width: 1024px) {
	.et_pb_row.bsp-expertise-domains-grid { grid-template-columns: repeat(2, 1fr) !important; }
	.et_pb_row.bsp-expertise-products-grid { grid-template-columns: 1fr !important; }
}
@media (max-width: 640px) {
	.et_pb_row.bsp-expertise-domains-grid,
	.et_pb_row.bsp-expertise-features-grid { grid-template-columns: 1fr !important; }
}

/* Bas du bandeau des pages : ligne franche + petite ombre portee, plus de fondu
   (3 oct. 2026, retour client). Ne touche pas les bandeaux case study. */
.bsp-page-hero .ph-inner::after {
	height: 1px;
	bottom: 0;
	background: none;
	/* plus de filet blanc : seulement une ombre portee legere (3 oct. 2026) */
	height: 0;
	box-shadow: 0 3px 10px rgba(0, 0, 0, 0.35);
}


/* =========================================================================
   Harmonisation des survols (3 oct. 2026, demande de Clement)
   Regle unique :
   1. Cadre / carte (contour seul)  -> survol = 10 % d'accent en fond + contour accent.
      Le bouton ou la fleche dans la carte suit : 10 % d'accent + contour accent.
   2. Bouton plein (bleu 100 %)     -> survol = inverse : fond blanc, texte et
      contour bleus.
   Plus aucun aplat bleu plein au survol d'une carte.
   ========================================================================= */
:root {
	--bsp-hover-tint: rgba(var(--bsp-accent-rgb), 0.10);
	/* Effet vitre : degrade bleu depuis le coin superieur gauche, comme les cartes Solutions. */
	--bsp-hover-glass: linear-gradient(160deg, rgba(var(--bsp-accent-rgb), 0.17) 0%, rgba(var(--bsp-accent-rgb), 0.07) 38%, rgba(var(--bsp-accent-rgb), 0.03) 100%);
}

/* 1. Cartes */
.bsp-home-solution-card:hover,
.bsp-partners-card:hover,
.bsp-blog-catalog .cat-card:hover,
.bsp-blog-catalog .card-featured:hover,
.bsp-blog-catalog .mini-card:hover,
.bsp-team-page .team-card:hover,
.bsp-cs-card:hover,
.bsp-dna-value-card:hover,
.bsp-contact-option-card:hover,
.bsp-contact-office-card:hover,
.bsp-expertise-domain-card:hover,
.bsp-expertise-feature-card:hover {
	background: var(--bsp-hover-glass);
	border-color: var(--bsp-accent);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
}
.bsp-home-solution-card:hover .bsp-home-solution-icon { color: var(--bsp-accent-text); }
.bsp-partners-card:hover p { color: var(--bsp-text-soft); }

/* Fleches / boutons ronds dans une carte */
.bsp-cs-card:hover .cs-card-arrow,
.bsp-blog-catalog .cat-card:hover .card-arrow,
.bsp-blog-catalog .card-featured:hover .card-arrow {
	background: var(--bsp-hover-tint);
	border-color: var(--bsp-accent);
	color: var(--bsp-accent-text);
}
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button {
	background: var(--bsp-hover-tint) !important;
	border-color: var(--bsp-accent) !important;
}
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow::before,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button::before {
	color: var(--bsp-accent-text) !important;
}

/* Boutons contour */
.bsp-btn-ghost:hover,
.bsp-btn-ghost.et_pb_button:hover,
.bsp-blog-catalog .btn-outline:hover {
	background: var(--bsp-hover-tint);
	border-color: var(--bsp-accent);
	color: var(--bsp-accent-text);
}

/* 2. Boutons pleins : survol inverse (fond blanc, texte + contour bleus) */
.bsp-btn-primary:hover,
.bsp-btn-primary.et_pb_button:hover,
.bsp-home-nav-cta:hover,
.bsp-home-btn.et_pb_button:hover,
a.bsp-home-btn:hover,
.bsp-home-contact-form .et_pb_contact_submit.et_pb_button:hover,
.bsp-case-study .btn-primary:hover,
.bsp-team-page .team-cta .btn-primary:hover,
.bsp-xp-section .xp-cta-btn:hover,
.bsp-dna-btn-primary:hover,
.bsp-btn-pill-header:hover,
.bsp-btn-pill-header.et_pb_button:hover {
	background: #fff !important;
	color: var(--bsp-accent-fill) !important;
	box-shadow: inset 0 0 0 1px var(--bsp-accent-fill) !important;
}

/* Bouton rond fleche survole lui-meme (bleu 100 %) : inverse, comme les autres
   boutons pleins -- fond blanc, contour et fleche bleus. Place apres les regles
   "carte survolee" pour les battre, y compris dans les cartes Partners. */
body #page-container .bsp-btn-round-arrow:hover,
body #page-container a.bsp-btn-round-arrow.et_pb_button:hover,
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow:hover,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button:hover {
	background: #fff !important;
	border-color: var(--bsp-accent-fill) !important;
	box-shadow: inset 0 0 0 1px var(--bsp-accent-fill) !important;
}
body #page-container .bsp-btn-round-arrow:hover::before,
body #page-container a.bsp-btn-round-arrow.et_pb_button:hover::before,
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow:hover::before,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button:hover::before {
	color: var(--bsp-accent-fill) !important;
}
body #page-container .bsp-btn-round-arrow:hover::after,
body #page-container a.bsp-btn-round-arrow.et_pb_button:hover::after { display: none !important; }

/* Cartes de listing (projets / expertise) : fleche decorative en Font Awesome
   (police deja chargee plus haut) au lieu d'un SVG injecte. La couleur suit
   le theme (currentColor) : plus de fleche noire en mode clair.
   Repos : gris discret. Survol de la carte : 10 % d'accent + contour accent
   + fleche accent. */
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l .et_pb_column > .et_pb_group::after {
	content: "\f061" !important;
	font-family: "FontAwesome" !important; font-weight: 900 !important;
	font-size: 14px !important; line-height: 1 !important;
	display: flex !important; align-items: center !important; justify-content: center !important;
	background-image: none !important;
	color: var(--bsp-text-faint) !important;
	transition: border-color .2s, background-color .2s, color .2s, transform .2s !important;
}
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l .et_pb_column > .et_pb_group:hover::after {
	background-color: var(--bsp-hover-tint) !important;
	border-color: var(--bsp-accent) !important;
	background-image: none !important;
	color: var(--bsp-accent-text) !important;
	transform: translateX(3px) !important;
}

/* Halo de lumiere par-dessus les photos d'en-tete (essai, 3 oct. 2026).
   On reactive les deux halos .ph-glow (masques sur les pages a photo) mais
   au-dessus de la photo et de son filtre, tres attenues (opacite 0.55 sur des
   halos deja doux) et a derive lente. Mode "screen" : ils ne font qu'eclaircir
   legerement en bleu, sans laver la photo. */
body #page-container .bsp-page-hero .ph-glow {
	display: block !important;
	z-index: 0;
	opacity: 1;
}
body #page-container .bsp-page-hero .ph-glow i:nth-child(1) { animation-duration: 22s; }
body #page-container .bsp-page-hero .ph-glow i:nth-child(2) { animation-duration: 28s; }
/* Halo accentue (a la demande de Clement : "je le vois pas du tout") */
body #page-container .bsp-page-hero .ph-glow i:nth-child(1) {
	background: radial-gradient(circle, rgba(46,120,255,0.62) 0%, rgba(46,120,255,0.22) 38%, transparent 68%);
	width: 64vw; height: 64vw; top: -45%;
}
body #page-container .bsp-page-hero .ph-glow i:nth-child(2) {
	background: radial-gradient(circle, rgba(90,190,255,0.50) 0%, rgba(90,190,255,0.16) 38%, transparent 66%);
	bottom: -45%;
}
/* Halo : moins intense, mouvement plus rapide (demande de Clement) */
body #page-container .bsp-page-hero .ph-glow i:nth-child(1) {
	background: radial-gradient(circle, rgba(46,120,255,0.36) 0%, rgba(46,120,255,0.12) 38%, transparent 68%);
	animation-duration: 8s;
}
body #page-container .bsp-page-hero .ph-glow i:nth-child(2) {
	background: radial-gradient(circle, rgba(90,190,255,0.28) 0%, rgba(90,190,255,0.09) 38%, transparent 66%);
	animation-duration: 11s;
}
/* Halo : intensite -10 %, vitesse +50 % */
body #page-container .bsp-page-hero .ph-glow i:nth-child(1) {
	background: radial-gradient(circle, rgba(46,120,255,0.32) 0%, rgba(46,120,255,0.11) 38%, transparent 68%);
	animation-duration: 5.3s;
}
body #page-container .bsp-page-hero .ph-glow i:nth-child(2) {
	background: radial-gradient(circle, rgba(90,190,255,0.25) 0%, rgba(90,190,255,0.08) 38%, transparent 66%);
	animation-duration: 7.3s;
}

/* Contact : fond lumineux sur TOUTE la section "general request" (comme l'accueil).
   Deux halos bleus derivent doucement derriere le formulaire ET les adresses.
   Le formulaire Zoho (iframe) est en mode "screen" : son fond sombre laisse voir la lumiere. */
body #page-container .et_pb_section.bsp-contact-form-section {
	position: relative; isolation: isolate; overflow: hidden;
}
.bsp-contact-form-section::before,
.bsp-contact-form-section::after {
	content: ""; position: absolute; border-radius: 50%; pointer-events: none;
	z-index: 0; filter: blur(40px);
}
.bsp-contact-form-section::before {
	width: 62vw; height: 62vw; max-width: 980px; max-height: 980px; left: -12%; top: -18%;
	background: radial-gradient(circle, rgba(46,120,255,0.34) 0%, rgba(46,120,255,0.11) 40%, transparent 68%);
	animation: bspListGlowA 9s ease-in-out infinite alternate;
}
.bsp-contact-form-section::after {
	width: 52vw; height: 52vw; max-width: 820px; max-height: 820px; right: -10%; bottom: -16%;
	background: radial-gradient(circle, rgba(90,190,255,0.26) 0%, rgba(90,190,255,0.08) 40%, transparent 66%);
	animation: bspListGlowB 12s ease-in-out infinite alternate;
}
.bsp-contact-form-section > .et_pb_row { position: relative; z-index: 1; }
.bsp-contact-form-wrap { background: transparent; border-color: rgba(var(--bsp-accent-rgb), 0.28); }
@media (prefers-reduced-motion: reduce) { .bsp-contact-form-section::before, .bsp-contact-form-section::after { animation: none; } }

/* =========================================================================
   NORME FORMULAIRES (3 oct. 2026) -- reference : formulaire de l'accueil.
   Tout formulaire du site reprend ce design : champs translucides (4 % blanc,
   contour 16 %), rayon 10px, focus accent, bouton pilule accent (survol
   inverse), et fond lumineux derriere la section.
   - Formulaire Divi natif : .et_pb_contact_form_container (toutes pages)
   - Formulaire Zoho en iframe : .et_pb_code_inner iframe[src*="zoho"]
     (assombri par filtre, car son contenu n'est pas stylable de l'exterieur ;
     le vrai reglage durable est le theme du formulaire cote Zoho Forms).
   ========================================================================= */
.et_pb_contact_form_container .et_pb_contact_main_title { display: none; }
.et_pb_contact_form_container input[type="text"],
.et_pb_contact_form_container input[type="email"],
.et_pb_contact_form_container input[type="tel"],
.et_pb_contact_form_container select,
.et_pb_contact_form_container textarea {
	width: 100%;
	background-color: rgba(255, 255, 255, 0.04) !important;
	border: 1px solid rgba(255, 255, 255, 0.16) !important;
	border-radius: 10px;
	padding: 14px 16px;
	color: #fff !important;
	font-family: var(--bsp-font-body);
	font-size: 14px;
	transition: border-color 0.2s, background-color 0.2s;
}
.et_pb_contact_form_container input::placeholder,
.et_pb_contact_form_container textarea::placeholder { color: rgba(255,255,255,0.45); opacity: 1; }
.et_pb_contact_form_container input:focus,
.et_pb_contact_form_container textarea:focus,
.et_pb_contact_form_container select:focus {
	outline: none; border-color: var(--bsp-accent) !important; background-color: rgba(255,255,255,0.07) !important;
}
.et_pb_contact_form_container .et_pb_contact_submit.et_pb_button {
	background: var(--bsp-accent-fill); color: #fff;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 12px;
	letter-spacing: 0.08em; text-transform: uppercase;
	padding: 14px 30px; border: none; border-radius: 100px;
}
.et_pb_contact_form_container .et_pb_contact_submit.et_pb_button::after { display: none; }
.et_pb_contact_form_container .et_pb_contact_submit.et_pb_button:hover {
	background: #fff !important; color: var(--bsp-accent-fill) !important;
	box-shadow: inset 0 0 0 1px var(--bsp-accent-fill) !important; padding: 14px 30px;
}

/* Zoho en iframe : meme rendu sombre partout */
.et_pb_code_inner iframe[src*="zoho"] { filter: invert(1) hue-rotate(180deg); mix-blend-mode: multiply; }

/* =========================================================================
   Page Team : mur de visages (3 oct. 2026) -- inspire de la planche-contact
   fournie par Clement : mosaique serree de portraits sur fond bleu, tuiles
   arrondies, quelques grandes tuiles pour le rythme. Nom + role en
   surimpression, details au survol (norme de survol : effet vitre bleu).
   Les 24 portraits sont les images mises en avant des posts team-member ;
   les membres sans photo gardent l'avatar de repli.
   ========================================================================= */
.bsp-team-page .team-section { max-width: 1320px; }
.bsp-team-page .team-grid {
	grid-template-columns: repeat(6, 1fr);
	grid-auto-flow: dense;
	gap: 10px;
	padding-bottom: 56px;
}
.bsp-team-page .team-card {
	position: relative;
	border-radius: 14px;
	background: var(--bsp-bg-media);
	isolation: isolate;
}
.bsp-team-page .team-card:nth-child(9n+1) { grid-column: span 2; grid-row: span 2; }
.bsp-team-page .team-card-photo { aspect-ratio: 1 / 1; height: 100%; width: 100%; }
.bsp-team-page .team-card:nth-child(9n+1) .team-card-photo { aspect-ratio: auto; }
.bsp-team-page .team-card-photo img { transition: transform .6s var(--bsp-ease), filter .4s; filter: saturate(.92); }
.bsp-team-page .team-card:hover .team-card-photo img { transform: scale(1.05); filter: saturate(1.05); }
/* Voile bas pour la lisibilite du nom */
.bsp-team-page .team-card::after {
	content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
	background: linear-gradient(0deg, rgba(6,12,24,.78) 0%, rgba(6,12,24,.0) 46%);
	transition: background .3s;
}
.bsp-team-page .team-card:hover::after {
	background:
		linear-gradient(160deg, rgba(var(--bsp-accent-rgb), 0.17) 0%, rgba(var(--bsp-accent-rgb), 0.07) 38%, rgba(6,12,24,.0) 100%),
		linear-gradient(0deg, rgba(6,12,24,.86) 0%, rgba(6,12,24,.35) 70%, rgba(6,12,24,.1) 100%);
}
.bsp-team-page .team-card-body {
	position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
	padding: 14px 16px 14px;
}
.bsp-team-page .team-card-name { color: #fff; font-size: 14px; }
.bsp-team-page .team-card-role { color: rgba(255,255,255,.78); font-size: 12px; margin-top: 2px; }
.bsp-team-page .team-card:nth-child(9n+1) .team-card-name { font-size: 18px; }
.bsp-team-page .team-card:nth-child(9n+1) .team-card-role { font-size: 13px; }
/* Details (bio, LinkedIn) : reveles au survol */
.bsp-team-page .team-card-bio,
.bsp-team-page .team-card-linkedin {
	max-height: 0; overflow: hidden; opacity: 0; margin-top: 0;
	transition: max-height .35s var(--bsp-ease), opacity .3s, margin .3s;
	color: rgba(255,255,255,.85);
}
.bsp-team-page .team-card:hover .team-card-bio { max-height: 120px; opacity: 1; margin-top: 8px; }
.bsp-team-page .team-card:hover .team-card-linkedin { max-height: 30px; opacity: 1; margin-top: 8px; }
.bsp-team-page .team-card:hover { border-color: var(--bsp-accent); background: var(--bsp-bg-media); }
@media (max-width: 1100px) { .bsp-team-page .team-grid { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 760px) {
	.bsp-team-page .team-grid { grid-template-columns: repeat(3, 1fr); gap: 8px; }
	.bsp-team-page .team-card:nth-child(9n+1) { grid-column: span 2; grid-row: span 2; }
	.bsp-team-page .team-card-body { padding: 10px; }
	.bsp-team-page .team-card-name { font-size: 12px; }
	.bsp-team-page .team-card-role { display: none; }
	.bsp-team-page .team-card:nth-child(9n+1) .team-card-role { display: block; }
}
@media (max-width: 480px) { .bsp-team-page .team-grid { grid-template-columns: repeat(2, 1fr); } }

/* Team : bande "shooting photo" (coulisses) + cadrage des visages */
.bsp-team-page .team-card-photo img { object-position: center 18%; }
.bsp-team-page .team-shoot {
	max-width: 1320px; margin: 0 auto; padding: 56px var(--bsp-gutter) 8px;
	display: grid; grid-template-columns: 1fr 1.1fr 1fr; gap: 28px; align-items: center;
}
.bsp-team-page .team-shoot figure { margin: 0; border-radius: 16px; overflow: hidden; border: 1px solid var(--bsp-border); position: relative; }
.bsp-team-page .team-shoot figure img { display: block; width: 100%; height: auto; transition: transform .8s var(--bsp-ease); }
.bsp-team-page .team-shoot figure:hover img { transform: scale(1.04); }
.bsp-team-page .team-shoot-a { transform: rotate(-2deg) translateY(10px); }
.bsp-team-page .team-shoot-b { transform: rotate(2deg) translateY(-10px); }
.bsp-team-page .team-shoot-text { text-align: center; }
.bsp-team-page .team-shoot-eyebrow { font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: .2em; text-transform: uppercase; color: var(--bsp-accent-text); margin-bottom: 14px; }
.bsp-team-page .team-shoot-title { font-family: var(--bsp-font-display); font-weight: 800; font-size: clamp(24px, 2.6vw, 38px); line-height: 1.12; color: var(--bsp-text); }
.bsp-team-page .team-shoot-title em { font-style: italic; color: var(--bsp-accent-text); font-weight: 600; font-size: .62em; display: block; margin-top: 10px; }
@media (max-width: 900px) {
	.bsp-team-page .team-shoot { grid-template-columns: 1fr 1fr; }
	.bsp-team-page .team-shoot-text { grid-column: 1 / -1; order: -1; }
}

/* Contact : meme image de fond et meme formulaire que l'accueil (demande de Clement).
   Image = celle de la section Contact de l'accueil (home/office.webp) + meme voile sombre.
   Le formulaire est maintenant le module Divi natif .bsp-home-contact-form (norme du site). */
body #page-container .et_pb_section.bsp-contact-form-section {
	background-image:
		linear-gradient(180deg, rgba(13,16,24,0.55) 0%, rgba(13,16,24,0.88) 100%),
		url("/wp-content/themes/bsp-corp-child/assets/images/home/office.webp") !important;
	background-size: cover !important;
	background-position: center 30% !important;
	background-color: #0d1018;
}
.bsp-contact-form-row .bsp-home-contact-form.et_pb_contact_form_container { max-width: none; margin-top: var(--bsp-space-4); }

/* Team v2 (3 oct. 2026) : bande d'ouverture en mosaique bleue + fond bleu studio
   sur les portraits reels. Les 2 portraits de la bande sont des images de
   synthese (placeholders de Clement, fond bleu) -- a remplacer par les vraies. */
.bsp-team-page .team-shoot { grid-template-columns: 0.8fr 1.1fr 1.15fr 1.1fr 0.8fr; gap: 18px; padding-top: 72px; }
.bsp-team-page .team-shoot figure { border: 0; box-shadow: 0 24px 60px rgba(0,0,0,.5), 0 0 0 1px rgba(var(--bsp-accent-rgb), .25); }
.bsp-team-page .team-shoot-1 { transform: translateY(26px) rotate(-1.5deg); }
.bsp-team-page .team-shoot-1 img, .bsp-team-page .team-shoot-4 img { aspect-ratio: 3 / 4; object-fit: cover; height: auto; }
.bsp-team-page .team-shoot-2 { transform: translateY(-14px) rotate(1.5deg); }
.bsp-team-page .team-shoot-3 { transform: translateY(14px) rotate(-1.5deg); }
.bsp-team-page .team-shoot-4 { transform: translateY(-26px) rotate(1.5deg); }
.bsp-team-page .team-shoot-a, .bsp-team-page .team-shoot-b { transform: none; }
@media (max-width: 900px) {
	.bsp-team-page .team-shoot { grid-template-columns: 1fr 1fr; }
	.bsp-team-page .team-shoot-text { grid-column: 1 / -1; order: -1; }
	.bsp-team-page .team-shoot figure { transform: none !important; }
}
/* Fond bleu studio derriere les portraits reels (le fond blanc devient bleu) */
.bsp-team-page .team-card-photo { position: relative; background: linear-gradient(160deg, #3f78d8, #1c4aa6); }
.bsp-team-page .team-card-photo img { mix-blend-mode: multiply; filter: saturate(1.05) contrast(1.04); }
.bsp-team-page .team-card:hover .team-card-photo img { mix-blend-mode: normal; }

/* =========================================================================
   Team v3 (3 oct. 2026) -- direction "editorial bento" (reference de design :
   panneaux a coin decoupe en onglet, grands chiffres, textures a rainures,
   etiquettes vitrees). Transposee a l'identite BSP (bleu accent, Playfair,
   Montserrat) -- aucune image ni texte repris de la reference.
   ========================================================================= */
.bsp-team-page { --tb-notch: 22px; --tb-r: 22px; }

/* --- Bento d'ouverture --- */
.bsp-team-page .team-shoot { display: none; }
.bsp-team-page .team-bento {
	max-width: 1320px; margin: 0 auto; padding: 24px var(--bsp-gutter) 0;
	display: grid; gap: 14px;
	grid-template-columns: repeat(12, 1fr);
	grid-template-rows: 250px 250px;
}
.bsp-team-page .tb-stat {
	grid-column: 1 / span 5; grid-row: 1 / span 2;
	position: relative; overflow: hidden;
	border-radius: var(--tb-r);
	padding: 34px 36px;
	display: flex; flex-direction: column; justify-content: flex-end;
	color: #fff;
	background:
		repeating-linear-gradient(90deg, rgba(255,255,255,.055) 0 2px, transparent 2px 9px),
		radial-gradient(120% 90% at 0% 0%, rgba(120,170,255,.55) 0%, transparent 55%),
		linear-gradient(160deg, #1f52c4 0%, #0d2d7a 55%, #0a1c52 100%);
	clip-path: polygon(0 0, calc(100% - 150px) 0, calc(100% - 118px) 52px, 100% 52px, 100% 100%, 0 100%);
}
.bsp-team-page .tb-tag {
	position: absolute; top: 24px; left: 28px;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: .16em; text-transform: uppercase;
	padding: 9px 14px; border: 1px solid rgba(255,255,255,.35); border-radius: 8px;
	background: rgba(255,255,255,.08); backdrop-filter: blur(6px);
}
.bsp-team-page .tb-num {
	font-family: var(--bsp-font-display); font-weight: 400; line-height: .86;
	font-size: clamp(120px, 15vw, 220px); letter-spacing: -0.04em;
	color: #eaf3ff;
}
.bsp-team-page .tb-num em { font-style: normal; color: #7fb4ff; font-size: .62em; vertical-align: top; margin-left: 4px; }
.bsp-team-page .tb-label { font-family: var(--bsp-font-label); font-weight: 700; font-size: 13px; letter-spacing: .2em; text-transform: uppercase; margin: 14px 0 18px; }
.bsp-team-page .tb-places { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.bsp-team-page .tb-places li {
	font-family: var(--bsp-font-body); font-size: 15.5px; padding: 6px 12px;
	border: 1px solid rgba(255,255,255,.3); border-radius: 100px; background: rgba(255,255,255,.07);
}
.bsp-team-page .tb-ph { margin: 0; position: relative; overflow: hidden; border-radius: var(--tb-r); background: #0a1c52; }
.bsp-team-page .tb-ph img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .9s var(--bsp-ease); }
.bsp-team-page .tb-ph:hover img { transform: scale(1.05); }
.bsp-team-page .tb-ph::after { content: ""; position: absolute; inset: 0; background: linear-gradient(0deg, rgba(6,12,24,.45), transparent 45%); pointer-events: none; }
.bsp-team-page .tb-ph figcaption {
	position: absolute; left: 16px; bottom: 16px; z-index: 2;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 10.5px; letter-spacing: .14em; text-transform: uppercase; color: #fff;
	padding: 8px 12px; border: 1px solid rgba(255,255,255,.4); border-radius: 8px; background: rgba(255,255,255,.12); backdrop-filter: blur(8px);
}
.bsp-team-page .tb-ph-1 { grid-column: 6 / span 4; grid-row: 1; }
.bsp-team-page .tb-ph-2 { grid-column: 10 / span 3; grid-row: 1; }
.bsp-team-page .tb-ph-3 { grid-column: 6 / span 3; grid-row: 2; }
.bsp-team-page .tb-ph-4 { grid-column: 9 / span 4; grid-row: 2; }
.bsp-team-page .tb-ph-2 img, .bsp-team-page .tb-ph-3 img { object-position: center 20%; }

/* --- Mur de portraits : nom dans un onglet decoupe (coin bas-gauche) --- */
.bsp-team-page .team-section { padding-top: 14px; border-top: 0; }
.bsp-team-page .team-grid { gap: 14px; padding-bottom: 72px; }
.bsp-team-page .team-card { border-radius: var(--tb-r); border: 0; background: #0a1c52; --tab-bg: var(--bsp-bg); }
.bsp-team-page .team-card::after { display: none; }
.bsp-team-page .team-card-photo { background: linear-gradient(160deg, #3f78d8, #1c4aa6); }
.bsp-team-page .team-card-body {
	right: auto; left: 0; bottom: 0; max-width: 88%;
	background: var(--tab-bg);
	padding: 12px 18px 12px 4px;
	border-top-right-radius: 16px;
	transition: padding .3s var(--bsp-ease);
}
.bsp-team-page .team-card-body::before,
.bsp-team-page .team-card-body::after {
	content: ""; position: absolute; width: 16px; height: 16px; pointer-events: none;
}
.bsp-team-page .team-card-body::before { left: 0; top: -16px; background: radial-gradient(circle at 100% 0, transparent 16px, var(--tab-bg) 16.5px); }
.bsp-team-page .team-card-body::after  { right: -16px; bottom: 0; background: radial-gradient(circle at 100% 0, transparent 16px, var(--tab-bg) 16.5px); }
.bsp-team-page .team-card-name { color: var(--bsp-text); padding-left: 14px; font-size: 13.5px; }
.bsp-team-page .team-card-role { color: var(--bsp-accent-text); padding-left: 14px; font-size: 11.5px; }
.bsp-team-page .team-card-bio, .bsp-team-page .team-card-linkedin { color: var(--bsp-text-soft); padding-left: 14px; }
.bsp-team-page .team-card:nth-child(9n+1) .team-card-name { font-size: 17px; }
.bsp-team-page .team-card:hover { box-shadow: 0 0 0 1.5px var(--bsp-accent), 0 24px 60px rgba(var(--bsp-accent-rgb), .22); }
.bsp-team-page .team-card:hover .team-card-photo img { mix-blend-mode: multiply; transform: scale(1.06); }

@media (max-width: 1000px) {
	.bsp-team-page .team-bento { grid-template-columns: repeat(6, 1fr); grid-template-rows: 300px 200px 200px; }
	.bsp-team-page .tb-stat { grid-column: 1 / -1; grid-row: 1; justify-content: flex-end; }
	.bsp-team-page .tb-ph-1 { grid-column: 1 / span 3; grid-row: 2; }
	.bsp-team-page .tb-ph-2 { grid-column: 4 / span 3; grid-row: 2; }
	.bsp-team-page .tb-ph-3 { grid-column: 1 / span 3; grid-row: 3; }
	.bsp-team-page .tb-ph-4 { grid-column: 4 / span 3; grid-row: 3; }
}
@media (max-width: 560px) { .bsp-team-page .tb-num { font-size: 110px; } .bsp-team-page .team-card-body { padding-right: 12px; } }
/* Team v3 -- reglages : fond studio bleu plus clair (visages lisibles), onglet sans coin gauche */
.bsp-team-page .team-card-photo { background: linear-gradient(160deg, #b4d0ff 0%, #7aa6f0 55%, #5b8be0 100%); }
.bsp-team-page .team-card-photo img { filter: saturate(1.08) contrast(1.02); }
.bsp-team-page .team-card-body::before { display: none; }
/* Membres sans photo (Hakim, Kishore, Raja) : silhouette fondue dans le fond studio */
.bsp-team-page .team-card-photo img[src*="avatar-placeholder"] { mix-blend-mode: overlay; opacity: .9; }
.bsp-team-page .team-card:hover .team-card-photo img[src*="avatar-placeholder"] { mix-blend-mode: overlay; }

/* =========================================================================
   Team v4 (4 oct. 2026) : retours de Clement
   - panneau « 27+ » : simple rectangle aux coins arrondis (coin decoupe retire)
   - plus de noms/onglets sur les photos ; membres regroupes par expertise,
     chaque groupe ouvert par une ligne : titre: filet: nombre de specialistes
   ========================================================================= */
.bsp-team-page .tb-stat { clip-path: none; }

.bsp-team-page .team-intro { max-width: 1320px; margin: 0 auto; padding: 64px var(--bsp-gutter) 8px; }
.bsp-team-page .team-intro-eyebrow { font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: .2em; text-transform: uppercase; color: var(--bsp-accent-text); margin-bottom: 14px; }
.bsp-team-page .team-intro-text { font-family: var(--bsp-font-display); font-weight: 500; font-size: clamp(20px, 2.1vw, 30px); line-height: 1.35; color: var(--bsp-text); max-width: 60ch; margin: 0; }

.bsp-team-page .team-group { padding-top: 48px; border-top: 0; }
.bsp-team-page .tg-head { display: flex; align-items: baseline; gap: 20px; margin-bottom: 22px; }
.bsp-team-page .tg-title { font-family: var(--bsp-font-display); font-weight: 800; font-size: clamp(22px, 2.2vw, 30px); color: var(--bsp-text); margin: 0; white-space: nowrap; }
.bsp-team-page .tg-line { flex: 1; height: 1px; background: var(--bsp-border-strong, rgba(255,255,255,.18)); align-self: center; }
.bsp-team-page .tg-count { font-family: var(--bsp-font-label); font-weight: 700; font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--bsp-text-faint); white-space: nowrap; }

/* Cartes : photo nette + nom/role SOUS la photo (plus de surimpression) */
.bsp-team-page .team-grid { grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); grid-auto-flow: row; gap: 22px 16px; padding-bottom: 0; }
.bsp-team-page .team-card:nth-child(9n+1) { grid-column: auto; grid-row: auto; }
.bsp-team-page .team-card { background: transparent; border-radius: 18px; box-shadow: none; overflow: visible; }
.bsp-team-page .team-card-photo { aspect-ratio: 1 / 1; height: auto; border-radius: 18px; overflow: hidden; }
.bsp-team-page .team-card-photo img { object-position: center 18%; }
.bsp-team-page .team-card::after { display: none; }
.bsp-team-page .team-card-body {
	position: static; max-width: none; background: transparent; padding: 12px 4px 0; border-radius: 0;
}
.bsp-team-page .team-card-body::before, .bsp-team-page .team-card-body::after { display: none; }
.bsp-team-page .team-card-name, .bsp-team-page .team-card:nth-child(9n+1) .team-card-name { padding: 0; font-size: 15px; }
.bsp-team-page .team-card-role, .bsp-team-page .team-card:nth-child(9n+1) .team-card-role { padding: 0; font-size: 12.5px; color: var(--bsp-text-soft); margin-top: 3px; display: block; }
.bsp-team-page .team-card-bio, .bsp-team-page .team-card-linkedin { display: none; }
.bsp-team-page .team-card:hover { box-shadow: none; background: transparent; }
.bsp-team-page .team-card:hover .team-card-photo { box-shadow: 0 0 0 1.5px var(--bsp-accent), 0 18px 44px rgba(var(--bsp-accent-rgb), .25); }
.bsp-team-page .team-card:hover .team-card-name { color: var(--bsp-accent-text); }
@media (max-width: 760px) {
	.bsp-team-page .team-grid { grid-template-columns: repeat(2, 1fr); gap: 18px 12px; }
	.bsp-team-page .tg-head { flex-wrap: wrap; gap: 6px 14px; }
	.bsp-team-page .tg-line { display: none; }
	.bsp-team-page .team-card-role { display: block; }
}
/* Team : le multiply reste isole dans la tuile (rendu plus leger) */
.bsp-team-page .team-card-photo { isolation: isolate; transform: translateZ(0); }
/* Team : le fond bleu studio est desormais integre aux fichiers (roster-blue/ -> mediatheque) :
   plus de mix-blend-mode, rendu immediat. */
.bsp-team-page .team-card-photo img { mix-blend-mode: normal !important; filter: none; }
.bsp-team-page .team-card:hover .team-card-photo img { mix-blend-mode: normal !important; }


/* =============================================================
   TEAM v5 · grille par expertise + fiche employé (5 oct. 2026)
   -------------------------------------------------------------
   Grille : cartes .tmc (photo 4:5, les portraits paysage prennent
   deux colonnes), bouton rond « fiche » sur chaque photo.
   Fiche : gabarit Divi « All Team Members » (classes .tm-*),
   corps de page porte .bsp-team-member.
   ============================================================= */

/* --- Grille ------------------------------------------------- */
.bsp-team-page .tmg {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
	grid-auto-flow: dense;
	gap: 36px 22px;
}
.bsp-team-page .tmc { display: block; min-width: 0; }
.bsp-team-page .tmc--wide { grid-column: span 2; }
.bsp-team-page .tmc-link {
	display: grid;
	grid-template-rows: 1fr auto;
	height: 100%;
	color: inherit;
	text-decoration: none;
}
.bsp-team-page .tmc-photo {
	position: relative;
	display: block;
	aspect-ratio: 4 / 5;
	min-height: 0;
	border-radius: 22px;
	overflow: hidden;
	isolation: isolate;
	background: linear-gradient(160deg, #3f86e8 0%, #1f5fc4 100%);
	transform: translateZ(0);
	transition: box-shadow .4s var(--bsp-ease), transform .4s var(--bsp-ease);
}
.bsp-team-page .tmc--wide .tmc-photo { aspect-ratio: auto; }
.bsp-team-page .tmc-photo img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: 50% 22%;
	transition: transform .7s var(--bsp-ease);
}
.bsp-team-page .tmc--wide .tmc-photo img { object-position: 50% 40%; }
.bsp-team-page .tmc-photo img[src*="avatar-placeholder"] { opacity: .9; }

/* Bouton rond « voir la fiche » : verre sur la photo, se déploie au survol. */
.bsp-team-page .tmc-btn {
	position: absolute;
	right: 12px;
	bottom: 12px;
	z-index: 2;
	display: inline-flex;
	align-items: center;
	height: 42px;
	border-radius: 999px;
	color: #fff;
	background: rgba(10, 13, 20, .38);
	border: 1px solid rgba(255, 255, 255, .42);
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
	overflow: hidden;
	transition: background .3s var(--bsp-ease), color .3s var(--bsp-ease), border-color .3s var(--bsp-ease);
}
.bsp-team-page .tmc-btn-label {
	max-width: 0;
	opacity: 0;
	white-space: nowrap;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 10.5px;
	letter-spacing: .14em;
	text-transform: uppercase;
	transition: max-width .4s var(--bsp-ease), opacity .3s ease, padding .4s var(--bsp-ease);
}
.bsp-team-page .tmc-btn-arrow {
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	flex: none;
}
.bsp-team-page .tmc-btn-arrow::before {
	content: "\f061";
	font-family: "FontAwesome";
	font-weight: 400;
	font-size: 14px;
	line-height: 1;
	transition: transform .35s var(--bsp-ease);
}
.bsp-team-page .tmc-link:hover .tmc-btn-label,
.bsp-team-page .tmc-link:focus-visible .tmc-btn-label { max-width: 110px; opacity: 1; padding-left: 16px; }
.bsp-team-page .tmc-link:hover .tmc-btn,
.bsp-team-page .tmc-link:focus-visible .tmc-btn {
	background: #fff;
	color: var(--bsp-accent-fill);
	border-color: #fff;
}
.bsp-team-page .tmc-link:hover .tmc-btn-arrow::before { transform: translateX(2px); }
.bsp-team-page .tmc-link:hover .tmc-photo,
.bsp-team-page .tmc-link:focus-visible .tmc-photo {
	box-shadow: 0 0 0 1.5px var(--bsp-accent), 0 20px 50px rgba(var(--bsp-accent-rgb), .28);
	transform: translateY(-3px);
}
.bsp-team-page .tmc-link:hover .tmc-photo img { transform: scale(1.045); }
.bsp-team-page .tmc-link:focus-visible { outline: none; }

.bsp-team-page .tmc-body { display: block; padding: 14px 4px 0; }
.bsp-team-page .tmc-name {
	display: block;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 15px;
	line-height: 1.3;
	color: var(--bsp-text);
	transition: color .3s var(--bsp-ease);
}
.bsp-team-page .tmc-role {
	display: block;
	margin-top: 3px;
	font-size: 13px;
	line-height: 1.45;
	color: var(--bsp-text-soft);
}
.bsp-team-page .tmc-link:hover .tmc-name { color: var(--bsp-accent-text); }

@media (max-width: 700px) {
	.bsp-team-page .tmg { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px 14px; }
	.bsp-team-page .tmc-btn { right: 8px; bottom: 8px; height: 36px; }
	.bsp-team-page .tmc-btn-arrow { width: 34px; height: 34px; }
	.bsp-team-page .tmc-btn-label { display: none; }
	.bsp-team-page .tmc-photo { border-radius: 16px; }
}

/* --- Fiche employé (gabarit Divi) ----------------------------- */
body.bsp-team-member .bsp-tm-section.et_pb_section { padding: 0 !important; background: transparent !important; }
body.bsp-team-member .bsp-tm-section .et_pb_row { width: 100% !important; max-width: none !important; padding: 0 !important; }
body.bsp-team-member .bsp-tm-section .et_pb_column { margin: 0 !important; padding: 0 !important; }
body.bsp-team-member .bsp-tm-section .et_pb_module { margin: 0 !important; }
body.bsp-team-member .bsp-tm-section .et_pb_text_inner { color: inherit; }
body.bsp-team-member .bsp-tm-section.et_pb_section > .et_pb_row,
body.bsp-team-member .bsp-tm-section .et_pb_text_inner { position: relative; }

/* Hero : texte à gauche, portrait à droite. */
body.bsp-team-member .tm-hero {
	max-width: 1200px;
	margin: 0 auto;
	padding: 72px var(--bsp-gutter) 64px;
	display: grid;
	grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
	gap: 72px;
	align-items: center;
}
body.bsp-team-member .tm-back {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin-bottom: 36px;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: var(--bsp-text-soft);
	text-decoration: none;
	transition: color .3s var(--bsp-ease);
}
body.bsp-team-member .tm-back:hover { color: var(--bsp-accent-text); }
body.bsp-team-member .tm-back-arrow::before,
body.bsp-team-member .tm-arrow::before {
	font-family: "FontAwesome";
	font-weight: 400;
	line-height: 1;
	display: inline-block;
	transition: transform .35s var(--bsp-ease);
}
body.bsp-team-member .tm-back-arrow::before { content: "\f060"; }
body.bsp-team-member .tm-back:hover .tm-back-arrow::before { transform: translateX(-3px); }
body.bsp-team-member .tm-arrow::before { content: "\f061"; margin-left: 10px; }
body.bsp-team-member .tm-linkedin:hover .tm-arrow::before,
body.bsp-team-member .tm-cta-link:hover .tm-arrow::before { transform: translateX(3px); }

body.bsp-team-member .tm-chip {
	display: inline-block;
	margin-bottom: 22px;
	padding: 7px 14px;
	border-radius: 999px;
	border: 1px solid rgba(var(--bsp-accent-rgb), .45);
	background: rgba(var(--bsp-accent-rgb), .10);
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: var(--bsp-accent-text);
}
body.bsp-team-member .tm-chip:empty { display: none; }
body.bsp-team-member .tm-name {
	margin: 0 0 14px;
	padding: 0;
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(40px, 5.2vw, 76px);
	line-height: 1.02;
	letter-spacing: -.01em;
	color: var(--bsp-text);
}
body.bsp-team-member .tm-role {
	margin: 0 0 36px;
	padding: 0;
	font-size: clamp(18px, 1.7vw, 22px);
	line-height: 1.5;
	color: var(--bsp-text-soft);
}
body.bsp-team-member .tm-linkedin {
	display: inline-flex;
	align-items: center;
	padding: 14px 26px;
	border-radius: 999px;
	border: 1px solid var(--bsp-accent);
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 12px;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--bsp-accent-text);
	text-decoration: none;
	transition: background .3s var(--bsp-ease), color .3s var(--bsp-ease), box-shadow .3s var(--bsp-ease);
}
body.bsp-team-member .tm-linkedin:hover { background: var(--bsp-hover-tint); box-shadow: 0 0 0 1px var(--bsp-accent); }
body.bsp-team-member .tm-linkedin[href=""],
body.bsp-team-member .tm-linkedin:not([href]) { display: none; }
body.bsp-team-member .tm-actions:has(> .tm-linkedin[href=""]) { display: none; }

body.bsp-team-member .tm-photo {
	margin: 0;
	position: relative;
	aspect-ratio: 4 / 5;
	border-radius: 28px;
	overflow: hidden;
	isolation: isolate;
	background: linear-gradient(160deg, #3f86e8 0%, #1f5fc4 100%);
	box-shadow: 0 0 0 1px rgba(var(--bsp-accent-rgb), .35), 0 40px 90px rgba(var(--bsp-accent-rgb), .25);
}
body.bsp-team-member .tm-photo img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: 50% 22%;
	display: block;
}

/* Corps : citation + questions/réponses. */
body.bsp-team-member .tm-body {
	max-width: 1200px;
	margin: 0 auto;
	padding: 24px var(--bsp-gutter) 24px;
}
body.bsp-team-member .tm-quote {
	position: relative;
	margin: 0 0 56px;
	padding: 0 0 0 32px;
	border: 0;
	border-left: 3px solid var(--bsp-accent);
	max-width: 900px;
	font-family: var(--bsp-font-display);
	font-style: italic;
	font-weight: 600;
	font-size: clamp(22px, 2.4vw, 32px);
	line-height: 1.45;
	white-space: pre-line;
	color: var(--bsp-text);
}
body.bsp-team-member .tm-quote:empty { display: none; }
body.bsp-team-member .tm-grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 22px;
}
body.bsp-team-member .tm-qa,
body.bsp-team-member .tm-certs {
	padding: 32px 34px 34px;
	border-radius: 22px;
	border: 1px solid var(--bsp-border);
	background: var(--bsp-surface);
	transition: background .35s var(--bsp-ease), border-color .35s var(--bsp-ease), backdrop-filter .35s ease;
}
body.bsp-team-member .tm-qa:hover,
body.bsp-team-member .tm-certs:hover {
	background: var(--bsp-hover-glass);
	border-color: var(--bsp-accent);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
}
body.bsp-team-member .tm-qa-q {
	margin: 0 0 14px;
	padding: 0;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11.5px;
	letter-spacing: .18em;
	text-transform: uppercase;
	line-height: 1.5;
	color: var(--bsp-accent-text);
}
body.bsp-team-member .tm-qa-a,
body.bsp-team-member .tm-certs-a {
	font-size: 22px;
	line-height: 1.4;
	white-space: pre-line;
	color: var(--bsp-text-soft);
}
body.bsp-team-member .tm-qa:has(> .tm-qa-a:empty),
body.bsp-team-member .tm-certs:has(> .tm-certs-a:empty) { display: none; }
body.bsp-team-member .tm-certs { margin-top: 22px; }

/* Appel à l'action. */
body.bsp-team-member .tm-cta {
	max-width: 1200px;
	margin: 64px auto 96px;
	padding: 52px var(--bsp-gutter);
	background: rgba(var(--bsp-accent-rgb), .06);
	border: 1px solid rgba(var(--bsp-accent-rgb), .18);
	border-radius: var(--bsp-radius);
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 40px;
}
body.bsp-team-member .tm-cta-eyebrow {
	margin-bottom: 14px;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 11px;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: var(--bsp-accent-text);
}
body.bsp-team-member .tm-cta-title {
	margin: 0;
	padding: 0;
	font-family: var(--bsp-font-display);
	font-weight: 800;
	font-size: clamp(22px, 2.4vw, 34px);
	line-height: 1.15;
	color: var(--bsp-text);
}
body.bsp-team-member .tm-cta-title em { font-style: italic; color: var(--bsp-accent-text); }
body.bsp-team-member .tm-cta-buttons { display: flex; align-items: center; gap: 28px; flex-wrap: wrap; }
body.bsp-team-member .tm-cta-link {
	display: inline-flex;
	align-items: center;
	font-family: var(--bsp-font-label);
	font-weight: 700;
	font-size: 12px;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--bsp-text);
	text-decoration: none;
	transition: color .3s var(--bsp-ease);
}
body.bsp-team-member .tm-cta-link:hover { color: var(--bsp-accent-text); }

@media (max-width: 900px) {
	body.bsp-team-member .tm-hero { grid-template-columns: 1fr; gap: 40px; padding: 40px 24px 40px; }
	body.bsp-team-member .tm-photo { order: -1; max-width: 420px; }
	body.bsp-team-member .tm-body { padding: 16px 24px; }
	body.bsp-team-member .tm-grid { grid-template-columns: 1fr; }
	body.bsp-team-member .tm-cta { flex-direction: column; align-items: flex-start; margin: 48px 24px 72px; padding: 36px 24px; }
}

/* Team v5: correctif : le texte des cartes colle à la photo (la ligne extensible passe sous le texte). */
.bsp-team-page .tmc-link { grid-template-rows: auto 1fr; }
.bsp-team-page .tmc--wide .tmc-link { grid-template-rows: 1fr auto; }
.bsp-team-page .tmc-photo { transform: none; }
.bsp-team-page .tmc-link:hover .tmc-photo, .bsp-team-page .tmc-link:focus-visible .tmc-photo { transform: translateY(-3px); }

/* Team v5: fiche : retour sur sa propre ligne, dégagement sous l'en-tête fixe. */
body.bsp-team-member .tm-hero { padding-top: 150px; }
body.bsp-team-member .tm-back { display: flex; width: max-content; }
@media (max-width: 900px) { body.bsp-team-member .tm-hero { padding-top: 120px; } }
body.bsp-team-member .tm-cta .btn-primary {
	display: inline-block;
	background: var(--bsp-accent-fill); color: #fff;
	font-family: var(--bsp-font-label); font-weight: 700; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
	padding: 16px 32px; border-radius: 100px; white-space: nowrap; text-decoration: none;
	transition: background var(--bsp-speed) var(--bsp-ease), color var(--bsp-speed) var(--bsp-ease), box-shadow var(--bsp-speed) var(--bsp-ease);
}
body.bsp-team-member .tm-cta .btn-primary:hover { background: #fff; color: var(--bsp-accent-fill); box-shadow: inset 0 0 0 1px var(--bsp-accent-fill); }
body.bsp-team-member .tm-quote { font-size: clamp(20px, 2vw, 28px); font-weight: 500; }
body.bsp-team-member,
body.bsp-team-member #page-container,
body.bsp-team-member #main-content { background: var(--bsp-bg); }
body.bsp-team-member .et-l--body { background: var(--bsp-bg) !important; color: var(--bsp-text); }
body.bsp-team-member,
body.bsp-team-member #page-container,
body.bsp-team-member #main-content,
body.bsp-team-member .et-l--body { background: var(--bsp-bg) !important; color: var(--bsp-text); }

/* Pages d'expertise: air autour des titres de section (5 oct. 2026, retour de Clement) :
   le titre « Put Zoho at the heart of … » collait au filet du dessus, et les cartes de
   fonctionnalites au filet du dessous. Les sections avaient ete mises a padding 0 sans
   rendre d'air a leur contenu. Valable pour toutes les pages d'expertise. */
body #page-container .et_pb_section.bsp-expertise-products-section { padding: 72px 0 80px !important; }
body #page-container .et_pb_section.bsp-expertise-domain-intro-section { padding-bottom: 80px !important; }
.et_pb_row.bsp-expertise-products-grid { margin-top: 36px !important; }
@media (max-width: 640px) {
	body #page-container .et_pb_section.bsp-expertise-products-section { padding: 48px 0 56px !important; }
	body #page-container .et_pb_section.bsp-expertise-domain-intro-section { padding-bottom: 56px !important; }
}

/* Pages d'expertise: rangee « Built with » + bouton (5 oct. 2026, retour de Clement) :
   - le bouton « Schedule consultation » colle au bord droit de la colonne de droite
     (Divi laissait une marge a droite de la demi-colonne) ;
   - la ligne sous la rangee est descendue (air sous les pastilles et le bouton) ;
   - survol du bouton : plus de double contour ni de chevron Divi, meme rendu que
     les autres boutons pleins (fond blanc, texte et contour bleus). */
.et_pb_row.bsp-expertise-top-cta > .et_pb_column { margin-right: 0 !important; margin-bottom: 0 !important; }
.et_pb_row.bsp-expertise-top-cta .et_pb_button_module_wrapper { margin: 0; text-align: right; }
body #page-container .et_pb_section.bsp-expertise-top-cta-section { padding-bottom: 40px !important; }
body #page-container .bsp-btn-pill-header.et_pb_button,
body #page-container .bsp-btn-pill-header.et_pb_button:hover {
	border: 0 !important;
	padding: 14px 30px !important;
	margin: 0;
}
body #page-container .bsp-btn-pill-header.et_pb_button::after,
body #page-container .bsp-btn-pill-header.et_pb_button:hover::after { display: none !important; content: none !important; }
body #page-container .bsp-btn-pill-header.et_pb_button:hover { box-shadow: inset 0 0 0 1px var(--bsp-accent-fill) !important; }
.et_pb_row.bsp-expertise-top-cta::before,
.et_pb_row.bsp-expertise-top-cta::after { display: none !important; content: none !important; }

/* Page Equipe : reduire l'espace entre le bandeau et le bento (5 oct. 2026).
   Le bloc .team-hero est vide (textes masques) mais gardait 128 px de padding. */
body.bsp-has-page-hero .bsp-team-page .team-hero { display: none; }
body.page-id-584 .et_pb_section_0.et_pb_section { padding-top: 0 !important; }
body.page-id-584 .et_pb_section_0 > .et_pb_row { padding-top: 0 !important; }
body.page-id-584 .bsp-team-page .team-bento { padding-top: 56px; }

/* Bas du bandeau : plus aucune ligne, seulement une ombre douce portee par le bandeau
   lui-meme (5 oct. 2026). Le pseudo-element 1 px est supprime : il laissait un filet
   (ligne d'antialiasing sur hauteur fractionnaire). */
.bsp-page-hero .ph-inner::after { display: none !important; }
.bsp-page-hero { position: relative; z-index: 2; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.28); }

/* =========================================================================
   DNA: bandeau « Meet the team » (5 oct. 2026)
   Photo de groupe en arriere-plan, adoucie (fade) ; texte a gauche.
   - Version A (defaut) : fond seul, plus de photo dans un carre.
   - Version B (body.bsp-cta-b) : meme fond + photo carree par-dessus, a gauche.
   Fleche du bouton : glyphe Font Awesome (norme boutons), plus de caractere texte.
   ========================================================================= */
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta {
	position: relative; isolation: isolate;
	display: flex; align-items: center; min-height: 420px;
	background: var(--bsp-surface-deep) url("/wp-content/themes/bsp-corp-child/assets/images/team/team-group-bg.jpg") center 30% / cover no-repeat;
}
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta::before {
	content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
	background: linear-gradient(90deg, rgba(13,21,38,.95) 0%, rgba(13,21,38,.86) 42%, rgba(13,21,38,.62) 100%);
}
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media { display: none; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .et_pb_column { margin-right: 0 !important; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body { padding: 64px 72px; width: auto; flex: 1 1 auto; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body :is(h2, h2 *) { color: #fff; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body p { color: rgba(255,255,255,.82); }

/* Version B : photo carree par-dessus le fond */
body.bsp-cta-b .et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media {
	display: block; flex: 0 0 auto; width: 300px !important; height: 300px; min-height: 0;
	margin: 0 0 0 64px !important; border-radius: 20px; overflow: hidden;
	box-shadow: 0 18px 40px rgba(0,0,0,.45); border: 1px solid rgba(255,255,255,.18);
}
body.bsp-cta-b .et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body { flex: 1 1 auto; }
@media (max-width: 980px) {
	.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta { flex-direction: column; align-items: stretch; }
	.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body { padding: 44px 28px; }
	body.bsp-cta-b .et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media { margin: 32px auto 0 !important; width: 240px !important; height: 240px; }
}

/* Fleche Font Awesome du bouton */
.bsp-dna-btn-primary::after {
	content: "\f061"; font-family: "FontAwesome"; font-weight: 400; font-size: 13px; line-height: 1;
	display: inline-block; transition: transform .25s var(--bsp-ease);
}
.bsp-dna-btn-primary:hover::after { transform: translateX(3px); }

/* DNA: « Meet the team » : retour a la mise en page d'origine (photo a gauche,
   texte et bouton a droite), la photo de groupe entiere dans son rectangle et
   estompee vers la droite (5 oct. 2026). Remplace le fond plein cadre ci-dessus. */
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta {
	display: flex; align-items: stretch; min-height: 0;
	background: var(--bsp-surface-deep); isolation: auto;
}
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta::before { display: none; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media,
body.bsp-cta-b .et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media {
	display: block; position: relative; flex: 0 0 64%; width: 64% !important; height: auto; min-height: 0;
	margin: 0 !important; border: 0; border-radius: 0; box-shadow: none; overflow: hidden;
	aspect-ratio: 16 / 9;
	-webkit-mask-image: linear-gradient(90deg, #000 0%, #000 55%, transparent 100%);
	        mask-image: linear-gradient(90deg, #000 0%, #000 55%, transparent 100%);
}
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-media img { object-fit: cover; object-position: center; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body { flex: 1 1 36%; width: auto; padding: 48px 56px 48px 8px; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body :is(h2, h2 *) { color: var(--bsp-text); }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body p { color: var(--bsp-text-soft); }
@media (max-width: 980px) {
	.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta { flex-direction: column; }
	.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media,
	body.bsp-cta-b .et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media {
		flex: none; width: 100% !important; margin: 0 !important;
		-webkit-mask-image: linear-gradient(180deg, #000 55%, transparent 100%);
		        mask-image: linear-gradient(180deg, #000 55%, transparent 100%);
	}
	.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body { padding: 8px 28px 40px; }
}
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media,
body.bsp-cta-b .et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta > .bsp-dna-team-cta-media { aspect-ratio: auto; align-self: stretch; min-height: 420px; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta-body { padding-top: 32px; padding-bottom: 32px; }
.et_pb_section.bsp-dna-team-cta-wrap .bsp-dna-team-cta.et_pb_row { padding: 0 !important; }

/* Filtre colore du bandeau (DNA / Contact / Team) en mode « multiply » : il teinte la
   photo au lieu de la griser (5 oct. 2026). Le texte reste au-dessus (z-index 1). */
body.page-id-842 .bsp-page-hero .ph-inner::before,
body.page-id-424 .bsp-page-hero .ph-inner::before,
body.page-id-584 .bsp-page-hero .ph-inner::before { mix-blend-mode: multiply; }

/* Filtre du bandeau : degrade qui se dissout vers la droite -> photo presque intacte
   a droite, texte protege a gauche (5 oct. 2026). */
body.page-id-842 .bsp-page-hero .ph-inner::before,
body.page-id-424 .bsp-page-hero .ph-inner::before,
body.page-id-584 .bsp-page-hero .ph-inner::before {
	background: linear-gradient(90deg, rgba(6,22,46,.92) 0%, rgba(6,22,46,.82) 28%, rgba(6,22,46,.5) 48%, rgba(6,22,46,.16) 70%, rgba(6,22,46,.03) 100%);
}

/* DNA: valeurs : les 3 numeros (01/02/03) a la meme taille, et le 03 ne chevauche plus
   le titre (5 oct. 2026). Meme empilement que les deux autres cartes. */
.bsp-dna-value-card .bsp-dna-value-num,
.bsp-dna-value-card--wide .bsp-dna-value-num {
	font-size: 14px; line-height: 1.4; margin: 0 0 14px; grid-row: auto; align-self: auto; display: block;
}
.bsp-dna-value-card--wide, .bsp-dna-value-card--wide .et_pb_text_inner { display: block; }
.bsp-dna-value-card { padding: 30px 28px; }
.bsp-dna-value-card--wide { padding: 30px 28px; }

/* Accueil : texte d'accroche sous le titre -- interligne reduit, colonne un peu plus large (5 oct. 2026) */
.bsp-home-transform-body p { line-height: 1.4; margin-bottom: 14px; max-width: 540px; }
/* Textes longs (lecture continue) : interligne un peu plus aere que les sous-titres */
.bsp-cs-text p, .bsp-case-study .cs-text p, .bsp-dna-history-grid p, .bsp-partners-spotlight-body p,
.bsp-partners-card p, .bsp-contact-option-card p, body.bsp-team-member .tm-qa-a, body.bsp-team-member .tm-certs-a { line-height: 1.55; }
.bsp-home-transform-body { margin-top: 14px; }

/* Espace titre -> texte d'accroche (lead-in) : plus d'air partout (5 oct. 2026).
   padding-top plutot que margin : ne fusionne pas avec la marge basse du titre. */
.bsp-page-hero .ph-sub,
.bsp-case-study .cs-hero-sub, .bsp-cs-hero-sub,
.bsp-xp-section .xp-intro-text,
.bsp-team-page .team-hero-desc,
.bsp-home-contact-subtitle,
.bsp-hero-lead,
.bsp-blog-catalog .filter-banner-sub, .bsp-blog-catalog .sujet-intro,
.bsp-expertise-overview-intro p, .bsp-expertise-domain-intro p,
.bsp-dna-offices-intro p.desc, .bsp-dna-values-intro p.desc,
.bsp-partners-intro .desc, .bsp-partners-grid-intro .desc,
.bsp-contact-form-intro p, .bsp-expertise-cta p { padding-top: 18px; }
.bsp-home-transform-body { margin-top: 22px; }

/* DNA: valeurs : numeros 01/02/03 agrandis (14 px -> 28 px, soit 200 %), memes sur les 3 cartes (5 oct. 2026) */
.bsp-dna-value-card .bsp-dna-value-num,
.bsp-dna-value-card--wide .bsp-dna-value-num { font-size: 28px; line-height: 1; margin: 0 0 14px; }

/* =========================================================================
   FLECHES: une seule famille partout : Font Awesome (glyphe \f061), 5 oct. 2026.
   Norme : toute fleche de bouton / lien / pastille est le meme glyphe FA, en
   couleur courante (currentColor) -> repos, survol, mode clair et sombre suivent
   la couleur du bouton. Plus de caractere texte « → » ni de masque SVG.
   Trois familles : (A) fleche en fin de bouton texte, (B) pastille ronde dont
   le caractere texte est masque et remplace, (C) bouton rond .bsp-btn-round-arrow.
   ========================================================================= */

/* A. Fleche en fin de bouton / lien texte */
.bsp-hero-cta-2 .et_pb_button::after,
a.bsp-hero-cta-2.et_pb_button::after,
.bsp-home-solution-link .et_pb_button::after,
a.bsp-home-solution-link.et_pb_button::after,
.bsp-cs-cta-actions .bsp-btn-ghost::after,
.bsp-case-study .btn-ghost::after,
.bsp-dna-btn-primary::after,
.bsp-dna-values-intro a.btn-link::after {
	content: "\f061" !important;
	font-family: "FontAwesome" !important; font-weight: 900 !important; font-style: normal !important;
	font-size: .85em !important; line-height: 1 !important;
	margin-left: 10px !important; display: inline-block !important;
	position: static !important; opacity: 1 !important; width: auto !important; height: auto !important;
	transition: transform .25s var(--bsp-ease) !important;
}
.bsp-hero-cta-2 .et_pb_button:hover::after,
a.bsp-hero-cta-2.et_pb_button:hover::after,
.bsp-home-solution-link .et_pb_button:hover::after,
a.bsp-home-solution-link.et_pb_button:hover::after,
.bsp-cs-cta-actions .bsp-btn-ghost:hover::after,
.bsp-case-study .btn-ghost:hover::after,
.bsp-dna-btn-primary:hover::after,
.bsp-dna-values-intro a.btn-link:hover::after { transform: translateX(3px) !important; display: inline-block !important; }

/* B. Pastilles rondes : le « → » texte du balisage est masque (font-size 0), le glyphe FA le remplace */
.bsp-home-project-btn-icon,
.bsp-cs-card .cs-card-arrow,
.bsp-blog-catalog .card-arrow { font-size: 0 !important; line-height: 0; }
.bsp-home-project-btn-icon::before,
.bsp-cs-card .cs-card-arrow::before,
.bsp-blog-catalog .card-arrow::before {
	content: "\f061"; font-family: "FontAwesome"; font-weight: 900; font-style: normal; line-height: 1;
	font-size: 14px;
}
.bsp-home-project-btn-icon::before { font-size: 9px; }
.bsp-blog-catalog .card-arrow::before { font-size: 12px; }

/* C. Bouton rond .bsp-btn-round-arrow : glyphe FA au lieu du masque SVG */
body #page-container .bsp-btn-round-arrow::before,
body #page-container a.bsp-btn-round-arrow.et_pb_button::before {
	content: "\f061" !important;
	-webkit-mask-image: none !important; mask-image: none !important;
	background: none !important; background-color: transparent !important;
	font-family: "FontAwesome" !important; font-weight: 900 !important; font-style: normal !important;
	font-size: 14px !important; line-height: 1 !important;
	width: auto !important; height: auto !important;
	display: block !important;
}

/* Contact (5 oct. 2026) : fond plus sombre + liste des bureaux plus grande
   (villes, pictos, numeros). Ne touche que la page Contact. */
body #page-container .et_pb_section.bsp-contact-form-section {
	background-image:
		linear-gradient(180deg, rgba(10,13,20,0.80) 0%, rgba(10,13,20,0.95) 100%),
		url("/wp-content/themes/bsp-corp-child/assets/images/home/office.webp") !important;
}
.bsp-contact-office-list-wrap h3 { font-size: 30px; }
.bsp-contact-office-item { gap: 24px; padding: 24px 0; }
.bsp-contact-office-item .ol-icon { width: 72px; height: 72px; }
.bsp-contact-office-item .ol-idx { font-size: 20px; width: 34px; }
.bsp-contact-office-item .ol-city { font-size: 25px; line-height: 1.2; margin-bottom: 4px; }
.bsp-contact-office-item .ol-meta { font-size: 19px; }

/* =========================================================================
   FLECHES v2: UNE SEULE fleche, definie ici une fois (5 oct. 2026, Socle boutons).
   Norme : meme dessin partout (fleche Font Awesome « arrow-right »), CENTREE dans
   son cercle, FINE (light) au repos, GRASSE (bold) seulement au survol.
   Polices : le kit Font Awesome Pro (style Light) ne se charge pas sur le site de
   developpement et la police auto-hebergee n'a que le style plein (gras) ; le trait
   est donc livre en SVG (meme trace que le glyphe) :
   - boutons / pastilles reels : masque SVG + currentColor (couleur = celle du texte,
     donc repos, survol, clair, sombre suivent seuls) ;
   - cercles decoratifs ::after de cartes deja cliquables (exception du Socle) : SVG
     en data-URI, couleur fixee, variante pale (repos) / accent (survol), par theme.
   Remplace les blocs « FLECHES » precedents (A/B/C) et les glyphes \f061 / \f060.
   ========================================================================= */
:root {
	--bsp-arrow-light: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='black'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
	--bsp-arrow-bold:  url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='black'%20stroke-width='2.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
	--bsp-arw-rest:    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='rgb%28176%2C182%2C192%29'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
	--bsp-arw-hover:   url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='rgb%2817%2C140%2C254%29'%20stroke-width='2.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
}
:root[data-bsp-theme="light"] {
	--bsp-arw-rest:    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='rgb%2886%2C93%2C106%29'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
	--bsp-arw-hover:   url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='rgb%2813%2C109%2C196%29'%20stroke-width='2.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
}

/* Mecanique commune : masque + currentColor, fin au repos */
.bsp-hero-cta-2 .et_pb_button::after, a.bsp-hero-cta-2.et_pb_button::after,
.bsp-home-solution-link .et_pb_button::after, a.bsp-home-solution-link.et_pb_button::after,
.bsp-cs-cta-actions .bsp-btn-ghost::after, .bsp-case-study .btn-ghost::after,
.bsp-dna-btn-primary::after, .bsp-dna-values-intro a.btn-link::after,
.bsp-home-project-btn-icon::before, .bsp-cs-card .cs-card-arrow::before, .bsp-blog-catalog .card-arrow::before,
.bsp-team-page .tmc-btn-arrow::before, body.bsp-team-member .tm-arrow::before, body.bsp-team-member .tm-back-arrow::before,
body #page-container .bsp-btn-round-arrow::before, body #page-container a.bsp-btn-round-arrow.et_pb_button::before {
	content: "" !important;
	display: block !important; flex: none;
	width: 14px !important; height: 14px !important;
	font-size: 0 !important; line-height: 0 !important;
	background: currentColor !important; background-color: currentColor !important;
	-webkit-mask: var(--bsp-arrow-light) center / contain no-repeat !important;
	        mask: var(--bsp-arrow-light) center / contain no-repeat !important;
	opacity: 1 !important; position: static !important;
	transform: none; margin: 0;
	transition: transform .25s var(--bsp-ease), color .2s var(--bsp-ease) !important;
}
/* Fleche en fin de bouton texte : un peu plus grande que le corps, alignee sur le texte */
.bsp-hero-cta-2 .et_pb_button::after, a.bsp-hero-cta-2.et_pb_button::after,
.bsp-home-solution-link .et_pb_button::after, a.bsp-home-solution-link.et_pb_button::after,
.bsp-cs-cta-actions .bsp-btn-ghost::after, .bsp-case-study .btn-ghost::after,
.bsp-dna-btn-primary::after, .bsp-dna-values-intro a.btn-link::after {
	display: inline-block !important; width: 1.05em !important; height: 1.05em !important;
	margin-left: 10px !important; vertical-align: -.16em;
}
/* Tailles par composant */
.bsp-home-project-btn-icon::before { width: 10px !important; height: 10px !important; }
.bsp-blog-catalog .card-arrow::before { width: 12px !important; height: 12px !important; }
.bsp-team-page .tmc-btn-arrow::before { width: 16px !important; height: 16px !important; }
body.bsp-team-member .tm-back-arrow::before { transform: scaleX(-1); }
body.bsp-team-member .tm-arrow::before { margin-left: 10px; }
.bsp-cs-card .cs-card-arrow::before { width: 16px !important; height: 16px !important; }
body #page-container .bsp-btn-round-arrow::before, body #page-container a.bsp-btn-round-arrow.et_pb_button::before {
	position: absolute !important; top: 50% !important; left: 50% !important; margin: -8px 0 0 -8px !important;
	width: 16px !important; height: 16px !important;
}
/* Les conteneurs centrent la fleche */
.bsp-home-project-btn-icon, .bsp-cs-card .cs-card-arrow, .bsp-blog-catalog .card-arrow,
.bsp-team-page .tmc-btn-arrow { display: grid !important; place-items: center; }

/* Survol : fleche GRASSE (et petit glissement) */
.bsp-hero-cta-2 .et_pb_button:hover::after, a.bsp-hero-cta-2.et_pb_button:hover::after,
.bsp-home-solution-link .et_pb_button:hover::after, a.bsp-home-solution-link.et_pb_button:hover::after,
.bsp-cs-cta-actions .bsp-btn-ghost:hover::after, .bsp-case-study .btn-ghost:hover::after,
.bsp-dna-btn-primary:hover::after, .bsp-dna-values-intro a.btn-link:hover::after,
.bsp-home-project-card:hover .bsp-home-project-btn-icon::before,
.bsp-cs-card:hover .cs-card-arrow::before,
.bsp-blog-catalog .cat-card:hover .card-arrow::before, .bsp-blog-catalog .card-featured:hover .card-arrow::before,
.bsp-team-page .tmc-link:hover .tmc-btn-arrow::before,
body.bsp-team-member .tm-linkedin:hover .tm-arrow::before, body.bsp-team-member .tm-cta-link:hover .tm-arrow::before,
body.bsp-team-member .tm-back:hover .tm-back-arrow::before,
body #page-container .bsp-btn-round-arrow:hover::before, body #page-container a.bsp-btn-round-arrow.et_pb_button:hover::before,
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow::before {
	-webkit-mask-image: var(--bsp-arrow-bold) !important; mask-image: var(--bsp-arrow-bold) !important;
	display: block !important;
}
.bsp-hero-cta-2 .et_pb_button:hover::after, a.bsp-hero-cta-2.et_pb_button:hover::after,
.bsp-home-solution-link .et_pb_button:hover::after, a.bsp-home-solution-link.et_pb_button:hover::after,
.bsp-cs-cta-actions .bsp-btn-ghost:hover::after, .bsp-case-study .btn-ghost:hover::after,
.bsp-dna-btn-primary:hover::after, .bsp-dna-values-intro a.btn-link:hover::after { display: inline-block !important; transform: translateX(3px) !important; }
body.bsp-team-member .tm-back:hover .tm-back-arrow::before { transform: scaleX(-1) translateX(3px) !important; }

/* Cercles decoratifs ::after des cartes deja cliquables (listings projets / expertise / blog) :
   exception du Socle -> SVG data-URI, fin (pale) au repos, gras (accent) au survol. */
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l .et_pb_column > .et_pb_group::after {
	content: "" !important; font-size: 0 !important;
	background-image: var(--bsp-arw-rest) !important;
	background-repeat: no-repeat !important; background-position: center !important; background-size: 16px 16px !important;
}
:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l .et_pb_column > .et_pb_group:hover::after {
	background-image: var(--bsp-arw-hover) !important;
	background-repeat: no-repeat !important; background-position: center !important; background-size: 16px 16px !important;
}

/* Fleches v3: corrections (5 oct. 2026) */
/* 1. Bouton rond .bsp-btn-round-arrow : la fleche etait decalee (marge negative + translate(-50%,-50%)
      du bloc d'origine cumules). Un seul mecanisme : top/left 50% + translate, sans marge. */
body #page-container .bsp-btn-round-arrow::before,
body #page-container a.bsp-btn-round-arrow.et_pb_button::before {
	position: absolute !important; top: 50% !important; left: 50% !important;
	margin: 0 !important; transform: translate(-50%, -50%) !important;
	width: 16px !important; height: 16px !important;
}
/* 2. Survol du bouton rond : il se remplit de BLEU, la fleche devient blanche et grasse
      (norme d'origine du Socle ; remplace l'inversion fond blanc). */
body #page-container .bsp-btn-round-arrow:hover,
body #page-container a.bsp-btn-round-arrow.et_pb_button:hover,
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow:hover,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button:hover {
	background: var(--bsp-accent-fill) !important;
	border-color: var(--bsp-accent-fill) !important;
	box-shadow: none !important;
}
body #page-container .bsp-btn-round-arrow:hover::before,
body #page-container a.bsp-btn-round-arrow.et_pb_button:hover::before,
body #page-container .bsp-partners-card:hover .bsp-btn-round-arrow:hover::before,
body #page-container .bsp-partners-card:hover a.bsp-btn-round-arrow.et_pb_button:hover::before {
	color: #fff !important;
	-webkit-mask-image: var(--bsp-arrow-bold) !important; mask-image: var(--bsp-arrow-bold) !important;
}

/* Pastilles rondes de cartes : UNE seule specification, identique au blog (5 oct. 2026) :
   40 px, contour discret, fleche fine pale au repos ; au survol de la carte : fond 10 % d'accent,
   contour accent, fleche accent grasse, petit glissement. Cas clients + anciennes pastilles du blog. */
.bsp-cs-card .cs-card-arrow,
.bsp-blog-catalog .card-arrow {
	width: 40px !important; height: 40px !important; min-width: 40px;
	border: 1px solid var(--bsp-border) !important; border-radius: 50% !important;
	background: transparent !important;
	color: var(--bsp-text-faint) !important;
	transform: none;
	transition: background-color .2s var(--bsp-ease), border-color .2s var(--bsp-ease), color .2s var(--bsp-ease), transform .2s var(--bsp-ease) !important;
}
.bsp-cs-card:hover .cs-card-arrow,
.bsp-blog-catalog .cat-card:hover .card-arrow,
.bsp-blog-catalog .card-featured:hover .card-arrow {
	background: var(--bsp-hover-tint) !important;
	border-color: var(--bsp-accent) !important;
	color: var(--bsp-accent-text) !important;
	transform: translateX(3px) !important;
}

/* Centrage exact de la fleche dans les pastilles : en grille, le « → » texte masque (font-size 0)
   formait une 2e rangee qui remontait la fleche. En flex, le texte vide n'occupe aucune place. */
.bsp-home-project-btn-icon, .bsp-cs-card .cs-card-arrow, .bsp-blog-catalog .card-arrow,
.bsp-team-page .tmc-btn-arrow {
	display: flex !important; align-items: center !important; justify-content: center !important;
	place-items: normal;
}

/* =========================================================================
   BOUTONS: SYSTEME UNIQUE (5 oct. 2026, demande de Clement)
   Trois classes canoniques, definies ICI une seule fois, identiques partout :
     .bsp-btn-primary   plein bleu  (survol : fond blanc, texte et contour bleus)
     .bsp-btn-ghost     contour     (survol : contour et texte accent)
     .bsp-btn-round-arrow  cercle fleche (defini plus haut)
   Option : .bsp-btn-arrow ajoute la fleche (fine au repos, grasse au survol) a la fin
   d'un .bsp-btn-primary / .bsp-btn-ghost. Dans Divi : module Bouton natif + Attributs
   > class = bsp-btn-primary (ou ghost). Les anciens noms (alias ci-dessous) donnent
   EXACTEMENT le meme rendu : meme hauteur, meme police, texte centre au pixel pres.
   ========================================================================= */
body #page-container .bsp-btn-primary,
body #page-container a.bsp-btn-primary.et_pb_button,
body #page-container .et_pb_button.bsp-btn-primary,
body #page-container .bsp-home-btn,
body #page-container a.bsp-home-btn,
body #page-container .et_pb_button.bsp-home-btn,
body #page-container .bsp-home-btn.et_pb_button,
body #page-container .bsp-dna-btn-primary,
body #page-container .bsp-team-page .btn-primary,
body #page-container .bsp-case-study .btn-primary,
body #page-container .bsp-cs-cta-actions .bsp-btn-primary,
body #page-container .bsp-btn-pill-header.et_pb_button,
body #page-container a.bsp-btn-pill-header.et_pb_button,
body #page-container .bsp-xp-section .xp-cta-btn,
body #page-container .bsp-hero-cta-2.et_pb_button,
body #page-container a.bsp-hero-cta-2.et_pb_button,
body #page-container .bsp-hero-cta-2 .et_pb_button,
body #page-container .bsp-home-contact-form .et_pb_contact_submit.et_pb_button,
body #page-container .bsp-home-contact-form .et_pb_button.et_pb_contact_submit,
body #page-container .et_pb_contact_form_container .et_pb_contact_submit.et_pb_button {
	display: inline-flex !important; align-items: center !important; justify-content: center !important;
	gap: 10px !important; box-sizing: border-box !important;
	width: auto !important; min-height: 48px !important; height: auto !important;
	padding: 0 30px !important; margin: 0 !important;
	font-family: var(--bsp-font-label) !important; font-weight: 700 !important; font-size: 12px !important;
	line-height: 1 !important; letter-spacing: .09em !important; text-transform: uppercase !important;
	text-align: center !important; text-decoration: none !important; white-space: nowrap !important;
	color: #fff !important; background: var(--bsp-accent-fill) !important; background-image: none !important;
	border: 0 !important; border-radius: 100px !important; box-shadow: none !important;
	cursor: pointer; transition: background-color .2s var(--bsp-ease), color .2s var(--bsp-ease), box-shadow .2s var(--bsp-ease) !important;
}
/* Survol : fond blanc, texte et contour bleus ; aucun decalage (Divi ajoute du padding au survol) */
body #page-container .bsp-btn-primary:hover,
body #page-container a.bsp-btn-primary.et_pb_button:hover,
body #page-container .et_pb_button.bsp-btn-primary:hover,
body #page-container .bsp-home-btn:hover,
body #page-container a.bsp-home-btn:hover,
body #page-container .et_pb_button.bsp-home-btn:hover,
body #page-container .bsp-dna-btn-primary:hover,
body #page-container .bsp-team-page .btn-primary:hover,
body #page-container .bsp-case-study .btn-primary:hover,
body #page-container .bsp-cs-cta-actions .bsp-btn-primary:hover,
body #page-container .bsp-btn-pill-header.et_pb_button:hover,
body #page-container a.bsp-btn-pill-header.et_pb_button:hover,
body #page-container .bsp-xp-section .xp-cta-btn:hover,
body #page-container .bsp-hero-cta-2.et_pb_button:hover,
body #page-container a.bsp-hero-cta-2.et_pb_button:hover,
body #page-container .bsp-hero-cta-2 .et_pb_button:hover,
body #page-container .bsp-home-contact-form .et_pb_contact_submit.et_pb_button:hover,
body #page-container .et_pb_contact_form_container .et_pb_contact_submit.et_pb_button:hover {
	background: #fff !important; color: var(--bsp-accent-fill) !important;
	box-shadow: inset 0 0 0 1px var(--bsp-accent-fill) !important;
	padding: 0 30px !important;
}
/* Pas d'icone Divi parasite sur les boutons texte (la fleche, si voulue, vient de .bsp-btn-arrow) */
body #page-container .bsp-btn-primary::before, body #page-container .bsp-btn-primary::after,
body #page-container .bsp-home-btn::before, body #page-container .bsp-home-btn::after,
body #page-container .bsp-btn-pill-header::before, body #page-container .bsp-btn-pill-header::after,
body #page-container .bsp-hero-cta-2 .et_pb_button::before,
body #page-container .et_pb_contact_submit.et_pb_button::before, body #page-container .et_pb_contact_submit.et_pb_button::after {
	content: none !important; display: none !important;
}

/* Fleche optionnelle : meme glyphe que partout (voir « FLECHES v2 »). Taille en px (pas en em :
   les regles precedentes mettent font-size:0 sur le pseudo-element), alignee par gap/flex. */
body #page-container .bsp-btn-arrow::after,
body #page-container .bsp-dna-btn-primary::after,
body #page-container .bsp-hero-cta-2 .et_pb_button::after, body #page-container a.bsp-hero-cta-2.et_pb_button::after,
body #page-container .bsp-home-solution-link .et_pb_button::after, body #page-container a.bsp-home-solution-link.et_pb_button::after,
body #page-container .bsp-cs-cta-actions .bsp-btn-ghost::after, body #page-container .bsp-case-study .btn-ghost::after,
body #page-container .bsp-dna-values-intro a.btn-link::after {
	content: "" !important; display: block !important; flex: none !important;
	position: static !important; opacity: 1 !important;
	width: 14px !important; height: 14px !important; margin: 0 !important; padding: 0 !important;
	font-size: 0 !important; line-height: 0 !important; vertical-align: baseline !important;
	background: currentColor !important;
	-webkit-mask: var(--bsp-arrow-light) center / contain no-repeat !important;
	        mask: var(--bsp-arrow-light) center / contain no-repeat !important;
	transform: none !important;
	transition: transform .25s var(--bsp-ease) !important;
}
body #page-container .bsp-btn-arrow:hover::after,
body #page-container .bsp-dna-btn-primary:hover::after,
body #page-container .bsp-hero-cta-2 .et_pb_button:hover::after, body #page-container a.bsp-hero-cta-2.et_pb_button:hover::after,
body #page-container .bsp-home-solution-link .et_pb_button:hover::after, body #page-container a.bsp-home-solution-link.et_pb_button:hover::after,
body #page-container .bsp-cs-cta-actions .bsp-btn-ghost:hover::after, body #page-container .bsp-case-study .btn-ghost:hover::after,
body #page-container .bsp-dna-values-intro a.btn-link:hover::after {
	-webkit-mask-image: var(--bsp-arrow-bold) !important; mask-image: var(--bsp-arrow-bold) !important;
	transform: translateX(3px) !important;
}
/* Liens texte avec fleche : alignement horizontal flex, texte + fleche centres */
body #page-container .bsp-home-solution-link .et_pb_button, body #page-container a.bsp-home-solution-link.et_pb_button,
body #page-container .bsp-case-study .btn-ghost, body #page-container .bsp-cs-cta-actions .bsp-btn-ghost,
body #page-container .bsp-dna-values-intro a.btn-link {
	display: inline-flex !important; align-items: center !important; gap: 10px !important; line-height: 1.2 !important;
}

/* GHOST : meme geometrie que le primary, contour au lieu du plein */
body #page-container .bsp-btn-ghost,
body #page-container a.bsp-btn-ghost.et_pb_button,
body #page-container .et_pb_button.bsp-btn-ghost {
	display: inline-flex !important; align-items: center !important; justify-content: center !important;
	gap: 10px !important; box-sizing: border-box !important; width: auto !important;
	min-height: 48px !important; height: auto !important; padding: 0 30px !important; margin: 0 !important;
	font-family: var(--bsp-font-label) !important; font-weight: 700 !important; font-size: 12px !important;
	line-height: 1 !important; letter-spacing: .09em !important; text-transform: uppercase !important;
	text-align: center !important; white-space: nowrap !important;
	color: var(--bsp-text) !important; background: transparent !important;
	border: 1px solid var(--bsp-border-strong) !important; border-radius: 100px !important; box-shadow: none !important;
}
body #page-container .bsp-btn-ghost:hover,
body #page-container a.bsp-btn-ghost.et_pb_button:hover {
	background: var(--bsp-hover-tint) !important; border-color: var(--bsp-accent) !important; color: var(--bsp-accent-text) !important;
	padding: 0 30px !important;
}
body #page-container .bsp-btn-ghost::before { content: none !important; display: none !important; }

/* Version compacte (bouton d'en-tete) : meme famille, plus petit */
body #page-container .bsp-home-nav-cta {
	display: inline-flex !important; align-items: center !important; justify-content: center !important;
	min-height: 44px !important; height: auto !important; padding: 0 22px !important;
	font-size: 11px !important; line-height: 1 !important; letter-spacing: .09em; text-transform: uppercase; text-align: center;
	border-radius: 100px !important;
}

/* =========================================================================
   CARTES SOLUTIONS (accueil): fond photo sombre dans les DEUX modes : jetons « sombres » gardes
   dans la section (textes lisibles en mode clair) ; « Learn more » a droite avec la pastille
   ronde commune (40 px, fleche fine / grasse au survol). 5 oct. 2026
   ========================================================================= */
body #page-container .bsp-home-solutions {
	--bsp-text: #ffffff; --bsp-text-soft: rgba(255,255,255,.72); --bsp-body: #cdd2da;
	--bsp-text-faint: rgba(255,255,255,.45); --bsp-border: rgba(255,255,255,.14);
	--bsp-accent-text: #118CFE; --bsp-hover-tint: rgba(17,140,254,.10);
	--bsp-arw-rest: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='rgb%28176%2C182%2C192%29'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
	--bsp-arw-hover: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='rgb%2817%2C140%2C254%29'%20stroke-width='2.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cline%20x1='3.5'%20y1='12'%20x2='20.5'%20y2='12'/%3E%3Cpolyline%20points='13.5%205%2020.5%2012%2013.5%2019'/%3E%3C/svg%3E");
}
body #page-container .bsp-home-solution-desc, body #page-container .bsp-home-solution-desc p { color: #cdd2da !important; }
body #page-container .bsp-home-solution-tag, body #page-container .bsp-home-solution-tag p { color: rgba(255,255,255,.6) !important; }
body #page-container .bsp-home-solution-name h3 { color: #fff !important; }

body #page-container .bsp-home-section .bsp-home-solution-link {
	display: flex !important; justify-content: flex-end !important; align-items: center !important; text-align: right !important;
}
body #page-container .bsp-home-solution-link .et_pb_button, body #page-container a.bsp-home-solution-link.et_pb_button {
	display: inline-flex !important; align-items: center !important; gap: 14px !important;
	color: #fff !important; font-size: 14px !important; font-weight: 600 !important; line-height: 1 !important;
}
body #page-container .bsp-home-solution-link .et_pb_button::after, body #page-container a.bsp-home-solution-link.et_pb_button::after {
	content: "" !important; display: block !important; flex: none !important; position: static !important;
	box-sizing: border-box !important; width: 40px !important; height: 40px !important; margin: 0 !important; padding: 0 !important;
	font-size: 0 !important; opacity: 1 !important; vertical-align: baseline !important;
	border: 1px solid var(--bsp-border) !important; border-radius: 50% !important;
	-webkit-mask: none !important; mask: none !important;
	background-color: transparent !important;
	background-image: var(--bsp-arw-rest) !important;
	background-repeat: no-repeat !important; background-position: center !important; background-size: 16px 16px !important;
	transform: none !important;
	transition: background-color .2s var(--bsp-ease), border-color .2s var(--bsp-ease), transform .2s var(--bsp-ease) !important;
}
body #page-container .bsp-home-solution-card:hover .bsp-home-solution-link .et_pb_button::after,
body #page-container .bsp-home-solution-link .et_pb_button:hover::after,
body #page-container a.bsp-home-solution-link.et_pb_button:hover::after {
	-webkit-mask: none !important; mask: none !important;
	background-color: rgba(17,140,254,.10) !important; border-color: #118CFE !important;
	background-image: var(--bsp-arw-hover) !important; transform: translateX(3px) !important;
}
body #page-container .bsp-home-solution-card:hover .bsp-home-solution-link .et_pb_button { color: #fff !important; }
body #page-container .bsp-home-solution-card .et_pb_button_module_wrapper:has(.bsp-home-solution-link),
body #page-container .bsp-home-solution-card .et_pb_button_module_wrapper.bsp-home-solution-link {
	display: flex !important; justify-content: flex-end !important; width: 100% !important; text-align: right !important;
}


/* Accueil, bandeau : le bouton unique remonte sous le bloc de texte (absolu, z-index 8): on le redescend
   sous le texte et on le place au-dessus pour qu'il reste cliquable. */
body #page-container .et_pb_button_0_wrapper:has(.bsp-hero-cta-2) { position: relative !important; z-index: 9 !important; margin-top: 76px !important; }
/* Le bloc de texte du bandeau (absolu) ne doit pas intercepter les clics destines au bouton dessous. */
body #page-container .bsp-hero-reveal { pointer-events: none !important; }
body #page-container .bsp-hero-reveal a, body #page-container .bsp-hero-reveal button { pointer-events: auto !important; }
/* Image décorative du bandeau (personne) : ne doit pas intercepter les clics du bouton. */
body #page-container .bsp-hero-person, body #page-container .bsp-hero-person * { pointer-events: none !important; }
/* Bandeau d'accueil : la colonne des boutons passe au-dessus de la colonne des calques décoratifs
   (fond, personne, texte animé): sinon un bouton posé dans Divi n'est pas cliquable. */
body #page-container .bsp-hero .et_pb_column:not(.et_pb_column_0) { position: relative !important; z-index: 10 !important; }
body #page-container .bsp-hero-bg { pointer-events: none !important; }
/* Bandeau d'accueil : la colonne est transparente aux clics ; les boutons Divi qu'elle contient restent cliquables. */
body #page-container .bsp-hero .et_pb_column .et_pb_button_module_wrapper,
body #page-container .bsp-hero .et_pb_column a.et_pb_button { pointer-events: auto !important; }

/* Contact : la section formulaire/bureaux a un fond photo sombre dans les DEUX modes -> jetons « sombres »
   gardés dans la section (textes, pictos et champs lisibles en mode clair). 5 oct. 2026 */
body #page-container .et_pb_section.bsp-contact-form-section {
	--bsp-text: #ffffff; --bsp-text-soft: rgba(255,255,255,.72); --bsp-body: #cdd2da;
	--bsp-text-faint: rgba(255,255,255,.5); --bsp-border: rgba(255,255,255,.14); --bsp-border-strong: rgba(255,255,255,.28);
	--bsp-accent-text: #118CFE; --bsp-hover-tint: rgba(17,140,254,.10);
}
:root[data-bsp-theme="light"] .bsp-contact-office-item .ol-icon { filter: none !important; }
body #page-container .bsp-contact-office-list-wrap h3,
body #page-container .bsp-contact-office-item .ol-city { color: #fff !important; }
body #page-container .bsp-contact-office-item .ol-meta { color: rgba(255,255,255,.72) !important; }
body #page-container .bsp-contact-form-section label,
body #page-container .bsp-contact-form-section .et_pb_contact_form label,
body #page-container .bsp-contact-form-section .et_pb_contact_field label { color: rgba(255,255,255,.85) !important; }
body #page-container .bsp-contact-form-section ::placeholder { color: rgba(255,255,255,.5) !important; opacity: 1; }
body #page-container .bsp-contact-form-intro, body #page-container .bsp-contact-form-intro p { color: #cdd2da !important; }

/* Pied de page : les titres de colonne reprennent le style du menu d'en-tête (12 px / 600 / .12em) ;
   les sous-liens passent de 18 à 11 px (-40 %). 6 oct. 2026 */
body #page-container .bsp-footer-menu-link--parent {
	font-size: 12px; font-weight: 600; letter-spacing: .12em;
}
body #page-container .bsp-footer-menu-link--child {
	font-size: 11px; line-height: 1.3; gap: 8px;
}
body #page-container .bsp-footer-menu-col { gap: 10px; }
body #page-container .bsp-footer-menu-dot { width: 4px; height: 4px; }
/* Pied de page : sous-liens +30 % (11 -> 14,3 px). */
body #page-container .bsp-footer-menu-link--child { font-size: 14.3px; gap: 9px; }
body #page-container .bsp-footer-menu-dot { width: 5px; height: 5px; }

/* =========================================================================
   RÉVISION 01 (20 oct. 2026): retours de Mathieu
   ========================================================================= */

/* #4 Accueil : plus d'air entre le texte et le bouton « Talk to a Zoho expert ». */
.bsp-home-section .bsp-home-transform-cta { margin-top: 56px !important; }

/* #18 La nav et son menu déroulant passent toujours AU-DESSUS du contenu de la page
   (couverture d'article, images) : le gabarit d'en-tête reçoit son propre niveau d'empilement. */
.et-l--header { position: sticky; top: 0; z-index: 1000; }
/* Menu collant : le gabarit d'en-tête reste en haut de la fenêtre au défilement
   (la barre .bsp-home-nav est en absolu à l'intérieur, l'en-tête ne prend pas de place).
   « relative » avait retiré ce comportement. Sous la barre d'admin WP, décalage de 32 px. */
body.admin-bar .et-l--header { top: 32px; }
@media (max-width: 782px) { body.admin-bar .et-l--header { top: 46px; } }
/* Sous 601 px, WordPress ne fixe plus sa barre d'admin : elle défile avec la page. */
@media (max-width: 600px) { body.admin-bar .et-l--header { top: 0; } }

/* #12 Blog et articles : le contenu ne s'étire plus en plein écran sur les très grands écrans. */
@media (min-width: 1700px) {
	body.post-type-archive-project .et_pb_row,
	body.single-project .et_pb_row { max-width: 1600px; margin-left: auto; margin-right: auto; }
}

/* ---- Menu mobile (#19, #20) ------------------------------------------------ */
.bsp-nav-burger { display: none; }
.bsp-nav-panel { display: none; }

@media (max-width: 1024px) {
	/* #20 Barre allégée : plus de bascule clair/sombre ni de sélecteur de langue. */
	.bsp-home-nav .bsp-theme-toggle,
	.bsp-home-nav .bsp-home-nav-lang { display: none !important; }

	/* #19 Bouton hamburger (créé par assets/js/bsp-custom.js, au même endroit sur toutes les pages). */
	.bsp-nav-burger {
		display: inline-flex; flex-direction: column; justify-content: center; align-items: center; gap: 5px;
		width: 44px; height: 44px; padding: 0; margin-left: 8px;
		background: transparent; border: 1px solid var(--bsp-border-strong, rgba(255,255,255,.28)); border-radius: 50%;
		cursor: pointer; color: #fff;
	}
	.bsp-nav-burger span { display: block; width: 18px; height: 1.5px; background: currentColor; border-radius: 2px; transition: transform .2s, opacity .2s; }
	.bsp-nav-burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
	.bsp-nav-burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
	.bsp-nav-burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }
	:root[data-bsp-theme="light"] .bsp-nav-burger { color: #0d1526; border-color: rgba(13,21,38,.28); }
	:root[data-bsp-theme="light"] :is(body.single-project, body.single-case-study, body.post-type-archive-case-study, body.bsp-has-page-hero, body.post-type-archive-project, body.tax-expertise) .bsp-nav-burger { color: #fff; border-color: rgba(255,255,255,.28); }

	.bsp-home-nav-right { gap: 0; }

	/* Panneau déroulant : les liens viennent du vrai menu WordPress (copiés par le script, jamais saisis à la main). */
	.bsp-nav-panel {
		position: fixed; top: 72px; left: 0; right: 0; z-index: 2000;
		max-height: calc(100vh - 72px); overflow-y: auto;
		padding: 12px var(--bsp-gutter, 24px) 28px;
		background: #0a0d14; border-top: 1px solid rgba(255,255,255,.08);
		box-shadow: 0 18px 40px rgba(0,0,0,.45);
	}
	.bsp-nav-panel.is-open { display: block; }
	:root[data-bsp-theme="light"] .bsp-nav-panel { background: #f1f0ed; border-top-color: rgba(13,21,38,.08); }
	.bsp-nav-panel ul { list-style: none; margin: 0; padding: 0; }
	.bsp-nav-panel li { margin: 0; padding: 0; }
	.bsp-nav-panel a {
		display: block; padding: 14px 0; text-decoration: none;
		font-family: var(--bsp-font-label); font-weight: 600; font-size: 13px; letter-spacing: .12em; text-transform: uppercase;
		color: rgba(255,255,255,.85); border-bottom: 1px solid rgba(255,255,255,.08);
	}
	.bsp-nav-panel ul ul a {
		padding: 11px 0 11px 18px; font-size: 12px; letter-spacing: .06em; text-transform: none; font-weight: 500;
		color: rgba(255,255,255,.65);
	}
	:root[data-bsp-theme="light"] .bsp-nav-panel a { color: #0d1526; border-bottom-color: rgba(13,21,38,.1); }
	:root[data-bsp-theme="light"] .bsp-nav-panel ul ul a { color: rgba(13,21,38,.65); }
}

/* ---- Grilles mobiles (#22, #23, #24) ------------------------------------------ */
@media (max-width: 767px) {
	/* #22 Partners : les trois cartes s'empilent, une par ligne. */
	.et_pb_row.bsp-partners-cards-row { flex-direction: column; padding-left: 24px; padding-right: 24px; }
	.et_pb_row.bsp-partners-cards-row > .et_pb_column { width: 100% !important; max-width: 100%; flex: 0 0 auto; }

	/* #23 Blog : la liste d'articles passe sur une seule colonne. */
	:is(body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho).et-db #et-boc .et-l .et_pb_column > .et_pb_group {
		width: 100% !important; flex: 0 0 100% !important; max-width: 100%;
	}

	/* #24 Études de cas : la barre de résultats passe sur une colonne. */
	body.bsp-case-study .results-bar { grid-template-columns: 1fr; grid-auto-flow: row; }
	body.bsp-case-study .results-bar .result-item { border-right: 0; border-bottom: 1px solid var(--bsp-border); }
	body.bsp-case-study .results-bar .result-item:last-child { border-bottom: 0; }
}

/* #16 Page Consultation : une seule colonne centrée, le formulaire Zoho occupe toute la largeur. */
body #page-container .et_pb_row.bsp-consultation-row { max-width: 900px; }
body #page-container .bsp-consultation-section iframe { display: block; width: 100% !important; min-height: 500px; border-radius: 14px; }

/* ============================================================
   23 oct. 2026: Badge Zoho Premium Partner dans le hero (accueil)
   Remplace le surtitre texte « Zoho Premium Partner · Since 2011 ».
   Badge officiel Zoho, version sur fond sombre, couleurs et ratio
   inchangés (normes graphiques Zoho pour les partenaires).
   ============================================================ */
.bsp-hero-content .bsp-hero-eyebrow .bsp-hero-badge-link {
	display: inline-block;
	line-height: 0;
	text-shadow: none;
	transition: opacity .2s ease, transform .2s ease;
}
.bsp-hero-content .bsp-hero-eyebrow .bsp-hero-badge-link:hover,
.bsp-hero-content .bsp-hero-eyebrow .bsp-hero-badge-link:focus-visible {
	opacity: .85;
	transform: translateY(-1px);
}
.bsp-hero-content .bsp-hero-eyebrow .bsp-hero-badge-link:focus-visible {
	outline: 2px solid #fff;
	outline-offset: 4px;
}
.bsp-hero-content .bsp-hero-eyebrow img.bsp-hero-badge {
	display: block;
	height: 56px;
	width: auto;
	max-width: 100%;
}
@media (max-width: 767px) {
	.bsp-hero-content .bsp-hero-eyebrow img.bsp-hero-badge { height: 46px; }
}

/* ============================================================
   23 oct. 2026 : espacement bouton/texte, cartes cas clients
   La pastille ronde (44 px, position absolue en bas à droite)
   ne doit jamais chevaucher le texte de la carte : on réserve
   sa place dans le padding du corps de carte.
   ============================================================ */
body #page-container .bsp-cs-card .cs-card-body .et_pb_text_inner {
	padding-right: 104px !important;
}
@media (max-width: 767px) {
	body #page-container .bsp-cs-card .cs-card-body .et_pb_text_inner {
		padding-right: 88px !important;
	}
}

/* Accueil, cartes projet au survol : la description (22 px) débordait sur
   la pastille « Voir étude de cas » quand elle comptait plus de 5 lignes.
   On réserve 18 px d'air au-dessus de la pastille (22 px + 24 px de haut),
   on réduit le corps et on borne à 5 lignes avec points de suspension. */
.bsp-home-project-overlay { padding: 24px 24px 64px; }
.bsp-home-project-desc {
	font-size: 17px;
	line-height: 1.4;
	display: -webkit-box;
	-webkit-line-clamp: 5;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

/* 23 oct. 2026 : badge Zoho Premium Partner. Contour blanc épaissi
   dans le SVG (illisible à 1 px sur fond sombre), hero réduit d'environ
   20 % (56 px vers 45 px; le guide Zoho ne fixe pas de taille minimale
   pour le badge, seulement ratio et couleurs inchangés). */
.bsp-hero-content .bsp-hero-eyebrow img.bsp-hero-badge { height: 45px; }
@media (max-width: 767px) {
	.bsp-hero-content .bsp-hero-eyebrow img.bsp-hero-badge { height: 40px; }
}
.bsp-home-footer-badge-link { display: inline-block; line-height: 0; transition: opacity .2s ease; }
.bsp-home-footer-badge-link:hover, .bsp-home-footer-badge-link:focus-visible { opacity: .85; }
.bsp-home-footer-badge-link:focus-visible { outline: 2px solid #fff; outline-offset: 4px; }
.bsp-home-footer-badge { opacity: 1; height: 40px; width: auto; }


/* ── Filtres du blog : liste déroulante sur mobile (24 octobre 2026) ──
   Demande de Clément : sous 768 px, les puces laissent la place à une
   liste déroulante par rangée (Expertise, Application Zoho). Liste
   PERSONNALISÉE (details/summary + liens), car le menu d'un <select>
   natif appartient au système et ne se stylise pas. Au-delà de 767 px,
   elle est masquée et les puces gardent leur rendu. Jetons de thème :
   le panneau suit le mode clair/sombre. */
.bsp-blog-catalog .filter-select-wrap { display: none; }

@media (max-width: 767px) {
	.bsp-blog-catalog .filter-row .filter-chips { display: none; }
	.bsp-blog-catalog .filter-select-wrap {
		display: block; position: relative;
		flex: 1 1 100%; width: 100%;
	}
	.bsp-blog-catalog .filter-dropdown { position: relative; }
	.bsp-blog-catalog .filter-dropdown-btn {
		list-style: none; cursor: pointer;
		display: flex; align-items: center; justify-content: space-between; gap: 12px;
		min-height: 48px; padding: 12px 20px;
		font-family: var(--bsp-font-label); font-weight: 600; font-size: 16px;
		color: var(--bsp-text);
		background: transparent;
		border: 1px solid var(--bsp-border-strong);
		border-radius: 100px;
		transition: border-color .2s, background .2s;
		-webkit-tap-highlight-color: transparent;
	}
	.bsp-blog-catalog .filter-dropdown-btn::-webkit-details-marker { display: none; }
	.bsp-blog-catalog .filter-dropdown-btn::after {
		content: ""; flex: none; width: 8px; height: 8px; margin-top: -4px;
		border-right: 2px solid var(--bsp-text-soft);
		border-bottom: 2px solid var(--bsp-text-soft);
		transform: rotate(45deg); transition: transform .2s, margin .2s;
	}
	.bsp-blog-catalog .filter-dropdown[open] .filter-dropdown-btn { border-color: var(--bsp-accent); }
	.bsp-blog-catalog .filter-dropdown[open] .filter-dropdown-btn::after { transform: rotate(-135deg); margin-top: 4px; }
	/* Sélection faite (24 octobre 2026, demande de Clément) : liste fermée, le
	   bouton prend le bleu des puces actives (--bsp-accent-fill, texte blanc
	   à 5,25:1) pour montrer qu'un choix est en vigueur. */
	.bsp-blog-catalog .filter-dropdown.is-selected .filter-dropdown-btn {
		color: #fff;
		background: var(--bsp-accent-fill);
		border-color: var(--bsp-accent-fill);
	}
	.bsp-blog-catalog .filter-dropdown.is-selected .filter-dropdown-btn::after { border-color: #fff; }
	.bsp-blog-catalog .filter-dropdown.is-selected[open] .filter-dropdown-btn { border-color: var(--bsp-accent-hover); }
	.bsp-blog-catalog .filter-dropdown-btn:focus-visible { outline: 2px solid var(--bsp-accent-hover); outline-offset: 3px; }
	.bsp-blog-catalog .filter-dropdown-value { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

	.bsp-blog-catalog .filter-dropdown-list {
		position: absolute; left: 0; right: 0; top: calc(100% + 8px);
		z-index: 20; margin: 0; padding: 8px; list-style: none;
		max-height: min(60vh, 360px); overflow-y: auto; overscroll-behavior: contain;
		background: color-mix(in srgb, var(--bsp-text) 7%, var(--bsp-bg));
		border: 1px solid var(--bsp-border-strong);
		border-radius: 20px;
		box-shadow: 0 18px 44px rgba(0, 0, 0, .35);
	}
	.bsp-blog-catalog .filter-dropdown-list li { margin: 0; padding: 0; }
	.bsp-blog-catalog .filter-dropdown-item {
		display: flex; align-items: center; justify-content: space-between; gap: 12px;
		min-height: 46px; padding: 10px 16px;
		font-family: var(--bsp-font-label); font-weight: 600; font-size: 15px;
		color: var(--bsp-text-soft); text-decoration: none;
		border-radius: 14px;
	}
	.bsp-blog-catalog .filter-dropdown-item:hover,
	.bsp-blog-catalog .filter-dropdown-item:focus-visible {
		color: var(--bsp-text); background: rgba(var(--bsp-accent-rgb), .12);
		outline: none;
	}
	.bsp-blog-catalog .filter-dropdown-item.is-associe { color: var(--bsp-text); background: var(--bsp-chip-associe-bg); }
	.bsp-blog-catalog .filter-dropdown-item.is-active { color: #fff; background: var(--bsp-accent-fill); }
	.bsp-blog-catalog .filter-dropdown-item.is-active::after {
		content: ""; flex: none; width: 6px; height: 11px; margin-right: 4px;
		border-right: 2px solid #fff; border-bottom: 2px solid #fff;
		transform: rotate(45deg) translateY(-2px);
	}
}


/* ── Vignettes des cartes du blog : image entière, sans bandes, coins arrondis
   (24 octobre 2026, demande de Clément) ─────────────────────────────────────
   Les visuels des articles sont en 3:2 (1000 x 667 px). Le cadre était en
   16:10 (ou 16:9 sur la carte du sujet du mois) avec `object-fit: contain` :
   d'où les bandes grises de chaque côté. Le cadre prend maintenant le format
   des images (3:2), et l'image le remplit (`cover`, qui ne coupe que si un
   visuel s'écarte du 3:2). La vignette est posée à l'intérieur de la carte
   avec un petit retrait et des coins arrondis. Ne touche pas la mosaïque du
   bureau (vedette en deux colonnes et vignettes de grappe), dont les cadres
   suivent la hauteur de la carte. */
.bsp-blog-catalog .cat-card .card-media,
.bsp-blog-catalog .card-duo .card-media,
.bsp-blog-catalog.is-filtering .card-featured .card-media,
.bsp-blog-catalog.is-filtering .mini-card .card-media {
	aspect-ratio: 3 / 2;
	height: auto;
	margin: 12px 12px 0;
	border-radius: 0;
}
.bsp-blog-catalog .cat-card .card-media img,
.bsp-blog-catalog .card-duo .card-media img,
.bsp-blog-catalog.is-filtering .card-featured .card-media img,
.bsp-blog-catalog.is-filtering .mini-card .card-media img {
	object-fit: cover; object-position: center;
}
@media (max-width: 900px) {
	.bsp-blog-catalog .sujet-du-mois .card-featured .card-media,
	.bsp-blog-catalog .mosaic-top .card-featured .card-media {
		aspect-ratio: 3 / 2;
		height: auto;
		margin: 12px 12px 0;
		border-radius: 0;
	}
	.bsp-blog-catalog .sujet-du-mois .card-featured .card-media img,
	.bsp-blog-catalog .mosaic-top .card-featured .card-media img { object-fit: cover; object-position: center; }
	.bsp-blog-catalog .mini-card .card-media { margin: 12px 12px 0; border-radius: 0; }
	.bsp-blog-catalog .mini-card .card-media img { object-fit: cover; object-position: center; }
}
/* Pastille ronde « article cliquable » : visible aussi sur mobile (elle était
   masquée sous 640 px), y compris sur la carte du sujet du mois. */
@media (max-width: 640px) {
	.bsp-blog-catalog .card-featured .card-arrow-row,
	.bsp-blog-catalog .cat-card .card-arrow-row { display: block; right: 20px; bottom: 18px; }
	.bsp-blog-catalog .card-featured .card-body,
	.bsp-blog-catalog .cat-card .card-body { padding-bottom: 72px; }
}

/* Rayon des cartes remis à 8 px (valeur d'origine) : 16 px ne servait qu'à arrondir l'image. */
.bsp-blog-catalog .cat-card,
.bsp-blog-catalog .card-featured,
.bsp-blog-catalog .mini-card,
.bsp-blog-catalog .card-duo { border-radius: 8px; overflow: hidden; }

/* ── Sujet du mois : image à ras de la carte et fond bleuté (24 octobre 2026) ──
   Demande de Clément : sur mobile, la vignette du sujet du mois n'a plus de
   retrait (haut, gauche, droite) : l'image touche le bord de la carte. Et un
   fond très légèrement bleuté distingue le sujet du mois d'un article
   ordinaire : en mode clair, un bleu très pâle (accent à 8 % sur le blanc de
   la carte); en mode sombre, le même accent mélangé en transparence au fond
   translucide de la carte, ce qui bleuit un peu le noir. Le survol garde son
   teint plus marqué (10 % d'accent, règle déclarée plus haut). */
.bsp-blog-catalog .sujet-du-mois .card-featured {
	background: color-mix(in srgb, var(--bsp-accent) 8%, var(--bsp-surface));
}
.bsp-blog-catalog .sujet-du-mois .card-featured:hover {
	background: color-mix(in srgb, var(--bsp-accent) 14%, var(--bsp-surface));
}
@media (max-width: 900px) {
	.bsp-blog-catalog .sujet-du-mois .card-featured .card-media { margin: 0; }
}

/* ── Blogue sans filtre, mobile : bandeau à photo moins haut (24 octobre 2026) ──
   Demande de Clément : à la racine du blogue (bandeau `.has-intro`), la photo
   descendait trop bas et se glissait derrière le libellé « Expertise » et le
   logo BSP. Mesuré à 377 px : bandeau de 460 px, 80 px de chevauchement avec les
   listes. Le bandeau passe à 400 px (le texte en occupe 378), le chevauchement à
   16 px, et les listes descendent de 16 px de plus : la photo finit juste sous
   le texte, sans toucher les libellés. */
@media (max-width: 640px) {
	.bsp-blog-catalog .filter-banner.has-intro { min-height: 400px; margin-bottom: -16px; }
	.bsp-blog-catalog .filter-banner.has-intro + .filter-rows { padding-top: 36px; }
}

/* ── Bandeaux photo des pages, mobile : lisibilité (24 octobre 2026) ──
   Essai validé par Clément sur la page À propos / ADN (id 842), puis étendu à
   tous les bandeaux `.bsp-page-hero` : pages Expertise (68, 70, 72, 74, 76, 80),
   Contact (424), Équipe (584), ADN (842) et tout bandeau `.has-photo`. Trois
   problèmes constatés sous 768 px : texte posé sur une photo chargée (le voile
   horizontal du bureau laisse la photo presque nue à droite, là où le texte passe
   en mobile), surtitre coupé sur deux lignes avec son filet qui traverse le
   deuxième mot, et sous-titre gris clair (68 %) au contraste variable.
   1. Voile vertical (haut léger, bas dense) à la place du voile horizontal :
      au moins 72 % de bleu nuit derrière le texte, soit environ 7:1 pour du
      blanc sur la zone la plus claire de la photo.
   2. Surtitre sur une ligne : espacement réduit, pas de retour à la ligne, filet
      qui prend le reste de la largeur.
   3. Trois niveaux plus distincts : surtitre plus loin du titre, sous-titre en
      blanc à 92 % et limité en largeur. */
@media (max-width: 767px) {
	body:is(.page-id-68, .page-id-70, .page-id-72, .page-id-74, .page-id-76, .page-id-80, .page-id-424, .page-id-584, .page-id-842) .bsp-page-hero .ph-inner::before,
	.bsp-page-hero.has-photo .ph-inner::before {
		background: linear-gradient(180deg, rgba(6,22,46,.72) 0%, rgba(6,22,46,.80) 45%, rgba(6,22,46,.90) 100%);
	}
	.bsp-page-hero .ph-eyebrow {
		letter-spacing: .2em; white-space: nowrap; margin-bottom: 24px;
	}
	.bsp-page-hero .ph-eyebrow::after { flex: 1 1 24px; min-width: 24px; }
	.bsp-page-hero .ph-title { margin-bottom: 22px; }
	.bsp-page-hero .ph-sub {
		color: rgba(255,255,255,.92); font-size: 19px; line-height: 1.5; max-width: 34ch;
	}
}

/* ── Équipe : étiquette « The team » à droite du panneau « 27+ » (24 octobre 2026) ──
   Demande de Clément : sur mobile, l'étiquette (en haut à gauche, absolue) chevauchait
   le chiffre « 27+ », que le panneau cale en bas (`justify-content: flex-end`) dans une
   hauteur fixe de 300 px. Sous 1001 px, elle passe en haut à droite : le chiffre, aligné
   à gauche, n'est plus recouvert. */
@media (max-width: 1000px) {
	.bsp-team-page .tb-tag { left: auto; right: 24px; top: 24px; }
}

/* ── Équipe : étiquettes sans contour (24 octobre 2026) ──
   Demande de Clément, sur tous les formats : « The team », « Portrait day » et
   « Behind the scenes » avaient un contour qui les faisait passer pour des boutons.
   On retire seulement le contour; fond, rembourrage et position ne changent pas. */
.bsp-team-page .tb-tag,
.bsp-team-page .tb-ph figcaption { border: 0; }


/* =============================================================
   BANDE DU MENU COLLANT (24 oct. 2026)
   -------------------------------------------------------------
   Sur les pages à en-tête global, la barre reste en haut au défilement
   (voir « .et-l--header { position: sticky } »). Dès que la page a bougé,
   bsp-custom.js (initStuckNav) pose .is-stuck : la barre reçoit un fond
   pour ne pas se mêler au contenu. La bande est portée par ::before
   (pas de backdrop-filter sur la barre elle-même, qui piégerait le panneau
   du menu mobile en position fixe). Sombre par défaut, claire en mode clair,
   y compris sur les gabarits à bandeau sombre dont la barre garde le texte
   blanc quand elle est en haut de page.
   ============================================================= */
.bsp-home-nav::before { transition: height .25s ease, background .25s ease, box-shadow .25s ease; }
.bsp-home-nav.is-stuck::before {
	height: 100%;
	background: rgba(10, 13, 20, 0.82);
	-webkit-backdrop-filter: blur(12px);
	backdrop-filter: blur(12px);
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
}
:root[data-bsp-theme="light"] .bsp-home-nav.is-stuck::before {
	background: rgba(241, 240, 237, 0.9);
	box-shadow: 0 8px 24px rgba(15, 20, 30, 0.1), 0 1px 0 rgba(13, 21, 38, 0.08);
}
/* Gabarits à bandeau sombre, mode clair : une fois la barre collée sur du
   contenu clair, retour aux couleurs du mode clair (encre sombre). */
:root[data-bsp-theme="light"] :is(body.single-project, body.single-case-study, body.post-type-archive-case-study, body.bsp-has-page-hero, body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho) .bsp-home-nav.is-stuck {
	&::before {
		height: 100%;
		background: rgba(241, 240, 237, 0.9);
	}
	& .bsp-home-nav-logo img { filter: invert(1); }
	& .bsp-home-nav-logo-text { color: rgba(13, 21, 38, 0.66); }
	& .bsp-home-nav-links > li > a { color: rgba(13, 21, 38, 0.7); }
	& .bsp-home-nav-links > li > a:hover { color: #0d1526; text-decoration-color: rgba(13, 21, 38, 0.62); }
	& .bsp-home-nav-lang a { color: rgba(13, 21, 38, 0.62); }
	& .bsp-home-nav-lang a:hover,
	& .bsp-home-nav-lang a.is-active { color: #0d1526; }
	& .bsp-home-nav-lang-sep { color: rgba(13, 21, 38, 0.2); }
	& .bsp-theme-toggle {
		border-color: rgba(13, 21, 38, 0.16);
		background: rgba(13, 21, 38, 0.04);
		color: #0d1526;
	}
	& .bsp-theme-toggle:hover {
		background: rgba(13, 21, 38, 0.1);
		border-color: rgba(13, 21, 38, 0.3);
	}
}
:root[data-bsp-theme="light"] :is(body.single-project, body.single-case-study, body.post-type-archive-case-study, body.bsp-has-page-hero, body.post-type-archive-project, body.tax-expertise, body.tax-application_zoho) .bsp-home-nav.is-stuck .bsp-nav-burger {
	color: #0d1526;
	border-color: rgba(13, 21, 38, 0.28);
}

/* Menu collant de l'accueil : même opacité que la bande des autres pages (D12),
   le fond à 50 % laissait lire le contenu à travers la barre. */
.bsp-home-nav.is-fixed { background: rgba(10, 13, 20, 0.86); }
:root[data-bsp-theme="light"] .bsp-home-nav.is-fixed { background: rgba(241, 240, 237, 0.92); }
/* Sous 601 px la barre d'admin WP défile avec la page : pas de décalage. */
@media screen and (max-width: 600px) {
	body.admin-bar .bsp-home-nav.is-fixed { top: 0; }
}

/* Pages Expertise, mobile : le paragraphe d'introduction est aligné sur la même
   marge que le titre et les cartes (il avait 24 px de retrait en trop). */
@media (max-width: 767px) {
	.bsp-expertise-domain-intro,
	.bsp-expertise-overview-intro { padding-left: 0; padding-right: 0; }
}


/* =============================================================
   MODE CLAIR : CONTRASTE DES TEXTES (24 oct. 2026)
   -------------------------------------------------------------
   Mesuré à l'écran : le bleu d'accent du mode sombre (#118CFE, #45AEFF)
   ne donnait que 1,9:1 à 3:1 sur les fonds clairs (AA demande 4,5:1).
   Sur surface claire, le texte d'accent passe par --bsp-accent-text
   (#0D6DC4). Les zones-image qui restent sombres ne sont pas touchées.
   Les encres atténuées (0,45 et 0,4) sont montées à 0,66 et 0,62 dans le
   fichier (2,9:1 mesuré, maintenant 5:1 et plus).
   ============================================================= */
:root[data-bsp-theme="light"] :is(
	.bsp-home-eyebrow,
	.bsp-home-why-num,
	.bsp-stat-number,
	.bsp-expertise-feature-card h3,
	.bsp-dna-offices-intro p.eyebrow,
	.bsp-dna-values-intro p.eyebrow,
	.bsp-dna-value-num,
	.bsp-dna-office-role,
	.bsp-partners-intro .eyebrow,
	.bsp-partners-spotlight-body .eyebrow,
	.bsp-partners-grid-intro .eyebrow
) { color: var(--bsp-accent-text); }

/* Contraste, suite : texte d'accent sur surface claire un peu plus foncé (4,2:1 mesuré sur
   les cartes teintées), pastille du carrousel de l'accueil en bleu d'aplat (blanc dessus 5,25:1
   au lieu de 3,4:1), micro-textes relevés à 11 px. */
:root[data-bsp-theme="light"] { --bsp-accent-text: #0A5EA8; }
.bsp-home-project-btn { background: var(--bsp-accent-fill); }
.bsp-home-project-btn-text { font-size: 11px; }
.bsp-case-study .cs-cta-eyebrow { font-size: 11px; }

/* Contraste, mode sombre : textes atténués relevés (mesurés à 2,4:1 à 3,8:1, minimum visé 4,5:1).
   Jetons --bsp-text-faint (0,45 à 0,6) et --bsp-text-quiet (0,32 à 0,56) montés en tête de fichier. */
.bsp-home-nav-lang a { color: rgba(255, 255, 255, 0.62); }
.bsp-case-study .meta-label, .bsp-cs-hero .meta-label { color: rgba(255, 255, 255, 0.58); }
:root[data-bsp-theme="light"] .bsp-home-nav-lang a { color: rgba(13, 21, 38, 0.62); }

/* Page Partners, mobile : la carte « Zoho » touchait les bords de l'écran; même gouttière de
   24 px que les cartes des partenaires en dessous. */
@media (max-width: 767px) {
	.et_pb_row.bsp-partners-spotlight-box {
		width: calc(100% - 48px) !important;
		max-width: calc(100% - 48px);
		margin-left: auto;
		margin-right: auto;
	}
}
@media (max-width: 767px) {
	/* Page Partners : texte d'introduction aligné sur les cartes (56 px de retrait en trop). */
	.et_pb_row.bsp-partners-row-intro { padding-left: 0; padding-right: 0; }
}

/* Consultation, mobile : les champs du formulaire Zoho passent sur plusieurs lignes, le bouton
   « Suivant » était coupé par la hauteur fixe de 500 px de l'iframe. */
@media (max-width: 767px) {
	body #page-container .bsp-consultation-section iframe { height: 600px !important; }
}

/* Menu mobile : la flèche des entrées à sous-menu (Expertise, About) tombait sous le libellé;
   elle se place maintenant à droite, sur la même ligne. */
@media (max-width: 1024px) {
	.bsp-nav-panel a { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
}

/* ── Filtre du blogue en cascade (25 octobre 2026, bureau) ─────────────────
   Choisir une expertise réduit les applications à celles qui s'y rattachent
   (lien « Voir toutes les applications » pour les revoir). Choisir une
   application ne relevant que d'une expertise sélectionne celle-ci : elle
   apparaît en bleu pâle avec contour et une croix, ce que l'utilisateur a
   choisi lui-même reste en bleu plein. Trois états lisibles sans couleur
   seule : plein (choisi), pâle + contour (associé), atténué (hors lien). */
.bsp-blog-catalog .chip.is-associe,
.bsp-blog-catalog .chip.is-deduite {
	background: rgba(var(--bsp-accent-rgb), 0.14);
	border-color: var(--bsp-accent);
	color: var(--bsp-text);
}
:root[data-bsp-theme="light"] .bsp-blog-catalog :is(.chip.is-associe, .chip.is-deduite) {
	background: rgba(var(--bsp-accent-rgb), 0.12);
	border-color: var(--bsp-accent-text);
}
.bsp-blog-catalog .chip.is-deduite .chip-x { font-size: 15px; line-height: 1; margin-left: 2px; opacity: .8; }
.bsp-blog-catalog .chip.is-attenue { color: var(--bsp-text-faint); border-color: var(--bsp-border); }
.bsp-blog-catalog .chip.is-attenue:hover { color: var(--bsp-text); border-color: var(--bsp-accent); }
.bsp-blog-catalog .chip .chip-count {
	font-weight: 500; font-variant-numeric: tabular-nums;
	color: var(--bsp-text-faint); margin-left: 2px;
}
.bsp-blog-catalog .chip.is-active .chip-count { color: rgba(255, 255, 255, .85); }
.bsp-blog-catalog .chip.is-hors { display: none; }
.bsp-blog-catalog .filter-row.show-all .chip.is-hors { display: inline-flex; color: var(--bsp-text-faint); border-color: var(--bsp-border); }
.bsp-blog-catalog .filter-row.show-all .chip.is-hors:hover { color: var(--bsp-text); border-color: var(--bsp-accent); }
.bsp-blog-catalog .chip-voir-tout {
	display: inline-flex; align-items: center; cursor: pointer;
	background: none; border: 0; padding: 9px 8px;
	font-family: var(--bsp-font-label); font-weight: 600; font-size: 12px;
	color: var(--bsp-accent-text);
	text-decoration: underline; text-underline-offset: 4px;
}
.bsp-blog-catalog .chip-voir-tout[hidden] { display: none; }
.bsp-blog-catalog .chip-voir-tout:hover { color: var(--bsp-text); }
.bsp-blog-catalog .chip-voir-tout:focus-visible { outline: 2px solid var(--bsp-accent-text); outline-offset: 3px; border-radius: 4px; }

/* Résumé de la sélection, aligné sur les puces (colonne du libellé = 168 px + 14 px d'écart). */
.bsp-blog-catalog .filter-summary {
	display: flex; align-items: center; flex-wrap: wrap; gap: 6px 18px;
	margin-top: 22px; padding-left: 182px;
	font-family: var(--bsp-font-label); font-size: 13px;
	color: var(--bsp-text-soft);
}
.bsp-blog-catalog .filter-summary-text { margin: 0; display: flex; flex-wrap: wrap; gap: 0 8px; }
.bsp-blog-catalog .filter-summary-filters { color: var(--bsp-text); font-weight: 600; }
.bsp-blog-catalog .filter-summary-count { color: var(--bsp-text-faint); }
.bsp-blog-catalog .filter-clear {
	color: var(--bsp-accent-text); font-weight: 600;
	text-decoration: underline; text-underline-offset: 4px;
}
.bsp-blog-catalog .filter-clear:hover { color: var(--bsp-text); }
@media (max-width: 1024px) {
	.bsp-blog-catalog .filter-summary { padding-left: 0; }
}
@media (max-width: 767px) {
	.bsp-blog-catalog .filter-summary { display: none; }
}

/* Filtre en cascade, révision du 25 octobre 2026 : une expertise « aussi
   traitée » (liée à l'application choisie) = contour bleu en pointillé, sans
   fond. Le bleu plein reste réservé à ce que l'utilisateur a choisi, le bleu
   pâle avec contour plein et croix à l'expertise sélectionnée automatiquement. */
.bsp-blog-catalog .chip.is-associe {
	background: transparent;
	border: 2px dotted var(--bsp-accent);
	padding: 8px 15px; /* 2 px de bordure au lieu de 1 : même hauteur que les autres puces */
	color: var(--bsp-text);
}
:root[data-bsp-theme="light"] .bsp-blog-catalog .chip.is-associe {
	background: transparent;
	border-color: var(--bsp-accent-text);
}
.bsp-blog-catalog .chip.is-associe:hover { background: rgba(var(--bsp-accent-rgb), 0.10); border-style: solid; }

/* Pointillé du filtre en cascade, 25 octobre 2026 : un border dotted ne laisse
   régler ni l'épaisseur fine ni l'écart entre les points. Le contour est donc
   un SVG en fond (points de 1,5 px, écart de 4,5 px), collé au bord de la
   puce. La bordure reste de 2 px, transparente, pour garder la même hauteur
   que les autres puces. Couleurs en dur (un SVG en fond ne lit pas les jetons) :
   accent sombre #118CFE, accent clair #0A5EA8 (--bsp-accent-text). */
.bsp-blog-catalog .chip.is-associe {
	border: 2px solid transparent;
	background-color: transparent;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' rx='22' ry='22' fill='none' stroke='%23118CFE' stroke-width='3' stroke-dasharray='1.5 4.5'/%3E%3C/svg%3E");
	background-size: 100% 100%;
	background-repeat: no-repeat;
}
:root[data-bsp-theme="light"] .bsp-blog-catalog .chip.is-associe {
	border-color: transparent;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' rx='22' ry='22' fill='none' stroke='%230A5EA8' stroke-width='3' stroke-dasharray='1.5 4.5'/%3E%3C/svg%3E");
}
.bsp-blog-catalog .chip.is-associe:hover,
:root[data-bsp-theme="light"] .bsp-blog-catalog .chip.is-associe:hover {
	background-image: none;
	border: 2px solid var(--bsp-accent);
	background-color: rgba(var(--bsp-accent-rgb), 0.10);
}

/* Filtre en cascade, 25 octobre 2026, révision finale de l'état « aussi
   traitée » : le contour pointillé est abandonné (les points s'élargissaient
   dans les courbes, et virent au noir en mode clair). Nouvel état : contour
   fin plein, bleu atténué, sans fond, plus un petit point bleu après le
   libellé. Aucune dépendance à un SVG ni à un style de bordure. */
.bsp-blog-catalog .chip.is-associe {
	background-image: none;
	background-color: transparent;
	border: 1px solid rgba(var(--bsp-accent-rgb), 0.45);
	padding: 9px 16px;
	color: var(--bsp-text);
}
.bsp-blog-catalog .chip.is-associe::after {
	content: ""; flex: none;
	width: 6px; height: 6px; border-radius: 50%;
	background: var(--bsp-accent);
	margin-left: 1px;
}
:root[data-bsp-theme="light"] .bsp-blog-catalog .chip.is-associe {
	background-image: none;
	border: 1px solid rgba(10, 94, 168, 0.5);
}
:root[data-bsp-theme="light"] .bsp-blog-catalog .chip.is-associe::after { background: var(--bsp-accent-text); }
.bsp-blog-catalog .chip.is-associe:hover,
:root[data-bsp-theme="light"] .bsp-blog-catalog .chip.is-associe:hover {
	background-image: none;
	border: 1px solid var(--bsp-accent);
	background-color: rgba(var(--bsp-accent-rgb), 0.10);
}

/* Filtre en cascade, 25 octobre 2026 : « Voir toutes les applications » vit
   dans la ligne de résumé, après « Tout effacer ». La croix de l'expertise
   sélectionnée automatiquement est retirée (elle prêtait à confusion) : un clic
   sur cette puce la fixe comme filtre. */
.bsp-blog-catalog .filter-summary .chip-voir-tout { padding: 0; font-size: 13px; }
.bsp-blog-catalog .chip .chip-x { display: none; }

/* Statistique « 30+ » de la page DNA (25 octobre 2026) : le « + » de la police
   d'affichage est trop fin et trop grand à côté des chiffres gras; il passe en
   exposant, comme sur la page Team. Hérite la couleur du chiffre (clair et sombre). */
.bsp-stat-number em {
	font-family: var(--bsp-font-body); font-style: normal; font-weight: 700;
	font-size: .6em; vertical-align: top; margin-left: 3px; line-height: 1.1;
}

/* Page Team, carte « 30+ » (25 octobre 2026) : le 3 de la police d'affichage
   descend sous la ligne de base (chiffres elzéviriens) et mordait le mot
   « Specialists ». Le chiffre monte : marge basse proportionnelle à sa taille. */
.bsp-team-page .tb-num { margin-bottom: .2em; }

/* ── Étude de cas sur mobile (26 octobre 2026, demande de Clément) ─────────────
   La vidéo reste seule en haut, avec ses commandes; toute la description
   (étiquette, titre, accroche, boutons, client / lieu / secteur / solutions)
   passe en dessous, condensée. L'écran n'est plus couvert de texte. Le bloc reste
   sombre dans les deux thèmes (comme le héros). Les trois résultats deviennent
   des lignes régulières : chiffre à gauche, libellé à droite, filets horizontaux. */
@media (max-width: 767px) {
	body.bsp-case-study .cs-hero {
		display: block; height: auto; min-height: 0; aspect-ratio: auto;
		padding: 0; --cs-hero-bottom: 12px;
	}
	/* Bloc d'infos sous la vidéo : bord franc, sans le fondu du bandeau (en mode clair il
	   éclaircissait le bas du bloc juste au-dessus de la barre bleue). */
	body.bsp-case-study .cs-hero::after { display: none; }
	body.bsp-case-study .cs-hero-bg {
		position: relative; inset: auto; width: 100%;
		aspect-ratio: 16 / 11;
	}
	body.bsp-case-study .cs-hero-bg::after {
		background: linear-gradient(to top, rgba(6,8,16,0.5) 0%, transparent 35%);
	}
	body.bsp-case-study .cs-video-controls {
		justify-content: flex-end; padding-right: var(--bsp-gutter); gap: 10px;
	}
	body.bsp-case-study .cs-vc-playpause, body.bsp-case-study .cs-vc-mute { width: 40px; height: 40px; }
	body.bsp-case-study .cs-vc-btn :is(i, svg) { font-size: 17px; }

	body.bsp-case-study .cs-hero-content { max-width: none; padding: 22px var(--bsp-gutter) 0; }
	body.bsp-case-study .cs-hero-kicker { flex-wrap: wrap; gap: 4px 12px; margin-bottom: 10px; }
	body.bsp-case-study .cs-hero-kicker .kicker-divider { display: none; }
	body.bsp-case-study .cs-hero-kicker .kicker-label { font-size: 10.5px; letter-spacing: 0.12em; line-height: 1.5; }
	body.bsp-case-study .cs-hero-title { font-size: clamp(28px, 8vw, 34px); margin-bottom: 12px; }
	body.bsp-case-study .cs-hero-sub { font-size: 16px; line-height: 1.5; max-width: none; color: rgba(255,255,255,0.72); }
	body.bsp-case-study .cs-hero-nav { margin-top: 18px; gap: 16px; }

	body.bsp-case-study .cs-hero-meta {
		position: static; display: grid; grid-template-columns: 1fr 1fr; gap: 16px 20px;
		align-items: start; flex-direction: row; margin: 22px var(--bsp-gutter) 0;
		padding: 18px 0 32px;
		border-top: 1px solid rgba(255,255,255,0.14);
	}
	body.bsp-case-study .cs-hero-meta .meta-item { text-align: left; }
	body.bsp-case-study .cs-hero-meta .meta-label { font-size: 10px; letter-spacing: 0.2em; margin-bottom: 3px; }
	body.bsp-case-study .cs-hero-meta .meta-value { font-size: 14px; line-height: 1.35; letter-spacing: 0.02em; text-align: left; }

	/* Résultats : lignes régulières, sans filet vertical. */
	body.bsp-case-study .results-bar { grid-template-columns: 1fr; grid-auto-flow: row; padding: 4px var(--bsp-gutter); }
	body.bsp-case-study .results-bar .result-item,
	body.bsp-case-study .results-bar .result-item + .result-item {
		display: grid; grid-template-columns: minmax(104px, 36%) 1fr; align-items: center; gap: 16px;
		padding: 20px 0; border: 0; border-top: 1px solid rgba(255,255,255,0.22);
	}
	body.bsp-case-study .results-bar .result-item:first-child { border-top: 0; }
	/* Emplacement sans chiffre : toujours masqué (ma règle « grid » plus haut l'aurait réaffiché). */
	body.bsp-case-study .results-bar .result-item:has(.result-num:empty) { display: none; }
	body.bsp-case-study .results-bar .result-num { font-size: 34px; }
	body.bsp-case-study .results-bar .result-label { margin-top: 0; font-size: 14px; }
}
