/* Inclut les sections display:grid/flex et les notes display:block en ligne.
   Retirer le bloc entier retire aussi ses marges et son padding du layout. */
[hidden] { display: none !important; }
.hero-date [data-cms-bloc="hero_date_note"] { margin: 0; }

/* Seulement créé dans le cadre de l'éditeur, après identification de la page. */
.cms-visibilite {
  position: fixed;
  z-index: 10000;
  bottom: 12px;
  left: 12px;
  max-width: min(340px, calc(100vw - 24px));
  max-height: 50vh;
  overflow: auto;
  padding: 12px;
  border: 1px solid #000;
  border-radius: 8px;
  background: #fff;
  color: #000;
  box-shadow: 0 3px 12px #0002;
  font: 14px/1.5 sans-serif;
}
.cms-visibilite summary { cursor: pointer; font-weight: bold; }
.cms-visibilite p { margin: 8px 0; }
.cms-visibilite button {
  display: block;
  width: 100%;
  padding: 8px;
  margin-top: 4px;
  text-align: left;
  color: #000;
  background: #fdf2e8;
  border: 1px solid #a8442b;
  border-radius: 4px;
  cursor: pointer;
  font: inherit;
}
.cms-visibilite button:focus-visible { outline: 3px solid #f08821; }

/* ============ Photos pilotées par le CMS : zéro flash (29/09/2026) ============
   Demande de Thomas : une photo « fixe » du HTML (repli) ne doit JAMAIS s'afficher
   avant la vraie photo du CMS. La ligne inline du <head> des pages à photos CMS
   pose `cms-photos-attente` sur <html> AVANT la première peinture ; js/cms.js la
   retire quand tous les modules ont tranché (filet : 8 s, dans la ligne inline).
   Tant qu'elle est là, une image pilotée par le CMS et sa légende restent
   invisibles jusqu'à ce que leur module les marque data-cms-pret : repli
   confirmé, ou nouvelle photo décodée. Mécanisme complet : js/cms.js, bloc
   « révélation des photos ».
   - opacity et jamais display:none : la place reste réservée (zéro CLS), le
     lazy-loading et img.decode() continuent de fonctionner ;
   - on masque l'<img> et la légende, jamais la figure (GSAP anime l'opacité des
     .g-item, et <picture> est en display:contents) ;
   - murs de photos : #galTrack (accueil) et [data-cms-mur-photos] (page
     Partenaires), tous deux rendus par js/galerie-cms.js ;
   - `picture + figcaption` : les légendes des vidéos du mur ne sont pas concernées ;
   - !important : `.pilier.open .img-hover{opacity:1}` (survol auto sur mobile) et
     les styles inline ne doivent pas percer le masque. */
html.cms-photos-attente img[data-cms-image]:not([data-cms-pret]),
html.cms-photos-attente .asso-hero-img:not([data-cms-pret]),
html.cms-photos-attente #galTrack .g-item img:not([data-cms-pret]),
html.cms-photos-attente #galTrack .g-item picture + figcaption:not([data-cms-pret]),
html.cms-photos-attente [data-cms-mur-photos] .g-item img:not([data-cms-pret]),
html.cms-photos-attente [data-cms-mur-photos] .g-item figcaption:not([data-cms-pret]),
html.cms-photos-attente [data-ed-galerie] img:not([data-cms-pret]),
html.cms-photos-attente [data-ed-galerie] picture + figcaption:not([data-cms-pret]),
html.cms-photos-attente [data-ed-galerie] img + figcaption:not([data-cms-pret]),
html.cms-photos-attente .tl-photos img:not([data-cms-pret]),
html.cms-photos-attente .tl-photos picture + figcaption:not([data-cms-pret]),
html.cms-photos-attente #temoDeck .temo-photo img:not([data-cms-pret]),
html.cms-photos-attente [data-cms-sponsors] img:not([data-cms-pret]),
html.cms-photos-attente [data-cms-mur] img:not([data-cms-pret]) {
  opacity: 0 !important;
}
/* Légende d'une photo fixe (podium, lieu, bénévoles, embarquement, haut de page
   de l'asso) : masquée tant que SA photo l'est. Règle à part : un navigateur sans
   :has() l'ignore seule et garde la légende visible, comme avant. */
html.cms-photos-attente figure:has(> picture > img[data-cms-image]:not([data-cms-pret])) > figcaption,
html.cms-photos-attente .asso-hero-photo:has(.asso-hero-img:not([data-cms-pret])) > figcaption {
  opacity: 0 !important;
}
/* Vignette de mur dont la photo du CMS n'est pas encore décodée alors que la
   photo du HTML de cette vignette figure ailleurs dans la liste du CMS (l'équipe a
   réordonné) : invisible, place gardée, même après la levée du masque général,
   jusqu'au décodage (js/galerie-cms.js, swapImg en mode sansRepli). Sans ça, la
   même photo s'affichait deux fois côte à côte (relecture du 29/09/2026). */
.g-item.cms-vignette-attente img,
.g-item.cms-vignette-attente figcaption {
  opacity: 0 !important;
}
.cms-fondu { animation: cms-fondu .25s ease; }
@keyframes cms-fondu { from { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  .cms-fondu { animation: none; }
}
