/*
Theme Name: Hello Elementor Child
Theme URI: https://elementor.com/hello-theme/
Description: Thème enfant de Hello Elementor pour le site Schoellkopf Avocat.
Author: Matthias Imbert
Template: hello-elementor
Version: 1.1.7
Text Domain: hello-elementor-child
License: GNU General Public License v3 or later
License URI: https://www.gnu.org/licenses/gpl-3.0.html
*/

/* === SCHOELLKOPF AVOCAT === */
/* Polices auto-hébergées (Switzer + Adobe Caslon Pro) chargées via assets/fonts/fonts.css.
   Caslon existe en DEUX graisses statiques : Regular (100→500) et Semibold (600→900).
   Le rendu historique du site est le Semibold -> les règles Caslon ci-dessous
   demandent explicitement 600. Utiliser 300/400 pour obtenir le Regular. */

body {
  font-family: 'Switzer', sans-serif;
  font-size: max(16px, min(20px, calc(18 * var(--theme-spx-ratio))));
  color: #1a1a1a;
  background-color: #ffffff;
}

h1, h2, h3, h4, h5, h6, .elementor-heading-title {
  font-family: 'Adobe Caslon Pro', Georgia, serif;
  color: #1a1a1a;
}

/* H1 : taille fluide (40px mini, 64px maxi), formule source. */
h1,
h1.elementor-heading-title {
  font-size: max(40px, min(64px, calc(60 * var(--theme-spx-ratio)))) !important;
  font-weight: 600 !important;
  line-height: 1;
}

/* Neutralise le CSS perso hérité "Playfair Display" (post-11.css) :
   force Adobe Caslon sur les titres du widget Titre, sans toucher aux tailles. */
.elementor-widget-heading .elementor-heading-title {
  font-family: 'Adobe Caslon Pro', Georgia, serif !important;
}

/* Ratio fluide "spx" repris de la source : largeur bornée à 1600px, divisée
   par 1280. Chaîne d'origine (Wix), résolue :
     --full-viewport     : 100 * var(--one-unit) * var(--browser-zoom) -> 100vw
     --scaling-factor    : clamp(0px, 100vw, min(9999px, 1600px))     -> clamp(0px, 100vw, 1600px)
     --theme-spx-ratio   : var(--scaling-factor) / 1280
   1280 (et non 1200) est la bonne valeur : les règles « coefficient » plus bas
   l'encodent déjà (0.015625 * 1280 = 20px, 0.0125 * 1280 = 16px, 0.0562513 * 1280 = 72px).
   (100vw au lieu de 100cqw : Elementor ne définit pas de container-type,
   donc les container-queries ne s'appliqueraient pas.) */
:root {
  --scaling-factor: clamp(0px, 100vw, 1600px);          /* largeur bornée à 1600px */
  --scrollbar-width: 0px;                                /* corrige la scrollbar (source) */
  --theme-spx-ratio: calc(var(--scaling-factor) / 1280); /* … divisée par 1280 */
}

/* Échelle typographique des titres — tailles FLUIDES calées sur la source.
   Formule : max(min, min(max, base * --theme-spx-ratio)).
   La famille Adobe Caslon est imposée plus haut ; ici taille/graisse/interligne.
   !important : prime sur les tailles réglées par widget dans Elementor. */
h2 { font-size: max(32px, min(50px, calc(46 * var(--theme-spx-ratio)))) !important; font-weight: 600 !important; line-height: 1.1em !important; }
h3 { font-size: max(20px, min(32px, calc(30 * var(--theme-spx-ratio)))) !important; font-weight: 600 !important; line-height: 1.2em !important; }
h4 { font-size: 36px !important; font-weight: 600 !important; line-height: 1.2em !important; }
h5 { font-size: max(20px, min(32px, calc(30 * var(--theme-spx-ratio)))) !important; font-weight: 600 !important; line-height: 1.2em !important; }
h6 { font-size: max(18px, min(24px, max(0.5px, calc(0.015625 * (var(--scaling-factor) - var(--scrollbar-width)))))) !important; font-weight: 400 !important; line-height: 1.2em !important; }

/* Exception H6 : en Switzer (pas Caslon). Spécificité 0,2,1 pour passer devant
   l'override Caslon des titres-widgets (.elementor-widget-heading .elementor-heading-title). */
h6,
.elementor-widget-heading h6.elementor-heading-title {
  font-family: 'Switzer', sans-serif !important;
}

/* =========================================================
   Styles de texte de la source Wix (.font_0 … .font_10)
   ---------------------------------------------------------
   Relevés tels quels sur https://www.schoellkopfavocat.com/ (règles .font_N +
   variables --font_N). À poser comme classe CSS sur un widget Elementor pour
   recaler un élément sur l'échelle typographique d'origine.

   Correspondances de familles :
     adobe-caslon-w01-smbd  -> 'Adobe Caslon Pro'  (la source demande 400 sur un
                               fichier Semibold : chez nous cela s'écrit 600)
     orig_switzer_regular   -> 'Switzer' 400
   Couleurs source : color_11 #000 · color_13 #191919 · color_14 #4d4d4d.
   La couleur est volontairement SANS !important : elle reste surchargeable
   dans Elementor, contrairement à la fonte/taille/interligne.
   Les liens sont ciblés en a:not(.elementor-button) : les boutons Elementor
   gardent leur propre typographie, et la spécificité obtenue (0,2,1) passe
   devant la règle globale a:not(.elementor-button) (0,1,1) déclarée plus bas.
   Même exclusion sur les span : le libellé d'un bouton vit dans un <span>, et
   Elementor ne colore que le <a> parent. Cibler ce span directement écraserait
   la couleur réglée par widget, que le span ne reçoit que par héritage.
   Le survol global a:not(.elementor-button):hover est aussi en 0,2,1 mais
   déclaré APRÈS : il gagne l'égalité, le survol du site est préservé.
   Placé APRÈS l'override Caslon des titres-widgets pour gagner l'égalité de
   spécificité (0,2,0) par l'ordre de la cascade. */

/* --- Titres : Adobe Caslon Pro (Semibold) --- */
.font_0, .font_0 p, .font_0 a:not(.elementor-button), .font_0 .elementor-heading-title, .font_0 span:not(.elementor-button span) {
  font-family: 'Adobe Caslon Pro', Georgia, serif !important;
  font-weight: 600 !important;
  --sk-font-size: max(40px, min(64px, calc(60 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.1em !important;
  letter-spacing: 0em !important;
  color: #000000;
}
.font_2, .font_2 p, .font_2 a:not(.elementor-button), .font_2 .elementor-heading-title, .font_2 span:not(.elementor-button span) {
  font-family: 'Adobe Caslon Pro', Georgia, serif !important;
  font-weight: 600 !important;
  --sk-font-size: max(32px, min(50px, calc(46 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.1em !important;
  letter-spacing: 0em !important;
  color: #000000;
}
.font_3, .font_3 p, .font_3 a:not(.elementor-button), .font_3 .elementor-heading-title, .font_3 span:not(.elementor-button span) {
  font-family: 'Adobe Caslon Pro', Georgia, serif !important;
  font-weight: 600 !important;
  --sk-font-size: max(36px, min(48px, calc(40 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.2em !important;
  letter-spacing: 0em !important;
  color: #000000;
}
.font_4, .font_4 p, .font_4 a:not(.elementor-button), .font_4 .elementor-heading-title, .font_4 span:not(.elementor-button span) {
  font-family: 'Adobe Caslon Pro', Georgia, serif !important;
  font-weight: 600 !important;
  --sk-font-size: max(24px, min(38px, calc(36 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.2em !important;
  letter-spacing: 0em !important;
  color: #000000;
}
.font_5, .font_5 p, .font_5 a:not(.elementor-button), .font_5 .elementor-heading-title, .font_5 span:not(.elementor-button span) {
  font-family: 'Adobe Caslon Pro', Georgia, serif !important;
  font-weight: 600 !important;
  --sk-font-size: max(20px, min(32px, calc(30 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.2em !important;
  letter-spacing: 0em !important;
  color: #000000;
}

/* --- Textes : Switzer Regular --- */
.font_6, .font_6 p, .font_6 a:not(.elementor-button), .font_6 .elementor-heading-title, .font_6 span:not(.elementor-button span) {
  font-family: 'Switzer', sans-serif !important;
  font-weight: 400 !important;
  --sk-font-size: max(18px, min(22px, calc(22 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.2em !important;
  letter-spacing: 0em !important;
  color: #000000;
}
/* font_7 et font_8 sont identiques à la taille et à l'interligne près :
   seule la couleur les distingue (#191919 pour le corps de texte, #4d4d4d
   pour le texte secondaire). */
.font_7, .font_7 p, .font_7 a:not(.elementor-button), .font_7 .elementor-heading-title, .font_7 span:not(.elementor-button span) {
  font-family: 'Switzer', sans-serif !important;
  font-weight: 400 !important;
  --sk-font-size: max(16px, min(20px, calc(18 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.4em !important;
  letter-spacing: 0em !important;
  color: #191919;
}
.font_8, .font_8 p, .font_8 a:not(.elementor-button), .font_8 .elementor-heading-title, .font_8 span:not(.elementor-button span) {
  font-family: 'Switzer', sans-serif !important;
  font-weight: 400 !important;
  --sk-font-size: max(16px, min(20px, calc(18 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.4em !important;
  letter-spacing: 0em !important;
  color: #4d4d4d;
}
.font_9, .font_9 p, .font_9 a:not(.elementor-button), .font_9 .elementor-heading-title, .font_9 span:not(.elementor-button span) {
  font-family: 'Switzer', sans-serif !important;
  font-weight: 400 !important;
  --sk-font-size: max(12px, min(14px, calc(14 * var(--theme-spx-ratio))));
  font-size: var(--sk-font-size) !important;
  line-height: 1.4em !important;
  letter-spacing: 0em !important;
  color: #4d4d4d;
}

/* --- font_1 / font_10 : restes des réglages par défaut de Wix --- */
/* Ces deux styles sortent du système fluide (taille en px fixes) et appellent
   « din-next-w01-light », une police Wix que nous n'hébergeons pas. Ils ne sont
   utilisés nulle part dans le design de la source. Portés pour mémoire, avec
   Switzer en substitution ; à supprimer s'ils ne servent jamais. */
.font_1, .font_1 p, .font_1 a:not(.elementor-button), .font_1 span:not(.elementor-button span) {
  font-family: 'Switzer', sans-serif !important;   /* source : din-next-w01-light */
  font-weight: 400 !important;
  --sk-font-size: 16px;
  font-size: var(--sk-font-size) !important;
  line-height: 1.4em !important;
  letter-spacing: 0em !important;
  color: #4d4d4d;
}
.font_10, .font_10 p, .font_10 a:not(.elementor-button), .font_10 span:not(.elementor-button span) {
  font-family: 'Switzer', sans-serif !important;   /* source : din-next-w01-light */
  font-weight: 400 !important;
  --sk-font-size: 12px;
  font-size: var(--sk-font-size) !important;
  line-height: 1.4em !important;
  letter-spacing: 0em !important;
  color: #4d4d4d;
}

/* --- Taille du libellé des boutons portant une classe font_X --- */
/* Le reste du bloc écarte volontairement les boutons (a:not(.elementor-button),
   span:not(.elementor-button span)) pour ne pas écraser la couleur et la fonte
   réglées par widget dans Elementor. Mais la TAILLE, elle, doit suivre la
   classe. On la repasse ici, et uniquement elle.
   Le sélecteur composé .font_X.elementor-widget-button limite l'effet au widget
   Bouton qui PORTE la classe : un bouton simplement imbriqué dans un bloc
   font_X garde sa propre taille.
   Le <span> est visé en plus du <a> car .elementor-button span (plus bas) pose
   sa taille directement dessus — l'héritage depuis le <a> ne peut pas la battre. */
.font_0.elementor-widget-button .elementor-button,
.font_0.elementor-widget-button .elementor-button span,
.font_2.elementor-widget-button .elementor-button,
.font_2.elementor-widget-button .elementor-button span,
.font_3.elementor-widget-button .elementor-button,
.font_3.elementor-widget-button .elementor-button span,
.font_4.elementor-widget-button .elementor-button,
.font_4.elementor-widget-button .elementor-button span,
.font_5.elementor-widget-button .elementor-button,
.font_5.elementor-widget-button .elementor-button span,
.font_6.elementor-widget-button .elementor-button,
.font_6.elementor-widget-button .elementor-button span,
.font_7.elementor-widget-button .elementor-button,
.font_7.elementor-widget-button .elementor-button span,
.font_8.elementor-widget-button .elementor-button,
.font_8.elementor-widget-button .elementor-button span,
.font_9.elementor-widget-button .elementor-button,
.font_9.elementor-widget-button .elementor-button span,
.font_1.elementor-widget-button .elementor-button,
.font_1.elementor-widget-button .elementor-button span,
.font_10.elementor-widget-button .elementor-button,
.font_10.elementor-widget-button .elementor-button span {
  font-size: var(--sk-font-size) !important;
}

/* === h2 sur mobile : échelle propre à la source === */
/* La source ne se contente pas de .font_2 sur les titres de niveau 2 : sous
   751px elle superpose une surcharge par composant, dans
   @media screen and (min-width: 320px) and (max-width: 750px).
   Elle a une base ET une référence différentes du desktop :
     desktop  46 spx / 1280  ->  0.0359375 * scaling-factor   (c'est .font_2)
     mobile   36 spx /  390  ->  0.0923077 * scaling-factor
   Le 390 est la largeur de référence mobile de Wix, confirmé par la
   déclaration sœur : --minFontSize:32px; --maxFontSize:50px; --fontSize:36spx.
   Sans cette règle, notre h2 reste collé à son plancher de 32px sur tout le
   mobile, là où la source monte à 36px dès 390px et atteint 50px vers 542px.
   Seuil à 750px, celui de la source — au-delà .font_2 reprend la main.
   Le second sélecteur redéfinit --sk-font-size pour les éléments portant la
   classe font_2 : même liste que sa règle d'origine, déclarée après, donc elle
   gagne l'égalité de spécificité. */
@media (max-width: 750px) {
  h2 {
    font-size: max(32px, min(50px, max(0.5px, calc(0.0923077 * (var(--scaling-factor) - var(--scrollbar-width)))))) !important;
  }
  .font_2, .font_2 p, .font_2 a:not(.elementor-button), .font_2 .elementor-heading-title, .font_2 span:not(.elementor-button span) {
    --sk-font-size: max(32px, min(50px, max(0.5px, calc(0.0923077 * (var(--scaling-factor) - var(--scrollbar-width))))));
  }
}

/* === Blocs de texte de la page Cabinet — surcharges par composant === */
/* Relevé sur https://www.schoellkopfavocat.com/cabinet. Ces blocs portent la
   classe .font_5 dans la source, mais reçoivent par-dessus une surcharge de
   TAILLE seule (la fonte, la couleur et l'interligne restent ceux de font_5) :

     #comp-mbupkjil   « Engagé en faveur de l'accès au droit »
     #comp-mbupfizq9  « Engagé pour le rayonnement de votre entreprise »
        desktop : --fontSize:26spx, min 20px, max 32px -> 0.0203125 * SF (26/1280)
        mobile  : @media 320-750px                     -> 0.0564103 * SF (22/390)

     #comp-mbuppwd19  « Avocate Fondatrice du cabinet »
        desktop : aucune surcharge, .font_5 s'applique (30spx/1280)
        mobile  : 0.0564103 * SF (22/390)

   font_5 générique valant 30spx/1280, ces blocs sont volontairement plus petits.
   Ce sont donc des classes dédiées, PAS une modification de .font_5 : la
   surcharge ne touche que ces trois blocs, sur cette seule page.
   À poser EN PLUS de font_5, contrairement aux autres classes sur mesure : ici
   la surcharge ne porte que sur la taille, comme dans la source. Ces règles sont
   déclarées après le bloc font_X, elles gagnent donc l'égalité de spécificité
   contre .font_5 (0,1,0) et .font_5 p (0,1,1). */
.cabinet-engagement,
.cabinet-engagement p,
.cabinet-engagement .elementor-heading-title,
.cabinet-engagement span:not(.elementor-button span) {
  font-size: max(20px, min(32px, max(0.5px, calc(0.0203125 * (var(--scaling-factor) - var(--scrollbar-width)))))) !important;
}
@media (max-width: 750px) {
  .cabinet-engagement,
  .cabinet-engagement p,
  .cabinet-engagement .elementor-heading-title,
  .cabinet-engagement span:not(.elementor-button span),
  .cabinet-bio,
  .cabinet-bio p,
  .cabinet-bio .elementor-heading-title,
  .cabinet-bio span:not(.elementor-button span) {
    font-size: max(20px, min(32px, max(0.5px, calc(0.0564103 * (var(--scaling-factor) - var(--scrollbar-width)))))) !important;
  }
}


/* Variante de H2 plus petite. !important requis pour passer devant h2 { …!important } */
.smaller-h2 h2 {
  font-size: 32px !important;
}

/* Hero H1 / H3 : tailles fluides.
   Le H1 est sur l'échelle spx de la source : coefficient 53, soit 53px dès
   1280px de large (--theme-spx-ratio vaut 1 à cette largeur) et un plancher
   de 31px atteint vers 749px. Vaut pour la home FR et la home EN, qui portent
   toutes deux .home-h1.
   L'ancienne media query à 767px, qui forçait 40px, a été retirée : la formule
   gouverne désormais aussi le mobile (31,8px à 767px, puis le plancher à 31px
   en dessous de 749px).

   Le sélecteur ne vise QUE le widget atomique du hero desktop, qui porte la
   classe directement sur le <h1> (e-heading-base, sans
   .elementor-heading-title à l'intérieur). Le hero mobile — section 40782db,
   elementor-hidden-desktop — porte aussi .home-h1 mais sur l'ancien widget
   Titre : il est volontairement laissé de côté et prend sa taille dans
   Elementor. h1.home-h1 est à (0,1,1) ; le !important lui suffit pour passer
   devant le sélecteur atomique d'Elementor (0,2,0). */
h1.home-h1 {
  font-size: max(29px, min(51px, calc(53 * var(--theme-spx-ratio)))) !important;
  margin-top: 30px;
}
/* Mobile : le titre se répartit tout seul, on retire le saut de ligne forcé.
   display:none est la seule méthode fiable sur un <br> — `content` sur un
   élément réel n'est pas supporté partout et ::before/::after ne sont pas
   rendus sur un <br>. Conséquence : le <br> disparaît SANS laisser d'espace.
   Pour que « dédié à » et « l'immigration » ne se collent pas, il faut un
   espace avant le <br> dans le texte Elementor (« dédié à <br>l'immigration ») :
   sur desktop un espace en fin de ligne avant un saut forcé n'est pas rendu,
   donc l'ajout est invisible là-bas.
   À faire aussi dans Elementor : le titre contient un U+2028 entre
   « professionnelle » et « et à la mobilité », saut de ligne forcé qu'aucune
   règle CSS ne peut annuler. */
@media (max-width: 767px) {
  h1.home-h1 br {
    display: none;
  }
}
.hero-h3 .elementor-heading-title {
  font-size: clamp(28px, 2.14vw, 50px) !important;
  /* 41px à 1920px */
  line-height: 1.1 !important;
}

/* Hero : hauteur de l'image .logo-home = hauteur du titre H1.
   Le H1 a un <br> (2 lignes, line-height 1) → hauteur ≈ 2 × sa taille fluide.
   On fixe donc la hauteur de l'image sur cette valeur (pas de stretch, sinon
   c'est l'image, plus grande, qui impose la hauteur). */
.logo-home img {
  height: calc(2 * max(40px, min(64px, calc(60 * var(--theme-spx-ratio))))) !important;
  width: auto !important;
  object-fit: contain !important;
  padding-bottom: 11%;
  margin-top: -5%;
}

/* H2 "expertises" plus petit, en Switzer.
   Le variant .elementor-heading-title (0,2,1) bat l'override Caslon des
   titres-widgets (.elementor-widget-heading .elementor-heading-title, 0,2,0). */
.small-h2-expertises {
  font-size: max(16px, min(20px, calc(18 * var(--theme-spx-ratio)))) !important;
  font-family: 'Switzer', sans-serif !important;
  margin-top: 3px;
  font-weight: 500 !important;
  padding-right: 36px;
}
.list-number p {
  font-size: 20px !important;
  font-family: 'Switzer', sans-serif !important;
  margin-top: 0px;
  font-weight: 400 !important;
  color: #1a1a1a;
}

/* Description qui suit un titre .small-h2-expertises, hors accordéon.
   Deux cas selon le contenu saisi dans le widget :
   - texte dans un <p> : ciblé directement (la règle .font_8 p, qui pose #4d4d4d
     sur le <p> lui-même, empêcherait sinon l'héritage) ;
   - texte nu, sans balise : un nœud de texte ne se sélectionne pas en CSS. On
     colore donc le widget entier et le texte hérite. Le titre n'est pas touché :
     h1, h2… { color: #1a1a1a } s'applique directement à lui, et une déclaration
     directe l'emporte toujours sur l'héritage. */
.small-h2-expertises + p:not(.accordeon-item p),
.elementor-widget-text-editor:has(.small-h2-expertises):not(.accordeon-item *) {
  color: #7A7A7A;
}

.avocat-fonction h5.elementor-heading-title,
.avocat-fonction h3.elementor-heading-title,
.avocat-fonction .elementor-heading-title  {
	font-weight: 300 !important;
}

/* Épinglage en bas du conteneur réservé au desktop. Sous 1025px — tablette et
   téléphone, le seuil où le site bascule en menu burger — la colonne se réduit
   et le positionnement absolu chevaucherait le contenu : on laisse le bloc
   reprendre le flux normal.
   La classe .no-absolute permet de désactiver l'épinglage au cas par cas, y
   compris sur desktop. Elle est posée dans le :not() plutôt que dans un bloc
   d'annulation : la règle ne s'applique alors jamais, il n'y a aucune propriété
   à remettre à sa valeur initiale. */
@media (min-width: 1025px) {
	.social-links:not(.no-absolute) {
		position: absolute;
		bottom: 0;
	}
}

/* Écart entre les icônes sociales, en fluide.
   Le widget est réglé sur « Colonnes : 0 », ce qui bascule .elementor-grid de
   display:grid à display:inline-block (règle .elementor-grid-0 d'Elementor).
   column-gap devient alors inerte — il reste à 0 — et l'écart réel vient de
   word-spacing: var(--grid-column-gap), avec font-size:0 sur le conteneur.
   C'est donc --grid-column-gap qu'il faut piloter, pas column-gap.
   0.0117188 = 15/1280 : la formule reproduit exactement les 15px réglés dans
   Elementor à 1280px de large, et les fait suivre l'échelle (18,75px à 1600px).
   Pas de !important : Elementor pose la variable sur le WIDGET
   (.elementor-668 .elementor-element-ec40f4c, 0,3,0) et .elementor-grid n'en
   hérite que ; la poser directement sur .elementor-grid bat cet héritage. */
.elementor-widget-social-icons .elementor-grid {
	--grid-column-gap: max(0.5px, calc(0.0117188 * (var(--scaling-factor) - var(--scrollbar-width))));
}

.elementor-widget-social-icons .elementor-grid .elementor-grid-item {
	margin-right: 0px;
}

.footer-socials .elementor-grid-item {
	margin-right: 0 !important;
}


/* Links scoped to avoid button color override */
a:not(.elementor-button) { color: #1a1a1a; text-decoration: none; }
a:not(.elementor-button):hover { color: #555555; }

/* Fix the specific CTA dark button - ID 73eada9 */
.elementor-element-73eada9 .elementor-button,
.elementor-element-73eada9 .elementor-button span,
.elementor-element-73eada9 .elementor-button-text {
  color: #ffffff !important;
}

/* === Effet parallax sur le fond des sections .parrallax ===
   On n'utilise PAS background-attachment: fixed (bugué sur iOS/Safari mobile).
   À la place, un pseudo-élément hérite de l'image de fond posée par Elementor
   (background-image: inherit) et est translaté par assets/js/parallax.js :
     --sk-parallax-y : défilement (±95px) + suivi vertical de la souris (±22px)
     --sk-parallax-x : suivi horizontal de la souris (±22px)

   Le débordement doit dépasser ces amplitudes pour qu'aucun bord de l'image
   n'apparaisse en fin de course, d'où 120px en haut/bas et 30px sur les côtés.
   Il est exprimé en PIXELS, pas en % : avec `cover`, un débord de 30% en haut
   et en bas obligeait à agrandir l'image de 1,6× (visuel flou). Ici l'échelle
   ne dépend plus de la hauteur de la section (≈ 1,25× pour un hero plein écran). */
.parrallax {
  position: relative;
  overflow: hidden;
}
.parrallax::before {
  content: "";
  position: absolute;
  top: -120px;
  bottom: -120px;
  left: -30px;
  right: -30px;
  z-index: 0;
  background-image: inherit;      /* reprend l'image réglée dans Elementor */
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  transform: translate3d(var(--sk-parallax-x, 0px), var(--sk-parallax-y, 0px), 0);
  will-change: transform;
  pointer-events: none;
}
/* Superposition Elementor et contenu au-dessus du calque parallax. */
.parrallax > .elementor-background-overlay {
  z-index: 1;
}
.parrallax > .elementor-container {
  position: relative;
  z-index: 2;
}
/* Accessibilité : pas de mouvement si l'utilisateur le demande. */
@media (prefers-reduced-motion: reduce) {
  .parrallax::before {
    transform: none;
  }
}
/* Mobile : pas de débord horizontal (pas de suivi souris au doigt) — l'image
   est ainsi mise à l'échelle sur la seule contrainte verticale. */
@media (max-width: 767px) {
  .parrallax::before {
    left: 0;
    right: 0;
  }
}

/* Fond du hero : Elementor cale l'image sur la hauteur du conteneur
   (background-size: auto 100%). Avec min-height: 100vh, un très grand écran
   rend le conteneur nettement plus haut que ses 1003px de large : l'image,
   mise à l'échelle sur la hauteur, déborde alors en largeur et se fait rogner
   sur les côtés.
   `contain` la borne sur les DEUX axes : elle reste entière et centrée, et
   c'est le vide qui apparaît en haut et en bas plutôt que ses bords qui
   partent. Aux hauteurs modestes le rendu est inchangé — c'est déjà la
   hauteur qui contraint, les deux valeurs y donnent le même résultat.
   !important : le sélecteur généré par Elementor (.elementor .e-7f54785-…)
   est à (0,2,0), la classe seule à (0,1,0). */
.hero-section-background-container {
  background-size: contain !important;
}

/* === Flèche « scroller vers le bas » en bas des sections .hero-section ===
   Purement décorative (pointer-events: none) : elle signale le défilement.
   On utilise ::after car sur le hero, ::before porte déjà le calque parallax.
   z-index 3 : au-dessus du contenu (.elementor-container, z-index 2). */
.hero-section {
  position: relative;
  /* Géométrie partagée par la flèche et par sa zone cliquable, pour qu'elles
     ne puissent pas se désaligner. */
  --sk-hint-size: 56px;
  --sk-hint-bottom: 30px;
}
.hero-section::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: var(--sk-hint-bottom);
  z-index: 3;
  width: var(--sk-hint-size);
  height: var(--sk-hint-size);
  background: url("assets/images/fleche-bas.png") no-repeat center / contain;
  animation: sk-scroll-hint 2s ease-in-out infinite;
  pointer-events: none;
}

/* Zone cliquable de la flèche : défilement vers la section suivante.
   Un pseudo-élément ne reçoit pas d'événement propre — son clic cible
   l'élément d'origine, sans moyen fiable de le distinguer d'un clic ailleurs
   dans le hero. On superpose donc un vrai <button>, injecté par
   assets/js/scroll-hint.js et calé sur les mêmes variables que ::after.
   Il reste transparent : le visuel appartient à ::after, qui survit donc
   si le JS ne s'exécute pas — la flèche est alors simplement décorative.
   translate(-50%) reproduit le centrage de la flèche, qui est porté par ses
   keyframes et non par sa position. */
.hero-scroll-hint {
  position: absolute;
  left: 50%;
  bottom: var(--sk-hint-bottom);
  z-index: 4;
  width: var(--sk-hint-size);
  height: var(--sk-hint-size);
  padding: 0;
  cursor: pointer;
  transform: translate(-50%, 0);
}
/* Le reset.css du thème parent habille TOUS les <button> en framboise :
     button                { border: 1px solid #c36; color: #c36 }
     button:focus, :hover  { background-color: #c36; color: #fff }
   Le second est à (0,1,1) et passait devant .hero-scroll-hint (0,1,0), d'où
   le fond rouge au survol et au focus. Lister les pseudo-classes porte nos
   sélecteurs à (0,2,0), ce qui suffit à reprendre la main sans !important. */
.hero-scroll-hint,
.hero-scroll-hint:hover,
.hero-scroll-hint:focus,
.hero-scroll-hint:active {
  border: 0;
  background: none;
  color: inherit;
}
.hero-scroll-hint:focus-visible {
  outline: 2px solid #1a1a1a;
  outline-offset: 4px;
}

/* Mobile : flèche un peu plus discrète. On redéfinit la variable plutôt que
   width/height sur ::after, pour que la zone cliquable suive la même taille —
   c'est tout l'intérêt de la passer par une variable. 45px reste au-dessus
   des 44px recommandés pour une cible tactile. */
@media (max-width: 767px) {
  .hero-section {
    --sk-hint-size: 45px;
  }

  /* Hauteur du hero ramenée à la zone réellement visible.
     100vh vaut la hauteur de la fenêtre SANS les barres du navigateur : à
     l'arrivée sur la page, barre d'adresse affichée, le bas du hero est déjà
     hors écran, et la flèche — posée à 30px de ce bas — avec lui. svh est la
     hauteur barres déployées, donc la plus petite : tout tient dès le
     chargement, et l'espace excédentaire entre la flèche et la section
     suivante disparaît du même coup.
     Il faut la poser sur les DEUX éléments. .hero-section n'a pas de hauteur
     propre : c'est son enfant qui en impose une (min-height: 100vh, généré
     par Elementor sur .e-7f54785-d0229bf). Tant que l'enfant fait 100vh, le
     parent ne peut pas être plus court.
     La ligne en vh reste en secours : un navigateur sans svh ignore la
     seconde et garde la première.
     svh plutôt que dvh : dvh suivrait la hauteur visible à chaque instant,
     ce qui ferait « respirer » le hero à chaque apparition de la barre
     pendant le défilement. svh est figée.
     Suppose que les DEUX homes règlent leur conteneur en « hauteur minimale »
     dans Elementor. La home EN était un temps en « hauteur » (height: 100vh),
     que redéfinir min-height seul ne pouvait pas contrer ; si le hero EN
     redevenait trop haut, c'est ce réglage qu'il faudrait revérifier. */
  .hero-section,
  body.home .hero-section-background-container {
    min-height: 100vh !important;
    min-height: 100svh !important;
  }

  /* Fond du hero, les deux homes : étiré sur toute la largeur et sur 70% de
     la hauteur du conteneur. Deux valeurs explicites, donc le rapport de
     l'image n'est PAS conservé — c'est un étirement voulu, pas un cadrage.
     Avec background-position: center center, les 30% restants se répartissent
     en deux bandes vides de 15% en haut et en bas.
     Remplace donc le `contain` déclaré plus haut dès qu'on passe sous 767px.
     !important obligatoire, cette règle-là en porte un elle aussi ; à
     spécificité supérieure (0,2,0 contre 0,1,0) l'ordre n'entre plus en jeu. */
  body.home .hero-section-background-container {
    background-size: 100% 70% !important;
  }
}

/* Tablette : Elementor pose « background-size: 100% auto » sur ce conteneur
   dans son onglet Tablette, le fond occupe donc toute la largeur. On le borne
   à 90%, ce qui laisse 5% de marge de chaque côté, background-position étant
   à center center. `auto` en hauteur conserve le rapport de l'image.
   Bornes alignées sur celles d'Elementor : son onglet Tablette couvre jusqu'à
   1024px, et 768px est le seuil au-dessus de notre bloc mobile.
   !important : le sélecteur généré est à (0,2,0) comme le nôtre, l'ordre des
   feuilles ne nous est pas garanti. */
@media (min-width: 768px) and (max-width: 1024px) {
  body.home .hero-section-background-container {
    background-size: 90% auto !important;
  }
}

/* Va-et-vient vertical. translate(-50%) reconduit à chaque étape :
   une keyframe remplace la transform, elle ne s'y ajoute pas. */
@keyframes sk-scroll-hint {
  0%, 100% { transform: translate(-50%, 0);    opacity: 0.75; }
  50%      { transform: translate(-50%, 10px); opacity: 1; }
}

/* Accessibilité : flèche immobile si l'utilisateur réduit les animations. */
@media (prefers-reduced-motion: reduce) {
  .hero-section::after {
    animation: none;
    transform: translate(-50%, 0);
  }
}

/* === Flèches du slider d'avis Trustindex ===
   Même chevron que la flèche du hero (fleche-bas.png), pivoté vers la gauche
   ou la droite. Trustindex dessine ses flèches avec DEUX barres de 17x3px
   (::before et ::after pivotées à ±45°) : on masque ::after et on réemploie
   ::before pour porter l'image.
   L'image pointe vers le bas ; rotate() tourne dans le sens horaire :
     suivant  (→)  rotate(-90deg)
     précédent (←) rotate(90deg)
   Le widget est injecté en JS depuis le CDN Trustindex, avec des sélecteurs à
   0,5,1 ou 0,6,1 (.ti-widget[data-layout-id][data-set-id][data-pid] …) :
   d'où les !important.
   Pas de va-et-vient comme sur le hero — sur une flèche de navigation, le
   mouvement permanent distrairait. Aucun effet de survol non plus (voir plus
   bas) : la flèche reste identique au repos et au survol.
   --sk-ti-arrow règle la taille ; le « top » garde la flèche centrée sur la
   position du chevron d'origine (14,5px sous le haut de .ti-controls), quelle
   que soit la taille choisie. */
.ti-widget .ti-controls {
  --sk-ti-arrow: 48px;
}
.ti-widget .ti-controls .ti-next,
.ti-widget .ti-controls .ti-prev {
  width: var(--sk-ti-arrow) !important;
  height: var(--sk-ti-arrow) !important;
  padding: 0 !important;
  top: calc(14.5px - var(--sk-ti-arrow) / 2) !important;
}
.ti-widget .ti-controls .ti-next::before,
.ti-widget .ti-controls .ti-prev::before {
  content: "" !important;
  position: absolute !important;
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
  background: url("assets/images/fleche-bas.png") no-repeat center / contain !important;
  border: 0 !important;          /* relevé : 2px blancs à gauche et en bas, reste du chevron Trustindex */
  border-radius: 0 !important;
}
.ti-widget .ti-controls .ti-next::before {
  transform: rotate(-90deg) !important;
}
.ti-widget .ti-controls .ti-prev::before {
  transform: rotate(90deg) !important;
}
.ti-widget .ti-controls .ti-next::after,
.ti-widget .ti-controls .ti-prev::after {
  display: none !important;
}
.ti-read-more {
	display: none !important;
}
.ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-review-content {
	display: block !important;
}

/* Cadre, fond et effets de survol neutralisés : seule la flèche reste visible.
   Relevé sur la flèche rendue — des valeurs absentes de la feuille de gabarit
   Trustindex, posées par une autre couche de ses styles :
     au repos   outline: 1px solid rgb(39,39,39) ; border-radius: 15px
     au survol  background-color: rgb(77,77,77)  -> le carré gris plein
   D'où la neutralisation sur TOUS les états (repos, survol, focus, clic), et le
   zoom au survol (scale 1.2) retiré au passage. Les !important battent des
   règles dont on ne maîtrise ni la spécificité ni l'ordre de chargement. */
.ti-widget .ti-controls .ti-next,
.ti-widget .ti-controls .ti-prev,
.ti-widget .ti-controls .ti-next:hover,
.ti-widget .ti-controls .ti-prev:hover,
.ti-widget .ti-controls .ti-next:focus,
.ti-widget .ti-controls .ti-prev:focus,
.ti-widget .ti-controls .ti-next:active,
.ti-widget .ti-controls .ti-prev:active {
  background: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  outline: none !important;
  box-shadow: none !important;
  transform: none !important;
}
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-next:hover,
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-prev:hover,
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-next:focus,
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-prev:focus,
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-next,
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-prev {
  background-color: transparent !important;
}

body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-next::before, 
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-prev::before,
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-next::focus, 
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-prev::focus,
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-next, 
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-prev {
	border-color: transparent !important;
}
.ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-next::before, 
.ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-controls .ti-prev::before {
	border-color: transparent !important;
}

body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-review-item > .ti-inner {
	padding-top: 0px !important;
	padding-bottom: 0px !important;
	background-color: transparent !important;
}
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="ba2087b77110332e3136971baaa"] .ti-review-item > .ti-inner {
	border-color: transparent !important;
}


/* Accessibilité : un anneau de focus reste visible à la navigation au clavier
   (jamais au clic souris). Déclaré APRÈS la règle ci-dessus : à spécificité et
   importance égales, c'est l'ordre qui tranche. */
.ti-widget .ti-controls .ti-next:focus-visible,
.ti-widget .ti-controls .ti-prev:focus-visible {
  outline: 1px solid #5e5e5e !important;
  outline-offset: 2px !important;
}

body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-review-item > .ti-inner {
  padding-top: 0px !important;
  padding-bottom: 0px !important;
}

/* === Avis Trustindex alignés sur la grille des autres sections ===
   Trustindex empile trois retraits horizontaux :
     .ti-reviews-container-wrapper  margin: 0 20px !important  (>=1024px, place des flèches)
     .ti-review-item                padding: 0 8px             (gouttière entre cartes)
     .ti-review-item > .ti-inner    padding: 20px !important   (intérieur de la carte)
   Soit ~48px de décalage sur la 1re carte et ~28px sur la 2e.
   On reproduit à la place la gouttière des colonnes Elementor (10px de chaque
   côté, 20px entre deux colonnes) avec le montage classique : marge négative
   sur le conteneur = padding des cartes. Le texte de la 1re carte tombe alors
   sur le bord du contenu, celui de la 2e sur le début de la colonne droite.
   Tous les sélecteurs sont préfixés par body : Trustindex utilise les mêmes, en
   !important, et son CSS est injecté APRÈS le nôtre — à égalité il gagnerait. */
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-reviews-container-wrapper {
  margin-left: -10px !important;
  margin-right: -10px !important;
}
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-review-item {
  padding-left: 10px !important;
  padding-right: 10px !important;
}
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-review-item > .ti-inner {
  padding-left: 0px !important;
  padding-right: 0px !important;
}
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"][data-pid="530c7388393a25723426efb3b18"] .ti-review-item > .ti-inner {
  border-color: transparent !important;
}
/* Flèches sorties du contenu, dans la marge de la section : chaque boîte de
   --sk-ti-arrow (48px) est placée entièrement à l'extérieur du bord. */
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-prev {
  left: calc(-1 * var(--sk-ti-arrow)) !important;
}
body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-next {
  right: calc(-1 * var(--sk-ti-arrow)) !important;
}
/* Grands écrans (plus de 1650px) : flèches écartées de 24px supplémentaires.
   La marge disponible y est plus large (contenu plafonné à 1600px), elles ont
   la place de respirer. */
@media (min-width: 1651px) {
  body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-prev {
    left: calc(-1 * var(--sk-ti-arrow) - 24px) !important;
  }
  body .ti-widget[data-layout-id="4"][data-set-id="ligth-border"] .ti-controls .ti-next {
    right: calc(-1 * var(--sk-ti-arrow) - 24px) !important;
  }
}

/* Avis Trustindex : textes en 20px et #1a1a1a.
   Trustindex pose 14px sur le nom, 15px sur l'avis et 13,5px sur « Lire la
   suite », avec des sélecteurs .ti-widget[data-layout-id][data-set-id] qui
   montent à 0,4,0 — d'où les !important. */
.ti-widget .ti-review-item .ti-name,
.ti-widget .ti-review-item .ti-review-content,
.ti-widget .ti-review-item .ti-read-more span {
  font-size: 20px !important;
  color: #1a1a1a !important;
}
/* Texte de l'avis un ton plus clair que le nom. Même spécificité et même
   !important que la règle ci-dessus : déclarée après, elle gagne l'égalité. */
.ti-widget .ti-review-item .ti-review-content {
  font-size: 18px !important;
  color: #444444 !important;
}
/* Étoiles des avis en #1a1a1a.
   Trustindex les affiche en background-image SVG (étoiles jaunes de Google) :
   color n'y peut rien. On reprend sa propre méthode « étoiles personnalisées » :
   un masque en forme d'étoile, rempli par la couleur de fond. La forme (s.svg
   du CDN Trustindex, avec un viewBox ajouté) est intégrée en data-URI pour ne
   dépendre ni de ce chemin ni du CORS de leur CDN.
   États : .f pleine, .e vide (gris clair), .h demi. */
.ti-widget .ti-review-item .ti-star {
  background-image: none !important;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 341 341'%3E%3Cpath d='m153.92313,12.88676c2.33201,-7.50597 9.03919,-12.58152 16.58811,-12.58152c7.54796,0 14.22835,5.07554 16.55941,12.58152l29.24201,94.05385c0.8647,2.75395 2.55106,5.16741 4.79507,6.88089c2.26314,1.71448 4.99308,2.64212 7.76701,2.64212l94.73643,-0.04593c7.54892,0 14.22835,5.07654 16.56037,12.58551c2.33106,7.48501 -0.22,15.68995 -6.32552,20.32514l-76.6418,58.10166c-2.2641,1.71448 -3.9495,4.12694 -4.8142,6.88589c-0.86948,2.77892 -0.84557,5.77052 0,8.52947l29.30514,94.02389c2.33201,7.50997 -0.22287,15.71492 -6.32839,20.34911c-6.10647,4.63519 -14.38809,4.63519 -20.49361,0l-76.59397,-58.14759c-2.2641,-1.71848 -4.97012,-2.64611 -7.76796,-2.64611c-2.79784,0 -5.50864,0.92764 -7.77179,2.64611l-76.61788,58.14759c-6.10647,4.63519 -14.36418,4.63519 -20.4697,0c-6.1256,-4.63419 -8.68049,-12.83914 -6.32552,-20.34911l29.28219,-94.02389c0.8647,-2.75895 0.8647,-5.75055 0,-8.52947c-0.84557,-2.75795 -2.53097,-5.1714 -4.79507,-6.88589l-76.63797,-58.10166c-6.10552,-4.63519 -8.68049,-12.84014 -6.3523,-20.32514c2.35497,-7.50897 9.03919,-12.58551 16.58715,-12.58551l94.70869,0.04593c2.79784,0 5.52777,-0.92764 7.77179,-2.64212c2.2641,-1.71348 3.9495,-4.12694 4.79412,-6.88089l29.23819,-94.05385z'/%3E%3C/svg%3E") center / contain no-repeat !important;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 341 341'%3E%3Cpath d='m153.92313,12.88676c2.33201,-7.50597 9.03919,-12.58152 16.58811,-12.58152c7.54796,0 14.22835,5.07554 16.55941,12.58152l29.24201,94.05385c0.8647,2.75395 2.55106,5.16741 4.79507,6.88089c2.26314,1.71448 4.99308,2.64212 7.76701,2.64212l94.73643,-0.04593c7.54892,0 14.22835,5.07654 16.56037,12.58551c2.33106,7.48501 -0.22,15.68995 -6.32552,20.32514l-76.6418,58.10166c-2.2641,1.71448 -3.9495,4.12694 -4.8142,6.88589c-0.86948,2.77892 -0.84557,5.77052 0,8.52947l29.30514,94.02389c2.33201,7.50997 -0.22287,15.71492 -6.32839,20.34911c-6.10647,4.63519 -14.38809,4.63519 -20.49361,0l-76.59397,-58.14759c-2.2641,-1.71848 -4.97012,-2.64611 -7.76796,-2.64611c-2.79784,0 -5.50864,0.92764 -7.77179,2.64611l-76.61788,58.14759c-6.10647,4.63519 -14.36418,4.63519 -20.4697,0c-6.1256,-4.63419 -8.68049,-12.83914 -6.32552,-20.34911l29.28219,-94.02389c0.8647,-2.75895 0.8647,-5.75055 0,-8.52947c-0.84557,-2.75795 -2.53097,-5.1714 -4.79507,-6.88589l-76.63797,-58.10166c-6.10552,-4.63519 -8.68049,-12.84014 -6.3523,-20.32514c2.35497,-7.50897 9.03919,-12.58551 16.58715,-12.58551l94.70869,0.04593c2.79784,0 5.52777,-0.92764 7.77179,-2.64212c2.2641,-1.71348 3.9495,-4.12694 4.79412,-6.88089l29.23819,-94.05385z'/%3E%3C/svg%3E") center / contain no-repeat !important;
}
.ti-widget .ti-review-item .ti-star.f {
  background-color: #1a1a1a !important;
}
.ti-widget .ti-review-item .ti-star.e {
  background-color: #cccccc !important;
}
.ti-widget .ti-review-item .ti-star.h {
  background: linear-gradient(90deg, #1a1a1a 50%, #cccccc 50%) !important;
}

/* === Header : transparent sur le hero, fond solide au scroll === */
:root {
  --sk-header-bg: #ffffff; /* couleur de fond une fois scrollé */
}

.elementor-location-header {
  position: fixed !important;
  top: 0 !important;
  left: 0;
  width: 100%;
  z-index: 9999 !important;
  background: transparent !important;
  box-shadow: none;
  transition: background-color 0.35s ease, box-shadow 0.35s ease;
}

/* État scrollé : la classe est ajoutée par assets/js/header.js */
.elementor-location-header.sk-header--scrolled {
  background: var(--sk-header-bg);
  box-shadow: 0 1px 0 rgba(0,0,0,0.08);
}

/* Elementor pose le fond blanc sur la SECTION interne du header
   (specificité élevée) : on le neutralise par défaut et on ne le
   réapplique qu'au scroll. !important nécessaire pour passer devant
   la règle générée par Elementor. */
.elementor-location-header .elementor-section {
  background-color: transparent !important;
  transition: background-color 0.35s ease;
}
.elementor-location-header.sk-header--scrolled .elementor-section {
  background-color: var(--sk-header-bg) !important;
}

/* Bandeau supérieur du header : fond noir, y compris à l'état scrollé
   (2e sélecteur nécessaire pour battre la règle .sk-header--scrolled ci-dessus). */
.elementor-location-header .top-header,
.elementor-location-header.sk-header--scrolled .top-header {
  background-color: black !important;
}
/* Le header entier est en position:fixed → ce bandeau serait collant lui aussi.
   On le replie dès qu'on scrolle : seul le menu reste en haut.
   Technique grid 1fr → 0fr : anime la VRAIE hauteur (transition linéaire),
   contrairement à max-height qui « attend » tant qu'il dépasse la hauteur réelle. */
.elementor-location-header .top-header {
  display: grid !important;
  grid-template-rows: 1fr;
  transition: grid-template-rows 0.35s ease, padding 0.35s ease;
}
.elementor-location-header .top-header > .elementor-container {
  overflow: hidden;
  min-height: 0;
}
.top-header .elementor-container.elementor-column-gap-default {
  width: 100%;
  padding: 0 10px;
}
.elementor-location-header.sk-header--scrolled .top-header {
  grid-template-rows: 0fr;
  padding-top: 0 !important;
  padding-bottom: 0 !important;
}
.elementor-location-header .top-header p {
	color: white;
	margin: 6px 10px;
}

.top_header_text {
	margin-right: 12px !important;
}

.top_header_text a {
	margin-left: 24px;
}

/* Trait de séparation du bandeau supérieur.
   Il doit faire exactement la largeur du menu, or celle-ci varie avec la
   font-size fluide des items : aucune valeur posée sur le paragraphe ne peut
   suivre, car en CSS un élément ne peut pas prendre la largeur d'un voisin.
   On déplace donc le trait sur le menu lui-même (border-top), où il est
   large par construction. width:fit-content réduit le <ul>, qui occupe sinon
   toute la colonne, à ses seuls items ; margin-left:auto le garde à droite.
   Valeurs reprises de l'ancienne bordure du paragraphe (1px solid #1a1a1a,
   8px au-dessus du trait, 14px en dessous). */
#top_menu .elementor-nav-menu--main > .elementor-nav-menu {
	width: fit-content;
	margin-left: auto;
	border-top: 1px solid #1a1a1a;
	padding-top: 14px;
}
/* L'ancienne bordure est encore dans le CSS généré par Elementor
   (local-673-frontend-desktop.css). Supprimable dès qu'Elementor l'aura
   régénérée sans la bordure. Le margin-bottom cède ses 14px au padding-top
   du menu ci-dessus, pour que le trait reste à 8px du texte. */
.top_header_text {
	border-bottom: 0 !important;
	margin-bottom: 0 !important;
}

.top_header_text_mobile {
	font-size: 12px;
	border-bottom: 1px solid;
	padding-bottom: 3px;
}

.top_header_text_mobile a {
	margin-left: 20px;
}

/* Bandeau mobile adresse + téléphone, au-dessus du header logo/menu.
   Fond blanc et trait réservés au téléphone : au-delà de 767px le logo passe
   à 180px et vient trop près du bandeau, on le laisse donc nu.
   !important et sélecteur d'ID nécessaires : la règle
   « .elementor-location-header .elementor-section { background-color:
   transparent !important } » plus haut, et sa variante au scroll (0,3,0),
   portent déjà !important. Un ID (1,0,0) les dépasse toutes les deux,
   donc le fond reste en place même une fois la page scrollée. */
@media (max-width: 767px) {
	#top-mobile-section {
		background-color: transparent !important;
		/* Le trait de séparation n'est PAS ici : porté par la section, il
		   filerait d'un bord à l'autre de l'écran, car un padding n'inset pas
		   une bordure — elle se dessine toujours au bord de la boîte. Il est
		   donc posé sur le conteneur interne, plus bas. */
		/* Elementor pose « margin-bottom: -40px » sur cette section dans son
		   onglet Tablette, donc aussi en mobile : la marge négative remonte le
		   header sticky de 40px PAR-DESSUS le bandeau et absorbe toute hauteur
		   qu'on lui ajoute. Il faut la remettre à zéro avant de régler le
		   padding, sinon le padding ne produit rien de visible.
		   Un ID (1,0,0) passe devant le sélecteur d'Elementor (0,3,0) : pas
		   besoin de !important. Corollaire : si tu changes ces marges dans
		   Elementor sans voir d'effet, c'est ici qu'il faut intervenir. */
		margin-bottom: 0;
		padding-top: 8px;
		padding-bottom: 8px;
		/* Grille à une rangée : permet de replier le bandeau au scroll (voir
		   plus bas). 1fr → 0fr anime la VRAIE hauteur, contrairement à
		   max-height qui « attend » tant qu'elle dépasse la hauteur réelle. */
		display: grid;
		grid-template-rows: 1fr;
		transition: grid-template-rows 0.35s ease, padding 0.35s ease;
	}

	/* Aucun réglage sticky n'est posé sur ce bandeau dans Elementor : s'il
	   reste à l'écran, c'est que « .elementor-location-header » est en
	   position:fixed !important plus haut dans ce fichier, ce qui fixe tout
	   son contenu. On ne peut pas en sortir un enfant sans sortir le header
	   du flux, donc on replie le bandeau dès que assets/js/header.js pose
	   .sk-header--scrolled (au-delà de 60px de défilement). Seule la section
	   logo/menu reste alors visible — elle a, elle, son propre sticky
	   Elementor. Même technique que l'ancien bandeau .top-header. */
	#top-mobile-section > .elementor-container {
		overflow: hidden;
		min-height: 0;
		/* Trait de séparation d'avec la section logo/menu, rentré de 3vw de
		   chaque côté — la même valeur que le padding horizontal de cette
		   section en dessous, pour que le trait s'aligne sur le logo à gauche
		   et sur le burger à droite. #1a1a1a est le noir employé partout
		   ailleurs sur le site. */
		margin-inline: 3vw;
		border-bottom: 1px solid #1a1a1a;
		padding-bottom: 8px;
		transition: border-bottom-width 0.35s ease, padding-bottom 0.35s ease;
	}
	.sk-header--scrolled #top-mobile-section {
		grid-template-rows: 0fr;
		padding-top: 0;
		padding-bottom: 0;
	}
	/* Sans ça le bandeau se replie mais laisse son trait : une bordure se
	   dessine hors de la boîte de contenu, une ligne de 1px resterait donc
	   collée en haut du header une fois scrollé. */
	.sk-header--scrolled #top-mobile-section > .elementor-container {
		border-bottom-width: 0;
		/* Le padding doit tomber lui aussi : la rangée de grille passe à 0,
		   mais en box-sizing: border-box une boîte ne descend pas sous la
		   hauteur de ses paddings — il resterait 8px de bandeau au repli. */
		padding-bottom: 0;
	}
}

/* Logo : largeur 180px comme le site source */
.elementor-location-header .elementor-widget-image img {
  width: 180px;
  max-width: 180px;
  height: auto;
}

/* Lien "contact" du menu (item avec la classe menu-contact) stylé en pilule,
   comme le bouton du site source. La classe est posée sur le <li> ; on cible
   le lien .elementor-item à l'intérieur. */
.elementor-nav-menu--main .menu-contact .elementor-item {
  font-size: 20px !important;
  color: #000000 !important;
  background-color: rgba(255, 255, 255, 0.5) !important;
  border: 1px solid #666666 !important;
  border-radius: 50px !important;
  padding: 5px 26px 1px !important;
  transition: color 0.4s ease, background-color 0.4s ease, border-color 0.4s ease !important;
  line-height: 0.5 !important;
  height: 44px;
  margin-top: 0;
  margin-left: 10px !important;
  margin-right: 10px !important;
}

/* Survol : pilule noire, texte blanc, bordure effacée */
.elementor-nav-menu--main .menu-contact .elementor-item:hover,
.elementor-nav-menu--main .menu-contact .elementor-item:focus,
.elementor-nav-menu--main .menu-contact .elementor-item.elementor-item-active {
  background-color: rgba(0, 0, 0, 0.9) !important;
  color: #ffffff !important;
  border-color: transparent !important;
}

/* Sélecteur de langue Polylang (« FR »).
   Spécificité 0,3,0 pour passer devant .elementor-nav-menu--main .elementor-item. */
.elementor-nav-menu--main .pll-parent-menu-item > .elementor-item {
  text-transform: uppercase !important;
  color: #808080 !important;
  font-size: 15px !important;
  display: flex;
  align-items: center;
}

/* Flèche AVANT le libellé (« ⌄ FR »), comme la source.
   SmartMenus place <span class="sub-arrow"> après le texte dans le DOM ; on le
   déplace visuellement avec order plutôt que de toucher au markup. Le texte
   « FR » est un nœud de texte nu, donc un élément flex anonyme d'order 0 : la
   flèche en order -1 passe devant.
   Elementor pose « padding:10px; padding-inline-end:0 » sur .sub-arrow, ce qui
   crée l'écart à GAUCHE de la flèche ; une fois retournée il faut cet écart à
   droite, d'où l'inversion des deux paddings logiques.
   Pas de !important : 0,4,0 passe devant .elementor-nav-menu .sub-arrow (0,2,0). */
.elementor-nav-menu--main .pll-parent-menu-item > .elementor-item .sub-arrow {
  order: -1;
  padding-inline-start: 0;
  padding-inline-end: 20px;
}

/* Chevron fin à la place du caret plein de FontAwesome.
   Le <svg class="e-fas-caret-down"> est posé par Elementor et n'est pas
   remplaçable en CSS : même méthode que le burger plus bas, on masque son path
   et on peint le nouveau tracé à la place.
   Différence assumée avec le burger : mask-image + currentColor plutôt que
   background-image avec une couleur en dur, pour que la flèche suive le
   `color` du libellé déclaré juste au-dessus — une seule source de vérité. */
.elementor-nav-menu--main .pll-parent-menu-item > .elementor-item .sub-arrow svg {
  width: 10px;
  height: 6px;
  background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9.283 4.898'%3E%3Cpath d='M4.641 4.898a.5.5 0 0 1-.343-.136L.158.864A.5.5 0 0 1 .842.136L4.64 3.712 8.44.136a.5.5 0 0 1 .686.729L4.984 4.762a.5.5 0 0 1-.343.136'/%3E%3C/svg%3E");
          mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9.283 4.898'%3E%3Cpath d='M4.641 4.898a.5.5 0 0 1-.343-.136L.158.864A.5.5 0 0 1 .842.136L4.64 3.712 8.44.136a.5.5 0 0 1 .686.729L4.984 4.762a.5.5 0 0 1-.343.136'/%3E%3C/svg%3E");
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  -webkit-mask-size: contain;
          mask-size: contain;
}
.elementor-nav-menu--main .pll-parent-menu-item > .elementor-item .sub-arrow svg path {
  display: none;
}

/* Panneau déroulant FR/EN — calé sur le composant LanguageSelector de la source.
   Variables relevées sur #comp-m8xa10628_r_comp-mcnbf90q :
     --boxShadow: none          -> aucune ombre portée
     --borderWidth: 0px         -> aucun contour
     --borderRadius: 0 0 0 0    -> aucun arrondi
     --backgroundColor: 255,255,255
     --separatorColor: 0,0,0    -> le filet noir sous la langue courante
     --itemBorder: 1px 0 0      -> filet de 1px, en HAUT des items
     --itemTextColor: color_18 (#808080), hover/actif color_11 (#000)
   La source pose le filet sur .SVOqp3:not(:first-child) ; ici la langue courante
   est masquée (.current-lang), donc un :not(:first-child) dépendrait de l'ordre
   Polylang et sauterait sur la version EN. Le filet est posé sur le panneau :
   avec deux langues le rendu est identique et ne dépend pas de l'ordre. */
/* Le panneau est positionné en absolu par SmartMenus : sans ancrage explicite
   il se cale sur le premier ancêtre positionné (la barre de nav), d'où le
   décalage. On ancre sur le <li> pour que left:0 et width:100% se rapportent
   au déclencheur lui-même.
   Le !important est nécessaire ici : SmartMenus écrit left/top en style inline,
   et seul un !important d'auteur passe devant un style inline. */
.elementor-nav-menu--main .pll-parent-menu-item {
  position: relative;
}
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu {
  background-color: transparent !important;
  border: none !important;
  border-top: 1px solid #000000 !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: 6px 0 !important;
  left: 0 !important;
  right: auto !important;
  width: 100% !important;      /* exactement la largeur du déclencheur « ⌄ FR » */
  min-width: 0 !important;     /* remplace l'ancien plancher de 64px */
  max-width: none !important;
}

/* Chevron retourné à l'ouverture, comme la source
   (.FDTMKK.drWYz5 .vDrjru svg { transform: rotate(180deg) }).
   Deux états couverts : aria-expanded, posé par SmartMenus, et .highlighted
   qu'il ajoute sur le <li> à l'ouverture au survol.
   La transition est un ajout — la source bascule sans animation. */
.elementor-nav-menu--main .pll-parent-menu-item > .elementor-item .sub-arrow svg {
  transition: transform 0.2s ease;
}
.elementor-nav-menu--main .pll-parent-menu-item > .elementor-item[aria-expanded="true"] .sub-arrow svg,
.elementor-nav-menu--main .pll-parent-menu-item.highlighted > .elementor-item .sub-arrow svg {
  transform: rotate(180deg);
}
/* On masque la langue courante : seules les langues non actives sont proposées */
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu .current-lang {
  display: none !important;
}
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu .elementor-sub-item {
  font-family: 'Adobe Caslon Pro', serif !important;
  font-weight: 600 !important;
  text-transform: uppercase !important;
  font-size: 15px !important;
  letter-spacing: 0.5px !important;
  color: #808080 !important;
  background-color: transparent !important;
  padding: 6px 0 !important;
  text-align: center !important;
  justify-content: center !important;   /* .elementor-sub-item est en flex */
  text-decoration: none !important;
  border: none !important;
  transition: color 0.25s ease !important;
}
/* Survol : texte noir, aucun fond. On couvre le <a>, le <li> et l'état actif,
   car Elementor pose parfois le fond sur le <li> du dropdown. */
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu a.elementor-sub-item:hover,
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu a.elementor-sub-item:focus,
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu a.elementor-sub-item.elementor-item-active {
  color: #1a1a1a !important;
  background: transparent !important;
}
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu li:hover,
.elementor-nav-menu--main .pll-parent-menu-item .sub-menu li:focus-within {
  background: transparent !important;
}

/* Décalage sous la barre d'admin WordPress (utilisateur connecté) */
body.admin-bar .elementor-location-header { top: 32px; }
@media (max-width: 782px) {
  body.admin-bar .elementor-location-header { top: 46px; }
}

/* Nav */
/* Libellés du menu en minuscules sur TOUTES les pages et modèles (comme le menu
   de la source). Avant, cette règle ne vivait que dans le CSS personnalisé de
   certaines pages Elementor (« Nav menu hover fix ») : absente de News, des
   Actualités et des articles, où le menu EN gardait ses majuscules.
   Le sélecteur de langue reste en majuscules : ses règles uppercase !important
   plus spécifiques passent devant. */
.elementor-nav-menu a {
  text-transform: lowercase;
}

.elementor-nav-menu--main .elementor-item {
  color: #1a1a1a !important;
  font-family: 'Adobe Caslon Pro', serif !important; /* menu en serif Caslon, comme le site source */
  font-size: clamp(16px, 1.58vw, 25px) !important;    /* fluide, plafonné à 25px à 1600px */
  font-weight: 600 !important;
  line-height: 1.4 !important;
  letter-spacing: normal !important;
}

/* Survol et item actif : #808080, relevé sur le composant Menu de la source —
   --item-hover-color et --item-selected-color valent tous deux
   rgba(var(--color_18),1), et color_18 = 128,128,128.
   L'item actif est ciblé en .elementor-item.elementor-item-active (0,3,0) et
   non .elementor-item-active seul (0,2,0) : le CSS additionnel du
   Personnalisateur contient « .elementor-nav-menu--main .elementor-item
   { color:#1a1a1a !important } », de spécificité identique et injecté APRÈS les
   feuilles du thème — il gagnait donc l'égalité par l'ordre de la cascade.
   Le survol, lui, était déjà à l'abri : :hover porte la spécificité à 0,2,1. */
.elementor-nav-menu--main .elementor-item:hover,
.elementor-nav-menu--main .elementor-item.elementor-item-active {
  color: #808080 !important;
}

/* Espacement horizontal des items du menu */
.elementor-nav-menu--main .elementor-nav-menu a {
  padding: 6px 17px !important;
}

/* Buttons font */
.elementor-button { font-family: 'Switzer', sans-serif !important; }
/* Libellé des boutons : taille fluide, alignée sur celle des textes. */
.elementor-button span {
  font-size: clamp(16px, 1vw, 24px);
}

/* Text widgets */
.elementor-widget-text-editor p {
  line-height: 1.4;
  font-family: 'Switzer', sans-serif;
  font-size: clamp(16px, 1vw, 24px);
}
.elementor-widget-text-editor strong {
  font-weight: 600;
}

/* Corps des articles (widget « Contenu de l'article »).
   Le kit Elementor le colore avec --e-global-color-text, qui vaut #7A7A7A —
   le gris par défaut d'Elementor, jamais choisi pour ce site. On repasse au
   #191919 des widgets Texte, qui est aussi le color_13 de la source.
   Spécificités 0,2,0 et 0,1,1, toutes deux au-dessus du 0,1,0 de la règle du
   kit : le rendu ne dépend donc pas de l'ordre de chargement des feuilles. */
.elementor-widget.elementor-widget-theme-post-content,
.elementor-widget-theme-post-content p,
.elementor-widget-theme-post-content li {
  color: #191919;
}

/* Theme defaults */
body > .site-header, body > .site-footer { display: none !important; }

/* Pourcentages "Quelques chiffres" — Switzer, grande taille.
   Couvre la classe posée sur un widget Texte OU sur un widget Titre. */
.pourcentage,
.pourcentage .elementor-heading-title {
  font-family: 'Switzer', sans-serif !important;
  font-size: max(42px, min(84px, max(0.5px, calc(0.0562513 * (var(--scaling-factor) - var(--scrollbar-width)))))) !important;
}

/* Texte sous les pourcentages (fluide) */
.pourcentage-texte p {
  font-size: max(18px, min(24px, max(0.5px, calc(0.015625 * (var(--scaling-factor) - var(--scrollbar-width))))));
}

/* Mobile : supprime la marge basse des pourcentages */
@media (max-width: 767px) {
  .pourcentage,
  .pourcentage .elementor-heading-title {
    margin-bottom: 0px !important;
  }
}

/* Mobile : les blocs d'animation prennent toute la largeur (plus carrés) */
@media (max-width: 767px) {
  #animation-conseiller .line-animation,
  #animation-securiser .circle-animation,
  #animation-simplifier .line-animation,
  #animation-valoriser .diagram-container {
    max-width: none !important;
    aspect-ratio: auto !important;
    height: 300px;
  }
}

/* Padding latéral des sections (comme la source : 3vw de chaque côté) */
.section-with-padding > .elementor-container {
  padding: 0 3vw;
}
/* Mobile : 3vw ne fait plus qu'une vingtaine de pixels sur un téléphone, le
   texte colle aux bords. On passe à 5vw. Seuil 767px, celui déjà utilisé dans
   ce fichier pour les ajustements téléphone (.parrallax, .last-actus__row). */
@media (max-width: 767px) {
  .section-with-padding > .elementor-container {
    padding: 0 5vw;
  }
}

/* Force la marge horizontale des conteneurs de section à 0 */
/*.elementor-section > .elementor-container {
  margin-inline: 0 !important;
}
*/
/* …sauf pour les sections marquées .section-centree : on garde le centrage. */
/*.elementor-section.section-centree > .elementor-container {
  margin-inline: auto !important;
}*/

/* === Accordéon des expertises (.accordeon-item) ===
   Le contenu est enveloppé en JS dans .accordeon-item__content.
   Un seul item ouvert à la fois, aucun ouvert au départ. */
.accordeon-item {
  position: relative;
  cursor: pointer;
}
.accordeon-item .elementor-widget-text-editor {
  margin-bottom: 10px;
}
/* Colonne des numéros de largeur identique sur toutes les lignes.
   Le conteneur Elementor donne aux deux widgets flex-grow:1 avec une base
   « auto » : chaque colonne part donc de la largeur de son contenu. Pour le bloc
   texte, c'est le paragraphe posé sur UNE seule ligne — même replié, puisque
   l'accordéon ne masque qu'en hauteur (grid-template-rows: 0fr). La ligne
   déborde, les deux colonnes rétrécissent au prorata de leur base, et la
   colonne du numéro s'écrase d'autant plus que le texte caché est long.
   Ici : le numéro garde sa largeur naturelle, le texte part d'une base nulle
   et prend l'espace restant — la largeur ne dépend plus du contenu.
   min-width:0 autorise le texte à passer sous la largeur de son contenu, ce
   qu'un élément flex refuse par défaut.
   !important : les propriétés flex des widgets sont posées par Elementor. */
.accordeon-item .list-number {
  flex: 0 0 auto !important;
}
.accordeon-item .numbered-list-text {
  flex: 1 1 0 !important;
  min-width: 0;
}
/* Espace entre numéro et texte = les 32px de marge droite du numéro, seuls.
   Le conteneur ajoutait par-dessus le column-gap du kit Elementor
   (--widgets-spacing-column: 20px, via .e-con>.e-con-inner { gap: … }), soit
   52px au total. Invisible tant que la colonne du numéro était écrasée — le
   texte débordait alors sa boîte et mangeait l'écart —, révélé par le correctif
   ci-dessus. Seul le column-gap est neutralisé : le row-gap reste disponible
   si les colonnes passent à la ligne sur mobile. */
.accordeon-item > .e-con-inner {
  column-gap: 0 !important;
}
/* Avant l'init JS : masque la description pour éviter un flash.
   (Après le wrap, le <p> n'est plus frère du titre → la règle ne matche plus.) */
.accordeon-item .small-h2-expertises ~ p {
  display: none;
}
/* Contenu repliable : animation de hauteur via grid 0fr → 1fr */
.accordeon-item__content {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.35s ease;
}
.accordeon-item.is-open .accordeon-item__content {
  grid-template-rows: 1fr;
}
.accordeon-item__content-inner {
  overflow: hidden;
  min-height: 0;
}
/* Icône « + » en haut à droite, pivote en « × » à l'ouverture */
.accordeon-item__icon {
  position: absolute;
  top: 6px;
  right: 0;
  width: 20px;
  height: 20px;
  color: #1a1a1a;
  transition: transform 0.3s ease;
}
/* Le chevron est tracé en stroke (pas en aplat) : pas de fill. */
.accordeon-item__icon svg {
  display: block;
  width: 100%;
  height: 100%;
  fill: none;
}
/* Ouvert : le « v » se retourne en « ^ ». */
.accordeon-item.is-open .accordeon-item__icon {
  transform: rotate(180deg);
}

/* Bouton "Découvrir le cabinet" : rendu en lien souligné (bordure basse seule) */
.decouvrir-cabinet-button .elementor-button {
  border-width: 0 0 1px 0 !important;
  border-radius: 0 !important;
  padding-left: 0;
  padding-right: 0;
  padding-bottom: 5px;
  margin-left: 15px;
}

/* Colonne "sticky" : reste collée pendant que la colonne voisine défile.
   - align-self:flex-start = INDISPENSABLE (sinon la colonne s'étire à la hauteur
     de sa voisine et il n'y a plus rien à faire défiler → sticky inopérant).
   - top = décalage sous le header fixe (ajuste selon sa hauteur réelle).
   Attention : aucun ancêtre ne doit avoir overflow:hidden, sinon ça casse. */
.sticky-column {
  position: sticky;
  top: 220px;
  align-self: flex-start;
}
/* Mobile : une seule colonne → on désactive le sticky (sinon inutile / buggé). */
@media (max-width: 767px) {
  .sticky-column {
    position: static !important;
    top: auto !important;
  }
}

/* Menu ".menu-header-mobile" : affiché en horizontal nativement via le réglage
   Elementor "Breakpoint = Aucun" (plus besoin de forcer display/toggle/dropdown). */

/* Sélecteur de langue : plus aucune règle propre au mobile. Le menu 816
   (.menu-header-mobile) doit utiliser le mode « Afficher comme menu déroulant »
   de Polylang, comme le menu principal — il produit alors le même markup
   (.pll-parent-menu-item + .sub-menu), et le widget étant rendu en
   .elementor-nav-menu--main (breakpoint Elementor « Aucun »), les règles
   desktop plus haut s'appliquent telles quelles.
   Les deux règles retirées ici visaient le sélecteur PLAT (.lang-item posés
   côte à côte) : masquage de .current-lang et mise en forme des liens. */

/* Seule exception : le déclencheur « FR » est un peu plus resserré ici que dans
   le menu principal (6px 17px). Spécificité 0,3,0, suffisante pour passer devant
   .elementor-nav-menu--main .elementor-nav-menu a (0,2,1).
   Le padding des items du panneau n'est PAS touché : il est à 6px 0 pour que
   « EN » reste centré sous le déclencheur. */
.menu-header-mobile .pll-parent-menu-item > .elementor-item {
  padding: 6px 13px !important;
}

/* Pilule "Contact" version mobile : compacte, fond blanc, bordure noire.
   Spécificité 0,4,0 (avec .elementor-nav-menu--main) pour battre la règle
   desktop .elementor-nav-menu--main .menu-contact .elementor-item (0,3,0). */
.menu-header-mobile .elementor-nav-menu--main .menu-contact .elementor-item {
  font-size: 14px !important;
  height: 35px !important;
  padding: 5px 20px 1px !important;
  color: #000000 !important;
  background-color: #ffffff !important;
  border: 1px solid #000000 !important;
  margin-left: 5px !important;
}

/* Header mobile : les deux menus du conteneur (#c1bf2cf) restent sur une ligne.
   (Direction "Ligne" réglée dans Elementor ; ici on empêche le retour à la ligne
   et on met les widgets en largeur auto.) */
.elementor-element-c1bf2cf > .e-con-inner {
  flex-direction: row !important;
  flex-wrap: nowrap !important;
  align-items: center !important;
  justify-content: flex-end !important;
}
.elementor-element-c1bf2cf > .e-con-inner > .elementor-widget {
  width: auto !important;
  flex: 0 0 auto !important;
}

/* Header mobile : logo (gauche) + menus (droite) côte à côte.
   Les colonnes legacy passent en width:100% sur mobile → chevauchement.
   On cible le conteneur de colonnes via :has() (sans ID, robuste) et on
   redimensionne les colonnes au contenu. */
.elementor-container:has(> .header-mobile-right-column) {
  flex-direction: row !important;
  align-items: center !important;
}
.header-mobile-right-column {
  flex: 1 1 auto !important;
}

/* (Mise en page du header mobile gérée nativement par un Conteneur Flexbox
   Elementor — plus de CSS de forçage nécessaire.) */

/* Texte d'introduction (chapô) : gris clair, taille fluide (20px à 1920px). */
.intro-text p {
  color: #7A7A7A;
  font-size: clamp(16px, 1vw, 24px);
  line-height: 1.4;
  margin-top: 2px;
}

.intro-text-big p {
  color: #7A7A7A;
  font-size: clamp(20px, 1vw, 24px);
  line-height: 1.4;
  margin-top: 2px;
}

.numbered-list-text p {
  color: #7A7A7A;
  font-size: clamp(16px, 1vw, 24px);
  line-height: 1.4;
  margin-top: 2px;
}

/* Texte "Ce qui nous distingue" (descriptions sous Conseiller/Sécuriser/…)
   Relevé source (#comp-m8xa104v26 & co) :
     color:#B3B3B3; line-height:1.3;
     font-size:max(14px, min(18px, max(0.5px, 0.0125 * (--scaling-factor - --scrollbar-width))))
   Le plancher est bien 14px dans la source (on avait porté 16px par erreur ;
   l'écart ne se voyait qu'entre ~1120px et ~1280px de large).
   NB : dans la source c'est une surcharge par composant qui passe DEVANT la
   classe de texte .font_8. Chez nous .font_8 est en !important : les deux
   classes sur le même élément ne peuvent pas cohabiter, voir le bloc font_X. */
.ce-qui-nous-distingue-texte p {
  color: #B3B3B3;
  font-size: max(14px, min(18px, max(0.5px, calc(0.0125 * (var(--scaling-factor) - var(--scrollbar-width))))));
  line-height: 1.3;
}

/* Rattrapage de la gouttière Elementor sur les colonnes « Ce qui nous
   distingue » : le conteneur porte un padding par défaut qu'on annule à gauche
   pour aligner la 1re colonne sur le bord du texte au-dessus.
   Desktop et tablette seulement — sous 768px les colonnes s'empilent et ce
   décalage négatif ferait dépasser le bloc hors de l'écran. */


/* === Filtre par catégorie — shortcode [categorie-filter] === */
.categorie-filter {
  display: flex;
  flex-direction: column;
  border-top: 1px solid rgb(102, 102, 102);   /* une seule ligne au-dessus du groupe */
  padding-top: max(0.5px, 0.0234375 * (var(--scaling-factor) - var(--scrollbar-width)));
  padding-bottom: max(0.5px, 0.0234375 * (var(--scaling-factor) - var(--scrollbar-width)));
  width: 50%;
}
/* .categorie-filter préfixé = spécificité 0,2,0 pour battre a:not(.elementor-button) (0,1,1) */
.categorie-filter .categorie-filter__btn {
  font-family: 'Switzer', sans-serif;
  /* Taille fluide relevée sur la source (bouton de catégorie) :
     --font: … max(0.5px, 0.0140625 * (scaling-factor - scrollbar-width)) …
     0.0140625 x 1280 = 18, soit une base de 18 spx SANS plancher ni plafond.
     Nos 22,5px fixes n'en étaient que la valeur à pleine largeur (x 1600). */
  font-size: max(0.5px, calc(0.0140625 * (var(--scaling-factor) - var(--scrollbar-width))));
  line-height: 1.3;
  /* !important requis : le CSS additionnel du Personnalisateur contient
     « .elementor-widget-text-editor a { color:#1a1a1a !important } » (0,1,1),
     et le shortcode est rendu dans un widget Texte. Une déclaration !important
     bat une déclaration normale quelle que soit la spécificité — notre 0,2,0
     ne suffisait pas. À retirer le jour où ce bloc hérité sera nettoyé. */
  color: #808080 !important;       /* inactif : gris, = color_18 de la source */
  text-decoration: none;
  transition: color 0.3s ease;
  /* Marge relevée sur la source : 0.0078125 x 1280 = 10, base de 10 spx.
     Le premier item a la sienne, plus large (voir juste en dessous). */
  margin-bottom: max(0.5px, calc(0.0078125 * (var(--scaling-factor) - var(--scrollbar-width))));
}
/* Le premier item (« Tous les articles ») est détaché du reste de la liste.
   Marge relevée sur la source : 0.015625 x 1280 = 20, soit une base de 20 spx.
   Spécificité 0,2,1, au-dessus des 0,2,0 de la règle de base qui pose 7px.
   Attention : cette marge s'AJOUTE au `gap: 10px` du conteneur flex. */
/* Mobile : la source remplace l'échelle desktop par une base propre, dans
   @media screen and (min-width: 320px) and (max-width: 750px).
     desktop  18 spx / 1280  ->  0.0140625 * scaling-factor
     mobile   16 spx /  390  ->  0.0410256 * scaling-factor
   Sans elle, la formule desktop s'effondre sur mobile : 5,4px à 382px de large,
   illisible. Seuil à 750px, celui de la source. */
@media (max-width: 750px) {
  .categorie-filter .categorie-filter__btn {
    font-size: max(0.5px, calc(0.0410256 * (var(--scaling-factor) - var(--scrollbar-width))));
  }
}
.categorie-filter .categorie-filter__btn:first-child {
  margin-bottom: max(0.5px, calc(0.015625 * (var(--scaling-factor) - var(--scrollbar-width))));
}
/* Survol : noir + souligné, valeurs relevées sur la source.
   (Un premier relevé donnait #797979 : c'était le fondu de 0,4s saisi en cours
   d'animation, pas sa destination. La cible est bien #000000.)
   Le soulignement vient de --hover-text-decoration: underline côté source ;
   pas de passage en gras, qui modifierait la largeur du texte et ferait sauter
   les items voisins. Le souligné annule le text-decoration:none de la règle de
   base — 0,2,1 contre 0,2,0, la spécificité suffit pour lui.
   Le !important ne sert qu'à la couleur, contre le CSS du Personnalisateur. */
.categorie-filter .categorie-filter__btn:hover {
  color: #000000 !important;
  text-decoration: underline;
}
/* Actif (« Tous les articles » au chargement) : noir + gras.
   Pas de !important : .is-active porte la spécificité à 0,3,0, au-dessus de la
   règle de base (0,2,0). */
.categorie-filter .categorie-filter__btn.is-active {
  color: #1a1a1a !important;
  font-weight: 700;
}

/* === Bouton "Copier le lien" ajouté aux boutons de partage (JS) === */
.elementor-share-btn__icon {
  width: 40px;
}
/* Premier bouton (WhatsApp) recalé à gauche : compense le retrait interne de
   l'icône pour que la rangée s'aligne sur le bord du texte au-dessus. */
.share-buttons .elementor-grid-item:first-child {
  margin-left: -6px;
}
.share-buttons .elementor-share-btn_copy {
  cursor: pointer;
}
/* L'item sert de contexte de positionnement à l'info-bulle (pas le bouton,
   pour ne pas déclipper son fond circulaire → sinon un halo gris apparaît). */
.share-buttons .elementor-grid-item {
  position: relative;
}
/* Info-bulle "Lien copié" */
.share-buttons .sk-copy-tooltip {
  position: absolute;
  bottom: calc(100% + 10px);
  left: 50%;
  transform: translateX(-50%) translateY(4px);
  background: #1a1a1a;
  color: #ffffff;
  font-family: 'Switzer', sans-serif;
  font-size: 13px;
  line-height: 1;
  white-space: nowrap;
  padding: 8px 12px;
  border-radius: 6px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.2s ease, transform 0.2s ease;
  z-index: 5;
}
.share-buttons .sk-copy-tooltip::after {
  content: "";
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  border: 5px solid transparent;
  border-top-color: #1a1a1a;
}
.share-buttons .elementor-grid-item.is-copied .sk-copy-tooltip {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}
/* Seuls la grille et l'item passent en overflow visible (pour laisser sortir
   l'info-bulle). PAS le bouton : il garde son clip circulaire. */
.share-buttons .elementor-grid,
.share-buttons .elementor-grid-item {
  overflow: visible !important;
}

/* === Dernières actualités (accueil) — shortcode [last-actus] ===
   Séparateur, puis titre (gauche) / extrait (droite). */
.last-actus__divider {
  border: none;
  border-top: 1px solid #191919;
  margin: 12.5px 0 !important;
}
.last-actus__item {
  padding-bottom: 0;
}
.last-actus__row {
  display: flex;
  gap: 40px;
  align-items: flex-start;
}
.last-actus__title,
.last-actus__excerpt {
  flex: 1 1 0;
  margin: 0;
}
.last-actus__title {
  font-family: 'Switzer', sans-serif !important;
  font-size: 20px !important;
  font-weight: 500 !important;
  line-height: 1.4 !important;
}
/* Préfixé par .last-actus (0,2,1) et en !important : le CSS additionnel du
   Personnalisateur pose « .elementor-widget-text-editor a { color:#1a1a1a
   !important } » (0,1,1), injecté APRÈS les feuilles du thème. Sans les deux,
   notre couleur perd — elle passait ici par coïncidence, les valeurs étant
   identiques. */
.last-actus .last-actus__title a {
  color: #1a1a1a !important;
  text-decoration: none;
  transition: color 0.25s ease;
  font-size: 22px;
  font-weight: 600;
}
.last-actus__excerpt {
  font-family: 'Switzer', sans-serif;
  font-size: 18px;
  line-height: 1.4;
  color: #4d4d4d;
  transition: color 0.25s ease;
}
/* L'extrait est lui aussi un lien vers l'article. display:block pour que toute
   la colonne de droite soit cliquable, pas seulement les lignes de texte.
   color:inherit annule la règle globale a:not(.elementor-button), qui vise le
   <a> directement et l'emporterait sinon sur la couleur héritée du <p>.
   Préfixe + !important pour la même raison que le titre ci-dessus. */
.last-actus .last-actus__excerpt a {
  display: block;
  color: rgb(77, 77, 77) !important;
  text-decoration: none;
}
/* Survol de l'item entier (titre + extrait), pas seulement du lien.
   Le !important passe devant la règle globale a:not(.elementor-button):hover. */
.last-actus__item:hover .last-actus__title a,
.last-actus__item:hover .last-actus__excerpt,
.last-actus__item:hover .last-actus__excerpt a {
  color: #7A7A7A !important;
}
@media (max-width: 767px) {
  .last-actus__row {
    flex-direction: column;
    gap: 12px;
  }
}

/* === Liste d'actualités — shortcode [liste-actualites] === */
.liste-actualites {
  display: flex;
  flex-direction: column;
}
.liste-actualites__item {
  border-top: 1px solid rgb(102, 102, 102);
}
.liste-actualites__link {
  display: block;
  padding: 24px 0 28px;
  text-decoration: none;
  color: #1a1a1a;
}
/* Surtitre en gras majuscule (le plus visible, comme la source) */
.liste-actualites__kicker {
  display: block;
  font-family: 'Switzer', sans-serif;
  text-transform: uppercase;
  font-size: 16px;
  font-weight: 700;
  letter-spacing: 0.3px;
  color: #1a1a1a;
  margin-bottom: 8px;
}
/* Titre et description, calés sur /actualités de la source, où l'item est fait
   de deux composants distincts avec deux échelles :
     titre       <h6 class="font_6">  22 spx, min 18 / max 22, interligne 1.2em
     description <p  class="font_8">  18 spx, min 16 / max 20, interligne 1.4em
   Nos deux champs ACF reproduisent maintenant cette structure à l'identique.
   La source charge la fonte « switzer_bold » à font-weight:400 pour le titre ;
   chez nous la même graisse s'obtient avec le fichier Switzer 700.
   !important sur le titre pour passer devant le barème h3 global. */
.liste-actualites__title {
  font-family: 'Switzer', sans-serif !important;
  font-size: max(18px, min(22px, calc(22 * var(--theme-spx-ratio)))) !important;
  font-weight: 700 !important;
  line-height: 1.2em !important;
  color: #1a1a1a;
  margin: 0;
}
/* Description sous le titre. En #1a1a1a et non en gris : la source surcharge
   ici le color_14 de font_8 par du noir (color:#000000 sur le composant).
   Sélecteur préfixé par .liste-actualites (0,2,0) et non la classe seule
   (0,1,0) : le shortcode est rendu dans un widget Texte, donc ce <p> est aussi
   attrapé par .elementor-widget-text-editor p (0,1,1), qui imposait sinon son
   clamp(16px, 1vw, 24px) — soit 18,53px là où la source affiche 20px. */
.liste-actualites .liste-actualites__excerpt {
  font-family: 'Switzer', sans-serif;
  font-size: max(16px, min(20px, calc(18 * var(--theme-spx-ratio))));
  font-weight: 400;
  line-height: 1.4em;
  color: #1a1a1a;
  margin: 5px 0 0;
}
/* Survol : les deux passent au gris, comme la source. */
.liste-actualites__link:hover .liste-actualites__title,
.liste-actualites .liste-actualites__link:hover .liste-actualites__excerpt {
  color: #808080;
}

/* Texte du footer (paragraphes + liens) */
.footer_text p,
.footer_text p a {
  font-size: 14px;
  line-height: 1.2;
  color: #4d4d4d;
}

/* Liens du footer en blanc */
footer a {
  color: white !important;
}

.footer_bouton .elementor-button {
  padding-left: 15px;
  padding-right: 15px;
  font-size: 14px;
}

.footer_bouton .elementor-button-text {
  font-size: 14px;
}

/* === Formulaire de contact (CF7 #contact-form) — style source === */
/* Panneau gris autour du formulaire (comme la source : rgb(246,246,246)). */
#contact-form {
  background: #f6f6f6;
  padding: 24px;
}
/* Le <br> après chaque label crée un saut inutile : on le masque. */
#contact-form .wpcf7-form br {
  display: none;
}
#contact-form .wpcf7-form p {
  margin: 0 0 16px;
}
#contact-form .form-label {
  display: block;
  font-family: 'Switzer', sans-serif;
  font-size: 15px;
  color: #808080;
  margin-bottom: 7px;
}
#contact-form .form-required {
  color: #808080;            /* astérisque discret (ajuste la couleur si besoin) */
  margin-left: 2px;
}
#contact-form .wpcf7-form-control-wrap {
  display: block;
}
#contact-form input[type="text"],
#contact-form input[type="email"],
#contact-form input[type="tel"],
#contact-form textarea {
  width: 100%;
  box-sizing: border-box;
  font-family: 'Switzer', sans-serif;
  font-size: 16px;
  line-height: 24px;
  color: #1a1a1a;
  background: #ffffff;
  border: 1px solid #e6e6e6;
  border-radius: 3px;
  outline: none;
  transition: border-color 0.25s ease;
  /* Placeholder trop long pour le champ (mobile) : « … » plutôt qu'une coupe
     nette. Posé sur l'input et non sur ::placeholder — c'est l'élément qui
     porte le débordement, et le pseudo-élément ne le gère pas de façon fiable
     selon les navigateurs. S'applique aussi à la valeur saisie hors focus ;
     au focus le navigateur reprend la main et fait défiler le texte. */
  text-overflow: ellipsis;
}
/* Inputs : hauteur 24px + padding 8px vertical (0 horizontal).
   content-box pour que height=24px soit la zone de texte (comme la source). */
#contact-form input[type="text"]:not(.wpcf7-phonetext),
#contact-form input[type="email"],
#contact-form input[type="tel"] {
	height: 40px;
	padding: 12px;
	margin-bottom: 12px;
}
/* Champ téléphone : mêmes hauteur et retraits, SAUF à gauche.
   Ce retrait-là dépend de la longueur de l'indicatif (+33 vs +213) et c'est le
   plugin qui le calcule, via la classe iti-sdc-N qu'il maintient sur le
   conteneur. Un raccourci `padding` de notre côté le réinitialiserait à 12px :
   notre sélecteur porte un ID (1,0,1) et bat les (0,4,1) du plugin, un ID
   l'emportant sur n'importe quel nombre de classes. D'où les quatre côtés
   déclarés séparément, en laissant le gauche à qui de droit. */
#contact-form .intl-tel-input input.wpcf7-phonetext {
	height: 40px;
	padding-top: 12px;
	padding-right: 12px;
	padding-bottom: 12px;
	margin-bottom: 12px;
}
.intl-tel-input {
	margin-bottom: 30px;
}
/* Sélecteur de pays resserré à 40px — UNIQUEMENT dans l'état « globe ».
   .flag-container, positionné en absolu, n'a pas de largeur propre : il est
   dimensionné par son contenu, d'où la contrainte sur les deux éléments.
   .iti-flag est lui aussi en position:absolute sans `left` : il part de sa
   position statique, donc APRÈS le padding — un width:100% le faisait déborder
   d'autant à droite et recouvrir la flèche. D'où une largeur fixe pour le
   globe (voir plus bas) et la flèche ramenée à right:4px.
   Répartition des 40px : 12 (retrait) + 16 (globe) + 2 + 6 (flèche) + 4.

   Tout est scopé en :not(.sk-country-chosen). Dès qu'un pays est choisi, le
   sélecteur doit loger drapeau + indicatif, dont la largeur dépend de la
   longueur de l'indicatif (+33 vs +213). Le plugin gère déjà ce cas : il
   maintient une classe iti-sdc-N sur le conteneur et fournit les largeurs qui
   vont avec (sdc-3 : 78/84px, sdc-4 : 86/92px…). On lui rend donc la main —
   un padding-left fixe de notre côté superposait le numéro à l'indicatif. */
#contact-form .intl-tel-input:not(.sk-country-chosen) .flag-container,
#contact-form .intl-tel-input:not(.sk-country-chosen).separate-dial-code .selected-flag {
  width: 40px;
}
#contact-form .intl-tel-input:not(.sk-country-chosen).separate-dial-code .selected-flag {
  padding-left: 12px;   /* remplace les 8px du plugin */
}
#contact-form .intl-tel-input:not(.sk-country-chosen) input {
  padding-left: 52px !important;   /* 40 de sélecteur + 12 d'écart */
}

    .intl-tel-input.separate-dial-code .selected-dial-code {
      font-size: 16px;
    }
#contact-form input:focus,
#contact-form textarea:focus {
  border-color: #1a1a1a;
}
#contact-form textarea {
  padding: 12px;
  min-height: 130px;
  resize: vertical;
}
#contact-form ::placeholder {
  color: #999999;
  opacity: 1;
}
/* Bouton « Envoyer » : pilule outline, alignée à droite */
#contact-form .wpcf7-submit {
	display: block;
	width: 300px;
  max-width: 100%;
	margin: 8px 0 0 auto;
	font-family: 'Switzer', sans-serif;
	font-size: 16px;
	color: #1a1a1a;
	background: white;
	border: 1px solid #1a1a1a;
	border-radius: 50px;
	padding: 9px 46px;
	cursor: pointer;
	transition: background 0.3s ease, color 0.3s ease;
}
#contact-form .wpcf7-submit:hover {
  background: #1a1a1a;
  color: #ffffff;
}

/* Sélecteur de pays du téléphone (intl-tel-input) :
   on remplace le drapeau par l'icône « globe » du site source, mais UNIQUEMENT
   tant qu'aucun pays n'a été choisi (la classe .sk-country-chosen est ajoutée
   en JS au 1er choix → le vrai drapeau réapparaît alors). */
#contact-form .intl-tel-input:not(.sk-country-chosen) .selected-flag .iti-flag {
  width: 16px;
  height: 16px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%231a1a1a' width='24' height='24'%3E%3Cpath fill-rule='evenodd' d='M11.5,19 C11.331,19 11.166,18.985 11,18.975 L11,16.5 C11,16.224 10.776,16 10.5,16 L9.5,16 C9.224,16 9,15.775 9,15.5 L9,12.5 C9,12.366 8.947,12.238 8.852,12.145 L4.804,8.14 C6.04,5.688 8.573,4 11.5,4 C12.76,4 13.946,4.315 14.989,4.866 L15,6.497 C15.001,6.631 14.949,6.757 14.855,6.853 C14.76,6.947 14.634,7 14.5,7 L12.339,7 C12.207,7 12.08,7.053 11.986,7.146 L10.146,8.983 C10.053,9.077 10,9.204 10,9.337 L10,10.5 C10,11.325 10.672,11.999 11.499,12 L15.293,12 L17,13.707 L17,16.582 C15.629,18.064 13.674,19 11.5,19 M4,11.5 C4,10.673 4.14,9.879 4.388,9.135 L8,12.709 L8,15.5 C8,16.327 8.673,17 9.5,17 L10,17 L10,18.849 C6.581,18.152 4,15.122 4,11.5 M19,11.5 C19,12.856 18.632,14.127 18,15.226 L18,13.5 C18,13.367 17.947,13.24 17.854,13.146 L15.854,11.146 C15.76,11.053 15.633,11 15.5,11 L11.5,11 C11.224,11 11,10.775 11,10.5 L11,9.544 L12.546,8 L14.5,8 C14.902,8 15.281,7.843 15.564,7.557 C15.848,7.271 16.003,6.892 16,6.49 L15.993,5.51 C17.814,6.879 19,9.051 19,11.5 M11.5,3 C6.813,3 3,6.813 3,11.5 C3,16.187 6.813,20 11.5,20 C16.187,20 20,16.187 20,11.5 C20,6.813 16.187,3 11.5,3'%3E%3C/path%3E%3C/svg%3E") !important;
  background-size: contain;
  background-repeat: no-repeat;
  background-position: center;
  box-shadow: none !important;
  background-color: transparent;
}
/* Flèche resserrée contre le bord droit : dans 40px il ne reste que 28px après
   le retrait de 12px, à partager entre le globe (16px) et la flèche (6px).
   Scopé lui aussi : une fois le pays choisi, le plugin retrouve sa place. */
#contact-form .intl-tel-input:not(.sk-country-chosen) .iti-arrow {
  right: 4px;
}
/* Masque l'indicatif (+33) tant qu'aucun pays n'est choisi (icône seule).
   Après un choix (.sk-country-chosen), l'indicatif réapparaît. */
#contact-form .intl-tel-input:not(.sk-country-chosen) .selected-dial-code {
  display: none !important;
}
#contact-form .intl-tel-input.separate-dial-code .selected-flag {
  background-color: transparent;
  display: table;
}

/* === Menu mobile déployé : overlay plein écran centré (comme la source) ===
   Scopé au <nav> dropdown OUVERT (aria-hidden="false"). Le sous-menu FR/EN est
   un <ul> (pas <nav>), donc non affecté. Breakpoint = celui du burger (≤1024px). */
@media (max-width: 1024px) {
  /* Défilement de la page verrouillé tant que le menu est ouvert, comme la
     source (qui pose une classe .fullScreenMode sur le body en JS).
     Ici :has() lit directement l'attribut aria-hidden que SmartMenus bascule à
     l'ouverture — aucun JS ni classe à maintenir, et le verrou se relâche seul
     à la fermeture. html ET body : selon les navigateurs, l'un ou l'autre porte
     le défilement. */
  html:has(nav.elementor-nav-menu--dropdown[aria-hidden="false"]),
  body:has(nav.elementor-nav-menu--dropdown[aria-hidden="false"]) {
    overflow: hidden;
  }

  nav.elementor-nav-menu--dropdown[aria-hidden="false"] {
    position: fixed !important;
    top: 0 !important;
    left: 0 !important;
    width: 100vw !important;
    height: 100vh !important;       /* fallback vieux navigateurs */
    height: 100dvh !important;      /* hauteur réellement visible (barre d'adresse) */
    max-height: 100vh !important;
    max-height: 100dvh !important;
    background: #ffffff !important;
    border: none !important;
    box-shadow: none !important;
    z-index: 9998 !important;
    overflow-y: auto !important;
  }
  /* Liste centrée verticalement */
  nav.elementor-nav-menu--dropdown[aria-hidden="false"] > .elementor-nav-menu {
    position: relative;
    display: flex !important;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    min-height: 100%;
    padding: 120px 24px 48px;
    box-sizing: border-box;
  }
  /* Items principaux : Caslon, centrés, largeur fixe (pour les séparateurs) */
  nav.elementor-nav-menu--dropdown > .elementor-nav-menu > li {
    width: 220px;
    text-align: center;
  }
  nav.elementor-nav-menu--dropdown > .elementor-nav-menu > li > .elementor-item {
    font-family: 'Adobe Caslon Pro', serif !important;
    font-size: 20px !important;
    font-weight: 600 !important;
    color: #1a1a1a !important;
    justify-content: center !important;
    padding: 22px 0 !important;
  }
  /* Elementor pose un fond gris (#3f444b) sur les items du menu déroulant au
     survol, au focus et à l'état actif — un défaut de son thème sombre, hors
     sujet sur notre menu plein écran blanc. On neutralise le fond seul : le
     texte était déjà à l'abri, la règle ci-dessus imposant #1a1a1a en
     !important, qui bat le color:#fff d'Elementor (sans !important).
     Le `nav` en tête porte la spécificité à 0,3,1, juste au-dessus des 0,3,0
     d'Elementor — pas besoin de !important. */
  nav.elementor-nav-menu--dropdown .elementor-item.elementor-item-active,
  nav.elementor-nav-menu--dropdown .elementor-item.highlighted,
  nav.elementor-nav-menu--dropdown .elementor-item:focus,
  nav.elementor-nav-menu--dropdown .elementor-item:hover,
  nav.elementor-nav-menu--dropdown .elementor-sub-item.elementor-item-active,
  nav.elementor-nav-menu--dropdown .elementor-sub-item.highlighted,
  nav.elementor-nav-menu--dropdown .elementor-sub-item:focus,
  nav.elementor-nav-menu--dropdown .elementor-sub-item:hover {
    background-color: transparent;
  }
  /* Séparateurs entre les items (ligne au-dessus, sauf le 1er ; on exclut
     le bouton contact et le sélecteur de langue) */
  nav.elementor-nav-menu--dropdown > .elementor-nav-menu > li:not(:first-child):not(.menu-contact):not(.pll-parent-menu-item) {
    border-top: 1px solid #dcdcdc;
  }
  /* Bouton « contact » en pilule, ancré en bas de l'écran */
  nav.elementor-nav-menu--dropdown > .elementor-nav-menu > li.menu-contact {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 40px;
    width: auto;
    border-top: none;
  }
  nav.elementor-nav-menu--dropdown li.menu-contact > a.elementor-item {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    white-space: nowrap !important;
    width: auto !important;
    height: auto !important;
    min-height: 0 !important;
    font-family: 'Switzer', sans-serif !important;
    font-size: 16px !important;
    line-height: 1 !important;
    color: #1a1a1a !important;
    background: transparent !important;
    border: 1px solid #1a1a1a !important;
    border-radius: 40px !important;
    padding: 14px 40px !important;
    margin: 0 !important;
  }
  /* Sélecteur de langue masqué sur mobile (absent du visuel source) */
  nav.elementor-nav-menu--dropdown > .elementor-nav-menu > li.pll-parent-menu-item {
    display: none;
  }
  /* La croix de fermeture (toggle) doit rester AU-DESSUS de l'overlay (9998),
     sinon elle est recouverte et invisible/incliquable. */
  .elementor-menu-toggle {
    position: relative;
    z-index: 10000 !important;
    background-color: transparent;
    padding-top: 15px;
  }
  /* Burger / croix : 30px, traits fins.
     Les glyphes Elementor sont "pleins" (barres épaisses) → on masque le path
     et on affiche un SVG à traits fins en background sur chaque icône.
     La couleur des traits est encodée dans les data-URI (stroke='%23b3b3b3') :
     un background-image ne suit pas currentColor, il faut la changer aux DEUX
     endroits, icône ouverte et icône fermée. */
  .elementor-menu-toggle svg {
    width: 30px !important;
    height: 30px !important;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
  }
  .elementor-menu-toggle svg path {
    display: none;
  }
  .elementor-menu-toggle__icon--open {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23b3b3b3' stroke-width='1'%3E%3Cline x1='3' y1='7' x2='21' y2='7'/%3E%3Cline x1='3' y1='12' x2='21' y2='12'/%3E%3Cline x1='3' y1='17' x2='21' y2='17'/%3E%3C/svg%3E");
  }
  .elementor-menu-toggle__icon--close {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23b3b3b3' stroke-width='1'%3E%3Cline x1='5' y1='5' x2='19' y2='19'/%3E%3Cline x1='19' y1='5' x2='5' y2='19'/%3E%3C/svg%3E");
  }
  /* Idem pour le logo : visible au-dessus de l'overlay. */
  .elementor-location-header .elementor-widget-image {
    position: relative;
    z-index: 10000 !important;
  }
}

/* Bouton noir : texte blanc + bordure sombre par défaut (fond noir via le widget) */
.bouton_noir .elementor-button {
  color: white !important;
  border: 1px solid #1a1a1a;
}

/* Survol : fond transparent, texte + bordure sombres (style outline) */
.bouton_noir .elementor-button:hover,
.bouton_noir .elementor-button:focus {
  background-color: transparent !important;
  color: #1a1a1a !important;
  border: 1px solid #1a1a1a;
}
.bouton_noir .elementor-button:hover .elementor-button-text,
.bouton_noir .elementor-button:focus .elementor-button-text {
  color: #1a1a1a !important;
}

/* Bouton qui passe au noir au survol — UNIQUEMENT le bouton qui porte la classe.
   Sélecteurs composés, jamais un simple descendant de .button-hover-black :
   une section ou une colonne portant la classe ne noircit donc pas tous les
   boutons qu'elle contient.
   Deux emplacements possibles de la classe sont couverts :
     - sur le widget Bouton (Avancé → Classes CSS) : .elementor-widget-button.X
     - directement sur le lien                     : .elementor-button.X
   Le libellé a sa règle : .elementor-button span lui pose sa couleur
   directement, l'héritage depuis le <a> ne suffirait pas. */
.elementor-widget-button.button-hover-black .elementor-button:hover,
.elementor-widget-button.button-hover-black .elementor-button:focus,
.elementor-button.button-hover-black:hover,
.elementor-button.button-hover-black:focus {
  background-color: #1a1a1a !important;
  color: white !important;
}
.elementor-widget-button.button-hover-black .elementor-button:hover .elementor-button-text,
.elementor-widget-button.button-hover-black .elementor-button:focus .elementor-button-text,
.elementor-button.button-hover-black:hover .elementor-button-text,
.elementor-button.button-hover-black:focus .elementor-button-text {
  color: white !important;
}

/* === Animation de lignes — widget HTML #animation-conseiller ===
   viewBox du SVG = "0 0 200 200" ; chaque ligne fait 120 unités,
   d'où stroke-dasharray:120 (effet de tracé complet).
   Volontairement SANS height:100vh ni fond dégradé : c'est un widget dans une
   section, pas un écran plein. (Voir note en fin de bloc pour la version plein écran.) */
#animation-conseiller .line-animation {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 350px;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  background: linear-gradient(135deg, #F5F5F5, #E0E0E0);
  margin: 0;
  padding: 0;
}
#animation-conseiller .line-svg {
  width: 300px;
  height: 600px;
}
#animation-conseiller line {
  stroke: #000000;
  stroke-width: 1;
  stroke-dasharray: 120;
  stroke-dashoffset: 120;
  transform-box: fill-box;
  transform-origin: center;
}
#animation-conseiller .left-line  { animation: conseillerLeftLine  6s ease-in-out infinite; }
#animation-conseiller .right-line { animation: conseillerRightLine 6s ease-in-out infinite; }

@keyframes conseillerLeftLine {
  0%       { stroke-dashoffset: 120; transform: translateY(0); }
  40%      { stroke-dashoffset: 20;  transform: translateY(0); }
  50%      { stroke-dashoffset: 20;  transform: translateY(-20px); }
  60%, 80% { stroke-dashoffset: 0;   transform: translateY(-20px); }
  100%     { stroke-dashoffset: 120; transform: translateY(0); }
}
@keyframes conseillerRightLine {
  0%       { stroke-dashoffset: 120; transform: translateY(0); }
  40%      { stroke-dashoffset: 20;  transform: translateY(0); }
  50%      { stroke-dashoffset: 20;  transform: translateY(20px); }
  60%, 80% { stroke-dashoffset: 0;   transform: translateY(20px); }
  100%     { stroke-dashoffset: 120; transform: translateY(0); }
}

/* === #animation-securiser — cercle qui se trace ===================== */
#animation-securiser .circle-animation {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 350px;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  background: linear-gradient(135deg, #F5F5F5, #E0E0E0);
}
#animation-securiser .circle-svg {
  width: 300px;
  height: 600px;
}
#animation-securiser .animated-circle {
  fill: none;
  stroke: #000000;
  stroke-width: 1;
  stroke-dasharray: 502;   /* périmètre ≈ 2πr, r=80 */
  stroke-dashoffset: 502;
  animation: securiserDrawCircle 10s ease-in-out infinite;
}
@keyframes securiserDrawCircle {
  0%   { stroke-dashoffset: 502; }
  50%  { stroke-dashoffset: 0; }
  100% { stroke-dashoffset: 502; }
}

/* === #animation-simplifier — lignes qui se tracent ================== */
#animation-simplifier .line-animation {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 350px;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  background: linear-gradient(135deg, #F5F5F5, #E0E0E0);
}
#animation-simplifier .iframe-container {
  position: absolute;
  inset: 0;
  z-index: 0;
}
#animation-simplifier .iframe-container iframe {
  width: 100%;
  height: 100%;
  border: none;
}
#animation-simplifier svg {
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: 1;
}
#animation-simplifier .line {
  fill: none;
  stroke: #000000;
  stroke-width: 1.25;
  stroke-linejoin: round;
  stroke-linecap: round;
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
  animation: simplifierDraw 3s ease-in-out infinite alternate;
}
#animation-simplifier #line1 { animation-delay: 0s; }
#animation-simplifier #line2 { animation-delay: 0.5s; }
#animation-simplifier #line3 { animation-delay: 1s; }
@keyframes simplifierDraw {
  from { stroke-dashoffset: 100; }
  to   { stroke-dashoffset: 0; }
}

/* === #animation-valoriser — segments qui se tracent ================= */
#animation-valoriser .diagram-container {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 350px;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  background: linear-gradient(135deg, #F5F5F5, #E0E0E0);
}
#animation-valoriser .diagram-container svg {
  width: 300px;
  height: 600px;
  overflow: visible;
}
#animation-valoriser .line {
  fill: none;
  stroke: #000000;
  stroke-width: 1;
  stroke-linejoin: round;
  stroke-linecap: round;
}
#animation-valoriser #line1 {
  --length: 50;
  stroke-dasharray: var(--length);
  stroke-dashoffset: var(--length);
  animation: valoriserDash 5s ease-in-out infinite;
}
#animation-valoriser #line2 {
  --length: 70;
  stroke-dasharray: var(--length);
  stroke-dashoffset: var(--length);
  animation: valoriserDash 5s 0.5s ease-in-out infinite;
}
#animation-valoriser #line3 {
  --length: 70;
  stroke-dasharray: var(--length);
  stroke-dashoffset: var(--length);
  animation: valoriserDash 10s 1s ease-in-out infinite;
}
@keyframes valoriserDash {
  0%   { stroke-dashoffset: var(--length); }
  50%  { stroke-dashoffset: 0; }
  100% { stroke-dashoffset: var(--length); }
}

/* === Avis Google (widget Trustindex, layout slider) — section .avis-section ===
   Le nombre de colonnes est décidé par le JS de Trustindex : largeur du
   conteneur divisée par data-review-target-width, posé dans le HTML du widget
   (réglé à 480 pour obtenir 3 colonnes). Ne PAS brider la largeur du conteneur
   en CSS : le JS recalculerait un autre nombre de colonnes et décalerait les
   positions qu'il applique aux slides. */
.avis-section .ti-widget-container {
  margin-left: auto;
  margin-right: auto;
}

/* === Colonne e5b32ea (accueil) : palier 768-918px ===
   Elementor pose trois paliers sur cette colonne :
     desktop        padding: 0 clamp(50px,4.06vw,95px) 0 clamp(60px,12vw,230px)
     ≤1024px        padding: 0vw 2vw 0vw 10vw
     ≤767px         padding: 0vw 0vw 0vw 0vw
   On insère un palier intermédiaire qui resserre la marge droite à 1vw.
   Sélecteur volontairement identique à celui d'Elementor (0,4,0) : notre
   style.css est enqueué APRÈS post-11.css, il gagne donc l'égalité par l'ordre
   de la cascade — pas besoin de !important.
   Bornes fermées des deux côtés pour ne pas déborder sur le palier ≤767px. */
@media (min-width: 768px) and (max-width: 918px) {
  .elementor-11 .elementor-element.elementor-element-e5b32ea > .elementor-element-populated {
    padding: 0vw 2vw 0vw 0vw;
  }
}

/* === Titre des articles (page single) ===
   Le !important passe devant le barème global h1 (0,0,1, lui aussi en
   !important) — ici 0,1,1, la spécificité tranche.
   Note : 400 fait basculer Adobe Caslon sur son fichier REGULAR (la plage
   100-500 de fonts.css), pas sur le Semibold utilisé partout ailleurs. */
.single-post h1 {
	padding-top: 15vh;
	font-weight: 400 !important;
}

.single-post .elementor-widget-post-info {
	margin-bottom: 2vh;
}

.bouton-no-padding-left-right a {
	padding-right: 0 !important;
	padding-left: 0 !important;
}

/* === Espacements verticaux utilitaires (desktop) ===
   À poser dans Avancé → Classes CSS d'une section ou d'un conteneur.
   Desktop seulement : au-dessus de 1024px, seuil où le site bascule en mobile.
   Plafond à 106px : sur un écran très haut, le vh ne grossit plus au-delà.
   !important : Elementor pose ses propres paddings par élément (0,3,0) ou via
   des variables sur .e-con ; une classe utilitaire doit toujours l'emporter. */
@media (min-width: 1025px) {
  .padding-top-bottom {
    padding-top: min(10vh, 106px) !important;
    padding-bottom: min(10vh, 106px) !important;
  }
  .padding-top {
    padding-top: min(10vh, 106px) !important;
  }
  .padding-bottom {
    padding-bottom: min(10vh, 106px) !important;
  }
  .padding-top-mini {
    padding-top: min(10vh, 106px) !important;
  }
  .padding-bottom-mini {
    padding-bottom: min(9vh, 96px) !important;
  }
  .padding-bottom-xs {
    padding-bottom: min(7vh, 74px) !important;
  }
}

/* Mobile : annule le retrait haut, quel qu'il soit (réglage Elementor compris). */
@media (max-width: 767px) {
  .padding-top-mobile-zero {
    padding-top: 0 !important;
  }
}

/* Bouton du hero (nouveau type Elementor : la classe est posée directement sur
   le <a>, qui porte e-button-base et non elementor-button).
   La largeur seule ne suffit pas : .elementor .e-button-base pose
   border-width:0 sans style de bordure, et border-style vaut « none » par
   défaut — une bordure sans style ne s'affiche jamais. D'où les trois
   propriétés. currentColor fait suivre la couleur du texte, survol compris. */
.hero-button {
	border-bottom-width: 1px !important;
	border-bottom-style: solid !important;
	border-bottom-color: currentColor !important;
}

