/* ==========================================================================
   GIFR - Feuille d'adaptation Divi 5.9

   Divi enveloppe chaque module dans ses propres conteneurs et leur applique
   des marges, des largeurs et des paddings par defaut. Cette feuille
   reconcilie le DOM de Divi avec celui de la maquette.

   Elle a deux moities :

   PARTIE A, heritee de la version 1 a shortcodes. Elle cible .gi-block et ne
   sert plus qu'aux pages pas encore reprises en modules natifs. A supprimer
   quand plus aucune page ne contient de module Code GIFR.

   PARTIE B, Divi 5 natif. C'est la partie vivante. Regle generale : la
   maquette sort des <ul>/<li>/<a>, Divi ne sort que des <div> avec ses
   propres enveloppes. Les selecteurs d'enfant direct doivent donc devenir
   des selecteurs de descendance, et .et_pb_text_inner doit sortir du flux.
   ========================================================================== */

/* ==========================================================================
   PARTIE A - HERITAGE SHORTCODES (a supprimer a terme)
   ========================================================================== */

/* --- La section Divi devient un simple conteneur transparent --- */
.et_pb_section.gi-block {
  padding: 0 !important;
  margin: 0 !important;
  background: transparent !important;
}

/* --- La ligne aussi, si vous utilisez une section standard plutot que
       pleine largeur. Avec [et_pb_fullwidth_code] il n'y a pas de ligne. --- */
.gi-block .et_pb_row {
  width: 100% !important;
  max-width: 100% !important;
  padding: 0 !important;
  margin: 0 !important;
}
.gi-block .et_pb_column { padding: 0 !important; margin: 0 !important; }
.gi-block .et_pb_module { margin-bottom: 0 !important; }

/* --- Divi met une marge sous le dernier module d'une colonne --- */
.gi-block .et_pb_column .et_pb_module:last-child { margin-bottom: 0 !important; }

/* --- Le module Code enveloppe son contenu dans deux div inutiles.
       On les rend transparentes a la mise en page. --- */
.gi-block .et_pb_code_inner,
.gi-block .et_pb_fullwidth_code {
  padding: 0 !important;
  margin: 0 !important;
}

/* --------------------------------------------------------------------------
   Conflits connus avec les styles globaux de Divi
   -------------------------------------------------------------------------- */

/* Divi force une hauteur de ligne et une couleur sur #main-content.
   Nos sections reprennent la main. */
#main-content .gi-hero,
#main-content .gi-section,
#main-content .gi-cta { color: var(--gi-text); }

/* Divi applique box-sizing: border-box partout, ce qui nous va, mais il
   remet aussi des styles de liste sur ul et ol dans le contenu. */
.gi-block ul,
.gi-block ol { list-style: none !important; padding: 0 !important; margin: 0 !important; }
.gi-block li { list-style: none !important; }

/* Divi ajoute une transition et un survol par defaut sur les liens du
   contenu. Nos composants gerent les leurs. */
.gi-block a { transition: none; }
.gi-block .gi-btn,
.gi-block .gi-tool,
.gi-block .gi-post__link,
.gi-block .gi-db { transition: revert-layer; }

/* Les images de Divi heritent d'un max-width et d'un vertical-align qui
   cassent object-fit dans les vignettes. */
.gi-block .gi-thumb img {
  max-width: none !important;
  vertical-align: initial !important;
}

/* --------------------------------------------------------------------------
   Constructeur visuel
   Dans le Builder, les blocs sont rendus dans une iframe et le survol est
   capte par Divi. On coupe les particules de survol pour ne pas gener
   l'edition, et on rend les apparitions au scroll immediates.
   -------------------------------------------------------------------------- */
.et-fb .gi-fx { display: none !important; }
.et-fb .gi-reveal { opacity: 1 !important; transform: none !important; }

/* ==========================================================================
   VARIANTE « MODULES DIVI NATIFS »

   Le hero et l'appel communaute peuvent se monter en vrais modules Divi,
   editables au clic dans le Builder, plutot qu'en un seul module Code.
   Ce bloc fait cohabiter les deux mondes.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Le decor doit se caler sur la SECTION, pas sur la ligne Divi

   .gi-hero__media est en position absolue avec inset:0. Son bloc conteneur
   est le premier ancetre positionne. Or Divi met position:relative sur ses
   lignes et ses colonnes : sans la regle ci-dessous, le decor se calerait sur
   la ligne et laisserait le reste de la section nu.

   Le decor etant en z-index -1 et la section en isolation:isolate, le contenu
   repasse au-dessus tout seul, sans avoir a empiler des z-index.
   -------------------------------------------------------------------------- */
/* ATTENTION : ne jamais remettre .et_pb_module dans cette liste. Le bouton
   compte sur son position: relative pour caler son balayage lumineux, et un
   position: static le ferait se dimensionner sur la section entiere. */
.gi-hero.et_pb_section .et_pb_row,
.gi-hero.et_pb_section .et_pb_column,
.gi-hero.et_pb_section .et_pb_code_inner,
.gi-cta.et_pb_section .et_pb_row,
.gi-cta.et_pb_section .et_pb_column,
.gi-cta.et_pb_section .et_pb_code_inner { position: static; }

/* ET LA MEME REGLE, AU RANG DE DIVI.

   Le 3 aout 2026, la regle du vignettage plus bas dans ce fichier a pose
   `position: relative` sur les lignes de toute section `.gi-vignette*`, depuis
   un selecteur a identifiant. Le hero porte `gi-vignette--soft` : sa ligne est
   redevenue positionnee, le key visual s'est cale dessus, et le decor qui
   devait remplir la section s'est arrete au bord de la ligne. Mesure : le
   module de decor faisait 1338 px de large dans une section de 2545.

   Une regle a trois classes ne peut pas battre `.et-db #et-boc .et-l`. Celle
   ci-dessus reste pour la maquette autonome ; celle-ci la double au rang de
   Divi. Voir la note « Divi peint depuis un selecteur a identifiant ». */
.et-db #et-boc .et-l .gi-hero.et_pb_section .et_pb_row,
.et-db #et-boc .et-l .gi-hero.et_pb_section .et_pb_column,
.et-db #et-boc .et-l .gi-hero.et_pb_section .et_pb_code_inner,
.et-db #et-boc .et-l .gi-cta.et_pb_section .et_pb_row,
.et-db #et-boc .et-l .gi-cta.et_pb_section .et_pb_column,
.et-db #et-boc .et-l .gi-cta.et_pb_section .et_pb_code_inner { position: static; }

/* LE VOILE DE VIGNETTAGE DESCEND AU RANG DU DECOR sur ces deux sections.
   Ailleurs, c'est la ligne qui remonte au-dessus du voile ; ici elle ne peut
   pas, elle doit rester statique. Le voile passe donc en rang negatif : il
   couvre le decor, qui est au meme rang mais avant lui dans l'ordre du
   document, et il reste sous le contenu, qui n'est pas positionne. */
.gi-hero.gi-vignette::after,
.gi-hero.gi-vignette--soft::after,
.gi-hero.gi-vignette--deep::after,
.gi-cta.gi-vignette::after,
.gi-cta.gi-vignette--soft::after,
.gi-cta.gi-vignette--deep::after { z-index: -1; }

/* Le module Code qui porte le decor ne doit occuper aucune place. */
.gi-hero .et_pb_code,
.gi-cta .et_pb_code { margin: 0 !important; padding: 0 !important; }

/* --------------------------------------------------------------------------
   2. Gabarit du hero monte en modules
   -------------------------------------------------------------------------- */
.gi-hero.et_pb_section { padding: 0 !important; }

/* On vise la ligne et la colonne PAR LEUR CLASSE DIVI, pas par une classe
   qu'il faudrait penser a ajouter. En Divi 5 le champ « Classe CSS » a disparu
   au profit de Avance > Attributes > Add Attribute : c'est une manipulation de
   plus, donc une occasion d'oubli de plus. Seule la classe de la SECTION reste
   indispensable. Les classes gi-hero__row et gi-hero__content restent
   acceptees pour ceux qui les ont deja posees. */
.gi-hero .et_pb_row,
.gi-hero .gi-hero__row {
  width: 100% !important;
  max-width: var(--gi-container-wide) !important;
  margin-inline: auto !important;
  padding: 0 var(--gi-gutter) !important;
}
/* La largeur et le remplissage vertical du bloc de texte restent ceux de
   gi-accueil.css, qui les fait varier a quatre paliers (680 au-dela de 1600,
   620, 480, puis pleine largeur sous 860). Y toucher ici, meme sans
   !important, suffirait a tout figer : une regle en .gi-hero .et_pb_column
   pese plus lourd qu'une regle en .gi-hero__content. D'ou le :not(). */
.gi-hero .et_pb_column { float: none !important; }
.gi-hero .et_pb_column:not(.gi-hero__content) {
  max-width: 680px;
  padding-block: var(--sp-6);
}
.gi-hero .et_pb_text { margin-bottom: 0 !important; }
.gi-hero .et_pb_text p:last-child { padding-bottom: 0; }

/* Divi enveloppe chaque bouton dans un div bloc : ils s'empileraient. */
.gi-hero .et_pb_button_module_wrapper,
.gi-cta .et_pb_button_module_wrapper {
  display: inline-block !important;
  margin: 0 var(--sp-3) 0 0 !important;
}
/* Attention : :first-of-type et :last-of-type portent sur le TYPE d'element,
   pas sur la classe. Tous ces blocs etant des div, ces pseudo-classes
   designeraient le module Code et non le bouton. On passe donc par la
   relation de voisinage, qui elle est fiable. */
.gi-hero .et_pb_button_module_wrapper:last-child,
.gi-cta .et_pb_button_module_wrapper:last-child { margin-right: 0 !important; }
/* Divi ne sait pas creer de div enveloppante autour d'un groupe de modules.
   On marge donc le bouton qui suit directement un module Texte. */
.gi-hero .et_pb_text + .et_pb_button_module_wrapper { margin-top: var(--sp-6) !important; }

/* --------------------------------------------------------------------------
   3. Un bouton Divi qui redevient un bouton GIFR

   Divi impose sa taille, sa bordure, son arrondi, et un ::after qui affiche
   une fleche de sa police d'icones. Notre ::after porte le balayage lumineux.
   Il faut donc reprendre la main explicitement, et avec !important, parce que
   Divi utilise lui-meme !important sur plusieurs de ces proprietes.
   -------------------------------------------------------------------------- */
.et_pb_button.gi-btn,
.et_pb_button.gi-btn:hover {
  --btn-cut: 12px;
  --gi-btn-pad: 0.88rem 1.65rem;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  gap: var(--sp-3);
  border: 0 !important;
  border-radius: 0 !important;
  font-family: var(--gi-font-display) !important;
  font-size: var(--fs-sm) !important;
  font-weight: 700 !important;
  line-height: 1.65 !important;
  letter-spacing: 0.085em !important;
  text-transform: uppercase;
}

/* Le remplissage passe par une variable, parce qu'il doit etre reecrit plus
   bas a tres haute specificite : autant ne le declarer qu'une fois par
   variante. */
/* LA TAILLE DE TEXTE FAISAIT PARTIE DES OUBLIS, et la mesure de la page
   d'attente l'a trouvee le 30/07/2026 : le bouton sortait 14,5 px plus large
   qu'en maquette a toutes les largeurs. La regle ci-dessus impose
   `font-size: var(--fs-sm) !important` a tout `.gi-btn`, ce qui ecrase le
   `font-size` que gi-tokens.css donne aux variantes -- (0,2,0) avec !important
   contre (0,1,0). Les deux variantes reprennent donc la main au meme niveau,
   exactement comme elles le font deja pour le remplissage.
   CONSEQUENCE AILLEURS, ET ELLE EST VOULUE : les deux boutons `gi-btn--lg` de
   l'appel communaute de l'accueil etaient rendus a la taille `sm` depuis le
   portage. Ils reviennent a leur taille de maquette. */
.et_pb_button.gi-btn--lg { --gi-btn-pad: 1.1rem 2.4rem; --btn-cut: 14px; font-size: var(--fs-base) !important; }
.et_pb_button.gi-btn--sm { --gi-btn-pad: 0.62rem 1.15rem; --btn-cut: 8px; font-size: var(--fs-xs) !important; }

/* Divi elargit le remplissage droit pour loger la fleche de sa police
   d'icones, avec !important ET un selecteur qui contient #page-container :
       body #page-container .et_pb_section .et_pb_button_0
   Impossible de gagner a moins. Notre balayage remplace cette fleche, on
   reprend donc le remplissage exactement au meme niveau. La variante decide
   de la valeur. C'est ce qui decalait le libelle vers la gauche. */
body #page-container .et_pb_section .et_pb_button.gi-btn,
body #page-container .et_pb_section .et_pb_button.gi-btn:hover {
  padding: var(--gi-btn-pad) !important;
}

/* La fleche de Divi disparait au profit de notre balayage. */
.et_pb_button.gi-btn::after {
  font-family: inherit !important;
  content: "" !important;
  position: absolute !important;
  inset: 0 !important;
  margin: 0 !important;
  opacity: 1 !important;
  line-height: inherit !important;
  z-index: -1;
  /* Divi centre sa fleche avec top: 50% + transform: translateY(-50%).
     L'inset: 0 ci-dessus annule le top, mais PAS la transformation : le
     balayage se retrouvait remonte d'une demi-hauteur et ne brillait que sur
     la moitie haute du bouton. */
  transform: none !important;
  background: linear-gradient(105deg, transparent 35%, rgba(255, 255, 255, 0.45) 50%, transparent 65%);
  translate: -120% 0;
  transition: translate var(--t-slow) var(--ease-out);
}
.et_pb_button.gi-btn:hover::after { translate: 120% 0; }

/* Divi masque deja son propre ::before (.et_pb_button:before{display:none}).
   Il ne faut donc surtout pas le remasquer de notre cote : sur .gi-btn--ghost,
   ce ::before est NOTRE fond sombre, celui qui laisse le lisere dore visible
   sur 1,25 px. Masque, le bouton fantome redevient un aplat dore.
   Divi lui applique ses trois reglages d'icone : display: none, opacity: 0 et
   transform: translateY(-50%). Les trois doivent tomber. */
.et_pb_button.gi-btn--ghost::before {
  display: block !important;
  opacity: 1 !important;
  transform: none !important;
}

/* Le Personnaliseur de theme peint TOUS les .et_pb_button : fond dore par
   « body .et_pb_button », libelle sombre par
   « body.et_pb_button_helper_class .et_pb_button ». Les deux sont plus
   specifiques que nos variantes, ecrites en une seule classe. Chacune reprend
   donc la main ici, au niveau qu'il faut. */
.et_pb_button.gi-btn--primary,
.et_pb_button.gi-btn--primary:hover {
  color: var(--gi-ink-950) !important;
  background-color: var(--gi-gold-500) !important;
}
.et_pb_button.gi-btn--ghost {
  color: var(--gi-sand-100) !important;
  background-color: rgba(198, 165, 93, 0.70) !important;
}
.et_pb_button.gi-btn--ghost:hover {
  color: var(--gi-gold-200) !important;
  background-color: var(--gi-gold-500) !important;
}

/* --------------------------------------------------------------------------
   3 bis. La variante discrete

   .gi-btn--link n'est pas un bouton, c'est un lien : pas de fond, pas d'angle
   coupe, pas de balayage. Trois sources le contredisaient, toutes plus
   specifiques que la variante :
   - le Personnaliseur de theme, qui peint TOUS les .et_pb_button en dore
     plein via « body .et_pb_button » ;
   - le bloc ci-dessus, qui vise .et_pb_button.gi-btn et ecrasait donc la
     variante ecrite en .gi-btn--link seul ;
   - la couleur de libelle, posee en « body.et_pb_button_helper_class ».
   La variante est donc reecrite ici, au bon niveau.
   -------------------------------------------------------------------------- */
.et_pb_button.gi-btn--link,
.et_pb_button.gi-btn--link:hover {
  --btn-cut: 0px;
  /* 4 px reserves a droite : le chevron glisse de 4 px au survol, et .gi-btn
     est en overflow: hidden avec un clip-path. Sans cette reserve, le second
     chevron se fait trancher net en arrivant au bord. */
  --gi-btn-pad: 0.35rem 4px 0.35rem 0;
  font-size: var(--fs-xs) !important;
  letter-spacing: var(--ls-wider) !important;
  background: none !important;
  background-color: transparent !important;
  box-shadow: none !important;
  text-shadow: none !important;
}
.et_pb_button.gi-btn--link { color: var(--gi-gold-400) !important; }
.et_pb_button.gi-btn--link:hover { color: var(--gi-gold-200) !important; }

/* La fleche du lien.

   Dans la maquette c'est un <svg class="gi-btn__ico"> place apres le libelle.
   Le module Bouton de Divi ne prend qu'une chaine de texte, on ne peut donc
   pas y glisser de SVG en ligne. Deux solutions : utiliser l'icone maison de
   Divi, qui est une glyphe de sa police et ne ressemble pas a la notre, ou
   redessiner la fleche en masque CSS. C'est la seconde, retenue pour rester
   fidele au trait de la maquette.

   Le ::after est libre sur cette variante, le balayage y etant desactive.
   Cout : la fleche n'est plus un reglage du Builder, c'est un ornement de la
   variante, au meme titre que l'etoile des titres de section. */
.et_pb_button.gi-btn--link::after {
  /* Double chevron plutot que fleche simple : plus proche du « suite » d'une
     table des matieres, et le trait se marie mieux aux petites capitales. */
  /* CORRIGE le 28/07/2026 au soir. Ce masque dessinait un DOUBLE CHEVRON,
     alors que la maquette pose ici un <svg><use href="#i-arrow"/></svg>, qui
     est une fleche a hampe. Ecart introduit sans etre annonce, et visible sur
     tous les liens de section : « Tous les guides », « Voir toute la
     database », « Toutes les actualites ». Le trace ci-dessous est celui du
     sprite, repris a l'identique : M5 12h13m-5-6 6 6-6 6. */
  --gi-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='4 5 16 14' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h13m-5-6 6 6-6 6'/%3E%3C/svg%3E");
  display: inline-block !important;
  content: "" !important;
  position: static !important;
  /* Divi pose font-size: 32px sur ce pseudo-element pour sa propre fleche.
     Sans ce retour a l'heritage, 0.92em vaudrait 29 px au lieu de 11. */
  font-size: inherit !important;
  width: 0.92em;
  height: 0.8em;
  /* L'interlettrage large laisse deja un blanc apres la derniere lettre :
     un ecart en em, plus serre que --sp-3, evite le decrochage visuel. */
  margin: 0 0 0 0.3em !important;
  opacity: 1 !important;
  /* Divi force color: #0d1626 sur ce pseudo-element, pour sa fleche noire sur
     bouton dore. Sans ce retour a l'heritage, currentColor vaut presque noir
     et la fleche disparait sur le fond sombre. */
  color: inherit !important;
  z-index: auto;
  background: currentColor;
  -webkit-mask: var(--gi-arrow) center / contain no-repeat;
  mask: var(--gi-arrow) center / contain no-repeat;
  transform: none !important;
  translate: 0 0;
  transition: translate var(--t-base) var(--ease-out);
}
.et_pb_button.gi-btn--link:hover::after { translate: 4px 0; }


/* --------------------------------------------------------------------------
   4. Gabarit de l'appel communaute monte en modules
   -------------------------------------------------------------------------- */
.gi-cta.et_pb_section { padding-block: clamp(3.5rem, 2.5rem + 5vw, 7rem) !important; }
.gi-cta .et_pb_row,
.gi-cta .gi-cta__row {
  width: 100% !important;
  max-width: 46em !important;
  margin-inline: auto !important;
  padding: 0 var(--gi-gutter) !important;
  text-align: center;
}
.gi-cta .et_pb_column { float: none !important; }
.gi-cta .et_pb_text { margin-bottom: 0 !important; text-align: center; }
.gi-cta .gi-cta__divider { margin-bottom: var(--sp-5); }
.gi-cta .et_pb_text + .et_pb_button_module_wrapper { margin-top: var(--sp-7) !important; }

/* --------------------------------------------------------------------------
   5. Intitules et titres montes en module Texte

   Dans la maquette, l'etoile de l'intitule est un SVG en ligne. Un module
   Texte Divi ne permet pas d'en poser un simplement : on la dessine donc en
   CSS, mais uniquement si aucun SVG n'est deja present, pour que les deux
   ecritures restent valables.
   -------------------------------------------------------------------------- */
.gi-hero__eyebrow:not(:has(svg))::before {
  content: "";
  display: inline-block;
  width: 0.9em;
  height: 0.9em;
  margin-right: 0.5em;
  vertical-align: -0.08em;
  background-color: var(--gi-gold-400);
  -webkit-mask: var(--gi-star) center / contain no-repeat;
  mask: var(--gi-star) center / contain no-repeat;
}

/* L'ornement sous le titre du hero devient un pseudo-element : un module
   de moins a poser dans le Builder. */
.gi-hero .et_pb_text.gi-hero__title::after {
  /* Le losange etait dessine par un <span> dans la maquette. Ici c'est une
     couche de masque : le losange a gauche, le filet degrade a sa droite,
     l'aplat dore apparaissant a travers les deux.
     Le filet part a 19 px, soit 7 px de losange plus l'ecart sp-3, comme
     dans la maquette.

     ECRIT EN PROPRIETES LONGUES, ET C'EST DELIBERE. La version raccourcie,
     `mask: var(--gi-gem) left center / 7px 7px no-repeat, ...`, tombait a
     `none` sous Firefox : le hero affichait une barre pleine de 190 x 7 au
     lieu de l'ornement. Deux raisons de ne pas y revenir :

       1. un var() dans un raccourci differe la validation. Si la valeur
          substituee ne convient pas, ce n'est pas la declaration qui est
          ignoree, c'est TOUTE la propriete qui retombe a sa valeur initiale,
          donc mask-image: none. En proprietes longues, une couche qui echoue
          echoue seule.
       2. la position a trois valeurs (`left 19px center`) et le calc() dans
          la taille passaient sous Chromium, pas sous Firefox. Ils sont
          remplaces ici par une position a deux valeurs et une taille en dur
          (190 - 19 = 171), la largeur du bloc etant fixe de toute facon.

     Les autres masques de cette feuille (`mask: var(--gi-btn-ico) center /
     contain no-repeat`) restent en raccourci : une seule couche, pas de
     calc, pas de position a trois valeurs, et ils sont verifies au rendu
     sous Firefox. */
  content: "";
  display: block;
  width: 190px;
  height: 7px;
  margin-block: var(--sp-3) var(--sp-4);
  background-color: var(--gi-gold-500);

  -webkit-mask-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath fill='%23000' d='M5 0 10 5 5 10 0 5z'/%3E%3C/svg%3E"),
    linear-gradient(90deg, #000, transparent);
  -webkit-mask-position: 0 center, 19px center;
  -webkit-mask-size: 7px 7px, 171px 1px;
  -webkit-mask-repeat: no-repeat, no-repeat;

  mask-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath fill='%23000' d='M5 0 10 5 5 10 0 5z'/%3E%3C/svg%3E"),
    linear-gradient(90deg, #000, transparent);
  mask-position: 0 center, 19px center;
  mask-size: 7px 7px, 171px 1px;
  mask-repeat: no-repeat, no-repeat;
}

/* Le module Texte est un conteneur flex : sans cela l'ecart de module de Divi,
   30 px, se glisserait entre le titre et son ornement. Et le h1 de Divi porte
   un padding bas de 10 px que la maquette n'a pas. */
.gi-hero .et_pb_text.gi-hero__title { --vertical-gap: 0px; row-gap: 0; }
.gi-hero .gi-hero__title :is(h1, h2, h3) { padding-bottom: 0; }

/* Divi applique ses propres tailles de titre dans les modules Texte. */
.gi-hero .gi-hero__title,
.gi-hero .gi-hero__title h1,
.gi-hero .gi-hero__title h2 {
  font-family: var(--gi-font-display) !important;
  font-size: var(--fs-t-xl) !important;
  font-weight: 700 !important;
  line-height: 1.17 !important;
  letter-spacing: var(--ls-caps-lg) !important;
  color: var(--gi-sand-50) !important;
}
.gi-cta .gi-cta__title,
.gi-cta .gi-cta__title h1,
.gi-cta .gi-cta__title h2 {
  font-family: var(--gi-font-display) !important;
  font-size: var(--fs-t-2xl) !important;
  font-weight: 700 !important;
  line-height: 1.16 !important;
  letter-spacing: var(--ls-caps-lg) !important;
  color: var(--gi-sand-50) !important;
}
/* La taille et la largeur de l'accroche restent celles de gi-accueil.css, qui
   les fait descendre d'un cran sous 620 px et les borne a 440 px de large.
   Les figer ici, meme sans !important, les figerait a tous les paliers : une
   regle en .gi-hero .gi-hero__lead pese plus lourd que .gi-hero__lead.
   Seule la couleur est reprise, Divi la posant sur ses modules Texte. */
.gi-hero .gi-hero__lead,
.gi-hero .gi-hero__lead p { color: var(--gi-sand-300) !important; }
.gi-cta .gi-cta__lead,
.gi-cta .gi-cta__lead p { color: var(--gi-sand-300) !important; }



/* --------------------------------------------------------------------------
   6. Filet de securite

   Si les classes des modules Texte n'ont pas ete posees (le champ a change de
   place en Divi 5), la mise en page tient quand meme : les boutons restent en
   ligne et le contenu garde ses marges. Seule la typographie des titres sera
   celle de Divi tant que les classes ne sont pas ajoutees.
   -------------------------------------------------------------------------- */
/* Filet reserve aux modules SANS classe gi-. Applique a tous, il ecraserait
   les max-width de gi-accueil.css, a commencer par les 440 px de l'accroche. */
.gi-hero .et_pb_module:not([class*="gi-"]),
.gi-cta .et_pb_module:not([class*="gi-"]) { max-width: 100%; }

.gi-hero .et_pb_button,
.gi-cta .et_pb_button { vertical-align: top; }

/* Divi 5 peut envelopper les modules dans une couche supplementaire. */
.gi-hero .et_pb_module_inner,
.gi-cta .et_pb_module_inner { position: static; }


/* ==========================================================================
   PARTIE B - DIVI 5 NATIF
   ==========================================================================

   Vocabulaire du DOM Divi 5, verifie sur page publiee :
   - section  .et_pb_section .et_flex_section
   - ligne    .et_pb_row     .et_flex_row
   - colonne  .et_pb_column  .et_flex_column .et_flex_column_24_24
   - groupe   .et_pb_group   .et_flex_group        (les enfants sont DIRECTS)
   - texte    .et_pb_text    > .et_pb_text_inner
   - titre    .et_pb_heading > .et_pb_heading_container
   - bouton   .et_pb_button_module_wrapper > a.et_pb_button
   ========================================================================== */

/* --------------------------------------------------------------------------
   3 ter. Les icones de bouton

   Dans la maquette, chaque bouton porte un <svg class="gi-btn__ico">. Le
   module Bouton de Divi ne prend qu'une chaine de texte : l'icone est donc
   dessinee en masque CSS, une classe modificatrice par pictogramme.

   Le pseudo-element utilise depend de la variante, et c'est le seul point qui
   coute quelque chose :
   - variantes pleines : ::before est libre, l'icone s'y pose et le balayage
     lumineux de ::after est conserve ;
   - variante fantome : ::before porte deja le verre sombre, l'icone prend
     donc ::after et CETTE VARIANTE RENONCE AU BALAYAGE. Arbitrage assume
     avec l'utilisateur le 28/07/2026.

   Ajouter un pictogramme = ajouter une classe et sa variable, rien d'autre.
   -------------------------------------------------------------------------- */
.et_pb_button.gi-btn--ico-book  { --gi-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5.5A2.5 2.5 0 0 1 6.5 3H19v14H6.5A2.5 2.5 0 0 0 4 19.5z'/%3E%3Cpath d='M4 19.5A2.5 2.5 0 0 1 6.5 17H19v4H6.5A2.5 2.5 0 0 1 4 19.5z'/%3E%3C/svg%3E"); }
.et_pb_button.gi-btn--ico-user  { --gi-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='4'/%3E%3Cpath d='M4.5 20.5a7.7 7.7 0 0 1 15 0'/%3E%3C/svg%3E"); }
.et_pb_button.gi-btn--ico-discord { --gi-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23000'%3E%3Cpath d='M19.3 5.4A16.8 16.8 0 0 0 15.2 4c-.2.4-.4.9-.6 1.3a15.6 15.6 0 0 0-4.6 0C9.8 4.9 9.6 4.4 9.4 4a16.6 16.6 0 0 0-4.1 1.4C2.7 9.3 2 13 2.3 16.7a16.9 16.9 0 0 0 5.1 2.6c.4-.6.8-1.2 1.1-1.8-.6-.2-1.2-.5-1.7-.8l.4-.3a12.1 12.1 0 0 0 10.4 0l.4.3c-.5.3-1.1.6-1.7.8.3.6.7 1.2 1.1 1.8a16.8 16.8 0 0 0 5.1-2.6c.4-4.3-.7-8-2.9-11.3zM8.9 14.5c-1 0-1.8-.9-1.8-2s.8-2 1.8-2 1.8.9 1.8 2-.8 2-1.8 2zm6.2 0c-1 0-1.8-.9-1.8-2s.8-2 1.8-2 1.8.9 1.8 2-.8 2-1.8 2z'/%3E%3C/svg%3E"); }

.et_pb_button[class*="gi-btn--ico-"]:not(.gi-btn--ghost)::before,
.et_pb_button.gi-btn--ghost[class*="gi-btn--ico-"]::after {
  content: "" !important;
  display: inline-block !important;
  position: static !important;
  /* Meme piege que la fleche : Divi pose font-size: 32px ici. La maquette
     fixe .gi-btn__ico a 18 px, on reprend la meme valeur. */
  font-size: inherit !important;
  width: 18px;
  height: 18px;
  flex: none;
  margin: 0 !important;
  opacity: 1 !important;
  color: inherit !important;
  z-index: auto;
  background: currentColor;
  -webkit-mask: var(--gi-btn-ico) center / contain no-repeat;
  mask: var(--gi-btn-ico) center / contain no-repeat;
  transform: none !important;
  translate: none;
  transition: none;
}

/* Sur la variante fantome l'icone arrive par ::after, donc apres le libelle
   dans l'ordre du flux : order la remet devant. */
.et_pb_button.gi-btn--ghost[class*="gi-btn--ico-"]::after { order: -1; }

/* --------------------------------------------------------------------------
   B1. Utilitaires transverses
   -------------------------------------------------------------------------- */

/* Le module Texte enveloppe toujours son contenu dans .et_pb_text_inner.
   Cette classe, posee sur le module depuis Avance > Attributes, fait
   disparaitre l'enveloppe du flux sans toucher au contenu. */
.gi-passthrough > .et_pb_text_inner { display: contents; }

/* Divi pose une marge basse sur chaque module. Dans un groupe qui gere deja
   ses ecarts avec gap, cette marge fait doublon. */
.et_pb_group > .et_pb_module { margin-bottom: 0; }

/* Le bouton Divi est enveloppe dans un div bloc : sans cela il casse toute
   mise en page en ligne. */
.et_pb_group > .et_pb_button_module_wrapper { margin: 0; }

/* LE PIEGE NUMERO UN DU PORTAGE.
   Divi ecrit sur chaque module et chaque groupe :
       display: flex; flex-direction: var(--flex-direction);
   avec --flex-direction: column par defaut. Un composant de la maquette qui
   comptait sur la direction « row » native du flex se retrouve donc empile,
   sans qu'aucune regle a nous ait ete perdue.

   Deux remedes, complementaires :
   - dans le Builder, poser explicitement Design > Layout > Direction sur les
     groupes concernes. C'est la voie propre, celle qui reste editable ;
   - ici, un filet pour nos composants qui sont en ligne par nature et qui ne
     doivent jamais basculer, quelle que soit la main qui edite la page.
   On alimente la variable de Divi plutot que la propriete : le reglage de
   direction pose dans le Builder, lui, reste prioritaire. */
.et_pb_module.gi-eyebrow,
.et_pb_module.gi-section-head,
.et_pb_module.gi-db,
.et_pb_module.gi-meta,
.et_pb_module.gi-tool,
.et_pb_module.gi-btn,
.et_pb_module.gi-hero__eyebrow,
.et_pb_module.gi-hero__actions,
.et_pb_module.gi-cta__actions { --flex-direction: row; }

/* --------------------------------------------------------------------------
   B2. Conteneur large

   Divi calcule la largeur de ses lignes avec ses propres variables. Les
   surcharger sur la ligne evite tout !important.
   -------------------------------------------------------------------------- */
.et_pb_row.gi-container--wide {
  --content-max-width: 1760px;
  --content-width: 92%;
}

/* --------------------------------------------------------------------------
   B3. Entete de section

   Dans la maquette, le bloc titre etait un <div> sans classe, cible par
   .gi-section-head > div. En Divi ce selecteur attraperait aussi l'enveloppe
   du bouton. Le groupe porte donc une vraie classe.
   -------------------------------------------------------------------------- */
.gi-section-head > .gi-section-head__text { min-width: 0; }
.gi-section-head .et_pb_button_module_wrapper { margin: 0; }

/* L'etoile du titre de section etait posee en ::before sur l'element qui
   porte la classe. Dans la maquette c'etait le <h2> lui-meme, l'etoile
   restait donc en ligne devant le texte. En Divi la classe est sur le MODULE,
   qui est un conteneur flex en colonne : le pseudo-element devient un enfant
   de plein droit et l'etoile part sur sa propre ligne, au-dessus du titre.
   On la deplace sur le titre reel, a l'interieur du module. */
.gi-section-head__title.et_pb_module::before { content: none; }
.gi-section-head__title.et_pb_module :is(h1, h2, h3, h4)::before {
  content: "";
  display: inline-block;
  width: 0.58em;
  height: 0.58em;
  margin-right: 0.44em;
  vertical-align: 0.04em;
  background-color: var(--gi-gold-400);
  -webkit-mask: var(--gi-star) center / contain no-repeat;
  mask: var(--gi-star) center / contain no-repeat;
  filter: drop-shadow(0 0 7px rgba(198, 165, 93, 0.6));
}

/* --------------------------------------------------------------------------
   B4. Cartes cliquables

   Divi n'enveloppe pas un groupe dans un <a> et n'expose aucun reglage de
   lien de module. La carte entiere cliquable passe donc par un module Lien
   en surcouche absolue. Le texte du lien reste lu par les lecteurs d'ecran.
   -------------------------------------------------------------------------- */
.gi-db,
.gi-post,
.gi-guide,
.gi-tool { position: relative; }

.gi-db__link,
.gi-post__link,
.gi-guide__link,
.gi-tool__link {
  position: absolute;
  inset: 0;
  z-index: 3;
  margin: 0;
}

/* Attention : le module Lien N'EST PAS une enveloppe autour d'un <a>, il EST
   le <a>. Le selecteur .gi-db__link a ne designe donc rien. Le texte du lien
   se cache sur son enveloppe interne, en masquage accessible : il reste lu
   par les lecteurs d'ecran et sert de nom accessible a la carte. */
.gi-db__link .et_pb_link_text,
.gi-post__link .et_pb_link_text,
.gi-guide__link .et_pb_link_text,
.gi-tool__link .et_pb_link_text {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Divi pose position: relative sur ses lignes et colonnes. Sans ce retour a
   static, la surcouche ci-dessus se calerait sur la ligne, pas sur la carte. */
.gi-section .et_pb_row,
.gi-section .et_pb_column { position: static; }

/* --------------------------------------------------------------------------
   B5. Section Database

   La grille et les tuiles ne sont plus des li/a. Le nombre de colonnes est
   desormais un reglage natif (Design > Layout), il n'est donc PAS redeclare
   ici : le redeclarer empecherait de le changer depuis le Builder.
   -------------------------------------------------------------------------- */
.gi-db__grid > .gi-db { position: relative; }

/* La grille appartient au Builder, pas a cette feuille. Mais gi-accueil.css
   pose encore un grid-template-columns en dur, herite de la maquette, et il
   gagne sur la regle de base de Divi puisqu'il est charge apres elle. On
   redonne donc la main a Divi avec une specificite d'un cran superieure, en
   consommant ses propres variables : le nombre de colonnes et les gouttieres
   se reglent depuis Design > Layout, y compris par point de rupture. */
.et_pb_group.gi-db__grid {
  grid-template-columns: repeat(var(--column-count, 3), minmax(0, 1fr));
  gap: var(--vertical-gap, 20px) var(--horizontal-gap, 20px);
}

/* Le module SVG rend <div.et_pb_svg_inner> puis le <svg>. Divi le dimensionne
   avec .et_pb_svg .et_pb_svg_inner svg { width: 100%; height: auto }, plus
   specifique que notre .gi-db__ico svg : sans cette reprise, le glyphe part en
   taille intrinseque et deborde de sa pastille. On dimensionne l'enveloppe et
   le svg la remplit. */
.gi-db__ico .et_pb_svg_inner {
  width: 24px;
  height: 24px;
}
.gi-db__ico .et_pb_svg_inner svg {
  display: block;
  width: 100%;
  height: 100%;
}

/* --------------------------------------------------------------------------
   B7. Hero

   La maquette avait six elements de decor : .gi-hero__media, __sky, __scene,
   __sun, __particles et __fade. Une section Divi n'a que deux
   pseudo-elements, et ils sont deja pris par le grain (::before) et la
   vignette (::after). Le decor se repartit donc ainsi :

   - le ciel        -> fond de la SECTION, en CSS
   - le key visual  -> fond du module .gi-hero__media, reglable dans le Builder
   - le soleil      -> .gi-hero__glow::before
   - le fondu       -> .gi-hero__glow::after
   - les angles     -> module Texte .gi-corners, quatre <svg><use> en ligne
   - les particules -> gi-particles.js, aucun module

   Soit deux modules Texte vides et un module Texte d'ornements, contre six
   elements dans la maquette.
   -------------------------------------------------------------------------- */
.gi-hero.et_pb_section {
  justify-content: center;
  background-image: linear-gradient(100deg,
    var(--gi-ink-900) 26%, #1A2C44 48%, #33506F 70%, #52708F 100%);
}

/* Les trois modules de decor : aucune place dans le flux, aucun clic. */
.gi-hero__media.et_pb_module,
.gi-hero__glow.et_pb_module,
.gi-hero .gi-corners.et_pb_module {
  position: absolute;
  margin: 0;
  pointer-events: none;
}
.gi-hero__media.et_pb_module,
.gi-hero__glow.et_pb_module { z-index: -1; }
.gi-hero__glow.et_pb_module,
.gi-hero .gi-corners.et_pb_module { inset: 0; }
.gi-hero__glow .et_pb_text_inner { display: none; }

/* Divi pose position: relative sur .et_pb_text_inner. Les quatre equerres
   etant en position absolue, elles se caleraient sur cette enveloppe, dont la
   hauteur est nulle : les quatre angles se retrouveraient empiles en haut.
   display: contents fait sortir l'enveloppe du flux sans toucher au DOM, donc
   sans casser les :nth-child qui distribuent les angles. */
.gi-hero .gi-corners .et_pb_text_inner { display: contents; }

/* Le key visual. Deux voies, au choix, sans toucher a la feuille :

   1. Une IMAGE : Builder > module « Decor : key visual » > Contenu >
      Arriere-plan > Image. Le fond du module est deja cadre et masque.
   2. L'ILLUSTRATION de remplacement, celle de la maquette, ecrite en SVG
      dans le contenu du meme module. C'est ce qui est livre par defaut.
      Poser une image par-dessus suffit a la recouvrir ; vider le contenu du
      module suffit a la retirer.

   Dans les deux cas le visuel occupe les trois quarts droits et son bord
   gauche se dissout dans le ciel. */
.gi-hero__media.et_pb_module {
  inset: 0 0 0 24%;
  background-repeat: no-repeat;
  background-size: cover;
  /* Le bandeau est bien plus large que haut : de 2,6:1 sous 1280 px a 4,3:1
     sur un grand ecran. `cover` rogne donc le haut et le bas de toute image
     moins panoramique que ca, et il le fait symetriquement puisque le cadrage
     vertical est centre. Pour garder plutot le haut de l'image, poser
     --gi-hero-visual-y: 25% sur la section (Avance > Attributes, ou CSS
     personnalise du module). 0% garde le haut, 100% garde le bas. */
  background-position: right var(--gi-hero-visual-y, center);
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 42%);
  mask-image: linear-gradient(90deg, transparent 0%, #000 42%);
}
.gi-hero__media .et_pb_text_inner { display: contents; }
.gi-hero__media svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

/* Halo solaire, anime par-dessus le visuel. */
.gi-hero__glow::before {
  content: "";
  position: absolute;
  top: 50%;
  right: 27%;
  width: clamp(200px, 26vw, 400px);
  aspect-ratio: 1;
  translate: 50% -50%;
  border-radius: 50%;
  background: radial-gradient(circle,
    rgba(255, 250, 232, 0.42) 0%,
    rgba(246, 219, 163, 0.24) 26%,
    rgba(198, 165, 93, 0.09) 52%,
    transparent 74%);
  filter: blur(14px);
  animation: gi-pulse-glow 8s var(--ease-in-out) infinite;
}

/* Fondu du visuel vers le fond sombre, a gauche puis en bas. */
.gi-hero__glow::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(90deg,
      var(--gi-ink-900) 4%,
      rgba(13, 22, 32, 0.94) 22%,
      rgba(13, 22, 32, 0.60) 40%,
      rgba(13, 22, 32, 0.18) 60%,
      transparent 80%),
    linear-gradient(180deg,
      rgba(13, 22, 32, 0.45) 0%,
      transparent 26%,
      transparent 58%,
      rgba(13, 22, 32, 0.62) 86%,
      var(--gi-ink-900) 100%);
}

/* Les ecarts du contenu viennent des marges de la maquette et non du rowGap
   de la colonne, parce qu'ils sont asymetriques : sp-4 sous l'intitule, sp-3
   et sp-4 autour de l'ornement, sp-6 avant les boutons. Divi neutralise la
   marge basse des modules d'une colonne flex, il faut donc la reposer d'un
   cran plus specifique. */
/* Le !important n'est pas decoratif : la regle .gi-hero .et_pb_text de la
   partie 2 remet margin-bottom: 0 !important sur tous les modules Texte. */
.gi-hero .et_pb_module.gi-hero__eyebrow { margin-bottom: var(--sp-4) !important; }
.gi-hero .et_pb_module.gi-hero__actions { margin-top: var(--sp-6) !important; }

/* L'etoile de l'intitule est un <svg> ecrit dans le module Texte. C'est le
   <p> qui aligne le tout, le module etant un conteneur flex. */
/* .et_pb_text_inner porterait sa propre ligne de texte, plus haute que le <p>
   en inline-flex qu'elle contient : le bloc gagnerait 4 px de vide sous
   l'intitule. display: contents la sort du flux sans toucher au DOM. */
.gi-hero__eyebrow .et_pb_text_inner { display: contents; }
.gi-hero__eyebrow p {
  display: inline-flex;
  align-items: center;
  align-self: flex-start;
  gap: 0.55rem;
  line-height: 1.65;
}
.gi-hero__eyebrow svg { width: 15px; height: 15px; flex: none; }

/* Les boutons vivent dans un groupe qui gere son propre ecart : la marge que
   la partie 2 pose sur chaque enveloppe ferait double emploi. */
.gi-hero .gi-hero__actions .et_pb_button_module_wrapper,
.gi-cta .gi-cta__actions .et_pb_button_module_wrapper { margin: 0 !important; }

/* --------------------------------------------------------------------------
   B6. Visual Builder

   Les apparitions au scroll et les effets doivent etre neutralises pendant
   l'edition, sinon la moitie de la page est invisible dans le Builder.
   -------------------------------------------------------------------------- */
.et-fb .gi-reveal { opacity: 1 !important; transform: none !important; }
.et-fb .gi-fx { display: none !important; }


/* --------------------------------------------------------------------------
   B8. Particules du hero

   La maquette ecrivait le canvas a la main dans le decor :
   <canvas class="gi-particles gi-hero__particles">. Le hero monte en modules
   Divi ne l'a pas, et gi-particles.js ne CREE aucun canvas, il ne fait que
   recenser les .gi-particles existants. Resultat : hero sans poussieres.

   Plutot qu'un module de plus a poser dans le Builder, le canvas est injecte
   par gi-particles.js, juste avant le module de fondu pour que celui-ci le
   recouvre, exactement comme dans la maquette ou le canvas precede
   .gi-hero__fade. La maquette d'origine a deja le sien : elle ne declenche
   pas l'injection.

   Il prend ici le meme rang que les deux autres couches de decor : hors flux,
   sans clic, sous le contenu.
   -------------------------------------------------------------------------- */
.gi-hero .gi-particles--auto {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  z-index: -1;
  pointer-events: none;
}

/* Dans le Builder, un canvas injecte n'apporte rien et brouille la selection
   des modules. Meme parti pris que pour .gi-fx. */
.et-fb .gi-particles--auto { display: none !important; }

/* Compensation quand les particules sont coupees, sous 900 px ou en
   prefers-reduced-motion : gi-accueil.css vise .gi-hero__sun, qui n'existe
   pas dans le hero Divi. Le soleil y est .gi-hero__glow::before. */
.gi-no-particles .gi-hero__glow::before { opacity: 0.9; }


/* --------------------------------------------------------------------------
   B9. Hero sous 860 px : le visuel passe en fond plein cadre

   Ce palier existait dans gi-accueil.css mais visait .gi-hero__scene et
   .gi-hero__fade, deux elements que le portage a remplaces par le module
   .gi-hero__media et par .gi-hero__glow::after. Il etait donc perdu, et le
   visuel restait confine aux trois quarts droits avec le fondu de bureau :
   texte peu lisible sur mobile.

   Trois reglages, transposes un pour un depuis la maquette :
     - le visuel occupe toute la largeur au lieu de partir a 24 % ;
     - son fondu gauche se resserre de 42 % a 24 % ;
     - le fondu general devient vertical et bien plus dense, le texte se
       posant desormais PAR-DESSUS le visuel et non a cote.

   Ce bloc doit rester en fin de feuille : il reprend a specificite egale les
   regles de la partie B7, et c'est l'ordre source qui tranche.
   -------------------------------------------------------------------------- */
@media (max-width: 860px) {
  .gi-hero__media.et_pb_module {
    inset: 0;
    -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 24%);
    mask-image: linear-gradient(90deg, transparent 0%, #000 24%);
  }

  /* Le soleil remonte et se recentre, sinon il sort du cadre. */
  .gi-hero__glow::before { top: 34%; right: 12%; }

  .gi-hero__glow::after {
    background:
      linear-gradient(180deg,
        rgba(13, 22, 32, 0.52) 0%,
        rgba(13, 22, 32, 0.66) 42%,
        rgba(13, 22, 32, 0.86) 80%,
        var(--gi-ink-900) 100%),
      linear-gradient(90deg,
        rgba(13, 22, 32, 0.72) 0%,
        rgba(13, 22, 32, 0.15) 55%,
        transparent 78%);
  }
}


/* --------------------------------------------------------------------------
   B10. Les deux sections bouclees : Actualites et Guides

   DOCTRINE DE CETTE PARTIE, ET ELLE A CHANGE LE 28/07 AU SOIR.

   Le premier jet s'accrochait a `.et_pb_module.classe` et a
   `.et_pb_group > .et_pb_module` pour gagner un cran de specificite sur le
   CSS que Divi genere pour la page. Le rendu reel a montre que ce pari ne
   tient pas : la grille est restee empilee, les marges de module ne se sont
   pas annulees, et les enveloppes de texte ne se sont pas effacees. Rien ne
   prouve qu'un `divi/group` porte `.et_pb_module`, ni qu'il n'y a pas une
   couche `.et_pb_module_inner` de plus entre le module et son contenu. Le DOM
   des groupes n'a jamais ete verifie sur une page publiee, seulement celui
   des sections, lignes et colonnes.

   Ces regles ne dependent donc plus d'aucune classe de Divi. Le cran de
   specificite vient du DOUBLAGE DE NOTRE PROPRE CLASSE : `.gi-x.gi-x` vaut
   (0,2,0) et designe exactement le meme element que `.gi-x`. C'est juste quel
   que soit le DOM que Divi produit, et ca reste lisible.

   Ce que la partie NE reprend PAS, volontairement : tout ce que
   gi-accueil.css fait varier par palier, a commencer par les
   grid-template-columns. Les figer ici les figerait a toutes les largeurs, et
   c'est le piege 7.
   -------------------------------------------------------------------------- */

/* --- Conteneurs en grille ------------------------------------------------ */
.gi-news.gi-news,
.gi-news__aside.gi-news__aside,
.gi-news__grid.gi-news__grid,
.gi-guides__grid.gi-guides__grid,
.gi-banner__list.gi-banner__list,
.gi-count__grid.gi-count__grid { display: grid; }

.gi-news.gi-news { gap: var(--sp-6); align-items: start; }
.gi-news__aside.gi-news__aside { gap: var(--sp-5); }
.gi-news__grid.gi-news__grid { gap: var(--sp-4); }
.gi-guides__grid.gi-guides__grid { gap: var(--sp-5); }
.gi-banner__list.gi-banner__list { gap: var(--sp-2); }
.gi-count__grid.gi-count__grid { gap: var(--sp-2); }

/* --- Conteneurs en ligne -------------------------------------------------

   `--flex-direction` EST UNE VARIABLE CSS, DONC ELLE EST HERITEE.

   C'est le piege qu'on n'avait pas vu. Divi ecrit sur chaque module
   `flex-direction: var(--flex-direction)`. Poser la variable a `row` sur un
   conteneur la propage a TOUS ses descendants : le libelle d'un outil, qui
   doit empiler son titre et sa description, se retrouvait en ligne parce que
   `.gi-tool` au-dessus de lui demandait `row`. Idem pour « Cryo · Catalyseur »
   colle a « Columbina ».

   On pose donc la propriete directement, pas la variable, et on remet la
   variable a `column` sur les enfants pour couper l'heritage. Le reglage de
   direction du Builder reste prioritaire sur les modules qu'on ne nomme pas
   ici. */
.gi-section-head.gi-section-head,
.gi-section-head--inline.gi-section-head--inline,
.gi-panel__head.gi-panel__head,
.gi-banner__head.gi-banner__head,
.gi-banner__item.gi-banner__item,
.gi-banner__stars.gi-banner__stars,
.gi-post__more.gi-post__more,
.gi-news__footer.gi-news__footer,
.gi-tool.gi-tool,
.gi-tag.gi-tag { flex-direction: row; }

.gi-section-head > *,
.gi-panel__head > *,
.gi-banner__head > *,
.gi-banner__item > *,
.gi-banner__stars > *,
.gi-post__more > *,
.gi-news__footer > *,
.gi-tool > *,
.gi-tag > * { --flex-direction: column; }

/* Sous 760 px, gi-accueil.css repasse l'entete de section en colonne. La
   regle ci-dessus la figerait en ligne a toutes les largeurs : on la remet
   au meme cran de specificite, en fin de partie, l'ordre source tranchant. */
@media (max-width: 760px) {
  .gi-section-head.gi-section-head { flex-direction: column; }
  .gi-section-head--inline.gi-section-head--inline { flex-direction: row; }
}

/* --- Conteneurs en colonne ----------------------------------------------- */
.gi-news__main.gi-news__main,
.gi-section-head__text.gi-section-head__text,
.gi-panel.gi-panel,
.gi-tools__list.gi-tools__list,
.gi-tool__body.gi-tool__body,
.gi-banner__meta.gi-banner__meta,
.gi-count.gi-count,
.gi-count__cell.gi-count__cell,
.gi-post.gi-post,
.gi-post__body.gi-post__body { display: flex; flex-direction: column; }

/* Conteneurs dont la maquette gere les ecarts en MARGES et non en gap : sans
   ce zero, le --module-gutter de Divi, 30 px, s'ajoute a chaque marge. C'est
   lui qui creusait le vide entre la vignette et la date. */
.gi-news__main.gi-news__main,
.gi-section-head__text.gi-section-head__text,
.gi-panel.gi-panel,
.gi-tools__list.gi-tools__list,
.gi-count.gi-count,
.gi-post.gi-post,
.gi-tool__body.gi-tool__body,
.gi-banner__meta.gi-banner__meta,
.gi-count__cell.gi-count__cell { gap: 0; }

.gi-post__body.gi-post__body { gap: 0.5rem; }
.gi-tool.gi-tool { gap: var(--sp-3); }
.gi-panel__head.gi-panel__head { gap: var(--sp-3); }
.gi-banner__head.gi-banner__head { gap: var(--sp-3); }
.gi-banner__item.gi-banner__item { gap: var(--sp-3); }
.gi-post__more.gi-post__more { gap: 0.35rem; }
.gi-banner__stars.gi-banner__stars { gap: 0.2rem; }

/* Pastilles et pictogrammes centres. */
.gi-tool__ico.gi-tool__ico { display: grid; place-items: center; }

/* --- Marges des modules ---------------------------------------------------

   Divi pose une marge basse sur chaque module. Elle n'existe nulle part dans
   la maquette : nos conteneurs gerent leurs ecarts au gap ou a la marge, un a
   un. On l'annule donc sur tout ce qui vit dans les deux sections, puis on
   repose les cinq marges que la maquette avait vraiment.

   Attention a l'ordre : l'annulation d'abord, les cinq marges ensuite. */
.gi-news, .gi-news *,
.gi-guides, .gi-guides *,
.gi-news__aside * { margin-bottom: 0; }

.gi-section-head.gi-section-head { margin-bottom: var(--sp-7); }
.gi-section-head--inline.gi-section-head--inline { margin-bottom: var(--sp-6); }
.gi-panel__head.gi-panel__head { margin-bottom: var(--sp-2); }
.gi-banner__head.gi-banner__head { margin-bottom: var(--sp-4); }
.gi-count__label.gi-count__label { margin-bottom: var(--sp-3); }
.gi-news__footer.gi-news__footer { margin-top: var(--sp-6); }
.gi-count.gi-count { margin-top: var(--sp-4); }

/* --- Le repli des jetons qui ne resolvent pas -----------------------------

   Un jeton de contenu dynamique mal nomme ne casse rien : il rend une chaine
   vide. Mais une etiquette vide, c'est un rectangle dore de trois pixels de
   haut pose sur la vignette, et un lien sans href, c'est une carte qui a
   l'air cliquable et ne l'est pas. Les deux se replient proprement.

   Ces regles ne sont pas des rustines a retirer : elles restent justes une
   fois les bons jetons trouves. Un article sans categorie n'aura pas
   d'etiquette, ce qui est le comportement voulu. */
.gi-post__tag:has(span:empty),
.gi-post__tag:has(p:empty) { display: none; }


/* --- L'etiquette sur une vraie image --------------------------------------

   Dans la maquette, la vignette est un degrade genere, toujours sombre :
   l'etiquette pouvait se contenter d'un fond teinte a 16 % et d'un texte
   clair. Sur le site, la vignette porte l'image a la une, et certaines sont
   tres claires. Le texte clair y disparaissait.

   On glisse donc un voile sombre SOUS le texte et AU-DESSUS de la teinte, en
   couche d'image de fond : `background-image` se peint par-dessus
   `background-color`, et il est declare ici a (0,2,0) alors que les variantes
   posent leur teinte en raccourci a (0,1,0). Chaque variante garde donc sa
   couleur de texte et son lisere, seul le fond s'assombrit. Aucune variante a
   dupliquer, et une nouvelle categorie hérite du traitement sans rien faire.

   Le flou d'arriere-plan monte d'un cran au passage : il separe l'etiquette
   d'une image chargee. */
.gi-post__tag.gi-post__tag {
  background-image: linear-gradient(rgba(6, 11, 17, 0.74), rgba(6, 11, 17, 0.74));
  -webkit-backdrop-filter: blur(10px) saturate(140%);
  backdrop-filter: blur(10px) saturate(140%);
}

.gi-post__link:not([href]) { pointer-events: none; }


/* --- Elements sortis du flux ---------------------------------------------

   Divi pose position: relative sur chaque module. Sans cette reprise,
   l'etiquette se poserait dans le flux de la vignette et les quatre equerres
   s'empileraient en haut du panneau. */
.gi-post__tag.gi-post__tag,
.gi-corners.gi-corners { position: absolute; margin: 0; }

/* --- Les deux enveloppes de trop ------------------------------------------

   Divi enveloppe le contenu d'un module Texte dans .et_pb_text_inner, et
   peut-etre dans une couche de plus. Ces enveloppes cassent tout composant
   dont les enfants doivent etre des elements de flex ou de grille : le titre
   et la description d'un outil se retrouvent dans un meme bloc, donc sur la
   meme ligne, au lieu de s'empiler.

   .gi-passthrough efface les enveloppes, .gi-ghost efface le module lui-meme.

   IL Y A DEUX ENVELOPPES, PAS UNE. Verifie sur le DOM reel : Divi passe le
   contenu du module dans wpautop, qui enveloppe tout contenu de niveau inline
   dans un <p>. Un module de vignette rend donc
       .et_pb_text > .et_pb_text_inner > p > img
   et effacer la seule .et_pb_text_inner laissait le <p> faire ecran. C'est ce
   <p> qui gardait « Lire la suite » et son chevron sur deux lignes, et qui
   collait le titre d'un outil a sa description. Les titres, eux, ne sont pas
   enveloppes : wpautop laisse les blocs tranquilles.

   Le selecteur est en DESCENDANCE et non en enfant direct, et il vise large,
   `[class*="_inner"]` : rien ne coute a etre robuste a une couche de plus. */
.gi-passthrough [class*="_inner"],
.gi-passthrough [class*="_inner"] > p { display: contents; }
.gi-ghost.gi-ghost { display: contents; }

/* --- Les separateurs de la liste d'outils ---------------------------------

   Ils etaient poses en `li + li`. Il n'y a plus de <li> : chaque outil est un
   groupe, enfant direct de la liste. */
.gi-tools__list > * + * { border-top: 1px solid var(--gi-line-soft); }

/* --- Les titres et les paragraphes ont perdu leur classe ------------------

   Dans la maquette, `class` est sur le <h3> ou sur le <p> ; en Divi elle est
   sur le MODULE, et l'element ecrit a la main a l'interieur n'en porte
   aucune. Il retombe donc sur la typographie de Divi et du navigateur,
   marges comprises. Il herite desormais de son module. */
.gi-post__title :is(h1, h2, h3, h4, h5, h6),
.gi-panel__title :is(h1, h2, h3, h4, h5, h6),
.gi-arch-empty__title :is(h1, h2, h3, h4, h5, h6),
.gi-section-head__title :is(h1, h2, h3, h4, h5, h6) {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  line-height: inherit;
  text-wrap: inherit;
  margin: 0;
  padding: 0;
}

.gi-post__date p,
.gi-post__excerpt p,
.gi-banner__phase p,
.gi-count__label p {
  margin: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  line-height: inherit;
}

/* --- L'intitule de section ------------------------------------------------

   Meme piege que l'etoile du titre, partie B3. Dans la maquette .gi-eyebrow
   est sur le <p> : le filet dore de 26 px pose en ::before reste en ligne,
   devant le texte. En Divi la classe est sur le MODULE, conteneur flex en
   colonne : le pseudo-element devient un enfant de plein droit et le filet
   part sur sa propre ligne.

   La taille de police reste celle du texte courant sur le module : c'est elle
   qui fixe la hauteur de la ligne ou le <p> en inline-flex se pose, et donc
   les sept pixels qui separent l'intitule du titre dans la maquette. La
   typographie de l'intitule descend d'un cran, sur le <p>, exactement comme
   dans la maquette ou la classe est sur le <p> et non sur le <div> parent. */
.gi-eyebrow.gi-eyebrow::before { content: none; }
.gi-eyebrow.gi-eyebrow { font-size: inherit; letter-spacing: normal; }
.gi-eyebrow p {
  display: inline-flex;
  align-items: center;
  align-self: flex-start;
  gap: var(--sp-3);
  margin: 0;
  padding: 0;
  font-size: var(--fs-xs);
  letter-spacing: var(--ls-widest);
}
.gi-eyebrow:not(:has(svg)) p::before {
  content: "";
  width: 26px;
  height: 1px;
  flex: none;
  background: linear-gradient(90deg, transparent, var(--gi-gold-500));
}

/* --- Le module SVG --------------------------------------------------------

   Meme piege qu'en B5 : Divi le dimensionne avec
   .et_pb_svg .et_pb_svg_inner svg { width: 100%; height: auto }, plus
   specifique que nos regles de taille. On dimensionne l'enveloppe. */
.gi-tool__arrow [class*="_inner"] { width: 15px; height: 15px; }
.gi-panel__spark [class*="_inner"] { width: 17px; height: 17px; }
.gi-tool__arrow [class*="_inner"] svg,
.gi-panel__spark [class*="_inner"] svg { display: block; width: 100%; height: 100%; }

/* Le chevron de la liste d'outils est pousse a droite. */
.gi-tool__arrow.gi-tool__arrow { margin-left: auto; }

/* Le filet du titre en ligne occupe l'espace restant. Il n'est plus utilise
   par les sections portees : l'entete des actualites a rejoint le dessin des
   guides, un titre a gauche et un lien a droite. La regle reste pour la
   maquette et pour un usage futur. */
.gi-titleline.gi-titleline { flex: 1; }

/* gi-tokens.css pose une marge haute sur le titre de section, pour l'ecarter
   de l'intitule qui le precede. Quand le titre est seul, directement dans
   l'entete et sans intitule au-dessus, cette marge n'a plus d'objet et
   desaligne le titre de son bouton. */
.gi-section-head > .gi-section-head__title { margin-top: 0; }

/* La grille n'a plus de <li>. Chaque enfant direct est soit la carte
   elle-meme, soit l'enveloppe d'iteration que Divi pourrait ajouter : dans
   les deux cas il doit s'etirer sur toute la hauteur de sa cellule et pouvoir
   retrecir sous la largeur de son contenu. */
.gi-news__grid > *,
.gi-guides__grid > * { min-width: 0; }
.gi-news__grid > :not(.gi-card),
.gi-guides__grid > :not(.gi-card) { display: flex; }


/* --------------------------------------------------------------------------
   B11. La teinte de vignette vient de la POSITION

   Arbitrage du 28/07 au soir, qui remplace le precedent. Le champ
   personnalise gifr_teinte est abandonne : les vignettes portent l'image a la
   une, le degrade generatif de .gi-thumb n'apparait que sur un article qui
   n'en a pas. Faire saisir un champ a chaque publication pour un fond que
   l'image recouvre ne se justifiait plus.

   Le rang est pris avec :nth-child et non avec l'attribut data-loop-item que
   Divi pose sur chaque iteration : le selecteur reste juste si Divi enveloppe
   l'iteration dans un div de plus, et il boucle tout seul au-dela du nombre
   de colonnes.

   Trois colonnes pour les actualites, quatre pour les guides : le cycle suit
   le nombre de colonnes pour qu'aucune ligne ne repete deux fois la meme
   teinte cote a cote.
   -------------------------------------------------------------------------- */
.gi-news__grid > :nth-child(3n + 1) .gi-post__thumb { --thumb-a: var(--el-electro); --thumb-b: var(--el-hydro); }
.gi-news__grid > :nth-child(3n + 2) .gi-post__thumb { --thumb-a: var(--el-dendro);  --thumb-b: var(--el-anemo); }
.gi-news__grid > :nth-child(3n + 3) .gi-post__thumb { --thumb-a: var(--el-cryo);    --thumb-b: var(--el-electro); }

.gi-guides__grid > :nth-child(4n + 1) .gi-post__thumb { --thumb-a: var(--el-cryo);  --thumb-b: var(--el-electro); }
.gi-guides__grid > :nth-child(4n + 2) .gi-post__thumb { --thumb-a: var(--el-hydro); --thumb-b: var(--el-cryo); }
.gi-guides__grid > :nth-child(4n + 3) .gi-post__thumb { --thumb-a: var(--el-geo);   --thumb-b: var(--el-pyro); }
.gi-guides__grid > :nth-child(4n + 4) .gi-post__thumb { --thumb-a: var(--el-pyro);  --thumb-b: var(--el-geo); }


/* --------------------------------------------------------------------------
   B12. L'etiquette tire sa couleur du SLUG de la categorie

   Plutot que d'un second champ personnalise. Les trois variantes existent
   deja dans gi-tokens.css sous les noms de la maquette ; on leur ajoute ici
   les alias correspondant aux slugs probables du site. Ajouter une categorie
   revient a ajouter une ligne. Un slug inconnu retombe sur .gi-tag nu, le
   dore neutre : pas de carte cassee.
   -------------------------------------------------------------------------- */
.gi-tag--mise-a-jour,
.gi-tag--maj-de-jeu,
.gi-tag--actualite,
.gi-tag--actualites,
.gi-tag--news { background: rgba(79, 166, 227, 0.16); color: #A7D5F2; box-shadow: inset 0 0 0 1px rgba(79, 166, 227, 0.38); }

.gi-tag--evenement,
.gi-tag--evenements,
.gi-tag--events { background: rgba(143, 201, 58, 0.15); color: #C4E58A; box-shadow: inset 0 0 0 1px rgba(143, 201, 58, 0.36); }

.gi-tag--guides,
.gi-tag--astuces,
.gi-tag--personnage,
.gi-tag--tier-list,
.gi-tag--debutant { background: rgba(177, 137, 221, 0.16); color: #D8C2F0; box-shadow: inset 0 0 0 1px rgba(177, 137, 221, 0.38); }


/* --------------------------------------------------------------------------
   B13. Guides : le champ de particules

   Le canvas est injecte par gi-particles.js, en tete de section, avec les
   reglages ecrits a la main dans la maquette. Meme parti pris qu'en B8 pour
   le hero : hors flux, sans clic, sous le contenu, et rien dans le Builder.
   -------------------------------------------------------------------------- */
.gi-guides .gi-particles--auto {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  z-index: -1;
  pointer-events: none;
}


/* --------------------------------------------------------------------------
   B14. Le bouton qui grossissait au survol

   La partie 3 reprend deja le remplissage au niveau de Divi :
       body #page-container .et_pb_section .et_pb_button.gi-btn
   Divi ecrit exactement le meme, avec .et_pb_button_0:hover. Specificite
   IDENTIQUE, et son CSS de page vit en fin de <body> : il gagne. Au repos nos
   deux declarations donnaient la meme valeur, on ne voyait rien ; au survol
   Divi elargit le remplissage droit pour loger sa fleche, et le bouton
   grandissait sous la souris.

   Un cran de plus suffit, et il ne coute rien : la classe doublee.
   -------------------------------------------------------------------------- */
body #page-container .et_pb_section .et_pb_button.gi-btn.gi-btn,
body #page-container .et_pb_section .et_pb_button.gi-btn.gi-btn:hover {
  padding: var(--gi-btn-pad) !important;
}

/* Meme cause pour la chasse et la graisse : Divi ne les touche pas au survol,
   mais le Personnaliseur peut. On fige la boite du bouton, seule la couleur
   et le balayage bougent. */
.et_pb_button.gi-btn.gi-btn:hover {
  letter-spacing: 0.085em !important;
  font-size: var(--fs-sm) !important;
  line-height: 1.65 !important;
  border: 0 !important;
}


/* --------------------------------------------------------------------------
   B15. Section Discord

   COMPOSANT NEUF, SANS EQUIVALENT DANS LA MAQUETTE. Il remplace la section
   « Communaute » du 28/07, et il n'existe qu'en Divi : tout son style vit donc
   ici, et non dans gi-accueil.css, pour n'avoir qu'un seul endroit a lire.

   Le widget est un iframe servi par discord.com. On ne peut rien y changer :
   ni la police, ni les couleurs, ni sa largeur maximale. Le parti pris est de
   l'assumer comme une piece rapportee, posee dans une carte GIFR avec liseré
   et equerres. Le cadre fait la couture entre les deux univers graphiques.
   -------------------------------------------------------------------------- */
.gi-discord {
  --gi-discord: #5865F2;
  --gi-discord-dark: #4752C4;
  /* Violet de marque Twitch. Sert au survol du bouton de la barre, partie
     B16.6 ter, ou il est recopie en rgba() : voir le commentaire la-bas. */
  --gi-twitch: #9146FF;
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background:
    radial-gradient(58% 62% at 18% 24%, rgba(88, 101, 242, 0.16), transparent 68%),
    radial-gradient(46% 54% at 86% 78%, rgba(235, 69, 158, 0.10), transparent 70%),
    linear-gradient(180deg, var(--gi-ink-950), var(--gi-ink-900) 100%);
}

/* Le canvas est injecte par gi-particles.js, palette « discord ». Meme parti
   pris qu'en B8 et B13 : hors flux, sans clic, sous le contenu. */
.gi-discord .gi-particles--auto {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  z-index: -1;
  pointer-events: none;
}

/* Le partage. La colonne de droite est fixe : le widget Discord ne depasse
   jamais 420 px de large, l'etirer ne ferait qu'ajouter du vide a l'interieur
   de l'iframe. Le nombre de colonnes reste dans cette feuille et non dans le
   Builder, meme motif que les grilles bouclees : les paliers ne tombent pas
   sur les points de rupture de Divi. */
.gi-discord__inner.gi-discord__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 400px;
  gap: var(--sp-7);
  align-items: center;
  /* Le conteneur large fait 1760 px. Un appel a l'action n'en a pas besoin :
     au-dela, la colonne de texte s'etire sans que le texte suive, et le vide
     entre les deux colonnes devient un trou.

     PAS de `margin-inline: auto` ici, et c'est important. Divi met chaque
     colonne en flex : une marge automatique sur l'axe transversal d'un
     conteneur flex DESACTIVE l'etirement de l'element, qui retombe alors sur
     la largeur de son contenu. Ca ne se voyait pas tant que le contenu etait
     large, et ca s'est effondre a 440 px le jour ou un descendant a recu
     `container-type`, qui lui retire justement sa largeur intrinseque.
     `align-self: center` centre sans toucher au dimensionnement. */
  width: 100%;
  max-width: 1180px;
  align-self: center;
}
.gi-discord__text.gi-discord__text { display: flex; flex-direction: column; gap: 0; }

.gi-discord__title.gi-discord__title {
  font-family: var(--gi-font-display);
  /* Un cran sous le titre du CTA de la maquette : celui-la etait centre sur
     toute la largeur, celui-ci vit dans une colonne de 700 px. */
  font-size: var(--fs-t-xl);
  font-weight: 700;
  line-height: 1.16;
  letter-spacing: var(--ls-caps-lg);
  color: var(--gi-text-strong);
  text-wrap: balance;
  margin-block: var(--sp-4) var(--sp-4);
}
.gi-discord__title :is(h1, h2, h3) {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  line-height: inherit;
  text-wrap: inherit;
  margin: 0;
  padding: 0;
}
.gi-discord__lead.gi-discord__lead {
  max-width: 46ch;
  font-size: var(--fs-lg);
  line-height: 1.6;
  color: var(--gi-sand-300);
  text-wrap: pretty;
}
.gi-discord__lead p {
  margin: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  line-height: inherit;
}

/* --- Les chiffres ---------------------------------------------------------

   Statiques et editables au clic, arrondis vers le bas pour vieillir dans le
   bon sens. Les rendre vivants demanderait une requete a l'API Discord depuis
   l'extension, mise en cache une heure. */
.gi-discord__stats.gi-discord__stats {
  flex-direction: row;
  flex-wrap: wrap;
  gap: var(--sp-6);
}
.gi-discord__stats > * { --flex-direction: column; }

.gi-stat.gi-stat {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
}
.gi-stat strong {
  font-family: var(--gi-font-display);
  font-size: 1.55rem;
  font-weight: 700;
  line-height: 1.1;
  color: var(--gi-sand-50);
  font-variant-numeric: tabular-nums;
}
.gi-stat span {
  font-size: var(--fs-xs);
  letter-spacing: var(--ls-wide);
  text-transform: uppercase;
  color: var(--gi-text-faint);
}

/* Chiffres et bouton sur la meme rangee : la preuve et l'action se lisent
   d'un coup, et la colonne de texte se rapproche de la hauteur du widget.
   Le filet vertical separe les deux sans peser, et disparait quand la rangee
   se replie. */
.gi-discord__cta.gi-discord__cta {
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-6);
  margin-top: var(--sp-6);
}
.gi-discord__cta > * { --flex-direction: column; }
.gi-discord__cta > .gi-discord__actions {
  padding-left: var(--sp-6);
  border-left: 1px solid var(--gi-line);
}

/* Le filet ne vaut que tant que la rangee tient sur une ligne. Une fois
   repliee, il se retrouve a gauche d'un bouton seul, sous les chiffres, et ne
   separe plus rien.

   Le repli depend de la largeur de la COLONNE DE TEXTE, pas de celle de la
   fenetre : entre 980 et 1300 px la colonne est etroite alors que la fenetre
   est large. Une requete de media se tromperait donc de cible, et c'est ce
   qu'elle faisait. On interroge le conteneur.

   `container-type: inline-size` est sans risque ici : la colonne est un
   element de grille en minmax(0, 1fr), sa largeur ne depend deja pas de son
   contenu. */
.gi-discord__text.gi-discord__text { container-type: inline-size; }

@container (max-width: 660px) {
  .gi-discord__cta > .gi-discord__actions {
    padding-left: 0;
    border-left: 0;
  }
}

/* Variante empilee, quand BOUTON_EN_LIGNE vaut False. */
.gi-discord__pile.gi-discord__pile {
  display: flex;
  flex-direction: column;
  gap: 0;
  margin-top: var(--sp-6);
}
.gi-discord__pile > .gi-discord__actions { margin-top: var(--sp-7); }

.gi-discord__stats.gi-discord__stats { margin-top: 0; }

.gi-discord__actions.gi-discord__actions {
  flex-direction: row;
  flex-wrap: wrap;
  gap: var(--sp-4);
}
.gi-discord__actions > * { --flex-direction: column; }
.gi-discord__actions .et_pb_button_module_wrapper { margin: 0 !important; }

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

   Une variante de plus, ecrite comme les autres. Le Personnaliseur de theme
   peint TOUS les .et_pb_button : fond et couleur doivent etre repris avec
   !important, cf. piege 5. Le picto passe par le masque .gi-btn--ico-discord,
   qui existe deja en partie 3 ter. */
.et_pb_button.gi-btn--discord,
.et_pb_button.gi-btn--discord:hover {
  background: var(--gi-discord) !important;
  color: #FFFFFF !important;
}
.et_pb_button.gi-btn--discord:hover {
  background: var(--gi-discord-dark) !important;
  box-shadow: 0 0 24px rgba(88, 101, 242, 0.45);
}

/* --- La carte du widget ---------------------------------------------------

   L'iframe fait 500 px de haut et refuse de s'etirer au-dela de sa largeur
   maximale. La carte se contente donc de l'encadrer, sans padding lateral :
   le widget a deja le sien. */
.gi-discord__widget.gi-discord__widget {
  position: relative;
  display: flex;
  flex-direction: column;
  padding: var(--sp-4);
  border-radius: var(--r-md);
  background: linear-gradient(168deg, var(--gi-ink-800) 0%, var(--gi-ink-900) 100%);
  box-shadow: inset 0 0 0 1px rgba(88, 101, 242, 0.28), var(--sh-2);
}
.gi-discord__frame.gi-discord__frame { display: block; width: 100%; }
.gi-discord__frame iframe {
  display: block;
  width: 100%;
  height: 500px;
  border: 0;
  border-radius: var(--r-sm);
  /* L'iframe est le seul element de la page qu'on ne peut pas habiller :
     un leger retrait de saturation le rapproche de notre palette sans le
     denaturer. */
  filter: saturate(0.92);
}

/* Sous 980 px la colonne fixe n'a plus la place : le widget passe dessous et
   se centre. Il ne s'elargit pas pour autant, sa largeur est celle de Discord. */
@media (max-width: 980px) {
  .gi-discord__inner.gi-discord__inner {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--sp-6);
  }
  .gi-discord__widget.gi-discord__widget {
    width: 100%;
    max-width: 420px;
    margin-inline: auto;
  }
}

/* --------------------------------------------------------------------------
   B16. EN-TETE DU THEME BUILDER : barre, mega-menus et tiroir mobile

   Trois choses a savoir avant de toucher a cette partie.

   1. LE MODULE LIEN EST LE <a>, pas une enveloppe autour. Son DOM est
      a.et_pb_link > span.et_pb_link_inner > span.et_pb_link_text > p.
      Les onglets et les liens de mega-menu ont donc besoin que ces trois
      couches sortent du flux, sinon la mise en ligne du <a> ne s'applique
      qu'a une enveloppe. Les liens EN SURCOUCHE, eux, veulent l'inverse :
      leur texte reste en masquage accessible. D'ou deux listes explicites
      plus bas, et non une regle attrape-tout.

   2. LE PANNEAU DE MEGA-MENU EST LE MODULE DROPDOWN LUI-MEME. Il porte la
      grille : .gi-megamenu et .gi-megamenu__inner de la maquette ont fusionne.
      Un niveau de DOM en moins que dans la maquette.

   3. LE CRAN DE SPECIFICITE VIENT DU DOUBLAGE DE NOTRE PROPRE CLASSE. A
      specificite egale le CSS de page de Divi gagne, il vit en fin de <body>.
      .gi-x.gi-x vaut (0,2,0) et designe le meme element quel que soit le DOM
      que Divi produit.
   -------------------------------------------------------------------------- */

/* --- B16.1 Le squelette de la barre --------------------------------------- */

/* Le decor de l'en-tete, les quatre equerres, se cale sur la SECTION. Divi
   pose position: relative sur ses lignes et ses colonnes : sans ce retour a
   static il se calerait sur la ligne. Ne jamais ajouter .et_pb_module a cette
   liste, les onglets comptent sur leur position: relative pour ancrer leur
   panneau. */
.gi-header .et_pb_row,
.gi-header .et_pb_column { position: static; }

/* La section d'en-tete n'a pas de respiration verticale : c'est une barre. Sans
   cela, les 56 px de --section-padding de Divi la font passer de 74 a 198 px. */
.gi-header.gi-header { padding: 0; }
/* ET IL FAUT ALLER CHERCHER LE PERSONNALISATEUR DE DIVI.
   Mesure du 03/08/2026 : l'en-tete faisait 184 px au lieu de 76. La feuille
   `et-divi-customizer-*` emet
   `.et-db #et-boc .et-l .et_pb_section { padding: 54px 0 }`, et son
   IDENTIFIANT `#et-boc` bat `.gi-header.gi-header`, qui n'a que deux classes.
   La regle du dessus ne servait donc a rien depuis le debut : elle ne battait
   que le defaut de Divi, pas le reglage d'espacement de section du theme.

   Ne pas la remplacer par `!important` : il faut simplement se hisser au meme
   niveau, une classe de plus que la regle a battre. */
.et-db #et-boc .et-l .et_pb_section.gi-header { padding: 0; }

/* --------------------------------------------------------------------------
   LE VIGNETTAGE DE SECTION PASSAIT DEVANT LE CONTENU.

   Dans la maquette, `.gi-vignette*::after` est en `z-index: 3` et le contenu
   passe au dessus par `.gi-section > .gi-container { z-index: 4 }`. Sous Divi
   il n'y a pas de `.gi-container` : c'est une `.et_pb_row`, en `z-index: auto`.
   Le voile se retrouvait donc DEVANT, et il assombrissait ce qui touchait le
   haut et le bas de la section — d'ou des portraits ternes en tete et en pied
   de grille, et eux seuls. Mesure du 03/08/2026.

   La ligne reprend ici le rang que la maquette donne au conteneur. Elle doit
   etre positionnee pour que le rang s'applique.
   -------------------------------------------------------------------------- */
.et-db #et-boc .et-l .gi-vignette > .et_pb_row,
.et-db #et-boc .et-l .gi-vignette--soft > .et_pb_row,
.et-db #et-boc .et-l .gi-vignette--deep > .et_pb_row,
.gi-vignette > .et_pb_row,
.gi-vignette--soft > .et_pb_row,
.gi-vignette--deep > .et_pb_row {
  position: relative;
  z-index: 4;
}

/* La ligne garde sa largeur, calculee par la partie B2 qui alimente les
   variables de Divi. NE PAS la forcer a 100 % : ce serait annuler le
   conteneur large et coller le logo au bord. Elle ne doit en revanche ajouter
   ni gouttiere verticale ni marge basse. */
.gi-header .et_pb_row.et_pb_row { padding-block: 0; margin-block: 0; row-gap: 0; }

/* La ligne doit se comporter comme .gi-container--wide de la maquette : pleine
   largeur jusqu'a la largeur maximale, avec une gouttiere INTERIEURE. La
   partie B2 donne 92 % de large, ce qui centre la barre au lieu de la border :
   le logo se retrouvait 29 px trop a droite a 1760 px. */
.gi-header .et_pb_row.gi-container--wide {
  --content-width: 100%;
  --content-max-width: var(--gi-container-wide);
  padding-inline: var(--gi-gutter);
}
.gi-header .et_pb_column.et_pb_column {
  width: 100%;
  max-width: none;
  padding: 0;
  margin: 0;
  row-gap: 0;
}
.gi-header .et_pb_module { margin-bottom: 0; }

/* La barre elle-meme. gi-accueil.css lui donne deja min-height, alignement et
   justification ; il ne manque que la direction, que Divi force en colonne,
   et la gouttiere, qu'il calcule avec ses propres variables. */
.gi-header__inner.gi-header__inner {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-6);
  width: 100%;
}

/* Les trois couches d'enveloppe du module Lien, effacees UNIQUEMENT sur les
   liens qui doivent se comporter comme le <a> de la maquette. Les liens en
   surcouche en sont exclus : eux gardent leur texte, masque plus bas. */
.gi-nav__link .et_pb_link_inner,
.gi-nav__link .et_pb_link_text,
.gi-nav__link .et_pb_link_text > p,
.gi-megamenu__link .et_pb_link_inner,
.gi-megamenu__link .et_pb_link_text,
.gi-megamenu__link .et_pb_link_text > p,
.gi-drawer__lien .et_pb_link_inner,
.gi-drawer__lien .et_pb_link_text,
.gi-drawer__lien .et_pb_link_text > p,
.gi-drawer__sub-lien .et_pb_link_inner,
.gi-drawer__sub-lien .et_pb_link_text,
.gi-drawer__sub-lien .et_pb_link_text > p { display: contents; }


/* LE PIEGE DE L'ENVELOPPE EFFACEE, mesure sur la repro.

   Un module Texte est un conteneur flex EN COLONNE, avec un row-gap de 30 px
   herite de --module-gutter. Tant que son contenu tient dans .et_pb_text_inner
   cela ne se voit pas : il n'y a qu'un enfant. Mais .gi-passthrough efface
   .et_pb_text_inner ET le <p> de wpautop : les morceaux de texte deviennent
   alors des elements de flex de plein droit, et les 30 px se glissent ENTRE
   EUX. Le nom du site et son suffixe « FR » se retrouvaient separes de 30 px,
   et le logo mesurait 88 px de haut au lieu de 34.

   Tout module Texte qui porte du contenu inline redevient donc un bloc. */
.gi-logo__text.gi-logo__text,
.gi-megamenu__label.gi-megamenu__label,
.gi-megamenu__feature-title.gi-megamenu__feature-title,
.gi-megamenu__feature-desc.gi-megamenu__feature-desc,
.gi-megamenu__feature-body .gi-tag,
.gi-burger.gi-burger,
.gi-drawer__toggle.gi-drawer__toggle,
.gi-logo__mark.gi-logo__mark,
.gi-corners.gi-corners { row-gap: 0; column-gap: 0; }


/* --- B16.2 Le logo -------------------------------------------------------- */

/* Divi n'enveloppe pas un groupe dans un <a> : le logo est un groupe plus un
   module Lien en surcouche, motif deja valide sur les cartes d'article. */
.gi-logo.gi-logo {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  gap: var(--sp-3);
  position: relative;
  flex: none;
  width: auto;
}

/* La marque est un module Texte en passthrough : la classe est sur le MODULE,
   le <svg> est dedans. Il faut donc dimensionner le module et laisser le svg
   le remplir, comme en parties B5 et B10. */
.gi-logo__mark.gi-logo__mark {
  width: 34px;
  height: 34px;
  flex: none;
  margin: 0;
}
.gi-logo__mark svg { width: 100%; height: 100%; display: block; }

.gi-logo__text.gi-logo__text { display: block; margin: 0; }

.gi-logo__link {
  position: absolute;
  inset: 0;
  z-index: 3;
  margin: 0;
}
.gi-logo__link .et_pb_link_text {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}


/* --- B16.3 La barre de navigation ----------------------------------------- */

.gi-nav.gi-nav {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  width: auto;
  margin: 0;
}
.gi-nav__list.gi-nav__list {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  gap: 0.1rem;
  width: auto;
  margin: 0;
}

/* L'onglet a mega-menu est un GROUPE qui contient le lien et le panneau, cote
   a cote. C'est lui qui porte position: relative et qui ancre le panneau, et
   c'est son survol qui l'ouvre. Voir la demonstration en tete de
   gifr_menu.nav_item : le panneau ne peut pas vivre dans le <a> de l'onglet.
   Il ne doit ajouter ni hauteur ni gouttiere : le panneau est hors flux. */
.gi-nav__item.gi-nav__item {
  position: relative;
  display: flex;
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  row-gap: 0;
  column-gap: 0;
  width: auto;
  margin: 0;
}

/* L'onglet EST le <a>. Il porte donc lui-meme la mise en ligne. */
.gi-nav__link.gi-nav__link {
  --flex-direction: row;
  position: relative;
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  gap: 0.3rem;
  width: auto;
  margin: 0;
}

/* Le chevron. Dans la maquette c'est un <svg><use href="#i-chevron"> pose dans
   le lien ; le module Lien n'accepte que du texte, il passe donc en masque
   CSS. Le trace est celui du sprite, repris a l'identique.

   ::after est deja pris par le losange de l'onglet actif. Le chevron passe
   donc par ::before, remis en fin de ligne avec order: 1 : un pseudo-element
   d'un conteneur flex est un element de plein droit, et sans cela il
   sortirait AVANT le libelle. */
/* Le trace, en variable locale. UN MASQUE QUI REFERENCE UNE VARIABLE NON
   DEFINIE EST INVALIDE, et un masque invalide affiche l'aplat entier : le
   chevron sortirait en carre plein. La variable est donc posee sur l'element
   qui s'en sert, pas ailleurs. Deja paye une fois sur l'ornement du hero. */
.gi-nav__link--menu {
  --gi-ico-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
}
.gi-nav__link--menu.gi-nav__link--menu::before {
  content: "";
  order: 1;
  width: 13px;
  height: 13px;
  flex: none;
  opacity: 0.6;
  background: currentColor;
  transition: rotate var(--t-base) var(--ease-out);
  -webkit-mask: var(--gi-ico-chevron) center / contain no-repeat;
          mask: var(--gi-ico-chevron) center / contain no-repeat;
  /* Divi impose font-size: 32px a ses propres pseudo-elements d'icone : toute
     dimension en em partirait de la, pas de la taille de l'onglet. Les
     dimensions ci-dessus sont donc en pixels, et jamais en em. */
  font-size: inherit;
}
.gi-nav__item:hover .gi-nav__link--menu::before,
.gi-nav__item:focus-within .gi-nav__link--menu::before { rotate: 180deg; }


/* --- B16.4 Le panneau de mega-menu ---------------------------------------- */

/* ATTENTION, PARTIE A CONTROLER EN PREMIER APRES L'IMPORT.

   Le module Dropdown fait sa propre mise en position et sa propre bascule au
   survol, dont la forme exacte n'a pas ete constatee. Les regles ci-dessous
   reprennent la geometrie de la maquette et prennent la main dessus.

   Si le panneau se place mal ou clignote, l'ordre de bataille est :
     1. passer le generateur de position "floating" a "inline" et regenerer ;
     2. si cela ne suffit pas, retirer le bloc « bascule » ci-dessous et
        laisser Divi montrer et cacher le panneau, en ne gardant de nos regles
        que l'apparence. */

.gi-megamenu.gi-megamenu {
  position: absolute;
  /* Les 8 px qui separent l'onglet du panneau. Dans la maquette ils venaient
     du padding-top d'une enveloppe qui n'existe plus, les deux niveaux ayant
     fusionne.

     PREMIERE TENTATIVE, RATEE, A NE PAS REFAIRE : une bordure haute
     transparente avec background-clip: padding-box. Le fond etait bien
     clippe, mais backdrop-filter NE L'EST PAS : il s'applique a toute la
     boite de bordure. Le flou de 18 px s'appliquait donc aussi a la bande de
     8 px, et assombrissait la page derriere. C'etait la barre noire au-dessus
     des mega-menus.

     La bonne facon : decaler le panneau, et rendre le pont de survol par un
     pseudo-element transparent et hors flux. */
  top: calc(100% + 8px);
  left: 50%;
  translate: -50% 0;
  z-index: 60;

  width: min(680px, 82vw);
  max-width: none;

  display: grid;
  grid-template-columns: 1fr 1fr 1.15fr;
  gap: var(--sp-6);
  padding: var(--sp-6);
  border-radius: var(--r-md);
  background: linear-gradient(165deg, rgba(23, 37, 51, 0.98), rgba(11, 19, 28, 0.99));
  backdrop-filter: blur(18px);
  box-shadow: inset 0 0 0 1px var(--gi-line), var(--sh-3), var(--glow-gold);
  text-align: left;
  row-gap: var(--sp-6);
  column-gap: var(--sp-6);
}

.gi-megamenu--sm.gi-megamenu--sm {
  width: min(460px, 82vw);
  grid-template-columns: 1fr 1fr;
}

/* Les cinq types d'armes : une seule colonne. Un panneau large sous un onglet
   etroit deborderait des deux cotes pour rien. */
.gi-megamenu--xs.gi-megamenu--xs {
  width: min(260px, 82vw);
  grid-template-columns: 1fr;
}

/* Le pont de survol : sans lui, les 8 px de vide entre l'onglet et le panneau
   referment le menu des que la souris les traverse.

   IL EST POSE SUR L'ONGLET, PAS SUR LE PANNEAU, et c'est une correction.
   Premiere version : un ::before sur .gi-megamenu. Mais le panneau porte
   .gi-grain, dont TOUT L'EFFET vit dans .gi-grain::before. Notre regle, plus
   specifique, remplacait la geometrie du grain sans en remplacer le fond : la
   texture de bruit se retrouvait ramassee dans une bande de 10 px au-dessus du
   panneau. C'etait une deuxieme barre au-dessus des mega-menus, apres celle du
   backdrop-filter.

   Regle a retenir : ne jamais poser de pseudo-element sur un element qui porte
   deja .gi-grain, .gi-vignette ou .gi-corners. Ils s'en servent tous. */
.gi-nav__item.gi-nav__item::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  height: 10px;
}

/* --- bascule --- */
.gi-megamenu.gi-megamenu {
  opacity: 0;
  visibility: hidden;
  transform: translateY(-8px);
  transition: opacity var(--t-base) var(--ease-out),
              transform var(--t-base) var(--ease-out),
              visibility var(--t-base);
}
.gi-nav__item:hover > .gi-megamenu,
.gi-nav__item:focus-within > .gi-megamenu {
  opacity: 1;
  visibility: visible;
  transform: none;
}

/* Les equerres se calent sur leur conteneur. gi-tokens.css le fait deja, mais
   en (0,1,0) : a specificite egale le CSS de page de Divi gagne, il vit en fin
   de <body>. Un cran de plus suffit a trancher. */
.gi-megamenu > .gi-corners.gi-corners { position: absolute; inset: 0; margin: 0; }
.gi-header__corners.gi-header__corners { position: absolute; inset: 7px 12px; margin: 0; }


/* --- B16.5 Colonnes et liens boucles -------------------------------------- */

.gi-megamenu__col.gi-megamenu__col {
  --flex-direction: column;
  display: flex;
  flex-direction: column;
  row-gap: 0;
  margin: 0;
  min-width: 0;
}

/* L'intitule de colonne : la classe est sur le module, le <p> est dedans et
   n'herite de rien. Meme correction que pour les titres de cartes en B10. */
.gi-megamenu__label.gi-megamenu__label { display: block; margin-bottom: var(--sp-4); }
.gi-megamenu__label > .et_pb_text_inner > p {
  margin: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
}

.gi-megamenu__links.gi-megamenu__links {
  --flex-direction: column;
  display: flex;
  flex-direction: column;
  gap: 0;
  margin: 0;
  min-width: 0;
}

/* Le lien boucle EST le <a> : gi-accueil.css l'atteint deja par
   `.gi-megamenu__links a`. Il ne manque que la marge basse que Divi pose sur
   chaque module. */
.gi-megamenu__link.gi-megamenu__link { margin: 0; width: auto; }


/* --- B16.6 La vignette : LA MEME CARTE QUE LA PAGE D'ACCUEIL --------------

   Demande du 28/07, et c'est le bon reflexe : un seul gabarit de carte pour
   tout le site. `.gi-post--mega` n'est donc qu'un habillage, il ne redefinit
   aucun comportement. Tout ce que la carte d'article gagnera plus tard, la
   vignette le gagnera aussi, a commencer par le lien quand le jeton du
   permalien sera trouve.

   Ce que la variante change : une vignette plus haute que large, un titre plus
   petit, un chapo plus court et des espacements resserres. Le panneau fait
   200 px de large, la carte de l'accueil en fait 380. */
.gi-megamenu__feature.gi-megamenu__feature {
  margin: 0;
  min-height: 190px;
}
/* La carte n'a pas .gi-card--paper : elle reste sur le fond d'encre de
   .gi-card. Le creme du parchemin, juste sous un panneau sombre, faisait tache
   et volait l'oeil aux deux colonnes de liens. */
.gi-post--mega .gi-post__thumb { aspect-ratio: 4 / 3; }
.gi-post--mega .gi-post__body { padding: var(--sp-3); gap: 0.3rem; }
.gi-post--mega .gi-post__title {
  font-size: var(--fs-t-sm, 1rem);
  line-height: 1.25;
  /* Le titre et le chapo sont ecrits pour du parchemin, en encre sombre.
     Sur le fond d'encre de la variante ils disparaissaient. */
  color: var(--gi-sand-50);
}
.gi-post--mega .gi-post__excerpt {
  font-size: var(--fs-xs);
  color: var(--gi-sand-300);
}
.gi-post--mega:hover .gi-post__title { color: var(--gi-gold-200); }
/* La carte de l'accueil apparait au defilement. Dans un panneau qui n'est
   visible qu'au survol, l'observateur ne se declenche jamais et la carte
   resterait invisible. */
.gi-post--mega.gi-reveal { opacity: 1; transform: none; }


/* --- B16.6 bis Une boucle vide ne doit pas parler ------------------------

   Quand une boucle ne renvoie rien, Divi ecrit a la place
   `<div class="entry"><h2 class="not-found-title">Aucun resultat trouve.</h2>`
   suivi d'un paragraphe d'explication. Dans une colonne de mega-menu c'est
   une faute d'affichage : le visiteur voit un message d'erreur de moteur de
   recherche a la place d'une liste de liens.

   Cas de figure ou ca arrive : identifiant de menu absent ou faux, ou menu
   WordPress vide. La colonne se tait, et le trou se voit assez pour qu'on
   aille corriger. */
.gi-megamenu__links .entry,
.gi-megamenu__links .not-found-title,
.gi-drawer__sub .entry,
.gi-drawer__sub .not-found-title { display: none; }


/* --- B16.6 ter Les trois liens d'icone en bout de barre ------------------

   Discord, Twitch et Tipeee. Modules Texte et non modules Lien : le module
   Lien n'accepte que du texte et ne saurait pas porter le <svg><use> du
   sprite. Le <a> est ecrit dans le module, le sprite reste la source unique.

   Twitch est le seul des trois a pointer vers une page du site, /stream-
   officiel/, donc le seul sans target="_blank". */
.gi-nav__ico.gi-nav__ico {
  display: flex;
  align-items: center;
  flex: none;
  margin: 0 0 0 0.25rem;
  row-gap: 0;
  column-gap: 0;
}
.gi-nav__ico .gi-icon-btn { width: 34px; height: 34px; }
.gi-nav__ico .gi-icon-btn svg { width: 17px; height: 17px; }
/* Correction optique. La marque Discord est large et basse, le coeur est
   presque carre : a taille de boite egale le coeur pese plus lourd a l'oeil.
   Deux pixels de moins les remettent au meme poids. */
.gi-icon-btn.gi-nav__ico--tipeee svg { width: 15px; height: 15px; }

/* Les deux survols de marque. Tipeee garde l'or commun de .gi-icon-btn:hover,
   choix de l'utilisateur : un rose de marque au milieu de la barre doree
   n'apportait rien.

   LES COULEURS SONT ECRITES EN rgba() LITTERAL ET NON DEPUIS --gi-discord /
   --gi-twitch. Ces deux jetons portent un hexadecimal, et rgba() n'en prend
   pas ; la syntaxe relative rgb(from var(--x) r g b / .22) qui saurait le
   faire est trop recente pour qu'on la pose seule sans repli. Blaireau,
   Discord #5865F2 = 88 101 242, Twitch #9146FF = 145 70 255. Si l'un des deux
   jetons change, ces valeurs sont a changer avec lui.

   Le translateY(-2px) de .gi-icon-btn:hover n'est pas repris : il est herite,
   les trois boutons se soulevent donc pareil. */
.gi-icon-btn.gi-nav__ico--discord:hover {
  color: #fff;
  background: rgba(88, 101, 242, 0.22);
  box-shadow: inset 0 0 0 1px rgba(88, 101, 242, 0.85),
              0 0 22px -6px rgba(88, 101, 242, 0.7);
}
.gi-icon-btn.gi-nav__ico--twitch:hover {
  color: #fff;
  background: rgba(145, 70, 255, 0.22);
  box-shadow: inset 0 0 0 1px rgba(145, 70, 255, 0.85),
              0 0 22px -6px rgba(145, 70, 255, 0.7);
}


/* --- B16.7 Le hamburger --------------------------------------------------- */

/* Ce n'est pas un <button> : Divi n'a pas de module qui en rende un. C'est un
   module Texte portant data-nav-toggle, role="button" et tabindex="0", et
   gi-ui.js lui donne Entree et Espace. */
.gi-burger.gi-burger {
  display: none;
  place-items: center;
  flex: none;
  width: 42px;
  height: 42px;
  margin: 0;
  cursor: pointer;
  -webkit-user-select: none;
          user-select: none;
}
.gi-burger.gi-burger:focus-visible {
  outline: 2px solid var(--gi-gold-500);
  outline-offset: 2px;
}
.gi-burger svg { width: 22px; height: 22px; }

@media (max-width: 1080px) {
  .gi-nav.gi-nav { display: none; }
  .gi-burger.gi-burger { display: grid; }
}


/* --- B16.8 Le tiroir mobile ----------------------------------------------- */

/* Le tiroir et son voile sont deux SECTIONS du gabarit d'en-tete, sorties du
   flux. Ni Canvas ni Interaction : gi-ui.js pilote deja tout sur
   data-nav-drawer, data-nav-overlay et data-nav-toggle. */
/* LE VOILE S'ARRETE SOUS LA BARRE, il ne la couvre pas.
   Couvrant toute la fenetre, il assombrissait et floutait l'en-tete lui-meme :
   le logo passait derriere un verre depoli et la croix de fermeture avec.
   Meme decalage que le tiroir, meme variable, donc les deux bords tombent au
   pixel l'un sur l'autre.

   Ce que ca coute, et c'est voulu : un clic SUR LA BARRE ne ferme plus le
   tiroir, il n'y a plus de voile a cet endroit. La croix du hamburger, elle,
   redevient franchement cliquable au lieu d'etre atteinte a travers le voile. */
.gi-drawer-overlay.gi-drawer-overlay {
  position: fixed;
  inset: var(--gi-header-h, 74px) 0 0 0;
  padding: 0;
  min-height: 0;
}
.gi-drawer-overlay .et_pb_row,
.gi-drawer-overlay .et_pb_column {
  width: 100%;
  max-width: none;
  min-height: 0;
  padding: 0;
  margin: 0;
}

/* LE TIROIR COMMENCE SOUS LA BARRE, PAS SOUS LE HAUT DE LA FENETRE.
   La barre est collante et Divi lui pose son propre empilement : a `top: 0`
   le tiroir passait dessous et perdait son premier lien. Le remede n'est pas
   de monter le tiroir au-dessus de la barre, ce qui masquerait la croix de
   fermeture du hamburger, mais de le decaler : rien ne se recouvre, et la
   croix reste atteignable.

   --gi-header-h est mesuree par gi-ui.js a chaque ouverture et a chaque
   redimensionnement. Le repli de 74px est la hauteur constatee de la barre,
   il ne sert que le temps que le script tourne. */
.gi-drawer.gi-drawer {
  position: fixed;
  top: var(--gi-header-h, 74px);
  right: 0;
  left: auto;
  width: min(380px, 88vw);
  max-width: none;
  height: calc(100dvh - var(--gi-header-h, 74px));
  padding: var(--sp-5) var(--sp-5) var(--sp-8);
}
.gi-drawer .et_pb_row.et_pb_row,
.gi-drawer .et_pb_column.et_pb_column {
  width: 100%;
  max-width: none;
  padding: 0;
  margin: 0;
  row-gap: 0;
  position: static;
}
.gi-drawer .et_pb_module { margin-bottom: 0; }

/* La recherche est un module Texte qui contient un <form>. Le formulaire ne
   doit pas s'interposer entre le module, qui porte la mise en ligne, et ses
   deux enfants. */
.gi-drawer__search.gi-drawer__search {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  gap: var(--sp-3);
}
.gi-drawer__search form { display: contents; }

.gi-drawer__nav.gi-drawer__nav {
  --flex-direction: column;
  flex-direction: column;
  gap: 0;
  margin: 0;
}
.gi-drawer__item.gi-drawer__item {
  --flex-direction: column;
  flex-direction: column;
  gap: 0;
  margin: 0;
}
.gi-drawer__row.gi-drawer__row {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 0;
  margin: 0;
}
.gi-drawer__lien.gi-drawer__lien { margin: 0; width: auto; flex: 1 1 auto; }

/* Le chevron de depliage. Meme raison que le hamburger : ce n'est pas un
   <button>, gi-accueil.css le vise par `button`, il faut le reprendre ici. */
.gi-drawer__toggle.gi-drawer__toggle {
  display: grid;
  place-items: center;
  flex: none;
  width: 40px;
  height: 40px;
  margin: 0;
  color: var(--gi-gold-500);
  cursor: pointer;
  -webkit-user-select: none;
          user-select: none;
}
.gi-drawer__toggle.gi-drawer__toggle:focus-visible {
  outline: 2px solid var(--gi-gold-500);
  outline-offset: 2px;
}
.gi-drawer__toggle svg {
  width: 18px;
  height: 18px;
  transition: rotate var(--t-base) var(--ease-out);
}
.gi-drawer__item.is-open .gi-drawer__toggle svg { rotate: 180deg; }

/* Le repli anime, et il a DEUX niveaux, pour une raison de fond.

   Le motif grid-template-rows 0fr -> 1fr n'anime que la rangee EXPLICITE de la
   grille, et une grille n'y place que son PREMIER enfant : les suivants
   tombent dans des rangees implicites, en hauteur automatique, que le repli ne
   touche pas. Avec les douze liens en enfants directs, le premier etait donc
   ecrase a zero et invisible, et les onze autres restaient deplies en
   permanence. Symptome exact du premier import.

   .gi-drawer__sub est donc la grille qui se replie, et
   .gi-drawer__sub-inner l'unique enfant qui contient tous les liens. On anime
   ainsi la vraie hauteur du sous-menu, sans hauteur maximale devinee qui
   casserait la vitesse du repli des qu'un menu s'allonge. */
.gi-drawer__sub.gi-drawer__sub {
  display: grid;
  grid-template-rows: 0fr;
  gap: 0;
  margin: 0;
  transition: grid-template-rows var(--t-base) var(--ease-out);
}
.gi-drawer__item.is-open .gi-drawer__sub.gi-drawer__sub { grid-template-rows: 1fr; }
.gi-drawer__sub > .gi-drawer__sub-inner {
  overflow: hidden;
  min-height: 0;
}
.gi-drawer__sub-inner.gi-drawer__sub-inner {
  --flex-direction: column;
  display: flex;
  flex-direction: column;
  row-gap: 0;
  margin: 0;
}
.gi-drawer__sub-inner > :first-child { padding-top: var(--sp-2); }
.gi-drawer__sub-inner > :last-child { padding-bottom: var(--sp-4); }
.gi-drawer__sub-lien.gi-drawer__sub-lien { margin: 0; width: auto; }

/* Un pictogramme de bouton de plus, ecrit comme les autres : une classe, une
   variable, rien d'autre. Le coeur est le meme trace que le symbole i-tipeee
   du sprite, en aplat, pour que le bouton et l'icone de la barre disent la
   meme chose. */
.et_pb_button.gi-btn--ico-coeur { --gi-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23000'%3E%3Cpath d='M12 21.05 10.6 19.8C5.4 15.09 2 12 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.5-3.4 6.59-8.6 11.3z'/%3E%3C/svg%3E"); }

/* Les deux appels a l'action du tiroir. Le groupe leur impose une largeur
   commune : laisses frères dans la colonne, chaque bouton se serait
   dimensionne sur son propre libelle, et « Nous aider financièrement » aurait
   depasse « Rejoindre le Discord » d'une bonne moitie.

   Le bouton Divi est enveloppe dans .et_pb_button_module_wrapper : c'est
   l'enveloppe qu'il faut elargir, pas le bouton. */
.gi-drawer__ctas.gi-drawer__ctas {
  --flex-direction: column;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  row-gap: var(--sp-2);
  width: 100%;
  margin: var(--sp-4) 0 0;
}
.gi-drawer__ctas .et_pb_button_module_wrapper {
  width: 100% !important;
  margin: 0 !important;
  text-align: center;
}
/* LE `margin: 0` N'EST PAS DECORATIF, il annule les 32 px de
   `.gi-drawer__cta { margin-top: var(--sp-6) }` de gi-accueil.css. Cette
   valeur a un sens dans la maquette, ou le tiroir n'a QU'UN bouton et ou
   cette marge est ce qui le detache de la liste. Ici les boutons sont deux
   dans un groupe qui gere deja son ecart, et la marge s'ajoutait a la
   gouttiere : 44 px entre les deux boutons, 64 px au-dessus du premier.

   La largeur passe en !important sur le bouton ET sur son enveloppe. Divi
   peint ses boutons depuis `body #page-container … .et_pb_button_1`, un
   selecteur a identifiant qu'aucune de nos classes ne bat : c'est le seul
   moyen de garantir que les deux libelles, de longueurs tres differentes,
   donnent deux boutons de meme largeur. */
.gi-drawer__cta.gi-drawer__cta {
  display: flex;
  width: 100% !important;
  margin: 0;
  justify-content: center;
  text-align: center;
}


/* --- B16.10 Les particules des mega-menus --------------------------------

   Injectees par gi-particles.js, entree `.gi-megamenu` de sa table
   AUTO_CANVAS. Le script y est passe de querySelector a querySelectorAll : il
   y a deux, puis trois panneaux, alors que les autres sections sont uniques.

   Meme parti pris qu'en B8 et B13 : hors flux, sans clic, sous le contenu.
   Une difference toutefois, et elle compte : le panneau est cache par
   `visibility` et non par `display`, donc il a de vraies dimensions meme
   ferme, et le canvas se dimensionne correctement des le chargement. Avec
   `display: none` il serait ne a zero par zero.

   Le champ tourne aussi panneau ferme. C'est le prix d'un canvas partage, et
   il est faible : soixante particules au plafond, et gi-particles.js coupe
   tout sous 900 px de large, en mouvement reduit et quand l'onglet passe en
   arriere-plan. */
.gi-megamenu .gi-particles--auto {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  z-index: 0;
  pointer-events: none;
  border-radius: var(--r-md);
}
/* Le contenu repasse au-dessus du champ. Les equerres ont deja leur z-index. */
.gi-megamenu > .gi-megamenu__col,
.gi-megamenu > .gi-megamenu__feature { position: relative; z-index: 1; }


/* ==========================================================================
   B17. PIED DE PAGE DU THEME BUILDER

   Ecrit le 29/07/2026. Il reprend mot pour mot les principes de la partie
   B16, ce sont les memes pieges :

   1. LE CRAN DE SPECIFICITE VIENT DU DOUBLAGE DE NOTRE PROPRE CLASSE. A
      specificite egale, le CSS que Divi genere pour la page gagne : il vit en
      fin de <body>, nos feuilles sont dans le <head>. .gi-x.gi-x vaut (0,2,0)
      et designe le meme element quel que soit le DOM que Divi produit.

   2. LE MODULE LIEN EST LE <a>, pas une enveloppe autour. Ses trois couches
      internes doivent sortir du flux pour les liens de colonne ; le lien du
      logo, lui, est en SURCOUCHE et garde son texte en masquage accessible.
      D'ou deux traitements explicites et non une regle attrape-tout.

   3. UN MODULE TEXTE EST UN FLEX EN COLONNE avec 30 px de row-gap. Tout
      module qui porte du contenu inline remet ses gouttieres a zero et
      redevient un bloc, sinon les 30 px se glissent dans son contenu.

   4. NE JAMAIS POSER DE PSEUDO-ELEMENT sur un element qui porte .gi-grain ou
      .gi-vignette--soft : leur effet entier y vit. La section du pied de page
      porte LES DEUX, ::before et ::after sont pris, il n'en reste aucun.

   CE QUE LA MESURE COUVRE, ET CE QU'ELLE NE COUVRE PAS. Chaque regle de
   cette partie a ete cassee volontairement, une par une, pour verifier que
   mesure_pied.js la voit tomber. Trois enseignements, a garder si la partie
   evolue :

   - Trois regles se sont revelees INERTES et ont ete retirees plutot que
     gardees « au cas ou » : elles auraient fait croire a un piege qui ne se
     produit pas ici.
   - Le trait de separation du bas et le z-index des lignes ne deplacent
     aucune boite. Ils ne sont couverts que parce que mesure_pied.js lit
     explicitement border-top et z-index. Toute regle du meme genre ajoutee
     ici sort du champ de la verification tant qu'on ne lit pas sa propriete.
   - Les reprises de DIRECTION et de GOUTTIERE sont des filets, pas des
     correctifs : dans la repro, gi-accueil.css gagne deja. Elles tiennent le
     jour ou la feuille de Divi passe apres la notre, ou ou quelqu'un touche
     au reglage depuis le Builder. Les retirer ne fait rien bouger ici, et ce
     n'est pas une raison de le faire.
   ========================================================================== */

/* --- B17.1 Le squelette --------------------------------------------------- */

/* La section n'a aucune respiration propre : ce sont ses deux lignes qui la
   donnent, comme les deux conteneurs de la maquette. Sans ce zero, les 56 px
   de --section-padding de Divi s'ajoutent en haut et en bas. */
.gi-footer.gi-footer { padding: 0; }

/* Le grain est en ::before au z-index 2, le vignetage en ::after au 3. La
   maquette fait repasser le contenu au-dessus avec
   « .gi-vignette--soft > .gi-container » ; en Divi le conteneur est la LIGNE,
   qui ne porte pas cette classe. Sans cette reprise, le texte du pied de page
   se salit sous le vignetage. */
.gi-footer > .et_pb_row { position: relative; z-index: 4; }

/* Les deux lignes se comportent comme .gi-container--wide de la maquette :
   pleine largeur jusqu'a la largeur maximale, avec une gouttiere INTERIEURE.
   La partie B2 donne 92 % de large, ce qui centrerait le bloc au lieu de le
   border, et decalerait le logo vers la droite sur grand ecran. */
.gi-footer .et_pb_row.et_pb_row {
  padding-block: 0;
  margin-block: 0;
  row-gap: 0;
}
.gi-footer .et_pb_row.gi-container--wide {
  --content-width: 100%;
  --content-max-width: var(--gi-container-wide);
  padding-inline: var(--gi-gutter);
}
.gi-footer .et_pb_column.et_pb_column {
  width: 100%;
  max-width: none;
  padding: 0;
  margin: 0;
  row-gap: 0;
}

/* Les ecarts viennent des gouttieres de groupe, jamais de la marge basse que
   Divi pose sur chaque module. L'intitule de colonne reprend la sienne plus
   bas, avec le cran de specificite qu'il faut. */
.gi-footer .et_pb_module { margin-bottom: 0; }


/* --- B17.2 Le bloc haut --------------------------------------------------- */

/* LA MARQUE A GAUCHE, LES DEUX COLONNES CALEES A DROITE. La seconde piste est
   en `auto` : elle se dimensionne sur son contenu, et tout l'espace restant va
   a la premiere. Divi ne sait poser que des colonnes egales, le NOMBRE reste
   donc un reglage du Builder et les PROPORTIONS sont ecrites ici.
   gi-accueil.css les pose deja, mais en (0,1,0), et le CSS de page de Divi
   gagne a specificite egale.

   Cout en editabilite, annonce : passer le bloc haut sur une seule colonne se
   fait toujours depuis le Builder, changer les proportions se fait ici. */
.et_pb_group.gi-footer__top {
  grid-template-columns: minmax(0, 1fr) auto;
  gap: var(--sp-8);
  align-items: start;
  padding-block: var(--sp-8) var(--sp-6);
}
@media (max-width: 900px) {
  .et_pb_group.gi-footer__top {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--sp-7);
  }
}

.gi-footer__brand.gi-footer__brand {
  --flex-direction: column;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--sp-5);
  min-width: 0;
}

/* Le logo du pied de page. Les regles de fond sont en B16.2 et ne dependent
   pas de l'emplacement ; il ne manque ici que la remise a zero de la marge
   basse, que la partie B17.1 donne deja, et le rappel que son degrade porte
   un id SUFFIXE. Deux fois le meme id dans la page et le second logo perd son
   degrade : voir gifr_entete.logo(). */

.gi-footer__social.gi-footer__social {
  --flex-direction: row;
  flex-direction: row;
  gap: var(--sp-2);
  width: auto;
  margin: 0;
}

/* Chaque icone est un module Texte en passthrough : la classe est sur le
   MODULE, le <a> est dedans. Meme traitement qu'en B16 pour .gi-nav__ico. */
.gi-footer__ico.gi-footer__ico {
  display: flex;
  align-items: center;
  flex: none;
  margin: 0;
  row-gap: 0;
  column-gap: 0;
}
/* Correction optique reprise de B16 : la marque Discord est large et basse,
   le coeur presque carre. A boite egale le coeur pese plus lourd a l'oeil. */
.gi-icon-btn.gi-footer__ico--tipeee svg { width: 17px; height: 17px; }
.gi-icon-btn.gi-footer__ico--discord:hover {
  color: #fff;
  background: rgba(88, 101, 242, 0.22);
  box-shadow: inset 0 0 0 1px rgba(88, 101, 242, 0.85),
              0 0 22px -6px rgba(88, 101, 242, 0.7);
}


/* --- B17.3 Les deux colonnes de liens ------------------------------------- */

/* Meme raison qu'en B17.2 : gi-accueil.css replie ces colonnes a 620 px, une
   largeur qui n'est PAS un point de rupture de Divi. Une media query n'ajoute
   rien a la specificite : ses regles pesent (0,1,0) et perdent contre le CSS
   de page.

   Au-dessus de 620 px le nombre reste un reglage du Builder, lu dans
   --column-count. En dessous, il est ecrit ici.

   La largeur maximale de 220 px n'est pas un caprice : sans elle, les deux
   colonnes se partageraient toute la moitie droite du pied de page et les
   libelles se perdraient dans le vide. */
.et_pb_group.gi-footer__cols {
  grid-template-columns: repeat(var(--column-count, 2), minmax(0, 220px));
  gap: var(--sp-8);
  min-width: 0;
}
/* 620 px et non 860 : c'est le palier de gi-accueil.css, verifie ligne a ligne
   dans la feuille et non deduit du bloc voisin. Se tromper de bloc de media
   query donne un repli qui a l'air juste a toutes les largeurs sauf une, et
   la premiere version de cette partie s'y est laissee prendre. */
@media (max-width: 620px) {
  .et_pb_group.gi-footer__cols {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--sp-5);
  }
}

/* Ne PAS aligner les enfants sur flex-start ici, contrairement au bloc de
   marque et a la liste de liens : l'intitule se retrecirait a la largeur de
   son texte au lieu de tenir toute la colonne, et sa lettre espacee cesserait
   de servir de reglure. L'etirement par defaut est le bon, il n'y a donc rien
   a ecrire : le redire explicitement s'est revele sans effet a la mutation. */
.gi-footer__col.gi-footer__col {
  --flex-direction: column;
  flex-direction: column;
  row-gap: 0;
  min-width: 0;
}

/* L'intitule n'est PAS un module en passthrough : il garde son
   .et_pb_text_inner, donc un seul enfant, donc rien entre quoi les 30 px de
   gouttiere pourraient se glisser. Le piege du contenu inline ne s'applique
   pas ici, et le verifier a evite trois lignes qui auraient laisse croire le
   contraire. Il ne manque que sa marge basse, qui doit repasser devant le
   margin-bottom: 0 de la partie B17.1, de meme poids. */
.gi-footer__label.gi-footer__label { margin-bottom: var(--sp-4); }

/* LES <li> N'EXISTENT PLUS. L'ecart de 0,55 rem que gi-accueil.css donne par
   « li + li » n'a plus rien a cibler : il devient une gouttiere de groupe. */
.gi-footer__links.gi-footer__links {
  --flex-direction: column;
  flex-direction: column;
  row-gap: 0.55rem;
  column-gap: 0;
  align-items: flex-start;
  min-width: 0;
}

/* Le module Lien EST le <a>. Ses trois couches internes sortent du flux, sans
   quoi la mise en forme du <a> ne s'appliquerait qu'a une enveloppe. Le lien
   du logo est exclu de cette liste : lui est en surcouche et garde son texte,
   masque en B16.2. */
.gi-footer__lien .et_pb_link_inner,
.gi-footer__lien .et_pb_link_text,
.gi-footer__lien .et_pb_link_text > p { display: contents; }

/* Dans la maquette le lien est un <a> EN LIGNE dans un <li> : sa boite fait
   la largeur du texte, et le padding-left du survol le decale de 0,3 rem sans
   elargir la colonne. Divi pose display: block sur .et_pb_link, ce qui
   l'etirerait sur toute la colonne et donnerait une zone de clic qui deborde
   loin a droite du libelle.
   Le align-items: flex-start du groupe ci-dessus suffirait ; width tient
   aussi si quelqu'un change l'alignement depuis le Builder. */
.gi-footer__lien.gi-footer__lien {
  display: block;
  width: fit-content;
  max-width: 100%;
  margin: 0;
}


/* --- B17.4 La barre du bas ------------------------------------------------ */

/* LE TRAIT DE SEPARATION APPARTIENT A LA LIGNE, PAS AU GROUPE. Dans la
   maquette c'est .gi-footer__bottom qui EST le conteneur : sa bordure haute
   court donc sur toute la largeur, gouttieres comprises. En Divi le conteneur
   est la ligne et .gi-footer__bottom est le groupe a l'interieur : laisser la
   bordure sur le groupe la raccourcirait d'une gouttiere a chaque bout.

   Doublage de classe pour repasser devant le padding-block: 0 de la partie
   B17.1, qui cible « .gi-footer .et_pb_row.et_pb_row » et pese le meme poids. */
.gi-footer .et_pb_row.gi-footer__bottom-row.gi-footer__bottom-row {
  border-top: 1px solid var(--gi-line-soft);
  padding-block: var(--sp-5);
}

.gi-footer__bottom.gi-footer__bottom {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--sp-4);
  width: 100%;
  /* gi-accueil.css les pose sur ce bloc ; ils vivent desormais sur la ligne. */
  border-top: 0;
  padding-block: 0;
}

/* Meme palier que la grille des colonnes, 620 px, et pour la meme raison. */
@media (max-width: 620px) {
  .gi-footer__bottom.gi-footer__bottom {
    --flex-direction: column;
    flex-direction: column;
    align-items: flex-start;
  }
}


/* ==========================================================================
   B18. LES GABARITS D'ARCHIVE

   Deux gabarits de corps du Theme Builder, `gifr-archive.json` et
   `gifr-archive-auteur.json`, generes par `divi/generateur/gen_archive.py`.
   Le dessin de reference est `archive.html`, sa feuille est `gi-archive.css`
   et elle se charge sur tout le site, comme `gi-accueil.css`.

   CETTE PARTIE NE REDESSINE RIEN. Elle ne fait que trois choses, dans cet
   ordre : rendre a la grille et aux conteneurs le `display` que Divi leur a
   pris, redonner aux titres et aux paragraphes la typographie de leur module,
   et replier proprement les jetons qui ne resolvent pas.

   Ce qu'elle NE reprend PAS, volontairement : les `grid-template-columns` et
   tout ce que `gi-archive.css` fait varier par palier. Les figer ici les
   figerait a toutes les largeurs, c'est le piege 7.

   NOTE SUR LES SELECTEURS. `gi-archive.css` est deja ecrite pour les deux
   DOM : elle vise `.gi-arch-grid > :first-child` et non `> li:first-child`,
   parce que la boucle duplique la carte elle-meme et qu'il n'y a pas de <li>
   sous Divi. Rien a redire ici sur la vedette : elle marche telle quelle.
   -------------------------------------------------------------------------- */

/* --- Conteneurs ----------------------------------------------------------

   Meme doctrine qu'en B10 : le cran de specificite vient du doublage de notre
   propre classe, jamais d'une classe de Divi.

   LES TROIS PREMIERES REGLES SE DONNENT POUR INERTES A LA CASSE, ET ELLES
   RESTENT. C'est le seul endroit de cette partie ou la mesure ne fait pas
   autorite, et il faut savoir pourquoi :

   - `display: grid` est couvert, dans la repro, par gi-archive.css qui se
     charge apres gi-divi.css et gagne a specificite egale sur
     `.et_flex_group { display: flex }`. SUR LE SITE REEL le CSS que Divi
     genere pour la page vit en FIN DE BODY : a specificite egale, c'est lui
     qui gagne. Le doublage de classe est exactement ce qui remet nos regles
     devant, et la repro ne sait pas le montrer. B10 dit la meme chose pour
     `.gi-news__grid`, contre le rendu reel.

   - les deux regles de direction sont couvertes, dans la repro, par le
     reglage de direction que `gen_archive.py` pose dans le Builder. C'est la
     voie propre, celle qui reste editable, et c'est bien elle qui fait le
     travail au repos. Ces deux regles sont le filet decrit en B1 : elles
     tiennent le jour ou quelqu'un rouvre le groupe et change sa direction a
     la souris. Une mesure ne verra jamais ca tomber, par construction.

   Le reste de la partie, lui, a ete casse une par une et vu tomber. */
/* SEULEMENT `display`. Le gap est dans gi-archive.css, qui le fait passer de
   --sp-4 a --sp-5 sous 760 px. L'ecrire ici le figerait a toutes les
   largeurs : c'est le piege 7, et la mesure l'a effectivement attrape. */
.gi-arch-grid.gi-arch-grid { display: grid; }

.gi-arch-head__inner.gi-arch-head__inner,
.gi-arch-bar.gi-arch-bar,
.gi-author.gi-author { flex-direction: row; }

.gi-arch-head__inner > *,
.gi-arch-bar > *,
.gi-author > * { --flex-direction: column; }

.gi-arch-head__text.gi-arch-head__text,
.gi-author__body.gi-author__body { display: flex; flex-direction: column; gap: 0; }

/* Le partage de l'en-tete, la largeur du bloc de titre, l'alignement et
   l'ecart entre les deux vivent tous dans gi-archive.css, en flex, et valent
   pour les deux DOM. B18 ne reprend donc que la DIRECTION, ci-dessus : c'est
   la seule chose que Divi impose. On avait aussi repose `align-items`, la
   casse l'a montre inerte, il est parti. */

/* Divi pose une marge basse sur chaque module. Elle n'existe pas dans la
   maquette : on l'annule sur les deux sections, puis on repose les seuls
   ecarts qui y sont vraiment. Annulation d'abord, ecarts ensuite. */
.gi-arch-head, .gi-arch-head *,
.gi-arch-body, .gi-arch-body * { margin-bottom: 0; }


/* PAS DE MARGE REPOSEE ICI, ET C'EST UNE DIFFERENCE AVEC B10. La partie B10
   annule les marges de module puis repose les cinq que la maquette avait
   vraiment. Ici, les deux qu'on avait reposees, `.gi-arch-bar` en bas et
   `.gi-arch-head__ornament` en haut, se sont averees INERTES a la casse :
   gi-archive.css les declare deja et se charge APRES gi-divi.css, elle gagne
   donc a specificite egale. Elles sont retirees. */

/* --- L'ornement du titre --------------------------------------------------

   `.gi-arch-head__ornament` est un conteneur en ligne qui porte deux
   pseudo-elements de filet et une etoile. Sous Divi c'est un module Texte,
   donc un flex en COLONNE : les deux filets partiraient chacun sur sa ligne.
   Meme correction qu'en B3 pour l'etoile de section. */
.gi-arch-head__ornament.gi-arch-head__ornament {
  --flex-direction: row;
  flex-direction: row;
  align-items: center;
  gap: 0.7rem;
}

/* --- Les titres et les paragraphes ont perdu leur classe ------------------

   Meme piege qu'en B10 : la classe est sur le MODULE, l'element ecrit a la
   main a l'interieur n'en porte aucune. */
.gi-arch-head__title :is(h1, h2, h3),
.gi-author__name :is(h1, h2, h3) {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  line-height: inherit;
  text-wrap: inherit;
  margin: 0;
  padding: 0;
}

/* GARDEE SANS PREUVE, et c'est dit. La casse la donne pour inerte : un <p>
   n'a pas de taille propre a annuler, contrairement a un <h1>, et gi-tokens
   lui a deja retire sa marge. Mais c'est la jumelle exacte de la regle de
   B10, qui, elle, a ete ecrite contre le rendu reel du site, et la repro ne
   voit pas la typographie que Divi pose sur ses propres <p>. On la garde
   jusqu'au premier controle sous Firefox, ou elle se tranchera pour de bon. */
.gi-arch-bar__label p,
.gi-author__role p,
.gi-author__name p,
.gi-author__bio p {
  margin: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  line-height: inherit;
}

/* --- Le ruban « A la une » ------------------------------------------------

   C'est un module Texte marque `.gi-passthrough` : son enveloppe interne
   disparait et le module lui-meme porte l'etiquette. Il est en position
   absolue dans la vignette, comme l'etiquette de categorie en B10. */
/* UNE SEULE LIGNE, ET IL A FALLU DEUX PASSES POUR LE SAVOIR. On en avait
   ecrit deux : celle-ci, et un `display: inline-flex; flex-direction: row;
   width: auto` sur la vedette. Cassees UNE A UNE, les deux se donnaient pour
   inertes, chacune etant couverte par l'autre. Cassees ENSEMBLE, le ruban
   tombe en colonne et perd seize pixels de large.

   Lecon, et elle vaut pour tout le projet : casser une regle a la fois ne
   suffit pas quand deux regles se recouvrent, elles se rassurent l'une
   l'autre. Ici on garde la plus generale, qui vaut pour toutes les cartes, et
   la seconde est partie. */
.gi-post__feat.gi-post__feat { --flex-direction: row; }

/* --- Le repli des jetons qui ne resolvent pas -----------------------------

   Trois jetons de ce gabarit ne sont pas constates : la categorie par
   article, l'avatar du redacteur et sa biographie. Un jeton mal nomme rend
   une chaine vide, il ne casse rien, mais une etiquette vide est un rectangle
   pose sur la vignette et un avatar sans source est un carre casse.

   L'etiquette est deja traitee en B10, la regle vaut ici sans rien ajouter.
   Restent l'avatar et la bio, qui se replient de la meme facon. Ces regles ne
   sont pas des rustines a retirer une fois les bons jetons trouves : un
   redacteur sans photo ni biographie n'en aura pas non plus, et c'est le
   comportement voulu. */
/* NON MESUREES. La chaine de verification compare `gifr-archive.json`, le
   gabarit de categorie, qui n'a pas de bloc redacteur. Ces deux regles ne
   sont donc ni prouvees ni infirmees : elles se controleront a l'oeil sur
   une archive d'auteur reelle, apres import. */
/* `src*="/"` ET NON `src^="http"`, ET LA NUANCE COMPTE. Une URL d'avatar peut
   commencer par `https://`, par `/wp-content/`, ou par `//` pour Gravatar :
   trois debuts differents pour la meme chose. Chercher une barre oblique
   QUELQUE PART couvre les trois, et ne couvre pas le cas qu'on veut exclure,
   un jeton qui n'a pas resolu et qui rend une chaine vide ou son propre nom.

   La version precedente, en `^=`, etait plus etroite que necessaire : elle
   pouvait masquer un avatar parfaitement valide, ce qui donne exactement le
   meme symptome qu'un jeton faux et rend le diagnostic impossible. */
.gi-author__avatar:not(:has(img[src*="/"])) { display: none; }
.gi-author__bio:has(p:empty) { display: none; }

/* --- La pagination --------------------------------------------------------

   `wp:divi/post-nav`, constate dans un export reel le 29/07. Il vise sa
   boucle par `targetLoop` et se pose HORS du conteneur boucle.

   SON BALISAGE INTERNE N'A PAS ENCORE ETE LU SUR UNE PAGE PUBLIEE. Les deux
   regles ci-dessous sont ecrites pour n'en rien supposer :

   - la premiere rend au module lui-meme la mise en page que `.gi-pagination`
     porte dans la maquette. Sans elle, le groupe n'aurait qu'UN enfant, le
     module, et son `justify-content: space-between` ne separerait rien ;
   - la seconde DISSOUT ce que le module met entre lui et ses liens, quel
     que soit ce quelque chose. `display: contents` fait disparaitre une
     enveloppe du flux sans toucher a son contenu : les liens deviennent
     enfants de flex de plein droit, que Divi les enveloppe dans des <span>,
     des <div> ou rien du tout.

   C'est la meme mecanique que `.gi-passthrough` en B1, appliquee a un
   balisage qu'on ne connait pas encore plutot qu'a un qu'on connait. A
   resserrer quand le DOM aura ete lu. */
.gi-pagination > .et_pb_post_nav {
  display: flex;
  flex: 1;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  gap: var(--sp-4);
  margin: 0;
}
.gi-pagination > .et_pb_post_nav > *:not(a) { display: contents; }

/* Le module doit suivre le palier que gi-archive.css pose sur le conteneur :
   sous 620 px les deux liens passent l'un sous l'autre. Sans ce rappel, la
   regle ci-dessus figerait la ligne a toutes les largeurs, et c'est le
   piege 7. La mesure l'a attrape a 620 px. */
@media (max-width: 620px) {
  .gi-pagination > .et_pb_post_nav {
    flex-direction: column;
    align-items: stretch;
  }
}

/* --- CE QUI MANQUE ENCORE, ET QUI N'EST PAS UN OUBLI ----------------------

   1. LE BALISAGE INTERNE DE `post-nav`. Le module est en place, ses liens
      sont habilles, sa mise en page est rendue au groupe. Reste a LIRE son
      DOM sur une archive publiee et a resserrer les deux regles ci-dessus,
      qui sont volontairement larges.

   2. L'ARCHIVE VIDE. Divi ecrit lui-meme « Aucun resultat trouve » a la place
      d'une boucle vide. Notre bloc `.gi-arch-empty` ne peut pas vivre dans le
      gabarit : il s'afficherait aussi sur les archives pleines. La bonne
      reponse est d'HABILLER le message de Divi, ce qui demande de connaitre
      sa balise et sa classe. A relever sur une archive vide reelle.

   Les deux se lisent sur une archive publiee, a l'oeil, en trente secondes. */

/* --------------------------------------------------------------------------
   B19. PAGE DES LIVES

   Deux sections, un bandeau de titre et la scene, et deux pieces rapportees
   dans des iframes tierces : le lecteur Twitch et le chat WidgetBot.

   Ce que cette partie fait, et pourquoi elle existe malgre gi-live.css : la
   maquette pose ses regles sur des elements qui, en Divi, sont des MODULES.
   Un module est un conteneur flex en colonne par defaut, il porte les
   gouttieres de Divi, et le CSS de page de Divi vit en fin de body, donc gagne
   toute egalite de specificite. Les reprises ci-dessous sont ecrites en classe
   doublee quand il faut gagner ce duel.
   -------------------------------------------------------------------------- */

/* --- B19.0 L'enveloppe des raccourcis ------------------------------------

   Trois modules de cette page ne contiennent qu'un raccourci `[gifr_live]`,
   enveloppe dans un `<div class="gi-dyn">`. L'enveloppe existe pour wpautop,
   qui s'execute AVANT les raccourcis et met dans un <p> tout contenu qui ne
   commence pas par une balise de bloc : un raccourci nu se retrouvait dans un
   <p> que le navigateur cassait ensuite en rencontrant le <div> rendu, et le
   DOM final ne ressemblait plus a ce qu'on croyait avoir ecrit.

   `display: contents` la fait disparaitre a l'affichage, sans quoi elle
   s'interposerait entre le module et son contenu -- ce qui, sur cette page,
   casserait la grille du panneau d'horaire et la pile du lecteur.

   ATTENTION, ELLE RESTE VISIBLE DES SELECTEURS. `display: contents` ne change
   rien au parcours du DOM : un `>` ne la traverse pas. C'est pour ca que
   gi-live.css a du passer ses regles d'iframe en descendant. */
.gi-dyn { display: contents; }

/* --- B19.1 La largeur de la scene ----------------------------------------

   La scene va jusqu'aux bords, la maquette le fait avec `max-width: none` sur
   son conteneur. En Divi la largeur de la ligne vient de DEUX variables, et
   `--content-width` valait encore 92 % : sans cette reprise, la scene perdait
   8 % de large sans qu'aucune regle a nous ait ete perdue.

   Le mode normal, pose par `data-etroit` sur <body>, rend la laisse de
   1760 px. Les gouttieres sont celles de Divi dans ce mode : la ligne se
   centre avec ses 92 %, exactement comme les autres pages du site. */
.gi-live > .et_pb_row.gi-container--wide {
  --content-width: 100%;
  --content-max-width: none;
  padding-inline: clamp(0.75rem, 0.4rem + 0.6vw, 1.25rem);
}
body[data-etroit] .gi-live > .et_pb_row.gi-container--wide {
  --content-width: 92%;
  --content-max-width: 1760px;
  padding-inline: 0;
}

/* --- B19.2 La grille de la scene -----------------------------------------

   ELLE NE PEUT PAS ETRE NATIVE. La grille de Divi fait N colonnes egales ;
   celle-ci fait `minmax(0, 1fr)` puis une colonne fixe. Elle reste donc en
   CSS, et en CLASSE DOUBLEE pour passer devant le CSS de page de Divi, qui
   mettrait le groupe en flex.

   LA MEDIA QUERY DOIT ETRE REPRISE ICI AUSSI, et c'est le piege : la regle a
   deux classes gagnerait sur la regle a une classe de gi-live.css, y compris
   sous 1080 px, et le chat resterait en deuxieme colonne sur mobile. Meme
   piege que le pied de page. */
.gi-live-stage.gi-live-stage {
  display: grid;
  grid-template-columns: minmax(0, 1fr) var(--gi-live-chat-w);
  align-items: stretch;

  /* PAS DE `margin-inline: auto` ICI, et c'est le meme piege qu'en B15 pour la
     section Discord. Divi met chaque colonne en flex : une marge automatique
     sur l'axe transversal d'un conteneur flex DESACTIVE l'etirement de
     l'element, qui retombe alors sur la largeur de son CONTENU. Mesure : la
     scene tombait de 1726 a 933 px, soit la largeur intrinseque du lecteur
     plus celle du chat, et se retrouvait centree dans un vide.

     La maquette, elle, a besoin de cette marge : son conteneur est un bloc,
     pas un flex. On l'annule donc ici, et on centre avec `align-self`, qui
     centre sans toucher au dimensionnement. */
  margin-inline: 0;
  align-self: center;
  width: 100%;
}
@media (max-width: 1080px) {
  .gi-live-stage.gi-live-stage { grid-template-columns: minmax(0, 1fr); }
}

/* --- B19.3 Les composants en ligne ---------------------------------------

   Filet de securite du piege numero un : Divi ecrit --flex-direction: column
   sur chaque module et chaque groupe. Ces quatre-la sont en ligne par nature
   et ne doivent jamais basculer, quelle que soit la main qui edite la page.
   Le generateur pose deja la direction en natif sur les groupes ; on alimente
   ici la variable de Divi, ce qui laisse le reglage du Builder prioritaire. */
.et_pb_module.gi-live-bar,
.et_pb_module.gi-live-bar__tools { --flex-direction: row; }

/* --- B19.4 Les gouttieres et les marges de Divi --------------------------

   AUCUNE REGLE DE GAP ICI, ET C'EST DELIBERE. Le premier jet mettait
   `row-gap: 0; column-gap: 0` sur tous les modules des deux sections : ca
   effacait aussi les quatre `gap` que gi-live.css declare vraiment, et
   l'interieur du bandeau perdait ses 48 px de gouttiere. Les gaps sont
   desormais decides module par module par le generateur, et la feuille ne s'en
   mele plus.

   Restent les MARGES. Divi pose `margin-bottom: --module-gutter` sur chaque
   module ; la partie B1 l'annule pour les enfants d'un groupe, mais pas pour
   le groupe de tete, celui qui est enfant direct de la colonne. Sans cette
   reprise, la scene finissait 30 px plus bas que la maquette. */
.gi-live .et_pb_column > .et_pb_module { margin-bottom: 0; }

/* --- B19.5 Le titre de la page, dans la barre du lecteur ------------------

   LE <h1> DE LA PAGE EST DANS UN COMPOSANT depuis le 30/07 : le bandeau
   d'en-tete a ete retire, et le titre de la barre du lecteur a pris le relais.
   Une page sans titre de niveau 1 est un trou pour le referencement.

   La remise a plat est faite dans gi-live.css, sur `.gi-live-bar__title`
   lui-meme, et non ici : la classe est portee par le <h1>, pas par un ancetre,
   donc une seule classe suffit a battre le `h1 { padding-bottom: 10px }` du
   theme. Mesure : sans elle, la barre passait de 44 a 54 px de haut et poussait
   le lecteur de 10 px.

   CE QUI RESTE ICI est ce que gi-live.css ne peut pas dire, parce que ca depend
   du DOM de Divi : le pied de panneau du chat, et le padding de paragraphe du
   theme. */
.gi-live-chat__foot p {
  margin: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  line-height: inherit;
}

/* LE PADDING DE PARAGRAPHE DU THEME, ET IL FAUT LE DIRE POUR TOUTE LA SECTION.
   Divi pose `p { padding-bottom: 1em }` et ne l'annule que sur le dernier <p>
   de son type. Chaque module qui rend plusieurs paragraphes gagnait donc 16 px
   sous chacun sauf le dernier : le titre du chat decolle de son sous-titre, le
   cadre d'attente de son explication, la barre du lecteur de sa ligne de meta.
   Mesure : la barre passait de 54 a 67 px de haut et la scene de 814 a 827.

   `:last-of-type` SE COMPTE PAR RAPPORT AU PARENT, et c'est ce qui rendait le
   symptome irregulier : deux <p> dans une enveloppe en `display: contents` ont
   cette enveloppe pour parent, pas le module.

   LES TITRES SONT INCLUS depuis que le <h1> de la page vit dans la barre du
   lecteur : le theme leur pose le meme padding.

   Reprise en bloc pour toute la section plutot que composant par composant : la
   maquette ne pose AUCUN padding de paragraphe, et cette section ne contient que
   nos composants. Un paragraphe ajoute demain sera juste tout seul. Les
   espacements voulus viennent des `gap` et des `margin-top` de gi-live.css,
   jamais d'un padding herite. */
.gi-live p,
.gi-live :is(h1, h2, h3, h4, h5, h6) { padding-bottom: 0; }

/* LES DEUX PIEDS DE PANNEAU SONT DE VRAIS PARAGRAPHES, et la partie B1 les
   efface : elle met en `display: contents` tout <p> enfant direct d'une
   enveloppe de module a `gi-passthrough`, ce qui est fait pour le <p> ajoute
   par wpautop autour d'un contenu inline. Ici ce sont des paragraphes ecrits,
   et le chat a besoin qu'ils restent des elements de flex pour se poser sous le
   cadre. On leur rend leur boite, avec un cran de specificite de plus. */
.gi-live-chat [class*="_inner"] > p.gi-live-chat__foot { display: block; }

/* --- B19.6 Le lecteur ----------------------------------------------------

   Le module porte `.gi-live-player`, donc le format 16:9 et le rognage. Divi
   met tous ses modules en flex : les deux substituts qu'il contient sont en
   position absolue, la direction n'a donc aucune importance, mais un
   `min-height` implicite de flex pourrait etirer la boite. On la fige. */
.gi-live-player.gi-live-player { display: block; }

/* --- B19.7 Le chat -------------------------------------------------------

   Le panneau est un module, et c'est lui qui doit remplir la colonne : sans
   `flex: 1 1 auto` il s'arreterait a la hauteur de son texte et laisserait un
   trou de 250 px sous les messages. gi-live.css le dit deja, en une classe ;
   le CSS de page de Divi pose un `flex` sur les modules et gagnerait. */
.gi-live-chat.gi-live-chat { flex: 1 1 auto; min-height: 0; }

/* Le cadre de chat ne mesure jamais son contenu : c'est la condition pour que
   le lecteur garde son format. Rappele ici en classe doublee pour la meme
   raison que ci-dessus. */
.gi-live-chat__frame.gi-live-chat__frame { flex: 1 1 0; min-height: 16rem; }


/* ==========================================================================
   B20. PAGE D'ATTENTE « EN RECONSTRUCTION »

   La maquette de cette page n'a demande AUCUNE regle neuve : elle est montee
   sur `.gi-cta` (section, fond, particules) et `.gi-arch-empty` (le panneau,
   ecrit a l'origine pour l'archive vide). Ce bloc-ci n'est pas du dessin, c'est
   de la RECONCILIATION : il dit ce que le DOM de Divi ajoute et que la maquette
   n'a pas. Meme role que B19.5 pour la page des lives.

   La section porte `gi-recons`, un crochet sans style ailleurs : c'est aussi la
   clef de la table `FONDS` de gi-ui.js, qui lui pose son canevas de poussieres.
   ========================================================================== */

/* B20.1 LA LARGEUR DE LIGNE. La partie 4 impose `max-width: 46em !important` a
   toute ligne dans une `.gi-cta` : c'est la mesure de l'appel communaute de
   l'accueil, qui n'a pas de panneau. Ici la maquette borne `.gi-cta__inner` a
   720 px. Un cran de specificite de plus, et les deux pages tombent au meme
   pixel. */
.gi-recons .et_pb_row { max-width: 720px !important; }

/* B20.2 LA MARGE DU GROUPE DE TETE. Divi pose `margin-bottom: 30px` sur chaque
   module ; la partie B1 l'annule pour les enfants d'un groupe, mais pas pour le
   groupe qui est enfant direct de la colonne. Exactement le meme oubli que
   B19.4 sur la page des lives, ou la scene finissait 30 px trop bas. */
.gi-recons .et_pb_column > .et_pb_module { margin-bottom: 0; }

/* B20.3 LE BOUTON NE SUIT PAS UN PARAGRAPHE, IL SUIT UN PANNEAU. La partie 2
   pose `margin-top: var(--sp-7)` sur tout bouton qui suit un module Texte dans
   une `.gi-cta`, faute de pouvoir grouper les modules la-bas. Ici le panneau
   gere ses ecarts au `gap`, et `.gi-arch-empty .gi-btn` a son propre
   `margin-top`. Les 40 px de trop tombent. */
.gi-recons .et_pb_text + .et_pb_button_module_wrapper { margin-top: 0 !important; }

/* B20.4 LE PADDING DE TITRE ET DE PARAGRAPHE DU THEME, en bloc pour toute la
   section. Meme raisonnement qu'en B19.5 : la maquette n'en pose aucun, cette
   section ne contient que nos composants, et les ecarts voulus viennent du
   `gap` de `.gi-arch-empty`. Sans cette ligne le titre gagne 10 px et chaque
   paragraphe sauf le dernier en gagne 16. */
.gi-recons p,
.gi-recons :is(h1, h2, h3, h4, h5, h6) { padding-bottom: 0; }

/* B20.5 L'INTERLIGNE DU TITRE, ET C'EST LE SEUL ECART QU'ON N'AVAIT PAS PREVU.
   Dans la maquette, `.gi-arch-empty__title` EST le titre : il recoit donc le
   `line-height: var(--lh-snug)` que gi-tokens.css donne a tout <h1> a <h5>. En
   Divi la classe est sur le MODULE, et le <h1> a l'interieur prend
   `line-height: inherit` -- donc celui du corps de page, 1,65 au lieu de 1,28.
   Mesure : le titre passait de 25,6 a 33 px de haut, et le panneau entier de
   396 a 405.
   Pose sur `.gi-recons` et non sur `.gi-arch-empty__title` seul : la meme classe
   sert a l'archive vide, ou le titre est un <p> et doit garder l'interligne du
   corps. On ne corrige que la page qui en a besoin. */
.gi-recons .gi-arch-empty__title { line-height: var(--lh-snug); }
