/*
 * Page « Combat politique (détail) » — styles.
 *
 * Repris de la maquette « Migration et santé », chargés UNIQUEMENT sur le gabarit
 * template-combat.php (voir inc/enqueue.php). Tout est scopé sous « .cbt-page » : plusieurs
 * classes (.wrap, .sec-title, .hl, .kick, .hr, .reveal, .see-all, .btn-orange,
 * .btn-ghost-line) sont partagées avec d'autres gabarits et ne doivent fuir ni vers l'en-tête,
 * ni vers le pied de page. Les polices « Anton » et « Open Sans » sont fournies globalement par
 * style.css (@font-face + enqueue) → non redéclarées ici.
 *
 * Écarts assumés par rapport à la maquette (rendu identique, feuille sans code mort) :
 *   • la maquette scopait ses styles sous « .contact-page » (sa feuille avait été copiée depuis
 *     la page Contact) : le gabarit pose « .cbt-page », qui porte le même habillage ;
 *   • la PREMIÈRE section en flux reçoit le retrait haut qui dégage l'en-tête fixe du site. La
 *     maquette s'affichait sans en-tête : sa photo pleine largeur partait du haut de la page et
 *     se retrouverait cachée derrière la barre de navigation, qui est opaque. Le retrait porte
 *     sur la SECTION (pas sur la photo, qui doit rester collée sous la barre) et tient aussi
 *     quand le bandeau est rendu sans photo. Il suit les deux hauteurs possibles de l'en-tête
 *     (voir « Dégagement de l'en-tête » plus bas) ;
 *   • GOUTTIÈRES : la maquette posait « padding: 0 48px » sans largeur maximale. Le thème
 *     aligne ses gouttières sur la barre de navigation : 26 px, 20 px sous 640 px — y compris
 *     sur la galerie (qui n'est pas dans un « .wrap ») et sur la pastille du bandeau. La pleine
 *     largeur de la maquette est conservée : aucune « max-width » n'est posée ;
 *   • les cadres « image-slot » de la maquette (attente de l'outil de maquettage) sont de
 *     vraies balises <img>. Sans image choisie, le gabarit ne rend pas la balise : il n'y a
 *     donc aucun cadre d'attente à styler. Les conteneurs gardent en revanche leur fond de
 *     secours et leur ratio, pour rester présentables sans photo ;
 *   • les COULEURS posées par le RANG (:nth-child) sont supprimées. Celle d'une ligne de
 *     publication (filet, année, pastille) vient du TYPE de la publication, servi en variable
 *     « --cbt-pub-color » sur la ligne ; celles des pastilles d'action et d'actualité arrivent
 *     en style en ligne (« background ») : ces deux classes ne portent donc QUE la forme.
 *     Sinon les couleurs se décaleraient dès qu'un contenu n'est pas rendu ;
 *   • les grilles s'adaptent au NOMBRE d'éléments rendus (« --cbt-gal-cols »,
 *     « --cbt-actu-cols » et « --cbt-stats-cols ») : la maquette figeait 3, 3 et 2 colonnes.
 *     Un contenu seul occupe toute la largeur au lieu d'une fraction suivie de vide. Les CARTES
 *     D'ACTION font exception et gardent leurs deux colonnes même seules : leur image est en
 *     16/9, une carte étirée sur toute la largeur lui donnerait 780 px de haut ;
 *   • le bandeau « Notre position » perd une de ses deux colonnes quand le back-office en a
 *     vidé le contenu (« .cbt-pos-grid--solo » → une seule colonne) ;
 *   • « .hl » garde ses DEUX rôles de la maquette : simple couleur de texte dans le titre du
 *     bandeau, surligneur bleu clair dans les titres de section (« .sec-title .hl ») ;
 *   • LIENS : style.css pose « a { display: block } » pour tout le site, et le scope de la page
 *     remet « text-decoration: none » et « color: inherit ». Chaque lien reçoit donc ici un
 *     « display » explicite, et le libellé d'un bouton plein garde sa couleur au survol (aucun
 *     « a:hover » global ne doit pouvoir le repeindre). Les cartes entières sont des liens :
 *     les règles portent sur la CLASSE, jamais sur « a.classe », pour qu'une carte sans lien
 *     (rendue en <div>) ait exactement la même apparence ;
 *   • TITRES ET CONTENEURS DE CARTES EN <span> : la maquette utilisait <h3> et <p>, le
 *     balisage réel n'emploie que des <span> (contenu valide à l'intérieur d'un <a>). Un
 *     « display » de bloc (block, flex ou inline-flex) est donc posé partout où la maquette
 *     comptait sur un élément de bloc ;
 *   • sans JavaScript, les blocs « .reveal » sont visibles d'office (@media scripting: none) ;
 *     l'apparition est aussi neutralisée en « mouvement réduit ». Aucun contenu ne peut rester
 *     invisible ;
 *   • ne sont pas reprises de la feuille de la maquette : le @font-face d'Anton (global), le
 *     box-sizing global (scopé ici), « html { scroll-behavior } » et les barres de défilement
 *     masquées sur « html/body » (hors de la page — la page n'a pas d'ancre interne), la
 *     section de don vidée par la maquette (« .mg-don », « .don-card »), « .eyebrow » et
 *     « .hr3 » (jamais posés par le balisage), la hauteur en dur du chapeau
 *     (« .mg-lead { height: 150px } », style de l'outil de maquettage) et le filtre de la
 *     flèche des boutons (l'asset du thème est déjà blanc).
 *
 * Ajouts par rapport à la maquette (elle ne prévoyait pas ces cas, le gabarit les rend) :
 *   • « .cbt-act-card--urgent » : la maquette ne marquait une urgence que par la couleur de la
 *     pastille. La carte reçoit ici la marque d'urgence du thème — « border: 2px solid #bd1118 »,
 *     comme « .country-card.urgent » dans actions.css ;
 *   • les liens écrits dans le texte riche de « Notre position » sont soulignés en bleu clair :
 *     le reset « color: inherit » les rendrait invisibles sur le bandeau marine ;
 *   • une ligne de publication sans année ne réserve plus la colonne de 96 px qui lui était
 *     destinée, sinon le titre y glisserait ;
 *   • la mosaïque de la galerie (première colonne double, grande cellule sur deux rangées) ne
 *     s'applique qu'à partir de trois cartes : à une ou deux, elle laisserait un trou.
 *
 * @package medecins-du-monde
 */

/* ============================================================================
 * Base
 * ========================================================================= */

.cbt-page,
.cbt-page *,
.cbt-page *::before,
.cbt-page *::after {
  box-sizing: border-box;
}
.cbt-page {
  font-family: 'Open Sans', sans-serif;
  color: #1d1a55;
  background: #fff;
  line-height: 1.4;
  -webkit-font-smoothing: antialiased;
}
.cbt-page h1,
.cbt-page h2 {
  margin: 0;
}
.cbt-page p {
  margin: 0;
}
.cbt-page a {
  text-decoration: none;
  color: inherit;
}
/* Boutons pleins : leur libellé garde sa couleur au survol. Un « a:hover » global (le thème en
   pose plusieurs, par section) repeindrait sinon le texte en orange sur fond orange. */
.cbt-page .btn-orange,
.cbt-page .btn-orange:hover {
  color: #fff;
}
/* Gouttières calquées sur celles de la barre de navigation (voir « nav » dans style.css) :
   26 px, 20 px sous 640 px. Les sections s'alignent ainsi sur le logo et le bouton « Faire un
   don ». La maquette était en pleine largeur : aucune largeur maximale n'est ajoutée. */
.cbt-page .wrap {
  padding: 0 26px;
}

/* --- Titres et éléments partagés --- */

.cbt-page .sec-title {
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: clamp(28px, 3.6vw, 46px);
  line-height: 1.18;
  letter-spacing: -.01em;
  color: #1d1a55;
}
/* Dans un titre de section, « .hl » est le surligneur bleu clair ; dans le titre du bandeau,
   c'est une simple couleur de texte (voir « .cbt-hero h1 .hl » plus bas). Les deux viennent de
   la maquette, et le balisage pose la même classe dans les deux cas (mdm_cbt_title_html()). */
.cbt-page .sec-title .hl {
  background: linear-gradient(#bddfec, #bddfec) no-repeat;
  background-size: 100% 1.36em;
  background-position: 0 0.07em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}
.cbt-page .kick {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 14px;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .08em;
  color: #e9511c;
}
.cbt-page .kick::before {
  content: '';
  width: 22px;
  height: 2px;
  background: #e9511c;
  border-radius: 2px;
}
.cbt-page .see-all {
  display: inline-block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .05em;
  color: #055da8;
  border-bottom: 2px solid #055da8;
  padding-bottom: 3px;
  white-space: nowrap;
  transition: color .25s, border-color .25s;
}
.cbt-page .see-all:hover {
  color: #e9511c;
  border-color: #e9511c;
}

/* --- Boutons --- */

.cbt-page .btn-orange {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  background: #e9511c;
  border: 1px solid #e9511c;
  border-radius: 5px;
  padding: 14px 26px;
  font-size: 16px;
  font-weight: 600;
  transition: background-color .3s;
}
.cbt-page .btn-orange:hover {
  background: #d1440f;
}
/* La flèche du thème (assets/svgs/common-arrows/arrows-long-right.svg) est déjà blanche : le
   « filter: brightness(0) invert(1) » de la maquette, qui blanchissait sa propre flèche noire,
   n'a plus d'objet. */
.cbt-page .btn-orange img {
  width: 14px;
  transition: transform .3s;
}
.cbt-page .btn-orange:hover img {
  transform: translateX(4px);
}
/* Le bouton fantôme n'existe que dans le bandeau, sur fond blanc : la maquette en donnait
   d'abord la variante claire (pour fond sombre) avant de la surcharger pour ce bandeau. Une
   seule règle suffit donc, sans déclaration morte. */
.cbt-page .btn-ghost-line {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: transparent;
  color: #1d1a55;
  border: 1px solid #cfd9e8;
  border-radius: 5px;
  padding: 14px 26px;
  font-size: 16px;
  font-weight: 600;
  transition: background-color .3s, color .3s, border-color .3s;
}
.cbt-page .btn-ghost-line:hover {
  background: #1d1a55;
  color: #fff;
  border-color: #1d1a55;
}

/* ============================================================================
 * Animations d'entrée (la classe « in » est posée par assets/js/combat.js)
 * ========================================================================= */

@keyframes cbt-rise {
  from {
    opacity: 0;
    transform: translateY(24px);
  }
  to {
    opacity: 1;
    transform: none;
  }
}
.cbt-page .hr {
  animation: cbt-rise .7s cubic-bezier(.22, .61, .36, 1) both;
}
.cbt-page .hr2 {
  animation-delay: .12s;
}
.cbt-page .reveal {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity .7s cubic-bezier(.22, .61, .36, 1), transform .7s cubic-bezier(.22, .61, .36, 1);
}
.cbt-page .reveal.in {
  opacity: 1;
  transform: none;
}

/* ============================================================================
 * Dégagement de l'en-tête
 *
 * L'en-tête du thème est en position:fixed et opaque : sans retrait, il recouvrirait le haut de
 * la première section. Le retrait est porté par la première section EN FLUX, quelle qu'elle
 * soit : le bandeau d'ordinaire, la section suivante si le bandeau est entièrement vidé au
 * back-office.
 *
 * Ici la première section porte une photo pleine largeur, qui doit commencer JUSTE SOUS la
 * barre de navigation : le retrait est donc posé sur la section, pas sur la photo. Il tient
 * aussi quand le bandeau est rendu sans photo (le <div class="cbt-hero-media"> n'existe alors
 * pas) puisqu'il ne dépend pas d'elle.
 *
 * L'en-tête n'a pas une hauteur unique : la bande d'alerte qui le surmonte s'affiche ou non
 * selon un interrupteur du back-office (« alert_show »). Les deux états sont traités, au lieu
 * de réserver toujours la hauteur maximale : sinon un ruban blanc s'intercalerait entre la
 * barre de navigation et la photo dès que la bande d'alerte est masquée.
 *
 * Hauteurs mesurées, en pixels :
 *
 *                    sans la bande   avec la bande
 *   ≥ 1280 px             104             146
 *   ≤ 1279 px              59             101
 *
 * AUCUNE règle de section ne doit redéclarer « padding-top » ni un « padding » raccourci : à
 * spécificité égale, elle effacerait ce retrait. Les sections ne posent donc que
 * « padding-bottom » (et la galerie ses gouttières côté par côté).
 * ========================================================================= */

.cbt-page > :first-child {
  padding-top: 104px;
}
body:has(.alert-section) .cbt-page > :first-child {
  padding-top: 146px;
}

/* ============================================================================
 * Bandeau (hero) — photo pleine largeur, pastille, titre, chapeau et boutons
 * ========================================================================= */

.cbt-page .cbt-hero {
  position: relative;
  overflow: hidden;
}
/* La photo : ratio et fond de secours restent portés par le conteneur, pour qu'il tienne aussi
   son rôle si la médiathèque ne sert pas l'image. */
.cbt-page .cbt-hero-media {
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 21 / 8;
  background: #12305a;
  overflow: hidden;
}
.cbt-page .cbt-hero-media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Voile dégradé du bas de la photo : posé après l'image dans l'ordre de peinture, donc au-dessus
   d'elle, et sous la pastille (z-index: 2). */
.cbt-page .cbt-hero-media::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 40%, rgba(29, 26, 85, .78) 100%);
}
.cbt-page .cbt-hero-tag {
  position: absolute;
  left: 26px;
  bottom: 34px;
  z-index: 2;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .08em;
  color: #fff;
  background: #e9511c;
  border-radius: 5px;
  padding: 8px 16px;
}
.cbt-page .cbt-hero .wrap {
  position: relative;
  z-index: 1;
  padding-top: 52px;
  padding-bottom: 60px;
  display: grid;
  grid-template-columns: 1.05fr .95fr;
  gap: 56px;
  align-items: end;
}
/* Titre vidé au back-office : le texte restant prend toute la largeur au lieu de la moitié
   gauche, la colonne de droite n'ayant plus de vis-à-vis. */
.cbt-page .cbt-hero .wrap > :only-child {
  grid-column: 1 / -1;
}
.cbt-page .cbt-hero h1 {
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: clamp(48px, 7vw, 110px);
  line-height: 1.18;
  letter-spacing: -.02em;
  color: #1d1a55;
}
.cbt-page .cbt-hero h1 .hl {
  color: #055da8;
}
.cbt-page .cbt-lead {
  font-size: 17px;
  line-height: 1.75;
  color: #5b6172;
  max-width: 620px;
  margin-bottom: 24px;
}
.cbt-page .cbt-ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

/* ============================================================================
 * « Notre position » — bandeau marine, texte riche, chiffres clés et bouton
 * ========================================================================= */

.cbt-page .cbt-pos {
  padding-bottom: 80px;
}
.cbt-page .cbt-pos-band {
  position: relative;
  overflow: hidden;
  background: #1d1a55;
  border-radius: 24px;
  padding: 64px 56px;
  color: #fff;
}
.cbt-page .cbt-pos-grid {
  display: grid;
  grid-template-columns: 1.1fr .9fr;
  gap: 56px;
  align-items: start;
}
/* Une des deux colonnes entièrement vidée au back-office : celle qui reste occupe la largeur. */
.cbt-page .cbt-pos-grid--solo {
  grid-template-columns: 1fr;
}
/* Les deux colonnes n'ont pas de style propre dans la maquette. « min-width: 0 » les empêche de
   pousser la grille au-delà de sa colonne : un enfant de grille ne rétrécit pas sous la taille
   de son contenu par défaut, et un libellé de chiffre clé peut être long. */
.cbt-page .cbt-pos-text,
.cbt-page .cbt-pos-side {
  min-width: 0;
}
.cbt-page .cbt-pos-band .kick {
  color: #ff7a45;
}
.cbt-page .cbt-pos-band .kick::before {
  background: #ff7a45;
}
.cbt-page .cbt-pos-band .sec-title {
  color: #fff;
}
/* Sur le bandeau marine, le surligneur bleu clair reçoit un texte marine (maquette). */
.cbt-page .cbt-pos-band .sec-title .hl {
  color: #1d1a55;
}
/* Texte riche saisi au back-office : ses paragraphes sont des <p> enfants. */
.cbt-page .cbt-pos-body p {
  font-size: 16px;
  line-height: 1.85;
  color: #c4cde3;
  margin-top: 16px;
}
.cbt-page .cbt-pos-body p strong {
  color: #fff;
}
/* Un lien écrit dans l'éditeur : le reset « color: inherit » le rendrait indiscernable du
   texte sur ce fond marine. */
/* « display: inline » n'est pas cosmétique : style.css pose « a { display: block } » pour tout
   le site, et un lien écrit au fil du texte dans l'éditeur casserait la phrase en trois. */
.cbt-page .cbt-pos-body a {
  display: inline;
  color: #bddfec;
  text-decoration: underline;
}
/* Listes du même champ : « ul, ol { list-style: none; padding-inline-start: 0 } » (style.css)
   les aplatit en suite de lignes sans puce. Tiret orange, lisible sur le fond marine. */
.cbt-page .cbt-pos-body ul,
.cbt-page .cbt-pos-body ol {
  margin: 16px 0 0;
  padding-left: 0;
  display: flex;
  flex-direction: column;
  gap: 9px;
  list-style: none;
}
.cbt-page .cbt-pos-body ol {
  counter-reset: mdm-pos-ol;
}
.cbt-page .cbt-pos-body li {
  position: relative;
  padding-left: 26px;
  font-size: 16px;
  line-height: 1.85;
  color: #c4cde3;
  list-style: none;
}
.cbt-page .cbt-pos-body ul li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 14px;
  width: 12px;
  height: 2px;
  background: #e9511c;
}
.cbt-page .cbt-pos-body ol li {
  counter-increment: mdm-pos-ol;
}
.cbt-page .cbt-pos-body ol li::before {
  content: counter(mdm-pos-ol);
  position: absolute;
  left: 0;
  top: 1px;
  font-family: 'Anton', sans-serif;
  font-size: 14px;
  color: #bddfec;
}
.cbt-page .cbt-pos-body li strong {
  color: #fff;
}
.cbt-page .cbt-stats {
  display: grid;
  grid-template-columns: repeat(var(--cbt-stats-cols, 2), 1fr);
  gap: 14px;
}
.cbt-page .cbt-stat {
  background: rgba(255, 255, 255, .08);
  border: 1px solid rgba(255, 255, 255, .16);
  border-radius: 14px;
  padding: 26px 24px;
  transition: transform .35s cubic-bezier(.22, .61, .36, 1), background-color .3s;
}
.cbt-page .cbt-stat:hover {
  transform: translateY(-5px);
  background: rgba(255, 255, 255, .14);
}
.cbt-page .cbt-stat-num {
  font-family: 'Anton', sans-serif;
  font-size: clamp(32px, 3.4vw, 46px);
  line-height: 1;
  color: #bddfec;
  margin-bottom: 8px;
}
.cbt-page .cbt-stat-label {
  font-size: 14px;
  line-height: 1.5;
  color: #c4cde3;
  font-weight: 600;
}
.cbt-page .cbt-pos-cta {
  margin-top: 16px;
}

/* ============================================================================
 * Galerie de cartes de régions
 *
 * La galerie n'est pas dans un « .wrap » : elle porte elle-même les gouttières du thème. Les
 * paddings sont déclarés côté par côté, jamais en raccourci, pour ne pas effacer le retrait
 * d'en-tête si la galerie se retrouve première section (bandeau et position vidés).
 * ========================================================================= */

.cbt-page .cbt-gal {
  display: grid;
  /* Une ou deux cartes : autant de colonnes que de cartes (variable posée par le gabarit). */
  grid-template-columns: repeat(var(--cbt-gal-cols, 3), 1fr);
  gap: 14px;
  padding-right: 26px;
  padding-bottom: 80px;
  padding-left: 26px;
}
/* Trois cartes ou plus : la mosaïque de la maquette — première colonne double, grande cellule
   sur deux rangées. « repeat() » n'accepte qu'un entier littéral, jamais un calcul : une
   répartition INÉGALE ne peut pas se déduire de --cbt-gal-cols, elle est donc déclenchée par le
   nombre réel de cellules, qui vaut exactement --cbt-gal-cols dès trois cartes. Si le
   navigateur ignore « :has() », la grille reste en colonnes égales — jamais cassée. */
.cbt-page .cbt-gal:has(.cbt-gal-cell:nth-child(3)) {
  grid-template-columns: 2fr 1fr 1fr;
}
.cbt-page .cbt-gal:has(.cbt-gal-cell:nth-child(3)) .cbt-gal-cell--big {
  grid-row: span 2;
}
/* La cellule est un <a> quand la carte a un lien, un <div> sinon : mêmes règles pour les deux,
   donc même apparence. Fond de secours et hauteur minimale tiennent le cadre sans photo. */
.cbt-page .cbt-gal-cell {
  position: relative;
  display: block;
  overflow: hidden;
  border-radius: 16px;
  background: #12305a;
  min-height: 200px;
}
.cbt-page .cbt-gal-cell--big {
  min-height: 420px;
}
.cbt-page .cbt-gal-cell img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.cbt-page .cbt-gal-tag {
  position: absolute;
  left: 14px;
  bottom: 14px;
  z-index: 2;
  display: block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .04em;
  color: #fff;
  background: rgba(29, 26, 85, .6);
  border-radius: 5px;
  padding: 6px 12px;
}

/* ============================================================================
 * En-tête des quatre sections automatiques (titre + lien « Voir toutes »)
 * ========================================================================= */

.cbt-page .cbt-sec-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 32px;
  flex-wrap: wrap;
  margin-bottom: 36px;
}

/* ============================================================================
 * Actions internationales et actions au Canada (même carte, deux sections)
 * ========================================================================= */

.cbt-page .cbt-act {
  padding-bottom: 80px;
}
.cbt-page .cbt-act-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
}
.cbt-page .cbt-act-card {
  display: flex;
  flex-direction: column;
  border: 1px solid #cfe0ef;
  border-radius: 10px;
  overflow: hidden;
  background: #fff;
  transition: border-color .35s ease, transform .4s cubic-bezier(.22, .61, .36, 1);
}
.cbt-page .cbt-act-card:hover {
  transform: translateY(-4px);
  border-color: #055da8;
}
/* Urgence : la maquette ne la marquait que par la couleur de la pastille. On reprend la marque
   du thème (« .country-card.urgent » dans actions.css) pour que la carte se repère d'un coup
   d'œil dans la grille. */
.cbt-page .cbt-act-card--urgent {
  border: 2px solid #bd1118;
}
.cbt-page .cbt-act-card--urgent:hover {
  border-color: #bd1118;
}
.cbt-page .cbt-act-img {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  background: #eef3f8;
  border-bottom: 1px solid #e5e9f2;
  flex-shrink: 0;
  overflow: hidden;
}
.cbt-page .cbt-act-img img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* La COULEUR de la pastille arrive en style en ligne (elle décrit le pays ou l'urgence) : seule
   la forme est décrite ici. */
.cbt-page .cbt-act-tag {
  position: absolute;
  left: 12px;
  top: 12px;
  z-index: 2;
  display: block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .03em;
  color: #fff;
  border-radius: 4px;
  padding: 5px 12px;
}
.cbt-page .cbt-act-body {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: 24px 26px 26px;
  flex: 1;
}
.cbt-page .cbt-act-meta {
  display: block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .04em;
  color: #8a8fa6;
}
.cbt-page .cbt-act-title {
  display: block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 22px;
  line-height: 1.05;
  color: #1d1a55;
}
.cbt-page .cbt-act-text {
  display: block;
  font-size: 14px;
  line-height: 1.6;
  color: #3a3a52;
  flex: 1;
}
.cbt-page .cbt-act-cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .04em;
  color: #055da8;
  padding-top: 16px;
  border-top: 1px solid #eef2f8;
  margin-top: auto;
  transition: color .25s ease, gap .25s;
}
.cbt-page .cbt-act-card:hover .cbt-act-cta {
  gap: 12px;
  color: #e9511c;
}
.cbt-page .cbt-act-cta svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  stroke-width: 2.4;
  fill: none;
  stroke-linecap: round;
}

/* ============================================================================
 * Les dernières nouvelles
 * ========================================================================= */

.cbt-page .cbt-actu {
  padding-bottom: 80px;
}
.cbt-page .cbt-actu-grid {
  display: grid;
  grid-template-columns: repeat(var(--cbt-actu-cols, 3), 1fr);
  gap: 24px;
}
.cbt-page .cbt-actu-card {
  display: flex;
  flex-direction: column;
  border: 1px solid #e1e8f3;
  border-radius: 10px;
  overflow: hidden;
  background: #fff;
  transition: transform .4s cubic-bezier(.22, .61, .36, 1), box-shadow .4s, border-color .3s;
}
.cbt-page .cbt-actu-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 22px 46px rgba(29, 26, 85, .16);
  border-color: #cfe0ef;
}
.cbt-page .cbt-actu-img {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: #eef3f8;
}
.cbt-page .cbt-actu-img img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .5s cubic-bezier(.22, .61, .36, 1);
}
.cbt-page .cbt-actu-card:hover .cbt-actu-img img {
  transform: scale(1.05);
}
/* Couleur de la pastille : réglée sur le terme de type d'actualité, servie en style en ligne. */
.cbt-page .cbt-actu-cat {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 2;
  display: block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .04em;
  color: #fff;
  border-radius: 5px;
  padding: 6px 12px;
}
.cbt-page .cbt-actu-inner {
  display: flex;
  flex-direction: column;
  padding: 22px;
  flex: 1;
}
.cbt-page .cbt-actu-meta {
  display: block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .05em;
  color: #8a90ad;
}
.cbt-page .cbt-actu-title {
  display: block;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 19px;
  line-height: 1.1;
  color: #1d1a55;
  margin: 10px 0 12px;
}
.cbt-page .cbt-actu-excerpt {
  display: block;
  font-size: 14px;
  line-height: 1.6;
  color: #4a4a6a;
  margin-bottom: 16px;
  flex: 1;
}
.cbt-page .cbt-actu-foot {
  display: flex;
  justify-content: flex-end;
  margin-top: auto;
  padding-top: 14px;
  border-top: 1px solid #eef2f8;
}
.cbt-page .cbt-actu-link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .05em;
  color: #055da8;
  transition: color .25s ease, gap .25s;
}
.cbt-page .cbt-actu-card:hover .cbt-actu-link {
  color: #e9511c;
  gap: 14px;
}
.cbt-page .cbt-actu-link svg {
  width: 15px;
  height: 15px;
  stroke: currentColor;
  stroke-width: 2.4;
  fill: none;
  stroke-linecap: round;
}

/* ============================================================================
 * Publications & ressources
 *
 * La couleur de la ligne (filet de gauche, année, pastille) vient du TYPE de la publication :
 * le gabarit la sert en variable « --cbt-pub-color » sur la ligne. Aucune alternance par rang —
 * elle se décalerait dès qu'une ligne n'est pas rendue.
 * ========================================================================= */

.cbt-page .cbt-pub {
  padding-bottom: 80px;
}
.cbt-page .cbt-pub-list {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding-top: 6px;
}
/* La ligne est un <a download> quand le fichier existe, un <div> sinon : mêmes règles pour les
   deux, donc même apparence. */
.cbt-page .cbt-pub-row {
  display: grid;
  grid-template-columns: 96px 1fr auto;
  align-items: stretch;
  border: 1px solid #c9d3e0;
  border-left-width: 4px;
  border-left-color: var(--cbt-pub-color, #055da8);
  border-radius: 4px;
  background: #fff;
  transition: transform .35s cubic-bezier(.22, .61, .36, 1), box-shadow .3s;
}
/* Année vidée au back-office : sa colonne de 96 px n'est pas réservée, sinon le titre y
   glisserait (le placement de la grille est automatique). */
.cbt-page .cbt-pub-row:not(:has(.cbt-pub-year)) {
  grid-template-columns: 1fr auto;
}
/* Le survol n'est posé que sur la variante CLIQUABLE : une publication sans fichier est rendue
   en <div>, la faire réagir au survol annoncerait une interaction inexistante. Même parti pour
   une carte de galerie sans lien. L'apparence au repos, elle, reste identique. */
a.cbt-pub-row:hover {
  transform: rotate(-0.8deg);
  box-shadow: 0 16px 36px rgba(13, 16, 50, .1);
}
.cbt-page .cbt-pub-year {
  display: flex;
  align-items: center;
  justify-content: center;
  border-right: 1px solid #e9edf4;
  font-family: 'Anton', sans-serif;
  font-size: 30px;
  line-height: .9;
  letter-spacing: -.01em;
  color: var(--cbt-pub-color, #055da8);
}
.cbt-page .cbt-pub-main {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 22px 30px;
  min-width: 0;
}
.cbt-page .cbt-pub-tag {
  display: block;
  align-self: flex-start;
  font-family: 'Anton', sans-serif;
  text-transform: uppercase;
  font-size: 14px;
  letter-spacing: .06em;
  color: #fff;
  background: var(--cbt-pub-color, #055da8);
  padding: 5px 11px;
  border-radius: 4px;
  margin-bottom: 12px;
}
.cbt-page .cbt-pub-title {
  display: block;
  font-size: clamp(18px, 1.7vw, 23px);
  font-weight: 600;
  line-height: 1.28;
  color: #1d1a55;
  letter-spacing: -.01em;
  text-wrap: pretty;
}
.cbt-page .cbt-pub-meta {
  display: block;
  font-size: 14px;
  font-weight: 500;
  color: #5b6078;
  margin-top: 11px;
}
.cbt-page .cbt-pub-action {
  display: flex;
  align-items: center;
  padding-right: 24px;
}
.cbt-page .cbt-pub-dl {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  background: #e9511c;
  color: #fff;
  border: 1px solid #e9511c;
  border-radius: 5px;
  padding: 12px 22px;
  font-size: 14px;
  font-weight: 600;
  white-space: nowrap;
  transition: background-color .2s, color .2s;
}
a.cbt-pub-row:hover .cbt-pub-dl {
  background: #fff;
  color: #e9511c;
}

/* ============================================================================
 * Adaptation aux petits écrans
 *
 * Le premier palier (1279 px) est celui de l'EN-TÊTE, pas celui de la page : il ne sert qu'au
 * dégagement du haut de page, la barre de navigation changeant de hauteur là et non aux
 * ruptures de la maquette (1040 / 640 px).
 * ========================================================================= */

@media (max-width: 1279px) {
  .cbt-page > :first-child {
    padding-top: 59px;
  }
  body:has(.alert-section) .cbt-page > :first-child {
    padding-top: 101px;
  }
}
@media (max-width: 1040px) {
  .cbt-page .cbt-hero .wrap {
    padding-top: 44px;
    padding-bottom: 52px;
    grid-template-columns: 1fr;
    gap: 26px;
  }
  .cbt-page .cbt-hero-tag {
    left: 20px;
    bottom: 20px;
  }
  .cbt-page .cbt-pos-grid {
    grid-template-columns: 1fr;
    gap: 34px;
  }
  /* Deux colonnes au plus (maquette) dès qu'il y a deux cartes ; une seule s'il n'y en a qu'une
     (la variable du gabarit vaut alors 1, la règle de base suffit). Le sélecteur reprend celui
     de la mosaïque pour l'emporter sur lui à spécificité égale. */
  .cbt-page .cbt-gal:has(.cbt-gal-cell:nth-child(2)) {
    grid-template-columns: 1fr 1fr;
  }
  .cbt-page .cbt-gal:has(.cbt-gal-cell:nth-child(3)) .cbt-gal-cell--big {
    grid-row: auto;
  }
  .cbt-page .cbt-gal-cell--big {
    min-height: 280px;
  }
  .cbt-page .cbt-act-grid,
  .cbt-page .cbt-actu-grid {
    grid-template-columns: 1fr;
  }
}
@media (max-width: 640px) {
  .cbt-page .wrap {
    padding: 0 20px;
  }
  .cbt-page .cbt-pos-band {
    padding: 34px 22px;
    border-radius: 16px;
  }
  .cbt-page .cbt-pos-grid {
    gap: 26px;
  }
  .cbt-page .cbt-pos-body p {
    font-size: 15px;
  }
  .cbt-page .cbt-pos-cta .btn-orange {
    width: 100%;
    justify-content: center;
  }
  /* Carrousels à défilement horizontal (maquette) : les marges négatives valent la gouttière du
     thème (20 px), pour que la première carte s'aligne sur le texte et que la dernière puisse
     sortir de l'écran. Paddings déclarés côté par côté (et non en raccourci) : la galerie peut
     être la première section de la page, et un raccourci y effacerait le retrait d'en-tête. */
  .cbt-page .cbt-stats,
  .cbt-page .cbt-gal,
  .cbt-page .cbt-act-grid,
  .cbt-page .cbt-actu-grid {
    display: flex;
    overflow-x: auto;
    gap: 14px;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    margin: 0 -20px;
    padding-right: 20px;
    padding-bottom: 10px;
    padding-left: 20px;
    scroll-padding-left: 20px;
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  .cbt-page .cbt-stats::-webkit-scrollbar,
  .cbt-page .cbt-gal::-webkit-scrollbar,
  .cbt-page .cbt-act-grid::-webkit-scrollbar,
  .cbt-page .cbt-actu-grid::-webkit-scrollbar {
    display: none;
    width: 0;
    height: 0;
  }
  .cbt-page .cbt-stat {
    flex: 0 0 72%;
    scroll-snap-align: start;
  }
  .cbt-page .cbt-gal-cell,
  .cbt-page .cbt-gal-cell--big {
    flex: 0 0 82%;
    min-height: 230px;
    scroll-snap-align: start;
  }
  .cbt-page .cbt-act-card,
  .cbt-page .cbt-actu-card {
    flex: 0 0 86%;
    scroll-snap-align: start;
  }
  /* La galerie n'est pas dans un « .wrap » : elle garde ses propres gouttières, sans marge
     négative, et referme le bas de page. */
  .cbt-page .cbt-gal {
    margin: 0;
    padding-right: 20px;
    padding-bottom: 56px;
    padding-left: 20px;
  }
  .cbt-page .cbt-pub-list {
    flex-direction: row;
    overflow-x: auto;
    gap: 14px;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    margin: 0 -20px;
    padding: 0 20px 10px;
    scroll-padding-left: 20px;
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  .cbt-page .cbt-pub-list::-webkit-scrollbar {
    display: none;
    width: 0;
    height: 0;
  }
  /* La ligne passe en une colonne : année, texte et bouton empilés. Le second sélecteur reprend
     celui de la ligne sans année, pour l'emporter sur lui. */
  .cbt-page .cbt-pub-row,
  .cbt-page .cbt-pub-row:not(:has(.cbt-pub-year)) {
    flex: 0 0 86%;
    grid-template-columns: 1fr;
    scroll-snap-align: start;
  }
  .cbt-page .cbt-pub-year {
    justify-content: flex-start;
    border-right: none;
    border-bottom: 1px solid #e9edf4;
    padding: 16px 20px;
  }
  .cbt-page .cbt-pub-main {
    padding: 18px 20px;
  }
  .cbt-page .cbt-pub-action {
    padding: 0 20px 20px;
  }
}

/* ============================================================================
 * Accessibilité — mouvement réduit et absence de JavaScript
 *
 * CES DEUX BLOCS DOIVENT RESTER EN FIN DE FEUILLE. Ils neutralisent des déclarations posées
 * plus haut avec la MÊME spécificité : à spécificité égale, c'est l'ordre du fichier qui
 * tranche. Sans eux, une page sans JavaScript garderait ses blocs « .reveal » invisibles —
 * personne n'y poserait la classe « in ».
 * ========================================================================= */

@media (prefers-reduced-motion: reduce) {
  .cbt-page .hr,
  .cbt-page .reveal,
  .cbt-page .reveal.in {
    animation: none;
    opacity: 1;
    transform: none;
    transition: none;
  }
}
@media (scripting: none) {
  .cbt-page .hr,
  .cbt-page .reveal {
    opacity: 1;
    transform: none;
  }
}

@media (min-width: 1700px) {
  .cbt-page .wrap {
    padding: 0 1.8057vw;
  }
  .cbt-page .sec-title {
    font-size: clamp(1.9446vw, 3.6vw, 3.1946vw);
  }
  .cbt-page .kick {
    gap: 0.6945vw;
    margin-bottom: 0.9723vw;
    font-size: 0.9723vw;
  }
  .cbt-page .kick::before {
    width: 1.5279vw;
    height: 0.1389vw;
    border-radius: 0.1389vw;
  }
  .cbt-page .see-all {
    font-size: 0.9723vw;
    border-bottom: 0.1389vw solid #055da8;
    padding-bottom: 0.2083vw;
  }
  .cbt-page .btn-orange {
    gap: 0.8334vw;
    border: 0.0694vw solid #e9511c;
    border-radius: 0.3472vw;
    padding: 0.9723vw 1.8057vw;
    font-size: 1.1112vw;
  }
  .cbt-page .btn-orange img {
    width: 0.9723vw;
  }
  .cbt-page .btn-orange:hover img {
    transform: translateX(0.2778vw);
  }
  .cbt-page .btn-ghost-line {
    gap: 0.6945vw;
    border: 0.0694vw solid #cfd9e8;
    border-radius: 0.3472vw;
    padding: 0.9723vw 1.8057vw;
    font-size: 1.1112vw;
  }
  .cbt-page .reveal {
    transform: translateY(1.5279vw);
  }
  .cbt-page > :first-child {
    padding-top: 7.2227vw;
  }
  body:has(.alert-section) .cbt-page > :first-child {
    padding-top: 10.1395vw;
  }
  .cbt-page .cbt-hero-tag {
    left: 1.8057vw;
    bottom: 2.3613vw;
    font-size: 0.9723vw;
    border-radius: 0.3472vw;
    padding: 0.5556vw 1.1112vw;
  }
  .cbt-page .cbt-hero .wrap {
    padding-top: 3.6113vw;
    padding-bottom: 4.1669vw;
    gap: 3.8891vw;
  }
  .cbt-page .cbt-hero h1 {
    font-size: clamp(3.3335vw, 7vw, 7.6394vw);
  }
  .cbt-page .cbt-lead {
    font-size: 1.1806vw;
    max-width: 43.0582vw;
    margin-bottom: 1.6668vw;
  }
  .cbt-page .cbt-ctas {
    gap: 0.8334vw;
  }
  .cbt-page .cbt-pos {
    padding-bottom: 5.5559vw;
  }
  .cbt-page .cbt-pos-band {
    border-radius: 1.6668vw;
    padding: 4.4447vw 3.8891vw;
  }
  .cbt-page .cbt-pos-grid {
    gap: 3.8891vw;
  }
  .cbt-page .cbt-pos-body p {
    font-size: 1.1112vw;
    margin-top: 1.1112vw;
  }
  .cbt-page .cbt-stats {
    gap: 0.9723vw;
  }
  .cbt-page .cbt-stat {
    border: 0.0694vw solid rgba(255, 255, 255, .16);
    border-radius: 0.9723vw;
    padding: 1.8057vw 1.6668vw;
  }
  .cbt-page .cbt-stat:hover {
    transform: translateY(-0.3472vw);
  }
  .cbt-page .cbt-stat-num {
    font-size: clamp(2.2224vw, 3.4vw, 3.1946vw);
    margin-bottom: 0.5556vw;
  }
  .cbt-page .cbt-stat-label {
    font-size: 0.9723vw;
  }
  .cbt-page .cbt-pos-cta {
    margin-top: 1.1112vw;
  }
  .cbt-page .cbt-gal {
    gap: 0.9723vw;
    padding-right: 1.8057vw;
    padding-bottom: 5.5559vw;
    padding-left: 1.8057vw;
  }
  .cbt-page .cbt-gal-cell {
    border-radius: 1.1112vw;
    min-height: 13.8897vw;
  }
  .cbt-page .cbt-gal-cell--big {
    min-height: 29.1684vw;
  }
  .cbt-page .cbt-gal-tag {
    left: 0.9723vw;
    bottom: 0.9723vw;
    font-size: 0.9723vw;
    border-radius: 0.3472vw;
    padding: 0.4167vw 0.8334vw;
  }
  .cbt-page .cbt-sec-head {
    gap: 2.2224vw;
    margin-bottom: 2.5002vw;
  }
  .cbt-page .cbt-act {
    padding-bottom: 5.5559vw;
  }
  .cbt-page .cbt-act-grid {
    gap: 1.1112vw;
  }
  .cbt-page .cbt-act-card {
    border: 0.0694vw solid #cfe0ef;
    border-radius: 0.6945vw;
  }
  .cbt-page .cbt-act-card:hover {
    transform: translateY(-0.2778vw);
  }
  .cbt-page .cbt-act-card--urgent {
    border: 0.1389vw solid #bd1118;
  }
  .cbt-page .cbt-act-img {
    border-bottom: 0.0694vw solid #e5e9f2;
  }
  .cbt-page .cbt-act-tag {
    left: 0.8334vw;
    top: 0.8334vw;
    font-size: 0.9723vw;
    border-radius: 0.2778vw;
    padding: 0.3472vw 0.8334vw;
  }
  .cbt-page .cbt-act-body {
    gap: 0.9723vw;
    padding: 1.6668vw 1.8057vw 1.8057vw;
  }
  .cbt-page .cbt-act-meta {
    font-size: 0.9723vw;
  }
  .cbt-page .cbt-act-title {
    font-size: 1.5279vw;
  }
  .cbt-page .cbt-act-text {
    font-size: 0.9723vw;
  }
  .cbt-page .cbt-act-cta {
    gap: 0.5556vw;
    font-size: 0.9723vw;
    padding-top: 1.1112vw;
    border-top: 0.0694vw solid #eef2f8;
  }
  .cbt-page .cbt-act-card:hover .cbt-act-cta {
    gap: 0.8334vw;
  }
  .cbt-page .cbt-act-cta svg {
    width: 0.9723vw;
    height: 0.9723vw;
  }
  .cbt-page .cbt-actu {
    padding-bottom: 5.5559vw;
  }
  .cbt-page .cbt-actu-grid {
    gap: 1.6668vw;
  }
  .cbt-page .cbt-actu-card {
    border: 0.0694vw solid #e1e8f3;
    border-radius: 0.6945vw;
  }
  .cbt-page .cbt-actu-card:hover {
    transform: translateY(-0.4167vw);
    box-shadow: 0 1.5279vw 3.1946vw rgba(29, 26, 85, .16);
  }
  .cbt-page .cbt-actu-cat {
    top: 0.8334vw;
    left: 0.8334vw;
    font-size: 0.9723vw;
    border-radius: 0.3472vw;
    padding: 0.4167vw 0.8334vw;
  }
  .cbt-page .cbt-actu-inner {
    padding: 1.5279vw;
  }
  .cbt-page .cbt-actu-meta {
    font-size: 0.9723vw;
  }
  .cbt-page .cbt-actu-title {
    font-size: 1.3195vw;
    margin: 0.6945vw 0 0.8334vw;
  }
  .cbt-page .cbt-actu-excerpt {
    font-size: 0.9723vw;
    margin-bottom: 1.1112vw;
  }
  .cbt-page .cbt-actu-foot {
    padding-top: 0.9723vw;
    border-top: 0.0694vw solid #eef2f8;
  }
  .cbt-page .cbt-actu-link {
    gap: 0.6945vw;
    font-size: 0.9723vw;
  }
  .cbt-page .cbt-actu-card:hover .cbt-actu-link {
    gap: 0.9723vw;
  }
  .cbt-page .cbt-actu-link svg {
    width: 1.0417vw;
    height: 1.0417vw;
  }
  .cbt-page .cbt-pub {
    padding-bottom: 5.5559vw;
  }
  .cbt-page .cbt-pub-list {
    gap: 1.1112vw;
    padding-top: 0.4167vw;
  }
  .cbt-page .cbt-pub-row {
    grid-template-columns: 6.6671vw 1fr auto;
    border: 0.0694vw solid #c9d3e0;
    border-left-width: 0.2778vw;
    border-radius: 0.2778vw;
  }
  a.cbt-pub-row:hover {
    box-shadow: 0 1.1112vw 2.5002vw rgba(13, 16, 50, .1);
  }
  .cbt-page .cbt-pub-year {
    border-right: 0.0694vw solid #e9edf4;
    font-size: 2.0835vw;
  }
  .cbt-page .cbt-pub-main {
    padding: 1.5279vw 2.0835vw;
  }
  .cbt-page .cbt-pub-tag {
    font-size: 0.9723vw;
    padding: 0.3472vw 0.7639vw;
    border-radius: 0.2778vw;
    margin-bottom: 0.8334vw;
  }
  .cbt-page .cbt-pub-title {
    font-size: clamp(1.2501vw, 1.7vw, 1.5973vw);
  }
  .cbt-page .cbt-pub-meta {
    font-size: 0.9723vw;
    margin-top: 0.7639vw;
  }
  .cbt-page .cbt-pub-action {
    padding-right: 1.6668vw;
  }
  .cbt-page .cbt-pub-dl {
    gap: 0.8334vw;
    border: 0.0694vw solid #e9511c;
    border-radius: 0.3472vw;
    padding: 0.8334vw 1.5279vw;
    font-size: 0.9723vw;
  }
}
