/* ==========================================================================
   04 - Gabarit des pages internes
   Lot 4. Cible (maquette SubPageLayout.tsx) :

     [fil d'Ariane]
     T |  Titre de la page          <- h1 texte, aligné à gauche
     i |  ____                      <- filet violet court, 64px
     t |
     r |  Résumé d'introduction. ■  <- carré violet 8x8
     e |
          [contenu]

   Aucune grande image en tête. Aucun titre posé sur une photo.
   ========================================================================== */

/* --- Conteneur injecté par le thème enfant -------------------------------- */

.lm-page-head {
  max-width: var(--lm-container);
  margin: 0 auto;
  padding-inline: 1rem;
}

/* Première section de contenu : sans marge haute (24/09/2026, « l'espace doit
   être un peu plus petit entre le titre et le texte »). Elementor lui donnait,
   page par page, 20 à 40px en plus des 24px du bloc de tête. Désignée côté
   serveur, voir lm_first_content_section_id() dans inc/corps-texte.php. */
body:not(.home) main .elementor .elementor-element.elementor-top-section.lm-first-section {
  margin-top: 0;
}

/* --- Largeur de la zone de contenu ------------------------------------------
   Demande du 24/09/2026, « réduire un peu la largeur de la zone de
   contenu » : 1140px -> 1040px, dans --lm-container.

   Le fil d'Ariane, le titre, « Poursuivre la lecture » et le pied de page
   lisent déjà ce token. Les sections Elementor, elles, prennent la largeur du
   kit, `.elementor-section.elementor-section-boxed > .elementor-container`
   à 1140px, spécificité (0,3,0) : `main` en plus suffit, sans !important.
   Une section réglée à une autre largeur dans Elementor (0,4,0) garde la
   sienne. L'accueil a sa propre mise en page : il n'est pas concerné. */
body:not(.home) main .elementor-section.elementor-section-boxed > .elementor-container {
  max-width: var(--lm-container);
}

/* --- Images du contenu --------------------------------------------------------
   Demande du 24/09/2026, « réduire un peu la taille des images », sur les
   couvertures de /ressources/oeuvres-de-louis-massignon/.

   Relevé : 305 widgets image sur le site, aucun avec une largeur réglée, 291
   dans une colonne latérale de 25% ou moins (couvertures, portraits, visuels
   d'articles). L'image prenait toute sa colonne ; elle en prend 90%, centrée
   comme le règle le widget. La réduction du conteneur ci-dessus s'y ajoute,
   MESURÉ en 1440px : une couverture passait de 161px à 145px par le seul
   conteneur, elle arrive à 131px. À 85% elle tombait à 123px, -24%, plus que
   le « un peu » demandé.

   80% depuis le même jour, « réduire encore un peu la taille des
   miniatures » : la couverture fait environ 116px.

   Seul le widget image est visé : les photos légendées et les vignettes de
   mosaïque sont des widgets Image Hover Effects, calés sur la grille. */
body:not(.home) main .elementor-widget-image img {
  max-width: 80%;
}

/* Style repris des titres de l'ancien site, demande du 24/09/2026 : lavande,
   graisse fine, 40px. Sur la production c'est un widget texte réglé à la main
   (FUTURA LM, 40px, graisse 100, interligne 1.3em, #4054B2 à 60%) ; il est
   ici porté par le H1 injecté, que les 315 pages et articles utilisent tous.
   Graisse 350 : le 300 d'abord posé a paru un peu maigre (retour du même
   jour). La police est une variable chargée en plage, voir lm_enqueue_font().

   Double classe (0,2,0) : le kit Elementor impose `.elementor-kit-6 h1`
   (0,1,1) en gras et en couleur de texte. */
.lm-page-head .lm-page-title {
  text-align: left;
  font-size: clamp(1.75rem, 3.2vw, 2.5rem);
  font-weight: var(--lm-title-weight);
  line-height: 1.3;
  letter-spacing: 0;
  color: var(--lm-title-color);
  margin: 0 0 .25rem;
}

/* --- Marqueur 5 : libellé vertical de marge --------------------------------
   Valeurs MESURÉES sur la maquette le 10/09/2026, en 1536px de large :
     texte    titre de la page courante, 16px, italique, #7058D0
     position x=160, soit à gauche du conteneur de contenu qui commence à x=216
     filet    1px rgba(112, 88, 208, .3) à x=172, courant sur toute la hauteur
              du contenu, le libellé étant centré verticalement dessus

   Correction apportée par la fiche 13 à la fiche 02 : le filet est VIOLET à
   30% d'opacité, pas gris.

   Le bloc est positionné en absolu par rapport au conteneur de contenu plutôt
   qu'en `fixed` : c'est ce qui permet au filet de courir exactement sur la
   hauteur du contenu, comme dans la maquette, au lieu de rester collé à
   l'écran au défilement.

   Les décalages sont exprimés en fonction de la largeur du conteneur, et non
   en pixels absolus : ils suivent donc la largeur d'écran. 56px pour le
   libellé et 44px pour le filet reproduisent les x=160 et x=172 de la maquette.

   writing-mode + rotate(180deg) donne le même rendu qu'une rotation à
   -90 degrés, tout en gardant un texte sélectionnable et un flux correct. */

/* ANCRAGE. Le 10/09 la règle portait sur #content : insuffisant, l’ancêtre
   positionné retenu par le navigateur restait div#container.wpbf-page, qui part
   du sommet de la page. Le filet traversait donc l’en-tête.

   On ancre sur <main>, qui délimite exactement la zone de contenu et dont le
   libellé est le premier enfant : top/bottom à 0 donnent alors la hauteur du
   contenu, ni plus ni moins. */
main#main,
main.lm-main,
.wpbf-main,
.wpbf-container.wpbf-container-center {
  position: relative;
}

.lm-vlabel {
  position: absolute;
  /* Le positionnement absolu se cale sur la boîte de padding de <main>, pas
     sur sa boîte de contenu : sans ce décalage, le filet démarre 20px
     au-dessus du fil d’Ariane. La valeur reprend le padding vertical de
     <main>. Elle ne dépend pas de la largeur d’écran, contrairement au
     placement horizontal, qui lui est calculé. */
  top: 1.25rem;
  bottom: 1.25rem;
  /* Calculé depuis --lm-container, jamais une valeur en dur. Le conteneur
     faisant la largeur de <main>, le résultat vaut -56px : le libellé se place
     à 56px à gauche du contenu, quelle que soit la largeur d’écran. */
  left: calc((100% - var(--lm-container)) / 2 - 56px);
  display: flex;
  align-items: center;   /* libellé centré verticalement sur le filet */
  gap: 8px;
  pointer-events: none;
  user-select: none;
  z-index: 1;
}

.lm-vlabel span {
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  color: var(--lm-primary);
  font-style: italic;
  font-size: 16px;
  letter-spacing: .02em;
  white-space: nowrap;
  max-height: 100%;
  overflow: hidden;
}

/* Le filet, qui court sur toute la hauteur du contenu. */
.lm-vlabel::after {
  content: "";
  align-self: stretch;
  width: 1px;
  background: rgba(112, 88, 208, .3);
}

/* Seuil d'affichage.

   La fiche 13 demande un masquage en dessous de 1024px. Le libellé vit dans la
   marge gauche, hors du conteneur : il faut donc que cette marge existe.
   Conteneur 1040px + 2 x 56px de marge = 1152px. En dessous, le libellé
   viendrait sur le texte, ce qui contredit le critère « jamais superposé au
   contenu ». Le seuil est donc calculé, pas choisi. Une requête média ne lit
   pas les variables : À RECALCULER si --lm-container change (1251px tant que
   le conteneur faisait 1140px).

   ÉCART ASSUMÉ par rapport au 1024px de la fiche, à signaler au client. */
@media (max-width: 1151px) {
  .lm-vlabel { display: none; }
}


/* --- Balise main injectée (optionnelle, voir LM_WRAP_MAIN) ---------------- */

.lm-main { display: block; }

/* --- Suppression des grandes images de tête -------------------------------
   Le client veut arriver directement sur le contenu : « il faudrait arriver
   directement sur la liste, sinon ça crée une confusion ».

   Liste à établir à l'inventaire, page par page. CHAQUE LIGNE DOIT ÊTRE
   COMMENTÉE avec le nom de la page : une règle non commentée est ingérable
   dans six mois.

   Ne pas masquer une image porteuse de sens éditorial (photo de Louis
   Massignon en tête de la biographie) sans en parler à Philippe.

   Forme attendue, à compléter après l'inventaire :

     .page-id-487 .elementor-element-XXXXXXX,    Figures, bandeau de tête
     .page-id-0000 .elementor-element-YYYYYYY {  nom de la page
       display: none;
     }
   -------------------------------------------------------------------------- */

/* ==========================================================================
   P2 - Neutralisation des résidus de l'ancien site
   Retour d'intégration du 10/09/2026.

   Trois éléments de l'ancien gabarit passent par-dessus le nouveau. Ils vivent
   dans le contenu Elementor des pages : on les traite en CSS, jamais en
   rouvrant une centaine de pages.

   SÉLECTEURS RELEVÉS SUR LE DOM RÉEL le 10/09, et ils ne sont pas ceux que la
   fiche 13 proposait :
     - le libellé pivoté n'est PAS un <p> mais un conteneur Elementor portant
       la classe CSS `page_title` (vérifié sur l'accueil, élément 69578dd7, et
       sur /biographie/figures/, élément 16f10803). Un sélecteur sur `p` ne
       l'aurait pas attrapé ;
     - le filet noir n'est pas posé en style inline mais par le CSS généré
       d'Elementor : `[style*="border-left"]` ne matche rien.
   ========================================================================== */

/* --- 1. Libellé vertical pivoté de l'ancien site --------------------------
   Il fait doublon avec .lm-vlabel (P4) et il apparaît même sur l'accueil, ce
   que le client a explicitement écarté. */

.elementor-element.page_title {
  display: none !important;   /* le widget impose son affichage */
}

/* --- 2. Carré bleu en image ------------------------------------------------
   Remplacé par le carré violet du design system. L'image est masquée, et le
   carré est rendu en CSS à la fin du dernier paragraphe du bloc qui la
   contenait : `:has()` évite d'avoir à cibler l'identifiant de chaque page. */

img[src*="carre_bleu_texte_fin"] {
  display: none !important;
}

.elementor-widget-text-editor:has(img[src*="carre_bleu_texte_fin"]) p:last-of-type::after {
  content: "";
  display: inline-block;
  width: var(--lm-square);
  height: var(--lm-square);
  margin-left: .4em;
  background: var(--lm-primary);
  vertical-align: middle;
}

/* --- 3. Filet vertical du bloc de texte ------------------------------------
   La maquette le donne en violet 1.6px, pas en gris : correction apportée par
   la fiche 13 à la fiche 02.

   On ne redéfinit QUE la couleur et l'épaisseur, jamais `border-left-style`.
   Conséquence voulue : la règle est sans effet là où aucun filet n'existe
   (style `none`), et recolore partout où l'ancien site en avait posé un. Cela
   évite d'avoir à lister les identifiants d'éléments page par page. */

/* CORRECTION du 11/09. La règle portait sur TOUS les conteneurs de widgets et
   sur tous les blocs de texte : elle recolorait donc en violet le moindre filet
   gauche hérité de l'ancien site, y compris ceux des colonnes de mosaïque. Sur
   l'accueil elle en peignait deux au lieu d'un, le conteneur et le widget, d'où
   le double trait ; sur les pages de figures elle faisait apparaître un filet
   violet à gauche de chaque colonne de photos.

   Le filet violet n'a de sens QUE sur un bloc de texte. `:has()` le garantit :
   seuls les conteneurs qui portent directement un widget de texte sont
   concernés, et jamais le widget lui-même, ce qui supprime le doublon. */

/* DÉCISION CLIENT du 11/09/2026 au soir, elle ANNULE ce qui précède :
   « ne pas afficher le liseret à gauche du texte sur toutes les pages ».

   Le filet n'est donc plus recoloré, il est SUPPRIMÉ. Relevé sur le DOM de
   /courbe-de-vie/le-militaire-et-le-diplomate-2/ : il est posé sur le conteneur
   du widget, en 0.8px NOIR, hérité de l'ancien site.

   La portée change aussi. L'ancienne règle était préfixée par `#content`, qui
   n'existe pas sur les 28 pages en modèle elementor_header_footer : le filet y
   restait donc noir, jamais violet. On cible désormais le contenu Elementor,
   en-tête et pied de page exclus, donc les deux modèles.

   Seule la largeur est remise à zéro, jamais `border-left-style` : les cartes
   et les vignettes, qui portent leur propre bordure, ne sont pas concernées,
   et le padding de 10px reste en place, donc le texte ne bouge pas. */

/* ÉLARGISSEMENT du 11/09 au soir, second retour du client sur
   /ressources/ : « problème de titre trop proche et liseret à gauche ».

   La règle ne visait que les blocs de texte. Or l'ancien site pose le même
   filet noir sur des colonnes qui portent des mosaïques : relevé sur
   /ressources/, 1px noir sur le conteneur de la première vignette, haut de
   365px, qui doublait le filet du libellé de marge.

   Le filet est donc retiré de TOUS les conteneurs de widgets du contenu. Seule
   la largeur passe à zéro : les cadres des vignettes (.eihe-box) et des cartes
   (.lm-tile), qui portent leur propre bordure, ne sont pas concernés -
   vérifié sur /ressources/, les six cadres sont intacts. */

.elementor:not(.elementor-location-header):not(.elementor-location-footer)
  .elementor-widget-wrap.elementor-element-populated,
.elementor:not(.elementor-location-header):not(.elementor-location-footer)
  .elementor-widget-text-editor {
  /* Le filet à DROITE aussi, ajouté le 11/09 au soir. Relevé sur
     /idees-debats/idees-forces/conversion-et-visitation/ : l'ancien site le
     pose ici sur le bord droit de la colonne de gauche, en 1px #231D30 sur
     451px de haut. C'est le même trait, vu de l'autre côté. */
  border-left-width: 0;
  border-right-width: 0;
}
/* Le padding n'est volontairement PAS redéfini globalement ici : l'appliquer à
   tous les conteneurs de widgets décalerait la mise en page de tout le site.
   L'ancien site pose déjà son propre retrait là où le filet existe. */


/* ==========================================================================
   P3 - Alignement, respiration et largeur du contenu hérité
   Retour client du 11/09/2026, relevé sur /biographie/courbe-de-vie/ et
   /biographie/courbe-de-vie/jeunesse-et-vie-familiale/ :
   « manque d'espace avec le titre et problème de largeur ».

   Trois défauts distincts, MESURÉS sur le DOM réel en 1440px de large, pas
   supposés. Ils viennent tous du contenu Elementor hérité, pas du gabarit :
   on les traite donc en CSS, jamais en rouvrant une centaine de pages.
   ========================================================================== */

/* --- 1. Respiration sous le bloc de tête -----------------------------------
   MESURE : 14px entre le filet violet du H1 et la première ligne du résumé
   (4px de marge du H1 + 10px de padding du widget Elementor).

   La maquette (SubPageLayout.tsx) donne : titre, 12px, filet, 24px, résumé.
   Les 12px du haut sont déjà posés par .lm-title-rule::after ; ce sont les
   24px du bas qui manquaient.

   La marge est portée par le conteneur, pas par le H1 : elle s'applique donc
   quel que soit le premier bloc de la page. Elle fusionne avec la marge basse
   du H1 (fusion des marges : le parent n'a ni padding ni bordure en bas), le
   résultat vaut bien 24px et non 28px. */

.lm-page-head {
  margin-bottom: 1.5rem;
}

/* --- 2. Alignement horizontal du titre sur le contenu ----------------------
   MESURE : le H1 démarrait à 16px du bord du conteneur (padding-inline: 1rem),
   le contenu Elementor à 10px (padding par défaut d'une colonne peuplée).
   5px d'écart, visibles sur un titre de 36px.

   On s'aligne sur la valeur d'Elementor, qui est celle de la majorité des
   blocs du site. Les colonnes réglées à 0 ou 5px de padding restent décalées
   d'autant : aucune règle CSS ne peut aligner 151 pages montées à la main, on
   se cale sur le cas le plus fréquent.

   RÉVISION DU 12/09. Le 1rem était conservé en dessous de 768px, au motif que
   10px de marge latérale seraient trop justes sur un téléphone. Mesuré depuis
   sur un article en 390px : le titre démarrait à x=36 et le texte à x=30, un
   écart de 6px bien visible sur une colonne étroite. Le motif ne tenait pas :
   le conteneur de contenu pose déjà 20px de chaque côté, les 10px s'y
   ajoutent, et le texte est donc à 30px du bord, pas à 10.

   La même valeur partout, donc, et les trois lignes — fil d'Ariane, titre,
   texte — s'alignent à toutes les largeurs. */

.lm-breadcrumb,
.lm-page-head {
  padding-inline: 10px;
}

/* --- 3. Colonnes vides de marge de l'ancien site ---------------------------
   MESURE : sur /courbe-de-vie/jeunesse-et-vie-familiale/, le résumé vit dans
   une rangée de trois colonnes dont la première (137px) et la dernière
   (138px) sont VIDES. Le texte démarrait donc à x=290 quand le titre démarrait
   à x=158 : 132px de décalage, et une colonne de texte d'autant plus étroite.

   Ces colonnes vides servaient à ménager la place du libellé pivoté de
   l'ancien site (classe `page_title`, masqué en P2). Le nôtre vit dans la
   marge, hors du conteneur : elles ne servent plus à rien et ne font que
   désaligner le contenu.

   Une colonne sans widget ne rend rien : la masquer ne peut pas faire
   disparaître de contenu. La colonne peuplée reprend alors sa place à gauche,
   alignée sur le titre.

   PORTÉE. Trois garde-fous :
     - `body:not(.home)` : l'accueil a été validé le 10/09 avec ses colonnes
       de marge, et le critère de recette du lot 4 interdit toute régression
       dessus. VÉRIFIÉ : sans cette exclusion, 11 colonnes disparaissaient et
       le texte d'accueil se décalait vers la gauche ;
     - en-tête et pied de page exclus : ils sont montés dans Elementor et leur
       équilibre ne dépend pas de nous. Sur les 28 pages en modèle
       elementor_header_footer, le <footer> se retrouve d'ailleurs à
       l'intérieur de <main>, ce qui rend l'exclusion indispensable ;
     - sections de premier niveau seulement : les sections internes
       (mosaïques, colonnes imbriquées) ne sont pas touchées. */

body:not(.home)
  .elementor:not(.elementor-location-header):not(.elementor-location-footer)
  .elementor-top-section > .elementor-container
  > .elementor-column:not(:has(.elementor-element-populated)) {
  display: none;
}

/* --- 4. Débordement horizontal des rangées surdimensionnées ----------------
   LE VRAI « problème de largeur ». MESURÉ sur /biographie/courbe-de-vie/ :
   la rangée des cinq vignettes porte cinq colonnes en `flex: 0 0 25%`, soit
   125% du conteneur. La cinquième vignette, « L'intellectuel engagé », était
   coupée par le bord de l'écran, et la page défilait horizontalement
   (scrollWidth 1567px pour une fenêtre de 1425px).

   C'est une erreur de saisie de l'ancien site : une rangée passée de quatre à
   cinq colonnes sans remettre les largeurs. Elementor lui-même classe ces
   colonnes en `elementor-col-20`, donc 20%.

   On ne réécrit AUCUNE largeur : on rend seulement les colonnes compressibles.
   Une rangée qui tient déjà dans son conteneur ne bouge pas d'un pixel, le
   flex-shrink ne s'applique que s'il y a débordement. Une rangée qui déborde
   se ramène à 100% en gardant ses proportions : les cinq vignettes passent de
   285px à 228px et la ligne fait exactement 1140px.

   `!important` est nécessaire et il est assumé : Elementor pose `flex: 0 0 X%`
   avec une spécificité supérieure. `min-width: 0` lève la taille minimale
   automatique des éléments flex, sans quoi la compression n'a pas lieu.

   VÉRIFIÉ : plus aucun défilement horizontal sur courbe-de-vie, et aucune
   colonne rétrécie sur l'accueil, /biographie/figures/ ni jeunesse. */

.elementor-top-section > .elementor-container > .elementor-column {
  flex-shrink: 1 !important;
  min-width: 0 !important;
}


/* --- 5. Marges négatives de l'ancien site sous le bloc de tête -------------
   Second retour du client, 11/09/2026 au soir, sur /ressources/ :
   « problème de titre trop proche ».

   MESURE : 6px seulement entre le filet violet du titre et la première
   vignette, alors que P3.1 pose 24px. La première section de la page porte un
   `margin-top: -28px`, hérité de l'ancien site, qui mange la marge.

   Ces marges négatives sont une pratique du site d'origine, déjà relevée sur
   l'accueil le 10/09 (fiche 14, problème 1) : elles servaient à resserrer une
   page dont le gabarit posait trop d'espace en tête. Ce gabarit n'existe plus.

   On neutralise UNIQUEMENT la marge haute de la PREMIÈRE section : l'espace
   sous le titre est désormais celui de .lm-page-head, une seule valeur pour
   tout le site. Les marges des sections suivantes ne sont pas touchées, elles
   portent le rythme vertical voulu page par page.

   L'accueil est exclu : il n'a pas de bloc de tête, et ses marges négatives
   ont été réglées le 10/09. */

body:not(.home) main .elementor > .elementor-top-section:first-child,
body:not(.home) #content .elementor > .elementor-top-section:first-child {
  margin-top: 0 !important;
}


/* --- 6. Titre répété dans le contenu --------------------------------------
   Pendant CSS de P7 (inc/page-head.php). Le filtre PHP remplace le widget qui
   répète le titre par un marqueur vide ; c'est ici qu'on le fait disparaître,
   et qu'on replie la colonne s'il ne lui reste plus rien.

   RELEVÉ sur /idees-debats/idees-forces/engagements/ : le doublon occupe seul
   une colonne de gauche de 258px. Sans ce repli, retirer le texte laisserait
   une colonne vide et les vignettes resteraient décalées de 258px par rapport
   au titre - exactement le défaut corrigé en P3.3. */

/* PORTÉE RESSERRÉE LE 12/09. Le marqueur était cherché en descendance : tout
   widget qui en contenait un, à n'importe quelle profondeur, disparaissait.

   Sur /ressources/oeuvres-sur-louis-massignon/, un marqueur posé par erreur
   dans l'en-tête (voir P7 ter dans inc/page-head.php) a ainsi masqué le widget
   shortcode qui porte tout l'en-tête : plus de titre, plus de menu, sur toute
   la page. Le défaut de fond est corrigé côté PHP ; la règle, elle, ne doit
   de toute façon jamais pouvoir remonter au-delà du widget qui porte le
   marqueur. On exige donc le chemin direct, qui est celui que produisent les
   deux filtres. */

.elementor-widget:has(> .elementor-widget-container > .lm-title-dup) {
  display: none;
}

/* La colonne ne se replie que si le widget vidé y était SEUL : une colonne qui
   porte encore du texte ou une image n'est jamais touchée.

   Le marqueur est cherché en descendance, pas en enfant direct : quand il vient
   du filtre de document (P7 bis), il remplace le titre lui-même et se trouve
   donc un cran plus bas. */

.elementor-column:has(> .elementor-widget-wrap > .elementor-widget:only-child > .elementor-widget-container > .lm-title-dup) {
  display: none;
}


/* --- 7. Libellé vertical de marge : retiré -------------------------------
   Demande du client, 11/09/2026 : « il faut enlever le titre et le liseret
   même si ce n'est pas tout à fait le même ».

   Il parle du libellé pivoté et de son filet, dans la marge gauche. C'est le
   marqueur 5 de la maquette (fiche 04), mais pour le client c'est un titre en
   doublon de plus, et un trait de plus : il l'assimile aux deux points qu'il a
   déjà fait retirer ce soir.

   ÉCART ASSUMÉ PAR RAPPORT À LA MAQUETTE, décision client, à rappeler au point
   du 17/09. Le bloc reste injecté et entièrement décrit dans P4 plus haut :
   retirer cette règle suffit à le faire revenir. */

.lm-vlabel {
  display: none;
}

/* --- 8. Retrait résiduel des blocs de texte -------------------------------
   MESURÉ sur /jeunesse-et-vie-familiale/ : le titre démarre à x=153, le
   paragraphe à x=163. Les 10px viennent d'un `padding-left` posé par l'ancien
   site sur le conteneur du widget, qui accompagnait le filet noir retiré en
   P2.3. Le filet parti, le retrait n'a plus d'objet et ne fait que désaligner
   le texte du titre. */

.elementor:not(.elementor-location-header):not(.elementor-location-footer)
  .elementor-widget-text-editor > .elementor-widget-container {
  padding-left: 0;
}

/* --- 9. Le contenu prend toute la largeur ---------------------------------
   « il faut que le contenu prenne toute la largeur ».

   Les colonnes de marge vides sont masquées depuis P3.3, mais la colonne
   restante gardait la largeur que l'ancien site lui avait donnée : 861px sur
   1140 pour le résumé de /jeunesse-et-vie-familiale/.

   `flex-grow` ne redistribue QUE l'espace libre. Une rangée dont les colonnes
   remplissent déjà la largeur ne bouge pas d'un pixel - vérifié sur les cinq
   vignettes de Courbe de vie. Seules bougent les rangées où l'on vient de
   masquer une colonne vide, ce qui est exactement l'effet demandé.

   EXCEPTION, et elle est nécessaire : les colonnes qui portent une mosaïque
   gardent leur largeur. Sans cela, les rangées incomplètes de /figures/ ou de
   /ressources/ étireraient leurs vignettes pour combler le vide, et la grille
   de quatre du design system serait rompue. Vérifié : vignettes à 285px avant
   comme après, et sur /jeunesse-et-vie-familiale/ la photo légendée garde sa
   taille pendant que le texte à côté s'étend de 513px à 855px.

   Pourquoi pas de comptage des colonnes vides : voir P8 dans page-head.php,
   la piste a été essayée et mesurée, elle ne marche pas. */

body:not(.home) main .elementor-top-section > .elementor-container
  > .elementor-column:not(:has(.elementor-widget-e_image_hover_effects)),
body:not(.home) #content .elementor-top-section > .elementor-container
  > .elementor-column:not(:has(.elementor-widget-e_image_hover_effects)) {
  flex-grow: 1;
}

/* ==========================================================================
   Gabarit d'article : alignement de la signature, sections vides
   Signalé par Philippe le 12/09, capture à l'appui, sur
   /nouvelle-publication-de-florence-ollivry-…/
   ==========================================================================

   MESURES, en 1440px de large :

     fil d'Ariane   texte à x=152
     titre H1       texte à x=152
     signature      texte à x=132          <- 20px trop à gauche
     premier texte  y=488, alors que la signature se termine à y=398

   1. LA SIGNATURE. « Hugo Chieze | Publié le … » n'est pas dans notre bloc de
      tête : c'est le `.article-meta` du thème parent, qui suit la largeur
      brute de <main> et ignore le conteneur de 1140px sur lequel le fil
      d'Ariane et le titre sont calés depuis le lot 4. On lui donne le même
      conteneur, et les trois lignes s'alignent.

   2. LES 90px DE VIDE. Trois sections Elementor se succèdent avant le premier
      paragraphe : 6a6406e (hauteur 0), 2564378 (hauteur 20px, marge haute de
      20px) et 2680e5c (hauteur 0, marge basse de 30px). Toutes les trois sont
      VIDES, sans un seul widget : ce sont des restes de montage, et non des
      espaceurs voulus — un espaceur Elementor est un widget, il n'est donc pas
      concerné par la règle ci-dessous.

      Les sections qui portent un fond sont exclues : une bande de couleur
      décorative est vide de widgets mais se voit. Elementor les signale dans
      `data-settings`.

      La règle ne vaut que pour les articles, où le défaut est constaté. Si le
      même vide se retrouve sur des pages, il suffira de retirer `.single` du
      sélecteur, mais cela touche 151 pages montées à la main : à décider sur
      pièces, pas par précaution. */

/* Marge haute ajoutée le 24/09/2026 : le titre des articles n'est plus
   affiché (page-head.php), la signature collait au fil d'Ariane, 4px. */
.single .article-header {
  max-width: var(--lm-container);
  margin-inline: auto;
  margin-top: 1rem;
  padding-inline: 10px;
}

.single .entry-content .elementor > .elementor-top-section:not([data-settings*="background"]):not(:has(.elementor-widget)) {
  display: none;
}

/* ==========================================================================
   Formulaires, page 404, liens des articles
   Check complet du 24/09/2026 (docs/19-check-complet-2026-09-24.md).
   ========================================================================== */

/* Astérisque des champs obligatoires. Elementor marque déjà leur groupe de
   `elementor-field-required` ; la phrase qui l'explique est ajoutée avant le
   formulaire par inc/formulaires.php. La seconde déclaration donne un texte
   de remplacement vide : l'astérisque n'est pas lu, l'attribut required
   suffit aux lecteurs d'écran. */
.elementor-form .elementor-field-required .elementor-field-label::after {
  content: " *";
  content: " *" / "";
  color: var(--lm-primary);
}

.lm-form-legend,
.lm-form-privacy {
  font-size: .875rem;
  color: var(--lm-muted);
}

.lm-form-legend {
  margin: 0 0 1rem;
}

.lm-form-privacy {
  margin: 1rem 0 0;
}

.lm-form-privacy a {
  color: var(--lm-primary);
  text-decoration: underline;
  text-underline-offset: .15em;
}

/* Page 404 : les rubriques sous le champ de recherche (inc/erreur-404.php). */
.lm-404-sections ul {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .5rem 1.5rem;
  margin: 1.5rem 0 0;
  padding: 0;
  list-style: none;
}

.lm-404-sections a {
  color: var(--lm-primary);
  font-weight: 600;
}

/* Liens de catégorie et « Article précédent » des articles : sans
   soulignement, ils ne se distinguaient du texte voisin que par un contraste
   de 2,3:1 (axe : link-in-text-block, WCAG 1.4.1). */
body.single-post a[rel~="tag"],
body.single-post a[rel="prev"],
body.single-post a[rel="next"] {
  text-decoration: underline;
  text-underline-offset: .15em;
}
