/* ═══════════════════════════════════════════════════════════════════
 * AXIALYS BLOG — Reskin CSS
 * Reskin visuel du gabarit WordPress/Elementor EXISTANT du blog.
 * Ne modifie AUCUN widget/module Elementor — cible uniquement les classes
 * déjà générées par les widgets natifs (Elementor Posts, Nav Menu, Search
 * Form, TOC…) et les plugins tiers (Reading Time…), sous le scope ax-scope.
 *
 * Dépend de : tokens.css, axialys-elementor.css (mêmes fichiers que le
 * site principal — voir Design/CLAUDE.md).
 *
 * Toutes les règles ci-dessous DOIVENT être préfixées par `body.ax-scope`
 * pour ne s'appliquer qu'une fois ce fichier volontairement chargé.
 * ═══════════════════════════════════════════════════════════════════ */

/* Keyframes globaux (pas de préfixe body.ax-scope possible sur une
   @keyframes elle-même — la règle qui la CONSOMME est bien scopée) —
   valeurs (courbe, durée) reprises à l'identique de
   Design/server/axialys-nav.css (site principal, .ax-nav-search-wrap),
   demandées par Ilich pour l'ouverture de la recherche du blog (8 sept
   2026). Différence nécessaire : chaque étape inclut translateX(-50%) en
   plus de scale/translateY — la barre du blog est centrée horizontalement
   via `left:50%; transform:translateX(-50%)` (le site principal centre
   autrement, sans transform), et un `transform` animé REMPLACE tout
   `transform` statique pendant sa durée (même avec !important) : sans ce
   translateX répété à chaque étape, la barre aurait sauté hors du centre
   pendant les 500ms de l'animation. */
@keyframes ax-search-bounce-in {
  0%   { transform: translateX(-50%) scale(0.82) translateY(-6px); opacity: 0; }
  55%  { transform: translateX(-50%) scale(1.04) translateY(1px);  opacity: 1; }
  75%  { transform: translateX(-50%) scale(0.98) translateY(0); }
  100% { transform: translateX(-50%) scale(1)    translateY(0); }
}


/* ───────────────────────────────────────────────────────────────────
 * 1-2 — HEADER / NAV / RECHERCHE
 * Widgets natifs Elementor : HTML (logo), Menu WordPress (#navigationMainMars2023),
 * Bouton (déjà classé ax-btn ax-btn-primary en direct dans Elementor),
 * Formulaire de recherche (skin full_screen).
 * Section racine : #headerFade (position fixed — réglé dans Elementor, Avancé > Position).
 * Section interne "boxed" : id=1ea859ad — c'est ELLE qui porte l'aspect pill
 * (Liquid Glass Effects, border-radius, ombre), pas #headerFade (full-width).
 * Colonne interne : .ax-blog-header (déjà ajoutée par Ilich dans Elementor)
 * ─────────────────────────────────────────────────────────────────── */

/* Header fixed → compensation sur tout le site, sinon le contenu passe
   derrière la pill. Padding sur body (simple et robuste) plutôt que sur
   le 1er bloc de chaque template (sélecteurs des templates du blog pas
   tous connus avec certitude) — léger compromis cosmétique accepté.
   Valeur à ajuster une fois la hauteur finale de la pill stabilisée. */
body.ax-scope {
    padding-top: 100px;
    background: linear-gradient(#fff 10%, #f3f6f7 20%);
}

/* Intro texte catégorie (#texteMea-ax) — liens en orange marque. */
body.ax-scope #texteMea-ax a {
    color: #F17431 !important;
}
/* Masquage si vide — v2, CSS pur (8 sept 2026). v1 masquait via JS après
   DOMContentLoaded (fonctionnalites.js) : Ilich a remonté que la section
   "flashait" quelques secondes avant de disparaître sur les pages sans
   contenu (accueil) — le JS s'exécute forcément APRÈS le premier rendu,
   et WP Rocket retarde en plus l'exécution des scripts non critiques,
   ce qui allongeait le flash. Une règle CSS est évaluée AVANT le premier
   rendu → aucun flash possible, par construction.
   :empty ne fonctionne pas ici (testé) : la section contient plusieurs
   niveaux de wrapper Elementor, et CHAQUE niveau a un nœud texte fait
   uniquement d'indentation/retours à la ligne (confirmé en DOM) — :empty
   exige ZÉRO nœud enfant, espaces compris, donc ne matche jamais même
   quand le contenu dynamique réel est vide.
   Solution : comparer la présence d'un vrai enfant DANS le widget-wrap.
   Vérifié en direct sur les deux cas : page avec contenu (catégorie,
   widget-wrap contient un vrai widget) → la règle ne matche pas ; page
   sans contenu (accueil, widget-wrap n'a AUCUN enfant élément) → matche. */
body.ax-scope #texteMea-ax:not(:has(.elementor-widget-wrap > *)) {
    display: none !important;
}

/* ═══════════════════════════════════════════════════════════════════
 * CSS du header — migré depuis le champ "CSS personnalisé" Elementor
 * de #headerFade le 3 sept 2026 (v1 → v11 rédigées et testées là-bas,
 * voir l'historique complet dans CLAUDE.md § "CSS embarqué du header").
 * Le champ Elementor est maintenant VIDE — tout vit ici, versionné,
 * sans limite d'éditeur. fonctionnalites.js continue de tourner (toggle
 * lightHeader/darkHeader sur #headerFade au scroll), mais plus aucune
 * règle ne lit ces classes pour changer le style — un seul style de
 * header partout, toujours fixed.
 * ═══════════════════════════════════════════════════════════════════ */

/* Icône loupe (bouton fermé) — glyphe Tabler ti-search au lieu du Font
   Awesome par défaut (voir CLAUDE.md v8/v9 pour le cheminement complet :
   la couleur s'hérite au ::before mais pas le font-size/font-family, il
   faut les cibler directement dessus). */
#formSearchIcon .elementor-search-form__toggle i.fa-search:before{
  font-family:"tabler-icons" !important;
  content:"\eb1c" !important;
  font-weight:400 !important;
  font-size:18px !important;
}
#formSearchIcon i.fa-search{
  color:#495057 !important;
}
#formSearchIcon:hover i.fa-search{
  color:#211D6D !important;
}
/* Pastille du bouton loupe (fermé) — reprend .ax-nav-search-btn du site
   principal : cercle 44px, fond blanc translucide + flou, ombre portée.
   Le .toggle et le .container sont des SIBLINGS dans ce markup (aucun
   n'est ancêtre de l'autre) — donc mettre du backdrop-filter ici ne
   recrée pas le bug de containing-block rencontré sur le container. */
#formSearchIcon .elementor-search-form__toggle{
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  width:44px !important;
  height:44px !important;
  border-radius:9999px !important;
  background:rgba(255,255,255,0.65) !important;
  backdrop-filter:blur(0.75rem) !important;
  -webkit-backdrop-filter:blur(0.75rem) !important;
  box-shadow:0 2px 16px rgba(0,0,0,0.08), 0 0 0 1px rgba(0,0,0,0.05) !important;
  cursor:pointer !important;
}
#formSearchIcon .elementor-search-form__toggle:hover{
  background:#F8FAFB !important;
}

/* Header toujours fixed, un seul style, décalé du haut (comme .ax-nav-shell du site principal) */
#headerFade{
  position:fixed;
  top:20px;
  width:100%;
  z-index:100;
}

/* La pill doit épouser son contenu, pas remplir toute la largeur du site
   (comportement par défaut d'une Section Elementor, même "boxed") */
#headerPill {
  width: fit-content !important;
  max-width: calc(100% - 40px); /* sécurité sur petits écrans */
  margin-left: auto !important;
  margin-right: auto !important;
}

/* Alignement en ligne entre la pill principale et le bouton recherche
   (widget séparé depuis son déplacement hors de la Section "boxed") */
#headerPill > .elementor-widget-wrap {
  display:flex !important;
  flex-direction:row !important;
  align-items:center !important;
  gap:12px !important;
}
/* Elementor force width:100% sur tout enfant direct d'un widget-wrap
   (.elementor-widget-wrap > .elementor-element) — neutralisé ici pour
   que chaque enfant (pill + recherche) épouse son propre contenu */
#headerPill > .elementor-widget-wrap > .elementor-element {
  width:auto !important;
  flex:0 0 auto !important;
}
/* Recherche : reste en flux normal (pas de positionnement custom résiduel
   — vérifié : Avancé > Position du widget est déjà "Défaut") */
#formSearchIcon {
  position:static !important;
  top:auto !important;
  left:auto !important;
  right:auto !important;
  bottom:auto !important;
}

/* Logo unique — fin du swap blanc/couleur (on garde la version couleur,
   cohérente avec un header clair/frosted) */
#headerFade #logoScrollChange{
  width:205px;height:20px;display:block;margin:5px;
  background:url('/wp-content/uploads/2023/06/logo-axialys-blog-color.svg') no-repeat;
}

/* Items de nav — alignés sur .ax-nav-item du site principal.
   line-height/height forcés : Elementor impose sinon ~52-54px via une
   variable globale de typographie, le padding seul ne suffit pas. */
#headerFade nav li a.elementor-item{
  display:inline-flex !important;
  align-items:center !important;
  color:#495057 !important;
  font-size:14px !important;
  font-weight:500 !important;
  line-height:1 !important;
  height:auto !important;
  padding:8px 14px !important;
  border-radius:9999px !important;
}
#headerFade nav li a.elementor-item:hover,
#headerFade .current-menu-ancestor,
#headerFade .current-menu-item{
  background:rgba(33,29,109,0.07) !important;
  color:#211D6D !important;
  border-radius:9999px !important;
}
/* Neutralise un éventuel fond natif Elementor posé sur le <li> lui-même
   (cause probable du hover "rectangle plein" sans radius) */
#headerFade nav li:hover{
  background:transparent !important;
}

/* Indicateur de page active (desktop) */
@media only screen and (min-width:1025px){
  #headerFade nav > ul > li.current-menu-ancestor::after,
  #headerFade nav > ul > li.current_page_item::after{
    height:2px;width:calc(100% - 30px);display:block;
    background:rgba(51,106,209,0.6);content:'';margin:0 15px;
    bottom:0;position:absolute;border:none;
  }
}

/* ── Recherche — v11, structure réelle confirmée en DOM (3 sept 2026) ──
   .elementor-search-form__container contient directement :
   ::before (généré par Elementor), label.elementor-screen-only,
   input.elementor-search-form__input, div.dialog-lightbox-close-button.
   PAS de .elementor-search-form__icon ni .elementor-search-form__submit
   (v10 ciblait ces classes par erreur, elles n'existent pas dans ce
   markup — sans effet mais sans danger, retirées ici). L'icône loupe est
   donc générée en CSS (::after + flex order), et le bouton "fermer" (X)
   natif est restylé plutôt que d'ajouter un vrai bouton "Rechercher". */
#formSearchIcon .elementor-search-form__container{
  display:flex !important;
  align-items:center !important;
  position:fixed !important;
  inset:auto !important;
  top:100px !important;
  right:auto !important;
  bottom:auto !important;
  left:50% !important;
  transform:translateX(-50%) !important;
  margin:0 !important;
  height:56px !important;
  width:auto !important;
  max-width:640px !important;
  padding:8px 20px !important;
  background:#fff !important;
  border-radius:9999px !important;
  box-shadow:0 2px 16px rgba(0,0,0,0.08), 0 0 0 1px rgba(0,0,0,0.05) !important;
  z-index:100 !important;
  isolation:isolate !important;
}
/* Bounce à l'ouverture (demandé par Ilich, 8 sept 2026) — voir @keyframes
   ax-search-bounce-in en tête de fichier.
   RÉGRESSION CORRIGÉE le 8 sept 2026 (même jour) : posée d'abord sans
   condition sur le conteneur ci-dessus → puisque ce conteneur est
   TOUJOURS display:flex (jamais display:none, voir plus haut — Elementor
   bascule l'état ouvert/fermé par un autre mécanisme, pas identifié), le
   navigateur démarrait l'animation dès le chargement de la page, PAS
   seulement à l'ouverture — Ilich a vu la barre de recherche apparaître
   puis disparaître à chaque chargement/changement de page. Corrigé en
   scopant l'animation à `body.ax-search-open` : elle ne se déclenche
   désormais QUE quand cette classe est ajoutée par fonctionnalites.js (le
   vrai clic sur la loupe), pas au premier rendu de la page. Rejoue bien à
   chaque ouverture (vérifié) : l'ajout de la classe fait passer le
   conteneur d'un état "aucune règle animation ne matche" à "une règle
   matche" — même mécanique de redémarrage qu'un display:none→block. */
body.ax-search-open #formSearchIcon .elementor-search-form__container{
  animation:ax-search-bounce-in var(--ax-duration-slower, 500ms) var(--ax-ease-bounce, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
/* Fond assombri/flouté à l'ouverture de la recherche — v3 avec animations
   (8 sept 2026). v2 (3 sept) créait le ::before uniquement à l'ajout de la
   classe .ax-search-open → apparition instantanée, pas de fade. Repris en
   suivant le même modèle que .ax-nav-overlay du site principal : élément
   TOUJOURS présent (opacity:0/visibility:hidden par défaut), la classe ne
   fait plus que basculer opacity/visibility avec une transition — mêmes
   valeurs que le site principal (transition 0.25s ease, cf.
   Design/server/axialys-nav.css). Une transition sur un ::before qui
   n'existe qu'à la pose de la classe ne peut pas s'animer (rien à
   transitionner depuis) ; un ::before permanent mais invisible le peut. */
body::before{
  content:"";
  position:fixed;
  inset:0;
  z-index:90; /* sous la pill (z-index 100), au-dessus du reste du site */
  background:rgba(0,0,0,0.4);
  backdrop-filter:blur(8px);
  -webkit-backdrop-filter:blur(8px);
  opacity:0;
  visibility:hidden;
  transition:opacity var(--ax-duration-normal, 200ms) ease, visibility var(--ax-duration-normal, 200ms) ease;
}
body.ax-search-open::before{
  opacity:1;
  visibility:visible;
}
/* Masque TOUTE la pill logo+menu+bouton (pas juste le menu/CTA — le logo
   et le bouton loupe fermé tout seuls au-dessus du voile étaient plus
   gênants qu'autre chose, retour d'Ilich) + le bouton loupe fermé, pendant
   que la recherche est ouverte — comme .ax-nav-shell.search-open sur le
   site principal, où toute la navbar disparaît au profit de la barre de
   recherche. #headerMenuPill : ID de CSS à poser sur la Section interne
   "boxed" (Avancé > ID de CSS), même technique que headerPill.
   transition ajoutée le 8 sept 2026 : Ilich a remonté qu'au clic, le menu
   restait visible "quelques secondes" en arrière-plan alors que le logo
   disparaissait instantanément — la disparition ÉTAIT instantanée côté
   CSS (vérifié : visibility:hidden appliqué en moins de 10ms après le
   clic), le décalage perçu vient du COMPOSITING du blur (backdrop-filter
   sur tout le viewport, coûteux à calculer, accuse un temps de rendu que
   la disparition instantanée de la pill ne masque pas). Fondu la pill en
   même temps que le voile plutôt que de la faire disparaître d'un coup —
   les deux s'estompent au même rythme, l'écart de rendu du blur devient
   beaucoup moins perceptible. */
#headerMenuPill,
#formSearchIcon .elementor-search-form__toggle{
  transition:opacity var(--ax-duration-normal, 200ms) ease, visibility var(--ax-duration-normal, 200ms) ease;
}
body.ax-search-open #headerMenuPill,
body.ax-search-open #formSearchIcon .elementor-search-form__toggle{
  opacity:0;
  visibility:hidden;
}
/* ── Régression mobile corrigée (9 sept 2026) ──────────────────────
   Sur mobile, #formSearchIcon a été déplacé DANS #headerMenuPill (voir
   plus bas, pour l'ordre [logo][loupe][burger]) — la règle ci-dessus, qui
   estompe TOUT #headerMenuPill à l'ouverture de la recherche, estompait
   donc aussi la barre de recherche elle-même, alors qu'elle est en
   position:fixed. Piège CSS important à retenir : position:fixed échappe
   à la MISE EN PAGE d'un ancêtre (d'où son positionnement correct,
   viewport-relative) mais PAS à ses EFFETS DE RENDU comme opacity/filter
   — un enfant ne peut pas "annuler" l'opacity de son parent avec sa
   propre opacity:1 (contrairement à visibility, qui est héritée/
   annulable). Résultat observé : voile visible, mais aucune barre de
   recherche à l'écran (repéré par Ilich, capture à l'appui) — vérifié en
   direct : computed opacity de la barre = 1 (correct en soi), mais rendu
   invisible car son ANCÊTRE #headerMenuPill est à opacity:0.
   Fix : sur mobile, on n'estompe plus #headerMenuPill lui-même (opacity
   remise à 1) — à la place on estompe individuellement SES enfants SAUF
   #formSearchIcon, et on neutralise l'apparence visuelle de la pill
   elle-même (fond/ombre/flou du Liquid Glass) pour éviter qu'elle reste
   visible comme un "fantôme" vide derrière la barre de recherche. */
@media (max-width:767px){
  body.ax-search-open #headerMenuPill{
    opacity:1 !important;
    visibility:visible !important;
    background:transparent !important;
    box-shadow:none !important;
    border-color:transparent !important;
    backdrop-filter:none !important;
    -webkit-backdrop-filter:none !important;
  }
  body.ax-search-open #headerMenuTop02 > .elementor-widget-wrap > :not(#formSearchIcon){
    opacity:0 !important;
    visibility:hidden !important;
  }
}
/* Icône loupe décorative, générée (aucun élément natif dans ce markup) */
#formSearchIcon .elementor-search-form__container::after{
  content:"\eb1c";
  font-family:"tabler-icons" !important;
  font-size:16px;
  color:#ADB5BD;
  order:1;
  flex-shrink:0;
  margin-right:8px;
}
#formSearchIcon .elementor-search-form__input{
  order:2;
  flex:1 1 auto !important;
  min-width:280px !important;
  height:40px !important;
  border:none !important;
  outline:none !important;
  background:transparent !important;
  font-size:14px !important;
  color:#495057 !important;
  padding:0 !important;
}
#formSearchIcon .elementor-search-form__input::placeholder{
  color:#CED4DA !important;
}
/* Le navigateur ajoute SA PROPRE croix native aux champs type="search" dès
   qu'il y a du texte (Chrome/Edge/Safari + Firefox) — en plus de notre
   .dialog-lightbox-close-button, d'où la "double croix" signalée. On la
   masque : la nôtre reste la seule visible. */
#formSearchIcon .elementor-search-form__input::-webkit-search-cancel-button,
#formSearchIcon .elementor-search-form__input::-webkit-search-decoration{
  -webkit-appearance:none !important;
  appearance:none !important;
  display:none !important;
}
#formSearchIcon .elementor-search-form__input::-moz-search-clear-button{
  display:none !important;
}
/* Bouton fermer (X) natif — pas de bouton "Rechercher" dans ce markup,
   la validation se fait via la touche Entrée */
#formSearchIcon .dialog-lightbox-close-button{
  /* position:static + margin:0 ajoutés le 8 sept 2026 — la croix était
     décalée verticalement (repéré par Ilich). Cause : le natif Elementor
     pose `.dialog-close-button{position:absolute; inset-inline-end:15px;
     margin-block-start:15px;}` — en position:absolute, l'élément sort du
     flux flex et ignore complètement notre align-items:center sur le
     conteneur ; le margin-block-start:15px (logical property, mappe sur
     margin-top en écriture horizontale) creuse l'écart. position:static
     le remet dans le flux flex normal (où order:3 + align-items:center
     du parent s'appliquent vraiment).
     `all:revert` NÉCESSAIRE avant margin:0 — constaté en direct : un
     simple `margin:0 !important` (voire même `margin-top:0 !important`
     en ciblant le longhand physique) ne suffisait PAS à battre le
     `margin-block-start:15px` natif, alors même que notre sélecteur est
     bien plus spécifique (#id + classe contre une simple classe) — testé
     et confirmé qu'il ne s'agit ni d'un style inline réappliqué par du JS
     (MutationObserver posé, aucune mutation détectée), ni de deux
     éléments distincts (un seul nœud, vérifié via elementFromPoint), ni
     de cascade layers (aucune @layer sur la page) : la seule explication
     qui a réellement fonctionné en test est que les propriétés logiques
     (margin-block-start) et physiques (margin/margin-top) ne se
     départagent PAS toujours par la spécificité normale une fois
     câblées ensemble par le navigateur. `all:revert !important` avant
     nos propres déclarations repart d'un état neutre garanti, sur lequel
     margin:0 s'applique alors correctement. */
  all:revert !important;
  position:static !important;
  margin:0 !important;
  /* order:3 doit être !important lui aussi : `all:revert !important` juste
     au-dessus réinitialise TOUTES les propriétés (order compris) avec une
     priorité !important — un `order:3` sans !important après lui perd
     face à ça et retombe à sa valeur initiale (0), faisant passer la
     croix AVANT la loupe/l'input dans l'ordre flex → elle se retrouvait
     à gauche au lieu de rester à droite (régression du 8 sept, repérée
     par Ilich dès le lendemain). */
  order:3 !important;
  flex-shrink:0 !important;
  width:32px !important;
  height:32px !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  border-radius:9999px !important;
  color:#495057 !important;
  cursor:pointer !important;
}
#formSearchIcon .dialog-lightbox-close-button:hover{
  background:rgba(33,29,109,0.07) !important;
  color:#211D6D !important;
}

/* ═══════════════════════════════════════════════════════════════════
 * RESPONSIVE MOBILE — header (4 sept 2026)
 * L'ancien commentaire "ne pas toucher" protégeait un ordre d'enfants
 * hérité d'avant la refonte, en attendant que le vrai design mobile soit
 * spécifié. C'est fait maintenant (demande explicite d'Ilich) — cette
 * section remplace/étend l'ancien bloc.
 *
 * Logo mobile : icône seule (même SVG que axialys.com) + "BLOG" en texte
 * généré (::after), gras bleu — reprend le pattern du site principal.
 *
 * Pill mobile : seuls logo, loupe et burger restent visibles (nav + CTA
 * masqués dans la pill). Le burger RÉUTILISE le mécanisme natif du widget
 * Elementor Nav Menu (skin "Toggle/Burger" déjà actif nativement sur ce
 * widget — pas un nouveau widget ajouté) : ouverture/fermeture, icône
 * open/close, structure DOM du panneau (.elementor-nav-menu--dropdown)
 * sont 100% Elementor. On ne fait QUE restyler ce panneau natif en bottom
 * sheet (position fixed, glissement depuis le bas) au lieu de l'accordéon
 * par défaut, et épingler le CTA "Démo SVI" en pied de sheet.
 *
 * Piège rencontré (identique à celui du voile de recherche, voir plus
 * haut) : #headerMenuPill porte un Liquid Glass Effect (backdrop-filter),
 * qui crée un nouveau containing block pour tout descendant en
 * position:fixed — le panneau ET le bouton CTA (tous deux imbriqués dans
 * #headerMenuPill) se retrouvaient confinés à la boîte de la pill au lieu
 * du viewport. Un CSS position:fixed ne peut pas s'évader d'un containing
 * block une fois imbriqué — les deux sont donc déplacés en enfants directs
 * de <body> via JS (fonctionnalites.js) avant d'être stylés ici avec
 * position:fixed. Conséquence : le clic-en-dehors natif d'Elementor (qui
 * vérifie que la cible cliquée est un descendant du widget d'origine) ne
 * fonctionne plus une fois le panneau déplacé — un petit listener dans
 * fonctionnalites.js le restaure (clic en dehors + Échap referment via
 * toggle.click(), qui relance le vrai mécanisme natif).
 *
 * Piège #2 : les widgets logo et nav ont chacun une largeur mobile figée
 * par Elementor (réglage responsive natif, ex. max-width:31px sur le
 * widget nav — calculé à l'époque où le logo/burger ne faisaient pas
 * cette taille). Neutralisé via width/max-width:auto/none sur les deux.
 *
 * Ordre visuel obtenu : [logo] … [burger][loupe]. Sur le site principal
 * c'est [loupe][burger] (burger tout à droite) — inversé ici car le
 * burger vit à l'intérieur de #headerMenuPill (avec le logo) alors que la
 * loupe est un widget séparé après toute la pill : impossible d'entrelacer
 * ces deux via CSS order (contextes flex différents, non-imbriqués) sans
 * restructurer Elementor. Différence mineure assumée — à revoir plus tard
 * si Ilich veut l'ordre exact (déplacerait la recherche dans #headerMenuPill).
 * ═══════════════════════════════════════════════════════════════════ */
@media only screen and (max-width:767px) {

  /* Ancien ordre d'enfants (nth-child → order), datant d'avant la refonte,
     RETIRÉ (5 sept 2026) : il réinterprétait dynamiquement les positions
     nth-child, et depuis que la recherche est déplacée dans cette même
     ligne (voir plus bas + fonctionnalites.js), il réordonnait le burger
     AVANT la recherche au lieu de l'ordre DOM voulu (logo, recherche,
     burger) — cassait le point suivant. L'ordre visuel voulu est
     maintenant piloté uniquement par l'ordre réel du DOM (voir JS). */
  #headerMenuTop02 { display:flex; flex-direction:row; }

  /* ── Logo : icône seule + "BLOG" texte généré ── */
  #headerFade #logoScrollChange{
    width:auto !important;
    height:32px !important;
    min-width:32px;
    /* margin:12px 0 0 0 (valeur héritée d'avant la refonte, pensée pour
       l'ancien logo plein format) poussait le logo vers le bas au lieu de
       le laisser centré par le align-items:center du parent
       (#headerMenuTop02 > .elementor-widget-wrap) — décalage repéré par
       Ilich en devtools. margin:0 auto laisse le flex parent centrer
       verticalement et centre le logo horizontalement dans sa propre boîte
       (utile si min-width/flex-basis lui laissent un peu de mou). */
    margin:0 auto !important;
    padding-left:36px;
    background:url('https://www.axialys.com/wp-content/uploads/2026/02/AX_icon-square.svg') no-repeat left center !important;
    background-size:28px 28px !important;
    display:flex !important;
    align-items:center !important;
    flex-shrink:0 !important;
    white-space:nowrap !important;
  }
  #headerFade #logoScrollChange::after{
    content:"BLOG";
    font-family:var(--ax-font-body);
    font-size:18px;
    font-weight:700;
    color:var(--ax-color-primary-500, #211D6D);
    letter-spacing:0.02em;
    /* Pas de nudge vertical — centrage flex pur (align-items:center sur
       #logoScrollChange) suffit. Un margin-top:3px avait été ajouté le
       5 sept 2026 sur une impression visuelle rapide ("texte perçu un peu
       haut"), mais un calcul précis (Canvas measureText + Range pour la
       vraie boîte du texte rendu, voir CLAUDE.md) a montré l'inverse :
       cette valeur décalait le texte ~1,8px trop BAS. Retiré le même jour
       après le retour d'Ilich confirmant le décalage. Si un futur
       changement de police/taille du logo redonne une impression de
       désalignement, recalculer avant d'ajuster à l'œil — ne pas refaire
       la même erreur. */
  }
  /* Le wrapper widget du logo (1er enfant de la ligne) a lui aussi une
     largeur mobile figée par Elementor — neutralisée pour laisser la place
     au nouveau logo plus large (icône + texte). Sélecteur positionnel
     (pas d'ID hex Elementor, stable preprod/prod). */
  #headerMenuTop02 > .elementor-widget-wrap > :first-child{
    width:auto !important;
    max-width:none !important;
    flex-basis:auto !important;
  }
  /* Logo à gauche, [recherche][burger] groupés ENSEMBLE à droite — pill
     étirée sur (presque) toute la largeur (voir #headerPill/#headerMenuPill
     plus bas), comme sur le site principal. `justify-content:space-between`
     (essayé le 5 sept 2026) espaçait les 3 icônes ÉGALEMENT sur toute la
     largeur — loupe isolée au milieu au lieu d'être collée au burger,
     signalé par Ilich. Remplacé par la technique de marge automatique en
     flexbox : `justify-content:flex-start` (comportement par défaut) +
     `margin-left:auto` sur le premier élément du groupe de droite (la
     recherche, voir plus bas) — ce margin auto absorbe tout l'espace
     disponible, poussant recherche+burger ensemble contre le bord droit
     tout en gardant un gap normal (8px) entre eux. */
  #headerMenuTop02 > .elementor-widget-wrap{
    gap:8px !important;
    justify-content:flex-start !important;
  }
  /* Recherche : marge automatique à gauche → absorbe l'espace restant,
     colle [recherche][burger] ensemble à droite plutôt que de les espacer
     également sur toute la largeur (voir commentaire ci-dessus). */
  #formSearchIcon{
    margin-left:auto !important;
    /* Même piège que le widget nav et le wrapper du logo (largeur mobile
       figée par un réglage responsive natif Elementor propre à ce widget,
       ici 31px — visible en devtools : `.elementor-3818
       .elementor-element-11356e3e{width:var(--container-widget-width,31px);
       max-width:31px}`). Le widget se retrouvait plus étroit que le bouton
       loupe (44px) qu'il contient, donnant un espacement visuel trop
       serré avec le burger juste à côté. Repéré par Ilich en devtools. */
    width:44px !important;
    max-width:44px !important;
    height:44px !important;
  }
  /* Pill mobile étirée (site principal : calc(100% - 40px)) plutôt que
     compacte (fit-content, valeur desktop). #headerMenuPill (la SECTION
     Liquid Glass, l'élément visuellement "pill") a sa propre largeur figée
     par une règle plus spécifique que celle-ci
     (#headerPill > .elementor-widget-wrap > .elementor-element{width:auto}) —
     sélecteur renforcé avec l'ID pour la battre en spécificité plutôt que
     de la dupliquer/modifier (risque de casser le desktop, qui en dépend).
     ⚠️ #headerPill lui-même a une SECONDE embûche, bien plus vicieuse,
     découverte le 5 sept 2026 : un `#headerPill{width:fit-content!important}`
     existe ENCORE dans le champ "CSS personnalisée" d'Elementor posé
     directement sur la COLONNE #headerPill elle-même (pas #headerFade,
     déjà vidé — un élément différent, jamais migré). Ce CSS est compilé
     par Elementor dans son propre fichier auto-généré par template
     (`post-3818.css`, le template "Header"), chargé APRÈS axialys-blog.css
     dans le <head> → à spécificité et important égaux, la règle du fichier
     chargé EN DERNIER gagne, peu importe l'ordre à L'INTÉRIEUR de notre
     propre fichier. Résultat observé : la pill restait à fit-content (donc
     minuscule) malgré notre override mobile, les 3 icônes (logo/loupe/
     burger) manquaient de place et passaient à la ligne, ce qui grandissait
     la hauteur du header et faisait chevaucher le H1 en dessous (padding-top
     du body pas prévu pour un header sur 2 lignes). Contourné en renforçant
     la spécificité (`body.ax-scope #headerPill` plutôt que `#headerPill`
     seul) pour gagner INDÉPENDAMMENT de l'ordre de chargement des fichiers
     — plus robuste que de compter sur l'ordre des <link>. Fix définitif si
     un jour un comportement similaire réapparaît ailleurs : vider le champ
     CSS personnalisée d'Elementor sur #headerPill (Avancé > CSS
     personnalisée), comme déjà fait pour #headerFade. */
  body.ax-scope #headerPill{ width:calc(100% - 40px) !important; }
  #headerPill > .elementor-widget-wrap > #headerMenuPill{
    width:calc(100% - 40px) !important;
  }
  /* Filet de sécurité : empêche tout retour au passage à la ligne des 3
     icônes (logo/loupe/burger) même si une largeur venait à manquer pour
     une autre raison — mieux vaut un léger débordement visible et
     diagnosticable qu'un header qui grandit silencieusement et chevauche
     le contenu en dessous. */
  #headerMenuTop02 > .elementor-widget-wrap{
    flex-wrap:nowrap !important;
  }

  /* ── Recherche : régression corrigée suite à son déplacement dans la
     pill (voir plus haut + fonctionnalites.js). Elle est maintenant
     descendante de #headerMenuPill, qui passe en visibility:hidden pendant
     l'ouverture de la recherche (règle plus haut, pensée à l'origine pour
     masquer logo+nav+CTA) — sans ce correctif, la barre de recherche
     elle-même disparaissait avec le reste de la pill. visibility:visible
     sur un descendant reprend le dessus sur le visibility:hidden hérité de
     l'ancêtre (le bouton loupe fermé, lui, doit bien rester caché — déjà
     géré par sa propre règle explicite plus haut, pas touché ici). */
  body.ax-search-open #formSearchIcon,
  body.ax-search-open #formSearchIcon .elementor-search-form__container{
    visibility:visible !important;
  }

  /* ── CTA masqué dans la pill (réapparaît épinglé en bas de la sheet,
     voir plus bas — déplacé en enfant de body par fonctionnalites.js) ── */
  body > .ax-btn.ax-btn-primary{
    display:none !important;
  }

  /* ── Widget nav — largeur mobile figée par Elementor, neutralisée pour
     laisser la place au bouton burger restylé (44px) ── */
  #navigationMainMars2023{
    width:auto !important;
    max-width:none !important;
    flex-basis:auto !important;
  }

  /* ── Bouton burger natif Elementor — même pastille que le bouton loupe ── */
  #navigationMainMars2023 .elementor-menu-toggle{
    display:flex !important;
    align-items:center !important;
    justify-content:center !important;
    width:44px !important;
    height:44px !important;
    border-radius:9999px !important;
    background:rgba(255,255,255,0.65) !important;
    backdrop-filter:blur(0.75rem) !important;
    -webkit-backdrop-filter:blur(0.75rem) !important;
    box-shadow:0 2px 16px rgba(0,0,0,0.08), 0 0 0 1px rgba(0,0,0,0.05) !important;
    color:#495057 !important;
    cursor:pointer !important;
  }
  #navigationMainMars2023 .elementor-menu-toggle:hover{
    background:#F8FAFB !important;
    color:#211D6D !important;
  }
  /* Glyphes Tabler (ti-menu-2 / ti-x) à la place des icônes Eicons par
     défaut — même technique de swap que la loupe de recherche */
  #navigationMainMars2023 .elementor-menu-toggle__icon--open::before{
    font-family:"tabler-icons" !important;
    content:"\ec42" !important;
    font-size:20px !important;
  }
  #navigationMainMars2023 .elementor-menu-toggle__icon--close::before{
    font-family:"tabler-icons" !important;
    content:"\eb55" !important;
    font-size:20px !important;
  }

  /* ── Panneau natif Elementor (.elementor-nav-menu--dropdown), déplacé en
     enfant de body par fonctionnalites.js — restylé en bottom sheet.
     Le mécanisme d'ouverture (classe .elementor-active sur le toggle,
     inline max-height) reste 100% natif ; on neutralise juste max-height
     et on pilote la visibilité via transform, ce qui laisse le sheet
     "toujours rendu" hors écran plutôt que display:none — nécessaire pour
     l'animation de glissement (même technique que .ax-mob-sheet du site
     principal). ── */
  body > .elementor-nav-menu--dropdown{
    position:fixed !important;
    top:auto !important;
    left:0 !important;
    right:0 !important;
    bottom:0 !important;
    width:100% !important;
    max-height:calc(100dvh - 100px) !important;
    height:auto !important;
    margin:0 !important;
    padding:20px 12px calc(96px + env(safe-area-inset-bottom)) !important;
    background:#fff !important;
    border-radius:24px 24px 0 0 !important;
    box-shadow:0 -4px 40px rgba(0,0,0,0.14) !important;
    transform:translateY(105%) !important;
    transition:transform 0.38s cubic-bezier(0.32,0.72,0,1) !important;
    z-index:200 !important;
    overflow-y:auto !important;
    box-sizing:border-box !important;
  }
  body:has(#navigationMainMars2023 .elementor-menu-toggle.elementor-active) > .elementor-nav-menu--dropdown{
    transform:translateY(0) !important;
  }
  /* Poignée visuelle (comme .ax-mob-sheet::before du site principal) */
  body > .elementor-nav-menu--dropdown::before{
    content:'';
    display:block;
    width:36px;
    height:4px;
    background:var(--ax-color-neutral-200, #E9ECEF);
    border-radius:2px;
    margin:0 auto 16px;
  }
  /* Items de la sheet (copie clonée par Elementor lui-même du menu — pas
     par nous, voir structure native en tête de section) */
  body > .elementor-nav-menu--dropdown a.elementor-item{
    display:block !important;
    padding:14px 16px !important;
    border-radius:14px !important;
    font-size:16px !important;
    font-weight:500 !important;
    color:var(--ax-color-neutral-800, #343A40) !important;
    line-height:1.3 !important;
    height:auto !important;
    text-decoration:none !important;
  }
  body > .elementor-nav-menu--dropdown a.elementor-item:hover{
    background:var(--ax-color-neutral-50, #F8FAFB) !important;
  }
  body > .elementor-nav-menu--dropdown li.menu-item{
    list-style:none !important;
  }
  /* "Pointer Effect" natif Elementor (réglage Style du widget nav, pensé
     pour le survol desktop) : un ::before sombre (rgb(63,68,75)) posé
     derrière chaque item, révélé au survol/tap — remonté par Ilich comme
     "bouton actif trop sombre" dans la sheet. Neutralisé ici uniquement
     (le hover desktop, lui, n'est pas concerné) ; notre propre
     :hover{background:#F8FAFB} ci-dessus suffit comme retour visuel. */
  body > .elementor-nav-menu--dropdown .elementor-item::before,
  body > .elementor-nav-menu--dropdown .elementor-item::after{
    background:transparent !important;
    border-color:transparent !important;
  }
  /* État "page active" natif Elementor (9 sept 2026) — DIFFÉRENT du
     "Pointer Effect" ci-dessus : ici c'est un vrai fond posé directement
     sur le lien (pas un ::before/::after) via la classe
     `.elementor-item-active` (posée par Elementor/WordPress quand le lien
     correspond à la page/catégorie couramment affichée — `current-menu-
     item` sur le <li>), même couleur sombre `rgb(63,68,75)` que le
     Pointer Effect. Repéré par Ilich sur la page catégorie "VoIP" — le
     lien "VoIP" avait ce fond sombre en permanence (pas juste au survol),
     texte gris foncé sur fond gris très foncé, à peine lisible. Remplacé
     par le même traitement "actif" que la nav desktop (fond teinté clair,
     texte navy, gras) plutôt que de neutraliser complètement — l'indicateur
     "vous êtes ici" reste utile, juste pas dans les couleurs natives. */
  body > .elementor-nav-menu--dropdown a.elementor-item.elementor-item-active{
    background:rgba(33,29,109,0.07) !important;
    color:var(--ax-color-primary-500, #211D6D) !important;
    font-weight:600 !important;
  }

  /* ── Voile assombri/flouté derrière la sheet — CSS pur via :has(),
     aucun JS requis pour cette partie (contrairement au voile de
     recherche, plus haut, qui doit rester JS car il doit aussi masquer
     toute la pill — ici la pill reste visible, seul le contenu change) ── */
  body:has(#navigationMainMars2023 .elementor-menu-toggle.elementor-active)::after{
    content:'';
    position:fixed;
    inset:0;
    z-index:190;
    background:rgba(0,0,0,0.4);
    backdrop-filter:blur(5px);
    -webkit-backdrop-filter:blur(5px);
  }
  body:has(#navigationMainMars2023 .elementor-menu-toggle.elementor-active){
    overflow:hidden !important;
  }

  /* ── CTA "Démo SVI" épinglé en pied de sheet quand elle est ouverte
     (déplacé en enfant de body, voir plus haut + fonctionnalites.js) ── */
  body:has(#navigationMainMars2023 .elementor-menu-toggle.elementor-active) > .ax-btn.ax-btn-primary{
    display:flex !important;
    position:fixed !important;
    bottom:0 !important;
    left:0 !important;
    right:0 !important;
    z-index:210 !important;
    justify-content:center !important;
    padding:16px 16px max(20px, env(safe-area-inset-bottom)) !important;
    background:rgba(255,255,255,0.88) !important;
    backdrop-filter:blur(0.75rem) !important;
    -webkit-backdrop-filter:blur(0.75rem) !important;
    margin:0 !important;
  }
  body:has(#navigationMainMars2023 .elementor-menu-toggle.elementor-active) > .ax-btn.ax-btn-primary .elementor-button{
    width:100% !important;
    max-width:400px !important;
    padding:16px 32px !important;
  }
}

/* ── Bouton "Démo SVI" (widget Elementor Button) ──────────────────────
   Piège Elementor : le champ "Classes CSS" du widget Bouton pose la classe
   sur le <div> wrapper du widget, PAS sur le <a class="elementor-button">
   qui est le vrai lien cliquable/visible. Nos règles .ax-btn génériques
   (dans axialys-elementor.css) stylent donc le mauvais élément.
   → On neutralise le wrapper et on réapplique le style ax-btn-primary
   directement sur le <a> réel, à l'intérieur. */
body.ax-scope .ax-btn.ax-btn-primary {
    background: none !important;
    border: none !important;
    box-shadow: none !important;
    padding: 0 !important;
    border-radius: 0 !important;
}
body.ax-scope .ax-btn.ax-btn-primary .elementor-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--ax-space-2);
    padding: 12px 24px;
    border-radius: var(--ax-radius-full);
    background: var(--ax-color-accent-500);
    color: var(--ax-color-neutral-0) !important;
    border: 2px solid transparent;
    font-family: var(--ax-font-body);
    font-size: var(--ax-font-size-sm);
    font-weight: var(--ax-font-weight-semibold);
    letter-spacing: 0.025em;
    line-height: 1;
    text-decoration: none !important;
    box-shadow: none;
    transition: all var(--ax-duration-fast) var(--ax-ease-standard);
}
body.ax-scope .ax-btn.ax-btn-primary .elementor-button:hover {
    background: var(--ax-color-accent-600);
    border-color: var(--ax-color-accent-600);
}
/* Même piège à prévoir pour tout futur bouton Elementor marqué ax-btn-* :
   dupliquer ce pattern (neutraliser le wrapper, cibler .elementor-button). */


/* ───────────────────────────────────────────────────────────────────
 * 3 — CARDS ARTICLES (accueil, catégorie)
 * Widget natif Elementor Posts (skin classique). Structure DOM confirmée
 * en direct (4 sept 2026) :
 *   article.elementor-post.elementor-grid-item          ← la card entière
 *     └ div.elementor-post__card                         (display:flex, column)
 *         ├ a.elementor-post__thumbnail__link             (radius 20px déjà natif)
 *         │   └ div.elementor-post__thumbnail
 *         ├ div.elementor-post__badge                     (catégorie)
 *         └ div.elementor-post__text
 *             ├ h3.elementor-post__title > a
 *             └ div.elementor-post__excerpt > p + .rt-reading-time
 * Toutes ces classes sont générées par le widget natif (pas des ID hex
 * Elementor) → identiques sur preprod/prod, aucun réglage manuel BO requis
 * pour cette partie (contrairement au header). On habille l'article entier
 * en boîte (fond, bordure, radius, ombre) et le padding pousse l'image et
 * le texte uniformément vers l'intérieur, comme un cadre.
 * ─────────────────────────────────────────────────────────────────── */
body.ax-scope article.elementor-post{
  background:var(--ax-color-neutral-0, #fff) !important;
  border:1px solid rgba(66, 139, 254, 0.18) !important;
  border-radius:var(--ax-radius-xl, 16px) !important;
  box-shadow:0 2px 16px rgba(33, 29, 109, 0.05) !important;
  padding:var(--ax-space-6, 24px) !important;
  transition:box-shadow .22s cubic-bezier(.4,0,.2,1),
             transform .22s cubic-bezier(.4,0,.2,1),
             border-color .22s !important;
}
/* Radius de l'image interne — règle des "coins concentriques" (radius
   imbriqué = radius de la boîte englobante − son padding, plancher à 0) :
   avec un radius de carte de 16px et un padding de 24px, le padding dépasse
   déjà le radius extérieur → l'image se trouve entièrement au-delà de la
   zone courbée du coin de la carte, donc radius correct = max(0, 16-24) = 0.
   Remplace le radius natif du widget (20px sur le lien, 10px sur l'image),
   qui ne suivait pas cette règle et jurait visuellement avec le radius de
   la carte. Si le padding ou le radius de la carte change un jour, recalculer
   avec la même formule plutôt que de garder cette valeur figée. */
body.ax-scope article.elementor-post .elementor-post__thumbnail__link,
body.ax-scope article.elementor-post .elementor-post__thumbnail{
  border-radius:0 !important;
}
body.ax-scope article.elementor-post:hover{
  box-shadow:0 14px 36px rgba(33, 29, 109, 0.11), 0 3px 10px rgba(33, 29, 109, 0.07) !important;
  transform:translateY(-4px) !important;
  border-color:rgba(66, 139, 254, 0.35) !important;
}
/* Le lien du titre ne doit pas hériter d'un souligné générique */
body.ax-scope article.elementor-post .elementor-post__title a{
  text-decoration:none !important;
}

/* ── Typographie — alignée sur le design system (ax-as-h4 / ax-as-p-sm)
   du site principal, 4 sept 2026. Avant : HelveticaNeue, titre 22px/900
   noir-bleu (#282589), excerpt 18px noir pur — pas les mêmes valeurs que
   le site principal (SF Pro, échelle de tailles/couleurs définie dans
   tokens.css). Repris ici en dur (valeurs identiques à ax-as-h4/ax-as-p-sm
   dans axialys-elementor.css) plutôt que d'ajouter les classes ax-as-*
   dans Elementor (contrainte : pas de nouvelle classe sur les widgets). */
body.ax-scope article.elementor-post .elementor-post__title a{
  font-family:var(--ax-font-body) !important;
  font-size:16px !important; /* fixe (9 sept 2026), avant clamp(16px, 1.5vw, 20px) — demande d'Ilich */
  font-weight:600 !important;
  line-height:1.35 !important;
  letter-spacing:-0.005em !important;
  color:var(--ax-color-primary-500, #211D6D) !important;
}
body.ax-scope article.elementor-post .elementor-post__excerpt p{
  font-family:var(--ax-font-body) !important;
  font-size:var(--ax-font-size-sm, 14px) !important;
  font-weight:400 !important;
  line-height:var(--ax-line-height-normal, 1.5) !important;
  color:var(--ax-color-neutral-700, #495057) !important;
}

/* ── Tags/meta (catégorie + temps de lecture) — badges statut (8 sept 2026)
   Ilich veut que ces deux tags ressemblent aux "Badges statut" du design
   system (réf. preprod.axialys.com/compossants-axialys/, section "Badges
   & Tags") : catégorie en bleu (comme le badge "IA"), temps de lecture en
   vert (comme le badge "Actif"). Valeurs reprises À L'IDENTIQUE de ces
   deux badges (vérifiées en Computed Styles sur la page de référence, pas
   devinées depuis le CSS seul) : fond teinté 50, radius 9999px, padding
   5px 10px, texte 11px/500 — sauf qu'on garde nos icônes Tabler existantes
   (dossier/horloge, déjà pertinentes) plutôt que de les remplacer par
   celles du design system (cerveau/check), non demandé.
   Icône générée en Font Awesome via ::before à l'origine (confirmé en DOM :
   .elementor-post__badge::before = \f07c "folder-open", .rt-reading-time
   ::before = \f252 "hourglass-half"), remplacée par le glyphe Tabler
   correspondant (codepoints lus directement dans le fichier CSS Tabler
   réellement chargé, pas devinés — ti-folder \eaad, ti-clock \ea70). */
body.ax-scope article.elementor-post .elementor-post__badge,
body.ax-scope article.elementor-post .rt-reading-time{
  font-family:var(--ax-font-body) !important;
  font-size:11px !important;
  font-weight:500 !important;
  gap:6px !important;
  width:fit-content !important; /* sans ça le badge s'étire en pleine largeur (flex hérité du widget) */
  padding:5px 10px !important;
  border-radius:var(--ax-radius-full, 9999px) !important;
}
body.ax-scope article.elementor-post .elementor-post__badge *,
body.ax-scope article.elementor-post .rt-reading-time *{
  color:inherit !important;
  font-size:inherit !important;
  font-weight:inherit !important;
}
/* Catégorie — bleu, comme le badge "IA" du design system */
body.ax-scope article.elementor-post .elementor-post__badge{
  background:var(--ax-color-blue-50, #EFF5FF) !important;
  color:var(--ax-color-blue-500, #428BFE) !important;
}
body.ax-scope article.elementor-post .elementor-post__badge::before{
  font-family:"tabler-icons" !important;
  content:"\eaad" !important;
  font-weight:400 !important;
  font-size:14px !important;
  width:16px !important;
  height:16px !important;
  color:var(--ax-color-blue-500, #428BFE) !important;
  margin:0 !important; /* voir note double-espacement ci-dessous */
}
/* Temps de lecture — vert, comme le badge "Actif" du design system.
   Icône et texte n'ont PAS la même nuance de vert dans le design system
   original (icône success-500 plus vive, texte success-700 plus sombre
   pour la lisibilité) — reproduit tel quel plutôt qu'une seule couleur. */
body.ax-scope article.elementor-post .rt-reading-time{
  background:var(--ax-color-success-50, #F0FDF4) !important;
  color:var(--ax-color-success-700, #15803D) !important;
}
body.ax-scope article.elementor-post .rt-reading-time::before{
  font-family:"tabler-icons" !important;
  content:"\ea70" !important;
  font-weight:400 !important;
  font-size:14px !important;
  width:16px !important;
  height:16px !important;
  color:var(--ax-color-success-500, #22C55E) !important;
  margin:0 !important; /* voir note double-espacement ci-dessous */
}
/* Double espacement constaté (4 sept 2026) : le ::before natif d'Elementor
   porte SON PROPRE margin-right:10px (règle native du widget, jamais
   touchée par nos overrides précédents qui ne déclaraient pas margin), qui
   s'ADDITIONNAIT à notre gap:6px sur le conteneur flex → ~16px d'écart au
   lieu de 6px. Le margin:0 !important ci-dessus neutralise le natif, seul
   notre gap:6px régit l'espacement désormais. */

/* ── Largeur de contenu harmonisée à 1080px (4 sept 2026) ────────────
   Le template "Détail article" (elementor-location-single) est déjà à
   1080px nativement (réglage Elementor du template, pas touché). Le
   template "Archive" (accueil + pages catégorie, MÊME template Elementor,
   partagé) était à 1280px → ramené à 1080px pour cohérence entre les pages.
   Ciblage via :has() sur la section qui contient précisément le widget
   Posts, plutôt qu'un ID Elementor auto-généré (instable entre
   preprod/prod, cf. avertissement en tête de fichier) ou qu'une règle
   généraliste sur TOUTES les sections "boxed" du template (qui toucherait
   aussi le hero au-dessus, non demandé ici). elementor-location-archive
   est une classe stable posée par Elementor selon le type de template
   (pas un ID auto-généré) → safe preprod/prod. :has() supporté par tous
   les navigateurs modernes (Chrome/Edge/Safari 2023+, Firefox 121+). */
body.ax-scope .elementor-location-archive .elementor-section.elementor-section-boxed:has(.elementor-widget-archive-posts, .elementor-widget-posts) > .elementor-container{
  max-width:1080px !important;
}


/* ───────────────────────────────────────────────────────────────────
 * 4 — TAGS / META (catégorie, temps de lecture, auteur) — icônes Tabler
 * .elementor-post__badge (catégorie), .rt-reading-time (temps de lecture)
 * ─────────────────────────────────────────────────────────────────── */


/* ───────────────────────────────────────────────────────────────────
 * 5 — HEROS (bandeaux accueil / catégorie)
 * L'essentiel se fait sans code : classes ax-bg-soft / ax-bg-aurora +
 * ax-section dans le champ "Classes CSS" Elementor de la section
 * (cf. axialys-elementor.css).
 * ─────────────────────────────────────────────────────────────────── */

/* Utilitaire optionnel : à poser (Avancé > Classes CSS, dans Elementor)
   sur une section hero dont le fond doit remonter visuellement jusqu'en
   haut de l'écran, sous la pill flottante — comble le padding-top de
   body.ax-scope avec le fond propre de la section (gradient inclus) au
   lieu de laisser un espace neutre. Les deux valeurs (ici et sur
   body.ax-scope ci-dessous) doivent rester synchronisées. */
.ax-hero-bleed {
    margin-top: -100px;
    padding-top: 100px;
}


/* ───────────────────────────────────────────────────────────────────
 * 6 — DÉTAIL ARTICLE (sidebar sommaire, typographie)
 * .sommaire, .SommaireCustom, .elementor-toc*
 * ─────────────────────────────────────────────────────────────────── */

/* ── Sidebar sommaire — #ax-sommaire .sommaire (9 sept 2026). Le `ul`
   lui-même porte la classe .sommaire (pas de wrapper supplémentaire) —
   il avait une largeur FIXE (270px) plus large que son propre parent
   (218px, la colonne sidebar), un margin-top/bottom par défaut du
   navigateur (16px), et un border-left bleu marine hérité — passé en
   largeur fluide (100% du parent), marge et bordure retirées, taille
   de texte des items réduite. Décalage résiduel repéré par Ilich après
   coup (capture DevTools à l'appui) : padding-left natif de 40px
   (comportement par défaut du navigateur pour un `<ul>`, jamais
   touché jusque-là), qui poussait le texte des items nettement plus à
   droite que le titre "Sommaire" juste au-dessus — réduit à 20px pour
   aligner visuellement les puces avec le titre (mesuré en live : le
   titre démarre à ~22px du bord gauche du `ul`). */
#ax-sommaire .sommaire{
  width:100% !important;
  margin:0 !important;
  border-left:none !important;
  padding-left:20px !important;
}
#ax-sommaire .sommaire li{
  font-size:14px !important;
}

/* ── Masquer #ax-sommaire quand il est vide (9 sept 2026). sommaire.js
   (PRÉ-EXISTANT) ne remplit le `<ul class="sommaire">` que s'il trouve
   au moins un h2 dans le contenu de l'article — sans h2 (cas des
   articles courts/vidéo), le `<ul>` reste vide mais la boîte
   #ax-sommaire (titre "Sommaire" + son cadre) restait affichée, vide.
   Le script a bien une tentative de masquage existante ($titleContainer
   .hide() sur `.titreSommaire`) mais ce sélecteur ne matche AUCUN
   élément réel du DOM (vérifié en live), donc ne fait rien — plutôt que
   corriger ce sélecteur mort côté JS, la boîte entière est masquée en
   CSS via :has(), plus robuste (fonctionne même si la structure interne
   change) et sans dépendance à ce bout de JS. .sommaire correspond
   véritablement à :empty ici (contrairement au conteneur vidé de son
   iframe plus bas, qui garde des nœuds de texte blancs résiduels du
   HTML source — `.sommaire`, lui, est peuplé en JS via `.append()`,
   sans un tel résidu). */
#ax-sommaire:has(.sommaire:empty){
  display:none !important;
}

/* ── Accordéon "Derniers articles" — sidebar (9 sept 2026). Ilich
   remonte 2 points : fermeture/ouverture qui décale le texte à
   l'intérieur (peu fluide), et une couleur de fond indésirable sur les
   articles.
   (1) `.elementor-tab-content` (widget Accordéon natif d'Elementor)
   était en overflow:visible au repos — pendant l'animation JS
   (jQuery slideUp/slideDown, propre à Elementor, pas dans nos
   fichiers), le contenu pouvait donc apparaître non "coupé" par la
   hauteur en cours d'animation plutôt que révélé progressivement,
   d'où l'effet de texte qui "saute" au lieu de glisser. Forcé en
   overflow:hidden en permanence : le contenu reste toujours cadré par
   la hauteur réelle de la boîte, animée ou non.
   (2) Fond lavande (`rgb(247,247,255)`) trouvé à 2 endroits distincts
   (pas le même élément que (1)) : sur `.eael-post-block-grid` (le
   conteneur de la liste, widget "Post Block" du plugin Essential
   Addons for Elementor) ET sur `.eael-entry-title` (le titre de
   CHAQUE article, d'où la bande visible derrière chaque lien) — les
   deux définis dans style.css natif, jamais touchés. Sélecteurs
   stables utilisés (classes génériques du plugin, pas d'ID Elementor
   auto-généré instable). Un seul accordéon "Derniers articles" existe
   actuellement sur le blog (vérifié en DOM) — traité sans restriction
   supplémentaire de scope. */
body.ax-scope .elementor-accordion .elementor-tab-content{
  overflow:hidden !important;
}
body.ax-scope .eael-post-block-grid,
body.ax-scope .eael-post-block .eael-entry-title{
  background:none !important;
}

/* ── .ax-accordeonArticles (9 sept 2026) — classe utilitaire à poser
   dans Elementor sur le widget Accordéon "Derniers articles" (même
   principe que .ax-SidebarBlog juste au-dessus : pas encore posée
   dans le DOM au moment de l'écriture, pas testée en live). Complète
   le fix du 9 sept 2026 plus haut (overflow:hidden + fond retiré sur
   .eael-post-block-grid/.eael-entry-title) : largeur pleine du contenu
   de l'accordéon, et fond de chaque `<article>` (`.eael-post-block-
   item`, actuellement blanc — invisible sur fond blanc mais pas
   transparent) rendu explicitement transparent. */
.ax-accordeonArticles .elementor-tab-content{
  width:100% !important;
}
.ax-accordeonArticles .elementor-tab-content article{
  background:transparent !important;
}

/* ── .ax-SidebarBlog (9 sept 2026) — classe utilitaire posée par Ilich
   dans Elementor (Avancé > Classes CSS) sur le conteneur de la
   sidebar, espace les blocs (Sommaire, bannière, Derniers articles…)
   de 30px. Ilich a confirmé la classe posée (`e-flex e-con e-child
   ax-SidebarBlog`) mais sans effet visible — `gap:30px` sans
   !important ne suffisait pas : Elementor pose sa propre règle,
   `.elementor-element:where(.e-con-full, .elementor-widget){ gap:
   var(--row-gap) var(--column-gap) }` (frontend.min.css), avec la
   MÊME spécificité que notre classe seule (`:where()` compte pour une
   spécificité nulle par conception, donc seul `.elementor-element`
   compte, à égalité avec `.ax-SidebarBlog`) — à spécificité égale,
   c'est l'ordre de chargement qui décide, et cette règle native gagne.
   `!important` ajouté pour trancher sans ambiguïté, peu importe
   l'ordre des fichiers. Testé en live avant écriture (`getComputedStyle`
   confirmant gap/row-gap/column-gap à 30px, zoom confirmant l'espacement
   visuel entre Sommaire / bannière replay / Derniers articles). */
.ax-SidebarBlog{
  gap:30px !important;
}

/* ── Image de couverture (9 sept 2026) ──────────────────────────────
   #thumbCover / #thumbCover-Tags / .thumbCover-Titre / .thumbCover-
   MetaDatas : structure ET positionnement (position:relative sur
   #thumbCover, position:absolute+bas sur #thumbCover-Tags, flex
   space-between sur .thumbCover-MetaDatas, titre déjà blanc) DÉJÀ posés
   par Ilich côté Elementor (Atomic containers) — seul le fond du bandeau
   et la couleur du texte des metadata manquaient, sur inspiration d'un
   rendu Figma (photo + bandeau sombre flouté en bas, nom+date à gauche,
   tag à droite). Widgets réels dans .thumbCover-MetaDatas : Post Info
   "auteur" (avatar+nom) à gauche, Post Info "date de publication" à
   droite — pas de 3ᵉ tag "catégorie" dans ce bloc précis, mais l'agen-
   cement en miroir reste identique à la référence. */
/* Élévation type "card articles" (9 sept 2026) — Ilich veut le même
   radius/ombre/hover que les cards de l'accueil (article.elementor-post,
   voir section 3 plus haut) sur l'image de couverture ET, plus largement,
   sur toute image qui recevrait la classe réutilisable .cardImage-
   elevation (à poser dans Elementor, onglet Avancé > Classes CSS, sur
   n'importe quel widget image souhaité — aucune limite à #thumbCover).
   Étendu le même jour à TOUTES les images du corps d'article
   (.postPage-descPage img) — pas besoin de poser la classe une par une
   sur chaque image insérée dans l'éditeur de contenu, contrairement aux
   images de widgets Elementor (où seule .cardImage-elevation, posée à
   la main, cible l'image voulue). Valeurs IDENTIQUES à
   article.elementor-post (à resynchroniser manuellement si l'une des
   deux change un jour, pas de mixin possible en CSS brut) — SAUF
   background/padding, non pertinents pour une image pleine largeur (pas
   une boîte de contenu blanche). `overflow:hidden` nécessaire : sans
   lui, l'image et #thumbCover-Tags (position:absolute, ancré en bas)
   dépasseraient des coins arrondis au lieu d'y être découpés. */
#thumbCover,
.cardImage-elevation,
.postPage-descPage img{
  border-radius:var(--ax-radius-xl, 16px) !important;
  overflow:hidden !important;
  border:1px solid rgba(66, 139, 254, 0.18) !important;
  box-shadow:0 2px 16px rgba(33, 29, 109, 0.05) !important;
  transition:box-shadow .22s cubic-bezier(.4,0,.2,1),
             transform .22s cubic-bezier(.4,0,.2,1),
             border-color .22s !important;
}
#thumbCover:hover,
.cardImage-elevation:hover,
.postPage-descPage img:hover{
  box-shadow:0 14px 36px rgba(33, 29, 109, 0.11), 0 3px 10px rgba(33, 29, 109, 0.07) !important;
  transform:translateY(-4px) !important;
  border-color:rgba(66, 139, 254, 0.35) !important;
}
#thumbCover-Tags{
  background:rgba(33, 29, 109, 0.45) !important; /* teinte navy marque (9 sept 2026) au lieu de noir pur */
  backdrop-filter:blur(12px) !important;
  -webkit-backdrop-filter:blur(12px) !important;
  z-index:4 !important; /* 9 sept 2026 — passe devant le poster image posé sur
    les articles vidéo (.elementor-widget-theme-post-featured-image img,
    z-index:2, plus bas) : #thumbCover-Tags n'avait jamais eu besoin de
    z-index explicite jusqu'ici (aucun autre élément absolute ne se
    disputait la même zone), donc restait à "auto" — un poids plus faible
    qu'un z-index explicite positif, le bandeau se retrouvait peint
    EN DESSOUS du poster, invisible. */
}
.thumbCover-MetaDatas .elementor-icon-list-item,
.thumbCover-MetaDatas .elementor-icon-list-item *{
  color:rgba(255,255,255,0.9) !important;
}

/* ── Image de couverture cassée sur les articles avec vidéo (9 sept
   2026) — RÉGRESSION causée par l'élévation ci-dessus (overflow:hidden
   sur #thumbCover, ajoutée le même jour). Sur les articles dont le
   contenu contient une vidéo intégrée, assets/js/sommaire.js (script
   `glossaire_script` chargé par functions.php, PRÉ-EXISTANT, pas écrit
   par nous) détecte un <iframe> dans le widget "Contenu de la
   publication" et le déplace dans le widget "Image à la une"
   (.elementor-widget-theme-post-featured-image), après avoir masqué
   l'<img> — logique voulue : afficher la vidéo à la place de l'image
   en tête d'article.
   Avant notre overflow:hidden, l'iframe (450px de haut, dans le flux
   normal, SIBLING du conteneur de l'image plutôt que superposé) débordait
   sous #thumbCover mais restait visible, juste mal positionné. Avec
   overflow:hidden, il est désormais quasi entièrement DÉCOUPÉ — header
   visuellement vide, régression constatée par Ilich sur l'article
   "Une Histoire d'Expérience" (enquête DOM en direct : <img>
   effectivement display:none et bien chargée, <iframe> effectivement
   déplacée et avec une source valide — le problème n'était ni le script
   ni les données, uniquement la mise en page).
   Cause racine plus profonde : l'<img> (display:none, donc sans boîte
   rendue) ne fournit plus aucune hauteur intrinsèque à #thumbCover une
   fois masquée — la hauteur du bandeau ne tenait alors QUE parce que
   l'iframe, dans le flux normal, en fournissait une par accident (à
   404px de la vraie zone visible, d'où le découpage).
   Fix : #thumbCover reçoit un aspect-ratio fixe UNIQUEMENT quand un tel
   iframe est présent (sélecteur :has(), pas de dépendance à une classe
   ajoutée en JS) — n'affecte donc AUCUN article sans vidéo (vérifié en
   live : rect de #thumbCover strictement identique avant/après sur un
   article sans vidéo). L'iframe est ensuite positionnée en absolute,
   calée sur cette boîte (comme le serait l'image avec object-fit),
   plutôt que dans le flux — retrouve l'intention initiale du script :
   la vidéo occupe exactement la même zone que l'image qu'elle
   remplace. Testé en live avant écriture (zoom confirmant la vidéo
   bien visible et cadrée, #thumbCover-Tags toujours lisible par-dessus). */
#thumbCover:has(.elementor-widget-theme-post-featured-image iframe){
  aspect-ratio:16 / 9 !important;
}
#thumbCover:has(.elementor-widget-theme-post-featured-image iframe) .elementor-widget-theme-post-featured-image{
  position:relative !important;
  height:100% !important;
}
#thumbCover:has(.elementor-widget-theme-post-featured-image iframe) .elementor-widget-theme-post-featured-image .elementor-widget-container{
  height:100% !important;
}
.elementor-widget-theme-post-featured-image iframe{
  position:absolute !important;
  inset:0 !important;
  width:100% !important;
  height:100% !important;
}

/* ── Bandeau #thumbCover-Tags masqué au clic dans la vidéo (9 sept
   2026). Une fois la vidéo lancée en tête d'article, le bandeau
   (titre + auteur/date, posé par-dessus l'image de couverture) gênait
   la lecture. `.ax-video-playing` est ajoutée sur #thumbCover par
   assets/js/sommaire.js (voir ce fichier — détection du focus qui
   entre dans l'iframe, seul moyen fiable de savoir qu'on a cliqué
   DANS un iframe cross-origin YouTube). Glissé vers le bas + fondu :
   #thumbCover a déjà overflow:hidden (élévation type card, plus
   haut), donc translateY(100%) fait sortir le bandeau par le bas et
   il se retrouve proprement découpé par ce même overflow, sans
   dépasser du cadre arrondi. */
#thumbCover-Tags{
  transition:transform .5s cubic-bezier(.4,0,.2,1),
             opacity .5s cubic-bezier(.4,0,.2,1) !important;
}
#thumbCover.ax-video-playing #thumbCover-Tags{
  transform:translateY(100%) !important;
  opacity:0 !important;
  pointer-events:none !important;
}

/* ── Vide laissé par la vidéo déplacée hors de sa place d'origine (9
   sept 2026). sommaire.js déplace l'<iframe> (voir plus haut) mais ne
   supprime pas son conteneur d'origine — un bloc "Embed" natif de
   l'éditeur WordPress (<figure class="wp-block-embed ...">), dont le
   wrapper interne (.wp-block-embed__wrapper) réserve une hauteur fixe
   via le ratio d'aspect natif de WordPress (padding-top en %, calé
   sur wp-embed-aspect-16-9), même une fois vidé de son iframe — d'où
   un espace blanc de la taille de la vidéo à l'endroit où elle avait
   été insérée dans le contenu. Masqué via :not(:has(iframe)) — cible
   UNIQUEMENT le bloc embed devenu vide (donc seulement après le
   déplacement par le script), pas de dépendance à une classe ajoutée
   en JS, ni de risque de masquer un embed resté en place ailleurs sur
   le site. */
.elementor-widget-theme-post-content figure.wp-block-embed.is-type-video:not(:has(iframe)){
  display:none !important;
}

/* ── Image de couverture en poster sur la vidéo (9 sept 2026). Sur
   certaines vidéos, la miniature YouTube par défaut (première image
   de la vidéo) est peu engageante — Ilich demande d'afficher plutôt
   l'image de couverture de l'article PAR-DESSUS la vidéo tant qu'elle
   n'est pas lancée, puis la masquer au clic — comme le bandeau
   #thumbCover-Tags juste au-dessus. Conditions demandées : UNIQUEMENT
   sur les articles avec vidéo, ET uniquement s'il existe une vraie
   image de couverture. Scope via `[data-elementor-type="single-post"]
   .has-post-thumbnail` — attribut/classe stables posés par Elementor/
   WordPress eux-mêmes sur le wrapper de l'article (pas un ID
   auto-généré instable), présent UNIQUEMENT quand l'article a une
   image à la une réellement définie.
   L'<img>, masquée en display:none INLINE par sommaire.js (voir plus
   bas), est réaffichée ici avec !important (une règle CSS !important
   bat toujours un style inline, contrairement à une règle CSS normale)
   et repositionnée en absolute par-dessus l'iframe (z-index supérieur),
   object-fit:cover pour remplir le cadre.
   Icône YouTube ::after (Tabler ti-brand-youtube) posée puis RETIRÉE
   le même jour : Ilich a remonté que les images de couverture des
   articles vidéo ont déjà, la plupart du temps, un bouton play
   incrusté directement dans le visuel — l'icône ajoutée en CSS faisait
   doublon, retirée pour alléger.
   `pointer-events:none` sur l'image — volontaire : un clic sur le
   poster doit ATTEINDRE l'iframe YouTube en dessous (sinon la vidéo ne
   se lancerait jamais au clic sur le poster). C'est d'ailleurs ce même
   clic, qui atteint bien l'iframe et y déplace le focus, qui déclenche
   `.ax-video-playing` (détection par `blur`, voir plus haut) — aucun
   JS supplémentaire nécessaire pour masquer ce poster, il réagit à la
   même classe que le bandeau. Testé en live avant écriture (clic réel
   sur le poster : la vidéo démarre — 0:02/2:05 affiché — ET le poster
   disparaît en fondu). */
[data-elementor-type="single-post"].has-post-thumbnail #thumbCover:has(.elementor-widget-theme-post-featured-image iframe) .elementor-widget-theme-post-featured-image img{
  display:block !important;
  position:absolute !important;
  inset:0 !important;
  width:100% !important;
  height:100% !important;
  object-fit:cover !important;
  z-index:2 !important;
  transition:opacity .5s ease !important;
  pointer-events:none !important;
}
#thumbCover.ax-video-playing .elementor-widget-theme-post-featured-image img{
  opacity:0 !important;
}

/* ── #postPage-Content .rt-reading-time — bug hérité neutralisé (9 sept
   2026). La têtière décorative et la mise en forme des 2 badges
   (capsule, couleurs, icônes Tabler) posées le même jour ont été
   retirées à la demande d'Ilich — tags "Service client"/"7 minutes"
   repassés à leur affichage natif. Seule cette règle reste : sans elle,
   le badge temps de lecture réapparaît visuellement "empilé" sous la
   catégorie — pas un choix esthétique mais un vrai bug de mise en page
   (l'ancienne règle .Test ...rt-reading-time de style.css, natif, non
   touché, pose margin-top:5px/margin-bottom:80px pensés pour un tout
   autre contexte d'affichage du plugin — 85px de marge invisible qui
   gonflait la boîte du badge). */
#postPage-Content .rt-reading-time{
  margin:0 !important;
}

/* ── Têtière décorative — .fakeHat (9 sept 2026). Sur inspiration d'une
   maquette Figma : 2 points en haut de la structure de la page. Ilich a
   posé un élément dédié et vide dans Elementor (classe .fakeHat, un
   e-div-block Atomic Elementor) juste avant .postPage-header — pas
   besoin de 2 éléments distincts pour les 2 points : un seul élément
   suffit, les 2 points sont 2 calques de fond (radial-gradient) posés
   à gauche/droite. Fond direct sur l'élément (pas en ::before) — même
   piège que la 1ère tentative de têtière (retirée depuis) : un
   container Atomic Elementor (.e-con) réserve déjà son propre ::before
   en interne, un ::before à nous n'y réserverait aucun espace. */
#postPage-Content .fakeHat{
  background-image:
    radial-gradient(circle, #B7B7B7 4px, transparent 4.5px),
    radial-gradient(circle, #B7B7B7 4px, transparent 4.5px);
  background-repeat:no-repeat;
  background-position: left 20px center, right 20px center;
  background-size: 8px 8px, 8px 8px;
}

/* ── Icônes + texte de .postPage-header en gris neutre (9 sept 2026).
   Concerne l'icône catégorie (SVG Tabler natif posé par Ilich dans
   Elementor, stroke="currentColor") — un simple color sur le
   conteneur suffit à la recolorer. L'icône temps de lecture (générée
   par le plugin Reading Time WP, pas un SVG) est traitée séparément
   plus bas : elle a son propre glyphe à swapper, pas juste une
   couleur à hériter. */
#postPage-Content .postPage-header,
#postPage-Content .postPage-header *{
  color:var(--ax-color-neutral-600, #868E96) !important;
}

/* ── Taille de police + écart icône/texte + alignement vertical,
   identiques sur les 2 items catégorie/temps de lecture (9 sept 2026).
   .categorie était déjà align-items:center nativement, mais
   .rt-reading-time était align-items:normal (donc étiré, pas centré)
   — les deux forcés à center pour un alignement identique. Gaps
   distincts : .categorie garde gap:6px (son icône n'a plus de marge
   propre, voir plus bas — l'écart dépend donc entièrement du gap).
   .rt-reading-time passe à gap:0 (9 sept 2026, demande d'Ilich) : son
   icône est un ::before qui gère SON PROPRE espacement via son
   padding-right (voir plus bas), le gap du conteneur ferait double
   emploi ; l'espacement entre libellé/nombre/suffixe est repris par le
   padding de .rt-time (idem, plus bas). */
#postPage-Content .postPage-header .categorie li.elementor-icon-list-item{
  display:flex !important;
  align-items:center !important;
  gap:6px !important;
}
#postPage-Content .postPage-header .rt-reading-time{
  display:flex !important;
  align-items:center !important;
  gap:0 !important;
}
#postPage-Content .postPage-header .categorie .elementor-icon-list-text,
#postPage-Content .postPage-header .rt-reading-time{
  font-size:12px !important;
}
/* Double espacement constaté (9 sept 2026, même piège que le 4 sept sur
   les cards — voir section 3) : l'icône catégorie porte SON PROPRE
   margin-right:7px natif et le texte catégorie SON PROPRE
   padding-left:5px natif, qui s'ADDITIONNENT à notre gap:6px → ~13-18px
   d'écart au lieu de 6px. Neutralisés à 0 pour que seul notre gap:6px
   régisse l'espacement. */
#postPage-Content .postPage-header .categorie .elementor-icon-list-icon{
  margin:0 !important;
}
#postPage-Content .postPage-header .categorie .elementor-icon-list-text{
  padding:0 !important;
}
/* .rt-time portait un padding natif 0 3px, neutralisé à 0 plus haut
   (quand l'espacement dépendait encore du gap:6px du conteneur) — avec
   gap:0 (ci-dessus), il faut désormais UN espacement propre à cet
   élément pour séparer libellé/nombre/suffixe, sinon tout se retrouve
   collé ("Temps de lecture :7minutes", constaté en live). Remis à
   0 4px, valeur testée en live pour rester visuellement cohérent avec
   le padding-right:5px de l'icône ci-dessous. */
#postPage-Content .postPage-header .rt-time{
  padding:0 4px !important;
}

/* ── Icônes SVG Tabler "remplies" au lieu d'outline (9 sept 2026).
   Ilich a uploadé des SVG Tabler style "outline" (fill="none",
   stroke="currentColor") pour les icônes dossier/calendrier des
   widgets Post Info — mais elles s'affichaient pleines (silhouette
   solide) au lieu de leur contour prévu. Cause trouvée en listant
   toutes les règles CSS matchant l'élément avec la propriété fill :
   Elementor pose par défaut, sur SON PROPRE fichier CSS compilé par
   template (post-XXXX.css), .elementor-widget-post-info
   .elementor-icon-list-icon svg{fill:var(--e-global-color-primary)} —
   un remplissage pensé pour un jeu d'icônes "filled" par défaut, qui
   écrase le fill="none" posé en attribut HTML sur le SVG lui-même (un
   attribut de présentation perd toujours face à une règle CSS, même
   sans !important côté attribut). Neutralisé site-wide (n'importe quel
   widget Post Info avec une icône SVG dans ax-scope), pas seulement sur
   l'article détail — la même icône calendrier apparaît aussi sur
   #thumbCover-Tags (image de couverture). */
body.ax-scope .elementor-widget-post-info .elementor-icon-list-icon svg{
  fill:none !important;
}

/* ── Icône + libellé du temps de lecture — [rt_reading_time] (9 sept
   2026). 2 correctifs distincts.
   (1) Ilich a posé le shortcode avec
   [rt_reading_time label="Temps de lecture :" postfix="minutes"
   postfix_singular="minute"] mais le libellé "Temps de lecture :"
   n'apparaissait pas malgré sa présence bien réelle dans le DOM
   (`.rt-label.rt-prefix`, vérifié) — cause : une règle native de
   style.css, `.single-post .rt-label.rt-prefix{display:none}`, pensée
   pour masquer ce libellé quand le compteur s'affiche en bas d'un
   excerpt de card (contexte différent, pas gênant là-bas) mais qui
   s'applique aussi à notre usage manuel du shortcode ici, sur la même
   page single-post.
   (2) Glyphe forcé en Tabler `ti-clock-hour-5` (codepoint lu directement
   dans le fichier CSS réellement chargé, pas deviné : `\f31a`) — la
   même ancienne règle `.Test .elementor-element .elementor-widget-
   container .rt-reading-time::before` (style.css, 4 classes +
   !important, jamais touchée) impose encore le glyphe Font Awesome par
   défaut ; neutralisée via l'ancrage #postPage-Content (ID, toujours
   plus spécifique que n'importe quelle combinaison de classes), même
   technique déjà utilisée pour ce même piège plus tôt dans le projet.
   Padding de cette même ancienne règle (`0px 11px 0px 0px`, l'espace
   natif entre l'icône et le libellé qui suit) réduit à `0px 5px 0px
   0px` (9 sept 2026, demande d'Ilich) — repris explicitement ici,
   pas neutralisé à 0, car avec gap:0 sur le conteneur (voir plus haut)
   c'est maintenant ce padding qui régit entièrement l'écart icône ↔
   libellé. */
#postPage-Content .rt-label.rt-prefix{
  display:inline !important;
}
#postPage-Content .rt-reading-time::before{
  font-family:"tabler-icons" !important;
  content:"\f31a" !important;
  font-weight:400 !important;
  font-size:14px !important;
  color:var(--ax-color-neutral-600, #868E96) !important;
  padding:0px 5px 0px 0px !important;
}

/* ── Typographie du corps d'article — .postPage-descPage (9 sept 2026) */
#postPage-Content .postPage-descPage h2{
  padding-top:50px;
  font-weight:400;
}
#postPage-Content .postPage-descPage h3{
  font-size:20px;
}


/* ───────────────────────────────────────────────────────────────────
 * 7 — FOOTER
 * ─────────────────────────────────────────────────────────────────── */


/* ───────────────────────────────────────────────────────────────────
 * 8 — PAGE 404
 * ─────────────────────────────────────────────────────────────────── */


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

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