/* Styles partagés par tous les gabarits de page sur mesure (hors accueil,
   qui reste autonome dans accueil.css). En-tête, pied de page, bandeau
   héros institutionnel, motifs de section réutilisés sur Services, Projets,
   Pôle recherche, Blog & Actualités, Carrière et Contact.
   Deux paliers responsive seulement, comme sur l'accueil :
   "mid" = min-width 620px, menu replié sous max-width 1010px. */

.cerese-page {
  width: 100%;
  /* clip plutôt que hidden (09/10/2026) : hidden fait de .cerese-page un
     conteneur de défilement, ce qui empêche tout élément position: sticky
     de rester à l'écran (colonne « À lire aussi » des articles). clip coupe
     le débordement de la même façon sans cet effet. hidden reste en repli
     pour les navigateurs qui ignorent clip (Safari antérieur à 16). */
  overflow-x: hidden;
  overflow-x: clip;
  font-family: var(--cerese-font);
  color: var(--cerese-encre);
  background: var(--cerese-blanc);
}
.cerese-page * { box-sizing: border-box; }
.cerese-page a { color: var(--cerese-lien); text-decoration: underline; text-underline-offset: 3px; }
@media (hover: hover) {
  .cerese-page a:hover { color: var(--cerese-encre); }
}

/* Exception à la règle ci-dessus, pour les liens posés sur un aplat sombre.
   .cerese-page a:hover pèse (0,2,1), soit plus que les règles de couleur au
   repos de ces liens, qui pèsent (0,2,0) : au survol, le lien retour du
   bandeau passait donc en encre foncée sur le teal, illisible. Signalé par
   Louis le 07/09 sur « ‹ Blog & Actualités » (pages Le blog du CERESE,
   Actualités du CERESE, Publications & Articles). Le même lien sert aussi
   aux 4 pages Département, aux fiches Service, aux fiches chercheur et aux
   pages Candidature : toutes corrigées d'un coup, la correction portant sur
   la classe et non sur les gabarits.
   .cerese-article-hero__retour (blog.css, pages article) a exactement le
   même défaut et la même couleur de repos, il est traité ici pour que les
   deux lignes de défense restent au même endroit que la règle globale
   qu'elles corrigent.
   Le survol reste signalé, mais par un soulignement plutôt qu'un changement
   de couleur, même convention que .cerese-map__lien de la page Contact.
   :active et :focus n'ont besoin de rien : le a:active du thème parent ne
   pèse que (0,1,1) et perd déjà contre la couleur de repos. */
@media (hover: hover) {
  .cerese-page a.cerese-hero-inst__retour:hover,
  .cerese-page a.cerese-article-hero__retour:hover { color: var(--cerese-beige); text-decoration: underline; }
}

/* Suite de la même exception, étendue le 07/09 après un balayage de tous les
   liens du site : quatre autres endroits où un lien clair posé sur un aplat
   sombre basculait en encre foncée au survol, avec la même cause de
   spécificité. Louis les a validés en bloc.
   Les deux boutons reçoivent en plus un assombrissement du fond, seul retour
   visuel qui leur restait une fois la couleur du texte verrouillée : teal
   vers foncé pour le bouton Contact de l'en-tête (même valeur que son état
   is-active, déjà au vocabulaire du thème), vert vers la variante assombrie
   --cerese-lien pour le bouton du bandeau d'appel à l'action. Les liens du
   pied de page reçoivent un soulignement, comme le lien retour ci-dessus.
   Tout est sous (hover: hover) : sur mobile, un appui ne doit rien
   déclencher de tout ça, et l'état ouvert du menu garde ses propres règles. */
@media (hover: hover) {
  .cerese-page a.cerese-nav__contact:hover { color: var(--cerese-blanc); background: var(--cerese-fonce); }
  .cerese-page a.cerese-cta-bandeau__bouton:hover { color: var(--cerese-blanc); background: var(--cerese-lien); }
  .cerese-page .cerese-footer__col a:hover,
  .cerese-page .cerese-footer__contact a:hover { color: var(--cerese-blanc); text-decoration: underline; }
  .cerese-page .cerese-footer__bottom-inner a:hover { color: var(--cerese-bordure); text-decoration: underline; }
}
.cerese-page p { text-wrap: pretty; }

/* ===== En-tête (identique sur toutes les pages) ===== */
.cerese-header { background: var(--cerese-blanc); color: var(--cerese-encre); border-bottom: 1px solid var(--cerese-bordure); }
.cerese-header__inner {
  max-width: var(--cerese-container);
  margin: 0 auto;
  padding: 0 clamp(20px, 4vw, 40px);
  min-height: 80px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 16px 32px;
}
.cerese-page .cerese-header__brand { display: flex; align-items: center; gap: 14px; text-decoration: none; color: var(--cerese-encre); flex: 0 1 auto; min-width: 0; margin-right: auto; }
.cerese-header__brand img { width: auto; height: 56px; display: block; }

/* Boutons icône (loupe recherche, trois traits menu mobile) : icône seule,
   sans cadre. !important sur border/color : même conflit de spécificité avec
   le reset de hello-elementor que partout ailleurs sur ce fichier (voir les
   commentaires plus bas) — un sélecteur d'attribut/élément du reset a la
   même force qu'une simple classe, et reset.css se charge après nous. */
.cerese-search-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; padding: 0; flex: 0 0 auto;
  background: transparent; border: 0 !important; color: var(--cerese-teal) !important;
  cursor: pointer;
}
.cerese-search-toggle:focus { background: transparent !important; border: 0 !important; color: var(--cerese-teal) !important; }
@media (hover: hover) {
  .cerese-search-toggle:hover { background: transparent !important; border: 0 !important; color: var(--cerese-teal) !important; }
}

/* La loupe se place toujours après Contact (nav visible) ou après le menu à trois traits (nav repliée) :
   comme .cerese-search-toggle est le dernier enfant de .cerese-header__inner dans le HTML, il suffit qu'il
   suive .cerese-nav dans le code pour arriver au bon endroit dans les deux cas, sans règle CSS spécifique. */
.cerese-burger {
  display: none !important; align-items: center; justify-content: center;
  width: 44px; height: 44px; padding: 0; flex: 0 0 auto;
  background: transparent; border: 0 !important; color: var(--cerese-teal) !important;
  cursor: pointer;
}
/* Neutralise le remplissage rose (#c36) que hello-elementor applique par défaut aux <button type="button"> au
   survol/focus. !important nécessaire : le sélecteur `[type=button]:hover` du reset a la même spécificité
   qu'une classe, et reset.css se charge après notre CSS dans le <head> (vérifié), donc il gagne l'égalité sans ça. */
.cerese-burger:focus { background: transparent !important; border: 0 !important; color: var(--cerese-teal) !important; }
@media (hover: hover) {
  .cerese-burger:hover { background: transparent !important; border: 0 !important; color: var(--cerese-teal) !important; }
}

.cerese-nav { display: flex; flex-wrap: nowrap; align-items: center; gap: clamp(10px, 1.2vw, 22px); justify-content: flex-end; flex: 0 1 auto; min-width: 0; }
.cerese-nav a { color: var(--cerese-encre); text-decoration: none; font-size: 15px; font-weight: 400; padding: 11px 0; display: block; white-space: nowrap; }
.cerese-nav a.is-active { color: var(--cerese-teal); font-weight: 700; box-shadow: inset 0 -3px 0 0 var(--cerese-teal); }
.cerese-nav a.cerese-nav__contact { color: var(--cerese-blanc); background: var(--cerese-teal); font-weight: 600; padding: 12px 18px; text-align: center; }
.cerese-nav a.cerese-nav__contact.is-active { background: var(--cerese-fonce); box-shadow: none; }

@media (max-width: 1010px) {
  .cerese-burger { display: inline-flex !important; }
  .cerese-nav { display: none; flex-direction: column; align-items: stretch; gap: 4px; padding: 4px 0 20px; width: 100%; border-top: 1px solid var(--cerese-bordure); }
  /* Menu plein écran (demande du client, inspirée du site Royal Haskoning) :
     avant, la nav ouverte restait coincée dans la largeur de l'en-tête,
     entre le logo et la loupe. Elle recouvre maintenant tout l'écran, sous
     l'en-tête (qui reste visible et cliquable, avec l'icône ☰ transformée en
     croix — voir plus bas). 80px = min-height de .cerese-header__inner :
     l'en-tête ne grandit jamais au-delà sur cette plage (nowrap forcé plus
     haut), donc la nav démarre exactement là où il se termine, sans
     chevauchement ni bordure supérieure à gérer. */
  .cerese-nav.is-open {
    display: flex;
    position: fixed;
    top: 80px;
    left: 0;
    right: 0;
    bottom: 0;
    width: auto;
    margin: 0;
    padding: 24px clamp(20px, 6vw, 40px) 40px;
    background: var(--cerese-teal);
    border-top: 0;
    gap: 0;
    overflow-y: auto;
    z-index: 100;
  }
  .cerese-nav.is-open a {
    color: var(--cerese-blanc);
    font-size: clamp(22px, 6vw, 28px);
    font-weight: 600;
    padding: 16px 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.18);
  }
  .cerese-nav.is-open a.is-active { color: var(--cerese-beige); box-shadow: none; }
  .cerese-nav.is-open a.cerese-nav__contact { background: transparent; color: var(--cerese-blanc); text-align: left; padding: 16px 0; }
  .cerese-nav.is-open a.cerese-nav__contact.is-active { background: transparent; color: var(--cerese-beige); }
  /* Empêche la page de fond de défiler derrière le menu plein écran
     (classe posée par commun.js/accueil.js sur <body> à l'ouverture). */
  body.cerese-menu-ouvert { overflow: hidden; }
  /* Icône ☰ → croix de fermeture, animée, pendant que le menu plein écran
     est ouvert (piloté par aria-expanded, déjà mis à jour par le JS
     existant — pas de changement de script nécessaire pour ce point). */
  .cerese-burger svg line {
    transition: transform 0.2s ease, opacity 0.15s ease;
    transform-origin: 10px 10px;
  }
  .cerese-burger[aria-expanded="true"] svg line:nth-child(1) { transform: translateY(5px) rotate(45deg); }
  .cerese-burger[aria-expanded="true"] svg line:nth-child(2) { opacity: 0; }
  .cerese-burger[aria-expanded="true"] svg line:nth-child(3) { transform: translateY(-5px) rotate(-45deg); }
  /* Nav masquée : seuls logo + menu + loupe restent sur la ligne. Sans ce
     nowrap, la loupe (dernier enfant) retombe sur une 2e ligne dès que le
     logo est trop large pour laisser sa place aux deux boutons. Le logo
     garde sa taille (56px, demande du client), donc l'espace économisé pour
     que tout tienne sur une ligne vient d'un resserrement du gap plutôt que
     d'une réduction du logo. */
  .cerese-header__inner { flex-wrap: nowrap; gap: 16px 10px; }
  /* Décalage vertical léger demandé par le client (le logo semblait un peu
     haut par rapport à l'icône menu), sans changer sa taille. */
  .cerese-header__brand img { margin-top: 6px; }
}

/* ===== Panneau de recherche (déroulé sous l'en-tête) ===== */
.cerese-search-panel { display: none; background: var(--cerese-beige); border-bottom: 1px solid var(--cerese-bordure); }
.cerese-search-panel.is-open { display: block; }
.cerese-search-panel__inner { max-width: var(--cerese-container); margin: 0 auto; padding: clamp(14px, 1.6vw, 20px) clamp(20px, 4vw, 40px); display: flex; flex-wrap: wrap; gap: 12px; }
/* border/padding !important : le reset de hello-elementor cible spécifiquement input[type=search] avec une
   spécificité supérieure à une simple classe (élément + attribut). */
.cerese-search-panel__champ { flex: 1 1 260px; min-width: 0; font-family: var(--cerese-font); font-size: 16px; color: var(--cerese-encre); background: var(--cerese-blanc); border: 1px solid var(--cerese-bordure) !important; border-radius: 0; padding: 12px 16px !important; min-height: 48px; }
.cerese-search-panel__bouton { background: var(--cerese-teal) !important; color: var(--cerese-blanc) !important; border: 0 !important; padding: 0 26px; min-height: 48px; font-family: var(--cerese-font); font-size: 15px; font-weight: 600; cursor: pointer; flex: 0 0 auto; }
.cerese-search-panel__bouton:focus { background: var(--cerese-teal) !important; color: var(--cerese-blanc) !important; }
@media (hover: hover) {
  .cerese-search-panel__bouton:hover { background: var(--cerese-teal) !important; color: var(--cerese-blanc) !important; }
}

/* ===== Bandeau héros institutionnel (pages secondaires) ===== */
.cerese-hero-inst { position: relative; background: var(--cerese-fonce); color: var(--cerese-blanc); overflow: hidden; }
/* Le 04/09/2026, ce panneau a perdu successivement sa photo de fond, son
   étiquette de remplacement, puis son motif de traits obliques (::before),
   tous trois à la demande du client. Il ne reste qu'un aplat teal uni, qui
   est désormais le seul rendu possible. Le motif subsiste ailleurs dans le
   thème, mais avec un autre rôle : il y signale un emplacement photo encore
   vide, pas une décoration (cartes projet, cadres portrait, carrousel). */
.cerese-hero-inst__inner { position: relative; max-width: var(--cerese-container); margin: 0 auto; padding: clamp(16px, 1.9vw, 26px) clamp(20px, 4vw, 40px) clamp(20px, 2.5vw, 34px); }
.cerese-page .cerese-hero-inst__retour { color: var(--cerese-beige); text-decoration: none; font-size: 14px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; }
.cerese-hero-inst h1 { margin: 0; font-size: clamp(30px, 3.6vw, 48px); line-height: 1.15; font-weight: 800; text-transform: uppercase; letter-spacing: -0.01em; }
/* Variante "fiche détail" (page Service, Projet de recherche...) : lien
   retour au-dessus du titre, qui prend alors la même échelle que les h1 de
   panneau plutôt que celle, plus grande, des pages listes. */
.cerese-hero-inst__retour + h1 { margin: 14px 0 0; font-size: clamp(28px, 3.2vw, 42px); line-height: 1.18; max-width: 30ch; }

/* Hauteur uniformisée du bandeau héros sur Services, Projets, Pôle recherche,
   Blog & Actualités, Carrière et Contact : sans photo, sa hauteur dépend du
   nombre de lignes de l'accroche, très variable d'une page à l'autre. Un
   plancher commun les aligne, pour que le bandeau ne saute pas d'une hauteur
   à l'autre quand on navigue entre ces six pages.

   06/09/2026 — bandeaux resserrés à la demande de Louis. Le plancher était
   de 318px depuis le 26/08, calé à l'époque sur la hauteur naturelle de la
   page la plus haute. Les accroches ayant changé depuis, plus aucune des six
   ne l'atteignait : mesuré en capture d'écran à 1440px, le plancher ajoutait
   du vide partout, de 85px sur Blog & Actualités à 143px sur Contact. Deux
   leviers appliqués ensemble :
     1. Marges internes resserrées sur .cerese-hero-inst__inner (26/34px au
        lieu de 32/44px à 1440px) et autour du filet beige (13/15px au lieu
        de 16/18px). C'est le seul levier qui agit aussi sur les pages
        dérivées, qui n'ont pas de plancher : fiches Service, Rejoindre,
        Stages et thèses, Départements, Projets de recherche, Le blog,
        archives de catégorie, candidatures, pages légales, résultats de
        recherche. Le même resserrement est appliqué à .cerese-article-hero
        dans blog.css, qui reprend exactement ce motif sur les articles.
     2. Plancher abaissé de 318px à 233px, recalé sur la nouvelle hauteur
        naturelle de la page la plus haute (mesurée à 233px sur Services,
        Projets et Blog & Actualités, plancher neutralisé le temps de la
        mesure). Valeur volontairement égale à cette hauteur naturelle
        maximale, pas à un chiffre rond au-dessus : au-dessus, on
        réintroduirait du vide sur les six pages.

   Reste un min-height, jamais une hauteur fixe : si une accroche future est
   plus longue, ou sur un écran étroit où le texte s'enroule sur plus de
   lignes, la hauteur naturelle du contenu reprend le dessus sans rien
   couper. À recalculer si les accroches changent encore : neutraliser le
   plancher, mesurer les six, reprendre la plus haute. Scopé à
   .cerese-hero-inst--uniforme (posée uniquement sur ces six gabarits)
   plutôt qu'à .cerese-hero-inst en général, qui sert aussi aux pages
   dérivées listées ci-dessus.

   07/09/2026 : plancher désactivé sous 620px. Il était réputé « de fait
   inerte » sur mobile. Mesure faite (méthode iframe, hauteurs relevées
   plancher neutralisé) : c'est vrai pour cinq pages sur six, faux pour
   Contact.

     largeur | Services | Projets | Pôle rech. | Blog | Carrière | Contact
       360px |    373   |   346   |    292     | 373  |    292   |   156
       414px |    319   |   319   |    265     | 319  |    265   |   156
       480px |    292   |   265   |    237     | 292  |    237   |   156
       619px |    265   |   237   |    210     | 265  |    210   |   129
       768px |    210   |   210   |    183     | 210  |    183   |   129

   Deux choses en ressortent. D'abord, sous 620px le plancher ne retient
   plus que Contact, dont l'accroche tient sur peu de lignes : 77px de teal
   vide ajoutés, sur l'écran où l'espace vertical coûte le plus cher.
   Ensuite et surtout, l'alignement que ce plancher est censé produire
   n'existe déjà plus à ces largeurs : à 360px les six pages s'étalent de
   156px à 373px, cinq d'entre elles dépassant le plancher. Il ne protège
   donc aucun alignement sur mobile, il ne fait que rembourrer Contact.

   Seuil posé à 620px et pas ailleurs : c'est déjà la frontière mobile du
   thème (13 règles min-width:620px dans ces feuilles), une seule limite à
   retenir plutôt que deux. Au-dessus, rien ne change : à 768px et plus les
   six pages retombent sous 233px et le plancher reprend son rôle. */
@media (min-width: 620px) {
  .cerese-hero-inst--uniforme { min-height: 233px; }
}
.cerese-hero-inst--uniforme { display: flex; }
.cerese-hero-inst--uniforme .cerese-hero-inst__inner { display: flex; flex-direction: column; justify-content: center; width: 100%; }
.cerese-hero-inst__rule { width: 96px; height: 3px; background: var(--cerese-beige); margin: 13px 0 15px; }
.cerese-hero-inst__intro { margin: 0; font-size: clamp(17px, 1.3vw, 18px); line-height: 1.6; text-align: justify; color: var(--cerese-beige); }

/* ===== Titre de section commun ===== */
.cerese-section { max-width: var(--cerese-container); margin: 0 auto; padding: clamp(20px, 2.5vw, 32px) clamp(20px, 4vw, 40px); }
.cerese-section--beige { background: var(--cerese-beige); }
.cerese-section--teal { background: var(--cerese-teal); color: var(--cerese-blanc); }
/* Bande sombre, même famille que les deux modificateurs ci-dessus. Ajoutée le
   08/09 pour le bloc « Rester informé » de la page Blog, qui portait son fond
   en attribut de style et n'avait donc aucune classe de section. */
.cerese-section--fonce { background: var(--cerese-fonce); color: var(--cerese-blanc); }
/* Une section qui pose un fond pleine largeur confie le calage de son contenu
   à ce bloc interne : largeur maximale, centrage et marges intérieures.
   Règle autonome depuis le 08/09. Elle était auparavant écrite en
   `.cerese-section--beige > .cerese-section__inner, .cerese-section--teal > ...`,
   si bien que la classe ne calait rien par elle-même : elle n'agissait que
   sous un parent portant l'un de ces deux modificateurs. Le bloc « Rester
   informé » de la page Blog, dont la section n'avait aucune classe, s'étalait
   donc d'un bord à l'autre de l'écran, texte collé aux bords sur téléphone.
   Un nom qui promet un contenu calé doit le caler seul, sans dépendre du
   parent. Aucune autre règle du thème ne vise cette classe, la baisse de
   spécificité (0,2,0 vers 0,1,0) ne peut donc renverser aucun arbitrage. */
.cerese-section__inner { max-width: var(--cerese-container); margin: 0 auto; padding: clamp(20px, 2.5vw, 32px) clamp(20px, 4vw, 40px); }
.cerese-section h2 { margin: 0; font-size: clamp(26px, 2.8vw, 36px); line-height: 1.2; font-weight: 700; }
.cerese-section__rule { width: 96px; height: 3px; background: var(--cerese-teal); margin: 14px 0 18px; }
.cerese-section--teal .cerese-section__rule { background: var(--cerese-beige); }
.cerese-section__intro { margin: 0; font-size: clamp(17px, 1.3vw, 18px); line-height: 1.6; text-align: justify; color: var(--cerese-encre); }
.cerese-section--teal .cerese-section__intro { color: var(--cerese-beige); }
/* Textes saisis avec l'éditeur mis en forme de l'espace admin (09/10/2026) :
   paragraphes, intertitres (titres 3 et 4), listes et gras, dans les fiches
   Projet, Projet de recherche, Service et Chercheur. Le texte de présentation
   (contenu principal) est rendu par the_content() dans .cerese-projet-intro__texte
   ou .cerese-section__intro, d'où leur présence dans la liste. */
.cerese-texte-riche > *,
.cerese-projet-intro__texte > *,
.cerese-section__intro > * { margin: 0; }
.cerese-texte-riche > * + *,
.cerese-projet-intro__texte > * + *,
.cerese-section__intro > * + * { margin-top: 12px; }
.cerese-texte-riche h3,
.cerese-projet-intro__texte h3,
.cerese-section__intro h3 { font-size: clamp(18px, 1.5vw, 20px); line-height: 1.35; font-weight: 700; color: var(--cerese-fonce); text-align: left; }
.cerese-texte-riche h4,
.cerese-projet-intro__texte h4,
.cerese-section__intro h4 { font-size: 17px; line-height: 1.4; font-weight: 700; color: var(--cerese-fonce); text-align: left; }
.cerese-texte-riche ul,
.cerese-texte-riche ol,
.cerese-projet-intro__texte ul,
.cerese-projet-intro__texte ol,
.cerese-section__intro ul,
.cerese-section__intro ol { padding-left: 22px; text-align: left; }
.cerese-section--teal .cerese-section__intro h3,
.cerese-section--teal .cerese-section__intro h4 { color: var(--cerese-beige); }

.cerese-liste-puce { margin: 14px 0 0; padding: 0 0 0 22px; list-style: disc; display: flex; flex-direction: column; gap: 2px; font-size: clamp(16px, 1.2vw, 17px); line-height: 1.45; color: var(--cerese-encre); }
/* Étapes numérotées des fiches Service (07/09/2026, décidé avec Louis).
   Les 5 lignes de « Notre intervention » ne sont pas un inventaire mais une
   chronologie de mission (cadrage, état initial, impacts, mesures, plan de
   gestion et suivi). En puces neutres, cet ordre ne se voyait pas et la liste
   se lisait comme une liste de courses ; numérotées, les mêmes lignes se
   lisent comme une méthode, ce qui est précisément ce qu'un client de bureau
   d'études achète. Aucun mot du contenu n'a changé.
   Classe distincte plutôt que modification de .cerese-liste-puce, qui sert
   aussi aux pages Carrière, Département, Services et aux fiches chercheur,
   où les listes ne sont pas ordonnées.
   Numéro produit par un compteur CSS et non par la puce native : le marqueur
   ::marker n'accepte pas la mise en forme sur tous les navigateurs visés.
   Interligne desserré à 10px (contre 2px pour les puces simples) pour que
   chaque étape se détache comme une étape. */
.cerese-liste-etapes { margin: 16px 0 0; padding: 0; list-style: none; counter-reset: cerese-etape; display: flex; flex-direction: column; gap: 10px; font-size: clamp(16px, 1.2vw, 17px); line-height: 1.45; color: var(--cerese-encre); }
.cerese-liste-etapes li { counter-increment: cerese-etape; display: grid; grid-template-columns: 26px 1fr; gap: 10px; align-items: baseline; }
.cerese-liste-etapes li::before { content: counter(cerese-etape, decimal-leading-zero); font-family: ui-monospace, monospace; font-size: 13px; font-weight: 700; letter-spacing: 0.04em; color: var(--cerese-teal); }
.cerese-section--teal .cerese-liste-etapes { color: var(--cerese-blanc); }
.cerese-section--teal .cerese-liste-etapes li::before { color: var(--cerese-beige); }
/* Bas des fiches Service : « Livrables », « Pour qui » et « Dans quels cas »,
   ajouté le 07/09/2026, puis remanié deux fois le même jour sur retour visuel
   de Louis.
   1. D'abord deux colonnes dans une bande beige pleine largeur : « Livrables »
      (3 puces) faisait face à la qualification empilée (paragraphe + 4 puces)
      et laissait près de 160px de beige vide sous la colonne de gauche.
   2. Puis trois colonnes côte à côte, les trois blocs ayant des hauteurs
      comparables une fois séparés. Le vide disparaît, la bande passe de 500 à
      358px de haut à 1366px.
   3. Enfin, la bande beige devient une section blanche portant trois cartes
      beiges, séparées par du blanc (demande de Louis). L'espacement entre
      cartes est celui de .cerese-grille-1-3, le rembourrage intérieur celui de
      .cerese-carte, pour que ces cartes se lisent comme les autres du site.
   Le titre du troisième bloc est passé de « Quand ce service est nécessaire »
   à « Dans quels cas » : trop long, il occupait deux lignes quand les deux
   autres n'en prenaient qu'une, ce qui décalait son filet et sa liste. La
   forme courte pose au passage les trois titres en questions parallèles.
   Le paragraphe « Pour qui » n'est pas justifié, contrairement aux autres
   textes du site : dans une colonne étroite de trois à quatre lignes, la
   justification creuse des trous au lieu d'aligner. */
.cerese-carte-info { background: var(--cerese-beige); padding: clamp(18px, 1.9vw, 24px); }
.cerese-fiche-service__pour-qui { margin: 14px 0 0; font-size: clamp(16px, 1.2vw, 17px); line-height: 1.55; color: var(--cerese-encre); }
/* Palier tablette (620 à 1139px) : .cerese-grille-1-3 n'y donne que deux
   colonnes, et la troisième carte se retrouverait seule sur sa rangée, avec
   un emplacement vide à sa droite. Elle occupe donc toute la largeur sur ce
   seul palier. La règle ne cible la troisième carte que si elle existe : un
   service dont le client n'aurait rempli que deux des trois champs garde
   deux cartes de largeur normale. */
@media (min-width: 620px) and (max-width: 1139px) {
  .cerese-fiche-service-bas .cerese-grille-1-3 > div:nth-child(3) { grid-column: 1 / -1; }
}
.cerese-section--teal .cerese-liste-puce { color: var(--cerese-blanc); }

/* ===== Contenu riche (template-page-generique.php) : texte tapé librement
   par le client dans l'éditeur WordPress classique, sur les pages qu'il crée
   lui-même. .cerese-section__intro suppose un unique paragraphe (margin:0,
   pas de règle pour h2/h3/listes) ; ces règles complètent l'espacement et la
   typographie des balises que l'éditeur peut produire, sans rien retirer de
   .cerese-section__intro (police, justification, couleur restent héritées). */
.cerese-contenu-riche { display: flex; flex-direction: column; gap: 16px; }
.cerese-contenu-riche > * { margin: 0; }
.cerese-contenu-riche h2 { font-size: clamp(22px, 2.2vw, 28px); font-weight: 700; line-height: 1.3; }
.cerese-contenu-riche h3 { font-size: clamp(19px, 1.9vw, 22px); font-weight: 700; line-height: 1.3; }
.cerese-contenu-riche ul,
.cerese-contenu-riche ol { padding-left: 22px; display: flex; flex-direction: column; gap: 4px; }
.cerese-contenu-riche a { color: var(--cerese-lien); }

/* ===== Bandeau d'appel à l'action final ===== */
.cerese-cta-bandeau { display: flex; flex-wrap: wrap; gap: 20px 32px; align-items: center; justify-content: space-between; }
.cerese-cta-bandeau p { margin: 0; font-size: clamp(17px, 1.3vw, 18px); line-height: 1.6; text-align: justify; color: var(--cerese-encre); flex: 1 1 420px; }
.cerese-section--teal .cerese-cta-bandeau p,
.cerese-section--beige .cerese-cta-bandeau p { color: inherit; }
.cerese-page .cerese-cta-bandeau__bouton { background: var(--cerese-vert); color: var(--cerese-blanc); text-decoration: none; padding: 16px 28px; font-size: 16px; font-weight: 600; flex: 0 0 auto; }
/* Pôle recherche (07/09, demande de Louis) : cette page empile quatre
   bandeaux d'appel à l'action l'un sous l'autre. Leurs boutons partagent
   déjà le même bord droit (justify-content: space-between), mais leur bord
   gauche était en escalier, la largeur de chacun suivant la longueur de son
   libellé : « Découvrir nos projets de recherche » mesurait 307px quand
   « Nous contacter » n'en faisait que 166. Une largeur plancher commune les
   met sur une même verticale des deux côtés.
   min-width plutôt qu'une largeur fixe : un libellé plus long que 320px
   (celui du dernier bandeau est modifiable par le client depuis l'espace
   admin) s'affiche en entier au lieu d'être coupé, au prix de l'alignement.
   Si ce cas se présente, relever la valeur ici.
   Réservé aux écrans de 620px et plus, où les bandeaux sont en ligne : en
   dessous ils passent en colonne et 320px déborderait de la page (305px de
   contenu disponible à 360px de large). Modificateur posé sur le bandeau et
   non sur le bouton, pour ne pas élargir les boutons des pages qui n'ont
   qu'un seul appel à l'action, où il n'y a rien à aligner. */
@media (min-width: 620px) {
  .cerese-page .cerese-cta-bandeau--aligne .cerese-cta-bandeau__bouton { min-width: 320px; text-align: center; }
}

/* .cerese-cta-centre (bouton seul centré sous une rubrique) a existé le 08/09
   le temps que le bouton « Découvrir nos projets de recherche » conclue la
   grille des axes. Le client ayant préféré rétablir son bandeau, plus aucun
   gabarit n'emploie cette classe : elle est retirée plutôt que gardée en
   réserve, du CSS que rien n'applique se périme sans qu'on s'en aperçoive.
   Le motif est dans l'historique Git (commit 19ed054) si le besoin revient. */

/* ===== Carte outline (services, départements, cartes photo) ===== */
/* Au survol, le fond de la carte passe entièrement au teal de la charte et
   tout son texte (titre hérité, paragraphe et lien, qui ont chacun leur
   propre couleur explicite donc ne suivraient pas la couleur du parent
   sans être ciblés séparément) bascule en blanc pour rester lisible —
   demande du client, appliquée à toutes les cartes du site (voir aussi
   .cerese-carte-billet et .cerese-carte-publication dans blog.css). Le
   titre (h3) doit être ciblé explicitement lui aussi malgré l'absence de
   couleur propre : sans ça, il hérite de la couleur de la carte (un lien
   <a>), mais la règle globale .cerese-page a:hover (couleur encre) a une
   spécificité légèrement supérieure à .cerese-carte:hover seul et gagne
   silencieusement sur cette couleur héritée. */
.cerese-page .cerese-carte { background: var(--cerese-blanc); outline: 1px solid var(--cerese-bordure); padding: clamp(18px, 1.9vw, 24px); display: flex; flex-direction: column; gap: 8px; text-decoration: none; color: var(--cerese-encre); transition: background-color 200ms ease, color 200ms ease; }
@media (hover: hover) {
  .cerese-carte:hover { background: var(--cerese-teal); outline-color: var(--cerese-teal); }
  .cerese-carte:hover, .cerese-carte:hover .cerese-carte__infos, .cerese-carte:hover h3, .cerese-carte:hover h4, .cerese-carte:hover h5, .cerese-carte:hover p, .cerese-carte:hover li, .cerese-carte:hover .cerese-carte__lien, .cerese-carte:hover .cerese-carte__eyebrow { color: var(--cerese-blanc); }
}
.cerese-carte h3 { margin: 0; font-size: 17px; line-height: 1.3; font-weight: 700; transition: color 200ms ease; }
.cerese-carte p { margin: 0; font-size: 16px; line-height: 1.55; color: var(--cerese-encre); transition: color 200ms ease; }
/* Titres, sous-titres et listes de la description d'une offre (stage, thèse,
   poste), saisis avec l'éditeur de l'espace admin en titres 4 et 5
   (09/10/2026). Ajoutés aussi à la règle de survol ci-dessus : sur le fond
   teal de la carte survolée, ils resteraient sinon en encre foncée. */
.cerese-carte h4 { margin: 8px 0 0; font-size: 16px; line-height: 1.35; font-weight: 700; color: var(--cerese-fonce); transition: color 200ms ease; }
.cerese-carte h5 { margin: 6px 0 0; font-size: 15px; line-height: 1.4; font-weight: 700; color: var(--cerese-encre); transition: color 200ms ease; }
.cerese-carte ul,
.cerese-carte ol { margin: 0; padding-left: 20px; font-size: 16px; line-height: 1.55; }
.cerese-carte li { color: var(--cerese-encre); transition: color 200ms ease; }
.cerese-carte__description > * + * { margin-top: 8px; }
/* Niveau et durée d'une offre de stage ou de thèse, sous le titre de la
   carte (09/10/2026). */
.cerese-carte__infos { margin: 0; font-size: 15px; line-height: 1.5; font-weight: 600; color: var(--cerese-gris); transition: color 200ms ease; }
.cerese-carte__lien { margin-top: auto; padding-top: 6px; font-size: 15px; font-weight: 700; color: var(--cerese-lien); transition: color 200ms ease; }
/* Services (page /services/) uniquement : "Lire la suite" masqué au repos,
   remplacé par "Découvrir" (texte posé dans template-services.php), centré,
   révélé au survol/focus. Scopé à .cerese-grille-svc pour ne pas toucher
   .cerese-carte__lien sur les autres pages qui réutilisent la même carte
   avec un tout autre texte de lien (Stages et thèses : "Candidater",
   Rejoindre : "Envoyer une candidature") — la couleur blanche au survol
   reste gérée par la règle générique .cerese-carte:hover .cerese-carte__lien
   ci-dessus, seuls l'affichage et le centrage sont propres à Services. */
.cerese-grille-svc .cerese-carte__lien {
  text-align: center;
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transition: max-height 320ms ease, opacity 220ms ease;
}
/* :focus-visible et non :focus (corrigé le 06/09/2026) : même défaut que les
   cartes Projet, la carte étant un <a>, un clic souris la laissait ouverte en
   permanence. Voir le commentaire détaillé sur
   .cerese-carte-projet__resume dans projets.css. Le tactile n'est pas
   concerné, "Découvrir" est affiché en permanence sous 620px (règle juste
   en dessous). */
.cerese-grille-svc .cerese-carte:focus-visible .cerese-carte__lien {
  max-height: 28px;
  opacity: 1;
}
@media (hover: hover) {
  .cerese-grille-svc .cerese-carte:hover .cerese-carte__lien {
    max-height: 28px;
    opacity: 1;
  }
}
/* Sous 620px, aucun appareil ne survole vraiment : le repli "masqué au
   repos, révélé au survol" laisserait "Découvrir" en permanence invisible
   sur mobile, sans équivalent tactile pour le faire apparaître. Affiché en
   continu à la place — la carte redevient simplement identique à ce qu'elle
   était avant l'effet de survol. */
@media (max-width: 619px) {
  .cerese-grille-svc .cerese-carte__lien {
    max-height: 28px;
    opacity: 1;
  }
}
/* Libellé "AXE 01", type de stage/thèse... : vivait en style inline sur
   Pôle recherche et Stages et thèses, donc invisible pour cette règle de
   survol (un style inline gagne toujours face à une feuille externe,
   !important ou pas) — remplacé par cette classe pour pouvoir le cibler. */
.cerese-carte__eyebrow { font-family: ui-monospace, monospace; font-size: 12px; color: var(--cerese-gris); letter-spacing: 0.06em; text-transform: uppercase; transition: color 200ms ease; }

/* ===== Carte chercheur (portraits circulaires, panneau "Ils collaborent
   avec nous" de la page Pôle recherche) : toute la carte est un lien vers la
   page de détail du chercheur (photo, nom et fonction cliquables), donc même
   neutralisation de couleur/soulignement que .cerese-carte, avec un survol
   plus discret (le nom passe au teal) plutôt que le remplissage plein utilisé
   sur les autres cartes du site — un cadran de portrait, pas une carte texte. */
.cerese-page .cerese-carte-chercheur { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 10px; text-decoration: none; color: var(--cerese-encre); }
@media (hover: hover) {
  .cerese-carte-chercheur:hover .cerese-carte-chercheur__nom { color: var(--cerese-teal); }
}
.cerese-carte-chercheur__photo { width: clamp(84px, 9vw, 112px); height: clamp(84px, 9vw, 112px); border-radius: 50%; object-fit: cover; flex-shrink: 0; }
/* Tant que le client n'a pas encore envoyé de photo pour ce chercheur :
   même gabarit (taille, cercle) rempli par l'initiale du nom sur fond teal,
   plutôt qu'un cercle vide ou une icône générique. */
.cerese-carte-chercheur__photo--vide { display: flex; align-items: center; justify-content: center; background: var(--cerese-teal); color: var(--cerese-blanc); font-family: var(--cerese-font-display); font-size: clamp(28px, 3vw, 36px); font-weight: 700; }
.cerese-carte-chercheur__nom { margin: 0; font-size: 16px; line-height: 1.3; font-weight: 700; color: var(--cerese-encre); }
.cerese-carte-chercheur__fonction { margin: 0; font-size: 14px; line-height: 1.4; color: var(--cerese-gris); }

/* ===== Profil chercheur (single-chercheur.php) : en-tête photo + nom +
   fonction. Même paire de classes --vide que la carte du panneau, mais
   agrandie pour une page de détail plutôt qu'un cadran de grille. ===== */
.cerese-chercheur-profil { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 18px; margin-top: 20px; }
@media (min-width: 620px) {
  .cerese-chercheur-profil { flex-direction: row; align-items: center; text-align: left; gap: clamp(20px, 3vw, 36px); }
}
.cerese-chercheur-profil__photo { width: clamp(120px, 14vw, 176px); height: clamp(120px, 14vw, 176px); border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.cerese-chercheur-profil__photo--vide { display: flex; align-items: center; justify-content: center; background: var(--cerese-teal); color: var(--cerese-blanc); font-family: var(--cerese-font-display); font-size: clamp(44px, 5vw, 64px); font-weight: 700; }
.cerese-chercheur-profil__info h1 { margin: 0; }
.cerese-chercheur-profil__fonction { margin: 8px 0 0; font-size: clamp(16px, 1.6vw, 19px); color: var(--cerese-teal); font-weight: 600; }

/* ===== Témoignage (single-chercheur.php) : cadran de citation, posé sur
   fond teal (.cerese-section--teal) comme les autres rubriques mises en
   valeur de la page Projet (solution mise en œuvre...). ===== */
.cerese-temoignage { max-width: 68ch; }
.cerese-temoignage__guillemet { font-family: Georgia, "Times New Roman", serif; font-size: clamp(56px, 6vw, 84px); line-height: 1; color: var(--cerese-beige); opacity: 0.85; }
.cerese-temoignage__texte { margin: 0; font-size: clamp(18px, 2vw, 24px); line-height: 1.5; font-style: italic; color: var(--cerese-blanc); }
.cerese-temoignage__auteur { margin: 16px 0 0; font-size: 15px; font-weight: 600; color: var(--cerese-beige); }

/* ===== Bloc photo simple (colonne illustrée d'une grille, ex. CA2 sur la
   page Carrière). Reprend l'aplat rayé des emplacements photo du site tant
   qu'aucune image n'est posée : le repère reste visible côté client, et rien
   ne bouge dans la mise en page quand la photo arrive. ===== */
.cerese-photo-bloc {
  position: relative;
  width: 100%; height: 100%; min-height: 240px;
  background-color: #0F2C30;
  background-image: repeating-linear-gradient(135deg, rgba(255,255,255,0.07) 0 2px, transparent 2px 14px);
  display: flex; align-items: center; justify-content: center;
  text-align: center; padding: 16px;
  overflow: hidden;
}
.cerese-photo-bloc > span {
  font-family: ui-monospace, monospace; font-size: 11px; letter-spacing: 0.06em;
  color: rgba(234, 239, 198, 0.9); line-height: 1.4;
}
.cerese-photo-bloc--photo { background-image: none; padding: 0; }
.cerese-photo-bloc__img { width: 100%; height: 100%; object-fit: cover; }

/* ===== Carte photo (grandes vignettes cliquables sur photo) ===== */
.cerese-page .cerese-carte-photo {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 300px;
  text-decoration: none;
  color: var(--cerese-blanc);
  background-color: #0F2C30;
  background-image: repeating-linear-gradient(135deg, rgba(255,255,255,0.07) 0 2px, transparent 2px 14px);
  overflow: hidden;
}
.cerese-carte-photo--haute { min-height: 340px; }
/* Photo de fond des cartes (14/09/2026). L'image est posée en position
   absolue et non en background-image : WordPress sait alors servir un fichier
   adapté à la largeur de l'écran (srcset), ce qu'une image de fond CSS ne
   permet pas. Le fond rayé reste dessous : il ne se voit que tant qu'aucune
   photo n'est choisie, et sert de filet de sécurité si l'image ne charge pas.
   Le panneau de texte garde son propre fond semi-opaque, donc reste lisible
   quelle que soit la photo. */
.cerese-page .cerese-carte-photo--photo { background-image: none; }
.cerese-carte-photo__img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
}
.cerese-carte-photo__legende {
  position: absolute; top: 12px; left: 12px; right: 12px;
  font-family: ui-monospace, monospace; font-size: 10px; letter-spacing: 0.05em;
  color: rgba(234, 239, 198, 0.8); line-height: 1.35;
}
.cerese-carte-photo__panneau { position: relative; background: rgba(24, 61, 66, 0.92); padding: clamp(16px, 1.8vw, 22px); display: flex; flex-direction: column; gap: 8px; }
.cerese-carte-photo__panneau h3 { margin: 0; font-size: 20px; font-weight: 700; line-height: 1.3; }
.cerese-carte-photo__filet { height: 3px; width: 64px; background: var(--cerese-beige); }
.cerese-carte-photo__texte { font-size: 15px; line-height: 1.5; color: var(--cerese-beige); }
.cerese-carte-photo__lien { font-size: 14px; font-weight: 700; color: var(--cerese-beige); letter-spacing: 0.04em; padding-top: 2px; }
/* Verrouille le titre en blanc au survol/appui : sans ça, le titre (dans un
   <a>) hérite de la couleur assombrie appliquée par le reset du thème parent
   hello-elementor à tout lien au survol ET au toucher (a:active,a:hover —
   :active explique que ça se voie aussi au simple appui tactile sur mobile,
   pas seulement au survol souris). Même famille de bug que .cerese-carte
   plus haut. :active/:focus non conditionnés à (hover:hover) : un appui
   tactile déclenche :active sur tout appareil, contrairement à :hover. */
.cerese-carte-photo__panneau h3 { color: var(--cerese-blanc); }
.cerese-carte-photo:focus .cerese-carte-photo__panneau h3,
.cerese-carte-photo:active .cerese-carte-photo__panneau h3 { color: var(--cerese-blanc) !important; }
@media (hover: hover) {
  .cerese-carte-photo:hover .cerese-carte-photo__panneau h3 { color: var(--cerese-blanc) !important; }
}

/* Révélation au survol des cartes Actualités et Publications (08/09, demande
   du client : « la même animation que les cartes Projet »). La mécanique est
   reprise telle quelle de .cerese-carte-projet__resume/__lien dans
   projets.css, y compris les durées, pour que les deux familles de cartes du
   site bougent au même rythme. Au repos, seuls le titre et son filet restent
   visibles et identifient la carte ; le panneau grandit vers le haut quand le
   texte et le lien apparaissent.

   max-height + opacity plutôt que display : c'est la seule combinaison qui
   s'anime en CSS. Le margin-top négatif au repos annule le gap que le panneau
   réserve quand même autour d'un élément de hauteur nulle, sans quoi un vide
   subsiste entre le titre et le lien.

   :focus-visible et non :focus, pour la même raison que sur les cartes Projet
   (défaut corrigé le 06/09) : la carte est un <a>, un clic à la souris lui
   donne le focus, et avec :focus elle serait restée ouverte en permanence une
   fois le curseur reparti.

   Le cadre ne bouge pas au survol : .cerese-carte-photo--haute impose 340px de
   hauteur minimale et le panneau déployé reste sous cette valeur, la grille ne
   se décale donc pas. Contrainte à revérifier si le client allonge ces deux
   textes depuis l'espace admin. */
.cerese-carte-photo__texte {
  max-height: 0;
  margin-top: -8px;
  opacity: 0;
  overflow: hidden;
  transition: max-height 320ms ease, opacity 220ms ease, margin-top 320ms ease;
}
.cerese-carte-photo:focus-visible .cerese-carte-photo__texte,
.cerese-carte-photo.is-ouvert .cerese-carte-photo__texte { max-height: 200px; margin-top: 0; opacity: 1; }
@media (hover: hover) {
  .cerese-carte-photo:hover .cerese-carte-photo__texte { max-height: 200px; margin-top: 0; opacity: 1; }
}
.cerese-carte-photo__lien {
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transition: max-height 320ms ease, opacity 220ms ease;
}
.cerese-carte-photo:focus-visible .cerese-carte-photo__lien,
.cerese-carte-photo.is-ouvert .cerese-carte-photo__lien { max-height: 28px; opacity: 1; }
@media (hover: hover) {
  .cerese-carte-photo:hover .cerese-carte-photo__lien { max-height: 28px; opacity: 1; }
}

/* Flèche tactile, même rôle que celle des cartes Projet : sur un écran sans
   survol, c'est le seul accès au texte masqué. Sans elle, la « même
   animation » aurait rendu le texte des deux cartes définitivement invisible
   sur téléphone. Bascule .is-ouvert posée par la délégation de commun.js,
   étendue à cette famille de cartes le 08/09.
   !important sur display/background/color : même conflit de spécificité avec
   le reset de hello-elementor sur les <button> que celui déjà documenté dans
   projets.css, qui repeignait le bouton en rouge au repos. */
.cerese-carte-photo__toggle {
  display: none !important;
  position: absolute;
  right: 12px;
  bottom: 12px;
  z-index: 2;
  /* width et padding en !important pour la même raison que display, background
     et color : le reset du parent déclare `button { width: auto }` et
     `padding: .5rem 1rem`, à égalité de spécificité avec cette classe mais
     chargé après elle. Voir le détail dans projets.css, même bouton, même
     correction du 08/09. Neutraliser le padding est indispensable : forcer la
     largeur seule ne laisserait que 4px au SVG et l'écraserait. */
  width: 36px !important;
  height: 36px;
  padding: 0 !important;
  align-items: center;
  justify-content: center;
  background: var(--cerese-blanc) !important;
  color: var(--cerese-fonce) !important;
  border: 0 !important;
  /* Pas de border-radius : la charte impose un rayon nul à tous les boutons
     (style.css, en !important). Un arrondi écrit ici serait du code mort. */
  cursor: pointer;
  transition: transform 250ms ease;
}
.cerese-carte-photo.is-ouvert .cerese-carte-photo__toggle { transform: rotate(180deg); }
@media (max-width: 619px) {
  .cerese-carte-photo__toggle { display: inline-flex !important; }
  /* Réserve la place du bouton sur le bord droit, sinon un titre de deux
     lignes passe dessous. Padding sur tout le panneau, pour que le texte et
     le lien révélés restent eux aussi dégagés. */
  .cerese-carte-photo__panneau { padding-right: 52px; }
}

/* Mobile : les liens/boutons menant vers une page fille (à l'intérieur d'une carte ou d'un panneau) sont
   centrés sous le texte qui les précède, plutôt qu'alignés à gauche comme sur les écrans plus larges. */
@media (max-width: 619px) {
  .cerese-cta-bandeau { flex-direction: column; align-items: center; text-align: center; }
  /* flex: 1 1 420px (commun.css, règle de base) donne au paragraphe une
     largeur de repli de 420px en ligne (desktop) — mais en colonne
     (mobile), ce même 420px est réinterprété comme une hauteur : le
     paragraphe se retrouvait forcé à 420px de haut, texte collé en haut,
     vide en dessous, avant le bouton. Concerne toutes les pages qui
     utilisent .cerese-cta-bandeau (Contact, Projets, Pôle recherche,
     Services...), pas seulement Services : bug général, pas un choix de
     mise en page propre à une page. */
  .cerese-cta-bandeau p { flex: 1 1 auto; }
  /* Justification : propre sur une colonne large (desktop/tablette), mais
     avec peu de mots par ligne sur mobile, l'espacement entre mots doit
     s'étirer bien davantage pour atteindre les deux bords, ce qui crée des
     "rivières" de vide disgracieuses. Repasse en alignement à gauche sous
     ce palier, sur les trois paragraphes propres à ce fichier (les autres
     se corrigent dans leur propre fichier CSS, pour rester après leur
     règle de base dans la cascade). */
  .cerese-hero-inst__intro,
  .cerese-section__intro,
  .cerese-cta-bandeau p { text-align: left; }
  .cerese-carte__lien,
  .cerese-carte-photo__lien { align-self: center; }
  /* Page Services uniquement (classe posée dans template-services.php) :
     réduit l'espace entre le texte et le bouton "Contactez-nous" du panneau
     "Besoin d'un accompagnement ?" sur mobile — 20px de base jugés trop
     généreux une fois le panneau empilé en colonne. Les autres pages qui
     réutilisent .cerese-cta-bandeau (Contact, Projets, Pôle recherche...)
     ne sont pas concernées, seule cette instance porte le modificateur. */
  .cerese-cta-bandeau--services { gap: 8px 32px; }
}

/* ===== Grilles responsives génériques ===== */
.cerese-grille-1-2 { display: grid; grid-template-columns: 1fr; gap: clamp(14px, 1.5vw, 20px); }
.cerese-grille-1-3 { display: grid; grid-template-columns: 1fr; gap: clamp(14px, 1.5vw, 20px); }

/* Description à gauche, photo illustrative à droite (fiches Projet et Projet
   de recherche).

   09/09/2026 : moitié / moitié, alors que la répartition était deux tiers /
   un tiers depuis le 04/09. À la demande du client, la photo des fiches Projet
   doit s'afficher aux mêmes dimensions que celle des fiches Service : même
   largeur de colonne, et proportion réelle du fichier au lieu d'un recadrage
   (voir .cerese-photo-libre et .cerese-fiche-service, dont c'est déjà le
   fonctionnement depuis le 04/09).

   La colonne étroite existait pour une raison qui disparaît avec le recadrage :
   une photo forcée en 3:4 dépassait 700 px de haut à demi-largeur, face à une
   description bien plus courte. Une photo à sa proportion réelle, en paysage
   sur la quasi-totalité de ces fiches, fait environ 330 px de haut dans cette
   même colonne. Le déséquilibre que la colonne étroite corrigeait n'existe donc
   plus, et la maintenir ne ferait que rapetisser la photo sans contrepartie.

   .cerese-photo-portrait, le cadre 3:4 que ces fiches utilisaient, a été
   supprimé le même jour : les deux fiches Projet étaient ses seules usagères. */
.cerese-grille-texte-photo { display: grid; grid-template-columns: 1fr; gap: clamp(18px, 2vw, 28px); }
@media (min-width: 900px) {
  .cerese-grille-texte-photo { grid-template-columns: 1fr 1fr; align-items: start; }
  /* Photo centrée sur la hauteur du texte de gauche, demande du client du
     09/09/2026. align-self sur la seule photo, et non align-items: center sur
     la grille : centrer la grille entière déplacerait aussi le bloc de texte,
     dont le titre doit rester calé en haut de la section.
     align-items: start reste donc la règle, la photo y fait exception.
     Quand la photo est plus haute que le texte, ce qui arrive sur les fiches
     à description courte, elle donne sa hauteur à la rangée et la déclaration
     n'a aucun effet visible : c'est le comportement voulu, rien à borner. */
  .cerese-grille-texte-photo .cerese-photo-libre { align-self: center; }
}

/* Le bloc .cerese-photo-figure et sa légende visible ont été supprimés le
   09/09/2026 à la demande du client. Ils dataient du 06/09 et affichaient
   « Photo : … » sous l'image, la légende n'étant plus visible nulle part
   depuis que les cartes avaient perdu leur ligne « PHOTO : … » au profit des
   pastilles de tête.
   Le texte n'est pas perdu pour autant : il alimente désormais l'attribut alt
   de l'image, et il reste affiché dans le cadre rayé tant qu'aucune photo
   n'est fournie. Voir single-projet.php. */

/* ===== Fiche Service : introduction + « Notre intervention » face à la photo =====
   Cadre « photo entière » (04/09/2026) : contrairement aux fiches Projet, la
   liste des services n'affiche aucune vignette, la photo n'apparaît qu'ici. Le
   recadrage portrait n'y protégeait aucune grille et ne faisait qu'amputer
   l'image, d'où un cadre qui épouse la proportion réelle du fichier. Colonne à
   moitié-moitié : une photo horizontale dans un tiers de page tombe sous 210px
   de haut et perd toute présence.

   06/09/2026, demande de Louis : la grille ne portait que l'introduction et la
   photo, en align-items:center. L'introduction faisant environ 150px face à des
   photos de 330 à 440px, le texte était centré avec un vide au-dessus et un
   vide en dessous. Deux changements :
     1. align-items:start — la colonne de texte démarre au bord haut de la photo.
     2. Le bloc « Notre intervention » quitte la bande beige et vient en
        deuxième rangée de la colonne de gauche, sous l'introduction, ce qui
        comble le vide. La bande beige ne porte donc plus que « Livrables »
        (choix de Louis : la garder plutôt que d'y remonter Livrables aussi).

   Le bas du texte ne s'aligne pas exactement sur le bas de la photo, et ne le
   peut pas : le contenu de gauche est quasi constant d'un service à l'autre
   (introduction de 283 à 374 caractères, toujours 5 puces, soit ~360px) alors
   que la hauteur des photos varie du simple au double selon leur proportion.
   C'est la photo qui varie, pas le texte. L'alignement est donc exact en haut
   et approché en bas.

   Ordre du DOM : introduction, photo, intervention — c'est l'ordre du mobile,
   qui n'a ainsi besoin d'aucune règle d'ordre. Le placement en grille ci-dessous
   ne s'applique qu'au-dessus de 900px. */
.cerese-fiche-service { display: grid; grid-template-columns: 1fr; gap: clamp(18px, 2vw, 28px); }

@media (min-width: 900px) {
  .cerese-fiche-service { grid-template-columns: 1fr 1fr; align-items: start; }
  .cerese-fiche-service__intro { grid-column: 1; grid-row: 1; }
  /* La photo occupe les deux rangées de la colonne de droite. align-self
     l'empêche de s'étirer sur la hauteur de ces deux rangées : elle garde la
     hauteur que lui donne sa propre proportion, condition du « cadre qui
     épouse la proportion réelle du fichier » décidé le 04/09.
     09/09/2026 : la valeur passe de start à center, le client voulant la photo
     centrée sur la hauteur du texte. Étendu ici depuis les fiches Projet pour
     que les deux gabarits gardent le même comportement, comme demandé. */
  .cerese-fiche-service .cerese-photo-libre { grid-column: 2; grid-row: 1 / span 2; align-self: center; }
  .cerese-fiche-service__intervention { grid-column: 1; grid-row: 2; }
}

/* Sous 900px, la grille repasse en une colonne et l'ordre du DOM redonne
   exactement la lecture d'avant le 06/09 : introduction, photo, puis « Notre
   intervention ». Seul le fond changeait : le bloc était dans la bande beige,
   il est maintenant dans la section blanche. On lui rend donc ce fond beige, en
   pleine largeur (marges négatives égales au retrait horizontal de la section,
   compensées par un padding identique). margin-left/right plutôt que
   margin-inline : même effet, compatible avec des navigateurs Android plus
   anciens.
   07/09 : le bloc se soudait à la bande beige « Livrables » qui le suivait,
   d'où un padding-bas nul ici et un padding-bas nul sur la section blanche qui
   le contient. Cette bande étant devenue une section blanche portant des
   cartes, il n'y a plus rien à souder : le bloc referme donc son propre fond,
   sinon son texte viendrait toucher le bord du beige. */
@media (max-width: 899px) {
  .cerese-fiche-service__intervention {
    background: var(--cerese-beige);
    margin-left: calc(-1 * clamp(20px, 4vw, 40px));
    margin-right: calc(-1 * clamp(20px, 4vw, 40px));
    padding: clamp(20px, 2.5vw, 32px) clamp(20px, 4vw, 40px);
  }
}
.cerese-photo-libre {
  position: relative;
  width: 100%;
  /* Sans photo seulement : le cadre a besoin d'une forme pour exister. Dès
     qu'une photo est présente, --photo rend la main à ses proportions. */
  aspect-ratio: 4 / 3;
  background-color: #0F2C30;
  background-image: repeating-linear-gradient(135deg, rgba(255,255,255,0.07) 0 2px, transparent 2px 14px);
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 16px;
}
.cerese-photo-libre--photo { aspect-ratio: auto; background-image: none; background-color: transparent; padding: 0; }
.cerese-photo-libre__img { display: block; width: 100%; height: auto; }
.cerese-photo-libre span { font-family: ui-monospace, monospace; font-size: 11px; letter-spacing: 0.06em; color: rgba(234, 239, 198, 0.9); line-height: 1.4; }
@media (min-width: 620px) {
  .cerese-grille-1-2 { grid-template-columns: 1fr 1fr; }
  .cerese-grille-1-3 { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1140px) {
  .cerese-grille-1-3 { grid-template-columns: repeat(3, 1fr); }
}
/* Grille Services : 1 colonne, 2 à 620px, 3 à 1010px (palier intermédiaire à 2,
   comme .cerese-grille-projets : évite les colonnes trop étroites en tablette portrait) */
.cerese-grille-svc { display: grid; grid-template-columns: 1fr; gap: clamp(14px, 1.5vw, 20px); }
@media (min-width: 620px) {
  .cerese-grille-svc { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1010px) {
  .cerese-grille-svc { grid-template-columns: repeat(3, 1fr); }
}

/* Grille Chercheurs collaborateurs (Pôle recherche) : cadrans compacts
   (photo + nom + fonction, pas de bloc de texte), donc plus dense que
   .cerese-grille-svc — 2 colonnes dès mobile, jusqu'à 5 sur grand écran
   pour accueillir les 5 à 10 chercheurs attendus sans grille trop clairsemée. */
.cerese-grille-chercheurs { display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(20px, 2.5vw, 32px) clamp(14px, 1.5vw, 20px); }
@media (min-width: 620px) {
  .cerese-grille-chercheurs { grid-template-columns: repeat(3, 1fr); }
}
@media (min-width: 1010px) {
  .cerese-grille-chercheurs { grid-template-columns: repeat(4, 1fr); }
}
@media (min-width: 1140px) {
  .cerese-grille-chercheurs { grid-template-columns: repeat(5, 1fr); }
}

/* Pagination (déplacée depuis projets.css le 29/08 : réutilisée pour la
   pagination mobile de .cerese-grille-svc et .cerese-grille-chercheurs, en
   plus de Projets — voir cerese_init_pagination_mobile() dans commun.js). */
.cerese-pagination { margin-top: 20px; display: flex; gap: 8px; align-items: center; justify-content: center; flex-wrap: wrap; }
.cerese-pagination button {
  min-width: 44px; height: 44px; padding: 0 12px;
  background: var(--cerese-blanc);
  border: 1px solid var(--cerese-bordure);
  color: var(--cerese-fonce);
  font-family: var(--cerese-font);
  font-size: 16px;
  cursor: pointer;
}
.cerese-pagination button.is-active { background: var(--cerese-teal); color: var(--cerese-blanc); border-color: var(--cerese-teal); font-weight: 700; }
/* Neutralise le remplissage rose (#c36) que hello-elementor applique par défaut aux <button type="button"> au
   survol/focus. !important nécessaire : le sélecteur `[type=button]:hover` du reset a la même spécificité
   qu'une classe, et reset.css se charge après notre CSS dans le <head> (vérifié), donc il gagne l'égalité sans ça. */
.cerese-pagination button:focus { background: var(--cerese-blanc) !important; border-color: var(--cerese-bordure) !important; color: var(--cerese-fonce) !important; }
.cerese-pagination button.is-active:focus { background: var(--cerese-teal) !important; border-color: var(--cerese-teal) !important; color: var(--cerese-blanc) !important; }
@media (hover: hover) {
  .cerese-pagination button:hover { background: var(--cerese-blanc) !important; border-color: var(--cerese-bordure) !important; color: var(--cerese-fonce) !important; }
  .cerese-pagination button.is-active:hover { background: var(--cerese-teal) !important; border-color: var(--cerese-teal) !important; color: var(--cerese-blanc) !important; }
}

/* Grille Contact : formulaire + carte, 1 colonne jusqu'à 1140px puis 1.4fr/1fr */
.cerese-grille-contact { display: grid; grid-template-columns: 1fr; gap: clamp(20px, 2.5vw, 40px); align-items: start; }
@media (min-width: 1140px) {
  .cerese-grille-contact { grid-template-columns: 1.4fr 1fr; }
}

/* Colonne de droite de la page Contact : carte, adresse, lien d'itinéraire.
   Posée en classe et non plus en style en ligne sur le gabarit, un style en
   ligne étant hors d'atteinte des media queries sans !important (piège
   rencontré trois fois sur ce chantier : menu mobile Le Fel's Events le
   16/08, bandeau de la page Candidature le 06/09, listes d'HydroBilan le
   05/09).

   07/09/2026, demande de Louis : la carte doit se centrer verticalement en
   face du formulaire au lieu de rester collée en haut. La colonne formulaire
   est bien plus haute que la colonne carte, et le align-items:start de la
   grille reportait donc tout l'écart sous la carte. align-self:center le
   répartit à parts égales au-dessus et au-dessous. Scopé au-dessus de
   1140px, seule largeur où cette grille a deux colonnes : en dessous elle
   n'en a qu'une, empilée, où il n'y a rien à centrer. */
.cerese-contact-carte { display: flex; flex-direction: column; gap: 16px; }
@media (min-width: 1140px) {
  .cerese-contact-carte { align-self: center; }
}


/* ===== Carte de localisation (page Contact, 04/09/2026) =====
   Cadre Google Maps affiché directement. Le fond foncé et le contour évitent
   un rectangle blanc pendant que le cadre se charge, sur une connexion lente
   comme celles visées par le site. */
.cerese-map {
  position: relative;
  width: 100%;
  aspect-ratio: 4 / 3;
  background-color: var(--cerese-fonce);
  outline: 1px solid var(--cerese-bordure);
  overflow: hidden;
}
.cerese-map__cadre { display: block; width: 100%; height: 100%; border: 0; }
.cerese-map__adresse-texte { margin: 0; font-size: 15px; line-height: 1.5; color: var(--cerese-encre); }
.cerese-page a.cerese-map__lien { color: var(--cerese-lien); text-decoration: none; font-size: 15px; font-weight: 700; }
.cerese-page a.cerese-map__lien:hover { text-decoration: underline; }

/* ===== Champs de formulaire ===== */
.cerese-champ { display: flex; flex-direction: column; gap: 6px; }
.cerese-champ__label { font-size: 13px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--cerese-gris); font-weight: 700; }
.cerese-champ input,
.cerese-champ select,
.cerese-champ textarea {
  font-family: var(--cerese-font);
  font-size: 16px;
  color: var(--cerese-encre);
  background: var(--cerese-blanc);
  border: 1px solid var(--cerese-bordure);
  border-radius: 0;
  padding: 13px 14px;
  min-height: 48px;
  width: 100%;
}
.cerese-champ textarea { resize: vertical; min-height: auto; }

/* Éditeur mis en forme de l'espace admin (résumé des publications,
   09/10/2026, voir ceresChampEditeur() dans espace-admin.js). La zone
   reprend l'aspect des autres champs ; titres et listes y sont rendus comme
   sur le site, pour que le client voie ce qu'il obtiendra.
   Boutons de la barre : !important contre le rose (#c36) que hello-elementor
   pose sur tout <button> en :hover et :focus, même parade que .cerese-burger. */
.cerese-editeur { border: 1px solid var(--cerese-bordure); background: var(--cerese-blanc); }
.cerese-editeur__barre { display: flex; flex-wrap: wrap; gap: 4px; padding: 6px; border-bottom: 1px solid var(--cerese-bordure); background: var(--cerese-beige); }
.cerese-editeur__outil,
.cerese-editeur__outil:hover,
.cerese-editeur__outil:focus,
.cerese-editeur__outil:active { background: var(--cerese-blanc) !important; color: var(--cerese-fonce) !important; border: 1px solid var(--cerese-bordure) !important; border-radius: 0 !important; font-family: var(--cerese-font); font-size: 14px; font-weight: 600; padding: 6px 12px !important; line-height: 1.3; cursor: pointer; }
.cerese-editeur__outil:hover { border-color: var(--cerese-teal) !important; color: var(--cerese-teal) !important; }
.cerese-editeur__outil:focus-visible { outline: 2px solid var(--cerese-teal); outline-offset: 1px; }
.cerese-editeur__zone { min-height: 150px; max-height: 60vh; overflow-y: auto; padding: 13px 14px; font-family: var(--cerese-font); font-size: 16px; line-height: 1.6; color: var(--cerese-encre); outline: none; }
.cerese-editeur__zone:focus { box-shadow: inset 0 0 0 2px var(--cerese-teal); }
.cerese-editeur__zone > * { margin: 0 0 10px; }
.cerese-editeur__zone h3 { font-size: 20px; line-height: 1.3; font-weight: 700; }
.cerese-editeur__zone h4 { font-size: 17px; line-height: 1.35; font-weight: 700; }
.cerese-editeur__zone h5 { font-size: 15px; line-height: 1.4; font-weight: 700; }
.cerese-editeur__zone ul,
.cerese-editeur__zone ol { padding-left: 22px; }
/* Mode article (actualités, blog) : intertitres en titre 2 et 3, citation
   et photos insérées, rendus comme sur la page de l'article. */
.cerese-editeur__zone--article h2 { font-size: 22px; line-height: 1.3; font-weight: 700; }
.cerese-editeur__zone--article h3 { font-size: 18px; }
.cerese-editeur__zone blockquote { margin: 0 0 10px; padding: 12px 16px; background: var(--cerese-beige); border-left: 4px solid var(--cerese-teal); font-weight: 600; }
.cerese-editeur__zone figure { margin: 0 0 10px; }
.cerese-editeur__zone img { max-width: 100%; height: auto; display: block; }
.cerese-editeur__zone figcaption { font-size: 14px; color: var(--cerese-gris); }

/* ===== Bandeau "Partager cette page" (juste avant le pied de page, sur
   toutes les pages) ===== */
/* Couleur foncée (déjà utilisée pour .cerese-footer__bottom) plutôt que le
   teal du pied de page juste en dessous : but demandé par le client, un
   bandeau visuellement séparé plutôt que fondu dans le pied de page. */
.cerese-partage { background: var(--cerese-fonce); }
.cerese-partage__inner {
  max-width: var(--cerese-container);
  margin: 0 auto;
  padding: clamp(16px, 1.8vw, 22px) clamp(20px, 4vw, 40px);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 16px;
}
.cerese-partage__label { color: var(--cerese-blanc); font-weight: 600; font-size: 15px; }
.cerese-partage__liens { display: flex; flex-wrap: wrap; gap: 8px; }
/* .cerese-page en préfixe : sans lui, .cerese-page a (couleur lien, plus
   spécifique qu'une classe seule) l'emporterait sur la couleur voulue ici,
   même famille de conflit que .cerese-page .cerese-carte-photo plus haut. */
.cerese-page .cerese-partage__bouton {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: var(--cerese-blanc);
  color: var(--cerese-teal);
  text-decoration: none;
  font-weight: 700;
  font-size: 14px;
  flex: 0 0 auto;
}
.cerese-page .cerese-partage__bouton:focus,
.cerese-page .cerese-partage__bouton:active { background: var(--cerese-beige) !important; color: var(--cerese-fonce) !important; }
@media (hover: hover) {
  .cerese-page .cerese-partage__bouton:hover { background: var(--cerese-beige) !important; color: var(--cerese-fonce) !important; }
}

/* ===== Pied de page (identique sur toutes les pages) ===== */
.cerese-footer { background: var(--cerese-teal); color: var(--cerese-blanc); }
.cerese-footer__inner { max-width: var(--cerese-container); margin: 0 auto; padding: clamp(24px, 2.5vw, 36px) clamp(20px, 4vw, 40px); display: grid; grid-template-columns: 1fr; gap: clamp(20px, 2.5vw, 40px); align-items: start; }
/* 2 colonnes en tablette portrait (620-1009px) : les 4 colonnes ne se
   posent qu'à partir de 1010px, sinon les colonnes secondaires tombent
   sous 120px de large. */
@media (min-width: 620px) { .cerese-footer__inner { grid-template-columns: repeat(2, 1fr); } }
/* Les colonnes de nav et contact n'ont besoin que de peu de largeur (mots
   courts, adresse mail sur sa propre ligne) : rétrécies en conséquence
   plutôt que de dépasser la largeur du conteneur. */
/* 5 colonnes (logo, 2 colonnes de nav, contact, suivez-nous) : brand-cell
   rétréci (2.6fr → 2.1fr) pour laisser la place à la nouvelle colonne
   Suivez-nous, demande du client pour l'aligner sur la même ligne
   qu'Accueil/Pôle recherche/Email plutôt que de rester empilé sous
   Email/Téléphone. */
/* 07/09/2026, demande de Louis : sur desktop, contact@cerese-sas.com
   passait sur deux lignes (« contact@cerese- » / « group.com »), une adresse
   e-mail coupée en plein milieu. Mesuré : l'adresse a besoin de 196px sur
   une ligne, et la colonne contact n'en recevait que 146px à 1010px de
   large, le cas le plus serré du palier 5 colonnes.
   Les 5 fractions ont été rééquilibrées à somme constante (5.0), en prenant
   sur la colonne du logo, la seule qui avait de la marge : les colonnes de
   navigation et de contact se décalent donc vers la gauche, comme demandé.
   Vérifié aux deux extrêmes du palier : à 1010px la colonne contact passe
   de 146 à 212px (marge de 16px sur les 196 nécessaires) et la cellule du
   logo de 342 à 277px, soit toujours plus que les 259px que mesure le logo
   lui-même, en dessous desquels max-width:100% l'écraserait. À 1440px, où
   le conteneur est à sa largeur maximale, la colonne contact passe de 190 à
   274px. */
@media (min-width: 1010px) { .cerese-footer__inner { grid-template-columns: 1.7fr 0.7fr 0.7fr 1.3fr 0.6fr; } }
.cerese-footer__brand-cell { min-width: 0; overflow: hidden; }
.cerese-footer__brand { display: flex; align-items: center; min-width: 0; }
/* Taille d'origine du fichier fourni par le client (30/08), revenu à une
   image unique (logo + filet + définition) après un essai de découpage en
   plusieurs éléments HTML, écarté à la demande du client. Conservée à
   l'identique sur mobile et desktop (l'agrandissement desktop précédemment
   demandé a aussi été annulé). */
.cerese-footer__brand img { width: auto; height: 72px; max-width: 100%; display: block; }
.cerese-footer__col { display: flex; flex-direction: column; gap: 12px; }
.cerese-footer__col a { color: var(--cerese-blanc); text-decoration: none; font-size: 16px; font-weight: 600; }
.cerese-footer__contact { display: flex; flex-direction: column; gap: 14px; font-size: 16px; }
.cerese-footer__contact-label { font-weight: 700; color: var(--cerese-beige); }
.cerese-footer__contact a { color: var(--cerese-blanc); text-decoration: none; }
/* Colonne séparée du contact (29/08, demande du client) : Suivez-nous doit
   tomber sur la même ligne qu'Accueil/Pôle recherche/Email sur desktop, ce
   qu'un simple 3e bloc empilé dans .cerese-footer__contact ne permettait
   pas. */
.cerese-footer__suivez { font-size: 16px; }
.cerese-footer__reseaux { display: flex; gap: 8px; margin-top: 4px; }
.cerese-page .cerese-footer__reseau {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border: 1px solid var(--cerese-blanc);
  color: var(--cerese-blanc);
  text-decoration: none;
  font-weight: 700;
  font-size: 13px;
}
.cerese-page .cerese-footer__reseau:focus,
.cerese-page .cerese-footer__reseau:active { background: var(--cerese-blanc) !important; color: var(--cerese-teal) !important; }
@media (hover: hover) {
  .cerese-page .cerese-footer__reseau:hover { background: var(--cerese-blanc) !important; color: var(--cerese-teal) !important; }
}
.cerese-footer__bottom { background: var(--cerese-fonce); }
.cerese-footer__bottom-inner { max-width: var(--cerese-container); margin: 0 auto; padding: 20px clamp(20px, 4vw, 40px); display: flex; flex-wrap: wrap; gap: 16px; justify-content: space-between; font-size: 14px; color: var(--cerese-bordure); }
.cerese-footer__bottom-inner a { color: var(--cerese-bordure); text-decoration: none; }
/* Cibles tactiles à 44px sous 620px (24px et 21px mesurés avant correctif) :
   line-height plutôt que padding, taille de police et couleur inchangées. */
@media (max-width: 619px) {
  .cerese-footer__col a { display: block; line-height: 44px; }
  .cerese-footer__bottom-inner a { display: inline-block; line-height: 44px; }
  /* Sur mobile étroit, .cerese-footer__inner reste sur 1fr (règle de base) :
     les 2 colonnes de liens (Accueil/Services/Projets et Pôle recherche/Blog
     & Actualités/Carrière) s'empilent alors l'une sous l'autre en 6 lignes.
     Demande du client : les mettre côte à côte pour que chaque lien de la
     2e colonne retombe à la même hauteur que son vis-à-vis de la 1re
     (Accueil/Pôle recherche, Services/Blog & Actualités, Projets/Carrière),
     ce qui réduit la hauteur totale du panneau. Logo et bloc contact
     restent en pleine largeur au-dessus/en-dessous de cette paire. */
  .cerese-footer__inner { grid-template-columns: repeat(2, 1fr); }
  .cerese-footer__brand-cell,
  .cerese-footer__contact,
  .cerese-footer__suivez { grid-column: 1 / -1; }
}

/* ===== Espace admin sur mesure ===== */
/* !important sur white-space, border, border-radius et display : sans ça,
   le reset Hello Elementor ([type=button], même spécificité qu'une classe,
   chargé après notre CSS) l'emporte à l'état de base — white-space:nowrap
   en particulier empêchait tout retour à la ligne, ce qui rendait
   overflow-wrap et text-align sans effet et faisait déborder les libellés
   longs hors du bouton. Même famille de bug que les points et les flèches
   du carrousel (voir accueil.css), découverte ici après coup. Un vrai
   contour (teal, sans arrondi pour rester dans l'esprit plat du reste du
   site) remplace celui, rose et arrondi, du reset une fois neutralisé. */
.cerese-admin-onglet { display: block !important; width: 100%; box-sizing: border-box; text-align: left; white-space: normal !important; overflow-wrap: break-word; background: transparent !important; border: 1px solid var(--cerese-teal) !important; border-radius: 0 !important; font-family: var(--cerese-font); font-size: 15px; font-weight: 600; color: var(--cerese-encre) !important; padding: 10px 12px; cursor: pointer; }
.cerese-admin-onglet:focus { background: transparent !important; color: var(--cerese-encre) !important; }
.cerese-admin-onglet[aria-current="true"],
.cerese-admin-onglet[aria-current="true"]:focus { background: var(--cerese-blanc) !important; color: var(--cerese-teal) !important; }
@media (hover: hover) {
  .cerese-admin-onglet:hover { background: transparent !important; color: var(--cerese-encre) !important; }
  .cerese-admin-onglet[aria-current="true"]:hover { background: var(--cerese-blanc) !important; color: var(--cerese-teal) !important; }
}
/* Centrage propre au groupe "Pages du site" : ses libellés (ex. "Accueil —
   domaines d'expertise") sont plus longs que ceux des autres groupes et
   débordaient du panneau une fois passés à la ligne ; les autres groupes
   restent alignés à gauche comme avant. */
.cerese-admin-onglet--site { text-align: center !important; }
.cerese-admin-liste { display: flex; flex-direction: column; gap: 1px; background: var(--cerese-bordure); margin-bottom: clamp(20px, 2.5vw, 32px); }
/* grid-template-columns lit --cols, posée en style inline par espace-admin.js
   (une valeur par onglet : nombre et largeur de colonnes différents selon le
   contenu). Avant ce changement, la valeur venait directement d'un style
   inline sur grid-template-columns lui-même : aucune media query ne pouvait
   la surcharger (l'inline l'emporte toujours, y compris sur une media query).
   En ne posant plus que la variable en inline, la règle ci-dessous — et sa
   media query mobile plus bas — reprennent la main sans le moindre !important. */
.cerese-admin-ligne { display: grid; grid-template-columns: var(--cols, 2fr 1fr 1fr auto); gap: 12px; align-items: center; background: var(--cerese-blanc); padding: 12px 14px; font-size: 15px; }
.cerese-admin-ligne--entete { background: var(--cerese-fonce); color: var(--cerese-beige); font-size: 13px; letter-spacing: 0.06em; text-transform: uppercase; font-weight: 700; }
.cerese-admin-vide { background: var(--cerese-blanc); padding: clamp(20px, 2.5vw, 32px); text-align: center; font-family: ui-monospace, monospace; font-size: 12px; letter-spacing: 0.06em; color: var(--cerese-gris); }

/* Sous 720px (palier propre à l'espace admin, hors des 620/1010 du site
   public) : une ligne devient une carte empilée, une valeur par ligne avec
   son libellé de colonne (repris de l'en-tête via data-label, l'en-tête
   elle-même étant masquée — elle ne veut plus rien dire une fois empilée).
   182px de haut, colonne Titre à 79px et colonne Actions débordant de 56px
   à 320px, mesurés avant correctif. */
@media (max-width: 719px) {
  .cerese-admin-ligne--entete { display: none; }
  .cerese-admin-ligne { grid-template-columns: 1fr; row-gap: 10px; padding: 14px; }
  .cerese-admin-ligne > span { display: flex; flex-direction: column; gap: 3px; }
  .cerese-admin-ligne > span[data-label]::before {
    content: attr(data-label);
    font-family: ui-monospace, monospace;
    font-size: 11px;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    font-weight: 700;
    color: var(--cerese-gris);
  }
  /* Cibles tactiles Modifier/Supprimer : padding vertical plutôt que le
     gap:4px posé en inline par ceresActionsLigne(), pensé pour un affichage
     desktop compact. */
  .cerese-admin-ligne .cerese-admin-action { display: inline-block; padding: 8px 0; }
}
.cerese-admin-cases { display: flex; flex-wrap: wrap; gap: 10px 20px; }
.cerese-admin-cases label { display: flex; align-items: center; gap: 8px; font-size: 15px; color: var(--cerese-encre); font-weight: 400; text-transform: none; letter-spacing: normal; }
.cerese-admin-statut { font-family: ui-monospace, monospace; font-size: 12px; padding: 3px 8px; display: inline-block; }
.cerese-admin-statut--nouveau { background: var(--cerese-beige); color: var(--cerese-fonce); }
.cerese-admin-statut--traite { background: var(--cerese-bordure); color: var(--cerese-gris); }
.cerese-admin-action { color: var(--cerese-vert); text-decoration: underline; font-weight: 600; white-space: nowrap; }
@media (hover: hover) {
  .cerese-admin-action:hover { color: var(--cerese-teal); }
}
