/* ============================================================
   CEWeb Widgets — Accordéon d'images
   Tous les réglages de l'onglet Style arrivent par des variables
   --ceweb-accordeon-* posées par Elementor.

   ------------------------------------------------------------
   Le mécanisme, en une variable
   ------------------------------------------------------------
   Un panneau est ouvert ou fermé, et cet état tient dans une seule propriété
   personnalisée : `--ceweb-accordeon-open`, qui vaut 0 ou 1. Trois situations
   la passent à 1 — la classe `is-active` (état au repos, posée par PHP puis par
   le clic), le survol, et le focus clavier — et *toutes* les propriétés
   visibles la lisent :

     - la largeur du panneau        flex-grow: calc(1 + open × (grow - 1))
     - l'opacité du texte           opacity: open
     - sa montée                    translateY(calc((1 - open) × shift))
     - son délai d'apparition       transition-delay: calc(open × delay)

   L'intérêt n'est pas l'élégance : c'est qu'il n'y a qu'un seul endroit où
   déclarer chaque état. Écrire les trois situations (`is-active`, `:hover`,
   `:focus-within`) pour chacune des quatre propriétés demanderait douze
   sélecteurs à tenir synchronisés, et il en manquerait un.

   Une propriété personnalisée ne s'anime pas — mais ce n'est pas elle qu'on
   anime. `--open` bascule d'un coup, `flex-grow` et `opacity` recalculent leur
   valeur, et ce sont *ces* valeurs que la transition interpole. Le délai suit
   le même chemin : il vaut 0 à la fermeture (le texte s'efface aussitôt) et
   `delay` à l'ouverture (le texte arrive après que le panneau a commencé à
   s'élargir), sans qu'aucune règle n'ait à le dire.

   ------------------------------------------------------------
   Deux points d'ordre
   ------------------------------------------------------------
   - Les règles de survol passent **après** `is-active` et à spécificité égale :
     c'est leur position qui leur donne la main pendant le survol, de sorte
     qu'un panneau épinglé au clic se referme quand on en survole un autre, et
     revient de lui-même quand la souris quitte le bloc. Ne pas remonter ce
     bloc.
   - Elles sont sous `@media (hover: hover) and (pointer: fine)` : sur un écran
     tactile, un « survol » reste collé après le tap et laisserait deux panneaux
     ouverts. Là, c'est le clic qui décide, et il ne passe que par `is-active`.

   Les couleurs de texte viennent de la palette du thème (-11 sur les images
   sombres, -6 pour le bouton), comme ailleurs dans le plugin.
   ============================================================ */

.ceweb-accordeon{
  /* Disposition */
  --ceweb-accordeon-height: 640px;
  --ceweb-accordeon-gap: 14px;
  --ceweb-accordeon-radius: 22px;
  /* Largeur du panneau ouvert, en proportion d'un panneau fermé. */
  --ceweb-accordeon-grow: 4;
  /* Taille mini d'un panneau fermé : sans elle, huit panneaux réduiraient les
     fermés à un liseré. */
  --ceweb-accordeon-min: 84px;

  /* Mouvement */
  --ceweb-accordeon-duration: 620ms;
  --ceweb-accordeon-ease: cubic-bezier(.22, .7, .24, 1);
  --ceweb-accordeon-text-duration: 420ms;
  --ceweb-accordeon-text-delay: 140ms;
  --ceweb-accordeon-text-shift: 12px;

  /* Voile sous le texte. Sans lui, un titre blanc sur une photo claire est
     illisible — et une photo, on ne sait jamais d'avance si elle est claire. */
  --ceweb-accordeon-scrim: 58%;
  --ceweb-accordeon-scrim-height: 62%;

  /* Contenu */
  --ceweb-accordeon-padding: 28px 30px;
  --ceweb-accordeon-align: left;
  --ceweb-accordeon-body-gap: 6px;
  --ceweb-accordeon-title-color: var(--theme-palette-color-11, #FFFFFF);
  --ceweb-accordeon-text-color: var(--theme-palette-color-11, #FFFFFF);
  --ceweb-accordeon-text-opacity: .82;

  /* Bouton */
  --ceweb-accordeon-cta-color: var(--theme-palette-color-6, #0C1A3C);
  --ceweb-accordeon-cta-bg: var(--theme-palette-color-11, #FFFFFF);
  --ceweb-accordeon-cta-color-hover: var(--theme-palette-color-11, #FFFFFF);
  --ceweb-accordeon-cta-bg-hover: var(--theme-palette-color-1, #1A6FFF);
  --ceweb-accordeon-cta-padding: 11px 22px;
  --ceweb-accordeon-cta-radius: 999px;
  --ceweb-accordeon-cta-gap: 16px;

  /* Délai de fermeture. Entre deux panneaux il y a un écart, et le pointeur
     qui le traverse ne survole plus rien : tout se refermerait le temps d'un
     aller-retour de souris. Ces quelques millisecondes de grâce laissent au
     pointeur le temps d'atteindre le panneau suivant — et comme le délai est
     nul dans l'autre sens, l'ouverture reste instantanée. */
  --ceweb-accordeon-close-delay: 70ms;
}
.ceweb-accordeon *{ box-sizing: border-box; }

/* ============================================================
   Le bloc réclame toute la largeur disponible

   Sans ces deux lignes, le bloc ne fonctionne pas du tout dans un conteneur
   **flexbox** Elementor — et c'est le conteneur par défaut depuis Elementor 3.6.

   Un widget y est un élément flex en `flex: 0 1 auto` : sa largeur suit son
   contenu, pas la section. Or la largeur du contenu, ici, c'est la somme des
   largeurs *minimales* des panneaux. Le bloc se dimensionne donc pile sur ce
   qu'il faut à des panneaux fermés, il ne reste aucun espace libre, et
   `flex-grow` n'a plus rien à distribuer : le panneau ouvert calcule bien son
   `flex-grow: 4`, et ne grandit pas d'un pixel. Mesuré : 476 px de widget dans
   une section de 1496 px, cinq panneaux à 84 px, rapport ouvert/fermé de 1,00
   pour un réglage à 4.

   Le symptôme est trompeur — le texte et le voile du panneau ouvert
   s'affichent, puisqu'eux ne dépendent pas de la place disponible. On croit à
   une transition cassée alors que c'est la boîte qui est trop petite.

   La première règle vise la classe qu'Elementor pose sur ce widget : elle rend
   au bloc la largeur de la section. Un réglage de largeur fait à la main dans
   l'onglet Avancé la battra sans peine, son sélecteur portant l'identifiant de
   l'élément.
   ============================================================ */
.elementor-widget-ceweb_accordeon{ width: 100%; }
.ceweb-accordeon{ width: 100%; }

/* La liste, et non la racine, porte la disposition.

   La racine est un `<div>` : si elle était elle-même le `<ul>`, ses remises à
   zéro ne tiendraient sur qu'une seule classe (0,1,0), et la moindre règle de
   thème sur `.elementor ul` (0,1,1) reprendrait la main sur la marge, le padding
   et les puces — mesuré, c'est exactement ce qui arrivait. Avec la liste à
   l'intérieur, chaque sélecteur compte deux classes et passe devant. */
.ceweb-accordeon .ceweb-accordeon__list{
  display: flex;
  gap: var(--ceweb-accordeon-gap);
  width: 100%;            /* Même raison que ci-dessus, un cran plus bas. */
  height: var(--ceweb-accordeon-height);
  margin: 0;
  padding: 0;
  list-style: none;
}

.ceweb-accordeon__empty{
  padding: 16px 20px; border: 1px dashed #d63638; border-radius: 8px;
  color: #1d2327; font: 14px/1.5 system-ui, sans-serif;
}

/* ============================================================
   Panneau
   ============================================================ */
.ceweb-accordeon .ceweb-accordeon__panel{
  --ceweb-accordeon-open: 0;

  position: relative;
  /* `flex-basis: 0` et non `auto` : la largeur ne vient que de flex-grow, donc
     d'un seul nombre à interpoler. Avec `auto`, elle dépendrait du contenu et
     la transition partirait d'une valeur qu'on ne maîtrise pas. */
  flex: 1 1 0;
  min-width: var(--ceweb-accordeon-min);
  flex-grow: calc(1 + var(--ceweb-accordeon-open) * (var(--ceweb-accordeon-grow) - 1));
  margin: 0;
  padding: 0;
  list-style: none;
  border-radius: var(--ceweb-accordeon-radius);
  /* Le rognage vit sur le panneau, pas sur l'image : `<img>` est la balise que
     les thèmes stylent le plus volontiers, et un rayon posé sur la seule image
     se ferait battre par une règle globale. Un rognage, lui, ne se contredit
     pas à distance. */
  overflow: hidden;
  cursor: pointer;
  transition: flex-grow var(--ceweb-accordeon-duration) var(--ceweb-accordeon-ease);
  /* Nul à l'ouverture, quelques millisecondes à la fermeture : une seule
     expression, et le pointeur peut traverser l'écart entre deux panneaux sans
     que tout se referme derrière lui. */
  transition-delay: calc((1 - var(--ceweb-accordeon-open)) * var(--ceweb-accordeon-close-delay));
}
.ceweb-accordeon .ceweb-accordeon__panel::marker{ content: none; }

/* L'image. Sélecteur long (0,3,0) : une règle de thème sur `.entry-content img`
   battrait une simple classe et rendrait le `object-fit` inopérant. */
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__image{
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  max-width: none;          /* Les thèmes contraignent volontiers les images. */
  margin: 0;
  object-fit: cover;
  /* Point d'intérêt, réglable panneau par panneau. Il compte plus qu'il n'y
     paraît : un panneau fermé est une bande étroite, et `cover` y recadre
     sévèrement — sans point d'intérêt, un visage sort du cadre. */
  object-position: var(--ceweb-accordeon-focus, 50% 50%);
  border-radius: inherit;
}

/* Voile dégradé, du bas vers le haut. Sur le panneau lui-même plutôt que sous
   le texte : il doit couvrir toute la largeur du panneau ouvert, pas seulement
   la boîte du texte.

   Il suit `--open`, comme le texte : un panneau fermé n'affiche rien, un voile
   n'y assombrirait la photo pour rien — et avec cinq panneaux fermés, cinq
   bandes sombres feraient tout l'effet d'une erreur. Il n'apparaît que là où
   il y a un titre à rendre lisible. */
.ceweb-accordeon__panel::after{
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    to top,
    rgba(0, 0, 0, var(--ceweb-accordeon-scrim)) 0%,
    rgba(0, 0, 0, 0) var(--ceweb-accordeon-scrim-height)
  );
  opacity: var(--ceweb-accordeon-open);
  transition: opacity var(--ceweb-accordeon-text-duration) var(--ceweb-accordeon-ease);
  pointer-events: none;
}

/* ============================================================
   Contenu

   En position absolue, ancré en bas : dans le flux, il imposerait une largeur
   minimale au panneau fermé et l'empêcherait de se réduire.
   ============================================================ */
.ceweb-accordeon__body{
  position: absolute;
  inset-inline: 0;
  bottom: 0;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: var(--ceweb-accordeon-body-gap);
  padding: var(--ceweb-accordeon-padding);
  text-align: var(--ceweb-accordeon-align);

  opacity: var(--ceweb-accordeon-open);
  transform: translateY(calc((1 - var(--ceweb-accordeon-open)) * var(--ceweb-accordeon-text-shift)));
  transition:
    opacity var(--ceweb-accordeon-text-duration) var(--ceweb-accordeon-ease),
    transform var(--ceweb-accordeon-text-duration) var(--ceweb-accordeon-ease);
  /* Nul à la fermeture, plein à l'ouverture : le texte s'efface aussitôt mais
     n'arrive qu'une fois le panneau élargi. Une seule expression pour les deux
     sens. */
  transition-delay: calc(var(--ceweb-accordeon-open) * var(--ceweb-accordeon-text-delay));
  pointer-events: none;
}

/* Le texte se replie à la largeur du panneau, toujours.

   Un `white-space: nowrap` tenait le texte sur une seule ligne pour qu'un
   panneau fermé ne l'étale pas sur dix lignes pendant la transition — mais
   rien ne rendait le repli au panneau ouvert, dont la ligne dépassait la
   boîte et se faisait couper net par le rognage du panneau.

   Et le repli ne coûte rien ici : la boîte de contenu est en position absolue,
   donc hors flux, et un enfant hors flux ne compte pas dans la largeur
   intrinsèque de son parent. Elle n'a donc jamais pu empêcher un panneau de se
   réduire, ce que le `nowrap` était censé prévenir. Replié, le texte tient dans
   sa case à toute largeur, dans tous les états et quels que soient les
   réglages — et le seul cas que le repli ne couvre pas, un mot plus large que
   le panneau (une URL), est confié à `overflow-wrap`. */
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__title,
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__text{
  margin: 0;
  padding: 0;
  white-space: normal;
  overflow-wrap: break-word;
}
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__title{
  color: var(--ceweb-accordeon-title-color);
  font-size: 34px;
  font-weight: 600;
  line-height: 1.15;
}
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__text{
  color: var(--ceweb-accordeon-text-color);
  opacity: var(--ceweb-accordeon-text-opacity);
  font-size: 17px;
  line-height: 1.4;
}

/* Le bouton retrouve les événements de souris, que la boîte de contenu a
   coupés : sans ça, un lien invisible dans un panneau fermé resterait
   cliquable. Le focus clavier, lui, l'atteint de toute façon — et ouvre le
   panneau par `:focus-within`, ce qui le rend visible avant d'être activé. */
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__cta{
  align-self: var(--ceweb-accordeon-cta-self, flex-start);
  margin-top: var(--ceweb-accordeon-cta-gap);
  padding: var(--ceweb-accordeon-cta-padding);
  background: var(--ceweb-accordeon-cta-bg);
  color: var(--ceweb-accordeon-cta-color);
  border-radius: var(--ceweb-accordeon-cta-radius);
  font-size: 15px;
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  pointer-events: none;
  transition:
    background-color var(--ceweb-accordeon-text-duration) var(--ceweb-accordeon-ease),
    color var(--ceweb-accordeon-text-duration) var(--ceweb-accordeon-ease);
}
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__cta:hover,
.ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__cta:focus-visible{
  background: var(--ceweb-accordeon-cta-bg-hover);
  color: var(--ceweb-accordeon-cta-color-hover);
}

/* ============================================================
   États

   Trois situations ouvrent un panneau, et elles ne font qu'une chose : passer
   `--ceweb-accordeon-open` à 1. Tout le reste en découle.
   ============================================================ */
.ceweb-accordeon .ceweb-accordeon__panel.is-active{
  --ceweb-accordeon-open: 1;
}

/* Le survol ne vaut que pour un vrai pointeur. Sur un écran tactile, l'état de
   survol reste collé au dernier élément touché : deux panneaux resteraient
   ouverts, et le clic ne pourrait plus rien reprendre. */
@media (hover: hover) and (pointer: fine){
  /* Pendant le survol du bloc, tout se referme… */
  .ceweb-accordeon:hover .ceweb-accordeon__panel{
    --ceweb-accordeon-open: 0;
  }
  /* … sauf le panneau survolé. Ces deux règles passent après `is-active` et à
     spécificité égale : c'est leur position qui leur donne la main. */
  .ceweb-accordeon:hover .ceweb-accordeon__panel:hover{
    --ceweb-accordeon-open: 1;
  }
}

/* Le focus clavier ouvre aussi, et passe en dernier pour l'emporter même si la
   souris traîne ailleurs sur le bloc. */
.ceweb-accordeon .ceweb-accordeon__panel:focus-within{
  --ceweb-accordeon-open: 1;
}

.ceweb-accordeon .ceweb-accordeon__panel:focus-within .ceweb-accordeon__cta,
.ceweb-accordeon .ceweb-accordeon__panel.is-active .ceweb-accordeon__cta{
  pointer-events: auto;
}
@media (hover: hover) and (pointer: fine){
  .ceweb-accordeon:hover .ceweb-accordeon__panel .ceweb-accordeon__cta{
    pointer-events: none;
  }
  .ceweb-accordeon:hover .ceweb-accordeon__panel:hover .ceweb-accordeon__cta{
    pointer-events: auto;
  }
}

/* ============================================================
   Tablette

   Les panneaux fermés se resserrent et le bloc perd de la hauteur : la rangée
   reste tenable jusqu'à ce que le passage en vertical prenne le relais.
   ============================================================ */
@media (max-width: 1024px){
  .ceweb-accordeon{
    --ceweb-accordeon-min: 60px;
  }
}

/* ============================================================
   Mobile — accordéon vertical

   Une rangée de cinq bandes étroites n'est pas lisible sur un téléphone. Le
   bloc bascule en colonne, et c'est exactement le même mécanisme : en
   `flex-direction: column`, `flex-grow` distribue la hauteur au lieu de la
   largeur. Rien d'autre à changer — ni les transitions, ni les états, ni le
   contenu.

   Un seul ajustement : la taille mini d'un panneau fermé porte désormais sur
   la hauteur, `min-width` ne contraignant plus l'axe principal.
   ============================================================ */
@media (max-width: 767px){
  .ceweb-accordeon--mobile-vertical .ceweb-accordeon__list{
    flex-direction: column;
  }
  .ceweb-accordeon--mobile-vertical .ceweb-accordeon__panel{
    min-width: 0;
    min-height: var(--ceweb-accordeon-min-mobile, 72px);
    transition: flex-grow var(--ceweb-accordeon-duration) var(--ceweb-accordeon-ease);
  }
}

/* ============================================================
   Mouvement réduit

   Les panneaux s'ouvrent toujours — c'est la fonction du bloc, pas une
   décoration — mais d'un coup, sans transition ni glissement du texte.
   ============================================================ */
@media (prefers-reduced-motion: reduce){
  .ceweb-accordeon .ceweb-accordeon__panel,
  .ceweb-accordeon__body,
  .ceweb-accordeon .ceweb-accordeon__panel .ceweb-accordeon__cta{
    transition: none !important;
  }
  .ceweb-accordeon__body{
    transform: none;
  }
}
