/* ==========================================================================
   WS Bannière - Classique
   Photo par appareil + voile, titre en trois parties décorables et animables,
   bouton complet (survol, boucle, clic, aimant).
   Tout piloté par des CSS vars posées sur .wsbn-classique par les
   `selectors` Elementor.

   RÈGLE DE SPÉCIFICITÉ
   Les valeurs par défaut de cette feuille restent volontairement en
   spécificité faible (une seule classe) : Elementor écrit ses règles avec
   `.elementor-element-XXX .classe` (0-2-0) et doit toujours gagner. Seules
   les propriétés qu'aucun réglage ne pilote peuvent monter plus haut.
   ========================================================================== */

.wsbn-classique{
  --wsbn-c-fit:cover;
  --wsbn-c-pos-x:50%;
  --wsbn-c-pos-y:50%;

  --wsbn-c-ov-1:rgba(11,29,63,.88);
  --wsbn-c-ov-1-loc:0%;
  --wsbn-c-ov-2:rgba(11,29,63,0);
  --wsbn-c-ov-2-loc:100%;
  --wsbn-c-ov-angle:100deg;
  --wsbn-c-ov-opacity:1;

  --wsbn-c-header:#D9A441;
  --wsbn-c-title-color:#FFFFFF;
  --wsbn-c-title-accent:#D9A441;
  --wsbn-c-lede:rgba(255,255,255,.80);

  --wsbn-c-badge-bg:rgba(255,255,255,.08);
  --wsbn-c-badge-border:rgba(255,255,255,.32);
  --wsbn-c-badge-dot:#3DDC84;
  --wsbn-c-badge-grad-from:#D9A441;
  --wsbn-c-badge-grad-to:#E9BE6E;
  --wsbn-c-badge-shimmer:rgba(255,255,255,.25);
  --wsbn-c-badge-shimmer-speed:3s;

  --wsbn-c-btn-bg:#D9A441;
  --wsbn-c-btn-bg-hover:#E9BE6E;
  --wsbn-c-btn-text:#241705;

  /* Bouton : durées et dosages. Posées ICI, sur le même élément que celui
     visé par les contrôles Elementor : une variable redéfinie plus bas dans
     l'arbre gagnerait sur la valeur héritée et le réglage ne servirait à
     rien. */
  --wsbn-c-hover-speed:.22s;
  --wsbn-c-hov-speed:.3s;
  --wsbn-c-hov-k:1;
  --wsbn-c-fx-color:#ffffff;
  --wsbn-c-fx-speed:.4s;
  --wsbn-c-fx-loop-speed:4s;
  --wsbn-c-fx-band:12;
  --wsbn-c-fx-angle:105deg;
  --wsbn-c-ap-speed:.45s;
  --wsbn-c-ap-ease:cubic-bezier(0.16, 1, 0.3, 1);
  --wsbn-c-perm-dur:4s;
  --wsbn-c-perm-delay:0s;
  --wsbn-c-perm-ease:cubic-bezier(0.16, 1, 0.3, 1);
  --wsbn-c-swipe-duration:400ms;

  --wsbn-c-gap:14px;
  --wsbn-c-body-w:640px;
  --wsbn-c-minh:520px;
  --wsbn-c-radius:0px;
  --wsbn-c-pad-t:60px;
  --wsbn-c-pad-r:60px;
  --wsbn-c-pad-b:60px;
  --wsbn-c-pad-l:60px;

  position:relative;
  isolation:isolate;
  overflow:hidden;
  min-height:var(--wsbn-c-minh);
  border-radius:var(--wsbn-c-radius);
  padding:60px;
  display:flex;
  align-items:center;
  font-family:"Plus Jakarta Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
  -webkit-font-smoothing:antialiased;
}

.wsbn-classique,
.wsbn-classique *,
.wsbn-classique *::before,
.wsbn-classique *::after{box-sizing:border-box}

.wsbn-classique img{display:block;max-width:100%}

/* --------------------------------------------------------------------------
   PHOTO + VOILE
   -------------------------------------------------------------------------- */

.wsbn-classique__media{position:absolute;inset:0;z-index:0}
.wsbn-classique__media img{
  width:100%;height:100%;
  object-fit:var(--wsbn-c-fit);
  object-position:var(--wsbn-c-pos-x) var(--wsbn-c-pos-y);
}

.wsbn-classique__scrim{
  position:absolute;inset:0;z-index:1;pointer-events:none;
  opacity:var(--wsbn-c-ov-opacity);
  background:linear-gradient(var(--wsbn-c-ov-angle),
    var(--wsbn-c-ov-1) var(--wsbn-c-ov-1-loc),
    var(--wsbn-c-ov-2) var(--wsbn-c-ov-2-loc));
}
/* Radial plutot que lineaire : meme 2 couleurs/emplacements, un angle n'a
   pas de sens ici donc il est ignore (le control cote panneau se cache
   deja tout seul quand ce type est choisi). */
.wsbn-classique--radial .wsbn-classique__scrim{
  background:radial-gradient(circle,
    var(--wsbn-c-ov-1) var(--wsbn-c-ov-1-loc),
    var(--wsbn-c-ov-2) var(--wsbn-c-ov-2-loc));
}
/* Pas de degrade : teinte plate, une seule couleur. */
.wsbn-classique--flat .wsbn-classique__scrim{background:var(--wsbn-c-ov-1)}

/* --------------------------------------------------------------------------
   CORPS
   -------------------------------------------------------------------------- */

.wsbn-classique__body{
  position:relative;z-index:2;
  width:100%;
  max-width:var(--wsbn-c-body-w);
  display:flex;flex-direction:column;
  gap:var(--wsbn-c-gap);

  /* LE PLACEMENT DU BLOC, et pourquoi il ne passe ni par une marge ni par
     `transform`.
     Une marge ne sait pas etre negative : elle ne pourrait pas remonter le
     bloc au-dessus de sa place, ce qui est la moitie de ce qu'on demande.
     `transform` est deja pris par les effets d'entree, qui effaceraient le
     decalage des qu'ils demarrent. La propriete individuelle `translate`
     s'ajoute a `transform` au lieu de le remplacer : les deux coexistent.
     A zero, le bloc reste exactement ou la mise en page l'a mis. */
  translate:var(--wsbn-c-body-x, 0) var(--wsbn-c-body-y, 0);
}

.wsbn-classique__eyebrow{
  margin:0;
  font-size:12px;font-weight:700;
  letter-spacing:.08em;text-transform:uppercase;
  color:var(--wsbn-c-header);
}

.wsbn-classique__badge{
  display:inline-flex;align-items:center;gap:8px;
  align-self:flex-start;
  padding:8px 16px 8px 14px;
  border-radius:999px;
  border:1px solid var(--wsbn-c-badge-border);
  background:var(--wsbn-c-badge-bg);
  backdrop-filter:blur(6px);
  -webkit-backdrop-filter:blur(6px);
  color:var(--wsbn-c-header);
  text-decoration:none;
  font-size:12.5px;font-weight:600;
  transition:background .2s ease, transform .2s ease;
}
.wsbn-classique__badge:hover{background:rgba(255,255,255,.16);transform:translateY(-1px)}
.wsbn-classique__badge-dot{
  position:relative;
  width:7px;height:7px;border-radius:50%;
  background:var(--wsbn-c-badge-dot);
  flex:none;
}

/* LE HALO DU POINT EST UN CALQUE SEPARE, PAS LE POINT LUI-MEME.
   Faire grossir le point pousserait le texte a cote a chaque battement :
   il est dans le flux. Le `::after` est en absolu, donc hors flux, et son
   `transform` est compose par la carte graphique au lieu de refaire la
   mise en page a chaque image.
   La duree porte son repli : le jour ou un curseur la pilotera, il n'y
   aura qu'a ecrire la variable. */
.wsbn-classique__badge--dot-pulse .wsbn-classique__badge-dot::after{
  content:"";
  position:absolute;
  inset:0;
  border-radius:50%;
  background:var(--wsbn-c-badge-dot);
  animation:wsbn-c-badge-dot-pulse var(--wsbn-c-badge-dot-speed, 1.9s) ease-out infinite;
}

@keyframes wsbn-c-badge-dot-pulse{
  0%   { transform:scale(1);   opacity:.65; }
  100% { transform:scale(2.8); opacity:0; }
}

/* --- Variantes (portees du widget "Pill annonce/badge") --- */
.wsbn-classique__badge--pill{border-radius:999px}
.wsbn-classique__badge--outline{background:transparent}
.wsbn-classique__badge--filled{background:var(--wsbn-c-badge-bg);border-color:transparent}
.wsbn-classique__badge--gradient-border{
  background:
    linear-gradient(var(--wsbn-c-badge-bg), var(--wsbn-c-badge-bg)) padding-box,
    linear-gradient(135deg, var(--wsbn-c-badge-grad-from), var(--wsbn-c-badge-grad-to)) border-box;
  border:1px solid transparent;
}

/* --- Reflet qui traverse --- */
.wsbn-classique__badge--shimmer{position:relative;overflow:hidden;isolation:isolate}
.wsbn-classique__badge--shimmer::before{
  content:"";
  position:absolute;top:0;left:0;width:60%;height:100%;
  background:linear-gradient(110deg,
    transparent 0%, transparent 30%,
    var(--wsbn-c-badge-shimmer) 50%,
    transparent 70%, transparent 100%);
  animation:wsbn-c-badge-shimmer var(--wsbn-c-badge-shimmer-speed) linear infinite;
  pointer-events:none;
}

@keyframes wsbn-c-badge-shimmer{
  from{transform:translateX(-166.67%)}
  to  {transform:translateX(333.33%)}
}

/* --- Lift au survol --- */
.wsbn-classique__badge--lift:hover{
  transform:translateY(-2px);
  box-shadow:0 8px 20px -8px rgba(0,0,0,.25);
}

/* --- Mouvements au survol --- */
.wsbn-classique__badge--hov-pulse:hover{animation:wsbn-c-badge-pulse .6s ease-in-out}
.wsbn-classique__badge--hov-wiggle:hover{animation:wsbn-c-badge-wiggle .4s ease-in-out}
.wsbn-classique__badge--hov-shake-x:hover{animation:wsbn-c-badge-shake-x .5s ease-in-out}
.wsbn-classique__badge--hov-bounce:hover{animation:wsbn-c-badge-bounce .6s ease-in-out}
.wsbn-classique__badge--hov-tilt:hover{transform:perspective(500px) rotateX(8deg) rotateY(-4deg) translateY(-2px)}
.wsbn-classique__badge--hov-expand:hover{transform:scale(1.06)}
.wsbn-classique__badge--hov-glow-ring:hover{box-shadow:0 0 0 4px rgba(217,164,65,.18), 0 0 20px rgba(217,164,65,.35)}
.wsbn-classique__badge--hov-icon-spin:hover .wsbn-classique__badge-dot{animation:wsbn-c-badge-spin .6s linear}
.wsbn-classique__badge--hov-icon-bounce:hover .wsbn-classique__badge-dot{animation:wsbn-c-badge-bounce .5s ease-in-out}

@keyframes wsbn-c-badge-pulse{0%,100%{transform:scale(1)} 50%{transform:scale(1.05)}}
@keyframes wsbn-c-badge-wiggle{0%,100%{transform:rotate(0)} 25%{transform:rotate(-2deg)} 75%{transform:rotate(2deg)}}
@keyframes wsbn-c-badge-shake-x{
  0%,100%{transform:translateX(0)}
  20%{transform:translateX(-4px)} 40%{transform:translateX(4px)}
  60%{transform:translateX(-3px)} 80%{transform:translateX(3px)}
}
@keyframes wsbn-c-badge-bounce{0%,100%{transform:translateY(0)} 30%{transform:translateY(-6px)} 60%{transform:translateY(-2px)}}
@keyframes wsbn-c-badge-spin{from{transform:rotate(0)} to{transform:rotate(360deg)}}

/* --- Animations continues (sans survol) --- */
/* Chaque effet lit la MEME variable mais garde SON repli : le curseur du
   panneau part sans valeur, donc tant qu'on n'y touche pas chacun tourne a
   sa cadence d'origine. Le repli se met la ou la variable est lue. */
.wsbn-classique__badge--idle-float{animation:wsbn-c-badge-float var(--wsbn-c-badge-idle-speed, 3.4s) ease-in-out infinite}
.wsbn-classique__badge--idle-float-rot{animation:wsbn-c-badge-float-rot var(--wsbn-c-badge-idle-speed, 4.5s) ease-in-out infinite}
.wsbn-classique__badge--idle-pulse-bg{animation:wsbn-c-badge-pulse-bg var(--wsbn-c-badge-idle-speed, 2.4s) ease-in-out infinite}
.wsbn-classique__badge--idle-breath{animation:wsbn-c-badge-breath var(--wsbn-c-badge-idle-speed, 3s) ease-in-out infinite}

@keyframes wsbn-c-badge-float{0%,100%{transform:translateY(0)} 50%{transform:translateY(-6px)}}
@keyframes wsbn-c-badge-float-rot{0%,100%{transform:translateY(0) rotate(-1deg)} 50%{transform:translateY(-6px) rotate(1deg)}}
@keyframes wsbn-c-badge-pulse-bg{0%,100%{box-shadow:0 0 0 0 rgba(217,164,65,0)} 50%{box-shadow:0 0 0 6px rgba(217,164,65,.15)}}
@keyframes wsbn-c-badge-breath{0%,100%{transform:scale(1)} 50%{transform:scale(1.03)}}

@media (prefers-reduced-motion:reduce){
  /* Le halo ne se met pas en pause, il DISPARAIT : mis en pause il
     resterait fige a mi-course, en disque trouble autour du point. */
  .wsbn-classique__badge--dot-pulse .wsbn-classique__badge-dot::after{
    animation:none !important;
    opacity:0 !important;
  }

  .wsbn-classique__badge,
  .wsbn-classique__badge--shimmer::before,
  .wsbn-classique__badge[class*="--hov-"],
  .wsbn-classique__badge[class*="--idle-"]{
    animation:none !important;
    transition:none !important;
  }
}

/* Le tracé de la flèche de la pastille. Scopé À LA PASTILLE : une règle
   `svg` générale repeindrait aussi les icônes du bouton, qui sont pleines et
   n'ont aucun contour - une flèche pleine deviendrait invisible. */
.wsbn-classique__badge svg{
  width:12px;height:12px;flex:none;
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}

.wsbn-classique__lede{
  margin:0;
  max-width:48ch;
  font-size:15px;
  line-height:1.6;
  color:var(--wsbn-c-lede);
}

/* ==========================================================================
   TITRE

   PRINCIPE DE BASE : DEUX COUCHES SÉPARÉES
     .wsbn-classique__title-deco   la décoration (surlignage, trait, cercle…)
     .wsbn-classique__title-text   le mot, qui porte sa propre couleur
   Les séparer permet un dégradé sur le TEXTE et un autre sur le SURLIGNAGE en
   même temps. Réunis sur un seul élément, les deux fonds se disputeraient la
   même propriété CSS et l'un des deux disparaîtrait.

   RÈGLE DE SÉCURITÉ
   Rien n'est masqué tant que le script n'a pas pris la main (.wsbn-fx-js). Si
   le JS ne se charge pas, le titre s'affiche normalement, sans animation. Un
   titre invisible est le pire défaut possible : c'est souvent le H1.
   ========================================================================== */

.wsbn-classique__title{
  margin:0;
  /* L'espace réservé à chaque ligne se décide ICI, sur le conteneur, et non
     sur le texte : les parties sont des blocs en ligne, et c'est le conteneur
     qui fixe la hauteur de leurs lignes. */
  line-height:1.1;
  font-size:clamp(28px, 4.4vw, 52px);
  font-weight:900;
  letter-spacing:-.02em;
  overflow-wrap:normal;
  word-break:normal;
  color:var(--wsbn-c-title-color);

  /* Valeurs de repli : le titre doit être présentable dès sa pose. */
  --wsbn-c-title-dur:.8s;
  --wsbn-c-title-stagger:.12s;
  --wsbn-c-title-loop-speed:4s;
  --wsbn-c-title-thickness:3px;
  --wsbn-c-title-deco-h:38%;
  --wsbn-c-title-deco-radius:4px;
}

.wsbn-classique__title em{font-style:normal;color:var(--wsbn-c-title-accent)}

/* UNE PARTIE EST DU TEXTE, PAS UNE BOÎTE.
   Un bloc en ligne ne se coupe jamais en deux : dès que son texte dépasse
   la largeur disponible, il prend toute la ligne et pousse la partie
   suivante à la ligne d'après. Le titre affichait alors des sauts de ligne
   que personne n'avait demandés. En `inline`, les parties coulent comme une
   phrase ordinaire et la ligne ne se coupe qu'où on le demande. */
.wsbn-classique__title-part{
  position:relative;
  display:inline;
}

/* LA BOÎTE RESTE LÀ OÙ ELLE EST INDISPENSABLE, ET SEULEMENT LÀ.
   Une décoration est un masque ou un trait posé en absolu : il lui faut
   un rectangle. Un effet d'entrée est une transformation, et une
   transformation ne s'applique pas à une boîte en ligne.
   Dans ces deux cas une partie trop longue prend encore sa propre ligne :
   c'est la contrepartie du rectangle, pas un oubli.
   `max-width` garde un titre long dans sa colonne sur mobile.

   ET SAUF DEUX EFFETS D'ENTREE, QUI N'ANIMENT PAS LA PARTIE.
   `balayage` anime un pseudo-element de la partie, `montee` anime les
   lettres une a une. Ni l'un ni l'autre ne transforme la partie, donc
   aucun des deux n'a besoin qu'elle soit une boite. La regle
   d'animation les excluait deja nommement ; celle-ci ne le faisait pas,
   et leur imposait un cout sans leur rendre de service : un titre qui
   cassait apres chaque partie.
   Le prix, assume : la bande du balayage ne couvre plus que le premier
   fragment d'une partie qui se coupe en deux.

   SAUF LE SURLIGNAGE PLEIN, QUI N'A PAS DE RECTANGLE.
   Sa boîte absolue est en `display:none` : l'effet est un FOND posé sur
   le texte, que le navigateur coupe par fragment de ligne tout seul.
   C'est ce qui lui permet de suivre chaque ligne, et c'est aussi ce qui
   rend la boîte inutile. Elle la payait quand même, en forçant la partie
   suivante à la ligne : le saut de ligne de la 1.50, qui n'avait survécu
   que là. Sur les vingt décorations, c'est la seule dans ce cas.

   L'effet d'entrée, lui, l'emporte : la seconde règle ne l'exclut pas.

   ET DEUX EFFETS DE PLUS S'EN PASSENT MAINTENANT.
   `fondu` ne joue que sur l'opacité, qui fonctionne sur du texte en
   ligne. Et une partie marquée `--mots` est animée sur SES MOTS, chacun
   étant sa propre boîte : la partie, elle, peut rester du texte. C'est
   ce qui fait couler cinq effets de plus, `balayage` compris.
   ET SURTOUT : CE SELECTEUR S'ECRIT SUR UNE SEULE LIGNE.
   Il a ete coupe en trois lignes pour la lisibilite, et les deux retours
   a la ligne sont devenus des COMBINATEURS DE DESCENDANCE : la regle
   reclamait un element entre le titre et la partie, qui n'existe pas.
   Elle ne s'appliquait donc JAMAIS. Mesure du 2026-09-27 : partie en
   `display:inline`, et un `translateY(100px)` la deplace de 0 px, contre
   100 px en `inline-block`. Les cinq effets qui deplacent la partie
   n'etaient plus que des fondus, sans que rien ne le signale.
   Une espace dans un selecteur n'est jamais decorative. */
.wsbn-classique__title-part--deco:not([data-wsbn-deco="bande"]),
.wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="fondu"]) .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots){
  display:inline-block;
  max-width:100%;
}

.wsbn-classique__title-text{
  position:relative;
  z-index:1;
}

/* Le dégradé du texte. La couleur transparente n'est posée QUE sur cette
   classe, jamais par défaut : une couleur transparente sans fond derrière
   donnerait un titre invisible. Le dégradé de repli garantit que même sans
   réglage, quelque chose s'affiche. */
.wsbn-classique__title-text--gradient{
  background-image:linear-gradient(90deg, #D9A441, #E9BE6E);
  background-size:200% 100%;
  -webkit-background-clip:text;
  background-clip:text;
  color:transparent;
}

/* La décoration. `currentColor` par défaut : une décoration choisie mais pas
   encore colorée se voit tout de suite, au lieu de laisser croire à un bug. */
.wsbn-classique__title-deco{
  position:absolute;
  /* La couleur passe par une variable pour que le halo du néon, qui ne
     peut pas la lire dans `currentColor`, retrouve la même valeur. Le
     groupe « Couleur » écrit sur un sélecteur plus précis et gagne. */
  background:var(--wsbn-c-title-deco-color, currentColor);
  pointer-events:none;
  box-sizing:border-box;

  /* LA DISTANCE AU TEXTE, et pourquoi elle ne peut PAS passer par
     `transform`. Sur cette même balise, `transform` est déjà pris trois
     fois : la rotation du trait signature et de la croix, et les
     animations d'entrée (`scaleX`, `scale`). Un décalage écrit en
     `transform` aurait EFFACÉ la rotation, ou empêché la décoration de
     se dessiner. La propriété individuelle `translate` s'ajoute à
     `transform` au lieu de le remplacer : les trois gestes coexistent.
     À zéro, la décoration reste exactement où la feuille l'a calée. */
  translate:0 var(--wsbn-c-title-deco-distance, 0);
}

/* L'ÉCART ENTRE DEUX PARTIES VOISINES.
   Il est posé sur la partie de GAUCHE, et seulement quand elle a un voisin sur
   sa ligne : le rendu s'en charge en posant la classe. Une marge horizontale
   s'applique bien à une boîte en ligne, ce qui évite d'avoir à changer la
   nature des parties.

   POURQUOI PAS `word-spacing`, qui était écrit ici avant : il élargit TOUTES
   les espaces du titre, y compris celles qui séparent les mots À L'INTÉRIEUR
   d'une partie. « Un vrai projet » devenait « Un   vrai   projet » : le
   réglage promettait un écart entre parties et délavait le texte. */
.wsbn-classique__title-part--suivi{
  margin-inline-end:var(--wsbn-c-title-gap, 0px);
}

/* LE SAUT DE LIGNE DEMANDÉ.
   Un bloc vide au milieu d'un texte coupe la ligne exactement comme un `<br>`,
   à ceci près qu'il a une HAUTEUR, et une hauteur, ça se règle. À zéro, le
   rendu est celui d'un `<br>` : c'est ce qui permet d'avoir changé de balise
   sans déplacer un seul titre déjà en ligne.

   Il ne remplace pas l'interligne : l'interligne fixe la hauteur réservée à
   CHAQUE ligne, donc aussi celles d'un texte qui revient à la ligne tout seul.
   Celui-ci ne s'ajoute qu'aux sauts DEMANDÉS. */
.wsbn-classique__title-saut{
  display:block;
  height:var(--wsbn-c-title-line-gap, 0px);
  line-height:0;
  font-size:0;
}

/* `.wsbn-classique__title-br` vivait ici, « conservé pour les titres rendus
   avant le passage au bloc ci-dessus ». Retiré en 1.81 : Elementor
   n'enregistre que des REGLAGES, et `render()` reproduit le balisage a
   chaque chargement de page. Un span `__title-br` ne peut donc exister dans
   aucune page, quelle que soit son ancienneté, et la regle ne visait plus
   rien depuis le jour du renommage en `__title-saut`.

   C'est la seule que `scratchpad/classes_sans_balisage.py` ait trouvee sur
   les onze bannieres, et c'est ce qui la rend utile : un outil qui signale
   toujours quelque chose finit par ne plus etre lu. */

/* --------------------------------------------------------------------------
   DÉCORATIONS
   Deux familles : les APLATS passent derrière le mot, les TRAITS passent
   devant. Un surlignage derrière le texte est lisible ; un mot barré dont la
   barre passerait dessous ne voudrait rien dire.
   -------------------------------------------------------------------------- */

/* --- Marqueur : la bande de feutre, posée sur le bas du mot --- */
[data-wsbn-deco="surlignage"] .wsbn-classique__title-deco{
  left:-.08em;
  right:-.08em;
  bottom:.04em;
  height:var(--wsbn-c-title-deco-h);
  border-radius:var(--wsbn-c-title-deco-radius);
  z-index:0;
}

/* --- Bande : le mot entier dans une pastille.

   DÉFORMATION
   Le bord droit se pince : le bloc paraît plus épais au début qu'à la fin,
   comme un bandeau posé à la main. À zéro, le tracé revient exactement au
   rectangle d'origine, donc rien ne bouge sur les titres déjà en place.

   Le découpage est posé en POURCENTAGES de la hauteur du bloc : le pincement
   reste proportionné quelle que soit la taille du texte. */
/* LE SURLIGNAGE PLEIN SUIT CHAQUE LIGNE.
   Le bloc en absolu s'efface au profit du fond du TEXTE, qui est en ligne et
   que le navigateur coupe donc par fragment de ligne tout seul.
   `box-decoration-break:clone` donne a chaque fragment sa marge et son
   arrondi, au lieu de reserver le bord gauche au premier et le bord droit au
   dernier. Le reglage "Un seul bloc" rallume le bloc et eteint ce fond. */
[data-wsbn-deco="bande"] .wsbn-classique__title-deco{
  display:none;
}

[data-wsbn-deco="bande"] .wsbn-classique__title-text{
  /* PAS `currentColor` ICI, ET C'EST LA SEULE DECORATION DANS CE CAS.
     La bande passe DERRIERE le texte : lui donner la couleur de ce texte
     revient a effacer le mot. Blanc sur blanc dans Arc, dont le titre est
     blanc, et la partie decoree disparaissait entierement.

     Les dix-neuf autres decorations sont des traits et des formes poses
     a cote ou sous le texte : pour elles `currentColor` est le bon
     defaut, et il ne bouge pas.

     Le groupe << Couleur >> du panneau ecrit sur un selecteur plus precis
     et l'emporte des qu'on y touche : ce repli ne sert qu'a celui qui
     n'a rien choisi.

     POURQUOI CET OR-LA ET PAS UN AUTRE.
     On ne sait pas d'avance si le titre est clair ou sombre : le repli doit
     donc etre lisible DANS LES DEUX SENS. Mesure des contrastes, seuil de
     3:1 pour du grand texte :

       #D9A441   blanc 2,25  sombre 7,58   passe dans un seul sens
       #C9963F   blanc 2,65  sombre 6,43   passe dans un seul sens
       #B07C1E   blanc 3,65  sombre 4,67   PASSE DANS LES DEUX
       #1B2A4A   blanc 14,2  sombre 1,20   passe dans un seul sens

     C'est le seul de la liste a tenir des deux cotes. */
  background:var(--wsbn-c-title-bande, #B07C1E);
  border-radius:var(--wsbn-c-title-deco-radius);
  -webkit-box-decoration-break:clone;
          box-decoration-break:clone;
  /* `inline` et non `inline-block` : c'est la coupure en fragments de ligne
     qui fait tout le travail, et un bloc ne se coupe pas. */
  display:inline;
}

[data-wsbn-deco="bande"] .wsbn-classique__title-deco{
  inset:0;
  border-radius:var(--wsbn-c-title-deco-radius);
  z-index:0;
  clip-path:polygon(
    0 0,
    100% var(--wsbn-c-title-deform, 0%),
    100% calc(100% - var(--wsbn-c-title-deform, 0%)),
    0 100%
  );
}

/* --- Souligné --- */
[data-wsbn-deco="souligne"] .wsbn-classique__title-deco{
  left:0;
  right:0;
  bottom:-.06em;
  height:var(--wsbn-c-title-thickness);
  border-radius:999px;
  z-index:2;
}

/* --- Trait signature : le même principe que le souligné, mais fin et
   légèrement incliné, pour donner le geste d'un trait tracé à la main plutôt
   qu'un soulignement typographique. L'inclinaison est faible À DESSEIN : au
   delà de deux degrés, le trait cesse de suivre le mot et se lit comme un
   défaut d'alignement. */
[data-wsbn-deco="trait"] .wsbn-classique__title-deco{
  left:0;
  right:-.05em;
  bottom:-.1em;
  height:var(--wsbn-c-title-thickness);
  border-radius:999px;
  transform:rotate(var(--wsbn-c-title-slant, -1deg));
  transform-origin:left center;
  z-index:2;
}

/* --- Barré --- */
[data-wsbn-deco="barre"] .wsbn-classique__title-deco{
  left:-.04em;
  right:-.04em;
  top:50%;
  height:var(--wsbn-c-title-thickness);
  margin-top:calc(var(--wsbn-c-title-thickness) / -2);
  border-radius:999px;
  z-index:2;
}

/* --- Croix : deux traits en X.
   Le second trait est un pseudo-élément du premier, avec `background: inherit`
   pour reprendre exactement la même couleur ou le même dégradé. Il tourne de
   -2 fois l'angle : comme il est DÉJÀ tourné par son parent, ce doublement le
   ramène à l'opposé exact du premier trait. */
[data-wsbn-deco="croix"] .wsbn-classique__title-deco{
  --wsbn-c-title-cross:7deg;
  left:-.1em;
  right:-.1em;
  top:50%;
  height:var(--wsbn-c-title-thickness);
  margin-top:calc(var(--wsbn-c-title-thickness) / -2);
  border-radius:999px;
  transform:rotate(var(--wsbn-c-title-cross));
  z-index:2;
}
[data-wsbn-deco="croix"] .wsbn-classique__title-deco::after{
  content:"";
  position:absolute;
  inset:0;
  background:inherit;
  border-radius:inherit;
  transform:rotate(calc(var(--wsbn-c-title-cross) * -2));
}

/* --- Entouré : une ellipse tracée autour du mot.
   Le contour est un fond découpé en anneau (masque), et non un `border` : un
   `border` n'accepte pas de dégradé, ce qui aurait interdit « dégradé
   partout » sur cette décoration précise. */
[data-wsbn-deco="entoure"] .wsbn-classique__title-deco{
  inset:-.16em -.5em;
  border-radius:50%;
  padding:var(--wsbn-c-title-thickness);
  -webkit-mask:linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite:xor;
  mask:linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  mask-composite:exclude;
  z-index:2;
}

/* --------------------------------------------------------------------------
   ENTRÉE DU TITRE
   Rien ne se déclenche tant que .wsbn-fx-js n'est pas posée par le script, et
   rien ne se masque en dehors de cette classe. Le script ajoute ensuite
   .wsbn-fx-on à l'arrivée à l'écran.
   -------------------------------------------------------------------------- */

.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots){
  opacity:0;
}
/* UNE PARTIE DECOUPEE EN MOTS EST ANIMEE SUR SES MOTS : ce sont donc EUX
   qu'il faut masquer au depart. Masquer la partie la laisserait invisible
   a vie, puisque plus rien ne l'animerait. */
.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) .wsbn-classique__title-part--mots .wsbn-classique__title-word{
  opacity:0;
}

/* La décoration se dessine APRÈS le mot : c'est ce décalage qui donne
   l'impression d'un trait posé à la main une fois la phrase écrite.
   Réservé aux parties en "Suit le texte" (défaut) : une partie avec son
   propre "Effet d'apparition" (title_p{n}_deco_in) a ses règles dédiées
   plus bas, indépendantes de l'entrée du texte. */
.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="decouvre"]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) .wsbn-classique__title-part:not([data-wsbn-deco-in="trace"]):not([data-wsbn-deco-in="fondu"]):not([data-wsbn-deco-in="zoom"]):not([data-wsbn-deco-in="none"]) .wsbn-classique__title-deco:not(.wsbn-classique__title-deco--trace){
  transform:scaleX(0);
  transform-origin:left center;
}
.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="decouvre"]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) [data-wsbn-deco="entoure"]:not([data-wsbn-deco-in="trace"]):not([data-wsbn-deco-in="fondu"]):not([data-wsbn-deco-in="zoom"]):not([data-wsbn-deco-in="none"]) .wsbn-classique__title-deco{
  transform:scale(0);
  transform-origin:center;
}
.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="decouvre"]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) [data-wsbn-deco="croix"]:not([data-wsbn-deco-in="trace"]):not([data-wsbn-deco-in="fondu"]):not([data-wsbn-deco-in="zoom"]):not([data-wsbn-deco-in="none"]) .wsbn-classique__title-deco{
  transform:rotate(var(--wsbn-c-title-cross)) scaleX(0);
}

/* Le retard de chaque partie se calcule sur son rang, posé par le rendu.
   Les mots d'une partie découpée héritent de ce MÊME rang : ils partent
   donc tous ensemble, et le titre garde exactement la cascade qu'il
   avait quand la partie bougeait d'un bloc. */
.wsbn-fx-on .wsbn-classique__title .wsbn-classique__title-part,
.wsbn-fx-on .wsbn-classique__title .wsbn-classique__title-part--mots .wsbn-classique__title-word{
  animation-duration:var(--wsbn-c-title-dur);
  animation-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger));
  animation-timing-function:cubic-bezier(.22, .68, .3, 1);
  animation-fill-mode:both;
}

/* Le tracé de la décoration est réservé aux titres qui ONT une entrée. Sans ce
   garde-fou, un titre réglé sur « Aucun effet » verrait quand même ses traits
   se dessiner : l'option ne serait pas respectée. Réservé aux parties en
   "Suit le texte" (défaut), cf. commentaire équivalent plus haut. */
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="decouvre"]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) .wsbn-classique__title-part:not([data-wsbn-deco-in="trace"]):not([data-wsbn-deco-in="fondu"]):not([data-wsbn-deco-in="zoom"]):not([data-wsbn-deco-in="none"]) .wsbn-classique__title-deco:not(.wsbn-classique__title-deco--trace){
  animation:wsbn-c-title-trace var(--wsbn-c-title-dur) cubic-bezier(.22, .68, .3, 1) both;
  /* Le « + .55 » est le retard sur le mot : le trait arrive quand le texte est
     déjà largement en place. */
  animation-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger) + var(--wsbn-c-title-dur) * .55);
}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="decouvre"]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) [data-wsbn-deco="entoure"]:not([data-wsbn-deco-in="trace"]):not([data-wsbn-deco-in="fondu"]):not([data-wsbn-deco-in="zoom"]):not([data-wsbn-deco-in="none"]) .wsbn-classique__title-deco{
  animation-name:wsbn-c-title-trace-cercle;
}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in]:not([data-wsbn-title-in=""]):not([data-wsbn-title-in="decouvre"]):not([data-wsbn-title-in="balayage"]):not([data-wsbn-title-in="montee"]) [data-wsbn-deco="croix"]:not([data-wsbn-deco-in="trace"]):not([data-wsbn-deco-in="fondu"]):not([data-wsbn-deco-in="zoom"]):not([data-wsbn-deco-in="none"]) .wsbn-classique__title-deco{
  animation-name:wsbn-c-title-trace-croix;
}

/* --------------------------------------------------------------------------
   EFFET D'APPARITION DE LA DÉCORATION, PAR PARTIE (title_p{n}_deco_in)
   Indépendant de l'entrée du texte (data-wsbn-title-in ci-dessus) : une
   partie peut avoir sa décoration qui se dessine même si le texte, lui,
   apparaît en fondu ou n'a aucune entrée. "Aucun" ne pose aucune règle ici :
   la décoration reste visible dès le départ, comme avant l'ajout de ce
   réglage.
   -------------------------------------------------------------------------- */

.wsbn-fx-js [data-wsbn-deco-in="trace"] .wsbn-classique__title-deco:not(.wsbn-classique__title-deco--trace){
  transform:scaleX(0);
  transform-origin:left center;
}
.wsbn-fx-js [data-wsbn-deco-in="trace"][data-wsbn-deco="entoure"] .wsbn-classique__title-deco{
  transform:scale(0);
  transform-origin:center;
}
.wsbn-fx-js [data-wsbn-deco-in="trace"][data-wsbn-deco="croix"] .wsbn-classique__title-deco{
  transform:rotate(var(--wsbn-c-title-cross)) scaleX(0);
}
.wsbn-fx-on [data-wsbn-deco-in="trace"] .wsbn-classique__title-deco:not(.wsbn-classique__title-deco--trace){
  animation:wsbn-c-title-trace var(--wsbn-c-title-dur) cubic-bezier(.22, .68, .3, 1) both;
  animation-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger) + var(--wsbn-c-title-dur) * .55);
}
.wsbn-fx-on [data-wsbn-deco-in="trace"][data-wsbn-deco="entoure"] .wsbn-classique__title-deco{
  animation-name:wsbn-c-title-trace-cercle;
}
.wsbn-fx-on [data-wsbn-deco-in="trace"][data-wsbn-deco="croix"] .wsbn-classique__title-deco{
  animation-name:wsbn-c-title-trace-croix;
}

.wsbn-fx-js [data-wsbn-deco-in="fondu"] .wsbn-classique__title-deco{opacity:0}
.wsbn-fx-on [data-wsbn-deco-in="fondu"] .wsbn-classique__title-deco{
  animation:wsbn-c-title-deco-fondu var(--wsbn-c-title-dur) cubic-bezier(.22, .68, .3, 1) both;
  animation-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger) + var(--wsbn-c-title-dur) * .55);
}
@keyframes wsbn-c-title-deco-fondu{from{opacity:0} to{opacity:1}}

.wsbn-fx-js [data-wsbn-deco-in="zoom"] .wsbn-classique__title-deco{transform:scale(0);opacity:0}
.wsbn-fx-on [data-wsbn-deco-in="zoom"] .wsbn-classique__title-deco{
  animation:wsbn-c-title-deco-zoom var(--wsbn-c-title-dur) cubic-bezier(.22, .68, .3, 1) both;
  animation-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger) + var(--wsbn-c-title-dur) * .55);
}
@keyframes wsbn-c-title-deco-zoom{from{transform:scale(0);opacity:0} to{transform:scale(1);opacity:1}}

.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="fondu"]   .wsbn-classique__title-part{animation-name:wsbn-c-title-fondu}
/* LES MEMES EFFETS, JOUES SUR LES MOTS quand la partie coule au lieu
   d'etre une boite. Le fondu n'y est pas : son opacite est deja portee
   par la partie, qui reste en ligne, et la jouer deux fois la ferait
   apparaitre deux fois. */
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="monte"] .wsbn-classique__title-part--mots .wsbn-classique__title-word{animation-name:wsbn-c-title-monte}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="descend"] .wsbn-classique__title-part--mots .wsbn-classique__title-word{animation-name:wsbn-c-title-descend}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="gauche"] .wsbn-classique__title-part--mots .wsbn-classique__title-word{animation-name:wsbn-c-title-gauche}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="droite"] .wsbn-classique__title-part--mots .wsbn-classique__title-word{animation-name:wsbn-c-title-droite}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="zoom"] .wsbn-classique__title-part--mots .wsbn-classique__title-word{animation-name:wsbn-c-title-zoom}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="monte"]   .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots){animation-name:wsbn-c-title-monte}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="descend"] .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots){animation-name:wsbn-c-title-descend}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="gauche"]  .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots){animation-name:wsbn-c-title-gauche}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="droite"]  .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots){animation-name:wsbn-c-title-droite}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="zoom"]    .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots){animation-name:wsbn-c-title-zoom}

/* Dévoilé par le bas : le mot glisse hors d'une fenêtre invisible. Il faut
   donc un recadrage, posé UNIQUEMENT pour cet effet (il couperait les
   décorations qui dépassent du mot dans les autres cas). */
.wsbn-classique__title[data-wsbn-title-in="masque"] .wsbn-classique__title-part{
  overflow:hidden;
  padding-bottom:.12em;
}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="masque"] .wsbn-classique__title-part > *{
  animation:wsbn-c-title-masque var(--wsbn-c-title-dur) cubic-bezier(.22, .68, .3, 1) both;
  animation-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger));
  display:inline-block;
}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="masque"] .wsbn-classique__title-part{animation-name:wsbn-c-title-fondu}

/* --- BANDE QUI DÉCOUVRE ---------------------------------------------------
   Un rideau qui s'ouvre de gauche à droite, partie par partie. Ce n'est ni un
   fondu ni une translation : le mot est déjà en place, il est simplement
   masqué, et le masque se retire.

   POURQUOI LE DÉCOUPAGE DÉBORDE (les -40 %)
   Les décorations sont positionnées par rapport à la boîte de la partie, et
   plusieurs DÉBORDENT du mot : l'ellipse d'« entouré » surtout, mais aussi le
   marqueur, le souligné et la croix. Un rideau calé sur la boîte les
   rognerait donc. Des valeurs négatives élargissent la fenêtre de découpage
   SANS toucher à la boîte : la mise en page et les décorations ne bougent pas
   d'un pixel.

   L'opacité est RÉPÉTÉE dans les étapes : la règle de départ met les parties à
   zéro pour les autres effets, et une propriété absente des étapes garderait
   cette valeur. Sans ces deux `opacity: 1`, le titre resterait invisible. */
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="decouvre"] .wsbn-classique__title-part{
  animation-name:wsbn-c-title-decouvre;
}
@keyframes wsbn-c-title-decouvre{
  from{clip-path:inset(-40% 100% -40% -40%);opacity:1}
  to  {clip-path:inset(-40% -40% -40% -40%);opacity:1}
}

/* --------------------------------------------------------------------------
   LE TEXTE MONTE DANS LA BANDE
   La bande ne bouge pas : elle sert de fenêtre. Le texte arrive par le bas,
   glisse à l'intérieur et vient se poser. On ne voit jamais le texte déborder
   du bloc, puisque le bloc le découpe.

   À UTILISER AVEC LA DÉCORATION « SURLIGNAGE PLEIN »
   C'est elle qui dessine la fenêtre. Sans décoration, le texte monte dans le
   vide : l'effet marche, mais il n'a plus rien de particulier.
   -------------------------------------------------------------------------- */
.wsbn-classique__title[data-wsbn-title-in="montee"] .wsbn-classique__title-part{
  overflow:hidden;
  /* La fenêtre épouse la MÊME forme que le bloc. Sans ce tracé, un bloc
     déformé laisserait les lettres dépasser dans le coin pincé. */
  clip-path:polygon(
    0 0,
    100% var(--wsbn-c-title-deform, 0%),
    100% calc(100% - var(--wsbn-c-title-deform, 0%)),
    0 100%
  );
}

/* Le mot reste insécable : les lettres sont devenues des blocs autonomes, et
   sans cette règle le navigateur couperait au milieu d'un mot en fin de
   ligne. */
/* `position:relative` : un mot peut porter sa propre bande de balayage,
   qui se pose en absolu sur lui. */
.wsbn-classique__title-word{display:inline-block;white-space:nowrap;position:relative}
.wsbn-classique__title-char{display:inline-block}
/* L'espace entre deux mots doit être posé explicitement : entre deux blocs, il
   serait avalé par la mise en page. */
.wsbn-classique__title-space{display:inline-block;white-space:pre}

/* La copie lue par les lecteurs d'écran : présente dans la page, invisible à
   l'oeil. Un titre découpé en lettres serait autrement épelé lettre par
   lettre. */
.wsbn-classique__title-sr{
  position:absolute;
  width:1px;
  height:1px;
  overflow:hidden;
  clip-path:inset(50%);
  white-space:nowrap;
}

/* Les lettres partent sous la fenêtre. Uniquement si le script a la main :
   sans lui elles restent en place et le titre se lit normalement. */
.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in="montee"] .wsbn-classique__title-char{
  transform:translateY(115%);
}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="montee"] .wsbn-classique__title-char{
  animation:wsbn-c-title-montee var(--wsbn-c-title-dur) cubic-bezier(.22, .68, .3, 1) both;
  /* Deux décalages qui s'ajoutent : celui de la ligne, puis celui de la lettre
     dans la ligne. */
  animation-delay:calc(
    var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger)
    + var(--wsbn-c-title-char, 0) * var(--wsbn-c-title-char-delay, .03s)
  );
}
@keyframes wsbn-c-title-montee{
  from{transform:translateY(115%)}
  to  {transform:translateY(0)}
}

/* --- MONTÉE PILOTÉE PAR LE DÉFILEMENT -------------------------------------
   Même animation, mais son avancement ne suit plus le temps : il suit la
   position du titre dans l'écran. Aucun script, aucun écouteur de défilement :
   le navigateur relie lui-même l'animation au défilement. C'est ce qui la rend
   parfaitement fluide, même sur un téléphone.

   `@supports` est indispensable : là où le navigateur ne sait pas faire, ce
   bloc est ignoré et la montée se joue normalement, toute seule. */
@supports (animation-timeline: view()){
  .wsbn-fx-js .wsbn-classique__title[data-wsbn-title-scroll="oui"][data-wsbn-title-in="montee"] .wsbn-classique__title-char{
    animation-name:wsbn-c-title-montee;
    animation-fill-mode:both;
    animation-timing-function:linear;
    animation-delay:0s;
    animation-timeline:view();
    animation-range:entry calc(5% + var(--wsbn-c-title-char, 0) * 1.5%)
                    entry calc(55% + var(--wsbn-c-title-char, 0) * 1.5%);
  }
}

/* --------------------------------------------------------------------------
   BANDE DES EFFETS « BALAYAGE » ET « DÉCOUVRE »

   Le fond est posé à SPÉCIFICITÉ FAIBLE, sur une règle isolée : le réglage
   Elementor « Couleur de la bande » écrit sur le même sélecteur avec une
   spécificité supérieure et doit gagner. Une déclaration enfouie dans les
   règles d'effet ci-dessous, plus spécifiques, l'aurait rendu inerte.

   LE DÉBORDEMENT, LUI, N'EST PLUS POSÉ ICI : il arrive par QUATRE
   VARIABLES, et l'`inset` est calculé dans la règle de l'effet. C'est
   la condition de la garde ci-dessous : un `inset` venant d'Elementor
   pèse plus lourd que cette feuille et effacerait la garde avec le
   réglage.

   LA GARDE : LA BANDE COUVRE TOUJOURS LA DÉCORATION, MÊME À
   DÉBORDEMENT ZÉRO. Le surlignage est posé à `left:-.08em; right:-.08em`,
   donc il DÉPASSE de la boîte du mot : mesuré le 2026-09-27 à 39,6 px de
   texte, il sort de 3,16 px de chaque côté. Une bande calée sur cette
   boîte ne pouvait structurellement pas le couvrir, et on voyait un filet
   de décoration tout autour pendant l'effet.
   D'où `.14em` sur les côtés et `.04em` en haut et en bas, AJOUTÉS au
   réglage au lieu de le remplacer. En `em`, comme le débordement du
   surlignage : la marge garde la même proportion du texte à toutes les
   tailles au lieu de fondre sur un gros titre.

   Sans `content`, ce pseudo-élément n'existe pas : il n'apparaît donc que
   pour les deux effets qui le déclarent.
   -------------------------------------------------------------------------- */
/* LA COULEUR SE POSE ICI, ET SUR LES MOTS AUSSI : depuis que le balayage
   laisse couler le texte, une partie sans décoration porte sa bande sur
   chacun de ses mots. Sans cette moitié, la couleur ne les atteindrait
   pas. Le contrôle PHP vise les deux, pour la même raison. */
.wsbn-classique__title-part::after,
.wsbn-classique__title-word::after{
  background:#D9A441;
}

/* --- BALAYAGE
   La bande est DÉJÀ en place quand la ligne arrive à l'écran : on ne voit que
   sa couleur, le titre est caché dessous. Elle attend, puis s'efface vers la
   droite en laissant le titre.

   Elle est peinte dès la première image, sans attendre le script : c'est la
   condition même de l'effet. Le garde-fou n'est pas abandonné, il est
   déplacé : ce n'est plus l'APPARITION de la bande qui dépend du script, c'est
   seulement son RETRAIT. */
/* LA BANDE SE POSE SUR CHAQUE MOT QUAND LA PARTIE COULE, ET ELLE RESTE
   CONTINUE.
   C'est ce qui permet au balayage de ne plus mettre la partie en boîte,
   donc de ne plus forcer un retour à la ligne, SANS payer le défaut qui
   allait avec. Mesure du 2026-09-27 sur une partie de trois fragments :
   la partie faisait 3 rectangles de 335, 331 et 111 px, la bande UN SEUL
   de 335 x 140. Elle peignait donc 224 px de couleur sur du vide au bout
   de la ligne courte, et se retirait d'un bloc au lieu de ligne par
   ligne.
   On pourrait croire que des bandes par mot laisseraient des trous aux
   espaces : non. Chaque bande déborde de `.14em` PLUS le débordement
   réglé (10 px par défaut) de chaque côté, soit bien davantage qu'une
   espace de mot. Deux bandes voisines se CHEVAUCHENT et se soudent : on
   voit une bande continue, et elle se coupe proprement en fin de ligne
   au lieu de pousser la partie plus bas. */
.wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots)::after,
.wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part--mots .wsbn-classique__title-word::after{
  content:"";
  position:absolute;
  inset:calc(-.04em - var(--wsbn-c-title-band-top,    6px))
        calc(-.14em - var(--wsbn-c-title-band-right, 10px))
        calc(-.04em - var(--wsbn-c-title-band-bottom, 6px))
        calc(-.14em - var(--wsbn-c-title-band-left,  10px));
  transform:scaleX(1);
  transform-origin:right center;
  pointer-events:none;
  z-index:3;
}

/* FILET DE SÉCURITÉ : script absent (fichier bloqué, erreur ailleurs dans
   la page, visiteur qui a demandé moins d'animations). La bande se retire
   toute seule au bout de quelques secondes plutôt que de masquer le titre
   pour toujours.

   IL NE NOMME PLUS UN WIDGET. Il visait
   `.elementor-widget-ws-banniere-classique`, donc il ne protégeait QUE
   Classique : sur Arc, Hero Vidéo et Aphrodite, qui reprennent ce même
   titre, un balayage sans script restait couvert pour toujours. Le filet
   est donc posé sans condition, et c'est `.wsbn-fx-js` qui le retire dès
   que le script répond de l'affichage. Le contrat va dans le bon sens :
   c'est la classe POSÉE qui change le comportement, jamais son absence. */
.wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots)::after,
.wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part--mots .wsbn-classique__title-word::after{
  animation:wsbn-c-title-balayage var(--wsbn-c-title-dur) cubic-bezier(.65, .05, 0, 1) 4s both;
}
.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots)::after,
.wsbn-fx-js .wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part--mots .wsbn-classique__title-word::after{
  animation:none;
}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part:not(.wsbn-classique__title-part--mots)::after,
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part--mots .wsbn-classique__title-word::after{
  animation:wsbn-c-title-balayage var(--wsbn-c-title-dur) cubic-bezier(.65, .05, 0, 1) both;
  /* L'attente s'ajoute au décalage de ligne : chaque ligne patiente, puis
     part à son tour. Les mots d'une même partie héritent du MÊME rang :
     ils partent donc tous ensemble, et la bande continue se retire d'un
     bloc. */
  animation-delay:calc(var(--wsbn-c-title-wait, 1s) + var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger));
}
@keyframes wsbn-c-title-balayage{
  from{transform:scaleX(1);transform-origin:right center}
  to  {transform:scaleX(0);transform-origin:right center}
}

/* --- BANDE QUI ARRIVE PUIS REPART
   Une bande colorée GRANDIT par la gauche en recouvrant le mot à mesure qu'il
   se révèle, puis SE RETIRE par la droite en le laissant en place. On ne voit
   donc pas le texte apparaître : on voit une bande passer, et le texte est là
   derrière.

   Le basculement du point d'ancrage (gauche puis droite) se fait à l'instant
   où la bande est pleine largeur : à ce moment précis l'ancrage ne change rien
   à l'image, le passage est donc invisible. */
/* Même garde que pour le balayage, et pour la même raison : cette bande-là
   aussi doit couvrir la décoration sans en laisser dépasser un filet. */
.wsbn-classique__title[data-wsbn-title-in="decouvre"] .wsbn-classique__title-part::after{
  content:"";
  position:absolute;
  inset:calc(-.04em - var(--wsbn-c-title-band-top,    6px))
        calc(-.14em - var(--wsbn-c-title-band-right, 10px))
        calc(-.04em - var(--wsbn-c-title-band-bottom, 6px))
        calc(-.14em - var(--wsbn-c-title-band-left,  10px));
  transform:scaleX(0);
  transform-origin:left center;
  pointer-events:none;
  z-index:3;
}
.wsbn-fx-on .wsbn-classique__title[data-wsbn-title-in="decouvre"] .wsbn-classique__title-part::after{
  /* Un peu plus longue que le rideau : la bande doit finir de se retirer APRÈS
     que le mot soit entièrement découvert. */
  animation:wsbn-c-title-bande calc(var(--wsbn-c-title-dur) * 1.15) cubic-bezier(.65, .05, 0, 1) both;
  animation-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger));
}
@keyframes wsbn-c-title-bande{
  0%    {transform:scaleX(0);transform-origin:left center}
  47.9% {transform:scaleX(1);transform-origin:left center}
  48%   {transform:scaleX(1);transform-origin:right center}
  100%  {transform:scaleX(0);transform-origin:right center}
}

@keyframes wsbn-c-title-fondu  {from{opacity:0}                              to{opacity:1;transform:none}}
@keyframes wsbn-c-title-monte  {from{opacity:0;transform:translateY(.5em)}   to{opacity:1;transform:none}}
@keyframes wsbn-c-title-descend{from{opacity:0;transform:translateY(-.5em)}  to{opacity:1;transform:none}}
@keyframes wsbn-c-title-gauche {from{opacity:0;transform:translateX(-.7em)}  to{opacity:1;transform:none}}
@keyframes wsbn-c-title-droite {from{opacity:0;transform:translateX(.7em)}   to{opacity:1;transform:none}}
@keyframes wsbn-c-title-zoom   {from{opacity:0;transform:scale(.86)}         to{opacity:1;transform:none}}
@keyframes wsbn-c-title-masque {from{transform:translateY(100%)}             to{transform:translateY(0)}}

@keyframes wsbn-c-title-trace       {from{transform:scaleX(0)} to{transform:scaleX(1)}}
@keyframes wsbn-c-title-trace-cercle{from{transform:scale(0);opacity:0} to{transform:scale(1);opacity:1}}
@keyframes wsbn-c-title-trace-croix {
  from{transform:rotate(var(--wsbn-c-title-cross)) scaleX(0)}
  to  {transform:rotate(var(--wsbn-c-title-cross)) scaleX(1)}
}

/* --------------------------------------------------------------------------
   MOUVEMENT RÉDUIT
   Le visiteur qui demande moins d'animations reçoit le titre complet,
   posé, sans mouvement.

   LA BANDE DU BALAYAGE EST LE CAS IMPORTANT DE TOUT CE BLOC. Le script
   ne pose même pas `wsbn-fx-js` quand le mouvement réduit est demandé
   (cf. `demarrer()` dans le socle) : rien ne viendrait donc retirer la
   bande, et sans cette règle ces visiteurs auraient un titre couvert
   quatre secondes, le temps que le filet de sécurité joue. Ici elle ne
   se peint pas du tout.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion:reduce){
  .wsbn-classique__title,
  .wsbn-classique__title .wsbn-classique__title-part,
  .wsbn-classique__title .wsbn-classique__title-part > *,
  .wsbn-classique__title .wsbn-classique__title-word,
  .wsbn-classique__title .wsbn-classique__title-char,
  .wsbn-classique__title .wsbn-classique__title-deco{
    animation:none !important;
    opacity:1 !important;
    transform:none !important;
  }

  .wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part::after,
  .wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-word::after,
  .wsbn-classique__title[data-wsbn-title-in="decouvre"] .wsbn-classique__title-part::after{
    animation:none !important;
    transform:scaleX(0) !important;
  }

  /* La croix garde sa rotation : sans elle, les deux traits se
     superposeraient en une seule barre. */
  [data-wsbn-deco="croix"] .wsbn-classique__title-deco{
    transform:rotate(var(--wsbn-c-title-cross)) !important;
  }
}

/* --------------------------------------------------------------------------
   EFFETS PERMANENTS DU TITRE
   Ils tournent en boucle, sans rien masquer.

   POURQUOI ILS NE TOUCHENT PAS AUX MÊMES ÉLÉMENTS QUE L'ENTRÉE
   Une propriété `animation` ne se cumule pas : deux règles qui visent le même
   élément se remplacent, et la dernière gagne. Un effet permanent posé sur la
   partie aurait donc SUPPRIMÉ l'animation d'entrée. Les boucles sont donc
   posées sur le titre entier, l'entrée restant sur les parties.
   -------------------------------------------------------------------------- */

[data-wsbn-title-loop="degrade"] .wsbn-classique__title-text--gradient{
  animation:wsbn-c-title-degrade var(--wsbn-c-title-loop-speed) linear infinite;
}
@keyframes wsbn-c-title-degrade{
  from{background-position:  0% 50%}
  to  {background-position:200% 50%}
}

/* Brillance : un masque qui balaye le titre. Il n'ajoute aucun élément, donc
   rien ne peut se retrouver par-dessus le texte ni gêner la sélection. */
.wsbn-classique__title[data-wsbn-title-loop="brillance"]{
  -webkit-mask-image:linear-gradient(100deg, #000 40%, rgba(0, 0, 0, .45) 50%, #000 60%);
  mask-image:linear-gradient(100deg, #000 40%, rgba(0, 0, 0, .45) 50%, #000 60%);
  -webkit-mask-size:250% 100%;
  mask-size:250% 100%;
  animation:wsbn-c-title-brillance var(--wsbn-c-title-loop-speed) linear infinite;
}
@keyframes wsbn-c-title-brillance{
  from{-webkit-mask-position:150% 0;mask-position:150% 0}
  to  {-webkit-mask-position:-50% 0;mask-position:-50% 0}
}

.wsbn-classique__title[data-wsbn-title-loop="flottement"]{
  animation:wsbn-c-title-flottement var(--wsbn-c-title-loop-speed) ease-in-out infinite;
}
@keyframes wsbn-c-title-flottement{
  0%, 100%{transform:translateY(0)}
  50%     {transform:translateY(-.14em)}
}

/* ==========================================================================
   DÉCORATIONS TRACÉES - la famille récente, cf. title_deco_mask() côté PHP.

   UN MASQUE, ET PLUS UN <svg> POSÉ À CÔTÉ
   Ces quatorze tracés étaient rendus par un `<svg>` imprimé dans la page, avec
   des `<path stroke>`. Le bloc de fond des décorations historiques existait en
   parallèle, avec sa propre couleur et ses propres règles : deux familles, deux
   mécaniques, deux jeux de réglages pour une même intention.

   Ici le tracé est un MASQUE posé sur ce même bloc de fond. Le fond porte la
   couleur, le SVG ne fait que le découper. Conséquence directe : la couleur, le
   dégradé et l'ombre du texte sont pilotés par les mêmes réglages que les
   décorations historiques, sans une ligne de plus, et le gabarit imprimé dans
   la page redevient un simple `<span>` vide.

   CE QUE ÇA A SUPPRIMÉ
   - le `pathLength="1"` et le couple `stroke-dasharray` / `stroke-dashoffset` ;
   - la table de viewBox recadrées côté serveur ;
   - les quatre « boîtes de famille » qui essayaient de poser quatorze tracés
     avec quatre jeux de valeurs ;
   - le contrôle de couleur séparé, qu'un `stroke` imposait faute d'accepter un
     dégradé.

   LA BOÎTE EST EN em, JAMAIS EN POURCENTAGE
   Un pourcentage horizontal se compte sur la LARGEUR du mot : un mot long
   recevait un cercle qui débordait deux fois plus qu'un mot court, et c'est
   exactement ce qui faisait paraître certaines décorations « pas cadrées ». En
   em, le débord garde la même allure quelle que soit la longueur.

   L'ÉCHELLE
   `--wsbn-c-title-deco-trace` (100 par défaut) vient du réglage « Taille du
   tracé ». Les hauteurs sont en `em` pour suivre la taille du texte ; l'échelle
   les module par-dessus. Elle ne concerne que les tracés en TRAIT : les
   décorations qui entourent le mot prennent naturellement sa taille, un
   réglage d'épaisseur n'aurait rien à piloter dessus.

   PIÈGE À NE PAS RÉINTRODUIRE : dans un data-URI, un `#` coupe l'adresse à cet
   endroit, le masque ne se charge pas et la décoration disparaît SANS AUCUNE
   erreur en console. Aucun `url(#...)` ici ; le jour où un filtre en demandera
   un, il faudra l'écrire `%23`.

   Les valeurs ci-dessous sortent de design-titre-decorations.html, qui reste la
   source de vérité : pour retoucher un cadrage, y chercher la valeur avec les
   curseurs, puis la reporter ici.
   ========================================================================== */

.wsbn-classique__title-deco--trace{
  /* Un tracé n'a pas de coin : l'arrondi de la famille aplat ne le concerne
     pas, et une valeur héritée déformerait sa boîte. */
  border-radius:0;
  -webkit-mask-image:var(--wsbn-c-deco-m);  mask-image:var(--wsbn-c-deco-m);
  -webkit-mask-repeat:no-repeat;            mask-repeat:no-repeat;
  -webkit-mask-size:100% 100%;              mask-size:100% 100%;
  z-index:0;
}

/* --- Trait fin : le soulignement typographique, net et droit. --- */
[data-wsbn-deco="ligne"] .wsbn-classique__title-deco{
  left:-.02em; right:-.02em; bottom:-.16em;
  height:calc(.22em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="12 54 176 8" preserveAspectRatio="none"><path d="M12 58 L188 58" fill="none" stroke="black" stroke-width="4"/></svg>');
}

/* --- Trait double : deux passages, le second un peu plus court. --- */
[data-wsbn-deco="ligne-double"] .wsbn-classique__title-deco{
  left:-.02em; right:-.02em; bottom:-.22em;
  height:calc(.32em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="12 52 176 12" preserveAspectRatio="none"><path d="M12 55.5 L188 56.5" fill="none" stroke="black" stroke-width="3"/><path d="M14 61 L186 60" fill="none" stroke="black" stroke-width="3"/></svg>');
}

/* --- Trait épais marqueur : l'épaisseur est dans le tracé, pas dans un
   réglage à part. Le curseur « Taille du tracé » la module. --- */
[data-wsbn-deco="ligne-marqueur"] .wsbn-classique__title-deco{
  left:-.03em; right:-.03em; bottom:-.18em;
  height:calc(.26em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="16 51 168 15" preserveAspectRatio="none"><path d="M16 59 L184 57.5" fill="none" stroke="black" stroke-width="9"/></svg>');
}

/* --- Trait à main levée : le trait ondule, bouts arrondis. --- */
[data-wsbn-deco="ligne-main-levee"] .wsbn-classique__title-deco{
  left:-.03em; right:-.03em; bottom:-.18em;
  height:calc(.24em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="10 53 182 10" preserveAspectRatio="none"><path d="M10 57 C 40 60, 55 56, 80 58.5 C 110 61, 130 55.5, 160 58 C 175 59, 185 57, 192 57.5" fill="none" stroke="black" stroke-width="3.5" stroke-linecap="round"/></svg>');
}

/* --- Cercle tracé : l'ellipse ne se referme pas tout à fait, c'est ce qui la
   fait lire comme un geste et non comme un ovale vectoriel.
   Hauteur FIGÉE, sans `--trace` : un entourage épouse le mot. --- */
[data-wsbn-deco="cercle-trace"] .wsbn-classique__title-deco{
  left:-.42em; right:-.42em; bottom:-.2em; height:1.55em;
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="11 5 182 60" preserveAspectRatio="none"><path d="M100 9 C 150 8, 191 24, 189 36 C 187 53, 147 63, 100 62 C 53 61, 13 50, 15 34 C 17 18, 58 7, 100 9 C 106 9.3, 111 9.7, 114 10.5" fill="none" stroke="black" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/></svg>');
}

/* --- Rectangle tracé : les côtés ne sont pas parallèles, à dessein. --- */
[data-wsbn-deco="rectangle-trace"] .wsbn-classique__title-deco{
  left:-.34em; right:-.34em; bottom:-.18em; height:1.5em;
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="5 5 189 61" preserveAspectRatio="none"><path d="M9 11 L150 8.5 L189 10 L191 39 L188 62 L99 63.5 L10 60.5 L8.5 35 Z" fill="none" stroke="black" stroke-width="3.5" stroke-linejoin="round"/></svg>');
}

/* --- Crochets : l'annotation éditoriale, deux équerres qui encadrent. --- */
[data-wsbn-deco="crochets"] .wsbn-classique__title-deco{
  left:-.3em; right:-.3em; bottom:-.16em; height:1.46em;
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="5 5 190 60" preserveAspectRatio="none"><path d="M23 9 L9 10 L8.5 61 L22 62" fill="none" stroke="black" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M177 9 L191 10 L191.5 61 L178 62" fill="none" stroke="black" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>');
}

/* --- Surlignage néon : il passe À TRAVERS le mot, il se centre donc.
   Le centrage passe par `margin-top` et NON par `translateY` : la propriété
   `translate` porte déjà la distance au texte, et `transform` est pris par
   l'animation d'entrée. Les trois gestes coexistent sans se connaître.

   LE HALO EST DANS LE MASQUE, ET C'EST LA SEULE PLACE QUI MARCHE.
   `box-shadow` est entièrement découpé par le masque : invisible, vérifié en
   maquette. `drop-shadow` fonctionne mais réclame une couleur écrite en dur,
   que le groupe « Couleur » ne mettrait pas à jour : c'est exactement le bug
   du halo noir sur titre sombre, qu'on ne veut pas réintroduire.
   Le masque contient donc DEUX fois le même tracé : une copie floutée derrière
   le trait net. Le flou est un dégradé d'alpha, donc un halo dans la peinture
   réelle du bloc, dégradé compris, sans une balise ni un réglage de plus.

   Et c'est ICI que le `%23` compte : `url(#h)` écrit tel quel couperait
   l'adresse, le masque ne se chargerait pas, et la décoration disparaîtrait
   sans aucune erreur en console.

   La boîte est plus haute que le trait (11 unités de tracé dans une viewBox de
   30) : sans cette marge, le halo serait rogné par les bords de sa propre
   boîte et le flou ne se verrait pas. --- */
[data-wsbn-deco="neon"] .wsbn-classique__title-deco{
  left:-.05em; right:-.05em; top:50%;
  height:calc(.7em * var(--wsbn-c-title-deco-trace, 100) / 100);
  margin-top:calc(.7em * var(--wsbn-c-title-deco-trace, 100) / -200);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="8 20 184 30" preserveAspectRatio="none"><filter id="h" x="-8%25" y="-60%25" width="116%25" height="220%25"><feGaussianBlur stdDeviation="3"/></filter><path d="M8 35 L192 34" fill="none" stroke="black" stroke-width="11" filter="url(%23h)" opacity="0.75"/><path d="M8 35 L192 34" fill="none" stroke="black" stroke-width="11"/></svg>');
}

/* --- Étiquette : un aplat posé DERRIÈRE, avec de l'air à droite pour la
   pointe. --- */
[data-wsbn-deco="ruban"] .wsbn-classique__title-deco{
  left:-.14em; right:-.46em; bottom:-.14em; height:1.4em;
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="4 17 172 38" preserveAspectRatio="none"><path d="M8 24 L150 21 L172 36 L150 51 L8 48 Z" fill="black"/></svg>');
}

/* --- Courbe montante : la main pivote autour du poignet, le trait n'est
   jamais droit. --- */
[data-wsbn-deco="courbe"] .wsbn-classique__title-deco{
  left:-.02em; right:-.02em; bottom:-.2em;
  height:calc(.34em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 45 190 19" preserveAspectRatio="none"><path d="M10 59 C 70 57.4, 130 53.6, 175 50.4 L 192 49.2" fill="none" stroke="black" stroke-width="4" stroke-linecap="round"/></svg>');
}

/* --- Courbe descendante --- */
[data-wsbn-deco="courbe-descendante"] .wsbn-classique__title-deco{
  left:-.02em; right:-.02em; bottom:-.2em;
  height:calc(.34em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 45 190 19" preserveAspectRatio="none"><path d="M10 49 C 62 51.4, 122 55.2, 165 58 L 192 59.4" fill="none" stroke="black" stroke-width="4" stroke-linecap="round"/></svg>');
}

/* --- Trait fin vers épais : se pose léger à gauche, appuie à droite. --- */
[data-wsbn-deco="pinceau"] .wsbn-classique__title-deco{
  left:-.03em; right:-.03em; bottom:-.18em;
  height:calc(.26em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="18 46 174 14" preserveAspectRatio="none"><path d="M20 57.6 L190 48.5 L190 55.5 L20 58.4 Z" fill="black"/></svg>');
}

/* --- Trait fin vers épais, montant --- */
[data-wsbn-deco="pinceau-montee"] .wsbn-classique__title-deco{
  left:-.03em; right:-.03em; bottom:-.2em;
  height:calc(.34em * var(--wsbn-c-title-deco-trace, 100) / 100);
  --wsbn-c-deco-m:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="18 41 172 22" preserveAspectRatio="none"><path d="M20 59.6 Q 105 53 188 44 L188 52 Q 105 57 20 60.4 Z" fill="black"/></svg>');
}

/* `courbe-degrade` : clé conservée pour les titres déjà réglés, retirée du
   choix. Elle n'avait de raison d'être que parce qu'un `stroke` n'accepte pas
   de dégradé ; maintenant que la décoration est un fond, le groupe « Couleur »
   en pose un sur n'importe laquelle. Le rendu la ramène à `courbe`, il n'y a
   donc rien à écrire ici. */


/* --------------------------------------------------------------------------
   ENTRÉE DES DÉCORATIONS TRACÉES

   « Suit le texte » (auto) ET « Tracé » font tous deux un vrai tracé : c'est le
   principe même de cette famille, contrairement à l'ancienne où « auto »
   dépendait du réglage d'entrée du texte.

   LE RIDEAU PLUTÔT QUE `scaleX`
   Un `scaleX(0)` vers `scaleX(1)` écrase la forme puis la relâche : un cercle
   part en trait vertical et se déplie, ce qui ne ressemble à rien. Un rideau
   `clip-path` DÉCOUVRE la forme sans jamais la déformer, ce qui est exactement
   le geste d'un stylo qui avance. C'est aussi ce qui remplace le
   `stroke-dashoffset` d'avant, à rendu équivalent et sans SVG dans la page.
   -------------------------------------------------------------------------- */

.wsbn-fx-js [data-wsbn-deco-in="auto"] .wsbn-classique__title-deco--trace,
.wsbn-fx-js [data-wsbn-deco-in="trace"] .wsbn-classique__title-deco--trace{
  clip-path:inset(0 100% 0 0);
}
.wsbn-fx-on [data-wsbn-deco-in="auto"] .wsbn-classique__title-deco--trace,
.wsbn-fx-on [data-wsbn-deco-in="trace"] .wsbn-classique__title-deco--trace{
  transition:clip-path var(--wsbn-c-title-dur, .8s) cubic-bezier(.19, 1, .22, 1);
  /* Le trait arrive quand le mot est déjà largement en place : c'est ce
     décalage qui donne l'impression d'une décoration posée après coup. */
  transition-delay:calc(var(--wsbn-c-title-rank, 0) * var(--wsbn-c-title-stagger) + var(--wsbn-c-title-dur, .8s) * .55);
  clip-path:inset(0 0 0 0);
}

/* « fondu », « zoom » et « none » n'ont plus de règle propre ici : la
   décoration étant devenue le même bloc que l'ancienne famille, les règles
   génériques plus haut dans cette feuille les couvrent déjà. */

@media (prefers-reduced-motion:reduce){
  .wsbn-classique__title-deco--trace{
    transition:none !important;
    clip-path:none !important;
    opacity:1 !important;
  }
}

/* ==========================================================================
   BOUTON
   ========================================================================== */

.wsbn-classique__cta{
  margin-top:4px;
  display:var(--wsbn-c-btn-display, block);
}

/* --------------------------------------------------------------------------
   DEUX BOUTONS COTE A COTE

   LA RANGEE N'EXISTE QUE QUAND ELLE SERT. Sans la classe `--duo`, posee par
   le rendu uniquement quand les deux boutons sortent, l'enveloppe reste le
   bloc qu'elle a toujours ete : une banniere a un seul bouton ne bouge pas
   d'un pixel, et il n'y a rien a verifier de ce cote.

   L'ALIGNEMENT VIENT DU MEME CONTROLE QUE POUR UN BOUTON SEUL. Son
   dictionnaire ecrit `text-align` ET `--wsbn-c-btn-just` ; ici seule la
   seconde sert, la ligne `text-align` est simplement sans effet sur un
   conteneur flex. Un second controle << alignement de la rangee >> aurait
   fait doublon, et le perdant aurait ete silencieux.

   EN PILE, C'EST `align-items` QUI PLACE. `justify-content` gouverne l'axe
   principal : en colonne, il repartit la hauteur, ce qui ne veut rien dire
   ici. Le dictionnaire de la disposition repasse donc la valeur choisie a
   `--wsbn-c-btn-cross`.
   -------------------------------------------------------------------------- */

.wsbn-classique__cta--duo{
  display:flex;
  flex-direction:var(--wsbn-c-btn-dir, row);
  flex-wrap:wrap;
  gap:var(--wsbn-c-btn-gap, 14px);
  justify-content:var(--wsbn-c-btn-just, flex-start);
  align-items:var(--wsbn-c-btn-cross, stretch);
}

/* << Etiree >> ne veut pas dire la meme chose a un bouton qu'a deux : un
   bouton seul prend toute la largeur, deux se partagent la ligne a egalite.
   `flex-basis:0` l'emporte sur la largeur de 100 % que pose le meme
   dictionnaire, donc les deux cas cohabitent sans se contredire. */
.wsbn-classique__cta--duo > .wsbn-classique__btn,
.wsbn-classique__cta--duo > .wsbn-classique__btn2{
  flex:var(--wsbn-c-btn-flex, 0 1 auto);
}

/* Le bloc du SECOND BOUTON est plus bas, juste apres la base commune : a
   specificite egale, c'est la derniere regle ecrite qui gagne, et il doit
   pouvoir defaire la bordure et le fond que la base lui donne. */

/* LA BASE EST COMMUNE AUX DEUX BOUTONS, ET C'EST TOUT LE POINT.
   Deux boutons cote a cote qui n'ont ni la meme hauteur, ni la meme graisse,
   ni la meme casse, ca se voit au premier coup d'oeil. Recopier ces cinq
   valeurs dans le bloc du second aurait fait une SECONDE VERITE : le jour ou
   on change la casse ici, l'autre resterait en arriere sans rien signaler.

   Le second ne porte pas pour autant la classe `.wsbn-classique__btn` : elle
   lui apporterait aussi les vingt apparences au survol, les boucles et le
   calque de remplissage, dont il n'a pas le balisage. Il en recevrait des
   moities. Ce qu'il partage est donc ecrit ici, nommement, et rien d'autre
   ne peut lui arriver par accident. */
.wsbn-classique__btn,
.wsbn-classique__btn2{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:var(--wsbn-c-btn-width, auto);
  max-width:100%;
  padding:14px 26px;
  border-radius:999px;
  cursor:pointer;
  line-height:1;
  vertical-align:top;
  font-size:13px;
  font-weight:800;
  letter-spacing:.04em;
  text-transform:uppercase;
}

/* --------------------------------------------------------------------------
   LE SECOND BOUTON : ce qui le distingue, et rien de plus

   Il vient APRES la base commune parce qu'il doit pouvoir en defaire la
   bordure et le fond. A specificite egale, c'est la derniere regle ecrite
   qui gagne : place avant, il aurait perdu, et ses trois allures n'auraient
   rien change a l'ecran.
   -------------------------------------------------------------------------- */

/* LE CONTOUR EST UNE OMBRE INTERIEURE, PAS UNE BORDURE, ET C'EST MESURE.
   Une bordure de 2 px s'ajoute a la boite : le second bouton faisait 4 px de
   plus que le premier, soit 3 px a l'ecran sur un ecran a 1,25. Deux boutons
   cote a cote qui ne font pas la meme hauteur, ca se voit tout de suite, et
   la cause est invisible tant qu'on ne mesure pas.
   `box-shadow: inset` dessine exactement le meme trait et ne prend AUCUNE
   place : les deux boutons gardent la marge interieure de la base commune,
   donc la meme hauteur, par construction et non par reglage. */
.wsbn-classique__btn2{
  background:transparent;
  box-shadow:inset 0 0 0 var(--wsbn-c-btn2-bord-e, 2px) transparent;
  transition:
    background-color .25s ease,
    background-size  .25s ease,
    color            .25s ease,
    box-shadow       .25s ease;
}

/* Le reset `a{color:inherit}` de beaucoup de themes bat une classe simple
   posee sur un `<a>` : on qualifie par `a.` pour reprendre la main. Meme
   piege que pour le bouton principal, et meme reponse.

   LE REPLI EST `currentColor`, PAS UNE COULEUR EN DUR.
   Il valait `#1B2A4A`, un bleu nuit. Sur une banniere a fond clair ca
   passait, et la mesure du 2026-09-24 donnait 13,7 de contraste : c'est que
   la page d'essai avait un fond blanc. Sur une PHOTO SOMBRE, qui est le cas
   normal de Classique, d'Arc et d'Aphrodite, le meme bleu nuit devient
   illisible. Constate le 2026-09-27 sur Aphrodite : le second bouton etait
   bien la, aux bonnes dimensions, et on ne le voyait pas.

   C'est exactement la lecon deja tiree pour Immersif, Vision, Hero et
   Vitrine, et que ce bloc partage n'avait pas recue : une couleur en dur ne
   peut pas convenir aux deux fonds. `currentColor` reprend la couleur du
   texte de la banniere, deja lisible la ou elle se trouve. */
a.wsbn-classique__btn2{
  color:var(--wsbn-c-btn2-encre, currentColor);
  text-decoration:none;
}

a.wsbn-classique__btn2:hover{
  color:var(--wsbn-c-btn2-encre-h, var(--wsbn-c-btn2-encre, currentColor));
}

.wsbn-classique__btn2-ico{
  display:inline-flex;
  align-items:center;
}

/* Le SVG porte sa taille, donc la racine passe devant : les themes
   normalisent les icones d'Elementor avec `.elementor-element svg{width:1em}`
   en 0-1-1, et un selecteur a nous en 0-1-0 tomberait a la taille d'un
   caractere. C'est ce qui avait fait << disparaitre >> la courbe d'Arc. */
.wsbn-classique .wsbn-classique__btn2-ico svg{
  width:var(--wsbn-c-btn2-ico, 16px);
  height:var(--wsbn-c-btn2-ico, 16px);
  fill:currentColor;
}

/* Allure CONTOUR, le defaut : une bordure, pas de fond. */
.wsbn-c-btn2-contour .wsbn-classique .wsbn-classique__btn2,
.wsbn-c-btn2-contour .wsbn-classique__btn2{
  box-shadow:inset 0 0 0 var(--wsbn-c-btn2-bord-e, 2px) var(--wsbn-c-btn2-bord, currentColor);
}

.wsbn-c-btn2-contour .wsbn-classique__btn2:hover{
  background-color:var(--wsbn-c-btn2-fond-h, transparent);
  box-shadow:inset 0 0 0 var(--wsbn-c-btn2-bord-e, 2px) var(--wsbn-c-btn2-bord-h, var(--wsbn-c-btn2-bord, currentColor));
}

/* Allure PLEINE : un fond, pas de bordure. */
.wsbn-c-btn2-plein .wsbn-classique__btn2{
  background-color:var(--wsbn-c-btn2-fond, rgba(27,42,74,.12));
  box-shadow:none;
}

.wsbn-c-btn2-plein .wsbn-classique__btn2:hover{
  background-color:var(--wsbn-c-btn2-fond-h, var(--wsbn-c-btn2-fond, rgba(27,42,74,.2)));
}

/* Allure DISCRETE : du texte, et un trait qui se dessine au survol.
   Le trait est un FOND DIMENSIONNE, pas un `::before` en `z-index:-1` : ce
   dernier passerait derriere le voile de la photo et disparaitrait sans
   qu'on comprenne. Meme mecanisme que le surlignage de titre. */
.wsbn-c-btn2-discret .wsbn-classique__btn2{
  padding-left:0;
  padding-right:0;
  box-shadow:none;
  border-radius:0;
  background-image:linear-gradient(currentColor, currentColor);
  background-repeat:no-repeat;
  background-position:0 100%;
  background-size:0 2px;
}

.wsbn-c-btn2-discret .wsbn-classique__btn2:hover{
  background-size:100% 2px;
}

/* Une transition n'est pas une boucle, mais elle se declenche au survol :
   elle compte parmi les mouvements PROVOQUES, et la preference vaut pour eux.
   Le trait discret reste alors affiche, sinon il ne se verrait jamais. */
@media (prefers-reduced-motion:reduce){
  .wsbn-classique__btn2{ transition:none; }
  .wsbn-c-btn2-discret .wsbn-classique__btn2{ background-size:100% 2px; }
}

.wsbn-classique__btn{
  /* Transitions de survol. `scale` et `translate` sont des propriétés
     DISTINCTES de `transform` : les animer ici ne marche donc pas sur les
     pieds de l'aimant, qui écrit dans `transform`. Les deux se composent. */
  transition:
    background-color var(--wsbn-c-hover-speed, .22s) ease,
    color            var(--wsbn-c-hover-speed, .22s) ease,
    border-color     var(--wsbn-c-hover-speed, .22s) ease,
    box-shadow       var(--wsbn-c-hover-speed, .22s) ease,
    scale            var(--wsbn-c-hov-speed, .3s) ease,
    translate        var(--wsbn-c-hov-speed, .3s) ease;
}

/* Le fond et la couleur de base. Qualifiés par `a` (spécificité 0-1-1) pour
   passer devant un éventuel `a { color: … }` de thème, mais SANS ancêtre
   supplémentaire : les groupes Fond / Couleur d'Elementor sont écrits en
   0-2-0 et doivent pouvoir reprendre la main. */
a.wsbn-classique__btn{
  background:var(--wsbn-c-btn-bg);
  color:var(--wsbn-c-btn-text);
  text-decoration:none;
}
a.wsbn-classique__btn:hover{
  background:var(--wsbn-c-btn-bg-hover);
}

.wsbn-classique__btn-inner{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:12px;
  /* Le contenu repasse au-dessus du calque de remplissage, sinon celui-ci le
     masquerait. */
  position:relative;
  z-index:1;
  pointer-events:none;
}

.wsbn-classique__btn-label{white-space:normal;text-align:left}

.wsbn-classique__btn-ico{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  flex:none;
  line-height:0;
}
.wsbn-classique__btn-ico svg{width:1em;height:1em;display:block}
.wsbn-classique__btn-ico svg:not([fill="none"]){fill:currentColor}

/* L'icône a sa propre couleur (réglage dédié) : elle a donc besoin de sa
   propre transition. Celle du bouton ne couvre que la couleur du bouton. */
.wsbn-classique__btn-ico,
.wsbn-classique__btn-ico svg{
  transition:color  var(--wsbn-c-hover-speed, .22s) ease,
             fill   var(--wsbn-c-hover-speed, .22s) ease,
             scale  var(--wsbn-c-hover-speed, .22s) ease,
             rotate var(--wsbn-c-hover-speed, .22s) ease;
}

/* --------------------------------------------------------------------------
   NAVIGATION AU CLAVIER
   `:focus-visible` ne se déclenche PAS au clic souris : l'anneau n'apparaît
   donc que pour qui navigue au clavier, sans abîmer le rendu pour les autres.
   Aucun réglage : un bouton doit rester atteignable.
   -------------------------------------------------------------------------- */
.wsbn-classique__btn:focus-visible{
  outline:2px solid currentColor;
  outline-offset:3px;
}

/* --------------------------------------------------------------------------
   MOUVEMENT AU SURVOL
   -------------------------------------------------------------------------- */
.wsbn-c-hov-grow   .wsbn-classique__btn:hover{scale:calc(1 + 0.06 * var(--wsbn-c-hov-k, 1))}
.wsbn-c-hov-shrink .wsbn-classique__btn:hover{scale:calc(1 - 0.06 * var(--wsbn-c-hov-k, 1))}
.wsbn-c-hov-float  .wsbn-classique__btn:hover{translate:0 calc(-6px * var(--wsbn-c-hov-k, 1))}
.wsbn-c-hov-sink   .wsbn-classique__btn:hover{translate:0 calc(6px * var(--wsbn-c-hov-k, 1))}

/* La pulsation tourne en boucle tant que la souris reste sur le bouton :
   c'est une animation, pas une transition. */
.wsbn-c-hov-pulse .wsbn-classique__btn:hover{
  animation:wsbn-c-pulse calc(var(--wsbn-c-hov-speed, .3s) * 2.5) ease-in-out infinite;
}
@keyframes wsbn-c-pulse{
  0%, 100%{scale:1}
  50%     {scale:calc(1 + 0.05 * var(--wsbn-c-hov-k, 1))}
}

/* --------------------------------------------------------------------------
   APPARENCES AU SURVOL - un seul choix à la fois.

   Les quatre « remplissages » partagent le même calque
   .wsbn-classique__btn-fill, posé par le rendu uniquement pour eux. Seules la
   FORME du calque et son ORIGINE changent d'une variante à l'autre : une
   seule mécanique à maintenir au lieu de quatre.

   Le calque est animé en `scale` / `translate` (propriétés individuelles),
   jamais en `transform` : l'aimant écrit dans `transform`.
   -------------------------------------------------------------------------- */
.wsbn-c-ap-fill-cursor .wsbn-classique__btn,
.wsbn-c-ap-fill-center .wsbn-classique__btn,
.wsbn-c-ap-fill-wipe .wsbn-classique__btn{
  position:relative;
  /* Le calque déborde volontairement du bouton : on le rogne à la pilule. */
  overflow:hidden;
}

.wsbn-classique__btn-fill{
  position:absolute;
  pointer-events:none;
  z-index:0;
  background-color:#ffffff;
}

/* --- Remplissage circulaire. `--wsbn-c-ox-x/y` sont posées par le script au
       point où la souris entre ; sans script (ou en mode « depuis le centre »)
       elles valent 50 % et le cercle part du milieu. --- */
.wsbn-c-ap-fill-cursor .wsbn-classique__btn-fill,
.wsbn-c-ap-fill-center .wsbn-classique__btn-fill{
  top:var(--wsbn-c-ox-y, 50%);
  left:var(--wsbn-c-ox-x, 50%);
  /* Diamètre calculé par le script (plus petit disque couvrant le bouton
     depuis le point d'entrée). Repli à 260 % si le script n'a pas tourné. */
  width:var(--wsbn-c-fill-d, 260%);
  aspect-ratio:1;
  border-radius:50%;
  translate:-50% -50%;
  scale:0;
  transition:scale var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}

/* Le mode « depuis le centre » ne doit RIEN au curseur : il écrase les
   variables que le script pourrait avoir posées. */
.wsbn-c-ap-fill-center .wsbn-classique__btn-fill{
  width:260%;
  top:50%;
  left:50%;
}

.wsbn-c-ap-fill-cursor .wsbn-classique__btn:hover .wsbn-classique__btn-fill,
.wsbn-c-ap-fill-center .wsbn-classique__btn:hover .wsbn-classique__btn-fill{
  scale:1;
}

/* --- Balayage latéral.
       Le calque couvre déjà tout le bouton et s'ouvre HORIZONTALEMENT depuis
       le point où la souris est entrée : entrée par la droite = balayage vers
       la gauche. --- */
.wsbn-c-ap-fill-wipe .wsbn-classique__btn-fill{
  inset:0;
  border-radius:inherit;
  transform-origin:var(--wsbn-c-ox-x, 0%) 50%;
  scale:0 1;
  opacity:0;
  transition:scale var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1)),
             opacity calc(var(--wsbn-c-ap-speed, .45s) * 0.4) ease;
}
.wsbn-c-ap-fill-wipe .wsbn-classique__btn:hover .wsbn-classique__btn-fill{
  scale:1 1;
  opacity:1;
}


/* --------------------------------------------------------------------------
   PILULE QUI S'ÉLARGIT + FLÈCHE QUI BASCULE

   Aucune balise ajoutée, et surtout AUCUN réglage de l'utilisateur écrasé :
   - la pastille est mise en `position: absolute` à droite du bouton. Sortie du
     flux, elle n'est plus peinte par le fond de la pilule : elle se lit comme
     un bouton rond séparé, alors que le HTML n'a pas bougé d'un caractère ;
   - l'élargissement est posé sur le CONTENU, jamais sur la pilule. Ajouter du
     `padding` à la pilule écraserait celui que l'utilisateur a réglé dans
     Style ; en poussant le contenu, la pilule s'élargit d'elle-même.
   -------------------------------------------------------------------------- */
.wsbn-c-ap-expand-pill .wsbn-classique__btn{
  position:relative;
  /* La pastille vit en dehors du cadre : surtout ne pas rogner. */
  overflow:visible;
}
.wsbn-c-ap-expand-pill .wsbn-classique__btn-inner{
  transition:padding-inline-end var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}
.wsbn-c-ap-expand-pill .wsbn-classique__btn:hover .wsbn-classique__btn-inner{
  padding-inline-end:var(--wsbn-c-ap-grow, 48px);
}
.wsbn-c-ap-expand-pill .wsbn-classique__btn-ico{
  position:absolute;
  left:100%;
  top:50%;
  translate:0 -50%;
  margin-inline-start:var(--wsbn-c-ap-gap, 10px);
  aspect-ratio:1;
  padding:0.62em;
  border-radius:50%;
  background-color:var(--wsbn-c-ap-color, #d7f751);
  color:var(--wsbn-c-ap-icon-color, #0b0b0b);
}
.wsbn-c-ap-expand-pill .wsbn-classique__btn-ico svg{fill:currentColor}

/* `rotate` est une propriété à part entière : elle ne se dispute ni le
   `translate` de la pastille ni le `transform` que l'aimant utilise. */
.wsbn-c-ap-expand-pill .wsbn-classique__btn-ico svg,
.wsbn-c-ap-expand-pill .wsbn-classique__btn-ico i{
  display:block;
  transition:rotate var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}
.wsbn-c-ap-expand-pill .wsbn-classique__btn:hover .wsbn-classique__btn-ico svg,
.wsbn-c-ap-expand-pill .wsbn-classique__btn:hover .wsbn-classique__btn-ico i{
  rotate:180deg;
}

/* --------------------------------------------------------------------------
   PASTILLE QUI S'INVERSE
   La pastille et son icône ÉCHANGENT leurs couleurs, la pastille GROSSIT
   nettement, et le libellé s'EFFACE presque entièrement.
   -------------------------------------------------------------------------- */
.wsbn-c-ap-icon-pop .wsbn-classique__btn-ico{
  aspect-ratio:1;
  padding:0.35em;
  border-radius:50%;
  background-color:var(--wsbn-c-ap-color, #ffffff);
  color:var(--wsbn-c-ap-icon-color, #0b0b0b);
  /* `color` et `fill` sont repris ici : cette règle est plus spécifique que la
     transition générale de l'icône et l'écraserait sinon, faisant sauter le
     changement de couleur d'un coup sec dans ce mode. */
  transition:background-color var(--wsbn-c-ap-speed, .45s) ease,
             color var(--wsbn-c-ap-speed, .45s) ease,
             fill var(--wsbn-c-ap-speed, .45s) ease,
             scale var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}
.wsbn-c-ap-icon-pop .wsbn-classique__btn-ico svg{fill:currentColor}
.wsbn-c-ap-icon-pop .wsbn-classique__btn:hover .wsbn-classique__btn-ico{
  background-color:var(--wsbn-c-ap-color-inv, #0b0b0b);
  color:var(--wsbn-c-ap-icon-color-inv, #ffffff);
  scale:var(--wsbn-c-ap-pop-scale, 1.28);
}

/* Le libellé s'efface pour laisser la pastille prendre la place. */
.wsbn-c-ap-icon-pop .wsbn-classique__btn-label{
  transition:opacity var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}
.wsbn-c-ap-icon-pop .wsbn-classique__btn:hover .wsbn-classique__btn-label{
  opacity:var(--wsbn-c-ap-label-fade, 0.08);
}

.wsbn-c-ap-icon-pop .wsbn-classique__btn-ico svg,
.wsbn-c-ap-icon-pop .wsbn-classique__btn-ico i{
  transition:rotate var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}
.wsbn-c-ap-icon-pop .wsbn-classique__btn:hover .wsbn-classique__btn-ico svg,
.wsbn-c-ap-icon-pop .wsbn-classique__btn:hover .wsbn-classique__btn-ico i{
  rotate:var(--wsbn-c-ap-rotate, 0deg);
}

/* --- Pastille qui s'efface en diagonale.
       DEUX disques empilés. Celui du dessus est visible au repos ; au survol
       il rétrécit à ~15 % en filant en haut à droite, ce qui découvre celui du
       dessous. Le disque du dessus est un pseudo-élément : aucune balise
       ajoutée. --- */
.wsbn-c-ap-icon-swap .wsbn-classique__btn-ico{
  position:relative;
  aspect-ratio:1;
  padding:0.35em;
  border-radius:50%;
  /* Disque du DESSOUS : celui qu'on découvre. */
  background-color:var(--wsbn-c-ap-color, rgba(255, 255, 255, 0.18));
}
.wsbn-c-ap-icon-swap .wsbn-classique__btn-ico::before{
  content:"";
  position:absolute;
  inset:0;
  border-radius:50%;
  background-color:var(--wsbn-c-ap-color-top, #ffffff);
  transition:scale var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1)),
             translate var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1)),
             opacity var(--wsbn-c-ap-speed, .45s) ease;
}
/* L'icône doit rester AU-DESSUS des deux disques. */
.wsbn-c-ap-icon-swap .wsbn-classique__btn-ico svg,
.wsbn-c-ap-icon-swap .wsbn-classique__btn-ico i{
  position:relative;
  z-index:1;
}
.wsbn-c-ap-icon-swap .wsbn-classique__btn:hover .wsbn-classique__btn-ico::before{
  scale:0.15;
  translate:60% -60%;
  opacity:0;
}

/* --- Relais de flèche en diagonale, posé avec le soulignement. La fenêtre
       masque le débordement : la première icône sort en haut à droite pendant
       que sa copie entre par en bas à gauche. --- */
.wsbn-c-ap-underline .wsbn-classique__btn-ico-slot{
  position:relative;
  display:inline-flex;
  overflow:hidden;
  flex:0 0 auto;
}
.wsbn-c-ap-underline .wsbn-classique__btn-ico-slot .wsbn-classique__btn-ico{
  transition:translate var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}
.wsbn-c-ap-underline .wsbn-classique__btn-ico--dup{
  position:absolute;
  inset:0;
  translate:-100% 100%;
}
.wsbn-c-ap-underline .wsbn-classique__btn:hover .wsbn-classique__btn-ico-slot .wsbn-classique__btn-ico{
  translate:100% -100%;
}
.wsbn-c-ap-underline .wsbn-classique__btn:hover .wsbn-classique__btn-ico--dup{
  translate:0 0;
}

/* --- Soulignement qui se relaie : deux barres sur le libellé. La première se
       retire vers la droite pendant que la seconde entre par la gauche. Les
       pseudo-éléments du libellé sont libres (celui du bouton sert déjà au
       reflet de lumière). --- */
.wsbn-c-ap-underline .wsbn-classique__btn-label{
  position:relative;
}
/* `:not(--clone)` : combiné au glissement de texte, le libellé est dédoublé.
   Sans cette exclusion, la copie porterait elle aussi ses deux barres et on
   verrait un soulignement fantôme passer avec elle. */
.wsbn-c-ap-underline .wsbn-classique__btn-label:not(.wsbn-classique__btn-label--clone)::before,
.wsbn-c-ap-underline .wsbn-classique__btn-label:not(.wsbn-classique__btn-label--clone)::after{
  content:"";
  position:absolute;
  left:0;
  right:0;
  bottom:-0.18em;
  height:1px;
  background-color:currentColor;
  transition:scale var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
}
.wsbn-c-ap-underline .wsbn-classique__btn-label::before{
  transform-origin:right center;
  scale:1 1;
}
.wsbn-c-ap-underline .wsbn-classique__btn-label::after{
  transform-origin:left center;
  scale:0 1;
  /* Entre juste après que la première soit partie : c'est ce décalage qui
     donne l'impression d'un relais, et non d'un simple aller-retour. */
  transition-delay:calc(var(--wsbn-c-ap-speed, .45s) * 0.35);
}
.wsbn-c-ap-underline .wsbn-classique__btn:hover .wsbn-classique__btn-label::before{scale:0 1}
.wsbn-c-ap-underline .wsbn-classique__btn:hover .wsbn-classique__btn-label::after {scale:1 1}

/* --- Lettres en cascade : chaque lettre part avec un retard proportionnel à
       son rang, ce qui dessine une vague de gauche à droite. --- */
.wsbn-c-ap-letters .wsbn-classique__btn-char{
  display:inline-block;
  /* white-space: pre évite que le navigateur avale l'espace insécable. */
  white-space:pre;
  transition:translate var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
  transition-delay:calc(var(--wsbn-c-ltr, 0) * var(--wsbn-c-ap-stagger, .03s));
}
/* Le sens vient d'un simple signe (-1 = haut, 1 = bas) : une seule règle
   couvre les deux directions. */
.wsbn-c-ap-letters .wsbn-classique__btn:hover .wsbn-classique__btn-char{
  translate:0 calc(0.22em * var(--wsbn-c-ap-dir, -1));
}

/* --- Lettres qui roulent.
       Chaque LETTRE a sa propre copie posée juste en dessous, dans une fenêtre
       à débordement masqué. Au survol la lettre sort, la copie prend sa place.
       Le dédoublement au niveau de la lettre (et non du mot) est ce qui produit
       le roulement en cascade plutôt qu'un bloc qui glisse d'un seul tenant. */
.wsbn-c-ap-letters-roll .wsbn-classique__btn-char{
  position:relative;
  display:inline-block;
  overflow:hidden;
  white-space:pre;
  vertical-align:bottom;
}
.wsbn-c-ap-letters-roll .wsbn-classique__btn-glyph{
  display:block;
  transition:translate var(--wsbn-c-ap-speed, .45s) var(--wsbn-c-ap-ease, cubic-bezier(0.16, 1, 0.3, 1));
  transition-delay:calc(var(--wsbn-c-ltr, 0) * var(--wsbn-c-ap-stagger, .03s));
}
/* La copie attend hors champ, du côté opposé au sens de sortie. */
.wsbn-c-ap-letters-roll .wsbn-classique__btn-glyph--dup{
  position:absolute;
  inset:0;
  translate:0 calc(100% * var(--wsbn-c-ap-dir, -1) * -1);
}
.wsbn-c-ap-letters-roll .wsbn-classique__btn:hover .wsbn-classique__btn-glyph{
  translate:0 calc(100% * var(--wsbn-c-ap-dir, -1));
}
.wsbn-c-ap-letters-roll .wsbn-classique__btn:hover .wsbn-classique__btn-glyph--dup{
  translate:0 0;
}

/* --------------------------------------------------------------------------
   GLISSEMENT DU TEXTE AU SURVOL
   Le libellé est dédoublé : le visible part, la copie arrive du côté opposé.
   -------------------------------------------------------------------------- */
.wsbn-classique__btn-label-wrap{
  position:relative;
  display:inline-block;
  overflow:hidden;
  line-height:1.2;
  vertical-align:middle;
}
.wsbn-classique__btn-label-wrap .wsbn-classique__btn-label{
  display:block;
  transition:transform var(--wsbn-c-swipe-duration, 400ms) cubic-bezier(0.65, 0, 0.35, 1);
}
.wsbn-classique__btn-label--clone{
  position:absolute;
  top:0;
  left:0;
}

.wsbn-c-swipe-up .wsbn-classique__btn-label--visible{transform:translateY(0)}
.wsbn-c-swipe-up .wsbn-classique__btn-label--clone  {transform:translateY(100%)}
.wsbn-c-swipe-up .wsbn-classique__btn:hover .wsbn-classique__btn-label--visible{transform:translateY(-100%)}
.wsbn-c-swipe-up .wsbn-classique__btn:hover .wsbn-classique__btn-label--clone  {transform:translateY(0)}

.wsbn-c-swipe-down .wsbn-classique__btn-label--visible{transform:translateY(0)}
.wsbn-c-swipe-down .wsbn-classique__btn-label--clone  {transform:translateY(-100%)}
.wsbn-c-swipe-down .wsbn-classique__btn:hover .wsbn-classique__btn-label--visible{transform:translateY(100%)}
.wsbn-c-swipe-down .wsbn-classique__btn:hover .wsbn-classique__btn-label--clone  {transform:translateY(0)}

.wsbn-c-swipe-left .wsbn-classique__btn-label--visible{transform:translateX(0)}
.wsbn-c-swipe-left .wsbn-classique__btn-label--clone  {transform:translateX(100%)}
.wsbn-c-swipe-left .wsbn-classique__btn:hover .wsbn-classique__btn-label--visible{transform:translateX(-100%)}
.wsbn-c-swipe-left .wsbn-classique__btn:hover .wsbn-classique__btn-label--clone  {transform:translateX(0)}

.wsbn-c-swipe-right .wsbn-classique__btn-label--visible{transform:translateX(0)}
.wsbn-c-swipe-right .wsbn-classique__btn-label--clone  {transform:translateX(-100%)}
.wsbn-c-swipe-right .wsbn-classique__btn:hover .wsbn-classique__btn-label--visible{transform:translateX(100%)}
.wsbn-c-swipe-right .wsbn-classique__btn:hover .wsbn-classique__btn-label--clone  {transform:translateX(0)}

/* --------------------------------------------------------------------------
   ENFONCEMENT AU CLIC
   Placé APRÈS les mouvements de survol : à spécificité égale, la dernière
   règle gagne. Le bouton enfoncé l'emporte donc sur le bouton survolé, ce qui
   est l'ordre attendu (on survole avant de cliquer).
   Les deux sélecteurs sont nécessaires : avec survol (souris) et sans
   (clavier, écran tactile).
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   VERRE DÉPOLI - le fond translucide et la bordure viennent des réglages
   Elementor (portés par .wsbn-c-glass-yes, plus spécifiques). Il ne reste ici
   que ce qui n'est pas réglable : isoler la couche pour que le flou ne bave
   pas.
   -------------------------------------------------------------------------- */
.wsbn-c-glass-yes .wsbn-classique__btn{
  isolation:isolate;
  -webkit-backdrop-filter:blur(12px);
}

/* --------------------------------------------------------------------------
   REFLET DE LUMIÈRE - une bande claire traverse le bouton.
   Trois modes :
     .wsbn-c-fx-shine       au survol seulement
     .wsbn-c-fx-loop        en boucle, en permanence
     .wsbn-c-fx-shine-loop  en boucle, et le passage accélère au survol
   -------------------------------------------------------------------------- */
.wsbn-c-fx-shine .wsbn-classique__btn,
.wsbn-c-fx-loop .wsbn-classique__btn,
.wsbn-c-fx-shine-loop .wsbn-classique__btn{
  position:relative;
}

.wsbn-c-fx-shine .wsbn-classique__btn::before,
.wsbn-c-fx-loop .wsbn-classique__btn::before,
.wsbn-c-fx-shine-loop .wsbn-classique__btn::before{
  content:"";
  position:absolute;
  inset:0;
  border-radius:inherit;
  pointer-events:none;
  /* La bande est centrée sur 50 % et s'étale de +/- la largeur choisie. */
  background-image:linear-gradient(
    var(--wsbn-c-fx-angle, 105deg),
    transparent calc(50% - var(--wsbn-c-fx-band, 12) * 1%),
    color-mix(in srgb, var(--wsbn-c-fx-color, #fff) 70%, transparent) 50%,
    transparent calc(50% + var(--wsbn-c-fx-band, 12) * 1%)
  );
  background-repeat:no-repeat;
  background-size:220% 100%;
  /* Position de repos : hors du bouton, à droite. */
  background-position:150% 0;
}

/* --- Au survol seulement : une transition suffit, pas d'animation. --- */
.wsbn-c-fx-shine .wsbn-classique__btn::before{
  transition:background-position var(--wsbn-c-fx-speed, .4s) ease;
}
.wsbn-c-fx-shine .wsbn-classique__btn:hover::before{
  background-position:-50% 0;
}

/* --- En boucle : le passage occupe le début du cycle, le reste est une
       pause. Aux deux extrémités la bande est hors du bouton, le retour à la
       position de départ est donc invisible. --- */
.wsbn-c-fx-loop .wsbn-classique__btn::before,
.wsbn-c-fx-shine-loop .wsbn-classique__btn::before{
  animation:wsbn-c-shine-loop var(--wsbn-c-fx-loop-speed, 4s) ease-in-out infinite;
}
@keyframes wsbn-c-shine-loop{
  0%       {background-position:150% 0}
  40%, 100%{background-position:-50% 0}
}

/* --- Boucle + survol : le cycle s'accélère tant que la souris est dessus. On
       ne cumule pas deux mécanismes sur la même propriété : on change
       simplement la durée de celui qui tourne déjà. --- */
.wsbn-c-fx-shine-loop .wsbn-classique__btn:hover::before{
  animation-duration:var(--wsbn-c-fx-speed, .4s);
}

/* --------------------------------------------------------------------------
   EFFETS PERMANENTS DU BOUTON - les mêmes apparences, en boucle.

   Même vocabulaire que le survol, seul le déclencheur change : une animation
   CSS au lieu de :hover. Fonctionne donc AU DOIGT, là où tous les effets de
   survol sont inertes.

   RYTHME COMMUN, en une seule durée réglable :
     0 %   repos  -> 20 %  actif   (aller)
     55 %  actif  -> 75 %  repos   (retour)
     100 % repos          (pause avant de recommencer)

   Placées APRÈS les règles de survol : à spécificité égale, la dernière
   gagne. Si les deux sont actifs, la boucle pilote.
   -------------------------------------------------------------------------- */
.wsbn-c-perm-fill-center .wsbn-classique__btn-fill,
.wsbn-c-perm-fill-wipe .wsbn-classique__btn-fill,
.wsbn-c-perm-icon-pop .wsbn-classique__btn-ico,
.wsbn-c-perm-icon-swap .wsbn-classique__btn-ico::before,
.wsbn-c-perm-underline .wsbn-classique__btn-label::before,
.wsbn-c-perm-underline .wsbn-classique__btn-label::after,
.wsbn-c-perm-letters .wsbn-classique__btn-char,
.wsbn-c-perm-letters-roll .wsbn-classique__btn-glyph{
  animation-duration:var(--wsbn-c-perm-dur, 4s);
  animation-timing-function:var(--wsbn-c-perm-ease, cubic-bezier(0.16, 1, 0.3, 1));
  animation-delay:var(--wsbn-c-perm-delay, 0s);
  animation-iteration-count:infinite;
}

.wsbn-c-perm-fill-center .wsbn-classique__btn,
.wsbn-c-perm-fill-wipe .wsbn-classique__btn{
  position:relative;
  overflow:hidden;
}

.wsbn-c-perm-fill-center .wsbn-classique__btn-fill{
  top:50%;left:50%;
  width:260%;aspect-ratio:1;
  border-radius:50%;
  translate:-50% -50%;
  animation-name:wsbn-c-perm-disque;
}
@keyframes wsbn-c-perm-disque{
  0%, 100%{scale:0}
  20%, 55%{scale:1}
  75%     {scale:0}
}

.wsbn-c-perm-fill-wipe .wsbn-classique__btn-fill{
  inset:0;
  border-radius:inherit;
  transform-origin:0% 50%;
  animation-name:wsbn-c-perm-balayage;
}
@keyframes wsbn-c-perm-balayage{
  0%, 100%{scale:0 1;opacity:0}
  12%     {opacity:1}
  20%, 55%{scale:1 1;opacity:1}
  75%     {scale:1 1;opacity:0}
  76%     {scale:0 1;opacity:0}
}

.wsbn-c-perm-icon-pop .wsbn-classique__btn-ico{
  aspect-ratio:1;padding:0.35em;border-radius:50%;
  animation-name:wsbn-c-perm-pastille;
}
@keyframes wsbn-c-perm-pastille{
  0%, 100%{background-color:transparent;scale:1}
  20%, 55%{background-color:var(--wsbn-c-ap-color, rgba(255,255,255,.18));scale:1.12}
  75%     {background-color:transparent;scale:1}
}

.wsbn-c-perm-icon-swap .wsbn-classique__btn-ico{
  position:relative;
  aspect-ratio:1;padding:0.35em;border-radius:50%;
  background-color:var(--wsbn-c-ap-color, rgba(255,255,255,.18));
}
.wsbn-c-perm-icon-swap .wsbn-classique__btn-ico::before{
  content:"";position:absolute;inset:0;border-radius:50%;
  background-color:var(--wsbn-c-ap-color-top, #ffffff);
  animation-name:wsbn-c-perm-diagonale;
}
.wsbn-c-perm-icon-swap .wsbn-classique__btn-ico svg,
.wsbn-c-perm-icon-swap .wsbn-classique__btn-ico i{position:relative;z-index:1}
@keyframes wsbn-c-perm-diagonale{
  0%, 100%{scale:1;translate:0 0;opacity:1}
  20%, 55%{scale:.15;translate:60% -60%;opacity:0}
  75%     {scale:1;translate:0 0;opacity:1}
}

.wsbn-c-perm-underline .wsbn-classique__btn-label{position:relative}
.wsbn-c-perm-underline .wsbn-classique__btn-label:not(.wsbn-classique__btn-label--clone)::before,
.wsbn-c-perm-underline .wsbn-classique__btn-label:not(.wsbn-classique__btn-label--clone)::after{
  content:"";position:absolute;left:0;right:0;bottom:-0.18em;
  height:1px;background-color:currentColor;
}
.wsbn-c-perm-underline .wsbn-classique__btn-label::before{
  transform-origin:right center;
  animation-name:wsbn-c-perm-barre-sort;
}
.wsbn-c-perm-underline .wsbn-classique__btn-label::after{
  transform-origin:left center;
  animation-name:wsbn-c-perm-barre-entre;
}
@keyframes wsbn-c-perm-barre-sort{
  0%, 100%{scale:1 1}
  20%, 55%{scale:0 1}
  75%     {scale:1 1}
}
@keyframes wsbn-c-perm-barre-entre{
  0%, 100%{scale:0 1}
  25%, 55%{scale:1 1}
  78%     {scale:0 1}
}

.wsbn-c-perm-letters .wsbn-classique__btn-char{
  display:inline-block;white-space:pre;
  animation-name:wsbn-c-perm-lettre;
  animation-delay:calc(var(--wsbn-c-perm-delay, 0s) + var(--wsbn-c-ltr, 0) * var(--wsbn-c-ap-stagger, .03s));
}
@keyframes wsbn-c-perm-lettre{
  0%, 100%{translate:0 0}
  20%, 55%{translate:0 calc(.22em * var(--wsbn-c-ap-dir, -1))}
  75%     {translate:0 0}
}

.wsbn-c-perm-letters-roll .wsbn-classique__btn-char{
  position:relative;display:inline-block;overflow:hidden;
  white-space:pre;vertical-align:bottom;
}
.wsbn-c-perm-letters-roll .wsbn-classique__btn-glyph{
  display:block;
  animation-name:wsbn-c-perm-roule;
  animation-delay:calc(var(--wsbn-c-perm-delay, 0s) + var(--wsbn-c-ltr, 0) * var(--wsbn-c-ap-stagger, .03s));
}
.wsbn-c-perm-letters-roll .wsbn-classique__btn-glyph--dup{
  position:absolute;inset:0;
  animation-name:wsbn-c-perm-roule-dup;
}
@keyframes wsbn-c-perm-roule{
  0%, 100%{translate:0 0}
  20%, 55%{translate:0 calc(100% * var(--wsbn-c-ap-dir, -1))}
  75%     {translate:0 0}
}
@keyframes wsbn-c-perm-roule-dup{
  0%, 100%{translate:0 calc(100% * var(--wsbn-c-ap-dir, -1) * -1)}
  20%, 55%{translate:0 0}
  75%     {translate:0 calc(100% * var(--wsbn-c-ap-dir, -1) * -1)}
}


/* --------------------------------------------------------------------------
   RESPONSIVE
   -------------------------------------------------------------------------- */

@media (max-width:1024px){
  .wsbn-classique__body{max-width:min(var(--wsbn-c-body-w), 86%)}
}

@media (max-width:767px){
  /* Disposition « Plein cadre » : la photo reste en fond à toutes les tailles,
     juste repositionnée pour la lisibilité. */
  .wsbn-classique--fullbleed{min-height:380px}
  .wsbn-classique--fullbleed .wsbn-classique__media img{object-position:center 22%}

  /* Disposition « Empilé » : la photo passe en bandeau plein-largeur au
     dessus (ratio fixe, pas une hauteur en px qui recadre n'importe comment),
     le texte descend dans un bloc uni. Même couleur qu'en plein cadre
     (--wsbn-c-ov-1) : rien à re-choisir pour le mobile. */
  /* En "Empile", la marge interieure du cadre ne veut plus dire "espace
     autour de la photo et du texte" (qui doivent toujours toucher les bords
     en mobile empile), elle devient "espace de lecture A L'INTERIEUR du
     bloc de texte" : le cadre lui-meme repasse a 0, le bloc de texte
     applique les 4 valeurs sur LUI-MEME. Sans ca, le reglage "Marge
     interieure" laissait un bandeau blanc entre le cadre et son contenu -
     visible aussi bien au-dessus de la photo qu'autour du bloc bleu. */
  /* LA MARGE INTERIEURE PASSE AU BLOC DE TEXTE.
     En empile, la photo est un bandeau qui touche les bords et le texte
     porte sa propre marge, donnee par la regle `__body` plus bas. Une
     marge sur la banniere elle-meme n'a donc plus de sens : elle
     rentrerait la photo de 60 px de chaque cote.

     `!important` parce que le reglage du panneau ecrit
     `.elementor-element-XXX .wsbn-classique{padding}`, soit 0-2-0 contre
     0-1-0 : sans lui, l'annulation ne passe pas. C'est l'exception
     assumee des blocs de NEUTRALISATION, ceux qui defont une propriete
     qui n'a pas de sens dans un mode donne. */
  .wsbn-classique--stacked{display:block;min-height:0;padding:0 !important}
  /* LA HAUTEUR DU BANDEAU PHOTO.
     `aspect-ratio` ne s'applique qu'a une dimension laissee libre : tant
     que la hauteur vaut `auto`, le rapport 4/3 decide ; des qu'un reglage
     ecrit une hauteur, c'est elle qui gagne. Aucune regle n'a besoin
     d'etre plus forte qu'une autre, et le repli garde le rendu d'avant
     sur toutes les bannieres qui n'y ont pas touche. */
  .wsbn-classique--stacked .wsbn-classique__media{
    position:relative;
    inset:auto;
    /* LA LARGEUR D'ABORD, SINON LE RAPPORT LA CALCULE.
       Sans elle, `aspect-ratio` deduisait la largeur de la hauteur : le
       bandeau faisait 204 px sur un ecran de 390, et regler une hauteur
       l'ELARGISSAIT au lieu de le raccourcir. Avec une largeur et une
       hauteur declarees, le rapport ne s'applique plus du tout. */
    width:100%;
    aspect-ratio:4/3;
    height:var(--wsbn-c-photo-h, auto);
  }
  .wsbn-classique--stacked .wsbn-classique__scrim{display:none}
  .wsbn-classique--stacked .wsbn-classique__body{
    max-width:none;
    background:var(--wsbn-c-ov-1);
    /* En empile, le bloc de texte EST le fond colore : le deplacer
       decouvrirait une bande vide le long du bord. Le placement n'a donc
       pas de sens ici, et il est neutralise plutot que laisse produire un
       defaut que personne ne rattacherait a son curseur. */
    translate:none;
    padding:var(--wsbn-c-pad-t, 24px) var(--wsbn-c-pad-r, 24px) var(--wsbn-c-pad-b, 24px) var(--wsbn-c-pad-l, 24px);
  }

  /* La colonne s'elargit, SAUF en << comme sur ordinateur >> : la garder
     etroite est precisement ce qu'on demande dans ce mode, et le voile
     lateral n'a de sens que si elle l'est. */
  .wsbn-classique--fullbleed .wsbn-classique__body,
  .wsbn-classique--stacked .wsbn-classique__body{max-width:none}
}

/* --------------------------------------------------------------------------
   ACCESSIBILITÉ
   Le visiteur qui demande moins d'animations reçoit la bannière complète,
   posée, sans mouvement. Le script ne pose alors même pas .wsbn-fx-js, mais on
   coupe aussi les boucles, qui elles n'en dépendent pas.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion:reduce){
  .wsbn-classique__title,
  .wsbn-classique__title .wsbn-classique__title-part,
  .wsbn-classique__title .wsbn-classique__title-part > *,
  .wsbn-classique__title .wsbn-classique__title-char,
  .wsbn-classique__title .wsbn-classique__title-deco{
    animation:none !important;
    opacity:1 !important;
    transform:none !important;
  }

  /* La bande du balayage disparaît COMPLÈTEMENT. C'est le cas le plus
     important de tout ce bloc : le script ne s'installe pas quand on demande
     moins d'animations, donc rien ne viendrait retirer la bande. Sans cette
     règle, ces visiteurs auraient un titre couvert pour toujours. */
  .wsbn-classique__title[data-wsbn-title-in="balayage"] .wsbn-classique__title-part::after{
    animation:none !important;
    transform:scaleX(0) !important;
  }
  [data-wsbn-deco="croix"] .wsbn-classique__title-deco{
    transform:rotate(var(--wsbn-c-title-cross)) !important;
  }

  /* Le bouton reste parfaitement utilisable : on retire le mouvement, pas
     l'état de survol (couleurs, fond, bordure restent actifs). */
  .wsbn-classique__badge,
  .wsbn-classique__btn,
  .wsbn-classique__btn-fill,
  .wsbn-classique__btn-ico,
  .wsbn-classique__btn-ico svg,
  .wsbn-classique__btn-ico i,
  .wsbn-classique__btn-label,
  .wsbn-classique__btn-label-wrap .wsbn-classique__btn-label,
  .wsbn-classique__btn-char,
  .wsbn-classique__btn-glyph,
  .wsbn-c-ap-icon-swap .wsbn-classique__btn-ico::before,
  .wsbn-c-ap-underline .wsbn-classique__btn-label::before,
  .wsbn-c-ap-underline .wsbn-classique__btn-label::after,
  .wsbn-c-fx-shine .wsbn-classique__btn::before{
    transition:none !important;
  }

  /* La cascade n'a plus lieu d'être : les lettres ne bougent pas du tout. */
  .wsbn-c-ap-letters .wsbn-classique__btn:hover .wsbn-classique__btn-char{
    translate:none;
  }

  /* Le reflet en boucle est un mouvement permanent : c'est exactement ce que
     ce réglage système demande de supprimer. */
  .wsbn-c-fx-loop .wsbn-classique__btn::before,
  .wsbn-c-fx-shine-loop .wsbn-classique__btn::before,
  .wsbn-c-fx-shine-loop .wsbn-classique__btn:hover::before{
    animation:none;
  }

  .wsbn-c-hov-pulse .wsbn-classique__btn:hover{animation:none}

  .wsbn-c-hov-grow   .wsbn-classique__btn:hover,
  .wsbn-c-hov-shrink .wsbn-classique__btn:hover{scale:1}

  .wsbn-c-hov-float  .wsbn-classique__btn:hover,
  .wsbn-c-hov-sink   .wsbn-classique__btn:hover{translate:none}

  [class*="wsbn-c-perm-"] .wsbn-classique__btn-fill,
  [class*="wsbn-c-perm-"] .wsbn-classique__btn-ico,
  [class*="wsbn-c-perm-"] .wsbn-classique__btn-ico::before,
  [class*="wsbn-c-perm-"] .wsbn-classique__btn-label::before,
  [class*="wsbn-c-perm-"] .wsbn-classique__btn-label::after,
  [class*="wsbn-c-perm-"] .wsbn-classique__btn-char,
  [class*="wsbn-c-perm-"] .wsbn-classique__btn-glyph{
    animation:none !important;
  }

  /* Second verrou : le script ne crée aucune particule, cette règle ne sert
     que si l'une existait déjà. */
}

/* =======================================================================
   VEILLE DES ANIMATIONS
   `wsbn-hors-vue` est posee sur la banniere par ws-banniere-veille.js quand
   elle quitte l'ecran, `wsbn-onglet-cache` sur <html> quand l'onglet passe en
   arriere-plan. Une boucle qu'on ne voit pas ne doit pas composer d'image.
   Sans le script, aucune de ces classes n'existe et tout joue normalement :
   on ne peut pas figer une banniere en cassant un fichier.
   ======================================================================= */
.wsbn-hors-vue,
.wsbn-hors-vue *,
.wsbn-hors-vue::before,
.wsbn-hors-vue::after,
.wsbn-hors-vue *::before,
.wsbn-hors-vue *::after,
.wsbn-onglet-cache .wsbn-classique *,
.wsbn-onglet-cache .wsbn-arc *,
.wsbn-onglet-cache .wsbn-hero *,
.wsbn-onglet-cache .wsbn-hv *,
.wsbn-onglet-cache .wsbn-imm *,
.wsbn-onglet-cache .wsbn-vision * {
  animation-play-state: paused !important;
}
