/* ═══════════════════════════════════════════════════════════════════════════
   structure.css — LA GRAMMAIRE, ET RIEN DE LA MARQUE
   ═══════════════════════════════════════════════════════════════════════════

   Ce fichier est la part RÉUTILISABLE du thème : dispositions, composants,
   états, transitions, points de rupture. Il ne contient AUCUNE valeur
   littérale de charte — ni couleur, ni nom de police. Tout passe par les
   jetons que `peau.css` définit.

   C'est ce qui rend le thème rhabillable, et ce n'est pas une préférence :
   un site né de ce montage avec une autre marque ne doit garder aucune trace
   de celle-ci. Cinq couleurs écrites en dur suffisaient à ce qu'il en reste.

   ⚠️ LA RÈGLE EST TENUE PAR UNE PORTE, pas par la bonne volonté.
   `rail-design-tokens` compte les couleurs écrites hors d'une déclaration de
   jeton, et depuis le 22.10.2026 un site absent de sa ligne de base est jugé
   à ZÉRO. Ajouter un `#` ici fait rougir la porte.

   L'ORDRE DE CHARGEMENT COMPTE : `peau.css` passe AVANT, puisqu'il déclare ce
   que celui-ci consomme. `functions.php` l'exprime par une dépendance, et non
   par l'ordre d'écriture des appels — WordPress est seul juge de l'ordre.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── les mesures de structure ──────────────────────────────────────────────
   Des LONGUEURS, pas des couleurs : elles appartiennent à la grammaire et
   non à la marque, donc elles vivent ici et non dans la peau.

   `--end-rail` est la première colonne des pages de texte — celle qui porte
   le titre de section pendant que le texte court à sa droite. Elle était
   recopiée à la main partout où quelque chose devait s'y aligner, et elle a
   changé trois fois. Tout ce qui s'y aligne la LIT désormais. */
:root {
  --end-rail: 13rem;
  /* La largeur d'une page de texte. Elle était écrite « 65rem » à deux
     endroits, dont l'exergue — c'est-à-dire la même duplication que le rail,
     au même endroit. */
  --end-page: 65rem;
}

/* ── le socle ──────────────────────────────────────────────────────────── */

:where(a, button, input, summary):focus-visible {
  outline: 2px solid var(--wp--preset--color--turquoise-texte);
  outline-offset: 3px;
}

[hidden] { display: none !important; }

/* ── l'en-tête, collant ────────────────────────────────────────────────── */

.sb-l-entete {
  background: var(--wp--preset--color--papier);
  padding-block: calc(var(--wp--custom--rythme) * 2.25);
}

.sb-l-entete.est-collant { position: sticky; inset-block-start: 0; z-index: 50; }

.sb-l-entete.a-defile {
  border-bottom: 1px solid var(--wp--preset--color--filet);
  box-shadow: 0 6px 20px rgba(10, 10, 10, 0.06);
}

/* Le logo est posé par le THÈME, pas par la médiathèque : WordPress refuse le
   SVG, et un logo est de la marque, pas du contenu. */
.sb-c-marque::before {
  content: "";
  flex-shrink: 0;
  width: 175px;
  height: 34px;
  background: var(--end-logo-verrou-horizontal) left center / contain no-repeat;
}



.sb-l-nav a { color: var(--wp--preset--color--encre); font-weight: 700; text-decoration: none; }
.sb-l-nav a:hover { color: var(--wp--preset--color--turquoise-texte); }

.sb-l-nav .sb-c-nav-accent a,
.sb-l-nav a.sb-c-nav-accent {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding-inline: calc(var(--wp--custom--rythme) * 2.5);
  border-radius: var(--wp--custom--rayon-rond);
  background: var(--end-plein);
  color: var(--end-plein-texte);
}

/* ── la une, en deux colonnes ──────────────────────────────────────────── */

.sb-s-accueil-une,
.sb-s-apropos-tete,
.sb-s-episode-tete {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  align-items: center;
  column-gap: calc(var(--wp--custom--gouttiere) * 2);
  padding-block: calc(var(--wp--custom--rythme) * 8) calc(var(--wp--custom--rythme) * 6);
  overflow: hidden;
}

.sb-s-apropos-tete, .sb-s-episode-tete { align-items: start; }

/* ── L'ACCUEIL N'A PLUS DE VISUEL — 24.10.2026 ──────────────────────────
 *
 * La grille à deux colonnes du dessus sert AUSSI « À propos » et la fiche
 * d'épisode, qui gardent leur portrait et leur pochette. L'accueil est le
 * seul à passer en une colonne : la règle est donc posée sur sa classe à
 * lui, jamais sur la commune.
 *
 * ⚠️ LE TEXTE GARDE SA MESURE ; il ne s'étale pas sur la colonne large.
 * Au-delà de 75 signes par ligne l'œil décroche — c'est ce qui a été corrigé
 * sur « À propos » le 23.10.2026, et l'étaler ici serait refaire la même
 * erreur à l'autre bout du site.
 *
 * ── LE HAUT DE PAGE PART DU BORD GAUCHE — 24.10.2026 ──
 *
 * Il a été centré une demi-journée. Vu au téléphone, le bloc se contredisait :
 * surtitre et titre centrés, chapô et boutons au fer à gauche, parce que deux
 * règles plus bas leur rendent leur alignement (`text-align: start` sous
 * 30 rem pour le chapô, `justify-content: flex-start` pour les commandes).
 * Un seul bord d'attaque pour les quatre éléments : celui de gauche, le même
 * que partout ailleurs sur le site. */
.sb-s-accueil-une {
  grid-template-columns: minmax(0, 1fr);
  justify-items: start;
  text-align: start;
}

.sb-s-accueil-une > * { max-width: 46rem; }
.sb-s-accueil-une .sb-c-chapo { margin-inline: 0; max-width: 54ch; }
.sb-s-accueil-une .sb-c-abonner { justify-content: flex-start; }

/* ⚠️ `balance` RESTE, MÊME AU FER À GAUCHE. Mesuré au rendu : « Transmettre ce
 * qu'on a / appris. » laissait « a » en fin de première ligne et un mot seul
 * en seconde. Le défaut venait de la coupure, pas du centrage : il survit à
 * l'alignement à gauche. `balance` répartit les lignes d'un titre court ;
 * `pretty` évite au chapô de finir sur un mot orphelin. Les deux sont ignorés
 * par un navigateur qui ne les connaît pas — le texte reste lisible, il est
 * seulement moins bien coupé. */
.sb-s-accueil-une .sb-c-titre { text-wrap: balance; }
.sb-s-accueil-une .sb-c-chapo { text-wrap: pretty; }

.sb-s-accueil-une::before {
  content: "";
  position: absolute;
  inset-block-start: -22%;
  inset-inline-start: -14%;
  width: 46%; height: auto;
  aspect-ratio: 1;
  background: var(--end-logo-encre) center / contain no-repeat;
  opacity: 0.045;
  pointer-events: none;
}

.sb-s-accueil-une > *, .sb-s-apropos-tete > *, .sb-s-episode-tete > * { grid-column: 1; }
.sb-c-visuel, .sb-c-portrait, .sb-c-pochette-episode { grid-column: 2; grid-row: 1 / span 9; align-self: center; margin: 0; }

.sb-c-visuel img, .sb-c-pochette-episode img {
  display: block; width: 100%; height: auto;
  border-radius: calc(var(--wp--custom--rayon) + 6px);
  box-shadow: 0 18px 44px rgba(10, 10, 10, 0.14);
}

.sb-c-portrait img {
  display: block; width: 100%; max-width: 340px; height: auto;
  margin-inline: auto; border-radius: 50%;
}

.sb-c-surtitre {
  font-size: var(--wp--preset--font-size--surtitre);
  font-weight: 700;
  letter-spacing: var(--wp--custom--interlettre-surtitre);
  text-transform: uppercase;
  color: var(--wp--preset--color--ambre-texte);
  margin-block-end: calc(var(--wp--custom--rythme) * 2.25);
}

.sb-s-accueil-une .sb-c-titre { font-size: var(--wp--preset--font-size--affiche); margin-block: 0 calc(var(--wp--custom--rythme) * 3); }
.sb-s-apropos-tete .sb-c-titre, .sb-s-episode-tete .sb-c-titre { font-size: var(--wp--preset--font-size--titre-page); margin-block: 0 calc(var(--wp--custom--rythme) * 3); }
.sb-s-legal .sb-c-titre, .sb-s-cgu .sb-c-titre,
.sb-s-donnees-personnelles .sb-c-titre, .sb-s-cookies .sb-c-titre { font-size: var(--wp--preset--font-size--titre-page); margin-block-end: calc(var(--wp--custom--rythme) * 4); }

.sb-c-chapo {
  max-width: 54ch;
  margin-block-end: calc(var(--wp--custom--rythme) * 4.5);
  font-size: calc(var(--wp--preset--font-size--corps) + 3px);
  color: var(--wp--preset--color--encre-douce);
}

.sb-c-numero, .sb-c-date, .sb-c-invite, .sb-c-duree {
  display: inline-block;
  margin-block: 0 calc(var(--wp--custom--rythme) * 1);
  margin-inline-end: calc(var(--wp--custom--rythme) * 2.5);
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}



/* ── LE lecteur ────────────────────────────────────────────────────────── */

.sb-s-accueil-lecteur, .sb-s-episode-lecteur {
  display: flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 3.25);
  margin-block: calc(var(--wp--custom--rythme) * 2);
  padding: calc(var(--wp--custom--rythme) * 3.25);
  border-radius: calc(var(--wp--custom--rayon) + 6px);
  background: var(--end-l-fond);
  color: var(--end-l-texte);
  border: 2px solid var(--end-l-filet);
  box-shadow: var(--end-l-ombre);
  transition: padding 180ms ease, border-radius 180ms ease;
}

.sb-s-accueil-lecteur.est-compact, .sb-s-episode-lecteur.est-compact {
  position: fixed;
  inset-inline: max(16px, calc(50vw - 38rem + var(--wp--custom--marge)));
  inset-block-end: 16px;
  z-index: 40;
  gap: calc(var(--wp--custom--rythme) * 2);
  padding: calc(var(--wp--custom--rythme) * 1.5) calc(var(--wp--custom--rythme) * 2);
  border-radius: var(--wp--custom--rayon-rond);
  box-shadow: 0 12px 32px rgba(10, 10, 10, 0.26);
}

/* LA POCHETTE DU LECTEUR EST EN 16:9, PAS EN CARRÉ — 24.10.2026.
 *
 * Les six pochettes d'épisode sont produites en 16:9 ; le lecteur les
 * recadrait en carré, donc en coupait les bords. Et le hero portait EN PLUS
 * une grande carte 16:9 du même épisode, à droite du texte — deux visuels
 * pour une seule chose, et le haut de page pris par l'un d'eux. La carte est
 * descendue ici, à la place du carré.
 *
 * La forme COMPACTE reste carrée et ronde : c'est la barre flottante, et un
 * 16:9 de 44 px y serait illisible. `aspect-ratio: auto` est écrit parce
 * qu'une largeur et une hauteur explicites ne suffisent pas à le dire au
 * lecteur qui relit cette règle. */
.sb-c-pochette { flex-shrink: 0; width: 196px; margin: 0; }
.sb-c-pochette img {
  display: block; width: 196px; aspect-ratio: 16 / 9; height: auto; object-fit: cover;
  border-radius: calc(var(--wp--custom--rayon) - 2px);
}

.est-compact .sb-c-pochette, .est-compact .sb-c-pochette img {
  width: 44px; height: 44px; aspect-ratio: auto; border-radius: 50%;
}
.est-compact .sb-c-surtitre { display: none; }
.est-compact .sb-c-piste { margin: 0; font-size: var(--wp--preset--font-size--legende); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.est-compact .sb-c-jouer { width: 42px; height: 42px; }
.est-compact .sb-c-jouer svg { width: 18px; height: 18px; }

.sb-l-lecteur-corps { flex-grow: 1; min-width: 0; }

.sb-s-accueil-lecteur .sb-c-surtitre, .sb-s-episode-lecteur .sb-c-surtitre {
  color: var(--end-l-accent);
  margin-block-end: calc(var(--wp--custom--rythme) * 0.875);
}

.sb-c-piste {
  margin-block: 0 calc(var(--wp--custom--rythme) * 2);
  font-family: var(--wp--preset--font-family--titre);
  font-weight: 600;
  font-size: var(--wp--preset--font-size--titre-fiche);
}

.sb-l-lecteur-piste { display: flex; align-items: center; gap: calc(var(--wp--custom--rythme) * 1.75); }

.sb-l-lecteur-piste .sb-c-duree, .sb-c-temps {
  margin: 0;
  font-size: var(--wp--preset--font-size--legende);
  font-variant-numeric: tabular-nums;
  color: var(--end-l-douce);
}

.sb-c-barre { position: relative; flex-grow: 1; height: 5px; border-radius: 3px; background: var(--end-l-rail); cursor: pointer; }
.sb-c-barre-remplie { position: absolute; inset-block: 0; inset-inline-start: 0; width: 0; border-radius: 3px; background: var(--wp--preset--color--turquoise); }

.sb-c-jouer {
  display: inline-flex; align-items: center; justify-content: center;
  flex-shrink: 0; width: 60px; height: 60px;
  border: none; border-radius: var(--wp--custom--rayon-rond);
  background: var(--end-plein);
  color: var(--end-plein-texte);
  cursor: pointer;
}

/* ── une fiche d'épisode ───────────────────────────────────────────────── */

.sb-l-episodes {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto auto;
  column-gap: calc(var(--wp--custom--rythme) * 2.75);
  align-items: center;
  margin-block-start: calc(var(--wp--custom--rythme) * 1.25);
  /* LA FICHE S'EST RESSERRÉE le 03.10.2026. Mesurée à 161 px, dont 39 pour
     la seule ligne de la pastille — un quart de la carte pour un mot. Le
     resserrement porte sur le rythme vertical, jamais sur les gouttières :
     une liste dense et illisible n'est pas un gain. */
  padding: calc(var(--wp--custom--rythme) * 1.75) calc(var(--wp--custom--rythme) * 3);
  border-radius: var(--wp--custom--rayon);
  background: var(--wp--preset--color--carte);
}

.sb-l-episodes .sb-c-invite {
  grid-column: 1; grid-row: 1 / span 4;
  width: 64px; height: 64px; margin: 0;
  border-radius: 50%; overflow: hidden;
}

.sb-l-episodes .sb-c-invite img { width: 64px; height: 64px; object-fit: cover; border-radius: 50%; display: block; }

.sb-l-episodes .sb-c-rubrique {
  grid-column: 2; grid-row: 1;
  margin: 0 0 calc(var(--wp--custom--rythme) * 0.375);
}

.sb-l-episodes .sb-c-rubrique::before {
  content: attr(data-rubrique);
}

.sb-l-episodes .sb-c-titre { grid-column: 2; grid-row: 2; margin: 0; font-size: var(--wp--preset--font-size--titre-fiche); }
.sb-l-episodes .sb-c-pitch { grid-column: 2; grid-row: 3; margin-block-start: calc(var(--wp--custom--rythme) * 0.375); }
.sb-l-episodes .sb-c-fiche { grid-column: 2; grid-row: 4; margin-block-start: calc(var(--wp--custom--rythme) * 0.75); }
.sb-l-episodes .sb-c-duree { grid-column: 3; grid-row: 1 / span 4; margin: 0; }
.sb-l-episodes .sb-c-ecouter { grid-column: 4; grid-row: 1 / span 4; }

.sb-c-pitch {
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
  max-width: var(--wp--custom--colonne);
}

/* La pastille de rubrique. Texte ENCRE dessus, jamais du blanc : mesuré à 2,6
   sur le turquoise et 2,0 sur le doré, quand il en faut 4,5. */
.sb-l-episodes .sb-c-rubrique,
.sb-s-episode-tete .sb-c-rubrique {
  display: inline-block;
  padding: 5px 11px;
  border-radius: var(--wp--custom--rayon-petit);
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 700;
  color: var(--end-plein-texte);
  background: var(--end-plein);
  justify-self: start;
}

.sb-l-episodes .sb-c-rubrique {
  padding: 2px 9px;
  font-size: 12px;
  letter-spacing: 0.01em;
}

/* 🔴 L'AMBRE NE PORTE PAS DE BLANC. Le passage des aplats au texte blanc,
   le 21.10.2026, a emporté cette pastille avec les autres : blanc sur ambre
   mesure 2,12, contre 9,34 pour l'encre. L'ambre est une couleur CLAIRE —
   elle suit la règle inverse du turquoise, et il faut l'écrire ici, sans
   quoi la prochaine bascule globale la reprendra. */
/* ⚠️ ET `encre` NE SUFFIT PAS NON PLUS. En mode sombre, `encre` se renverse
   en #E8EEF4 — presque blanc — pendant que l'ambre, lui, ne bouge pas : la
   pastille retombait à 1,81. Un aplat qui ne se renverse jamais prend un
   texte qui ne se renverse jamais, écrit en clair. */
.sb-c-rubrique.est-recit {
  background: var(--wp--preset--color--ambre);
  color: var(--end-sur-ambre);
}
.sb-c-rubrique.est-analyse { background: var(--wp--preset--color--encre); color: var(--wp--preset--color--papier); }
/* La quatrième rubrique est cernée plutôt que pleine : la palette n'a pas
   de quatrième ton accessible, et un aplat de plus se lirait comme une
   couleur choisie au hasard. Texte encre, donc contraste tenu. */
.sb-c-rubrique.est-chronique {
  background: var(--wp--preset--color--carte);
  color: var(--wp--preset--color--encre);
  box-shadow: inset 0 0 0 1.5px var(--wp--preset--color--filet);
}

.sb-s-episode-tete .sb-c-rubrique { margin-block-end: calc(var(--wp--custom--rythme) * 2); }

/* ══ LE BOUTON PLEIN SUIT `--end-plein`, PAS LES PRESETS ════════════════
   `theme.json` le peint avec `turquoise-texte` + `sur-accent`. Les deux sont
   des presets, et `turquoise-texte` se renverse en sombre (#5CCFE3) quand
   `sur-accent` reste blanc : « Tous les épisodes » mesurait 1,83.

   La paire `--end-plein` / `--end-plein-texte` se renverse ENSEMBLE — c'est
   sa raison d'être. Le front s'y raccroche ici.

   `theme.json` GARDE ses presets, et ce n'est pas un doublon : l'éditeur de
   blocs ne charge pas cette feuille, et un `var(--end-plein)` écrit là-bas
   rendrait un bouton transparent dans l'écran d'édition. */
.wp-element-button,
.wp-block-button__link {
  background-color: var(--end-plein);
  color: var(--end-plein-texte);
}

.sb-c-fiche .wp-block-button__link, .sb-c-fiche a {
  padding: 0; border: 0; background: transparent;
  color: var(--wp--preset--color--turquoise-texte);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 700; text-decoration: none;
}

.sb-c-fiche .wp-block-button__link:hover { text-decoration: underline; background: transparent; }

.sb-c-ecouter .wp-block-button__link {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; padding: 0; font-size: 0;
  border: 0;
  border-radius: var(--wp--custom--rayon-rond);
  background: var(--end-plein); color: var(--end-plein-texte);
}

.sb-c-ecouter .wp-block-button__link::after {
  content: ""; width: 0; height: 0; border-style: solid;
  border-width: 7px 0 7px 11px;
  border-color: transparent transparent transparent currentColor;
  margin-inline-start: 3px;
}

.sb-c-ecouter .wp-block-button__link:hover { background: var(--end-plein-survol); }

/* ── les blocs de conversion ───────────────────────────────────────────── */

.sb-s-accueil-abonner, .sb-s-episode-abonner, .sb-s-apropos-appel {
  margin-block: calc(var(--wp--custom--rythme) * 5);
  padding: calc(var(--wp--custom--rythme) * 6) calc(var(--wp--custom--rythme) * 5);
  border-radius: calc(var(--wp--custom--rayon) + 6px);
  background: var(--wp--preset--color--carte);
}

.sb-s-apropos-appel { background: transparent; border: 1.5px solid var(--wp--preset--color--filet); }

.sb-s-accueil-abonner .sb-c-chapo, .sb-s-episode-abonner .sb-c-chapo, .sb-s-apropos-appel .sb-c-chapo {
  margin-block-end: calc(var(--wp--custom--rythme) * 3.5);
  font-size: var(--wp--preset--font-size--corps);
}

.sb-c-voir .wp-block-button__link {
  min-height: 44px;
  padding-inline: 0;
  background: transparent;
  color: var(--wp--preset--color--turquoise-texte);
  font-weight: 700;
  text-decoration: underline;
  text-underline-offset: 5px;
}

.sb-c-appel .wp-block-button__link {
  min-height: 52px; padding-inline: calc(var(--wp--custom--rythme) * 3.5);
  background: var(--end-plein);
  color: var(--end-plein-texte);
  border-radius: var(--wp--custom--rayon-rond); font-weight: 700;
}

.sb-c-appel .wp-block-button__link:hover { background: var(--end-plein-survol); }

/* ── le contenu courant ────────────────────────────────────────────────── */

.sb-c-texte, .sb-c-mention { max-width: var(--wp--custom--colonne); }
.sb-c-mention { color: var(--wp--preset--color--encre-douce); }
.sb-l-liens > * { padding-block: calc(var(--wp--custom--rythme) * 1.5); border-bottom: 1px solid var(--wp--preset--color--filet); }

/* ── le pied ───────────────────────────────────────────────────────────── */

.sb-l-pied {
  margin-block-start: calc(var(--wp--custom--rythme) * 10);
  padding-block: calc(var(--wp--custom--rythme) * 5) calc(var(--wp--custom--rythme) * 12);
  border-top: 1px solid var(--wp--preset--color--filet);
  color: var(--wp--preset--color--encre-douce);
}

.sb-c-pied-marque::before {
  content: "";
  display: block;
  width: 110px; height: 76px;
  margin-block-end: calc(var(--wp--custom--rythme) * 1.5);
  background: var(--end-logo-verrou-vertical) left center / contain no-repeat;
}

.sb-l-pied-liens a { color: var(--wp--preset--color--encre-douce); text-decoration: none; }
.sb-l-pied-liens a:hover { color: var(--wp--preset--color--encre); }

/* ── la modale d'abonnement ────────────────────────────────────────────── */

.sb-c-modale {
  width: min(32rem, calc(100vw - 32px));
  padding: 0; border: 0;
  border-radius: calc(var(--wp--custom--rayon) + 6px);
  background: var(--wp--preset--color--carte);
  color: var(--wp--preset--color--encre);
}

.sb-c-modale::backdrop { background: rgba(10, 10, 10, 0.55); }
.sb-c-modale__corps { position: relative; padding: calc(var(--wp--custom--rythme) * 5) calc(var(--wp--custom--rythme) * 4.5); }

.sb-c-modale__fermer {
  position: absolute;
  inset-block-start: calc(var(--wp--custom--rythme) * 2);
  inset-inline-end: calc(var(--wp--custom--rythme) * 2);
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; border: 0; border-radius: 50%;
  background: transparent; color: var(--wp--preset--color--encre-douce); cursor: pointer;
}

.sb-c-modale__titre { margin-block: calc(var(--wp--custom--rythme) * 1.5) calc(var(--wp--custom--rythme) * 1); font-size: var(--wp--preset--font-size--titre-section); font-family: var(--wp--preset--font-family--titre); }
.sb-c-modale__chapo { margin-block: 0 calc(var(--wp--custom--rythme) * 3); color: var(--wp--preset--color--encre-douce); }
.sb-l-plateformes--modale { display: flex; flex-direction: column; gap: calc(var(--wp--custom--rythme) * 1.25); list-style: none; padding: 0; margin: 0; }

.sb-c-plateforme {
  display: flex; flex-direction: column; gap: 2px; justify-content: center;
  min-height: 60px;
  padding: calc(var(--wp--custom--rythme) * 1.5) calc(var(--wp--custom--rythme) * 2.5);
  border: 1.5px solid var(--wp--preset--color--encre);
  border-radius: var(--wp--custom--rayon);
  color: var(--wp--preset--color--encre); text-decoration: none;
}

.sb-c-plateforme:hover { background: var(--wp--preset--color--encre); color: var(--wp--preset--color--papier); }
.sb-c-plateforme:hover .sb-c-plateforme__note { color: var(--wp--preset--color--papier); }
.sb-c-plateforme--nu { border-style: dashed; }
.sb-c-plateforme__nom { font-family: var(--wp--preset--font-family--titre); font-weight: 700; }
.sb-c-plateforme__note { font-size: var(--wp--preset--font-size--legende); color: var(--wp--preset--color--encre-douce); }

/* ── le téléphone ──────────────────────────────────────────────────────── */

@media (max-width: 60rem) {
  .sb-s-accueil-une, .sb-s-apropos-tete, .sb-s-episode-tete {
    grid-template-columns: minmax(0, 1fr);
    row-gap: calc(var(--wp--custom--rythme) * 4);
  }
  .sb-c-visuel, .sb-c-portrait, .sb-c-pochette-episode { grid-column: 1; grid-row: auto; order: -1; }
  .sb-s-accueil-une::before { inset-inline-start: -200px; }

  .sb-s-accueil-lecteur, .sb-s-episode-lecteur { flex-wrap: wrap; }
  .sb-s-accueil-lecteur.est-compact, .sb-s-episode-lecteur.est-compact { inset-inline: 12px; inset-block-end: 12px; }

  .sb-l-episodes { grid-template-columns: auto minmax(0, 1fr); }
  .sb-l-episodes .sb-c-invite { grid-row: 1 / span 2; }
  .sb-l-episodes .sb-c-pitch, .sb-l-episodes .sb-c-fiche { grid-column: 1 / -1; grid-row: auto; }
  .sb-l-episodes .sb-c-duree { grid-column: 1; grid-row: auto; }
  .sb-l-episodes .sb-c-ecouter { grid-column: 2; grid-row: auto; justify-self: end; }
}

/* ── LE CENTRAGE QUI N'EN ÉTAIT PAS UN ─────────────────────────────────── */
/*
 * Mesuré le 03.10.2026 sur un iPhone : dans chaque fiche, le titre et le lien
 * apparaissaient centrés alors qu'aucune règle ne le demandait.
 *
 * La cause : WordPress pose `is-layout-constrained` sur chaque groupe, et sa
 * feuille donne `margin-inline: auto` à TOUS les enfants directs. Dans un
 * conteneur en flux normal, ça centre un bloc plus étroit que son parent —
 * c'est l'effet voulu. Dans une GRILLE, ça centre chaque élément dans sa
 * cellule, et la mise en page part de travers sans qu'aucune règle à nous
 * ne soit en cause.
 *
 * On rend donc leur alignement aux enfants des groupes qu'on passe en grille
 * ou en flex. `max-width: none` pour la même raison : la feuille de WordPress
 * borne les enfants à la largeur de contenu.
 */

.wp-block-group.sb-l-episodes > *,
.wp-block-group.sb-s-accueil-une > *,
.wp-block-group.sb-s-apropos-tete > *,
.wp-block-group.sb-s-episode-tete > *,
.wp-block-group.sb-s-accueil-lecteur > *,
.wp-block-group.sb-s-episode-lecteur > * {
  margin-inline: 0;
  max-width: none;
  justify-self: stretch;
}

.sb-c-chapo, .sb-c-pitch, .sb-c-texte, .sb-c-mention { max-width: var(--wp--custom--colonne); }

/* ── LE LECTEUR COMPACT : une barre, pas une carte ─────────────────────── */
/*
 * Il doit tenir sur UNE ligne, quelle que soit la largeur. Sans `nowrap`, la
 * règle `flex-wrap: wrap` du téléphone s'applique aussi à lui et le bouton
 * de lecture passe en dessous : la barre occupait la moitié de l'écran.
 */

.sb-s-accueil-lecteur.est-compact,
.sb-s-episode-lecteur.est-compact {
  flex-wrap: nowrap;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1.5);
  padding: 10px 10px 10px 14px;
  min-height: 0;
}

.est-compact .sb-l-lecteur-corps { min-width: 0; }

.est-compact .sb-c-piste {
  margin: 0 0 4px;
  font-size: var(--wp--preset--font-size--legende);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.est-compact .sb-l-lecteur-piste { gap: calc(var(--wp--custom--rythme)); }
.est-compact .sb-c-temps, .est-compact .sb-l-lecteur-piste .sb-c-duree { font-size: 12px; }
.est-compact .sb-c-barre { height: 3px; }

/* La barre fixe recouvre la fin de la page : on lui fait sa place. */
body.a-lecteur-compact { padding-block-end: 96px; }

@media (prefers-reduced-motion: reduce) {
  .sb-s-accueil-lecteur, .sb-s-episode-lecteur { transition: none; }
}

/* ── LE TÉLÉPHONE, REPRIS ──────────────────────────────────────────────── */

@media (max-width: 60rem) {
  .sb-s-accueil-une, .sb-s-apropos-tete, .sb-s-episode-tete {
    padding-block: calc(var(--wp--custom--rythme) * 3) calc(var(--wp--custom--rythme) * 4);
  }

  /* Le symbole en filigrane déborde et brouille la pochette : on le coupe. */
  .sb-s-accueil-une::before { display: none; }

  .sb-s-accueil-une .sb-c-titre { font-size: clamp(32px, 9vw, 44px); }

  /* La fiche : la photo tient deux rangs, le reste suit en pleine largeur. */
  .sb-l-episodes {
    grid-template-columns: 56px minmax(0, 1fr);
    column-gap: calc(var(--wp--custom--rythme) * 1.75);
    row-gap: 2px;
    padding: calc(var(--wp--custom--rythme) * 2);
    align-items: start;
  }

  .sb-l-episodes .sb-c-invite,
  .sb-l-episodes .sb-c-invite img { width: 56px; height: 56px; }
  .sb-l-episodes .sb-c-invite { grid-column: 1; grid-row: 1 / span 2; }
  .sb-l-episodes .sb-c-rubrique { grid-column: 2; grid-row: 1; justify-self: start; }
  .sb-l-episodes .sb-c-titre { grid-column: 2; grid-row: 2; }
  .sb-l-episodes .sb-c-pitch { grid-column: 1 / -1; grid-row: 3; margin-block-start: calc(var(--wp--custom--rythme) * 1.5); }
  .sb-l-episodes .sb-c-fiche { grid-column: 1 / -1; grid-row: 4; }
  .sb-l-episodes .sb-c-duree {
    grid-column: 1; grid-row: 5;
    align-self: center;
    margin-block-start: calc(var(--wp--custom--rythme) * 1.5);
  }
  .sb-l-episodes .sb-c-ecouter {
    grid-column: 2; grid-row: 5;
    justify-self: end;
    margin-block-start: calc(var(--wp--custom--rythme) * 1.5);
  }

  /* Une fiche sans invité : la colonne de la photo disparaît. */
  .sb-l-episodes:not(:has(.sb-c-invite)) { grid-template-columns: minmax(0, 1fr); }
  .sb-l-episodes:not(:has(.sb-c-invite)) > * { grid-column: 1; }

  .sb-s-accueil-abonner, .sb-s-episode-abonner, .sb-s-apropos-appel {
    padding: calc(var(--wp--custom--rythme) * 4) calc(var(--wp--custom--rythme) * 2.5);
  }

  /* LA CARTE DE L'ÉPISODE GARDE SON RAPPORT À TOUTES LES LARGEURS.
   * Elle était carrée ici (72 × 72) du temps où elle portait la jaquette
   * de la marque. Elle porte maintenant la pochette de l'épisode, qui est
   * produite en 16:9 : une hauteur écrite recadrait de nouveau l'image.
   * Seule la LARGEUR change aux ruptures ; `aspect-ratio` fait le reste. */
  .sb-c-pochette, .sb-c-pochette img { width: 152px; }
  .est-compact .sb-c-pochette, .est-compact .sb-c-pochette img { width: 40px; height: 40px; }
  .sb-c-jouer { width: 52px; height: 52px; }
  .est-compact .sb-c-jouer { width: 40px; height: 40px; }
  .est-compact .sb-c-jouer svg { width: 16px; height: 16px; }

  .sb-l-pied { padding-block-end: calc(var(--wp--custom--rythme) * 14); }
}

@media (max-width: 30rem) {
  .sb-s-accueil-lecteur, .sb-s-episode-lecteur {
    gap: calc(var(--wp--custom--rythme) * 2);
    padding: calc(var(--wp--custom--rythme) * 2);
  }
  .sb-c-pochette, .sb-c-pochette img { width: 120px; }

  /* AU TÉLÉPHONE, LE TITRE PREND LA LARGEUR QUI RESTE — ET IL LUI EN FAUT.
   *
   * Trois colonnes — carte, titre, bouton — tiennent jusqu'à 480 px. En
   * dessous, la carte en prend 120 et le bouton 52 : mesuré à 320 px, il
   * restait 44 px au titre, soit « Mehdi, Universal / Fitness, / sa propre /
   * légende » sur cinq lignes.
   *
   * Le bouton monte donc d'un rang, à côté du surtitre, et le titre s'étend
   * jusqu'au bord. Le même titre tient alors sur 112 px à 320 px et 179 px à
   * 390 px — sans toucher ni à la carte ni à la hauteur du bloc. */
  .est-compact .sb-c-temps { display: none; }
  .est-compact .sb-l-lecteur-piste .sb-c-duree { display: none; }
}

/* ── L'EN-TÊTE RÉTRÉCIT QUAND ON DÉFILE ────────────────────────────────── */

.sb-l-entete {
  transition: padding 160ms ease;
}

.sb-l-entete .sb-c-marque::before { transition: width 160ms ease, height 160ms ease; }

.sb-l-entete.a-defile {
  padding-block: calc(var(--wp--custom--rythme) * 1.25);
}

.sb-l-entete.a-defile .sb-c-marque::before { width: 140px; height: 27px; }

@media (prefers-reduced-motion: reduce) {
  .sb-l-entete, .sb-l-entete .sb-c-marque::before { transition: none; }
}

/* ── LE LECTEUR EN GRAND, SUR TÉLÉPHONE ────────────────────────────────── */
/*
 * En colonne, il faisait 400 px de haut : pochette, textes, puis le bouton
 * centré tout en bas. Deux rangs valent mieux — la pochette et le bouton
 * encadrent le titre, la barre passe dessous sur toute la largeur.
 */

@media (max-width: 60rem) {
  .sb-s-accueil-lecteur, .sb-s-episode-lecteur {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    column-gap: calc(var(--wp--custom--rythme) * 2);
    row-gap: calc(var(--wp--custom--rythme) * 1.5);
    align-items: center;
  }

  .sb-s-accueil-lecteur .sb-c-pochette,
  .sb-s-episode-lecteur .sb-c-pochette { grid-column: 1; grid-row: 1 / span 2; }

  /* 🔴 LA BARRE N'A JAMAIS ÉTÉ UN ÉLÉMENT DE CETTE GRILLE — 24.10.2026.
   *
   * Le commentaire au-dessus annonce « la barre passe dessous sur toute la
   * largeur », et la règle `grid-column: 1 / -1` le dit aussi. Elle ne portait
   * sur rien : `lecteur.js` emboîte `.sb-l-lecteur-piste` DANS
   * `.sb-l-lecteur-corps`, et un placement de grille ne traverse pas un
   * parent. La barre vivait donc dans la colonne du milieu, et sa largeur
   * valait ce que la pochette et le bouton lui laissaient.
   *
   * Mesuré en ligne au téléphone : 11 px une fois la pochette passée en 16:9
   * (120 px au lieu de 72). Inutilisable — et déjà trop étroite avant, à
   * 59 px, sans que personne l'ait mesurée.
   *
   * `display: contents` rend les enfants du corps à la grille. Les placements
   * qui suivent disent alors ce qu'ils ont toujours prétendu dire.
   *
   * ⚠️ PAS SOUS LA FORME COMPACTE : la barre flottante du bas est un `flex`
   * d'une seule ligne, et lui rendre ces enfants-là casserait sa mise en
   * ligne. */
  .sb-s-accueil-lecteur:not(.est-compact) .sb-l-lecteur-corps,
  .sb-s-episode-lecteur:not(.est-compact) .sb-l-lecteur-corps {
    display: contents;
  }

  .sb-l-lecteur-piste { grid-column: 1 / -1; grid-row: 3; }
  .sb-c-jouer { grid-column: 3; grid-row: 2; }

  .sb-s-accueil-lecteur .sb-c-surtitre,
  .sb-s-episode-lecteur .sb-c-surtitre {
    grid-column: 2 / -1; grid-row: 1;
    font-size: 11px;
    margin-block-end: 4px;
  }

  /* Colonne 2 seule, et non « 2 / -1 » : le corps rendu à la grille, le
   * titre passerait SOUS le bouton de lecture qui occupe la colonne 3. */
  .sb-c-piste { grid-column: 2; grid-row: 2; margin-block-end: 0; font-size: var(--wp--preset--font-size--corps); }

  /* La forme compacte reprend la main : une seule ligne. */
  .sb-s-accueil-lecteur.est-compact,
  .sb-s-episode-lecteur.est-compact {
    display: flex;
  }
}

/* ── L'INTERLIGNE DES TITRES, POSÉ ICI ─────────────────────────────────── */
/*
 * `theme.json` le déclare dans `elements.h1`, et WordPress ne l'applique pas
 * à un titre qui porte une classe. Mesuré le 03.10.2026 : le titre de la une
 * s'affichait avec l'interligne du corps — deux lignes séparées par un vide
 * de la hauteur d'une troisième.
 */

.sb-c-titre, .sb-c-piste, .sb-c-modale__titre {
  line-height: var(--wp--custom--interligne-titre);
  letter-spacing: var(--wp--custom--interlettre-titre);
}

.sb-c-pitch, .sb-c-chapo, .sb-c-mention, .sb-c-texte { line-height: var(--wp--custom--interligne); }

/* ── LES COMMANDES S'ALIGNENT À GAUCHE ─────────────────────────────────── */
/*
 * `wp:buttons` se rend en flex et centre son contenu par défaut. Un appel à
 * l'action qui flotte au milieu d'une colonne de texte alignée à gauche ne
 * se lit pas comme la suite de la phrase.
 */

.sb-c-abonner, .sb-c-appel, .sb-c-voir, .sb-c-fiche, .sb-c-ecouter,
.sb-l-plateformes {
  justify-content: flex-start;
}

.sb-c-abonner .wp-block-button__link {
  min-height: 52px;
  padding-inline: calc(var(--wp--custom--rythme) * 3.5);
  border-radius: var(--wp--custom--rayon-rond);
  background: var(--end-plein);
  color: var(--end-plein-texte);
  font-weight: 700;
}

.sb-c-abonner .wp-block-button__link:hover { background: var(--end-plein-survol); }

/* La une : les deux commandes sur une ligne, le lien à côté du bouton. */
.sb-s-accueil-une .sb-c-abonner { margin-block-start: calc(var(--wp--custom--rythme) * 1); }
.sb-s-accueil-une .sb-c-voir { margin-block-start: calc(var(--wp--custom--rythme) * 2); }

/* ── LE FILIGRANE, PLUS DISCRET ────────────────────────────────────────── */
/*
 * À 5 % et posé derrière le titre, les deux arcs se lisaient comme des taches
 * grises. Il descend sous le texte et perd encore un peu d'encre.
 */

.sb-s-accueil-une::before {
  inset-block-start: auto;
  inset-block-end: -28%;
  inset-inline-start: -10%;
  width: 38%;
  opacity: 0.035;
}

@media (max-width: 60rem) { .sb-s-accueil-une::before { display: none; } }

/* ── LES ENFANTS DE LA UNE OCCUPENT LEUR COLONNE ───────────────────────── */
/*
 * Mesuré : le surtitre, le bouton et le lien se rétrécissaient à la largeur
 * de leur texte et se centraient dans la cellule, alors que `justify-self`
 * calculait bien `stretch` et que les marges étaient nulles. Le titre et le
 * paragraphe, eux, remplissaient la colonne.
 *
 * On ne cherche plus d'où vient le rétrécissement : on donne la largeur.
 * `width: 100%` sur un élément de grille est sans effet de bord ici — la
 * colonne est déjà bornée par `minmax(0, …fr)`.
 */



/* Le filigrane n'était plus qu'une tache grise. Il part. */
.sb-s-accueil-une::before { content: none; }

/* Le témoin du lecteur : une hauteur, sinon la bascule ne se déclenche pas. */
.end-l-lecteur-ancre { height: 1px; }

/* ── UNE FICHE SANS INVITÉ ─────────────────────────────────────────────── */
/*
 * Deux épisodes sur six sont des solos : pas d'invité, donc pas de photo.
 * La colonne de gauche disparaît — mais si on se contente de la retirer, la
 * durée et le bouton retombent dans la même cellule et se superposent.
 * Mesuré le 03.10.2026 : « 12:18 » s'affichait derrière le bouton de lecture.
 * Il faut donc REPLACER chaque enfant, pas seulement enlever une colonne.
 */


.sb-l-episodes:not(:has(.sb-c-invite)) {
  grid-template-columns: minmax(0, 1fr) auto;
}

.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-rubrique,
.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-titre,
.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-pitch,
.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-fiche { grid-column: 1 / -1; }

.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-rubrique { grid-row: 1; }
.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-titre    { grid-row: 2; }
.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-pitch    { grid-row: 3; }
.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-fiche    { grid-row: 4; }

.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-duree {
  grid-column: 1; grid-row: 5; justify-self: start; align-self: center;
}

.sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-ecouter {
  grid-column: 2; grid-row: 5; justify-self: end;
}

/* Sur grand écran, la fiche sans invité garde une seule ligne. */
@media (min-width: 60.01rem) {
  .sb-l-episodes:not(:has(.sb-c-invite)) {
    grid-template-columns: minmax(0, 1fr) auto auto;
  }
  .sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-rubrique,
  .sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-titre,
  .sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-pitch,
  .sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-fiche { grid-column: 1; }
  .sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-duree {
    grid-column: 2; grid-row: 1 / span 4; align-self: center;
  }
  .sb-l-episodes:not(:has(.sb-c-invite)) .sb-c-ecouter {
    grid-column: 3; grid-row: 1 / span 4; align-self: center;
  }
}

/*
/*
/* ── POURQUOI IL N'Y A PLUS DE RUSTINE D'ALIGNEMENT ICI ───────────────── */
/*
 * Pendant une heure, le 03.10.2026, cette feuille a porté des `width: 100%`
 * et des marges forcées pour empêcher chaque élément de se centrer dans sa
 * cellule de grille. Aucune ne traitait la cause.
 *
 * La cause : les groupes compilés portaient `"layout":{"type":"constrained"}`,
 * et WordPress en tire `margin-left: auto !important` sur tous leurs enfants.
 * Dans une grille, ces marges absorbent l'espace libre et centrent tout —
 * et `!important` les rend imbattables depuis une feuille.
 *
 * `tools/composer-entredonner.py` retire maintenant la contrainte des seules
 * sections qu'on dessine en grille. Les autres la gardent : c'est elle qui
 * tient la mesure de lecture.
 *
 * Si l'alignement repart de travers un jour, c'est là qu'il faut regarder,
 * pas ici.
 */

.sb-s-accueil-une::before { content: none; }

/* ── L'ALIGNEMENT, LÀ OÙ IL EST VOULU ──────────────────────────────────── */
/*
 * Par défaut, un élément de grille s'ÉTIRE dans sa cellule : c'est ce qu'il
 * faut pour un titre ou un paragraphe. `justify-self: start` le ferait au
 * contraire se rétrécir à son contenu — utile pour une pastille, néfaste
 * pour du texte. On ne le pose donc que sur ce qui est un objet.
 */

.sb-l-episodes > .sb-c-rubrique { justify-self: start; }
.sb-l-episodes > .sb-c-duree    { justify-self: start; }
.sb-l-episodes > .sb-c-ecouter  { justify-self: end; }
.sb-s-episode-tete > .sb-c-rubrique { justify-self: start; }

@media (max-width: 60rem) {
  .sb-l-episodes > .sb-c-duree { justify-self: start; }
  .sb-l-episodes > .sb-c-ecouter { justify-self: end; }
}

/* ── LES PLATEFORMES, AVEC LEURS VRAIES COULEURS ───────────────────────── */
/*
 * Les marques gardent leur couleur — c'est à ça qu'on les reconnaît d'un
 * coup d'œil, et c'est ce que demandent leurs chartes respectives. Le reste
 * de la ligne, lui, reste au dessin de la maison.
 *
 * ⚠️ Ces pictogrammes sont des REDESSINS simplifiés. Avant la mise en ligne,
 * chaque plateforme fournit ses propres fichiers de badge et impose des
 * règles d'usage — c'est là qu'il faudra les prendre.
 */

.sb-c-plateforme {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 2);
  min-height: 64px;
}

.sb-c-plateforme__icone { display: inline-flex; flex-shrink: 0; }
.sb-c-plateforme__icone svg { display: block; border-radius: 6px; }
.sb-c-plateforme__texte { display: flex; flex-direction: column; gap: 1px; min-width: 0; }

/* ── LA BARRE : TROIS COMMANDES, ET LE TITRE EN BULLE ──────────────────── */
/*
 * En barre, le titre complet ne tient pas et le tronquer n'apprend rien. Il
 * passe en bulle, au survol et au focus clavier — et au doigt, en touchant
 * la pochette. Les trois commandes prennent la place : précédent, lecture,
 * suivant.
 */

.sb-c-saut {
  display: none;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--wp--preset--color--encre);
  cursor: pointer;
}

.sb-c-saut:hover:not(:disabled) {
  background: color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
}
.sb-c-saut:disabled { opacity: 0.3; cursor: default; }

.est-compact .sb-c-saut { display: inline-flex; }
.est-compact .sb-c-piste { display: none; }

.sb-c-bulle {
  display: none;
  position: absolute;
  inset-block-end: calc(100% + 10px);
  inset-inline-start: 50%;
  transform: translateX(-50%);
  max-width: min(22rem, 80vw);
  padding: 8px 12px;
  border-radius: var(--wp--custom--rayon-petit);
  background: var(--wp--preset--color--encre);
  color: var(--wp--preset--color--papier);
  font-size: var(--wp--preset--font-size--legende);
  line-height: 1.35;
  text-align: center;
  box-shadow: 0 8px 22px rgba(10, 10, 10, 0.3);
  pointer-events: none;
}

.est-compact { position: fixed; }
.est-compact:hover .sb-c-bulle,
.est-compact:focus-within .sb-c-bulle,
.est-compact.montre-bulle .sb-c-bulle { display: block; }

/* En grand, le titre est écrit : la bulle n'a rien à dire. */
.sb-s-accueil-lecteur:not(.est-compact) .sb-c-bulle,
.sb-s-episode-lecteur:not(.est-compact) .sb-c-bulle { display: none; }

/* ── LE PIED, RANGÉ ────────────────────────────────────────────────────── */

.sb-l-pied-rang { gap: calc(var(--wp--custom--rythme) * 5); align-items: flex-start; }
.sb-l-pied-mot { max-width: 34ch; }

.sb-c-pied-marque::before {
  content: "";
  display: block;
  width: 150px; height: 42px;
  margin-block-end: calc(var(--wp--custom--rythme) * 2);
  background: var(--end-logo-verrou-horizontal) left center / contain no-repeat;
}

.sb-c-pied-marque { margin-block-end: calc(var(--wp--custom--rythme) * 2); }
.sb-c-pied-legal { color: var(--wp--preset--color--encre-douce); opacity: 0.8; }

.sb-l-pied-liens .wp-block-navigation__container {
  flex-direction: column;
  align-items: flex-start;
  gap: calc(var(--wp--custom--rythme) * 1.25);
}

/* ── MOINS D'AIR ───────────────────────────────────────────────────────── */
/*
 * Mesuré sur téléphone : entre un titre et son paragraphe, l'écart atteignait
 * 60 px — l'écart de bloc de WordPress (24) s'ajoutait aux marges propres de
 * chaque élément. L'écart global descend à 14 px, et les sections reprennent
 * la main sur leur rythme.
 */

.sb-s-accueil-une, .sb-s-apropos-tete, .sb-s-episode-tete {
  padding-block: calc(var(--wp--custom--rythme) * 6) calc(var(--wp--custom--rythme) * 4);
}

.sb-s-apropos-texte, .sb-s-apropos-pour-qui,
.sb-s-episode-notes, .sb-s-accueil-episodes {
  padding-block: calc(var(--wp--custom--rythme) * 3);
}

.sb-c-surtitre { margin-block-end: calc(var(--wp--custom--rythme) * 1.5); }
.sb-s-accueil-une .sb-c-titre { margin-block: 0 calc(var(--wp--custom--rythme) * 2); }
.sb-c-chapo { margin-block-end: calc(var(--wp--custom--rythme) * 3); }
.sb-c-texte p { margin-block: calc(var(--wp--custom--rythme) * 1.75); }

/* Les méta d'un épisode tiennent sur une ligne. */
.sb-c-meta {
  margin-block: calc(var(--wp--custom--rythme) * 1) calc(var(--wp--custom--rythme) * 2);
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}

/* ── LE NOM CACHÉ À L'ŒIL, PAS AU LECTEUR D'ÉCRAN ──────────────────────── */
/*
 * Le verrou du pied est une image de fond : elle ne porte aucun texte pour
 * une synthèse vocale. Le nom existe donc en clair dans le document, et
 * seule la vue le cache.
 */

.sb-c-vh {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.sb-c-pied-marque { position: relative; display: block; }
.sb-c-pied-marque::before { width: 190px; height: 38px; }

/* ── L'EN-TÊTE : UNE LIGNE, UN SEUL BOUTON ─────────────────────────────── */
/*
 * Trois pastilles bordées pesaient autant que le logo et passaient à la
 * ligne sur un téléphone — l'en-tête faisait 124 px de haut. Deux liens de
 * texte et UNE pastille suffisent : seul « s'abonner » est une action, le
 * reste est de la navigation. Tout tient sur une ligne, partout.
 */

.sb-l-entete { padding-block: calc(var(--wp--custom--rythme) * 2); }

.sb-l-entete-rang {
  flex-wrap: nowrap;
  gap: calc(var(--wp--custom--rythme) * 2);
}

/* La rangée est en `space-between` et porte TROIS enfants, donc la navigation
   se retrouvait suspendue au milieu — à 708 px sur une rangée de 112 à 1328.
   Une marge automatique avale tout l'espace libre avant que
   `justify-content` ne s'applique : la marque reste à gauche, les trois ronds
   viennent se ranger contre l'interrupteur de thème, séparés du seul `gap`.
   Demande du 22.10.2026.

   La marge est logique (`inline-start`), pas `left` : le jour où une version
   arabe arrive, le bloc bascule tout seul.

   ⚠️ LE SÉLECTEUR DOIT ÊTRE DESCENDANT, UNE SEULE CLASSE NE SUFFIT PAS.
   WordPress sert `.is-layout-flex > :is(*, div) { margin: 0 }`, et ce
   `:is(*, div)` n'est pas une maladresse : `:is()` prend la spécificité de
   son argument le plus fort, donc le `div` lui en donne (0,1,1) là où une
   classe seule plafonne à (0,1,0). `.sb-l-nav { margin-inline-start: auto }`
   perdait en silence — la règle était bien dans la feuille, la marge
   calculée valait 0. Mesuré par `CSS.getMatchedStylesForNode`, parce que la
   géométrie seule disait « rien n'a bougé » sans dire pourquoi. */
.sb-l-entete-rang > .sb-l-nav { margin-inline-start: auto; }

.sb-c-marque::before { width: 168px; height: 33px; }

.sb-l-nav .wp-block-navigation__container {
  flex-wrap: nowrap;
  align-items: center;
  justify-content: flex-end;
  gap: calc(var(--wp--custom--rythme) * 2.5);
}

/* ══ LES TROIS ONGLETS SONT DES RONDS, COMME L'INTERRUPTEUR DE THÈME ══════
   Demande du 21.10.2026. Trois mots côte à côte prenaient 175 px de la barre
   et obligeaient à deux paliers de rétrécissement de police ; trois ronds de
   40 px en prennent 136, quel que soit l'écran, et rien ne rapetisse.

   LE NOM N'EST PAS SUPPRIMÉ, IL EST DÉPLACÉ. C'est le `__label` lui-même qui
   devient l'infobulle — pas une chaîne recopiée dans le CSS, qu'un client ne
   pourrait plus corriger, et pas un `aria-label` qui doublerait le texte.
   Le mot reste donc le nom accessible du lien, et il reste éditable.

   ⚠️ `opacity` SEULE, JAMAIS `visibility: hidden` NI `display: none`. Les
   deux autres sortent l'élément de l'arbre d'accessibilité : le lien
   n'aurait alors plus aucun nom, et trois ronds muets se suivraient dans un
   lecteur d'écran. Une transparence, elle, ne retire rien à personne.

   L'INFOBULLE S'ANCRE SUR L'ONGLET, ET C'EST WORDPRESS QUI LE DÉCIDE.
   Le `__content` garde `position: static`, mais le `<li>` au-dessus porte
   `position: relative` — c'est le bloc de navigation du cœur qui le pose
   sur `.wp-block-navigation-item`. Le bloc contenant de l'infobulle est
   donc l'onglet, pas la rangée, et chaque nom tombe sous son propre rond.

   Un commentaire antérieur affirmait l'inverse — « ancrée sur la rangée » —
   et il était faux : vérifié le 22.10.2026 en remontant la chaîne des
   ancêtres positionnés. Ne remets pas `.sb-c-onglet` en `static` en croyant
   que ça ne change rien : les trois noms iraient se superposer au bord
   droit de la barre.

   Ça tient parce que les ronds sont maintenant à droite et que l'infobulle
   s'étend vers la gauche : les quinze positions — trois onglets × 320, 360,
   390, 430 et 1440 px — sont entièrement dans l'écran, mesurées au survol. */

.sb-l-nav { position: relative; }

/* ══ UNE SEULE ÉCHELLE POUR TOUTES LES PASTILLES DE L'EN-TÊTE ═══════════
   🔴 Mesuré en ligne le 24.10.2026 : l'interrupteur de thème n'a JAMAIS eu
   la taille des onglets, à aucune largeur.

       1440 px   onglets 42   interrupteur 40   (−2)
        430 px   onglets 38   interrupteur 40   (+2)
        390 px   onglets 38   interrupteur 30   (−8)

   Deux causes, et aucune n'est une faute de frappe. Les onglets étaient en
   `content-box` — 40 px de boîte PLUS 1 px de bordure de chaque côté font
   42 — quand le bouton, étant un `<button>`, héritait de `border-box` et
   faisait 40 tout compris. Et leurs paliers ne tombaient pas aux mêmes
   seuils : 34 rem et 22 rem d'un côté, 26 rem et 22 rem de l'autre.

   Un troisième défaut sortait du même désordre : la règle `max-width: 22rem`
   de l'interrupteur était écrite AVANT celle de 26 rem, donc perdait contre
   elle à 320 px. Du code mort qui se lisait comme un palier.

   D'où un jeton unique. Deux composants qui doivent avoir la même taille ne
   la déclarent pas chacun de leur côté : ils lisent la même variable, et la
   question ne peut plus se reposer.

   ⚠️ LES TAILLES MONTENT, ELLES NE DESCENDENT PAS. L'en-tête tenait au ras
   en août — d'où les paliers. Mesuré avant d'écrire : à 360 px, le plus
   serré des six, la rangée occupe 278 px sur 336 et laisse 58 px libres.
   Les 8 px que l'interrupteur regagne à 390 px y entrent sans rien pousser,
   et la cible tactile y gagne. Refaire la mesure avant d'y toucher. */
.sb-l-entete {
  --end-pastille: 42px;
  --end-pastille-icone: 20px;
}

@media (max-width: 34rem) { .sb-l-entete { --end-pastille: 38px; --end-pastille-icone: 18px; } }
@media (max-width: 22rem) { .sb-l-entete { --end-pastille: 36px; --end-pastille-icone: 17px; } }

.sb-l-nav .sb-c-onglet .wp-block-navigation-item__content {
  position: static;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  box-sizing: border-box;
  width: var(--end-pastille);
  height: var(--end-pastille);
  min-height: 0;
  padding: 0;
  border: 1px solid var(--wp--preset--color--filet);
  border-radius: var(--wp--custom--rayon-rond);
  color: var(--wp--preset--color--encre-douce);
  font-weight: 700;
  text-decoration: none;
  white-space: nowrap;
  transition: color 160ms ease, border-color 160ms ease, background 160ms ease;
}

/* L'icône est un MASQUE, pas une image : elle prend `currentColor` et suit
   donc le survol, l'état courant et le mode sombre sans qu'on redessine un
   seul fichier. */
.sb-l-nav .sb-c-onglet .wp-block-navigation-item__content::before {
  content: "";
  width: var(--end-pastille-icone);
  height: var(--end-pastille-icone);
  background: currentColor;
  -webkit-mask: var(--end-onglet-icone) center / contain no-repeat;
  mask: var(--end-onglet-icone) center / contain no-repeat;
}

/* Chaque onglet porte son dessin dans un jeton, et le `::before` s'en sert
   comme masque : la couleur vient donc du `currentColor` du lien, et les deux
   thèmes se renversent sans qu'aucun fichier ne soit dupliqué.

   ÉPISODES N'EST PAS UN MICRO. Il l'a été jusqu'au 22.10.2026, et c'était un
   contresens : le micro est l'outil de celui qui enregistre, alors que
   l'onglet mène à ce qu'on écoute. Une onde sonore dit l'audio sans désigner
   d'appareil, donc sans se tromper de personne. Le triangle de lecture a été
   écarté pour la même raison inverse — il promet de lancer un son, quand le
   lien ouvre une liste.

   À PROPOS EST UN « i » CERCLÉ, pas une silhouette. La silhouette désignait
   une personne ; la page parle du projet autant que de qui le porte.

   Le dessin ne porte aucun texte : le nom reste dans le `__label`, éditable
   dans l'administration. Une icône ne doit jamais être le seul endroit où un
   mot existe. */

.sb-l-nav .sb-c-onglet--accueil { --end-onglet-icone: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 10.6 12 3.2l9 7.4'/%3E%3Cpath d='M5.4 9.4V20.4h13.2V9.4'/%3E%3Cpath d='M9.8 20.4v-5.6h4.4v5.6'/%3E%3C/svg%3E"); }
.sb-l-nav .sb-c-onglet--episodes { --end-onglet-icone: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.6 10.2v3.6M8 6.8v10.4M12 4.2v15.6M16 6.8v10.4M20.4 10.2v3.6'/%3E%3C/svg%3E"); }
.sb-l-nav .sb-c-onglet--apropos { --end-onglet-icone: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11.2v5'/%3E%3Ccircle cx='12' cy='7.9' r='1' fill='%23000' stroke='none'/%3E%3C/svg%3E"); }

.sb-l-nav .sb-c-onglet .wp-block-navigation-item__content:hover,
.sb-l-nav .sb-c-onglet .wp-block-navigation-item__content:focus-visible {
  color: var(--wp--preset--color--turquoise-texte);
  border-color: var(--wp--preset--color--turquoise);
  background: color-mix(in srgb, var(--wp--preset--color--turquoise) 10%, transparent);
}

/* ── le nom, sous la barre ─────────────────────────────────────────────── */
.sb-l-nav .sb-c-onglet .wp-block-navigation-item__label {
  position: absolute;
  inset-block-start: calc(100% + 8px);
  inset-inline-end: 0;
  padding: 4px 10px;
  border-radius: var(--wp--custom--rayon-petit);
  background: var(--wp--preset--color--encre);
  color: var(--wp--preset--color--papier);
  font-family: var(--wp--preset--font-family--titre);
  font-size: 12px;
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: 0;
  text-decoration: none;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  transition: opacity 140ms ease;
}

.sb-l-nav .sb-c-onglet:hover .wp-block-navigation-item__label,
.sb-l-nav .sb-c-onglet .wp-block-navigation-item__content:focus-visible .wp-block-navigation-item__label {
  opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
  .sb-l-nav .sb-c-onglet .wp-block-navigation-item__content,
  .sb-l-nav .sb-c-onglet .wp-block-navigation-item__label { transition: none; }
}

/* Sous 26 rem, le verrou cède la place au seul symbole. */
@media (max-width: 34rem) {
  .sb-c-marque::before {
    width: 30px; height: 30px;
    background-image: var(--end-logo);
  }
  .sb-l-nav .wp-block-navigation__container { gap: calc(var(--wp--custom--rythme) * 1.75); }
}

/*
 * Un QUATRIÈME palier, sous 22 rem. Les paliers s'arrêtaient à 34 rem, et à
 * 320 px la rangée d'en-tête réclamait 328 : huit pixels de trop, et les huit
 * pages défilaient latéralement. Mesuré : la navigation partait à x=154 pour
 * 175 px de large, dont 28 de gouttières entre trois onglets.
 */
@media (max-width: 22rem) {
  .sb-l-entete-rang { gap: var(--wp--custom--rythme); }
  .sb-l-nav .wp-block-navigation__container { gap: var(--wp--custom--rythme); }
}

.sb-l-entete.a-defile { padding-block: calc(var(--wp--custom--rythme) * 1.25); }
.sb-l-entete.a-defile .sb-c-marque::before { width: 134px; height: 26px; }

@media (max-width: 34rem) {
  .sb-l-entete.a-defile .sb-c-marque::before { width: 26px; height: 26px; }
}

/* Le lecteur en grand, sur téléphone : le bouton se range à côté du texte
   au lieu de prendre un rang pour lui seul — le bloc perdait 60 px de haut. */
@media (max-width: 60rem) {
  .sb-s-accueil-lecteur .sb-c-jouer,
  .sb-s-episode-lecteur .sb-c-jouer { grid-column: 3; grid-row: 1 / span 2; align-self: center; }
  .sb-s-accueil-lecteur .sb-c-pochette,
  .sb-s-episode-lecteur .sb-c-pochette { grid-row: 1 / span 2; align-self: center; }
  .sb-l-lecteur-corps { grid-column: 2; grid-row: 1 / span 2; }
  .sb-l-lecteur-piste { grid-column: 1 / -1; grid-row: 3; }
}

/* ── ET SOUS 480 px, LE BOUTON REDESCEND ───────────────────────────────── */
/*
 * ⚠️ CE BLOC DOIT RESTER APRÈS CELUI DU DESSUS. Deux mises en page du même
 * lecteur ont été écrites à des moments différents, et celle du dessus — plus
 * tardive dans le fichier — gagne à spécificité égale. Un palier à 30 rem
 * placé plus haut ne s'appliquerait pas, et c'est exactement l'erreur faite
 * en l'écrivant le 24.10.2026.
 *
 * POURQUOI REDESCENDRE. Le bouton à côté du texte économise 60 px de hauteur,
 * et c'est juste tant qu'il reste de la place. Sous 480 px il n'y en a plus :
 * la carte prend 120 px, le bouton 52, les gouttières 32 — mesuré à 320 px, il
 * restait 44 px au titre, qui tombait sur cinq lignes.
 *
 * Le bouton va donc sur le rang de la barre, à sa droite, et le titre prend
 * toute la largeur qui reste : 112 px à 320 px, 179 px à 390 px. Le bloc est
 * même PLUS COURT qu'avant, parce que le rang du bouton n'existe plus. */
@media (max-width: 30rem) {
  .sb-s-accueil-lecteur .sb-c-jouer,
  .sb-s-episode-lecteur .sb-c-jouer { grid-column: 3; grid-row: 3; align-self: center; }
  .sb-s-accueil-lecteur .sb-l-lecteur-piste,
  .sb-s-episode-lecteur .sb-l-lecteur-piste { grid-column: 1 / 3; grid-row: 3; }
  .sb-s-accueil-lecteur .sb-c-surtitre,
  .sb-s-episode-lecteur .sb-c-surtitre { grid-column: 2; grid-row: 1; }
  .sb-s-accueil-lecteur .sb-c-piste,
  .sb-s-episode-lecteur .sb-c-piste { grid-column: 2 / -1; grid-row: 2; }

  /* La vitesse monte à la place que le bouton libère, en haut à droite. Sur
     un rang à elle, elle coûtait 78 px de hauteur pour une pastille de 32. */
  .sb-s-accueil-lecteur .sb-c-vitesse,
  .sb-s-episode-lecteur .sb-c-vitesse { grid-column: 3; grid-row: 1; justify-self: end; }
}

/* ── LE MENU COLLE, SANS ATTENDRE LE SCRIPT ────────────────────────────── */
/*
 * `position: sticky` était posé par la classe `est-collant`, ajoutée en
 * JavaScript. Rien ne justifiait d'attendre : coller est un comportement de
 * mise en page, pas de script. Le script ne garde que le filet au défilement.
 */



/* ── LES LIGNES DE LA MODALE S'ALIGNENT À GAUCHE ───────────────────────── */
/*
 * Un reste de la première version, où la ligne était une colonne :
 * `justify-content: center` y centrait verticalement. En rangée, il centrait
 * l'icône et le texte au milieu de la ligne.
 */

.sb-c-plateforme {
  justify-content: flex-start;
  gap: calc(var(--wp--custom--rythme) * 2);
  padding: calc(var(--wp--custom--rythme) * 1.5) calc(var(--wp--custom--rythme) * 2);
  min-height: 60px;
}

.sb-c-plateforme__texte { align-items: flex-start; text-align: start; }
.sb-c-plateforme__nom { font-size: var(--wp--preset--font-size--corps); }

.sb-c-modale__corps { padding: calc(var(--wp--custom--rythme) * 4) calc(var(--wp--custom--rythme) * 3); }
.sb-c-modale__titre { margin-block: calc(var(--wp--custom--rythme) * 1) calc(var(--wp--custom--rythme) * 0.75); }
.sb-c-modale__chapo { margin-block-end: calc(var(--wp--custom--rythme) * 2.5); }
.sb-l-plateformes--modale { gap: calc(var(--wp--custom--rythme)); }

.sb-c-modale__fermer {
  inset-block-start: calc(var(--wp--custom--rythme) * 1.5);
  inset-inline-end: calc(var(--wp--custom--rythme) * 1.5);
  border: 1.5px solid var(--wp--preset--color--filet);
}

/* ── LA BULLE, RECENTRÉE SUR LA BARRE ──────────────────────────────────── */

.sb-c-bulle {
  inset-inline: calc(var(--wp--custom--rythme) * 2);
  transform: none;
  max-width: none;
}

/* ── LE TEXTE COURANT EST JUSTIFIÉ ─────────────────────────────────────── */
/*
 * Avec césure automatique, sans quoi le français justifié creuse des rivières
 * de blanc entre les mots — c'est la langue qui a les mots les plus longs des
 * trois que ce site pourrait parler. `text-wrap: pretty` évite en plus de
 * laisser un mot seul sur la dernière ligne, là où le navigateur le sait.
 *
 * Seul le texte COURANT est justifié. Les titres, les légendes et tout ce qui
 * tient sur deux lignes restent au fer à gauche : justifier trois mots ne
 * fait qu'écarter trois mots.
 */

.sb-c-texte,
.sb-c-texte p,
.sb-c-chapo {
  text-align: justify;
  hyphens: manual;
  -webkit-hyphens: manual;
  text-wrap: pretty;
}

.sb-c-pitch, .sb-c-mention { text-wrap: pretty; }

@media (max-width: 30rem) {
  /* Sous 30 rem, une ligne porte trop peu de mots pour que la justification
     reste propre : on revient au fer à gauche. */
  .sb-c-texte, .sb-c-texte p, .sb-c-chapo { text-align: start; }
}

/* ⚠️ CE SEUIL MESURE L'ÉCRAN, PAS LA COLONNE — et c'est la colonne qui
   décide. Les trois fiches « Pour qui » font 190 px de large sur un écran
   de 1440 : la règle ci-dessus ne les voit pas, et leur texte justifié
   écarte les mots jusqu'à la rivière blanche. Mesuré le 23.10.2026.

   Elles reviennent donc au fer à gauche quelle que soit la largeur de
   l'écran. Le vrai correctif est une requête de conteneur sur la mesure
   réelle de chaque colonne ; il vaut pour tout le site et il est noté
   dans CE-QUE-LE-PROCESSUS-APPREND.md. */
.sb-l-publics .sb-c-texte,
.sb-l-publics .sb-c-texte p,
.sb-l-publics p {
  text-align: start;
  hyphens: manual;
}

/* ── LA PAGE OÙ L'ON EST SE VOIT DANS LE MENU ──────────────────────────── */
/*
 * WordPress pose `current-menu-item` au rendu. La navigation sans
 * rechargement, elle, pose `aria-current="page"` — qui est de toute façon ce
 * qu'une synthèse vocale annonce. Les deux mènent au même dessin : un trait
 * sous l'onglet, et l'encre pleine au lieu du gris.
 */

/* La page courante : le rond se remplit. Le soulignement qui marquait le
   mot n'a plus de mot à souligner, et un rond plein se repère d'un coup
   d'œil dans une rangée de ronds vides. */
.sb-l-nav .current-menu-item > .wp-block-navigation-item__content,
.sb-l-nav .wp-block-navigation-item__content[aria-current="page"] {
  color: var(--end-plein-texte);
  background: var(--end-plein);
  border-color: var(--end-plein);
  text-decoration: none;
}

.sb-l-nav .current-menu-item > .wp-block-navigation-item__content:hover,
.sb-l-nav .wp-block-navigation-item__content[aria-current="page"]:hover {
  color: var(--end-plein-texte);
  background: var(--end-plein);
  border-color: var(--end-plein);
}

.sb-l-pied-liens .current-menu-item > .wp-block-navigation-item__content,
.sb-l-pied-liens .wp-block-navigation-item__content[aria-current="page"] {
  color: var(--wp--preset--color--encre);
  font-weight: 700;
}

/* ── LE MENU COLLE — SUR LE BON ÉLÉMENT ────────────────────────────────── */
/*
 * `position: sticky` était posé sur `.sb-l-entete`, qui vit à l'intérieur du
 * `<header class="wp-block-template-part">`. Or un élément collant ne sort
 * jamais de son bloc conteneur, et ce `<header>` ne fait que la hauteur de
 * la barre : il n'y avait littéralement aucune place où coller.
 *
 * Mesuré le 03.10.2026 : parent de 72 px, page de 2637 px.
 */

header.wp-block-template-part {
  position: sticky;
  inset-block-start: 0;
  z-index: 50;
  background: var(--wp--preset--color--papier);
}

/* ── LE MOT EST ÉCRIT, PAS DESSINÉ ─────────────────────────────────────── */
/*
 * Le verrou en image de fond rendait le mot à 33 px de haut : lisible à la
 * loupe, pas à l'écran. Le symbole reste une image, le mot redevient du
 * TEXTE — il se met à l'échelle, il se sélectionne, et il se lit.
 */

.sb-c-marque::before {
  width: 30px;
  height: 30px;
  background-image: var(--end-logo);
}

.sb-c-marque .wp-block-site-title {
  display: block;
  margin: 0;
}

/* ══ TOUTE LA MARQUE MÈNE À L'ACCUEIL, SYMBOLE COMPRIS ═══════════════════
   Demande du 21.10.2026. Le symbole est un `::before` posé sur le GROUPE ;
   le lien, lui, ne porte que le mot. Cliquer sur le symbole ne faisait donc
   rien, ce que personne ne devine — un logo en haut à gauche est un lien
   depuis trente ans.

   Le lien s'ÉTIRE sur le groupe plutôt que de déménager le symbole dans le
   `<a>`. Déménager aurait cassé le palier de 21 rem, où c'est le titre de
   site qu'on masque : le symbole serait parti avec lui.

   UN SEUL LIEN, PAS DEUX. Ajouter un second lien vers l'accueil aurait donné
   deux entrées identiques à la suite dans la liste des liens d'un lecteur
   d'écran. */
.sb-c-marque { position: relative; }

.sb-c-marque .wp-block-site-title a::after {
  content: "";
  position: absolute;
  inset: 0;
}

.sb-c-marque .wp-block-site-title a {
  font-family: var(--wp--preset--font-family--titre);
  font-weight: 700;
  font-size: calc(var(--wp--preset--font-size--titre-fiche) + 4px);
  letter-spacing: var(--wp--custom--interlettre-titre);
  color: var(--wp--preset--color--encre);
  text-decoration: none;
}

.sb-l-entete.a-defile .sb-c-marque::before { width: 26px; height: 26px; }
.sb-l-entete.a-defile .sb-c-marque .wp-block-site-title a { font-size: var(--wp--preset--font-size--titre-fiche); }

@media (max-width: 30rem) {
  .sb-c-marque .wp-block-site-title a { font-size: var(--wp--preset--font-size--titre-fiche); }
}

/* ── LE PIED PORTE LE VERROU, LUI ──────────────────────────────────────── */
.sb-c-pied-marque::before { width: 210px; height: 41px; }

/* ── UNE GRILLE ÉDITORIALE POUR LES PAGES DE TEXTE ─────────────────────── */
/*
 * Sur grand écran, le titre d'une section se posait au milieu de la page et
 * son texte plus loin encore : la mesure de lecture était bien tenue, mais
 * elle flottait. Le titre prend maintenant la colonne de gauche, le texte la
 * colonne de lecture, et les deux s'alignent sur la même grille que le reste.
 */

@media (min-width: 60.01rem) {
  .sb-s-apropos-texte,
  .sb-s-apropos-pour-qui,
  .sb-s-episode-notes {
    display: grid;
    grid-template-columns: minmax(0, 15rem) minmax(0, 40rem) minmax(0, 1fr);
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: start;
  }

  .sb-s-apropos-texte > .sb-c-titre,
  .sb-s-apropos-pour-qui > .sb-c-titre,
  .sb-s-episode-notes > .sb-c-titre,
  .sb-s-episode-notes > .sb-c-titre-liens { grid-column: 1; }

  .sb-s-apropos-texte > .sb-c-texte,
  .sb-s-apropos-pour-qui > .sb-c-texte,
  .sb-s-episode-notes > .sb-c-texte,
  .sb-s-episode-notes > .sb-l-liens { grid-column: 2; }

  .sb-s-episode-notes > .sb-c-titre-liens { grid-row: 2; margin-block-start: calc(var(--wp--custom--rythme) * 4); }
  .sb-s-episode-notes > .sb-l-liens { grid-row: 2; margin-block-start: calc(var(--wp--custom--rythme) * 4); }
}


/* ── LE HAUT DE PAGE SE SÉPARE DE LA LISTE ─────────────────────────────────
   Il manquait une frontière : le lecteur et la première fiche se touchaient,
   et l'œil lisait une seule coulée. Un filet pleine largeur plutôt qu'un
   titre plus gros — la séparation est structurelle, pas typographique, et
   elle doit se sentir sans se voir.

   Le filet s'efface vers ses extrémités : une ligne franche d'un bord à
   l'autre aurait coupé la page en deux au lieu de l'articuler. */
.sb-s-accueil-episodes {
  margin-block-start: calc(var(--wp--custom--rythme) * 7);
  padding-block-start: calc(var(--wp--custom--rythme) * 6);
  position: relative;
}

.sb-s-accueil-episodes::before {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  height: 1px;
  background: linear-gradient(
    to right,
    transparent,
    var(--wp--preset--color--filet) 18%,
    var(--wp--preset--color--filet) 82%,
    transparent
  );
}

/* Sur la page qui ne porte QUE la liste, il n'y a rien à séparer. */
.sb-s-accueil-episodes:first-child {
  margin-block-start: 0;
  padding-block-start: 0;
}

.sb-s-accueil-episodes:first-child::before { content: none; }

/* ── LE FIL D'ARIANE ───────────────────────────────────────────────────────
   Une fiche d'épisode était une impasse : le menu ramène à l'accueil, jamais
   à la liste d'où l'on vient. */
/* LE COMPILATEUR REND UN BOUTON, PAS UN LIEN — c'est sa règle, et elle est
   bonne : un `<a>` isolé dans une section devient un `wp:button` pour que le
   client puisse l'éditer. Un fil d'Ariane ne doit pourtant pas peser comme un
   appel à l'action : on lui retire son fond, son contour et son remplissage,
   et on ne garde que le lien. */
.sb-s-episode-fil {
  margin-block-end: calc(var(--wp--custom--rythme) * 2);
  font-size: var(--wp--preset--font-size--legende);
}

.sb-s-episode-fil .sb-c-retour .wp-block-button__link,
.sb-l-fil .sb-c-retour {
  display: inline-flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 0.75);
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  font-family: var(--wp--preset--font-family--texte);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 400;
  color: var(--wp--preset--color--encre-douce);
  text-decoration: none;
}

/* La flèche est décorative et tenue hors du texte : un lecteur d'écran
   annonce « Tous les épisodes », pas « flèche gauche ». */
.sb-s-episode-fil .sb-c-retour .wp-block-button__link::before,
.sb-l-fil .sb-c-retour::before {
  content: "\2190";
  font-size: 1.1em;
  line-height: 1;
}

.sb-s-episode-fil .sb-c-retour .wp-block-button__link:hover,
.sb-s-episode-fil .sb-c-retour .wp-block-button__link:focus-visible,
.sb-l-fil .sb-c-retour:hover,
.sb-l-fil .sb-c-retour:focus-visible {
  color: var(--wp--preset--color--encre);
  text-decoration: underline;
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA PAGE « À PROPOS » TIENT SUR UNE SEULE GRILLE
   ───────────────────────────────────────────────────────────────────────────
   Elle n'en avait aucune, et ça se mesurait. Relevé le 03.10.2026 sur un
   écran de 1440 px :

     · le chapeau finissait à y=307, la section à y=506 — DEUX CENTS PIXELS
       de vide sous le texte, parce que le portrait était centré et plus haut
       que ce qu'il accompagnait ;
     · le titre commençait à x=112, le corps du texte à x=400. Deux
       alignements sur la même page, à 288 px l'un de l'autre ;
     · le premier bloc de texte n'avait pas d'intertitre là où « Pour qui »
       en avait un : la colonne de gauche était vide, et le texte semblait
       poussé au milieu de nulle part.

   La réponse n'est pas de déplacer des marges une à une. C'est UNE grille,
   la même du haut en bas : un rail d'intertitres, une colonne de lecture, et
   le portrait dans la troisième. Tout s'aligne alors sur deux verticales, et
   il n'y a plus de trou parce que plus rien n'est centré sur rien.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 60.01rem) {

  .sb-s-apropos-tete,
  .sb-s-apropos-texte,
  .sb-s-apropos-pour-qui,
  .sb-s-apropos-appel {
    display: grid;
    grid-template-columns: minmax(0, 14rem) minmax(0, 38rem) minmax(0, 1fr);
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: start;
  }

  /* ── le haut de page ──────────────────────────────────────────────────── */

  /* LE HAUT DE PAGE, TROISIÈME VERSION — et les deux premières étaient
     fausses pour la même raison : le portrait vivait dans une colonne à lui,
     à l'autre bout de la page.

     Mesuré sur 1440 px : la colonne de lecture s'arrêtait à x=1032, le
     portrait commençait à x=1088 et finissait à 1328. Un rond de 240 px
     isolé contre le bord droit, et une bande vide entre les deux. Rien dans
     la mise en page ne les reliait.

     Le portrait est maintenant COLLÉ à la colonne de lecture, aligné sur le
     haut du titre, et plus petit. La hauteur du bloc est celle de son texte,
     pas celle d'une image. */
  /* ⚠️ TROIS RANGÉES DÉCLARÉES, PAS DEUX. Le bloc en a quatre enfants :
     surtitre, titre, chapeau ET la ligne de mention. La quatrième tombait
     dans une rangée IMPLICITE, que le portrait ne couvrait pas — il
     s'arrêtait à 312 px quand le texte descendait à 355. Mesuré le
     21.10.2026 sur 1440 px.

     `grid-row: 1 / -1` ne règle pas ça : la ligne `-1` est la dernière
     ligne EXPLICITE, donc une rangée implicite reste dehors. Il faut les
     déclarer. */
  .sb-s-apropos-tete {
    padding-block: calc(var(--wp--custom--rythme) * 6) calc(var(--wp--custom--rythme) * 2);
    grid-template-columns: minmax(0, 14rem) minmax(0, 34rem) auto minmax(0, 1fr);
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    grid-template-rows: auto auto auto;
    row-gap: 0;
  }

  .sb-s-apropos-tete > .sb-c-surtitre {
    grid-column: 1; grid-row: 1;
    margin: 0;
    padding-block-start: calc(var(--wp--custom--rythme) * 1.5);
  }

  .sb-s-apropos-tete > .sb-c-titre { grid-column: 2; grid-row: 1; margin-block: 0; }

  /* Le rythme du haut de page est le SEUL à être serré : c'est le prix pour
     que la colonne de texte tienne dans la hauteur du rond. 71 + 12 + 29 +
     12 + 23 = 147 px pour un portrait de 192 — il reste de quoi encaisser
     une troisième ligne de titre sans dépasser. */
  .sb-s-apropos-tete > .sb-c-chapo {
    grid-column: 2; grid-row: 2;
    margin-block: calc(var(--wp--custom--rythme) * 1.5) 0;
    font-size: var(--wp--preset--font-size--titre-fiche);
    color: var(--wp--preset--color--encre-douce);
  }

  .sb-s-apropos-tete > .sb-c-meta {
    grid-column: 2; grid-row: 3;
    margin-block: calc(var(--wp--custom--rythme) * 1.5) 0;
  }

  /* Colonne 3 : juste après le texte, pas au bord. Les deux rangées, pour que
     le rond s'étende sur le titre ET le chapeau sans allonger ni l'un ni
     l'autre. */
  .sb-s-apropos-tete > .sb-c-portrait {
    grid-column: 3; grid-row: 1 / span 3;
    align-self: start;
    justify-self: start;
    width: 12rem;
    margin: 0;
  }

  /* ── les sections de texte ────────────────────────────────────────────── */

  .sb-s-apropos-texte,
  .sb-s-apropos-pour-qui {
    padding-block: calc(var(--wp--custom--rythme) * 4);
  }

  .sb-s-apropos-texte > .sb-c-titre,
  .sb-s-apropos-pour-qui > .sb-c-titre {
    grid-column: 1; grid-row: 1;
    margin: 0;
    padding-block-start: calc(var(--wp--custom--rythme) * 0.5);
    font-size: var(--wp--preset--font-size--titre-fiche);
  }

  .sb-s-apropos-texte > .sb-c-texte,
  .sb-s-apropos-pour-qui > .sb-c-texte {
    grid-column: 2; grid-row: 1;
    max-width: none;
  }

  /* Un filet entre les sections, repris de celui qui sépare le haut de
     l'accueil de sa liste : la page a maintenant un rythme, et il se voit
     sans qu'on ait à le lire. */
  .sb-s-apropos-pour-qui { position: relative; }

  .sb-s-apropos-pour-qui::before {
    content: "";
    position: absolute;
    inset-block-start: 0;
    inset-inline: 0 25%;
    height: 1px;
    background: var(--wp--preset--color--filet);
  }

  /* ── l'appel, sur les deux mêmes colonnes ─────────────────────────────── */

  /* L'encadré héritait du centrage des deux autres appels. Sur cette
     page-ci il doit suivre la même grille que tout le reste, sinon il
     redevient le bloc flottant qu'on cherchait à faire disparaître. */
  .sb-s-apropos-appel,
  .sb-s-apropos-appel > * { text-align: start; }

  .sb-s-apropos-appel > .sb-c-surtitre {
    grid-column: 1; grid-row: 1;
    margin: 0;
    padding-block-start: calc(var(--wp--custom--rythme) * 0.5);
  }

  .sb-s-apropos-appel > .sb-c-titre { grid-column: 2; grid-row: 1; margin-block: 0; }
  .sb-s-apropos-appel > .sb-c-chapo {
    grid-column: 2; grid-row: 2;
    margin-block: calc(var(--wp--custom--rythme) * 1.5) 0;
    max-width: none;
  }
  .sb-s-apropos-appel > .sb-c-appel {
    grid-column: 2; grid-row: 3;
    margin-block-start: calc(var(--wp--custom--rythme) * 2.5);
  }
}


/* ═══════════════════════════════════════════════════════════════════════════
   LA BARRE DE RECHERCHE, ET LES QUATRE PAGES LÉGALES
   ═══════════════════════════════════════════════════════════════════════════ */

.sb-l-chercher {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1.5);
  margin-block: calc(var(--wp--custom--rythme) * 2) calc(var(--wp--custom--rythme) * 3);
}

.sb-l-chercher .sb-c-champ { flex: 1 1 18rem; min-width: 0; }

.sb-l-chercher input[type="search"] {
  width: 100%;
  padding: calc(var(--wp--custom--rythme) * 1.25) calc(var(--wp--custom--rythme) * 2);
  border: 1.5px solid var(--wp--preset--color--filet);
  border-radius: var(--wp--custom--rayon-rond);
  background: var(--wp--preset--color--carte);
  font-family: var(--wp--preset--font-family--texte);
  font-size: var(--wp--preset--font-size--corps);
  color: var(--wp--preset--color--encre);
}

.sb-l-chercher input[type="search"]::placeholder { color: var(--wp--preset--color--encre-douce); }

.sb-l-chercher input[type="search"]:focus-visible {
  outline: 2px solid var(--wp--preset--color--turquoise-texte);
  outline-offset: 2px;
  border-color: transparent;
}

.sb-l-filtres { display: flex; flex-wrap: wrap; gap: calc(var(--wp--custom--rythme)); }

.sb-c-filtre {
  padding: calc(var(--wp--custom--rythme) * 0.875) calc(var(--wp--custom--rythme) * 1.75);
  border: 1.5px solid var(--wp--preset--color--filet);
  border-radius: var(--wp--custom--rayon-rond);
  background: transparent;
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 600;
  color: var(--wp--preset--color--encre-douce);
  cursor: pointer;
}

.sb-c-filtre:hover { border-color: var(--wp--preset--color--encre-douce); color: var(--wp--preset--color--encre); }

/* L'ÉTAT ACTIF NE TIENT PAS QU'À LA COULEUR, et il n'y tient pas davantage
   depuis qu'il a quitté l'encre pour l'aplat de la maison, le 23.10.2026 :
   c'est l'ÉCART DE CLARTÉ qui porte l'information, pas la teinte. Blanc sur
   l'aplat mesure 5,89, et l'aplat sur le papier 4,77 — la pastille active
   reste donc sombre au milieu de pastilles claires, y compris en niveaux de
   gris et pour qui ne voit pas le turquoise. */
.sb-c-filtre.est-actif {
  border-color: var(--end-plein);
  background: var(--end-plein);
  color: var(--end-plein-texte);
}

.sb-c-filtre--ordre { margin-inline-start: auto; }

.sb-c-bilan {
  flex: 1 0 100%;
  margin: 0;
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}

.sb-c-bilan:empty { display: none; }

/* Une fiche masquée par un filtre : `hidden` suffit, encore faut-il que la
   grille ne la réaffiche pas. `display: grid` sur `.sb-l-episodes` écrase
   `hidden`, qui ne vaut que `display: none` par défaut. */
.sb-l-episodes[hidden] { display: none; }

/*
 * LES MARGES AUTOMATIQUES DE WORDPRESS, SUR LES QUATRE PAGES LÉGALES
 * ───────────────────────────────────────────────────────────────────────────
 * `!important` n'est pas une facilité ici, c'est la seule issue : la feuille
 * de WordPress écrit `margin-left: auto !important` sur les enfants de TOUT
 * groupe `is-layout-constrained`, et le compilateur pose cette classe. Sans
 * la contrer, chaque enfant est centré dans sa cellule, et un intertitre se
 * dessine à la largeur de son texte — mesuré à 119 px pour « Article 1 ·
 * Accès » dans une colonne de 784.
 *
 * La règle vaut à TOUTES les largeurs, pas seulement en grille : entre 640 et
 * 960 px, les intertitres tombaient à x=45 et leurs paragraphes à x=130, parce
 * que seuls les seconds portent une mesure de lecture. Quatre-vingt-cinq pixels
 * de décalage entre un titre et le texte qu'il annonce.
 */
.wp-block-group.sb-s-legal > *,
.wp-block-group.sb-s-cgu > *,
.wp-block-group.sb-s-donnees-personnelles > *,
.wp-block-group.sb-s-cookies > * { margin-inline: 0 !important; }

@media (min-width: 60.01rem) {
  /* Les pages légales suivent le même rail que « À propos » : un texte de
     loi qui flotte au milieu d'une page sans repère se lit deux fois moins
     bien, et on vient de le corriger ailleurs. */
  .sb-s-legal,
  .sb-s-cgu,
  .sb-s-donnees-personnelles,
  .sb-s-cookies {
    display: grid;
    grid-template-columns: minmax(0, 14rem) minmax(0, 38rem) minmax(0, 1fr);
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: start;
    padding-block: calc(var(--wp--custom--rythme) * 7) calc(var(--wp--custom--rythme) * 5);
  }

  /*
   * Le compilateur NUMÉROTE une classe dès qu'un même nom revient dans la
   * page : `sb-c-titre-1`, `sb-c-texte-2`, jusqu'à `-17` sur les CGU. Viser
   * `> .sb-c-titre` et `> .sb-c-texte` ne plaçait donc que le `h1`, et les
   * vingt autres enfants tombaient en placement automatique — articles et
   * textes dans des colonnes différentes, le corps à 208 px de large dans
   * 1040 px disponibles. Quatre pages illisibles au-dessus de 960 px.
   *
   * On place donc TOUS les enfants, comme la une le fait déjà
   * (`.sb-s-accueil-une > *`), et on ne remonte dans le rail que les trois
   * éléments d'en-tête, qui eux portent un nom unique. Une règle écrite
   * sur un nom numéroté se périmerait à la prochaine compilation.
   *
   * `.wp-block-group` en tête : la feuille de WordPress centre et borne les
   * enfants d'un groupe `is-layout-constrained`, et il faut la battre.
   */
  .wp-block-group.sb-s-legal > *,
  .wp-block-group.sb-s-cgu > *,
  .wp-block-group.sb-s-donnees-personnelles > *,
  .wp-block-group.sb-s-cookies > * {
    grid-column: 2;
    max-width: none;
    justify-self: stretch;
  }

  .wp-block-group.sb-s-legal > .sb-c-surtitre,
  .wp-block-group.sb-s-cgu > .sb-c-surtitre,
  .wp-block-group.sb-s-donnees-personnelles > .sb-c-surtitre,
  .wp-block-group.sb-s-cookies > .sb-c-surtitre {
    grid-column: 1; grid-row: 1;
  }

  .wp-block-group.sb-s-legal > .sb-c-titre,
  .wp-block-group.sb-s-cgu > .sb-c-titre,
  .wp-block-group.sb-s-donnees-personnelles > .sb-c-titre,
  .wp-block-group.sb-s-cookies > .sb-c-titre {
    grid-column: 1; grid-row: 2;
    margin-block: 0;
    font-size: var(--wp--preset--font-size--titre-section);
  }

  .wp-block-group.sb-s-legal > .sb-c-maj,
  .wp-block-group.sb-s-cgu > .sb-c-maj,
  .wp-block-group.sb-s-donnees-personnelles > .sb-c-maj,
  .wp-block-group.sb-s-cookies > .sb-c-maj {
    grid-column: 1; grid-row: 3;
    margin-block-start: calc(var(--wp--custom--rythme) * 1.5);
  }
}

/* Les intertitres d'une page légale. Ils structurent un texte long, et sans
   eux les quatre pages redeviennent le pavé qu'on vient de découper.
   Le compilateur les pose en enfants DIRECTS de la section, pas dans un
   `.sb-c-texte` : `.sb-c-texte h2` ne les atteignait pas. Le sélecteur par
   préfixe prend la série numérotée sans l'énumérer. */
.sb-c-texte h2,
.sb-s-legal > [class*="sb-c-titre-"],
.sb-s-cgu > [class*="sb-c-titre-"],
.sb-s-donnees-personnelles > [class*="sb-c-titre-"],
.sb-s-cookies > [class*="sb-c-titre-"] {
  margin-block: calc(var(--wp--custom--rythme) * 4) calc(var(--wp--custom--rythme) * 1.5);
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--titre-fiche);
  font-weight: 700;
  letter-spacing: var(--wp--custom--interlettre-titre);
}

.sb-c-texte h2:first-child { margin-block-start: 0; }

/* Même raison : la mesure de lecture doit valoir aussi pour les paragraphes
   numérotés, sinon le téléphone et la tablette les rendent pleine largeur. */
.sb-s-legal > [class*="sb-c-texte"],
.sb-s-cgu > [class*="sb-c-texte"],
.sb-s-donnees-personnelles > [class*="sb-c-texte"],
.sb-s-cookies > [class*="sb-c-texte"] { max-width: var(--wp--custom--colonne); }

/* ═══════════════════════════════════════════════════════════════════════════
   LES PLATEFORMES, DANS LA PAGE
   ───────────────────────────────────────────────────────────────────────────
   Deux formes du même bloc, et la différence n'est pas décorative :

     · `--rangee`, au-dessus de la ligne de flottaison, pour reconnaître un
       logo et cliquer. Pas de sous-titre : il n'y a rien à expliquer là ;
     · la forme pleine, en bas de page, où il reste de la place pour dire à
       quoi sert chaque plateforme.

   Les logos gardent LEURS couleurs. Un Spotify repeint en turquoise n'est
   plus reconnu, et c'est la reconnaissance qui fait le clic.
   ═══════════════════════════════════════════════════════════════════════════ */

.sb-l-plateformes {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: var(--wp--custom--gouttiere);
  margin: calc(var(--wp--custom--rythme) * 3) 0 0;
  padding: 0;
  list-style: none;
}

.sb-c-plateforme {
  display: flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1.5);
  padding: calc(var(--wp--custom--rythme) * 1.75) calc(var(--wp--custom--rythme) * 2);
  border: 1.5px solid var(--wp--preset--color--filet);
  border-radius: var(--wp--custom--rayon);
  background: var(--wp--preset--color--carte);
  text-decoration: none;
  color: var(--wp--preset--color--encre);
}

.sb-c-plateforme:hover,
.sb-c-plateforme:focus-visible {
  border-color: var(--wp--preset--color--encre);
  transform: translateY(-1px);
}

.sb-c-plateforme__icone { display: flex; flex: 0 0 auto; }
.sb-c-plateforme__texte { display: flex; flex-direction: column; min-width: 0; }

.sb-c-plateforme__nom {
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--corps);
  font-weight: 700;
}

.sb-c-plateforme__note {
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}

/* ── la rangée du haut de page ───────────────────────────────────────────── */

.sb-l-plateformes--rangee {
  display: flex;
  flex-wrap: wrap;
  gap: calc(var(--wp--custom--rythme) * 1.25);
  margin-block-start: calc(var(--wp--custom--rythme) * 3);
}

/* PAS DE PASTILLE RONDE. Avec un rayon complet, une boîte de 56 px de haut
   devient un ovale : les demi-cercles mangent 56 px de largeur de chaque
   côté, et le logo flotte au milieu d'un vide qu'on prend pour une erreur
   de centrage. Un rayon court garde la forme d'un bouton. */
.sb-l-plateformes--rangee .sb-c-plateforme {
  gap: calc(var(--wp--custom--rythme));
  padding: calc(var(--wp--custom--rythme) * 1.125) calc(var(--wp--custom--rythme) * 1.75);
  border-radius: 10px;
}

/* La note disparaît, pas le nom : une rangée d'icônes sans texte oblige à
   deviner, et deviner coûte plus cher qu'un mot. */
.sb-l-plateformes--rangee .sb-c-plateforme__note { display: none; }

.sb-l-plateformes--rangee .sb-c-plateforme__nom {
  font-size: var(--wp--preset--font-size--legende);
}

/* La section d'abonnement reçoit le focus au clavier sans halo disgracieux :
   elle n'est focalisable que parce qu'on l'y amène. */
#abonner:focus { outline: none; }
#abonner:focus-visible { outline: 2px solid var(--wp--preset--color--turquoise-texte); outline-offset: 4px; }


/* ═══════════════════════════════════════════════════════════════════════════
   UNE PAGE DE TEXTE NE S'ÉTALE PAS SUR TOUTE LA LARGEUR
   ───────────────────────────────────────────────────────────────────────────
   Le rail et la colonne de lecture font ensemble 1030 px. Sur un écran de
   1440, la section en faisait 1216 : trois cents pixels abandonnés à droite
   de CHAQUE bloc, qu'aucun contenu ne venait jamais remplir.

   Ce n'est pas un défaut de la grille, c'est un défaut du contenant. On le
   réduit à ce que le contenu occupe vraiment, et on le centre : le vide
   repart alors équitablement des deux côtés, où il devient une marge au lieu
   d'un trou.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 60.01rem) {
  .sb-s-apropos-tete,
  .sb-s-apropos-texte,
  .sb-s-apropos-pour-qui,
  .sb-s-apropos-appel,
  .sb-s-legal,
  .sb-s-cgu,
  .sb-s-donnees-personnelles,
  .sb-s-cookies {
    max-width: var(--end-page);
    margin-inline: auto;
  }

  /* Plus de quatrième colonne : il n'y a rien à y mettre. */
  .sb-s-apropos-tete {
    grid-template-columns: minmax(0, 13rem) minmax(0, 34rem) auto;
  }

  /* ⚠️ LE RAIL EST UN JETON, ET IL N'A QU'UN SEUL ENDROIT.
     Cette grille a été redéclarée six fois depuis le 21.10 — 15rem, puis
     14rem, puis 13rem — et tout ce qui recopiait sa valeur à la main est
     resté sur une ancienne. L'exergue calculait encore sur 15rem le
     23.10 : il démarrait 56 px à gauche du paragraphe qu'il annonce.
     Ce qui a besoin de la largeur du rail la LIT ici.

     ⚠️ LA DEUXIÈME COLONNE EST BORNÉE, et ce n'est pas un détail de goût.
     Elle valait `1fr` : à 1440 px le paragraphe faisait 784 px, soit près de
     95 signes par ligne, là où la maison en vise 65. Justifié par-dessus,
     avec césure automatique, ça coupait « pi-vots » et « Entredon-ner » au
     milieu d'une page de présentation. `--wp--custom--colonne` est la mesure
     de lecture du site — 40 rem — et elle existait déjà : la grille la
     contournait avec un `max-width: none`. */
  .sb-s-apropos-texte,
  .sb-s-apropos-pour-qui,
  .sb-s-apropos-appel,
  .sb-s-legal,
  .sb-s-cgu,
  .sb-s-donnees-personnelles,
  .sb-s-cookies {
    grid-template-columns: minmax(0, var(--end-rail)) minmax(0, var(--wp--custom--colonne));
  }

  /* L'encadré d'appel garde sa marge propre : collé au bord, sa bordure
     toucherait le texte des sections au-dessus. */
  .sb-s-apropos-appel { padding-inline: calc(var(--wp--custom--rythme) * 4); }
}


/* ═══════════════════════════════════════════════════════════════════════════
   LES CINQ PLATEFORMES TIENNENT SUR UNE LIGNE
   ───────────────────────────────────────────────────────────────────────────
   Au premier essai, la rangée vivait dans la colonne de texte du haut de
   page — 613 px pour cinq pastilles qui en demandent neuf cents. Le flux RSS
   partait seul à la ligne, et une pastille orpheline se lit comme un oubli.

   La rangée sort donc de la colonne et prend TOUTE la largeur du haut de
   page, sous le texte et l'image. Il y a la place, et le geste y gagne :
   cinq choix alignés se comparent d'un regard.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 60.01rem) {
  .sb-s-accueil-une > .sb-l-plateformes--rangee,
  .sb-s-episode-tete > .sb-l-plateformes--rangee {
    grid-column: 1 / -1;
    flex-wrap: nowrap;
    margin-block-start: calc(var(--wp--custom--rythme) * 3.5);
  }

  /* Cinq colonnes égales en bas de page : `auto-fit` en posait quatre puis
     une, et la cinquième restait seule sur sa ligne. */
  .sb-s-accueil-abonner .sb-l-plateformes,
  .sb-s-episode-abonner .sb-l-plateformes,
  .sb-s-apropos-appel .sb-l-plateformes {
    grid-template-columns: repeat(5, minmax(0, 1fr));
  }

  .sb-s-accueil-abonner .sb-c-plateforme,
  .sb-s-episode-abonner .sb-c-plateforme {
    flex-direction: column;
    align-items: flex-start;
    gap: calc(var(--wp--custom--rythme) * 1.25);
    padding: calc(var(--wp--custom--rythme) * 2);
  }
}

/* LA RANGÉE PREND MOINS DE HAUTEUR. Elle en faisait 60 px par pastille pour
   un mot et un logo de 22 px : le reste était du remplissage. */
.sb-l-plateformes--rangee .sb-c-plateforme {
  gap: calc(var(--wp--custom--rythme) * 0.875);
  padding: calc(var(--wp--custom--rythme) * 0.875) calc(var(--wp--custom--rythme) * 1.5);
  white-space: nowrap;
}

.sb-l-plateformes--rangee .sb-c-plateforme__icone svg { width: 20px; height: 20px; }

/* « Newsletter LinkedIn » est le seul libellé long, et c'est lui qui décidait
   de la largeur de toute la rangée. Sur la rangée, il se dit en un mot. */
.sb-l-plateformes--rangee .sb-c-plateforme__nom { font-size: 13px; }

/* Les cinq cartes font la même hauteur. Sans ça, « Pour toute autre
   application » passe sur deux lignes et sa carte dépasse les quatre autres
   — on lit un défaut d'alignement là où il n'y a qu'un libellé plus long. */
/* La hauteur égale ne vaut QUE pour les cartes du bas. Posée sur toutes les
   listes, elle étirait aussi les pastilles de la rangée sur la plus haute —
   celle dont la note est la plus longue — et les cinq faisaient 100 px pour
   un logo de 20. */
.sb-l-plateformes:not(.sb-l-plateformes--rangee) .sb-c-plateforme { height: 100%; }

/* Le chapeau de la section d'abonnement s'alignait sur le centre pendant que
   son titre partait à gauche : reste du centrage hérité des autres appels. */
.sb-s-accueil-abonner > *,
.sb-s-episode-abonner > * { text-align: start; }

.sb-s-accueil-abonner .sb-c-chapo,
.sb-s-episode-abonner .sb-c-chapo { margin-inline: 0; max-width: 44rem; }

/* ═══════════════════════════════════════════════════════════════════════════
   LA FICHE D'ÉPISODE, SUR LA MÊME GRILLE QUE LE RESTE
   ───────────────────────────────────────────────────────────────────────────
   Elle avait le même défaut que « À propos », en pire parce que la pochette
   est large. Mesuré sur 1440 px :

     · la section allait de 112 à 1328, la pochette de 773 à 1328 — 555 px
       d'image collée au bord droit, et une bande vide entre elle et le titre ;
     · le titre commençait à x=112 et les notes à x=400 : deux alignements ;
     · les notes s'arrêtaient à 1040, laissant 288 px à droite.

   Un rail d'intertitres, une colonne de lecture, la pochette juste après —
   et le bloc ramené à sa largeur utile puis centré.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 60.01rem) {
  .sb-s-episode-fil,
  .sb-s-episode-tete,
  .sb-s-episode-notes,
  .sb-s-episode-abonner {
    max-width: 72rem;
    margin-inline: auto;
  }

  .sb-s-episode-tete {
    display: grid;
    grid-template-columns: minmax(0, 13rem) minmax(0, 30rem) auto;
    grid-template-rows: auto auto auto;
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: start;
    padding-block: calc(var(--wp--custom--rythme) * 4) calc(var(--wp--custom--rythme) * 3);
  }

  /* La pastille de rubrique rejoint le rail : c'est une étiquette, et sa
     place est celle qu'occupent « L'épisode » et « Site et réseaux » plus
     bas. La colonne de gauche cesse d'être vide. */
  .sb-s-episode-tete > .sb-c-rubrique {
    grid-column: 1; grid-row: 1;
    margin-block: calc(var(--wp--custom--rythme) * 0.5) 0;
  }

  .sb-s-episode-tete > .sb-c-titre {
    grid-column: 2; grid-row: 1;
    margin-block: 0;
  }

  .sb-s-episode-tete > .sb-c-meta {
    grid-column: 2; grid-row: 2;
    margin-block: calc(var(--wp--custom--rythme) * 1.5) 0;
  }

  /* La pochette, juste après le texte et bornée. Elle s'étend sur les trois
     rangées pour que sa hauteur ne pousse ni le titre ni les méta. */
  .sb-s-episode-tete > .sb-c-pochette-episode {
    grid-column: 3; grid-row: 1 / -1;
    align-self: start;
    justify-self: start;
    width: min(100%, 24rem);
    margin: 0;
  }

  .sb-s-episode-notes {
    display: grid;
    grid-template-columns: minmax(0, 13rem) minmax(0, 1fr);
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: start;
    row-gap: calc(var(--wp--custom--rythme) * 4);
  }

  .sb-s-episode-notes > .sb-c-titre {
    grid-column: 1;
    margin-block: 0;
    padding-block-start: calc(var(--wp--custom--rythme) * 0.5);
    font-size: var(--wp--preset--font-size--titre-fiche);
  }

  .sb-s-episode-notes > .sb-c-texte,
  .sb-s-episode-notes > .sb-c-liens,
  .sb-s-episode-notes > .wp-block-buttons {
    grid-column: 2;
    max-width: none;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   « À PROPOS » N'EST PLUS DEUX PAVÉS GRIS
   ───────────────────────────────────────────────────────────────────────────
   La mise en page était juste et la page restait morte : rien que du texte
   de la même couleur, du même poids, sur toute la hauteur. Deux choses y
   remédient, et aucune n'ajoute un mot au contenu.

   L'EXERGUE reprend le geste le plus fort du site — la carte encre du
   lecteur — pour la phrase qui dit pourquoi le podcast existe. C'est le seul
   endroit de la page où les couleurs de la marque sont à pleine intensité ;
   ailleurs elles échouent au contraste (2,1 et 1,62 sur fond clair).

   LES TROIS PUBLICS étaient un paragraphe de six lignes qui nommait trois
   personnes. Trois fiches se parcourent du regard ; un paragraphe se saute.
   ═══════════════════════════════════════════════════════════════════════════ */

.sb-s-apropos-exergue {
  margin-block: calc(var(--wp--custom--rythme) * 5);
  padding: calc(var(--wp--custom--rythme) * 6) calc(var(--wp--custom--rythme) * 5);
  border-radius: calc(var(--wp--custom--rayon) + 6px);
  background: var(--end-exergue-fond);
}

.sb-s-apropos-exergue .sb-c-surtitre {
  margin-block: 0 calc(var(--wp--custom--rythme) * 2);
  color: var(--end-exergue-accent);
}

.sb-s-apropos-exergue .sb-c-citation {
  margin: 0;
  max-width: 34rem;
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--titre-section);
  font-weight: 600;
  line-height: var(--wp--custom--interligne-titre);
  letter-spacing: var(--wp--custom--interlettre-titre);
  color: var(--end-exergue-texte);
}

/* Le point ambre, la mécanique héritée de Réalisons : la phrase se termine
   sur la couleur de la marque, pas sur un point noir. */
.sb-s-apropos-exergue .sb-c-citation::after {
  content: "";
  display: inline-block;
  width: 0.34em;
  height: 0.34em;
  margin-inline-start: 0.18em;
  border-radius: 50%;
  background: var(--end-exergue-accent);
}

/* Les trois fiches sont posées côte à côte par la SECTION : chaque
   `sb-l-publics` est une fiche, pas leur conteneur. */
.sb-s-apropos-pour-qui { row-gap: var(--wp--custom--gouttiere); }

.sb-l-publics {
  padding: calc(var(--wp--custom--rythme) * 2.5);
  border-radius: var(--wp--custom--rayon);
  background: var(--wp--preset--color--carte);
}

.sb-l-publics .sb-c-quoi {
  margin-block: 0 calc(var(--wp--custom--rythme) * 1);
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--titre-fiche);
  font-weight: 700;
  letter-spacing: var(--wp--custom--interlettre-titre);
}

/* Chaque fiche porte une pastille de couleur : trois publics, les trois
   couleurs des rubriques. C'est le seul rappel chromatique de la page. */
.sb-l-publics { border-top: 3px solid var(--wp--preset--color--filet); }
.sb-l-publics[data-rang="1"] { border-top-color: var(--wp--preset--color--turquoise); }
.sb-l-publics[data-rang="2"] { border-top-color: var(--wp--preset--color--ambre); }
.sb-l-publics[data-rang="3"] { border-top-color: var(--wp--preset--color--encre); }

.sb-l-publics .sb-c-texte {
  margin: 0;
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}

@media (min-width: 60.01rem) {
  /* L'exergue tient EXACTEMENT la colonne de lecture — mêmes deux bords.
     Il faisait 784 px quand le paragraphe est passé à 640 : la correction
     d'un défaut en avait créé un autre, dans l'autre sens.

     Les trois valeurs sont les jetons de la grille, et rien d'autre : le
     rail, la gouttière doublée, la mesure de lecture. La marge de gauche
     recentre la boîte comme le ferait `margin-inline: auto`, mais sans
     perdre la main dessus — `auto` recentrerait sur la largeur bornée, et
     le bloc décrocherait de 40 px vers la gauche. */
  .sb-s-apropos-exergue { max-width: var(--end-page); margin-inline: auto; }
  /* Les trois fiches prennent la colonne de lecture ET ce qui reste : à
     trois de front, un rail de 13 rem les étranglerait. */
  .sb-s-apropos-pour-qui {
    grid-template-columns: minmax(0, 13rem) repeat(3, minmax(0, 1fr));
    column-gap: var(--wp--custom--gouttiere);
  }
  .sb-s-apropos-pour-qui > .sb-c-titre { grid-column: 1; }
  .sb-s-apropos-pour-qui > .sb-l-publics { grid-column: auto; }
}


/* ── LE HAUT DE « À PROPOS » A LA MÊME ANATOMIE QU'UNE FICHE ──────────────
   Étiquette, titre, et une ligne de repères. C'est ce qui lui manquait : le
   titre et sa phrase flottaient sans rien pour les ancrer, et la hauteur du
   portrait creusait le reste. La ligne de repères remplit cette hauteur avec
   quelque chose à lire, au lieu de la laisser vide. */
@media (min-width: 60.01rem) {
  .sb-s-apropos-tete { grid-template-rows: auto auto auto; }

  .sb-s-apropos-tete > .sb-c-meta {
    grid-column: 2; grid-row: 3;
    margin-block: calc(var(--wp--custom--rythme) * 2.5) 0;
  }

  /* LES TROIS FICHES FONT LA MÊME HAUTEUR. `align-items: start`, posé pour
     que les intertitres du rail ne s'étirent pas, les faisait aussi se
     rétracter sur leur texte — trois hauteurs pour trois fiches côte à
     côte. Elles reprennent leur alignement ; le rail garde le sien. */
  .sb-s-apropos-pour-qui { align-items: stretch; }
  .sb-s-apropos-pour-qui > .sb-c-titre { align-self: start; }
}

.sb-s-apropos-tete .sb-c-meta {
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}


/* ── LA RANGÉE DE PLATEFORMES, RESSERRÉE ──────────────────────────────────
   Chaque pastille était une boîte plus haute que large pour un logo de
   20 px et un mot : le remplissage vertical faisait le double du texte, et
   le creux à gauche n'était pas celui de droite parce que l'icône et le mot
   n'avaient pas le même espacement.

   Un seul remplissage, le même des quatre côtés horizontalement, et une
   hauteur dictée par le contenu. */
.sb-l-plateformes--rangee .sb-c-plateforme {
  gap: calc(var(--wp--custom--rythme) * 1.125);
  padding-block: calc(var(--wp--custom--rythme) * 1.125);
  padding-inline: calc(var(--wp--custom--rythme) * 1.75);
  border-radius: 10px;
  line-height: 1;
}

/* L'icône et le mot sur la même ligne de base optique : le `flex` les
   centrait sur leur boîte, pas sur leur encre. */
.sb-l-plateformes--rangee .sb-c-plateforme__icone {
  align-items: center;
  line-height: 0;
}

.sb-l-plateformes--rangee .sb-c-plateforme__texte { justify-content: center; }


/* La note ne s'affiche pas dans la rangée : elle y est redite plus bas, et
   c'est elle qui donnait aux pastilles une seconde ligne invisible. */
.sb-l-plateformes--rangee .sb-c-plateforme__note { display: none !important; }

/* La rangée est un élément de la GRILLE du haut de page : sans `align-self`,
   elle s'étire sur toute la hauteur de sa rangée de grille, et ses pastilles
   avec elle. Mesuré : 80 px de haut pour 38 px de contenu. */
.sb-s-accueil-une > .sb-l-plateformes--rangee,
.sb-s-episode-tete > .sb-l-plateformes--rangee {
  align-self: start;
  align-items: center;
}

/* 🔴 DEUX RÈGLES PLUS ANCIENNES POSAIENT `min-height: 60px` — un reste de la
   boîte de dialogue, où chaque plateforme était une ligne cliquable au
   doigt. La rangée en héritait, et toutes les mesures de remplissage que je
   réglais au-dessus ne pouvaient rien : la hauteur était imposée en dur,
   plus bas dans la feuille, par une règle écrite pour autre chose.
   Une hauteur minimale reste utile au doigt — 44 px suffisent, c'est la
   cible tactile recommandée, et le contenu décide du reste. */
.sb-l-plateformes--rangee .sb-c-plateforme {
  min-height: 0;
  box-sizing: border-box;
}

@media (pointer: coarse) {
  .sb-l-plateformes--rangee .sb-c-plateforme { min-height: 44px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LE PIED DE PAGE EST RANGÉ
   ───────────────────────────────────────────────────────────────────────────
   Il alignait sept liens dans une seule colonne, sans titre : « Épisodes »
   et « Cookies » y avaient le même poids. Trois groupes maintenant — la
   marque, le podcast, le légal — et les plateformes rappelées en bas, parce
   qu'un pied de page est le dernier endroit où l'on peut encore convertir.
   ═══════════════════════════════════════════════════════════════════════════ */

.sb-c-pied-titre {
  margin-block: 0 calc(var(--wp--custom--rythme) * 1.5);
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--surtitre);
  font-weight: 700;
  letter-spacing: var(--wp--custom--interlettre-surtitre);
  text-transform: uppercase;
  color: var(--wp--preset--color--encre);
}

.sb-l-pied-plateformes {
  margin-block-start: calc(var(--wp--custom--rythme) * 5);
  padding-block-start: calc(var(--wp--custom--rythme) * 4);
  border-top: 1px solid var(--wp--preset--color--filet);
}

.sb-l-pied-plateformes .sb-l-plateformes {
  margin-block-start: calc(var(--wp--custom--rythme) * 2);
}

.sb-c-pied-legal {
  margin-block-start: calc(var(--wp--custom--rythme) * 4);
  color: var(--wp--preset--color--encre-douce);
}

@media (min-width: 48rem) {
  .sb-l-pied-rang {
    display: grid;
    grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) minmax(0, 1fr);
    gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: start;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LES CARTES DE PLATEFORME NE SONT PLUS CREUSES
   ───────────────────────────────────────────────────────────────────────────
   Elles portaient un logo de 22 px, deux lignes de texte, puis un tiers de
   vide : toutes étirées à la hauteur de la plus haute, contenu tassé en haut.
   Une carte à moitié vide se lit comme une carte inachevée.

   Trois gestes : le logo passe dans une pastille teintée qui lui donne du
   poids, le contenu se répartit du haut au bas plutôt que de s'empiler, et
   une flèche en bas à droite dit ce que la carte fait — on sort du site.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 60.01rem) {
  .sb-s-accueil-abonner .sb-c-plateforme,
  .sb-s-episode-abonner .sb-c-plateforme {
    position: relative;
    justify-content: space-between;
    gap: calc(var(--wp--custom--rythme) * 2);
    padding: calc(var(--wp--custom--rythme) * 2.5);
    min-height: 0;
  }
}

/* La pastille du logo. Le fond reprend la couleur de la marque en très
   dilué : elle ancre le logo sans entrer en concurrence avec lui. */
.sb-s-accueil-abonner .sb-c-plateforme__icone,
.sb-s-episode-abonner .sb-c-plateforme__icone {
  width: 48px;
  height: 48px;
  align-items: center;
  justify-content: center;
  border-radius: 12px;
  background: color-mix(in srgb, var(--wp--preset--color--papier) 72%, white);
}

.sb-s-accueil-abonner .sb-c-plateforme__icone svg,
.sb-s-episode-abonner .sb-c-plateforme__icone svg { width: 26px; height: 26px; }

.sb-s-accueil-abonner .sb-c-plateforme__nom,
.sb-s-episode-abonner .sb-c-plateforme__nom {
  display: block;
  margin-block-end: calc(var(--wp--custom--rythme) * 0.5);
}

/* La flèche de sortie. `aria-hidden` par construction — c'est un pseudo —
   et le lien dit déjà où il mène. */
.sb-s-accueil-abonner .sb-c-plateforme::after,
.sb-s-episode-abonner .sb-c-plateforme::after {
  content: "\2197";
  position: absolute;
  inset-block-end: calc(var(--wp--custom--rythme) * 2);
  inset-inline-end: calc(var(--wp--custom--rythme) * 2);
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--filet);
}

.sb-s-accueil-abonner .sb-c-plateforme:hover::after,
.sb-s-episode-abonner .sb-c-plateforme:hover::after {
  color: var(--wp--preset--color--encre);
}

/* Le chapeau de la section suivait encore un centrage hérité : il commençait
   300 px à droite de son propre titre. */
.sb-s-accueil-abonner > .sb-c-chapo,
.sb-s-episode-abonner > .sb-c-chapo {
  margin-inline-start: 0 !important;
  margin-inline-end: auto !important;
}

/* Les cartes étaient trop hautes pour ce qu'elles portent : l'écart entre le
   logo et le texte se lisait comme un trou. On le borne. */
@media (min-width: 60.01rem) {
  .sb-s-accueil-abonner .sb-c-plateforme,
  .sb-s-episode-abonner .sb-c-plateforme {
    gap: calc(var(--wp--custom--rythme) * 1.5);
    padding: calc(var(--wp--custom--rythme) * 2.25);
  }
  .sb-s-accueil-abonner .sb-c-plateforme__icone,
  .sb-s-episode-abonner .sb-c-plateforme__icone { width: 42px; height: 42px; }
  .sb-s-accueil-abonner .sb-c-plateforme__icone svg,
  .sb-s-episode-abonner .sb-c-plateforme__icone svg { width: 24px; height: 24px; }
}

/* ── LA BARRE DE LECTURE NE BARRE PLUS L'ÉCRAN ────────────────────────────
   Elle s'étirait sur toute la largeur utile — plus de mille pixels pour un
   titre, un temps et trois boutons. Une barre pleine largeur se lit comme un
   bandeau système : elle coupe la page en deux et on ne sait plus si elle
   appartient au site ou au navigateur.

   Bornée et posée à droite, elle redevient ce qu'elle est : un objet qui
   flotte au-dessus du contenu, qu'on peut ignorer. À gauche sur mobile elle
   resterait pleine largeur — il n'y a pas la place de faire autrement. */
@media (min-width: 60.01rem) {
  .sb-s-accueil-lecteur.est-compact,
  .sb-s-episode-lecteur.est-compact {
    inset-inline: auto 24px;
    width: min(42rem, calc(100vw - 48px));
    inset-block-end: 24px;
  }
}

/* ── L'EN-TÊTE PASSAIT SOUS LA BARRE D'ADMINISTRATION ─────────────────────
   `inset-block-start: 0` colle au haut de la FENÊTRE, pas au haut de la zone
   que WordPress laisse libre. Connecté, l'administrateur voyait donc son
   menu disparaître derrière la barre noire — et c'est le seul visiteur qui
   travaille sur le site, donc le seul à qui ça arrive tout le temps.

   WordPress pose `admin-bar` sur le `<body>` et la hauteur de sa barre change
   à 782 px. Les deux valeurs sont les siennes, pas les nôtres. */
body.admin-bar header.wp-block-template-part { inset-block-start: 32px; }

@media screen and (max-width: 782px) {
  body.admin-bar header.wp-block-template-part { inset-block-start: 46px; }
}

/* La transition accompagne le changement de hauteur au lieu de le subir.
   Elle ne cause pas le clignotement — c'est la boucle de seuil qui le
   causait — mais elle rend la réduction lisible. */
header.wp-block-template-part,
.sb-l-entete { transition: padding-block 160ms ease-out; }

@media (prefers-reduced-motion: reduce) {
  header.wp-block-template-part, .sb-l-entete { transition: none; }
}




/* ── LA DESCRIPTION DE L'ÉPISODE EN COURS ─────────────────────────────────
   Elle est posée dans chaque fiche et cachée par défaut. Seule la fiche
   marquée par le lecteur la montre, et elle est OUVERTE : on ne demande pas
   à quelqu'un de cliquer pour lire ce qu'il écoute déjà.

   Un dépliant sur chaque fiche — la première version — mettait six fois la
   même invitation dans une liste, et aucune ne disait ce qui joue. */
.sb-c-description { display: none; }

/* ── LA FICHE EN COURS RESTE DANS LA LISTE, ET SE SIGNALE ─────────────────
   Elle en disparaissait. C'était une erreur, et c'est l'usage qui le dit :
   aucun lecteur de podcast ne retire l'épisode qu'on écoute de sa liste.

   Trois raisons, et la première suffit :
     · la liste SAUTE au moment où on lance un épisode, et on perd l'endroit
       où on était en train de lire ;
     · on ne voit plus où l'on se trouve dans la série ;
     · à la fin de l'épisode, le suivant n'est pas là où on l'avait laissé.

   Ce qui faisait doublon n'était pas la fiche — c'était sa DESCRIPTION,
   affichée en entier aux deux endroits. Elle ne vit plus que dans la carte
   noire. La fiche, elle, reste et se marque. */
/* ⚠️ REVIREMENT DU 21.10.2026, et il annule le commentaire ci-dessus.
   La fiche en cours NE RESTE PLUS dans la liste : elle en sort, et son
   contenu vit dans la carte du lecteur, au-dessus.

   Pourquoi revenir là-dessus. La marquer sur place laissait le même épisode
   à deux endroits de l'écran, avec deux habillages concurrents — le filet
   turquoise de la fiche et le filet turquoise de la carte — pour une seule
   chose écoutée. Lequel des deux est « l'épisode en cours » ne se lisait
   plus.

   ELLE NE DISPARAÎT PAS, ELLE PART. L'écart entre les deux est tout le
   sujet : un élément qui s'efface d'un coup donne l'impression d'avoir été
   supprimé, et le suivant saute sous le curseur. Ici la fiche se replie en
   glissant VERS LE HAUT — vers la carte, qui est au-dessus — et celle qu'on
   quitte refait le chemin inverse. Le même jeu de propriétés sert dans les
   deux sens : il n'y a qu'une transition, et retirer la classe la joue à
   l'envers.

   `max-block-size` et non `height`: une hauteur ne s'anime pas vers `auto`.
   60 rem est un plafond large — la plus haute fiche mesure 13 rem — et il
   n'est jamais atteint, donc il ne coupe rien. Il rend la vitesse du repli
   légèrement non linéaire ; la courbe le compense, et l'œil ne le voit pas.

   `allow-discrete` fait basculer `visibility` à la FIN du repli et au DÉBUT
   du dépliage. Sans lui — navigateur plus ancien — la fiche disparaît du
   lecteur d'écran immédiatement et l'animation de taille reste : c'est une
   dégradation, pas une panne. */
.sb-l-episodes {
  max-block-size: 60rem;
  overflow: clip;
  transition:
    max-block-size 420ms cubic-bezier(0.33, 0, 0.2, 1),
    margin-block 420ms cubic-bezier(0.33, 0, 0.2, 1),
    padding-block 420ms cubic-bezier(0.33, 0, 0.2, 1),
    border-width 420ms cubic-bezier(0.33, 0, 0.2, 1),
    opacity 240ms ease,
    translate 420ms cubic-bezier(0.33, 0, 0.2, 1),
    scale 420ms cubic-bezier(0.33, 0, 0.2, 1),
    visibility 420ms;
  transition-behavior: allow-discrete;
}

.sb-l-episodes.est-joue {
  max-block-size: 0;
  margin-block: 0;
  padding-block: 0;
  border-width: 0;
  opacity: 0;
  translate: 0 -16px;
  scale: 0.97;
  visibility: hidden;
  pointer-events: none;
}

/* Le tri ne s'anime pas pour qui a demandé qu'on arrête de bouger. La fiche
   sort quand même — c'est le comportement, pas l'ornement. */
@media (prefers-reduced-motion: reduce) {
  .sb-l-episodes { transition: none; }
}

.sb-c-description p {
  margin-block: calc(var(--wp--custom--rythme) * 1.25);
  font-size: var(--wp--preset--font-size--legende);
  line-height: var(--wp--custom--interligne);
  color: var(--wp--preset--color--encre-douce);
}

.sb-c-description p:first-child { margin-block-start: 0; }

/* ── LA DESCRIPTION, DANS LA CARTE DU LECTEUR ─────────────────────────────
   C'est le seul endroit où elle a sa place : là où est l'épisode qu'on
   écoute. Sur fond encre, les couleurs de la marque sont à pleine
   intensité — et le texte y est à 11,0 de contraste, mesuré. */
.sb-c-lecteur-description {
  flex-basis: 100%;
  margin-block-start: calc(var(--wp--custom--rythme) * 2.5);
  padding-block-start: calc(var(--wp--custom--rythme) * 2.5);
  border-top: 1px solid var(--end-l-rail);
}

.sb-c-lecteur-description p {
  margin-block: calc(var(--wp--custom--rythme) * 1.5);
  /* PLEINE LARGEUR. Une colonne de 54 rem laissait un quart de la carte
     vide à droite, sans rien pour l'occuper : ici le texte est seul, et la
     carte lui appartient. */
  max-width: none;
  font-size: var(--wp--preset--font-size--legende);
  line-height: var(--wp--custom--interligne);
  /* Justifié des deux bords, comme le reste des textes longs du site.
     SANS CÉSURE — voir le bloc « AUCUN MOT N'EST COUPÉ » en fin de feuille. */
  text-align: justify;
  hyphens: manual;
  color: var(--end-l-douce);
}

.sb-c-lecteur-description p:first-child { margin-block-start: 0; }
.sb-c-lecteur-description p:last-child { margin-block-end: 0; }

/* La carte compacte n'a pas la place : la description s'y efface. */
.est-compact .sb-c-lecteur-description { display: none; }

/* ── LE CHAPEAU DE LA PAGE D'ÉCOUTE ───────────────────────────────────────
   Il partait dans la colonne de lecture pendant que son titre restait à
   gauche : deux alignements pour deux lignes qui se suivent. */
@media (min-width: 60.01rem) {
  /* PAS DE CENTRAGE ICI. La liste et le lecteur occupent toute la largeur
     utile ; une tête centrée dans un bloc plus étroit commençait 272 px à
     leur droite, et la page partait de deux endroits à la fois. */
  .sb-s-episodes-tete {
    padding-block: calc(var(--wp--custom--rythme) * 6) calc(var(--wp--custom--rythme) * 2);
  }
  .sb-s-episodes-tete > * { margin-inline: 0 auto; max-width: 42rem; }
}

/* ── LA CARTE DU LECTEUR PASSE EN DEUX RANGS QUAND ELLE PORTE UN TEXTE ────
   Sans retour à la ligne, la description se rangeait À CÔTÉ des commandes :
   la pochette, le titre et le bouton se tassaient sur un tiers de la carte,
   centrés verticalement sur une hauteur de six paragraphes.

   Un seul rang quand il n'y a rien à lire, deux dès qu'il y a une
   description — et c'est la description elle-même qui le décide, par sa
   largeur pleine. */
.sb-s-accueil-lecteur,
.sb-s-episode-lecteur {
  flex-wrap: wrap;
  align-items: center;
}

/* ⚠️ `hidden` NE GAGNE PAS CONTRE `display: flex`. L'attribut du navigateur
   vaut `display: none` dans sa feuille par défaut, et toute déclaration
   d'auteur l'emporte dessus — y compris celle juste au-dessus.

   Depuis le 23.10.2026 le script pose une carte VIDE ET MASQUÉE sur les six
   pages qui n'en offrent pas, pour que le lecteur existe partout. Sans cette
   règle, cette carte s'afficherait vide en bas de chaque page juridique. */
.sb-s-accueil-lecteur[hidden],
.sb-s-episode-lecteur[hidden] { display: none; }

.sb-c-lecteur-description {
  width: 100%;
  flex: 0 0 100%;
}

/* Les commandes retrouvent leur rang : elles s'alignent en haut de la carte
   plutôt qu'au milieu d'un bloc de texte. */
.sb-s-accueil-lecteur:has(.sb-c-lecteur-description:not([hidden])) > :not(.sb-c-lecteur-description),
.sb-s-episode-lecteur:has(.sb-c-lecteur-description:not([hidden])) > :not(.sb-c-lecteur-description) {
  align-self: center;
}


/* ── LA DESCRIPTION SE REPLIE DANS LA CARTE ───────────────────────────────
   Déployée d'office, elle faisait du lecteur un pavé de six paragraphes
   avant qu'on ait lancé quoi que ce soit. Elle se déplie à la demande, et
   se referme quand on change d'épisode : la laisser ouverte déplacerait la
   page sous l'œil. */
.sb-c-lecteur-description__bouton {
  display: inline-flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 0.75);
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 600;
  color: var(--end-l-accent);
  cursor: pointer;
  list-style: none;
}

.sb-c-lecteur-description__bouton::-webkit-details-marker { display: none; }

.sb-c-lecteur-description__bouton::before {
  content: "\25B8";
  display: inline-block;
  transition: transform 140ms ease-out;
}

.sb-c-lecteur-description[open] .sb-c-lecteur-description__bouton::before {
  transform: rotate(90deg);
}

.sb-c-lecteur-description .est-deplie,
.sb-c-lecteur-description[open] .est-replie { display: none; }
.sb-c-lecteur-description[open] .est-deplie { display: inline; }

.sb-c-lecteur-description__corps {
  margin-block-start: calc(var(--wp--custom--rythme) * 2);
}

/* Les adresses de la description sont devenues des liens : sur fond encre,
   le turquoise est à 7,6 de contraste — mesuré — là où il échoue sur clair. */
/* `:not()` est indispensable ici : sans lui, la règle colorait AUSSI le
   bouton vers la fiche, qui est un `<a>` — texte turquoise sur fond
   turquoise, donc un rectangle vide. Mesuré à l'écran. */
.sb-c-lecteur-description a:not(.sb-c-lecteur-fiche) {
  color: var(--end-l-accent);
  text-underline-offset: 3px;
}

/* Le bouton vers la fiche de l'épisode. Il n'apparaît que si la fiche
   existe : tous les épisodes n'en ont pas encore une. */
.sb-c-lecteur-fiche {
  display: inline-flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme));
  margin-block-start: calc(var(--wp--custom--rythme) * 2.5);
  padding: calc(var(--wp--custom--rythme) * 1.25) calc(var(--wp--custom--rythme) * 2.25);
  border-radius: 10px;
  background: var(--end-plein);
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 700;
  color: var(--end-plein-texte);
  text-decoration: none;
}

.sb-c-lecteur-fiche::after { content: "\2192"; }

.sb-c-lecteur-fiche:hover,
.sb-c-lecteur-fiche:focus-visible { background: var(--end-plein-survol); }

@media (prefers-reduced-motion: reduce) {
  .sb-c-lecteur-description__bouton::before { transition: none; }
}

/* ── LA DESCRIPTION DANS LA GRILLE DU TÉLÉPHONE ───────────────────────────
   Sous 60 rem, la carte du lecteur n'est PAS en flex : c'est une grille à
   trois colonnes, posée bien avant que la description existe. Mes règles
   `flex: 0 0 100%` n'y pouvaient rien — mesuré : 127 px de large au lieu de
   toute la carte, et le texte comprimé dans une colonne.

   Elle prend donc un rang à elle, sur toute la largeur. */
@media (max-width: 60rem) {
  .sb-s-accueil-lecteur .sb-c-lecteur-description,
  .sb-s-episode-lecteur .sb-c-lecteur-description {
    grid-column: 1 / -1;
    grid-row: auto;
    width: auto;
  }

  /* Le texte justifié devient illisible sur 320 px : trois mots par ligne
     et des blancs qui mangent la moitié de la largeur. */
  .sb-c-lecteur-description p { text-align: start; }

  /* Et le titre passait sous le bouton de lecture : la colonne du texte
     doit pouvoir se réduire, donc `minmax(0, 1fr)` et pas `1fr`. */
  .sb-l-lecteur-corps { min-width: 0; }
  .sb-c-piste { overflow-wrap: anywhere; }
}

/* ── LES CARTES DE PLATEFORME SUR TÉLÉPHONE ───────────────────────────────
   Elles gardaient le remplissage du bureau et la hauteur minimale héritée
   de l'ancienne boîte de dialogue : cinq blocs de 130 px pour un logo et
   deux lignes, soit un écran entier pour cinq liens.

   Une ligne par plateforme, serrée, le logo à gauche et le texte contre lui. */
@media (max-width: 60rem) {
  .sb-s-accueil-abonner .sb-l-plateformes,
  .sb-s-episode-abonner .sb-l-plateformes {
    grid-template-columns: 1fr;
    gap: calc(var(--wp--custom--rythme) * 1.25);
  }

  .sb-s-accueil-abonner .sb-c-plateforme,
  .sb-s-episode-abonner .sb-c-plateforme {
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: calc(var(--wp--custom--rythme) * 1.75);
    padding: calc(var(--wp--custom--rythme) * 1.5);
    min-height: 0;
    height: auto;
  }

  .sb-s-accueil-abonner .sb-c-plateforme__icone,
  .sb-s-episode-abonner .sb-c-plateforme__icone { width: 40px; height: 40px; }

  .sb-s-accueil-abonner .sb-c-plateforme__nom,
  .sb-s-episode-abonner .sb-c-plateforme__nom { margin-block-end: 2px; }

  /* La flèche de sortie n'a pas sa place sur une ligne serrée : elle
     chevauchait le texte dans le coin. */
  .sb-s-accueil-abonner .sb-c-plateforme::after,
  .sb-s-episode-abonner .sb-c-plateforme::after { content: none; }
}

@media (max-width: 60rem) {
  /* Les deux lignes d'une carte étaient espacées comme deux paragraphes :
     101 px pour un nom et quatre mots. */
  .sb-s-accueil-abonner .sb-c-plateforme__texte,
  .sb-s-episode-abonner .sb-c-plateforme__texte { gap: 0; }

  .sb-s-accueil-abonner .sb-c-plateforme__nom,
  .sb-s-episode-abonner .sb-c-plateforme__nom {
    margin-block-end: 0;
    line-height: 1.3;
  }

  .sb-s-accueil-abonner .sb-c-plateforme__note,
  .sb-s-episode-abonner .sb-c-plateforme__note { line-height: 1.35; }

  .sb-s-accueil-abonner .sb-c-plateforme,
  .sb-s-episode-abonner .sb-c-plateforme {
    padding: calc(var(--wp--custom--rythme) * 1.25) calc(var(--wp--custom--rythme) * 1.5);
  }

  /* ── LA BARRE COMPACTE DIT CE QU'ELLE JOUE ─────────────────────────────
     Elle montrait une pochette, une barre de progression et trois boutons —
     et pas le titre. Sur un téléphone, c'est la seule chose qu'on veut
     lire : on sait déjà qu'on écoute quelque chose, on veut savoir QUOI.
     La progression cède la place ; elle reste dans la grande carte. */
  .est-compact .sb-l-lecteur-piste { display: none; }

  .est-compact .sb-c-piste {
    display: block;
    grid-column: 2;
    grid-row: 1 / span 2;
    align-self: center;
    font-size: var(--wp--preset--font-size--legende);
    line-height: 1.3;
    /* Deux lignes au plus, puis les points de suspension : un titre long ne
       doit pas pousser la barre sur trois rangs. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }

  .est-compact .sb-l-lecteur-corps {
    display: contents;
  }
}

/* 🔴 LES CARTES SE CHEVAUCHAIENT DE 12 PX, elles ne se touchaient pas.
   Mesuré : écart réel −12 px entre deux cartes voisines, pour un `gap`
   déclaré à 10. La cause : `height: 100%` sur une boîte en `content-box`.
   La hauteur demandée est celle du RANG, le remplissage s'ajoute par-dessus,
   et chaque carte déborde sur la suivante. `border-box` règle les deux. */
.sb-c-plateforme { box-sizing: border-box; }

/* ── LES SOUS-TITRES DISPARAISSENT ────────────────────────────────────────
   « Le plus simple, partout », « iPhone, iPad, Mac » : personne ne choisit
   sa plateforme d'écoute en lisant une ligne d'explication. Le logo et le
   nom suffisent, et la carte reprend une hauteur de bouton. */
.sb-c-plateforme__note { display: none; }

@media (max-width: 60rem) {
  .sb-s-accueil-abonner .sb-l-plateformes,
  .sb-s-episode-abonner .sb-l-plateformes {
    gap: calc(var(--wp--custom--rythme) * 1.5);
  }
  .sb-s-accueil-abonner .sb-c-plateforme,
  .sb-s-episode-abonner .sb-c-plateforme { height: auto; }
}

/* Sans sous-titre, une carte de 122 px pour un logo et un mot est un vide
   qu'on remarque. Elle reprend la hauteur de ce qu'elle porte. */
@media (min-width: 60.01rem) {
  .sb-s-accueil-abonner .sb-c-plateforme,
  .sb-s-episode-abonner .sb-c-plateforme {
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: calc(var(--wp--custom--rythme) * 1.5);
    padding: calc(var(--wp--custom--rythme) * 1.75);
  }

  /* La flèche de sortie retrouve sa place à droite, sur la même ligne. */
  .sb-s-accueil-abonner .sb-c-plateforme::after,
  .sb-s-episode-abonner .sb-c-plateforme::after {
    position: static;
    margin-inline-start: auto;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   LA BARRE DU BAS EST UN SECOND OBJET
   ───────────────────────────────────────────────────────────────────────────
   Elle ne remplace plus la grande carte : celle-ci reste dans le flux et
   défile comme le reste. Deux corrections fausses ont précédé celle-ci —
   la carte passée en `fixed` clignotait, et réserver sa hauteur laissait un
   trou de 239 px au milieu de la page. Les deux venaient de vouloir qu'un
   seul élément soit à deux endroits.
   ═══════════════════════════════════════════════════════════════════════════ */

.sb-c-barre-fixe {
  position: fixed;
  inset-inline: auto 24px;
  inset-block-end: 24px;
  z-index: 40;
  display: flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1.5);
  width: min(34rem, calc(100vw - 48px));
  padding: calc(var(--wp--custom--rythme) * 1.25) calc(var(--wp--custom--rythme) * 2);
  border-radius: var(--wp--custom--rayon-rond);
  background: var(--wp--preset--color--encre);
  color: var(--wp--preset--color--lecteur-texte);
  box-shadow: 0 12px 32px rgba(10, 10, 10, 0.26);
}

.sb-c-barre-fixe[hidden] { display: none; }

.sb-c-barre-fixe__pochette {
  flex: 0 0 auto;
  width: 44px; height: 44px;
  object-fit: cover;
  border-radius: 50%;
}

.sb-c-barre-fixe__titre {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--legende);
  line-height: 1.3;
  /* Deux lignes au plus : un titre long ne doit pas étirer la barre. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.sb-c-barre-fixe__saut,
.sb-c-barre-fixe__jouer {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  background: none;
  color: var(--wp--preset--color--lecteur-texte);
  cursor: pointer;
}

.sb-c-barre-fixe__saut { width: 36px; height: 36px; color: var(--wp--preset--color--lecteur-douce); }
.sb-c-barre-fixe__saut:disabled { opacity: 0.35; cursor: default; }

.sb-c-barre-fixe__jouer {
  width: 44px; height: 44px;
  border-radius: 50%;
  background: var(--end-plein);
  color: var(--end-plein-texte);
}

/* La barre recouvre la fin de la page : on lui laisse la place. */
body.a-lecteur-compact { padding-block-end: 96px; }

@media (max-width: 60rem) {
  .sb-c-barre-fixe {
    inset-inline: 12px;
    inset-block-end: 12px;
    width: auto;
    gap: calc(var(--wp--custom--rythme) * 1.25);
    padding: calc(var(--wp--custom--rythme)) calc(var(--wp--custom--rythme) * 1.5);
  }
}

/* ── « À PROPOS » SUR TÉLÉPHONE ───────────────────────────────────────────
   Le portrait prenait toute la largeur — un rond de 390 px qui occupait un
   écran à lui seul avant qu'on ait lu une ligne — et les blocs du haut
   étaient espacés comme des sections alors qu'ils forment un seul bloc.

   ⚠️ DEUX FOIS DE SUITE, LA TAILLE SEULE A ÉTÉ CORRIGÉE, ET L'ALIGNEMENT
   OUBLIÉ. À 8,5 rem le rond mesurait 136 px dans une colonne de 351, collé
   au bord gauche, avec 215 px de vide à sa droite : il ne se lisait plus
   comme l'ouverture de la page mais comme une vignette oubliée là.

   Il était pourtant écrit `margin-inline: auto` plus bas, sur `.sb-c-portrait`.
   Cette déclaration n'a jamais rien fait ici : `.wp-block-group.sb-s-apropos-tete > *`
   pose `margin-inline: 0` avec deux classes contre une, et gagne quelle que
   soit sa position dans la feuille. Un centrage écrit n'est pas un centrage
   obtenu — c'est la deuxième fois que la feuille de WordPress reprend la main
   sur les enfants d'un groupe passé en grille, et la première est racontée
   plus haut, sous « LE CENTRAGE QUI N'EN ÉTAIT PAS UN ».

   On le recentre donc depuis un sélecteur d'égale force, et on lui rend
   assez de diamètre — 200 px — pour qu'il soit un portrait et non une
   pastille. Mesuré à 390 px : 76 px de marge de chaque côté, le titre
   descend de 329 à 393 px, la section passe de 454 à 518. */
@media (max-width: 60rem) {
  .sb-s-apropos-tete > .sb-c-portrait {
    width: 12.5rem;
    margin-inline: auto;
    margin-block-end: calc(var(--wp--custom--rythme) * 2.5);
    order: -1;
  }

  .sb-s-apropos-tete { padding-block: calc(var(--wp--custom--rythme) * 4) calc(var(--wp--custom--rythme) * 2); }
  .sb-s-apropos-tete > .sb-c-surtitre { margin-block: 0 calc(var(--wp--custom--rythme) * 1.25); }
  .sb-s-apropos-tete > .sb-c-titre { margin-block: 0; }
  .sb-s-apropos-tete > .sb-c-chapo { margin-block: calc(var(--wp--custom--rythme) * 1.5) 0; }
  .sb-s-apropos-tete > .sb-c-meta { margin-block: calc(var(--wp--custom--rythme) * 1.75) 0; }

  .sb-s-apropos-exergue {
    margin-block: calc(var(--wp--custom--rythme) * 3);
    padding: calc(var(--wp--custom--rythme) * 3);
  }

  .sb-s-apropos-texte, .sb-s-apropos-pour-qui {
    padding-block: calc(var(--wp--custom--rythme) * 2.5);
  }

  .sb-s-apropos-texte > .sb-c-titre,
  .sb-s-apropos-pour-qui > .sb-c-titre {
    margin-block: 0 calc(var(--wp--custom--rythme) * 1.5);
  }
}

/* ── « PARLER DE VOTRE PROJET » DANS LE PIED ──────────────────────────────
   Les gens viennent pour le podcast. Certains repartent avec une question
   sur leur propre projet, et ce lien est le seul endroit du site où ils
   peuvent la poser. Il est posé dans le pied sans crier : une ligne sous la
   signature, pas une bannière.

   Il part vers Réalisons, qui est le service — le podcast, lui, ne vend
   rien, et c'est écrit noir sur blanc sur la page À propos. */
.sb-c-pied-projet {
  margin-block-start: calc(var(--wp--custom--rythme) * 2);
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}

.sb-c-pied-projet a {
  color: var(--wp--preset--color--encre);
  text-decoration-color: var(--wp--preset--color--turquoise);
  text-decoration-thickness: 2px;
  text-underline-offset: 4px;
}

.sb-c-pied-projet a:hover,
.sb-c-pied-projet a:focus-visible { color: var(--wp--preset--color--turquoise-texte); }

/* Sur téléphone, l'espacement de bloc de WordPress — 32 px — séparait le
   surtitre, le titre, le chapeau et les repères comme s'ils étaient quatre
   sections. Ils forment un seul bloc. */
@media (max-width: 60rem) {
  .sb-s-apropos-tete,
  .sb-s-episode-tete,
  .sb-s-episodes-tete { row-gap: calc(var(--wp--custom--rythme) * 0.5); }
}

/* ── « UN PODCAST DE RÉALISONS », DANS LE PIED ────────────────────────────
   La filiation était écrite en toutes lettres dans la ligne de copyright,
   au même poids que l'année : personne ne la lisait. Elle devient une
   signature — le mot, puis la marque — discrète mais reconnaissable, et
   cliquable vers le service.

   Le logo est posé dans le thème, à côté des polices, et pas appelé chez
   Réalisons : un site ne va rien chercher chez un autre. */
.sb-l-pied-signature {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1.5) calc(var(--wp--custom--rythme) * 6);
  margin-block-start: calc(var(--wp--custom--rythme) * 4);
  padding-block-start: calc(var(--wp--custom--rythme) * 3);
  border-top: 1px solid var(--wp--preset--color--filet);
}

.sb-c-pied-realisons {
  display: inline-flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1.25);
  text-decoration: none;
  opacity: 0.72;
  transition: opacity 140ms ease-out;
}

.sb-c-pied-realisons:hover,
.sb-c-pied-realisons:focus-visible { opacity: 1; }

/* ⚠️ `align-items: center` CENTRE LES BOÎTES, PAS L'ENCRE — et c'est ce qui
   se voyait. Mesuré le 23.10.2026 sur une capture à 4x du seul verrou :
   les deux boîtes ont le même centre à 0,01 px près, et pourtant le mot
   paraissait monté. La boîte du mot est une boîte de LIGNE — hauteur 21 px
   pour des capitales qui n'en occupent que 9,5, le reste étant le talon des
   jambages qu'aucune de ces lettres n'a. Celle du logo est une image dont
   l'encre remplit le cadre, mais dont la MASSE se concentre dans le bas : le
   « l » et l'accent du « é » montent haut sans rien peser. Centres de masse
   relevés : 1,51 px d'écart, le logo plus bas — ce que personne ne mesure et
   que tout le monde voit.

   Le décalage est donc posé ici, en `em` pour qu'il suive la taille du mot,
   et par `transform` qui ne déplace rien dans la mise en page. Résidu après
   correction : 0,01 px.

   ⚠️ LE PREMIER RELEVÉ DISAIT 1,95 px, et il était faux : la capture
   englobait le dégradé du pied, que le compteur d'encre prenait pour de
   l'encre. Le second peint un fond plat derrière le verrou et force son
   opacité à 1 — et il porte son propre témoin, le logo, dont la mesure doit
   être IDENTIQUE avant et après puisque rien ne le touche. C'est ce témoin,
   et lui seul, qui a montré que le premier instrument dérivait. */
.sb-c-pied-realisons__mot {
  font-size: var(--wp--preset--font-size--surtitre);
  letter-spacing: var(--wp--custom--interlettre-surtitre);
  text-transform: uppercase;
  color: var(--wp--preset--color--encre-douce);
  transform: translateY(0.116em);
}

.sb-c-pied-realisons img { display: block; width: 116px; height: auto; }

.sb-l-pied-signature .sb-c-pied-legal {
  margin: 0;
  margin-inline-start: auto;
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
}

@media (prefers-reduced-motion: reduce) {
  .sb-c-pied-realisons { transition: none; }
}

/* ── LE MOT DE MARQUE GRANDIT ─────────────────────────────────────────────
   22 px sur grand écran et 14 sur téléphone : le nom de la marque pesait
   moins que les trois onglets à côté de lui. Il passe à 26 et 17, et le
   symbole suit — leurs tailles sont liées, sinon le point ambre devient une
   poussière à côté du mot.

   L'état réduit garde l'écart : un en-tête qui rétrécit doit rester
   reconnaissable, pas redevenir celui d'avant. */
.sb-c-marque::before { width: 34px; height: 34px; }

.sb-c-marque .wp-block-site-title a {
  font-size: calc(var(--wp--preset--font-size--titre-fiche) + 8px);
}

.sb-l-entete.a-defile .sb-c-marque::before { width: 29px; height: 29px; }

.sb-l-entete.a-defile .sb-c-marque .wp-block-site-title a {
  font-size: calc(var(--wp--preset--font-size--titre-fiche) + 3px);
}

@media (max-width: 30rem) {
  .sb-c-marque::before { width: 28px; height: 28px; }
  .sb-c-marque .wp-block-site-title a {
    font-size: calc(var(--wp--preset--font-size--titre-fiche) + 1px);
  }

  /* L'ÉTAT RÉDUIT DOIT L'ÊTRE AUSSI ICI. Sans cette ligne, la règle générale
     de `a-defile` — plus large que celle-ci — reprenait la main au
     défilement : mesuré, 17,3 px réduit contre 15,3 px au repos. Un en-tête
     qui GRANDIT quand on descend est une erreur qu'on ne voit qu'en
     mesurant les deux états. */
  .sb-l-entete.a-defile .sb-c-marque::before { width: 24px; height: 24px; }
  .sb-l-entete.a-defile .sb-c-marque .wp-block-site-title a {
    font-size: var(--wp--preset--font-size--titre-fiche);
  }
}




/* Ce qui ne se règle pas par une variable : trois corrections, et elles
   valent pour les deux chemins d'entrée dans le sombre. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sb-c-pochette img,
  :root:not([data-theme="light"]) .sb-c-invite img,
  :root:not([data-theme="light"]) .sb-c-visuel img { filter: brightness(0.92); }
  :root:not([data-theme="light"]) .sb-c-barre-fixe {
    background: var(--wp--preset--color--carte);
    border: 1px solid var(--wp--preset--color--filet);
  }
}

/* Les pochettes et les portraits sortent d'un studio éclairé : sur une page
   sombre ils deviennent les seuls objets lumineux de l'écran et tirent l'œil
   avant le texte. Un voile très léger les ramène dans le plan, et il se lève
   au survol. */
:root[data-theme="dark"] .sb-c-pochette img,
:root[data-theme="dark"] .sb-c-invite img,
:root[data-theme="dark"] .sb-c-visuel img { filter: brightness(0.92); }

.sb-c-pochette img, .sb-c-invite img, .sb-c-visuel img { transition: filter 200ms ease; }
.sb-c-pochette img:hover, .sb-c-invite img:hover, .sb-c-visuel img:hover { filter: none; }

/* La barre fixe était sombre sur un site clair : c'était son contraste. Dans
   le sombre elle disparaîtrait dans le fond, donc elle s'éclaircit d'un cran
   et prend le filet. */
:root[data-theme="dark"] .sb-c-barre-fixe {
  background: var(--wp--preset--color--carte);
  border: 1px solid var(--wp--preset--color--filet);
}

/* ══ L'INTERRUPTEUR CLAIR / SOMBRE ═══════════════════════════════════════
   Un rond de 40 px dans l'en-tête, du diamètre d'une cible tactile moins
   les 4 px que la règle tolère sur une commande secondaire. Il ne porte ni
   texte ni libellé visible : son `aria-label` dit l'ACTION — « Passer en
   mode sombre » — et change avec l'état, ce qu'un `aria-pressed` sur une
   icône seule ne dirait pas aussi clairement.

   IL N'EXISTE QUE SI LE SCRIPT TOURNE. Le gabarit le pose `hidden` ; c'est
   le script qui le révèle. Un bouton de thème sans JavaScript est un bouton
   qui ne fait rien. */
.sb-c-theme {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  box-sizing: border-box;
  width: var(--end-pastille);
  height: var(--end-pastille);
  padding: 0;
  border: 1px solid var(--wp--preset--color--filet);
  border-radius: var(--wp--custom--rayon-rond);
  background: transparent;
  color: var(--wp--preset--color--encre-douce);
  cursor: pointer;
  transition: color 160ms ease, border-color 160ms ease, background 160ms ease;
}

.sb-c-theme[hidden] { display: none; }
.sb-c-theme svg { width: var(--end-pastille-icone); height: var(--end-pastille-icone); }

.sb-c-theme:hover,
.sb-c-theme:focus-visible {
  color: var(--wp--preset--color--turquoise-texte);
  border-color: var(--wp--preset--color--turquoise);
  background: color-mix(in srgb, var(--wp--preset--color--turquoise) 10%, transparent);
}

/* ── le nom, sous la barre, exactement comme les trois onglets ───────────
   Le libellé n'est plus un `aria-label` : c'est un MOT, posé dans le
   gabarit, qui sert à la fois d'infobulle au survol et de nom accessible du
   bouton. Les trois ronds voisins fonctionnent déjà ainsi — un bouton
   d'en-tête qui se comporte autrement que ses voisins se remarque, et il
   était le seul des quatre à ne rien dire au survol.

   ⚠️ `opacity` SEULE, jamais `visibility: hidden` ni `display: none`. Les
   deux sortiraient le mot de l'arbre d'accessibilité, et le bouton
   n'aurait alors plus aucun nom du tout — pire que l'`aria-label` qu'il
   remplace. La raison est écrite en entier à la navigation.

   L'ANCRE EST LE BOUTON, pas la rangée : `position: relative` ci-dessus.
   Sans elle, le mot irait se coller au bord droit de l'en-tête, loin du
   rond qui l'appelle. */
.sb-c-theme__nom {
  position: absolute;
  inset-block-start: calc(100% + 8px);
  inset-inline-end: 0;
  padding: 4px 10px;
  border-radius: var(--wp--custom--rayon-petit);
  background: var(--wp--preset--color--encre);
  color: var(--wp--preset--color--papier);
  font-family: var(--wp--preset--font-family--titre);
  font-size: 12px;
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: 0;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  transition: opacity 140ms ease;
}

.sb-c-theme:hover .sb-c-theme__nom,
.sb-c-theme:focus-visible .sb-c-theme__nom { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .sb-c-theme__nom { transition: none; }
}

/* Une seule des deux icônes est rendue : celle de la destination, pas celle
   de l'état. On montre le soleil quand un clic ramènerait au clair. */
.sb-c-theme .sb-c-theme__soleil { display: none; }
:root[data-theme="dark"] .sb-c-theme .sb-c-theme__soleil { display: block; }
:root[data-theme="dark"] .sb-c-theme .sb-c-theme__lune { display: none; }

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sb-c-theme .sb-c-theme__soleil { display: block; }
  :root:not([data-theme="light"]) .sb-c-theme .sb-c-theme__lune { display: none; }
}

/* ══ LES DEUX PAGES JURIDIQUES SONT JUSTIFIÉES ═══════════════════════════
   Demande du 21.10.2026, et elle ne vaut que pour ces deux-là : les mentions
   légales et la politique de données sont les seuls textes du site qu'on lit
   en bloc, d'une traite, sans images pour relancer l'œil. Un drapeau à
   droite y laisse une dentelle qui fait perdre la ligne.

   `hyphens: auto` n'est PAS une option ici. Sans césure, le justifié creuse
   des rivières blanches entre les mots dès que la colonne se rétrécit — et
   elle se rétrécit, sur un téléphone à 320 px. La langue est déclarée par
   `<html lang="fr-FR">`, donc le navigateur coupe selon les règles
   françaises ; sans cette déclaration, la césure n'aurait pas lieu.

   Les listes et les titres restent au drapeau : un titre justifié sur deux
   lignes s'étire jusqu'à la rupture, et une puce justifiée se lit comme une
   phrase coupée. */
.sb-s-legal .sb-c-chapo,
.sb-s-legal p[class*="sb-c-texte"],
.sb-s-donnees-personnelles .sb-c-chapo,
.sb-s-donnees-personnelles p[class*="sb-c-texte"] {
  text-align: justify;
  hyphens: manual;
}

/* ══ L'EN-TÊTE AVEC L'INTERRUPTEUR, SUR TÉLÉPHONE ════════════════════════
   🔴 L'interrupteur de thème a fait déborder l'en-tête de 19 à 25 px entre
   320 et 375 px — mesuré le 21.10.2026, après l'avoir posé. Il ne s'agit
   pas d'un défaut du bouton : l'en-tête tenait déjà au ras, et un quatrième
   palier avait été écrit en août pour récupérer 8 px. Quarante pixels de
   plus ne rentraient nulle part.

   On les reprend là où ils ne coûtent rien à la lecture : les écarts entre
   onglets se resserrent, et la gouttière de l'en-tête — et d'elle seule —
   descend à 12 px. Le corps de la page garde sa marge.

   ⚠️ CE PALIER NE TOUCHE PLUS À LA TAILLE DES RONDS. Il la rabaissait à
   30 px pour le seul interrupteur, ce qui le désaccordait des onglets restés
   à 38. Les tailles sont maintenant dans `--end-pastille`, plus haut, et
   l'en-tête a mesuré assez de place pour s'en passer : 58 px libres à 360 px,
   le plus serré des six. */
@media (max-width: 26rem) {
  .sb-l-entete > .wp-block-group,
  .sb-l-entete { padding-inline: 12px; }
  .sb-l-entete-rang { gap: 10px; }
  .sb-l-nav .wp-block-navigation__container { gap: 7px !important; }
}

/* ══ SOUS 21 rem, LA MARQUE SE RÉDUIT AU MONOGRAMME ══════════════════════
   À 320 px, le logo horizontal prend 175 des 320 px disponibles — plus de
   la moitié de la barre pour un mot déjà écrit dans l'onglet du navigateur
   et dans le titre de la page. Les trois onglets et l'interrupteur se
   partagent le reste, et il manquait 23 px.

   Le monogramme seul les rend d'un coup. Ce n'est pas un repli : c'est la
   forme que la marque prend quand la place manque, et elle existe déjà dans
   le dossier de marque — c'est la même que le favicon.

   `aria-label` n'est pas nécessaire : le `<h1>`/`<p>` du titre de site reste
   dans le document, c'est son IMAGE de fond qui change. Rien ne disparaît
   pour un lecteur d'écran. */
@media (max-width: 21rem) {
  .sb-c-marque::before {
    width: 30px;
    height: 30px;
    background-image: var(--end-logo);
  }
  .sb-l-entete.a-defile .sb-c-marque::before { width: 26px; height: 26px; }

  /* Le mot part de l'écran, PAS du document. Le monogramme le remplace à
     l'œil ; le titre de site reste lisible par un lecteur d'écran, qui ne
     voit pas l'image de fond. C'est le masquage accessible de la maison,
     et non `display: none`, qui l'aurait emporté pour tout le monde. */
  /* ⚠️ NI `position: absolute`, NI `clip-path`. Le lien de la marque est
     étiré par un `::after` en `position: absolute; inset: 0`, dont le bloc
     conteneur est `.sb-c-marque`.

     · POSITIONNER le titre ferait de LUI ce bloc conteneur, et la zone
       cliquable tomberait à 1 px ;
     · `clip-path` ne change pas le bloc conteneur, mais il DÉCOUPE tout le
       sous-arbre, `::after` compris — même punition, autre cause. Mesuré :
       à 320 px, `elementFromPoint` au centre du symbole rendait le `<div>`
       du groupe et aucun lien.

     Reste le masquage d'avant `clip-path` : 1 px de côté et débordement
     caché. Le texte demeure dans le document et dans l'arbre
     d'accessibilité — c'est tout ce qu'on lui demande. */
  .sb-c-marque .wp-block-site-title {
    width: 1px;
    height: 1px;
    margin: 0;
    padding: 0;
    overflow: hidden;
    white-space: nowrap;
    border: 0;
  }
}

/* ══ LE HAUT DE « À PROPOS » : LE TEXTE NE DÉPASSE PLUS LE PORTRAIT ══════
   Demande du 21.10.2026. Le bloc de texte descendait une quarantaine de
   pixels sous le bas du portrait, et le déséquilibre se voyait d'autant
   plus que le portrait est un cercle : son bas est un point, pas une ligne.

   Deux leviers, pris ensemble parce qu'aucun des deux ne suffisait : le
   portrait gagne 40 px de diamètre (il avait de la place dans sa colonne,
   il était simplement plafonné à 340), et les trois respirations du texte
   se resserrent d'un cran. Aucun texte n'est tronqué ni masqué — rien ne
   disparaît, la colonne se referme. */
@media (min-width: 60.01rem) {
  .sb-s-apropos-tete .sb-c-portrait img { max-width: 380px; }
  .sb-s-apropos-tete .sb-c-surtitre { margin-block-end: calc(var(--wp--custom--rythme) * 1.5); }
  .sb-s-apropos-tete .sb-c-titre { margin-block-end: calc(var(--wp--custom--rythme) * 2); }
  .sb-s-apropos-tete .sb-c-chapo { margin-block-end: calc(var(--wp--custom--rythme) * 2.5); }
  .sb-s-apropos-tete .sb-c-meta { margin-block-end: 0; }
}

/* ══ L'EXERGUE REJOINT LA COLONNE DE LECTURE ═════════════════════════════
   Demande du 21.10.2026 : le bloc noir prenait toute la largeur alors que
   tout ce qui le suit — « Qui parle », « Pour qui » — vit dans une grille à
   trois colonnes dont la DEUXIÈME porte le texte. L'exergue démarrait donc
   250 px à gauche du paragraphe qu'il annonce, et la page avait deux
   alignements au lieu d'un.

   ⚠️ LES DEUX VALEURS SUIVENT LA GRILLE, elles ne sont pas décoratives :
   `15rem` est la première colonne et `40rem` la deuxième, telles que
   `.sb-s-apropos-texte` les déclare quelques règles plus haut. Si cette
   grille change, celles-ci changent avec, sans quoi l'exergue décrochera
   en silence. Un `subgrid` l'aurait fait tout seul, mais il demande que le
   fond noir soit porté par un enfant, et le fond est sur la section. */
@media (min-width: 60.01rem) {
  /* LE BLOC REJOINT LA COLONNE DE LECTURE, PAR UNE BORDURE TRANSPARENTE.
     C'est la troisième tentative, et c'est la première qui ne recopie rien.

     Ce qui a été essayé avant : un `margin-inline-start` calculé à la main —
     il a décroché dès que la grille a changé de valeur, exactement comme son
     propre commentaire l'annonçait ; puis une vraie grille avec le fond en
     pseudo-élément — le fond ne couvrait plus qu'une rangée, parce que
     `grid-row: 1 / -1` ne s'étend pas sur les rangées IMPLICITES et que les
     deux enfants en créent.

     Une bordure transparente de la largeur du rail, plus `background-clip:
     padding-box`, donne un retrait que le fond ne peint pas. La section
     garde sa boîte — même largeur, même centrage que ses voisines — et le
     noir commence exactement où commence le paragraphe. Le jour où le rail
     change, il ne change qu'à un endroit.

     LES DEUX BORDS SONT DES BORDURES, et c'est une contrainte de WordPress
     autant qu'un choix. Borner la boîte et la replacer à la marge aurait
     été plus direct — mais la feuille de disposition du cœur impose
     `margin-left: auto !important` à tout enfant d'un conteneur contraint.
     Une marge calculée ne peut pas gagner, et lui répondre par un second
     `!important` est une dette qu'on paie plus tard.

     La boîte garde donc sa largeur de page, le cœur la centre comme il
     l'entend, et deux bordures transparentes ramènent le FOND exactement
     sur la colonne de lecture. Les quatre valeurs sont des jetons : le
     rail, la gouttière doublée, la mesure de lecture, la largeur de page.
     Aucun nombre écrit à la main. */
  /* ⚠️ ET IL FAUT RENDRE LE RAYON À LA BOÎTE INTERNE. Signalé par Yan le
     24.10.2026 : « les autres boxes sont arrondies, celle-là est carrée ».
     Le `border-radius` était bien écrit plus haut, et il ne manquait pas —
     il était ANNULÉ. Un rayon s'applique à la boîte de bordure ; le rayon
     de la boîte intérieure vaut celui-là MOINS l'épaisseur de la bordure,
     plancher à zéro. Avec deux cents pixels de bordure transparente, il
     tombe à zéro, et `background-clip: padding-box` ne montre que cette
     boîte-là. Des coins carrés, sans qu'une seule déclaration les demande.

     On redonne donc à chaque coin un rayon horizontal égal à sa bordure
     PLUS le rayon voulu, et un rayon vertical égal au rayon voulu — il n'y
     a pas de bordure en haut ni en bas. Les trois longueurs restent des
     jetons : aucun nombre écrit à la main. */
  .sb-s-apropos-exergue {
    --end-exergue-gauche: calc(var(--end-rail) + var(--wp--custom--gouttiere) * 2);
    --end-exergue-droite: calc(var(--end-page) - var(--end-rail) - var(--wp--custom--gouttiere) * 2 - var(--wp--custom--colonne));
    --end-exergue-rayon: calc(var(--wp--custom--rayon) + 6px);
    box-sizing: border-box;
    border-inline-start: var(--end-exergue-gauche) solid transparent;
    border-inline-end: var(--end-exergue-droite) solid transparent;
    background-clip: padding-box;
    border-start-start-radius: calc(var(--end-exergue-gauche) + var(--end-exergue-rayon)) var(--end-exergue-rayon);
    border-end-start-radius: calc(var(--end-exergue-gauche) + var(--end-exergue-rayon)) var(--end-exergue-rayon);
    border-start-end-radius: calc(var(--end-exergue-droite) + var(--end-exergue-rayon)) var(--end-exergue-rayon);
    border-end-end-radius: calc(var(--end-exergue-droite) + var(--end-exergue-rayon)) var(--end-exergue-rayon);
  }
}

/* ══ LE TÉLÉPHONE, RESSERRÉ ══════════════════════════════════════════════
   Demande du 21.10.2026 : « moins d'espacement tout en étant aéré
   modérément ». Mesuré sur la capture — entre le chapô de la une et la
   première plateforme, il y avait près de 200 px de vide, et le titre
   flottait à 180 px de son propre chapô. Sur un écran de 390 px de large,
   chaque vide de cette taille coûte un demi-écran de défilement pour rien.

   LE PRINCIPE, et il n'est pas « tout réduire » : on ne touche qu'aux
   écarts ENTRE blocs, jamais à l'interligne ni au rythme interne d'un
   paragraphe. Un texte tassé se lit mal ; une page tassée se lit vite. Les
   écarts passent d'environ 3 à 6 unités de rythme à 1,5 à 3 — ils restent
   donc des écarts, et la hiérarchie tient : le vide avant un titre reste
   plus grand que celui qui le suit.

   `48rem` et non `60rem` : au-delà, la une est en deux colonnes et ces
   vides portent la mise en page. C'est en UNE colonne qu'ils s'additionnent
   les uns derrière les autres. */
@media (max-width: 48rem) {
  .sb-s-accueil-une,
  .sb-s-apropos-tete,
  .sb-s-episode-tete {
    padding-block: calc(var(--wp--custom--rythme) * 2) calc(var(--wp--custom--rythme) * 2.5);
    row-gap: calc(var(--wp--custom--rythme) * 2);
  }

  .sb-s-accueil-une .sb-c-surtitre,
  .sb-s-apropos-tete .sb-c-surtitre { margin-block: calc(var(--wp--custom--rythme) * 1.5) calc(var(--wp--custom--rythme)); }

  .sb-s-accueil-une .sb-c-titre,
  .sb-s-apropos-tete .sb-c-titre { margin-block: 0 calc(var(--wp--custom--rythme) * 1.5); }

  .sb-c-chapo { margin-block-end: calc(var(--wp--custom--rythme) * 2); }

  /* La grille des plateformes : une colonne pleine en dessous de 15 rem de
     piste, donc deux par rang dès qu'il y a la place. L'écart au-dessus
     passe de 24 à 12 px. */
  .sb-l-plateformes { margin-block-start: calc(var(--wp--custom--rythme) * 1.5); }
  .sb-l-plateformes--rangee { gap: calc(var(--wp--custom--rythme)); }

  /* Le visuel de la une : il arrive au-dessus du texte en une colonne, et
     il n'a pas besoin de deux respirations pleines pour s'en détacher. */
  .sb-c-visuel, .sb-c-pochette-episode, .sb-c-portrait {
    margin-block-end: calc(var(--wp--custom--rythme) * 1.5);
  }

  /* La carte du lecteur, et les sections qui suivent. */
  .sb-s-accueil-lecteur, .sb-s-episode-lecteur {
    margin-block: calc(var(--wp--custom--rythme) * 2);
  }

  .sb-s-apropos-texte, .sb-s-apropos-pour-qui,
  .sb-s-episode-notes, .sb-s-accueil-episodes,
  .sb-s-accueil-abonner, .sb-s-episode-abonner, .sb-s-apropos-appel {
    padding-block: calc(var(--wp--custom--rythme) * 2);
  }

  .sb-s-apropos-exergue { margin-block: calc(var(--wp--custom--rythme) * 2.5); }

  /* Entre deux fiches d'épisode, 12 px suffisent : chaque fiche porte déjà
     son propre fond, c'est lui qui les sépare. */
  .sb-l-episodes { margin-block-end: calc(var(--wp--custom--rythme) * 1.5); }
}

/* ══ LA VITESSE DE LECTURE ═══════════════════════════════════════════════
   Un cran, pas un curseur. Le bouton porte sa valeur en toutes lettres —
   « 1× », « 1,25× » — parce qu'une icône de vitesse ne dit jamais laquelle
   est active, et que c'est la seule chose qu'on veut savoir.

   IL RESTE DISCRET TANT QU'IL EST À 1×. La vitesse neutre est l'état de la
   quasi-totalité des écoutes : la montrer comme un réglage actif ferait
   croire qu'on a touché à quelque chose. Dès qu'elle change, la pastille
   prend l'aplat — on la retrouve du coin de l'œil, et on sait pourquoi la
   voix va vite. */
.sb-c-vitesse,
.sb-c-barre-fixe__vitesse {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 52px;
  height: 32px;
  padding-inline: 10px;
  border: 1px solid var(--wp--preset--color--filet);
  border-radius: var(--wp--custom--rayon-rond);
  background: transparent;
  color: var(--wp--preset--color--encre-douce);
  font-family: var(--wp--preset--font-family--titre);
  font-size: 13px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 1;
  cursor: pointer;
  transition: color 160ms ease, border-color 160ms ease, background 160ms ease;
}

.sb-c-vitesse:hover, .sb-c-vitesse:focus-visible,
.sb-c-barre-fixe__vitesse:hover, .sb-c-barre-fixe__vitesse:focus-visible {
  color: var(--wp--preset--color--turquoise-texte);
  border-color: var(--wp--preset--color--turquoise);
  background: color-mix(in srgb, var(--wp--preset--color--turquoise) 10%, transparent);
}

.sb-c-vitesse.est-modifiee,
.sb-c-barre-fixe__vitesse.est-modifiee {
  background: var(--end-plein);
  border-color: var(--end-plein);
  color: var(--end-plein-texte);
}

/* Dans la barre du bas, le fond est l'encre : le contour neutre y
   disparaîtrait, et le texte doux n'y aurait pas son contraste. */
.sb-c-barre-fixe__vitesse {
  border-color: color-mix(in srgb, var(--wp--preset--color--lecteur-texte) 35%, transparent);
  color: var(--wp--preset--color--lecteur-texte);
}

/* Sous 60 rem, la barre du bas tient à peine : la vitesse s'efface, elle
   reste réglable depuis la grande carte. */
@media (max-width: 60rem) {
  .sb-c-barre-fixe__vitesse { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .sb-c-vitesse, .sb-c-barre-fixe__vitesse { transition: none; }
}

/* ══ LE PORTRAIT EST RECADRÉ SUR SON SUJET ═══════════════════════════════
   Mesuré le 23.10.2026 sur `yan-haltey.jpg`, 900 × 900 : le sujet occupe la
   bande 168 → 898. Il y a donc 168 px de fond noir au-dessus de la tête et
   RIEN en dessous — le buste sort du cadre. Dans un rond, cela se voit :
   un croissant vide en haut, les épaules coupées en bas.

   L'instrument portait son témoin : la même mesure sur l'image retournée
   doit rendre le symétrique exact. Elle rend 472,9 là où 473,0 était
   attendu — 0,09 px d'écart, donc la mesure ne penche pas.

   LE FOND NE PEUT PAS ÊTRE PROLONGÉ : il est noir uniforme en haut (6 à
   12 sur 255) mais le bas du cadre est plein de la chemise. Rallonger
   l'image y poserait du noir sous un buste coupé. On recadre donc dans le
   rond, et c'est au CSS de le faire.

   🔴 PREMIER CADRAGE, ET IL CENTRAIT LA MAUVAISE CHOSE. On avait calé la
   boîte DU SUJET — cheveux compris, 168 → 898 — sur le centre du rond : une
   remontée de 83 px, soit 9,2 % du cadre. Le résultat est géométriquement
   juste et photographiquement faux. Le haut des cheveux venait toucher le
   bord du rond, et le VISAGE, lui, tombait à 23 % de la hauteur : un portrait
   tassé en haut, deux tiers de chemise dessous.

   25.10.2026, Yan : « recentre le visage au 2/3 haut dans le rond ». C'est le
   cadrage de portrait ordinaire — le visage au centre des DEUX TIERS
   supérieurs, donc son milieu au tiers de la hauteur.

   Les nombres, dans la source de 900 : front à 215, menton à 425, milieu du
   visage à 320. Avec une échelle de 1,23, le milieu du visage tombe à

       −0,115 + 1,23 t + 320 × 1,23 / 900   de la hauteur du rond,

   et l'égaler à 1/3 donne t = 0,9 %. L'échelle ne bouge pas : c'est elle qui
   garantit que le bas du rond reste rempli, et elle est mesurée. Le haut des
   cheveux atterrit à 10 % — il respire au lieu de buter. Les épaules perdent
   toujours un peu de chaque côté : elles touchaient déjà les bords, aucun
   recadrage vertical ne les épargne. */
.sb-c-portrait {
  overflow: hidden;
  border-radius: 50%;
  /* La figure devient le masque : sans boîte ronde, l'agrandissement
     déborderait sur le texte à sa gauche. */
  inline-size: fit-content;
  margin-inline: auto;
}

.sb-c-portrait img {
  /* Le translate s'applique APRÈS l'échelle, donc dans ses unités. */
  transform: scale(1.23) translateY(0.9%);
}

@media (prefers-reduced-motion: reduce) {
  .sb-c-portrait img { transition: none; }
}

/* ══ L'ATTENTE D'UNE NAVIGATION SE VOIT ══════════════════════════════════
   Le script prend les clics internes en main pour ne pas couper le son, et
   le navigateur cesse alors de montrer son indicateur de chargement : plus
   de barre qui avance dans l'onglet, plus de peinture progressive. Mesuré
   le 24.10.2026 sur la production, le HTML d'une page arrive en 320 à
   800 ms — et jusque-là, l'écran est strictement immobile. C'est cette
   immobilité qu'on prend pour de la lenteur.

   Elle ne s'affiche qu'au-delà de 140 ms (c'est le script qui compte) :
   avec la page déjà préchargée l'échange tient dans un cadre, et une barre
   qui clignoterait là renseignerait moins qu'elle ne dérangerait.

   LA BARRE N'ANNONCE PAS UNE DURÉE qu'on ne connaît pas. Elle part vite,
   ralentit, et s'arrête à 92 % : atteindre le bout avant que la page
   n'arrive serait un mensonge, et un mensonge qui se répète à chaque
   clic. */
html.a-en-route { cursor: progress; }

html.a-en-route::before {
  content: '';
  position: fixed;
  inset-block-start: 0;
  inset-inline-start: 0;
  z-index: 60;            /* au-dessus de l'en-tête collant, qui est à 50 */
  block-size: 2px;
  background: var(--wp--preset--color--turquoise);
  animation: sb-en-route 2.2s cubic-bezier(0.05, 0.75, 0.2, 1) forwards;
}

@keyframes sb-en-route {
  from { inline-size: 0; }
  to   { inline-size: 92%; }
}

/* Sans animation, la barre devient un filet franc : il dit « ça travaille »
   sans rien faire bouger. */
@media (prefers-reduced-motion: reduce) {
  html.a-en-route::before { animation: none; inline-size: 100%; opacity: 0.55; }
}

/* ══ LE HAUT DE PAGE SIGNE LE PODCAST — 24.10.2026 ═══════════════════════
   Demande de Yan : « plus sexy et différenciant, trop plat, pas trop fancy ».
   Le haut de page était du texte noir sur du papier, puis une rangée de cinq
   logos de plateformes en couleur. Rien ne disait « podcast », et cinq
   marques tierces parlaient avant la nôtre.

   Trois gestes, aucun décoratif :

   1. LE SYMBOLE DE LA MARQUE, EN GRAND, coupé par le bord droit. Il existait
      déjà comme filigrane à 3,5 % d'opacité — et il avait été RETIRÉ le
      23.10.2026 parce qu'il n'était plus qu'une tache grise. La leçon
      n'était pas « pas de filigrane », c'était « un filigrane trop pâle est
      une salissure ». À 17 % et en turquoise de marque, ce n'est plus un
      filigrane : c'est une forme.

   2. UNE ONDE SONORE en pied de bloc. C'est le seul signe qui dise
      « podcast » sans une icône ni un mot. Elle est dans `assets/img/onde.svg`,
      pas en `data:` dans cette feuille : 7,8 Ko de barres n'ont rien à faire
      dans une feuille de style qu'on relit.

   3. LES PLATEFORMES DEVIENNENT DES PASTILLES. Leur plaque de marque prend
      l'encre, leur glyphe prend le fond — la silhouette reste reconnaissable
      (le rond de Spotify, le rectangle arrondi de YouTube) mais plus aucune
      couleur tierce ne passe avant la nôtre. Le nom reste lu par les
      lecteurs d'écran.

   ⚠️ CE BLOC EST ÉCRIT EN DERNIER, ET C'EST VOULU. Trois autres endroits de
   cette feuille décident déjà de `.sb-s-accueil-une::before`, dont un qui le
   neutralise par `content: none`. À spécificité égale, la dernière écrite
   gagne — c'est la leçon de `deux-mises-en-page-pour-le-meme-bloc`, et plutôt
   que d'aller démêler trois paliers éparpillés sur mille lignes, on rassemble
   ici tout ce qui concerne le haut de page.

   ⚠️ PAS DE `100vw`. Le plein format était tentant ; `100vw` compte la barre
   de défilement et fait déborder tout bureau qui en affiche une. Le bloc
   garde la colonne — la même que la carte du lecteur juste en dessous, ce qui
   vaut mieux qu'un plein format isolé. */

/* ⚠️ LE PIED DU BLOC DOIT ÊTRE PLUS HAUT QUE L'ONDE. Elle est posée en
   absolu : elle ne pousse rien, et le dernier élément du texte lui rentre
   dedans si la réserve est trop courte. 120 > 104 sur grand écran, 96 > 76
   au téléphone. Changer l'une des deux hauteurs, c'est changer l'autre. */
.sb-s-accueil-une {
  display: block;
  position: relative;
  overflow: hidden;
  padding-block: calc(var(--wp--custom--rythme) * 7) calc(var(--wp--custom--rythme) * 15);
  border-block-end: 1px solid var(--wp--preset--color--filet);
}

/* ⚠️ `.wp-block-group.` EST OBLIGATOIRE ICI. Plus haut dans cette feuille,
   `.wp-block-group.sb-s-accueil-une > *` pose `max-width: none` avec deux
   classes : une seule classe perdrait, où qu'on l'écrive. Même cause que le
   portrait d'« À propos », corrigé le même jour. */
.wp-block-group.sb-s-accueil-une > * { position: relative; z-index: 2; max-width: 46rem; }
.sb-s-accueil-une .sb-c-titre { font-size: clamp(40px, 6.2vw, 76px); }
.sb-s-accueil-une .sb-c-chapo { max-width: 52ch; }

.sb-s-accueil-une::before {
  content: "";
  position: absolute;
  z-index: 1;
  inset-block: -18% -6%;
  inset-inline-end: -9%;
  inset-inline-start: auto;
  width: 42%;
  background: var(--end-logo) center / contain no-repeat;
  opacity: 0.17;
  pointer-events: none;
}

.sb-s-accueil-une::after {
  content: "";
  position: absolute;
  z-index: 1;
  inset-inline: 0;
  inset-block-end: 0;
  height: 104px;
  background: var(--end-onde) 0 100% / 100% 100% no-repeat;
  opacity: 0.34;
  pointer-events: none;
}

/* ── les plateformes, en pastilles ─────────────────────────────────────── */

/* La commande d'abord, les pastilles ensuite : une action principale, puis
   le choix de l'application pour qui en a une. */
.sb-s-accueil-une .sb-c-abonner { margin-block: calc(var(--wp--custom--rythme) * 4) 0; }

.sb-s-accueil-une .sb-l-plateformes {
  display: flex;
  flex-wrap: wrap;
  gap: calc(var(--wp--custom--rythme) * 1.5);
  margin-block: calc(var(--wp--custom--rythme) * 3) 0;
  padding: 0;
  list-style: none;
}

.sb-s-accueil-une .sb-c-plateforme {
  display: inline-flex;
  width: 40px;
  height: 40px;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
  color: var(--wp--preset--color--encre-douce);
  transition: color 160ms ease, transform 160ms ease;
}

.sb-s-accueil-une .sb-c-plateforme:hover,
.sb-s-accueil-une .sb-c-plateforme:focus-visible {
  color: var(--wp--preset--color--turquoise-texte);
  transform: translateY(-2px);
}

.sb-s-accueil-une .sb-c-plateforme__icone { display: block; }
.sb-s-accueil-une .sb-c-plateforme__icone svg { width: 34px; height: 34px; }

/* ⚠️ PLUS DE PLAQUE À SÉPARER DU GLYPHE. Les cinq marques étaient dessinées
   à la main, chacune avec sa plaque de couleur et son glyphe blanc par
   dessus, et cette feuille retournait les deux pour les rendre monochromes.
   Ça marchait, et c'était faux : mesuré le 24.10.2026, les glyphes allaient
   de 7,20 à 16,83 d'unité de haut — du simple au double — sur trois formes
   de plaque différentes, et le micro dessiné pour Apple Podcasts n'était pas
   leur marque.

   Les cinq viennent maintenant de `simple-icons` (CC0), qui les dessine en
   UN SEUL TRACÉ plein, dans la même boîte de 24, équilibrés comme une série.
   La marque prend `currentColor` et il n'y a plus rien à accorder.

   ⚠️ Apple interdit de redessiner son icône — « do not create graphics,
   illustrations, or logotypes to represent Apple Podcasts ». Le choix de
   garder une rangée monochrome a été pris par Yan le 24.10.2026, en
   connaissance de cette règle. Y revenir, c'est reprendre les artworks
   officiels de chaque marque, en couleur. */
.sb-s-accueil-une .sb-c-plateforme__icone svg { fill: currentColor; }

/* Le nom part de l'écran, pas de l'arbre d'accessibilité. */
.sb-s-accueil-une .sb-c-plateforme__texte {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

@media (prefers-reduced-motion: reduce) {
  .sb-s-accueil-une .sb-c-plateforme { transition: none; }
  .sb-s-accueil-une .sb-c-plateforme:hover { transform: none; }
}

@media (max-width: 60rem) {
  .sb-s-accueil-une {
    padding-block: calc(var(--wp--custom--rythme) * 4) calc(var(--wp--custom--rythme) * 12);
  }
  /* ⚠️ `display: block` N'EST PAS DE TROP. Deux `@media (max-width: 60rem)`
     plus haut posent `display: none` sur ce pseudo-élément — c'était le
     filigrane qu'on coupait au téléphone. À spécificité égale la dernière
     règle gagne, mais SEULEMENT sur les propriétés qu'elle redéclare : sans
     cette ligne, le symbole reste caché sous 60 rem. Mesuré, pas supposé. */
  .sb-s-accueil-une::before {
    display: block;
    inset-block: 2% auto;
    inset-inline-end: -26%;
    width: 74%;
    aspect-ratio: 1;
    opacity: 0.13;
  }
  .sb-s-accueil-une::after { height: 76px; }
  .sb-s-accueil-une .sb-c-plateforme { width: 36px; height: 36px; }
  .sb-s-accueil-une .sb-c-plateforme__icone svg { width: 30px; height: 30px; }
}

/* ══ LA CARTE D'UNE PAGE D'ÉPISODE SE RÉDUIT À UNE BARRE — 24.10.2026 ════
   Trois défauts signalés par Yan sur la même carte, et trois causes
   différentes qu'il valait mieux ne pas confondre.

   1. LA POCHETTE Y ÉTAIT UNE SECONDE FOIS. La fiche porte déjà la grande
      carte 16:9 en haut de page ; la vignette de 196×110 juste en dessous
      montrait la même image et faisait à elle seule les deux tiers de la
      hauteur du bloc. Elle part — sur CETTE carte seulement, celle qui
      déclare son épisode. La carte du lecteur, sur l'accueil, la garde.

   2. LA CARTE ÉTAIT TROP HAUTE : 166 px pour un titre, une durée et un
      bouton. Sans la vignette, elle tient en une barre.

   3. 🔴 LE BOUTON NE DISAIT PAS QU'ÇA JOUAIT — et ce n'était pas un défaut
      du script. Mesuré : au clic, le texte du lien passe bien de « Écouter
      l'épisode 5 » à « En cours d'écoute », la carte reçoit `est-en-cours`
      et la barre du bas passe à Pause. Tout marchait. Mais cette feuille
      pose `font-size: 0` sur ce lien et dessine un triangle en `::after` :
      l'état était calculé, écrit, et invisible.

      ⚠️ LA LEÇON N'EST PAS « le script avait raison ». C'est qu'un état
      annoncé par du TEXTE sur un bouton rendu en ICÔNE n'est annoncé à
      personne — sauf aux lecteurs d'écran, qui eux l'entendaient. Le rond
      montre donc maintenant deux barres quand l'épisode tourne.

   ⚠️ CE QUI N'A PAS ÉTÉ FAIT, ET POURQUOI. On n'a pas monté le vrai lecteur
   sur cette carte. La séparation est délibérée et `lecteur.js` l'explique :
   la carte parle de CET épisode, le lecteur joue CE QU'ON ÉCOUTE. Les avoir
   confondues faisait qu'en écoutant Mehdi puis en ouvrant la fiche de
   Stéphanie, la page de Stéphanie portait la carte de Mehdi. */

.sb-s-episode-lecteur[data-lecteur-depart] .sb-c-pochette { display: none; }

.sb-s-episode-lecteur[data-lecteur-depart] {
  gap: calc(var(--wp--custom--rythme) * 2.5);
  padding: calc(var(--wp--custom--rythme) * 2) calc(var(--wp--custom--rythme) * 3);
  min-height: 0;
}

/* Les trois lignes se resserrent : surtitre, titre, durée. La barre de
   progression n'est pas là — c'est la barre du bas qui la porte — donc le
   rang qui l'accueille d'habitude n'a pas besoin de sa respiration. */
.sb-s-episode-lecteur[data-lecteur-depart] .sb-l-lecteur-corps { gap: 2px; }
.sb-s-episode-lecteur[data-lecteur-depart] .sb-l-lecteur-piste { margin-block-start: 2px; }
.sb-s-episode-lecteur[data-lecteur-depart] .sb-c-surtitre { margin-block-end: 0; }
.sb-s-episode-lecteur[data-lecteur-depart] .sb-c-piste { margin-block: 0; }
.sb-s-episode-lecteur[data-lecteur-depart] .sb-c-duree {
  margin: 0;
  font-size: var(--wp--preset--font-size--legende);
}

/* Deux barres au lieu du triangle : une seule, plus son ombre portée. */
.est-en-cours .sb-c-ecouter .wp-block-button__link::after {
  width: 4px;
  height: 14px;
  border: 0;
  background: currentColor;
  box-shadow: 8px 0 0 currentColor;
  margin-inline-start: -4px;
}

/* ⚠️ RETIRER LA VIGNETTE NE SUFFIT PAS : LA GRILLE GARDE SA COLONNE.
   Mesuré à 390 px après l'avoir masquée — le bouton montait en haut à
   gauche dans la case vide de la pochette, le surtitre se décalait d'une
   colonne et la durée restait seule sur un troisième rang. La carte
   mesurait 174 px pour trois lignes de texte.

   Les paliers téléphone du lecteur placent chaque enfant dans une grille
   dessinée AUTOUR de la pochette, et `display: contents` sur le corps leur
   livre ses enfants. Masquer un élément ne reprend pas la mise en page qui
   l'entourait. Cette carte-là n'a plus besoin d'une grille : un titre et un
   bouton tiennent sur une rangée. */
@media (max-width: 60rem) {
  .sb-s-episode-lecteur[data-lecteur-depart] {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: calc(var(--wp--custom--rythme) * 2);
  }
  .sb-s-episode-lecteur[data-lecteur-depart] .sb-l-lecteur-corps {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-width: 0;
    gap: 2px;
  }
  .sb-s-episode-lecteur[data-lecteur-depart] .sb-l-lecteur-piste {
    grid-column: auto;
    grid-row: auto;
    margin-block-start: 2px;
  }
  .sb-s-episode-lecteur[data-lecteur-depart] .sb-c-ecouter {
    flex: 0 0 auto;
    grid-column: auto;
    grid-row: auto;
  }
}

/* ══ LA PRÉSENTATION, EN BAS DE L'ACCUEIL — 24.10.2026 ═══════════════════
   Demande de Yan : « il manque un lien vers À propos en bas de l'accueil ».
   Il n'y en avait aucun dans le corps de la page — seulement l'onglet du
   menu et une ligne du pied. Quelqu'un qui descend jusqu'au bout de la
   liste des épisodes ne trouvait rien qui dise qui parle.

   Une carte, pas une section pleine : le portrait rond à gauche, trois
   lignes et un lien à droite. Elle ne refait pas le haut de la page
   « À propos » — elle y mène.

   ⚠️ LE PORTRAIT EST UN COMPOSANT PARTAGÉ, ET IL A DÉJÀ UNE PLACE. Plus
   haut, `.sb-c-visuel, .sb-c-portrait, .sb-c-pochette-episode` les envoie
   tous en `grid-column: 2`, pour la grille à deux colonnes d'« À propos ».
   Ici il est à gauche : il faut donc le replacer explicitement, sinon il
   atterrit dans la colonne du texte. Son recadrage circulaire, lui, est
   celui du composant et n'est pas redéclaré. */

.sb-s-accueil-apropos {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  column-gap: calc(var(--wp--custom--rythme) * 4);
  align-items: start;
  margin-block: calc(var(--wp--custom--rythme) * 4);
  padding: calc(var(--wp--custom--rythme) * 5);
  border-radius: calc(var(--wp--custom--rayon) + 6px);
  background: var(--wp--preset--color--carte);
}

.sb-s-accueil-apropos .sb-c-portrait {
  grid-column: 1;
  grid-row: 1 / span 4;
  width: 120px;
  margin: 0;
}

/* `.wp-block-group.` est obligatoire : la feuille de WordPress borne les
   enfants d'un groupe à la largeur de contenu et leur pose `margin-inline`.
   Une seule classe perdrait, où qu'on l'écrive. */
.wp-block-group.sb-s-accueil-apropos > *:not(.sb-c-portrait) {
  grid-column: 2;
  max-width: none;
  margin-block: 0;
  margin-inline: 0;
}

.sb-s-accueil-apropos .sb-c-surtitre { margin-block-end: calc(var(--wp--custom--rythme)); }
.sb-s-accueil-apropos .sb-c-titre {
  font-size: var(--wp--preset--font-size--titre-section);
  margin-block-end: calc(var(--wp--custom--rythme) * 1.5);
}
/* ⚠️ `> .sb-c-texte`, PAS UN DESCENDANT. La règle du dessus porte
   `:not(.sb-c-portrait)`, et `:not()` compte la spécificité de son
   argument : trois classes contre deux. Mesuré — le texte s'étalait sur
   les 1216 px de la carte au lieu de garder sa mesure de lecture. */
.wp-block-group.sb-s-accueil-apropos > .sb-c-texte {
  max-width: 54ch;
  margin-block-end: calc(var(--wp--custom--rythme) * 2);
}

/* Le lien est rendu en `wp:buttons` par le compilateur : on lui retire sa
   peau de bouton, comme pour `.sb-c-fiche`. */
.sb-s-accueil-apropos .sb-c-lien .wp-block-button__link {
  min-height: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--wp--preset--color--turquoise-texte);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 700;
  text-decoration: none;
}

.sb-s-accueil-apropos .sb-c-lien .wp-block-button__link:hover {
  background: transparent;
  text-decoration: underline;
}

@media (max-width: 60rem) {
  .sb-s-accueil-apropos {
    grid-template-columns: minmax(0, 1fr);
    row-gap: calc(var(--wp--custom--rythme) * 2);
    padding: calc(var(--wp--custom--rythme) * 3);
  }
  .sb-s-accueil-apropos .sb-c-portrait { grid-column: 1; grid-row: auto; width: 96px; }
  .wp-block-group.sb-s-accueil-apropos > *:not(.sb-c-portrait) { grid-column: 1; }
}

/* ══ TROIS REPRISES DE LA CARTE DU LECTEUR ET DE SA VOISINE — 24.10.2026 ══

   1. LA VIGNETTE ÉTAIT TROP PETITE POUR CE QU'ELLE MONTRE. Depuis que le
      lecteur sert la bannière 16:9 de l'épisode et non plus la photo de son
      invité, l'image porte du TEXTE — le titre, la rubrique, la marque. À
      196 px de large, le titre de l'épisode y mesure environ 6 px de haut :
      illisible. La bannière passe à 340 px (191 de haut), et à 200 au
      téléphone. On ne gagne rien à l'agrandir davantage : au-delà, c'est la
      carte entière qu'il faudrait redessiner.

   2. « VOIR LA DESCRIPTION » PRENAIT TOUTE LA LARGEUR pour un lien de
      125 px — un filet plein format de 1160 px, plus 40 px de respiration,
      au-dessus d'un seul mot. Le filet disparaît, l'écart se resserre, et le
      lien se range à gauche sans occuper la ligne.

   3. LA CARTE « QUI PARLE » RESSEMBLAIT À UN ÉPISODE. Signalé par Yan : même
      peau qu'une fiche — carte blanche, même rayon, même largeur, posée juste
      après la liste. Elle se lisait comme un septième épisode. Elle quitte
      donc le costume de carte : fond de page, un filet au-dessus pour la
      séparer de la liste, et son lien devient un petit bouton. Une section,
      pas un item. */

/* ── 1 · la bannière, lisible ──────────────────────────────────────────── */

.sb-s-accueil-lecteur .sb-c-pochette,
.sb-s-accueil-lecteur .sb-c-pochette img { width: 340px; }

@media (max-width: 60rem) {
  .sb-s-accueil-lecteur .sb-c-pochette,
  .sb-s-accueil-lecteur .sb-c-pochette img { width: 200px; }
}

/* ⚠️ LA FORME COMPACTE N'EST PAS CONCERNÉE. Sa vignette est un carré de
   40 px dans une barre d'une seule ligne ; lui donner 340 px la ferait
   déborder de l'écran. Les deux règles ci-dessus ne nomment que la carte
   dépliée, et celle de `.est-compact` est écrite plus haut — mais à
   spécificité supérieure, donc elle tient. Vérifié, pas supposé. */

/* ── 2 · la description, discrète ──────────────────────────────────────── */

.sb-c-lecteur-description {
  margin-block-start: calc(var(--wp--custom--rythme) * 1.5);
  padding-block-start: 0;
  border-top: 0;
}

/* ── 3 · « Qui parle » devient une section, plus une fiche ─────────────── */

.sb-s-accueil-apropos {
  margin-block: calc(var(--wp--custom--rythme) * 7) calc(var(--wp--custom--rythme) * 2);
  padding: calc(var(--wp--custom--rythme) * 5) 0 0;
  border-radius: 0;
  border-block-start: 1px solid var(--wp--preset--color--filet);
  background: transparent;
}

/* Le lien devient un bouton — petit, contourné, pas un aplat : la commande
   principale de la page reste « Écouter le dernier épisode », en haut. */
.sb-s-accueil-apropos .sb-c-lien .wp-block-button__link {
  display: inline-flex;
  align-items: center;
  min-height: 40px;
  padding-inline: calc(var(--wp--custom--rythme) * 2.5);
  border: 1.5px solid var(--wp--preset--color--encre);
  border-radius: var(--wp--custom--rayon-rond);
  background: transparent;
  color: var(--wp--preset--color--encre);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 700;
  text-decoration: none;
}

.sb-s-accueil-apropos .sb-c-lien .wp-block-button__link:hover {
  background: var(--wp--preset--color--encre);
  color: var(--wp--preset--color--papier);
  text-decoration: none;
}

@media (max-width: 60rem) {
  .sb-s-accueil-apropos {
    margin-block: calc(var(--wp--custom--rythme) * 5) calc(var(--wp--custom--rythme) * 2);
    padding: calc(var(--wp--custom--rythme) * 4) 0 0;
  }
}

/* ⚠️ UNE BANNIÈRE DE 200 PX NE TIENT PAS DANS UNE COLONNE DE VIGNETTE.
   Mesuré à 390 px juste après l'avoir agrandie : la grille du téléphone
   garde la bannière en colonne 1 et laisse 150 px au texte — « INTERVIEW ·
   EN COURS » passait sur trois lignes et le titre sur trois autres.

   Même famille que la carte d'épisode ce soir : changer la TAILLE d'un
   élément ne reprend pas la grille dessinée autour de son ancienne taille.
   Sous 60 rem, la carte dépliée se réorganise donc en trois rangs — la
   bannière pleine largeur, le texte, puis les commandes — au lieu de deux
   colonnes qui n'ont plus les proportions pour. */
@media (max-width: 60rem) {
  .sb-s-accueil-lecteur:not(.est-compact) {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    column-gap: calc(var(--wp--custom--rythme) * 1.5);
    row-gap: calc(var(--wp--custom--rythme) * 1.5);
    align-items: center;
  }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-pochette,
  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-pochette img { width: 100%; }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-pochette {
    grid-column: 1 / -1;
    grid-row: 1;
  }

  /* `display: block` ANNULE le `display: contents` posé plus haut : une
     fois le corps redevenu une boîte, les placements de grille de ses
     enfants ne s'appliquent plus, et son contenu reprend le flux normal. */
  .sb-s-accueil-lecteur:not(.est-compact) .sb-l-lecteur-corps {
    display: block;
    grid-column: 1 / -1;
    grid-row: 2;
    min-width: 0;
  }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-vitesse {
    grid-column: 1;
    grid-row: 3;
    justify-self: start;
  }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-jouer {
    grid-column: 2;
    grid-row: 3;
    justify-self: end;
  }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-lecteur-description {
    grid-column: 1 / -1;
    grid-row: 4;
  }
}

/* ══ L'ONDE VIVANTE, ET TROIS RÉGLAGES DE PLUS — 24.10.2026 ═════════════

   LE CANVAS prend la place exacte du `::after` qui dessine l'onde fixe, et
   la classe `a-onde-vive` — posée par `lecteur.js` seulement quand le
   montage a réussi — efface ce `::after`. Si le script ne tourne pas, si
   l'AudioContext refuse de démarrer, ou si la moindre erreur survient, la
   classe n'est jamais posée : l'onde fixe reste, et rien n'a changé. */

/* ⚠️ `max-width: none` N'EST PAS DÉCORATIF. Le canvas est un enfant direct
   de la une, donc il tombe sous `.wp-block-group.sb-s-accueil-une > *`, qui
   borne les enfants à 46 rem pour garder la mesure de lecture. Mesuré : le
   canvas faisait 736 px au lieu de 1216, et l'onde s'arrêtait aux deux
   tiers de la page. Une règle écrite pour le TEXTE attrapait un élément qui
   n'en est pas.

   ⚠️ ET IL FAUT DEUX CLASSES POUR LE DIRE. Écrit sur `.sb-c-onde` seul, le
   `max-width: none` perdait contre ces deux classes-là et le canvas est
   resté à 736 px — remesuré, pas supposé. Quatrième fois dans la journée
   qu'une règle juste perd par spécificité. */
.wp-block-group.sb-s-accueil-une > .sb-c-onde { max-width: none; }

.sb-c-onde {
  position: absolute;
  z-index: 1;
  inset-inline: 0;
  inset-block-end: 0;
  display: block;
  width: 100%;
  max-width: none;
  height: 104px;
  opacity: 0.34;
  pointer-events: none;
}

.sb-s-accueil-une.a-onde-vive::after { content: none; }

@media (max-width: 60rem) {
  .sb-c-onde { height: 76px; }
}

/* ── la bannière encore un peu plus grande ─────────────────────────────── */
/* Deuxième passe : à 340 px le titre de l'épisode reste petit sur la carte
   d'un écran large. 400 px (225 de haut) est la dernière marche avant que
   la bannière ne pèse plus que le texte qu'elle accompagne. */

.sb-s-accueil-lecteur .sb-c-pochette,
.sb-s-accueil-lecteur .sb-c-pochette img { width: 400px; }

/* ── « voir la description » : plus lisible, et rangée à droite ────────── */

/* ⚠️ `display: flex`, PAS `inline-flex`. La règle d'origine le pose en
   `inline-flex` ; une marge automatique ne pousse pas une boîte de niveau
   ligne, et le lien restait à gauche. Mesuré : son bord droit était à
   1045 px du bord de la carte au lieu de 0. */
.sb-c-lecteur-description__bouton {
  display: flex;
  width: fit-content;
  margin-inline-start: auto;
  font-size: var(--wp--preset--font-size--corps);
}

/* ── « Qui parle » : de l'air, et un portrait centré ───────────────────── */
/*
 * Deux défauts vus par Yan sur la même section. Le portrait était calé en
 * haut — la grille porte `align-items: start`, et il s'étire sur quatre
 * rangs : il commençait donc au niveau du surtitre au lieu de regarder le
 * texte. Et le bloc manquait d'air : 40 px au-dessus du surtitre, zéro en
 * dessous du bouton, dans une page qui respire partout ailleurs.
 */

.sb-s-accueil-apropos {
  padding-block: calc(var(--wp--custom--rythme) * 7) calc(var(--wp--custom--rythme) * 5);
}

.sb-s-accueil-apropos .sb-c-portrait { align-self: center; }

@media (max-width: 60rem) {
  .sb-s-accueil-apropos {
    padding-block: calc(var(--wp--custom--rythme) * 5) calc(var(--wp--custom--rythme) * 4);
  }
  .sb-s-accueil-lecteur .sb-c-pochette,
  .sb-s-accueil-lecteur .sb-c-pochette img { width: 400px; max-width: 100%; }
}

/* ══ « VOIR LA DESCRIPTION » S'ALIGNE SUR LE BAS DE LA BANNIÈRE ══════════
   Demande de Yan : le lien flottait une quarantaine de pixels sous la
   bannière, dans un vide que rien n'occupait.

   On ne le remonte PAS à la main — une marge négative serait juste jusqu'au
   jour où la bannière change de taille. La carte passe en grille à deux
   rangs sur grand écran : la bannière occupe les DEUX, calée en haut, et le
   lien prend le second, calé en bas. Les rangs se dimensionnent sur leur
   contenu, et leur somme ne peut pas être inférieure à la hauteur de la
   bannière : le lien atterrit donc exactement sur son bas, quelle que soit
   la taille qu'on lui donnera plus tard.

   ⚠️ Ne vaut QUE pour la carte dépliée au-dessus de 60 rem. Sous ce seuil
   la carte est déjà une grille à trois rangs — bannière pleine largeur,
   texte, commandes — et la forme compacte est une barre d'une seule ligne. */

@media (min-width: 60.0625rem) {
  .sb-s-accueil-lecteur:not(.est-compact) {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto auto;
    grid-template-rows: 1fr auto;
    align-items: center;
    column-gap: calc(var(--wp--custom--rythme) * 3);
  }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-pochette {
    grid-column: 1;
    grid-row: 1 / span 2;
    align-self: start;
  }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-l-lecteur-corps { grid-column: 2; grid-row: 1; }
  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-vitesse { grid-column: 3; grid-row: 1; }
  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-jouer { grid-column: 4; grid-row: 1; }

  .sb-s-accueil-lecteur:not(.est-compact) .sb-c-lecteur-description {
    grid-column: 2 / -1;
    grid-row: 2;
    align-self: end;
    margin-block-start: 0;
  }
}

/* ══ « QUI PARLE » RESPIRE ENTRE SES LIGNES — 24.10.2026 ════════════════
   Yan l'a demandé deux fois, et la première passe n'a traité que le tour
   du bloc : 56 px au-dessus, 40 en dessous. C'est À L'INTÉRIEUR que c'était
   serré — surtitre, titre et texte se touchaient presque.

   Le titre prend donc de l'air des deux côtés, et le texte s'écarte du
   bouton. Ce sont trois niveaux de lecture, ils doivent se voir comme
   trois. */

/* ⚠️ `.wp-block-group…> .classe`, SINON RIEN NE PASSE. Plus haut,
   `.wp-block-group.sb-s-accueil-apropos > *:not(.sb-c-portrait)` pose
   `margin-block: 0` avec trois classes — `:not()` compte la sienne. Écrites
   en descendant (deux classes), ces marges valaient zéro : mesuré, surtitre
   et titre se touchaient encore. Seul l'écart texte→bouton tenait, et c'est
   le seul que j'avais écrit sous cette forme-là. */
.wp-block-group.sb-s-accueil-apropos > .sb-c-surtitre { margin-block-end: calc(var(--wp--custom--rythme) * 2); }
.wp-block-group.sb-s-accueil-apropos > .sb-c-titre { margin-block-end: calc(var(--wp--custom--rythme) * 2.5); }
.wp-block-group.sb-s-accueil-apropos > .sb-c-texte { margin-block-end: calc(var(--wp--custom--rythme) * 3.5); }

/* ══ « À PROPOS » QUITTE SES DEUX COLONNES — 24.10.2026 ═════════════════
   Demandé deux fois par Yan, et la première fois j'ai traité autre chose.
   Sa phrase : « je ne veux pas deux colonnes, à cause de ces vides sur le
   côté ; le titre au-dessus du texte, et que ça prenne la pleine largeur ».

   Le rail de 13 rem portait les intitulés — « À PROPOS », « Qui parle »,
   « Pour qui » — face à leur contenu. Sur un écran large, chaque section
   ouvrait donc sur 208 px de blanc à gauche, suivis d'une colonne bornée à
   40 rem, puis d'un nouveau vide à droite. Trois zones mortes par bloc.

   Les intitulés remontent au-dessus de ce qu'ils annoncent, et les sections
   prennent la largeur de page. Le haut de page garde son portrait à droite —
   Yan : « la partie de droite est très bien » — mais son texte part lui
   aussi du bord gauche.

   ⚠️ CE QUE ÇA COÛTE, ET IL FAUT LE DIRE. La colonne de lecture passe de
   40 rem à la largeur de page : à 1440 px, le paragraphe de « Qui parle »
   compte environ 95 signes par ligne là où la maison en vise 65. C'est
   exactement le défaut corrigé le 23.10.2026 sur cette même page, et on le
   réintroduit en connaissance de cause parce que la demande est explicite.
   Si la lecture en souffre, le réglage est d'une ligne : rendre son
   `max-width` au paragraphe. */

@media (min-width: 60.01rem) {
  .sb-s-apropos-texte,
  .sb-s-apropos-appel {
    display: block;
    max-width: none;
  }

  /* 🔴 « POUR QUI » GARDE SES TROIS COLONNES. En passant la section en
     `display: block` pour retirer le rail, j'ai emporté la grille qui
     mettait les trois publics côte à côte : ils se sont empilés en trois
     barres pleine largeur. Signalé par Yan dans la minute.

     La section reste donc une grille — trois colonnes égales, l'intitulé
     au-dessus sur toute la largeur. Retirer une colonne de gauche ne veut
     pas dire retirer la grille. */
  .sb-s-apropos-pour-qui {
    display: grid;
    max-width: none;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    column-gap: var(--wp--custom--gouttiere);
    align-items: start;
  }

  .wp-block-group.sb-s-apropos-pour-qui > .sb-c-titre { grid-column: 1 / -1; }
  .wp-block-group.sb-s-apropos-pour-qui > .sb-l-publics { grid-column: auto; }

  /* La feuille de WordPress borne les enfants d'un groupe contraint : il
     faut la reprendre avec deux classes, sans quoi rien ne s'élargit. */
  .wp-block-group.sb-s-apropos-texte > *,
  .wp-block-group.sb-s-apropos-pour-qui > *,
  .wp-block-group.sb-s-apropos-appel > * {
    max-width: none;
    margin-inline: 0;
  }

  .sb-s-apropos-texte .sb-c-titre,
  .sb-s-apropos-pour-qui .sb-c-titre,
  .sb-s-apropos-appel .sb-c-titre {
    margin-block: 0 calc(var(--wp--custom--rythme) * 3);
  }

  /* Le texte courant suit la largeur de la section, intitulé compris. */
  .wp-block-group.sb-s-apropos-texte > .sb-c-texte,
  .wp-block-group.sb-s-apropos-appel > .sb-c-chapo { max-width: none; }

  /* Le haut de page : le rail disparaît, le portrait reste à droite. */
  .sb-s-apropos-tete {
    max-width: none;
    grid-template-columns: minmax(0, 1fr) auto;
  }

  /* ⚠️ `grid-row: auto` EST OBLIGATOIRE. Le rail posait le surtitre en
     colonne 1 rang 1 et le titre en colonne 2 rang 1 — côte à côte. En
     ramenant le titre en colonne 1 sans toucher au rang, les deux se
     retrouvaient dans la MÊME cellule : « À PROPOS » s'imprimait par-dessus
     le titre. Mesuré, pas supposé. */
  .wp-block-group.sb-s-apropos-tete > *:not(.sb-c-portrait) {
    grid-column: 1;
    grid-row: auto;
  }
  .sb-s-apropos-tete .sb-c-portrait { grid-column: 2; grid-row: 1 / span 4; }
  .sb-s-apropos-tete > .sb-c-surtitre { padding-block-start: 0; }

  /* ⚠️ ET LES FICHES « POUR QUI » SE DÉCENTRENT. Leur texte était posé à
     268 px du bord de sa carte : la mise en page contrainte de WordPress le
     borne à la mesure de lecture — 640 px — puis le centre dans une carte
     devenue large de 1216. (1216 − 40 de rembourrage − 640) / 2 = 268, au
     pixel. Élargir un conteneur recentre ce qu'il contient. */
  .wp-block-group.sb-l-publics > * {
    max-width: none;
    margin-inline: 0;
  }

  /* ⚠️ L'EXERGUE SE RECALE, LUI AUSSI. Ses bordures transparentes étaient
     calculées pour poser son fond sur la colonne de lecture, à droite du
     rail. Sans rail, elles le décaleraient de 208 px vers la droite sans
     raison. Il reprend la pleine largeur et son rayon ordinaire. */
  .sb-s-apropos-exergue {
    max-width: none;
    border-inline: 0;
    border-radius: calc(var(--wp--custom--rayon) + 6px);
  }
}

/* ══ LES ÉPISODES DE L'ACCUEIL EN CARROUSEL — 24.10.2026 ════════════════
   Demandé par Yan. La liste en barres pleine largeur devient une rangée de
   cartes qu'on fait défiler horizontalement.

   Le défilement est NATIF — `overflow-x` plus `scroll-snap`. Pas de
   minuteur, pas de flèches, aucun état à tenir : ça marche au doigt, à la
   molette, au clavier et au lecteur d'écran, et le jour où le script ne se
   charge pas, la liste reste ce qu'elle était. La classe `a-carrousel` est
   posée par `lecteur.js`, et seulement s'il a réussi à poser le conteneur.

   ⚠️ QUAND LES CARTES TIENNENT, RIEN NE DÉFILE, et c'est voulu. Trois
   épisodes sur un écran de 1440 : trois colonnes, pas de barre. Le
   défilement n'apparaît que lorsqu'il y a de quoi défiler. */

.sb-l-carrousel {
  display: flex;
  gap: var(--wp--custom--gouttiere);
  overflow-x: auto;
  scroll-snap-type: x proximity;
  scroll-padding-inline-start: 0;
  padding-block-end: calc(var(--wp--custom--rythme));
  /* La barre de défilement n'apparaît qu'au survol sur les systèmes qui la
     masquent ; on garde la place pour qu'elle ne pousse rien en surgissant. */
  scrollbar-width: thin;
}

.sb-s-accueil-episodes.a-carrousel .sb-l-episodes {
  flex: 0 0 clamp(260px, 32%, 420px);
  scroll-snap-align: start;
  /* La carte redevient une pile : bannière, rubrique, titre, pitch, pied. */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: calc(var(--wp--custom--rythme) * 0.5);
  padding: calc(var(--wp--custom--rythme) * 2);
}

/* La bannière 16:9 de l'épisode, posée en fond par `lecteur.js`. Sans elle
   — une fiche sans `data-pochette` — le bloc garde sa place et son filet
   plutôt que de laisser un trou. */
.sb-s-accueil-episodes.a-carrousel .sb-l-episodes::before {
  content: "";
  display: block;
  aspect-ratio: 16 / 9;
  margin-block-end: calc(var(--wp--custom--rythme) * 1.5);
  border-radius: calc(var(--wp--custom--rayon) - 4px);
  background: var(--wp--preset--color--filet) var(--end-fiche-pochette, none) center / cover no-repeat;
}

/* Dans une pile, les placements de grille de la liste n'ont plus de sens. */
.sb-s-accueil-episodes.a-carrousel .sb-l-episodes > * {
  grid-column: auto;
  grid-row: auto;
  margin: 0;
}

/* La photo ronde de l'invité fait doublon avec la bannière, qui la porte
   déjà en grand. */
.sb-s-accueil-episodes.a-carrousel .sb-c-invite { display: none; }

.sb-s-accueil-episodes.a-carrousel .sb-c-rubrique { align-self: start; }
.sb-s-accueil-episodes.a-carrousel .sb-c-titre { margin-block: calc(var(--wp--custom--rythme) * 0.75) 0; }
.sb-s-accueil-episodes.a-carrousel .sb-c-pitch { max-width: none; }

/* Le pied de carte : la durée à gauche, le rond de lecture à droite. */
.sb-s-accueil-episodes.a-carrousel .sb-c-fiche {
  margin-block-start: auto;
  padding-block-start: calc(var(--wp--custom--rythme) * 1.5);
}

.sb-s-accueil-episodes.a-carrousel .sb-c-duree {
  position: absolute;
  inset-inline-end: calc(var(--wp--custom--rythme) * 2 + 56px);
  inset-block-end: calc(var(--wp--custom--rythme) * 2.25);
}

.sb-s-accueil-episodes.a-carrousel .sb-l-episodes { position: relative; }

.sb-s-accueil-episodes.a-carrousel .sb-c-ecouter {
  position: absolute;
  inset-inline-end: calc(var(--wp--custom--rythme) * 2);
  inset-block-end: calc(var(--wp--custom--rythme) * 1.5);
}

@media (max-width: 60rem) {
  .sb-s-accueil-episodes.a-carrousel .sb-l-episodes {
    flex: 0 0 min(82%, 320px);
  }
}

/* ⚠️ UNE FICHE MASQUÉE GARDE SA LARGEUR DANS UNE RANGÉE. L'épisode en cours
   est retiré de la liste — il est dans la carte du lecteur, au-dessus — et
   il l'était par `max-height: 0`, ce qui suffit dans une pile verticale.
   Dans le carrousel, c'est un élément de rangée : sa hauteur tombe à zéro,
   sa LARGEUR reste. Mesuré : 410 px de vide à gauche des deux cartes
   visibles. Masquer par la hauteur ne masque pas dans l'autre sens. */
.sb-s-accueil-episodes.a-carrousel .sb-l-episodes.est-joue { display: none; }

/* ══ LE BOUTON DU HAUT DE PAGE PORTE SON GLYPHE — 25.10.2026 ════════════
   Demande de Yan : une icône play/pause sur « Écouter le dernier épisode ».

   Le triangle est dessiné en BORDURES, comme le rond des fiches : rien à
   charger, il prend la couleur du texte, et il existe même si le script ne
   se charge pas. Le script n'ajoute que `est-en-lecture`, et la feuille
   échange le triangle contre deux barres. */

.sb-s-accueil-une .sb-c-abonner .wp-block-button__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: calc(var(--wp--custom--rythme) * 1.25);
}

.sb-s-accueil-une .sb-c-abonner .wp-block-button__link::before {
  content: "";
  flex: 0 0 auto;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 6px 0 6px 10px;
  border-color: transparent transparent transparent currentColor;
}

/* Une barre, plus son ombre portée : le même dessin que le rond de la carte
   d'épisode, à l'échelle du bouton. L'ombre sort de la boîte à droite — la
   marge de fin lui rend la place que la gouttière ne compte pas. */
.sb-s-accueil-une .sb-c-abonner .wp-block-button__link.est-en-lecture::before {
  width: 3px;
  height: 13px;
  border: 0;
  background: currentColor;
  box-shadow: 6px 0 0 currentColor;
  margin-inline-end: 6px;
}

/* ══ « VOIR TOUS LES ÉPISODES » SOUS LE CARROUSEL ═══════════════════════
   Le carrousel ne montre plus la série entière : il en montre trois, et ce
   lien mène au reste. Contourné et non plein, comme « En savoir plus » de
   la section « Qui parle » — la commande pleine de cette page reste
   « Écouter le dernier épisode », en haut. */

.sb-s-accueil-episodes .sb-c-tous {
  margin-block-start: calc(var(--wp--custom--rythme) * 3);
}

.sb-s-accueil-episodes .sb-c-tous .wp-block-button__link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding-inline: calc(var(--wp--custom--rythme) * 2.5);
  border: 1.5px solid var(--wp--preset--color--encre);
  border-radius: var(--wp--custom--rayon-rond);
  background: transparent;
  color: var(--wp--preset--color--encre);
  font-size: var(--wp--preset--font-size--legende);
  font-weight: 700;
  text-decoration: none;
}

.sb-s-accueil-episodes .sb-c-tous .wp-block-button__link:hover {
  background: var(--wp--preset--color--encre);
  color: var(--wp--preset--color--papier);
  text-decoration: none;
}

/* ══ LA BANNIÈRE SE CALE EN HAUT QUAND LA DESCRIPTION EST OUVERTE ═══════
   Demandé par Yan sur capture : l'image flottait en bas à gauche d'une
   carte dépliée de 746 px, à 260 px sous le surtitre qu'elle est censée
   accompagner.

   🔴 ET C'EST LA SIXIÈME FOIS QUE `:not()` COMPTE SON ARGUMENT. La grille
   de la carte dépliée pose bien `align-self: start` sur la bannière, en
   trois classes. Au-dessus d'elle, la règle qui recentre les commandes
   quand la description s'ouvre en vaut QUATRE :

     .sb-s-accueil-lecteur:has(.sb-c-lecteur-description:not([hidden]))
       > :not(.sb-c-lecteur-description)

   `:has()` et `:not()` ajoutent tous deux le poids de leur argument. La
   règle visait les commandes, elle emportait la bannière avec — mesuré :
   `align-self` calculé à `center` alors que la feuille écrit `start`
   quatre-vingts lignes plus bas.

   On ne touche pas à la règle d'origine : les commandes, elles, doivent
   rester centrées. On nomme la bannière à la même hauteur de spécificité,
   et plus bas dans la feuille. */

.sb-s-accueil-lecteur:has(.sb-c-lecteur-description:not([hidden])) > .sb-c-pochette,
.sb-s-episode-lecteur:has(.sb-c-lecteur-description:not([hidden])) > .sb-c-pochette {
  align-self: start;
}

/* ══ LES PAGES LÉGALES SONT JUSTIFIÉES — 25.10.2026 ═════════════════════
   Demande de Yan : « toutes les pages légales, justifie gauche droite les
   paragraphes ». Les cinq sections légales, et elles seules : le reste du
   site reste au fer à gauche, qui est la règle de la maison pour du texte
   éditorial.

   ⚠️ AVEC LA CÉSURE, ET CE N'EST PAS UNE OPTION. Justifier sans couper les
   mots fabrique des rivières de blanc dès que la colonne se rétrécit — et
   une page de CGU se lit surtout au téléphone. `hyphens: auto` s'appuie sur
   le dictionnaire du navigateur, qui a besoin du `lang` : WordPress l'écrit
   sur `<html>`, donc la langue est connue.

   Les intertitres, eux, ne sont pas justifiés : un titre sur deux lignes
   justifiées se lit comme une erreur de gabarit. */

.sb-s-legal p, .sb-s-legal li,
.sb-s-cgu p, .sb-s-cgu li,
.sb-s-cookies p, .sb-s-cookies li,
.sb-s-confidentialite p, .sb-s-confidentialite li,
.sb-s-donnees-personnelles p, .sb-s-donnees-personnelles li {
  text-align: justify;
  text-justify: inter-word;
  hyphens: manual;
}

.sb-s-legal .sb-c-surtitre, .sb-s-cgu .sb-c-surtitre,
.sb-s-cookies .sb-c-surtitre, .sb-s-confidentialite .sb-c-surtitre,
.sb-s-donnees-personnelles .sb-c-surtitre,
.sb-s-legal .sb-c-meta, .sb-s-cgu .sb-c-meta,
.sb-s-cookies .sb-c-meta, .sb-s-confidentialite .sb-c-meta,
.sb-s-donnees-personnelles .sb-c-meta {
  text-align: start;
  hyphens: manual;
}

/* ══ LES PAGES LÉGALES QUITTENT LEUR RAIL — 25.10.2026 ══════════════════
   Demande de Yan, capture à l'appui : « mets plutôt le titre en haut, une
   seule colonne, mais largeur réduite spécialement pour ces pages ».

   Le rail de gauche venait d'« À propos », où il a été retiré la veille
   pour la même raison : à 1440 px il laissait 224 px de vide à gauche du
   texte, et le titre regardait le quatrième paragraphe au lieu du premier.

   UNE LARGEUR À ELLES. Le reste du site tient dans 76 rem ; un texte de loi
   dans 76 rem fait des lignes de 140 signes que personne ne suit. 42 rem
   donne environ 75 signes — la mesure de lecture de la maison (40 rem),
   plus la place que la justification demande.

   ⚠️ L'ORDRE EST DÉJÀ LE BON DANS LE CONTENU : surtitre, titre, date, puis
   le texte. C'est la grille qui les déplaçait. En la retirant, le document
   se lit dans l'ordre où il est écrit — et c'est aussi celui que lit un
   lecteur d'écran, qui lui n'a jamais vu le rail.

   ⚠️ IL FAUT REPRENDRE CHAQUE RÈGLE DE LA GRILLE, pas seulement passer la
   section en `display: block`. Les placements `grid-column: 1` restent
   écrits sur les enfants : inoffensifs ici, ils ressusciteraient au premier
   `display: grid` ajouté plus tard. On les annule là où ils sont posés. */

@media (min-width: 60.01rem) {
  .sb-s-legal,
  .sb-s-cgu,
  .sb-s-confidentialite,
  .sb-s-donnees-personnelles,
  .sb-s-cookies {
    display: block;
    max-width: 42rem;
    margin-inline: auto;
  }

  .wp-block-group.sb-s-legal > *,
  .wp-block-group.sb-s-cgu > *,
  .wp-block-group.sb-s-confidentialite > *,
  .wp-block-group.sb-s-donnees-personnelles > *,
  .wp-block-group.sb-s-cookies > * {
    grid-column: auto;
    max-width: none;
  }

  .wp-block-group.sb-s-legal > .sb-c-surtitre,
  .wp-block-group.sb-s-cgu > .sb-c-surtitre,
  .wp-block-group.sb-s-confidentialite > .sb-c-surtitre,
  .wp-block-group.sb-s-donnees-personnelles > .sb-c-surtitre,
  .wp-block-group.sb-s-cookies > .sb-c-surtitre {
    grid-column: auto; grid-row: auto;
  }

  /* Le titre redevient un titre de page : dans le rail il avait été réduit
     d'un cran pour tenir dans 14 rem, contrainte qui n'existe plus. */
  .wp-block-group.sb-s-legal > .sb-c-titre,
  .wp-block-group.sb-s-cgu > .sb-c-titre,
  .wp-block-group.sb-s-confidentialite > .sb-c-titre,
  .wp-block-group.sb-s-donnees-personnelles > .sb-c-titre,
  .wp-block-group.sb-s-cookies > .sb-c-titre {
    grid-column: auto; grid-row: auto;
    margin-block: 0 calc(var(--wp--custom--rythme) * 1.5);
    font-size: var(--wp--preset--font-size--titre-page);
  }

  .wp-block-group.sb-s-legal > .sb-c-maj,
  .wp-block-group.sb-s-cgu > .sb-c-maj,
  .wp-block-group.sb-s-confidentialite > .sb-c-maj,
  .wp-block-group.sb-s-donnees-personnelles > .sb-c-maj,
  .wp-block-group.sb-s-cookies > .sb-c-maj {
    grid-column: auto; grid-row: auto;
    margin-block: 0 calc(var(--wp--custom--rythme) * 4);
  }
}

/* La mesure de lecture des paragraphes numérotés valait 40 rem dans une
   colonne de 38 : elle bornait le texte plus court que son intertitre.
   C'est la section qui porte la largeur maintenant. */
.sb-s-legal > [class*="sb-c-texte"],
.sb-s-cgu > [class*="sb-c-texte"],
.sb-s-confidentialite > [class*="sb-c-texte"],
.sb-s-donnees-personnelles > [class*="sb-c-texte"],
.sb-s-cookies > [class*="sb-c-texte"] { max-width: none; }

/* ══ LA PAGE D'UN ÉPISODE, EN DEUX COLONNES — 25.10.2026 ════════════════
   Le script construit les deux colonnes (section 11 de `lecteur.js`) ; cette
   feuille ne fait que les disposer. Sans le script, `.sb-l-episode-corps`
   n'existe pas et la page garde son empilement : rien de ce qui suit ne
   s'applique à vide.

   DEUX TIERS POUR LE TEXTE, demandé par Yan. La colonne de gauche porte la
   vignette, le lecteur et la rubrique — trois objets de largeur libre, qui
   se contentent du tiers restant. Le texte, lui, est le seul à avoir une
   mesure de lecture à tenir, et c'est pour lui qu'on partage. */

.sb-l-episode-cote,
.sb-l-episode-texte {
  display: flex;
  flex-direction: column;
  gap: calc(var(--wp--custom--rythme) * 2);
}

@media (min-width: 60.01rem) {
  .sb-l-episode-corps {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: start;
    margin-block: calc(var(--wp--custom--rythme) * 4);
  }
}

@media (max-width: 60rem) {
  .sb-l-episode-corps {
    display: flex;
    flex-direction: column;
    gap: calc(var(--wp--custom--rythme) * 3);
    margin-block: calc(var(--wp--custom--rythme) * 3);
  }
}

/* La vignette remplit sa colonne : elle était bornée pour une pleine largeur,
   et une largeur maximale de 380 px la laisserait flotter dans le tiers. */
.sb-l-episode-cote .sb-c-pochette-episode,
.sb-l-episode-cote .sb-c-pochette-episode img {
  width: 100%;
  max-width: none;
  margin: 0;
}

/* Le lecteur n'a plus de marge propre : c'est la colonne qui espace. */
.sb-l-episode-cote .sb-s-episode-lecteur { margin-block: 0; }

/* La rubrique est une pastille, pas un paragraphe : elle ne s'étire pas. */
.sb-l-episode-cote > .sb-c-rubrique {
  align-self: start;
  margin-block: 0;
}

/* ⚠️ LA CARTE DU LECTEUR SE MESURE À LA FENÊTRE, PAS À SA COLONNE.
   Ses règles de disposition sont commandées par des `@media`, donc par la
   largeur de l'ÉCRAN. Posée dans un tiers de 1216 px — 389 px — sur un
   écran de 1440, elle se croyait au large : le corps prenait 337 px, et le
   rond de lecture passait à la ligne, seul, sous le titre.

   C'est le piège du conteneur contre la fenêtre, et il n'a pas de solution
   en `@media`. On décrit donc la carte PAR SON CONTEXTE : dans la colonne de
   côté, c'est une rangée — le texte, puis le rond à droite — quelle que
   soit la taille de l'écran. */
.sb-l-episode-cote .sb-s-episode-lecteur {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: calc(var(--wp--custom--rythme) * 2);
  align-items: center;
}

.sb-l-episode-cote .sb-s-episode-lecteur > .sb-l-lecteur-corps { grid-column: 1; }
.sb-l-episode-cote .sb-s-episode-lecteur > .sb-c-ecouter { grid-column: 2; }

/* Le titre reprend sa taille de titre de page, et la méta se range dessous
   sans l'air qu'elle avait quand elle terminait un bloc. */
.sb-l-episode-texte > .sb-c-titre {
  margin-block: 0;
  font-size: var(--wp--preset--font-size--titre-page);
}

.sb-l-episode-texte > .sb-c-meta { margin-block: 0; }

.sb-l-episode-texte > .sb-c-texte { margin-block: 0; max-width: none; }

/* ══ LE PIED CRÉDITE CEUX QUI ONT FAIT LE TRAVAIL — 25.10.2026 ══════════
   Demande de Yan : le verrou « yan haltey » en version noire, et la mention
   de Neequist avec son petit logo, sur toutes les pages.

   LE TERME A ÉTÉ CHOISI, PAS TROUVÉ AU HASARD. « Propulsé par » était déjà
   pris par Yan Haltey Brands deux lignes plus bas, et « boosté » ne dit pas
   un métier. « Postproduction audio » est le terme du son : il couvre le
   montage, le traitement et le mastering d'un seul mot. Tranché par Yan.

   ⚠️ LE VERROU EST SERVI PAR `<img>`, donc `currentColor` n'y entre pas : un
   SVG chargé en image est un document isolé. Il est noir, comme la charte le
   veut, et c'est l'INVERSION qui rend sa version blanche dans le thème
   sombre — il est monochrome, l'inversion est donc exacte, pas approchée.

   Le symbole Neequist, lui, ne s'inverse PAS : son cyan est une couleur de
   marque, et il tient sur papier comme sur encre. */

.sb-c-pied-yh {
  display: inline-flex;
  align-items: center;
  opacity: 0.72;
  transition: opacity 140ms ease-out;
}

.sb-c-pied-yh:hover,
.sb-c-pied-yh:focus-visible { opacity: 1; }

.sb-c-pied-yh img { display: block; width: 70px; height: auto; }

.sb-c-pied-neequist {
  display: inline-flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1);
  font-size: var(--wp--preset--font-size--legende);
  color: var(--wp--preset--color--encre-douce);
  text-decoration: none;
  opacity: 0.86;
  transition: opacity 140ms ease-out;
}

.sb-c-pied-neequist:hover,
.sb-c-pied-neequist:focus-visible { opacity: 1; text-decoration: underline; }

.sb-c-pied-neequist img { display: block; width: 26px; height: 26px; flex: 0 0 auto; }
.sb-c-pied-neequist strong { font-weight: 700; color: var(--wp--preset--color--encre); }

/* Le verrou retrouve sa version blanche là où le fond est sombre. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sb-c-pied-yh img { filter: invert(1); }
}

:root[data-theme="dark"] .sb-c-pied-yh img { filter: invert(1); }

@media (prefers-reduced-motion: reduce) {
  .sb-c-pied-yh, .sb-c-pied-neequist { transition: none; }
}

/* Au téléphone, la rangée de signature s'empile : la ligne légale perd sa
   marge automatique, qui la collerait toute seule à droite sous les logos. */
@media (max-width: 48rem) {
  .sb-l-pied-signature .sb-c-pied-legal { margin-inline-start: 0; }
}

/* 🔴 LE VERROU RÉALISONS DISPARAISSAIT DANS LE THÈME SOMBRE — 25.10.2026.
   Trouvé en mesurant le pied après y avoir posé les deux crédits : sur fond
   #0E1216, seuls le « O » turquoise et le point ambre se voyaient. Les
   lettres du mot n'ont AUCUN `fill` dans le fichier, donc elles tombent sur
   le noir par défaut de SVG — noir sur noir.

   Le défaut est là depuis que le pied existe, et il ne s'était jamais vu
   parce que personne ne regarde le bas d'une page en sombre.

   ⚠️ PAS D'INVERSION ICI, contrairement au verrou « yan haltey ». Celui-là
   est monochrome, donc l'inverser est exact. Celui-ci porte deux couleurs de
   marque : les inverser donnerait un turquoise rouge. On échange donc le
   fichier contre sa variante claire, de MÊME géométrie. */

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .sb-c-pied-realisons img {
    content: url("realisons-blanc.svg");
  }
}

:root[data-theme="dark"] .sb-c-pied-realisons img {
  content: url("realisons-blanc.svg");
}

/* 🔴 LE VERROU DU PIED ÉCRIVAIT SON MOT EN COULEUR DE PAPIER — 25.10.2026.
   Signalé par Yan, capture à l'appui, le jour du passage au papier chaud.

   `verrou-horizontal.svg` dessine « entredonner » en #E1E8F0 : c'est le
   verrou INVERSÉ, celui qui va sur fond sombre, et le pied est clair. Le mot
   valait donc 1,0:1 sur l'ancien papier — invisible, strictement. Le défaut
   ne datait pas du papier chaud : il était là depuis que ce verrou sert au
   pied. Le papier chaud l'a seulement rendu VISIBLE, en fantôme bleuté sur
   de l'ivoire. Un défaut qu'on ne voit pas est un défaut qu'on ne corrige
   pas, et celui-là attendait d'avoir un contraste pour se faire remarquer.

   LA CORRECTION EST CELLE DE L'EN-TÊTE, et elle date du 21.10 : le symbole
   reste une image, le mot redevient du TEXTE. Il suit alors l'encre de la
   page, dans les deux thèmes et dans toutes les peaux à venir — un fichier
   SVG, lui, ne suivra jamais rien. C'est aussi ce qui le rend sélectionnable
   et lisible par une synthèse vocale.

   ⚠️ NE PAS « RÉPARER » EN FABRIQUANT UN SECOND SVG. Deux fichiers pour deux
   thèmes, c'est deux fichiers à refaire à chaque changement de peau, et un
   des deux sera oublié. On l'a déjà fait pour le verrou Réalisons ce matin,
   et c'était justifié là-bas : son mot porte deux couleurs de marque. Ici le
   mot est de l'encre, et l'encre s'écrit. */

.sb-c-pied-marque {
  display: flex;
  align-items: center;
  gap: calc(var(--wp--custom--rythme) * 1.25);
}

.sb-c-pied-marque::before {
  width: 30px;
  height: 30px;
  margin-block-end: 0;
  background-image: var(--end-logo);
}

.sb-c-pied-marque__mot {
  font-family: var(--wp--preset--font-family--titre);
  font-size: var(--wp--preset--font-size--titre-section);
  font-weight: 700;
  letter-spacing: var(--wp--custom--interlettre-titre);
  color: var(--wp--preset--color--encre);
}

/* ══ AUCUN MOT N'EST COUPÉ — 25.10.2026 ═════════════════════════
   Demande de Yan, capture à l'appui : « Entre-donner » et « témoi-gnages »
   coupés en bout de ligne dans le chapeau de la une.

   Les quatre déclarations `hyphens: auto` de cette feuille passent donc à
   `manual`, à l'endroit où elles sont écrites plutôt que par une surcharge :
   une surcharge globale perdrait de toute façon contre elles, puisqu'elles
   portent toutes une classe.

   ⚠️ CE QUE ÇA COÛTE, ET IL FAUT LE SAVOIR. Le site justifie ses textes
   longs des deux bords. Sans césure, le justifié répartit tout l'écart sur
   les blancs entre les mots : plus la colonne est étroite, plus les trous
   grandissent, et une page de CGU se lit au téléphone. Les commentaires qui
   déclaraient la césure « indispensable » disaient vrai sur ce point-là ; la
   décision est de préférer un blanc large à un mot coupé, et elle appartient
   à Yan.

   Si les rivières deviennent gênantes, le geste suivant n'est PAS de
   remettre la césure : c'est de retirer la justification là où la colonne est
   trop étroite pour elle. */

/* ══ L'EXERGUE ACCUEILLE LE PORTRAIT — 25.10.2026 ═══════════════════════
   Demande de Yan : « réduis la largeur du truc noir, mets ma photo à côté ».
   La boîte faisait 1216 px pour une phrase bornée à 34 rem — un tiers de
   texte et deux tiers de noir vide.

   Le portrait est DÉPLACÉ depuis le haut de page par la section 12 du
   script, pas dupliqué. La feuille ne fait que le disposer, et tout ce qui
   suit est conditionné par `a-portrait` : sans le script, la page garde sa
   forme d'avant, qui était juste. */

@media (min-width: 60.01rem) {
  /* ⚠️ UNE GRILLE, PAS UNE RANGÉE FLEX — et la première tentative l'a montré
     tout de suite. En `display: flex`, le surtitre devient un élément de
     rangée au même titre que la citation : « CE QUI MANQUAIT » s'est retrouvé
     À GAUCHE de la phrase, sur deux lignes, au lieu d'être au-dessus. Deux
     colonnes, et chaque enfant nommé à sa place. */
  .sb-s-apropos-exergue.a-portrait {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    column-gap: calc(var(--wp--custom--gouttiere) * 2);
    align-items: center;
  }

  .sb-s-apropos-exergue.a-portrait > .sb-c-surtitre { grid-column: 1; grid-row: 1; }
  .sb-s-apropos-exergue.a-portrait > .sb-c-citation { grid-column: 1; grid-row: 2; }

  /* La phrase reprend la place laissée libre : sa borne de 34 rem datait du
     temps où elle flottait seule dans toute la largeur. */
  .sb-s-apropos-exergue.a-portrait .sb-c-citation { max-width: none; }

  .sb-s-apropos-exergue.a-portrait > .sb-c-portrait {
    grid-column: 2;
    grid-row: 1 / span 2;
    align-self: center;
    margin: 0;
  }

  .sb-s-apropos-exergue.a-portrait > .sb-c-portrait img {
    width: 184px;
    max-width: none;
  }

  /* Le haut de page récupère la largeur que le portrait occupait. */
  .sb-s-apropos-tete.sans-portrait { grid-template-columns: minmax(0, 1fr); }
}

/* Au téléphone, la boîte s'empile : la photo passe au-dessus de la phrase,
   parce qu'un visage annonce mieux une citation qu'il ne la conclut. */
@media (max-width: 60rem) {
  /* ⚠️ `order`, PAS `column-reverse`. L'inversion de direction retourne TOUS
     les enfants : la citation serait passée avant son propre surtitre. On ne
     remonte que la photo. */
  .sb-s-apropos-exergue.a-portrait {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: calc(var(--wp--custom--rythme) * 3);
  }

  .sb-s-apropos-exergue.a-portrait > .sb-c-portrait { order: -1; }

  .sb-s-apropos-exergue.a-portrait > .sb-c-portrait { margin: 0; }
  .sb-s-apropos-exergue.a-portrait > .sb-c-portrait img { width: 120px; }
  .sb-s-apropos-exergue.a-portrait .sb-c-citation { max-width: none; }
}
