.elementor-96 .elementor-element.elementor-element-150bbee6{--display:flex;--min-height:64vh;--justify-content:center;--padding-top:196px;--padding-bottom:144px;--padding-left:24px;--padding-right:24px;}.elementor-96 .elementor-element.elementor-element-150bbee6:not(.elementor-motion-effects-element-type-background), .elementor-96 .elementor-element.elementor-element-150bbee6 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:var( --e-global-color-psprot0 );}.elementor-96 .elementor-element.elementor-element-7d3d5a24{--display:flex;--gap:0px 0px;--row-gap:0px;--column-gap:0px;}.elementor-widget-text-editor{font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-size:var( --e-global-typography-text-font-size );font-weight:var( --e-global-typography-text-font-weight );line-height:var( --e-global-typography-text-line-height );color:var( --e-global-color-text );}.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:var( --e-global-color-primary );}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap, .elementor-widget-text-editor.elementor-drop-cap-view-default .elementor-drop-cap{color:var( --e-global-color-primary );border-color:var( --e-global-color-primary );}.elementor-96 .elementor-element.elementor-element-8d5c796e{font-family:var( --e-global-typography-pspsurt-font-family ), Sans-serif;font-size:var( --e-global-typography-pspsurt-font-size );font-weight:var( --e-global-typography-pspsurt-font-weight );text-transform:var( --e-global-typography-pspsurt-text-transform );line-height:var( --e-global-typography-pspsurt-line-height );letter-spacing:var( --e-global-typography-pspsurt-letter-spacing );color:var( --e-global-color-accent );}.elementor-widget-theme-post-title .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );color:var( --e-global-color-primary );}.elementor-96 .elementor-element.elementor-element-3983a46e .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );color:var( --e-global-color-pspnav9 );}.elementor-widget-post-info .elementor-icon-list-item:not(:last-child):after{border-color:var( --e-global-color-text );}.elementor-widget-post-info .elementor-icon-list-icon i{color:var( --e-global-color-primary );}.elementor-widget-post-info .elementor-icon-list-icon svg{fill:var( --e-global-color-primary );}.elementor-widget-post-info .elementor-icon-list-text, .elementor-widget-post-info .elementor-icon-list-text a{color:var( --e-global-color-secondary );}.elementor-widget-post-info .elementor-icon-list-item{font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-size:var( --e-global-typography-text-font-size );font-weight:var( --e-global-typography-text-font-weight );line-height:var( --e-global-typography-text-line-height );}.elementor-96 .elementor-element.elementor-element-a7d19e00 .elementor-icon-list-icon{width:14px;}.elementor-96 .elementor-element.elementor-element-a7d19e00 .elementor-icon-list-icon i{font-size:14px;}.elementor-96 .elementor-element.elementor-element-a7d19e00 .elementor-icon-list-icon svg{--e-icon-list-icon-size:14px;}.elementor-96 .elementor-element.elementor-element-082a6297{--display:flex;--padding-top:104px;--padding-bottom:104px;--padding-left:24px;--padding-right:24px;}.elementor-96 .elementor-element.elementor-element-082a6297:not(.elementor-motion-effects-element-type-background), .elementor-96 .elementor-element.elementor-element-082a6297 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:var( --e-global-color-pspcrem );}.elementor-96 .elementor-element.elementor-element-da0daf0b{--display:flex;--gap:0px 0px;--row-gap:0px;--column-gap:0px;}.elementor-widget-theme-post-content{color:var( --e-global-color-text );font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-size:var( --e-global-typography-text-font-size );font-weight:var( --e-global-typography-text-font-weight );line-height:var( --e-global-typography-text-line-height );}.elementor-96 .elementor-element.elementor-element-b7735daf{--display:flex;--padding-top:104px;--padding-bottom:104px;--padding-left:24px;--padding-right:24px;}.elementor-96 .elementor-element.elementor-element-b7735daf:not(.elementor-motion-effects-element-type-background), .elementor-96 .elementor-element.elementor-element-b7735daf > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:var( --e-global-color-primary );}.elementor-96 .elementor-element.elementor-element-a62e4b5c{--display:flex;--gap:0px 0px;--row-gap:0px;--column-gap:0px;}.elementor-96 .elementor-element.elementor-element-c8dbcc15{text-align:center;font-family:var( --e-global-typography-pspsurt-font-family ), Sans-serif;font-size:var( --e-global-typography-pspsurt-font-size );font-weight:var( --e-global-typography-pspsurt-font-weight );text-transform:var( --e-global-typography-pspsurt-text-transform );line-height:var( --e-global-typography-pspsurt-line-height );letter-spacing:var( --e-global-typography-pspsurt-letter-spacing );color:var( --e-global-color-pspsag3 );}.elementor-widget-heading .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );color:var( --e-global-color-primary );}.elementor-96 .elementor-element.elementor-element-37395f60{text-align:center;}.elementor-96 .elementor-element.elementor-element-37395f60 .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );color:var( --e-global-color-pspcrem );}.elementor-96 .elementor-element.elementor-element-483fdc1d{text-align:center;font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-size:var( --e-global-typography-text-font-size );font-weight:var( --e-global-typography-text-font-weight );line-height:var( --e-global-typography-text-line-height );color:var( --e-global-color-pspsag1 );}.elementor-widget-button .elementor-button{background-color:var( --e-global-color-accent );font-family:var( --e-global-typography-accent-font-family ), Sans-serif;font-size:var( --e-global-typography-accent-font-size );font-weight:var( --e-global-typography-accent-font-weight );text-transform:var( --e-global-typography-accent-text-transform );line-height:var( --e-global-typography-accent-line-height );letter-spacing:var( --e-global-typography-accent-letter-spacing );}.elementor-96 .elementor-element.elementor-element-7e8e172b .elementor-button-content-wrapper{flex-direction:row-reverse;}.elementor-96 .elementor-element.elementor-element-7e8e172b .elementor-button .elementor-button-content-wrapper{gap:8px;}.elementor-96 .elementor-element.elementor-element-d7dcb507{--display:flex;--padding-top:96px;--padding-bottom:104px;--padding-left:24px;--padding-right:24px;}.elementor-96 .elementor-element.elementor-element-d7dcb507:not(.elementor-motion-effects-element-type-background), .elementor-96 .elementor-element.elementor-element-d7dcb507 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-color:var( --e-global-color-pspsag0 );}.elementor-96 .elementor-element.elementor-element-9247c171{--display:flex;--gap:0px 0px;--row-gap:0px;--column-gap:0px;}.elementor-96 .elementor-element.elementor-element-fc1da63d{text-align:center;}.elementor-96 .elementor-element.elementor-element-fc1da63d .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );color:var( --e-global-color-pspnav9 );}.elementor-96 .elementor-element.elementor-element-5d413903{--display:flex;--padding-top:14px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-widget-loop-grid .elementor-button{background-color:var( --e-global-color-accent );font-family:var( --e-global-typography-accent-font-family ), Sans-serif;font-size:var( --e-global-typography-accent-font-size );font-weight:var( --e-global-typography-accent-font-weight );text-transform:var( --e-global-typography-accent-text-transform );line-height:var( --e-global-typography-accent-line-height );letter-spacing:var( --e-global-typography-accent-letter-spacing );}.elementor-widget-loop-grid .elementor-pagination{font-family:var( --e-global-typography-secondary-font-family ), Sans-serif;font-size:var( --e-global-typography-secondary-font-size );font-weight:var( --e-global-typography-secondary-font-weight );line-height:var( --e-global-typography-secondary-line-height );letter-spacing:var( --e-global-typography-secondary-letter-spacing );}.elementor-widget-loop-grid .e-load-more-message{font-family:var( --e-global-typography-secondary-font-family ), Sans-serif;font-size:var( --e-global-typography-secondary-font-size );font-weight:var( --e-global-typography-secondary-font-weight );line-height:var( --e-global-typography-secondary-line-height );letter-spacing:var( --e-global-typography-secondary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-f9527637{--grid-columns:3;}.elementor-96 .elementor-element.elementor-element-f9527637 .elementor-loop-container{grid-auto-rows:1fr;}.elementor-96 .elementor-element.elementor-element-f9527637 .e-loop-item > .elementor-section, .elementor-96 .elementor-element.elementor-element-f9527637 .e-loop-item > .elementor-section > .elementor-container, .elementor-96 .elementor-element.elementor-element-f9527637 .e-loop-item > .e-con, .elementor-96 .elementor-element.elementor-element-f9527637 .e-loop-item .elementor-section-wrap  > .e-con{height:100%;}@media(max-width:1024px){.elementor-96 .elementor-element.elementor-element-150bbee6{--min-height:60vh;--padding-top:172px;--padding-bottom:128px;--padding-left:24px;--padding-right:24px;}.elementor-widget-text-editor{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-96 .elementor-element.elementor-element-8d5c796e{font-size:var( --e-global-typography-pspsurt-font-size );line-height:var( --e-global-typography-pspsurt-line-height );letter-spacing:var( --e-global-typography-pspsurt-letter-spacing );}.elementor-widget-theme-post-title .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-3983a46e .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-widget-post-info .elementor-icon-list-item{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-widget-theme-post-content{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-96 .elementor-element.elementor-element-c8dbcc15{font-size:var( --e-global-typography-pspsurt-font-size );line-height:var( --e-global-typography-pspsurt-line-height );letter-spacing:var( --e-global-typography-pspsurt-letter-spacing );}.elementor-widget-heading .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-37395f60 .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-483fdc1d{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-widget-button .elementor-button{font-size:var( --e-global-typography-accent-font-size );line-height:var( --e-global-typography-accent-line-height );letter-spacing:var( --e-global-typography-accent-letter-spacing );}.elementor-96 .elementor-element.elementor-element-fc1da63d .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-widget-loop-grid .elementor-pagination{font-size:var( --e-global-typography-secondary-font-size );line-height:var( --e-global-typography-secondary-line-height );letter-spacing:var( --e-global-typography-secondary-letter-spacing );}.elementor-widget-loop-grid .elementor-button{font-size:var( --e-global-typography-accent-font-size );line-height:var( --e-global-typography-accent-line-height );letter-spacing:var( --e-global-typography-accent-letter-spacing );}.elementor-widget-loop-grid .e-load-more-message{font-size:var( --e-global-typography-secondary-font-size );line-height:var( --e-global-typography-secondary-line-height );letter-spacing:var( --e-global-typography-secondary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-f9527637{--grid-columns:2;}}@media(max-width:767px){.elementor-96 .elementor-element.elementor-element-150bbee6{--min-height:66vh;--padding-top:150px;--padding-bottom:96px;--padding-left:20px;--padding-right:20px;}.elementor-widget-text-editor{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-96 .elementor-element.elementor-element-8d5c796e{font-size:var( --e-global-typography-pspsurt-font-size );line-height:var( --e-global-typography-pspsurt-line-height );letter-spacing:var( --e-global-typography-pspsurt-letter-spacing );}.elementor-widget-theme-post-title .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-3983a46e .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-widget-post-info .elementor-icon-list-item{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-96 .elementor-element.elementor-element-082a6297{--padding-top:72px;--padding-bottom:72px;--padding-left:20px;--padding-right:20px;}.elementor-widget-theme-post-content{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-96 .elementor-element.elementor-element-b7735daf{--padding-top:76px;--padding-bottom:76px;--padding-left:20px;--padding-right:20px;}.elementor-96 .elementor-element.elementor-element-c8dbcc15{font-size:var( --e-global-typography-pspsurt-font-size );line-height:var( --e-global-typography-pspsurt-line-height );letter-spacing:var( --e-global-typography-pspsurt-letter-spacing );}.elementor-widget-heading .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-37395f60 .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-483fdc1d{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );}.elementor-widget-button .elementor-button{font-size:var( --e-global-typography-accent-font-size );line-height:var( --e-global-typography-accent-line-height );letter-spacing:var( --e-global-typography-accent-letter-spacing );}.elementor-96 .elementor-element.elementor-element-d7dcb507{--padding-top:68px;--padding-bottom:72px;--padding-left:20px;--padding-right:20px;}.elementor-96 .elementor-element.elementor-element-fc1da63d .elementor-heading-title{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );}.elementor-widget-loop-grid .elementor-pagination{font-size:var( --e-global-typography-secondary-font-size );line-height:var( --e-global-typography-secondary-line-height );letter-spacing:var( --e-global-typography-secondary-letter-spacing );}.elementor-widget-loop-grid .elementor-button{font-size:var( --e-global-typography-accent-font-size );line-height:var( --e-global-typography-accent-line-height );letter-spacing:var( --e-global-typography-accent-letter-spacing );}.elementor-widget-loop-grid .e-load-more-message{font-size:var( --e-global-typography-secondary-font-size );line-height:var( --e-global-typography-secondary-line-height );letter-spacing:var( --e-global-typography-secondary-letter-spacing );}.elementor-96 .elementor-element.elementor-element-f9527637{--grid-columns:1;}}/* Start custom CSS *//* =========================================================================
   PÔLE SANTÉ PSY · SOCLE DE FORMES ET D'ANIMATIONS
   Créé le 6 août 2026, à partir de la page Consultations (page 85).

   À QUOI SERT CE FICHIER
   C'est la couche d'ambiance du site, extraite de la page où elle a été mise
   au point, pour que les pages suivantes ne la réinventent pas. Il se colle
   TEL QUEL en tête du CSS de page, avant les règles propres à la page.
   Rien ici n'est spécifique à Consultations : aucune URL, aucun identifiant de
   page, aucun contenu. Seuls les DÉCALAGES de halos section par section sont à
   écrire dans le CSS de la page, et le §4 ci-dessous dit comment.

   TROIS COUCHES, PAS UNE DE PLUS. C'est la règle du §5 de CLAUDE.md, et c'est
   ce qui distingue un site vivant d'un sapin de Noël :
     1. APPARITIONS     fadeInUp 24px, 0,6s, décalage 80ms, déclenchement unique
     2. SURVOL          une micro-interaction par famille d'objet
     3. AMBIANCE        halos organiques, courbes, motif de pluie
   N'ajoute pas de quatrième couche. Si une page semble en avoir besoin, c'est
   qu'il lui manque une image ou une respiration, pas une animation.

   CINQ RÈGLES D'ÉCRITURE, toutes payées au moins une fois
   ---------------------------------------------------------------------------
   1. RÉPÉTITION DE CLASSE, jamais de préfixe d'identifiant de page.
      `.psp-x.psp-x.psp-x` vaut 0-3-0 et survit à une copie de page.
      `.elementor-page-85 .psp-x` fait le même travail et MEURT à la copie :
      c'est la cause des 42 sélecteurs morts du §19 étape 3.
   2. TOUTE RÈGLE QUI HABILLE UN TITRE RÉPÈTE SA CLASSE (0-4-0).
      Elementor émet ses contrôles de widget APRÈS le CSS personnalisé, et
      `.elementor-element-XXXX .elementor-heading-title` vaut 0-2-0 comme
      `.psp-x-titre .elementor-heading-title`. À spécificité égale, la sienne
      gagne : sans répétition, TOUS les titres sortent à la typographie globale.
      Constaté le 6 août 2026 sur les quatre pages du site.
   3. LES BORNES DE MESURE DE LECTURE S'ÉCRIVENT EN `em`, JAMAIS EN px.
      590px donne 72 caractères à 18px et 92 à 14px : une borne en pixels
      suppose une taille de police et ment dès qu'elle change. 33em ≈ 72
      caractères quelle que soit la taille.
   4. `var(--psp-titre, "Fraunces"), sans-serif` TOUJOURS avec son repli.
      La variable n'est définie nulle part sur le site : sans repli, la règle
      retombe silencieusement sur Source Sans 3.
   5. UNE RANGÉE ORPHELINE SE CORRIGE EN IMPOSANT LA GRILLE, jamais en
      ajustant le `flex-basis`. Voir §5 de ce fichier.
   ========================================================================= */


/* ==========================================================================
   1. GARDE-FOUS. À coller en premier, avant toute autre règle.
   ========================================================================== */

/* §18 pièges 2 et 3 : une animation d'entrée portée par un container masque
   son contenu POUR DE BON, parce que le container reçoit `elementor-invisible`
   mais que son `data-settings` sort vide et que le JS ne le révèle jamais.
   Règle : aucune animation sur un container, elles descendent sur les widgets.
   Cette ligne est la ceinture : l'apparition devient une amélioration
   progressive, jamais une condition d'affichage. */
.elementor-invisible { visibility: visible !important; }

/* §18 piège 4 : Elementor insère une cale sous un en-tête sticky, qui pousse
   le hero de 128px au lieu de l'y superposer. Le §8 veut la superposition. */
.elementor-sticky__spacer { display: none !important; }

/* Le §5 exige un anneau de mise au point visible, qu'Elementor supprime. */
:focus-visible {
  outline: 3px solid var(--psp-navy-700);
  outline-offset: 2px;
  border-radius: 2px;
}


/* ==========================================================================
   2. LES DEUX ANIMATIONS DE FOND. Aucune autre keyframe sur le site.
   ========================================================================== */

/* Déformation lente d'une forme organique. C'est le moteur de toute
   l'ambiance : halos de section, pastille du collage, formes libres. */
@keyframes psp-morph {
  0%   { border-radius: 62% 38% 47% 53% / 55% 44% 56% 45%; transform: translate3d(0,0,0) rotate(0deg); }
  33%  { border-radius: 38% 62% 63% 37% / 41% 58% 42% 59%; transform: translate3d(0,-14px,0) rotate(3deg); }
  66%  { border-radius: 55% 45% 34% 66% / 62% 36% 64% 38%; transform: translate3d(0,8px,0) rotate(-2deg); }
  100% { border-radius: 62% 38% 47% 53% / 55% 44% 56% 45%; transform: translate3d(0,0,0) rotate(0deg); }
}


/* ==========================================================================
   3. HALOS DE SECTION · classe `psp-forme`
   Deux halos par section, portés par les pseudo-éléments du container.
   Se pose sur n'importe quelle section. `--rose` inverse les deux couleurs.
   ========================================================================== */

.psp-forme { position: relative; overflow: hidden; isolation: isolate; }

.psp-forme::before,
.psp-forme::after {
  content: "";
  position: absolute;
  z-index: -1;
  pointer-events: none;
  animation: psp-morph 26s ease-in-out infinite;
}

.psp-forme::before {
  inset-inline-end: -10%;
  inset-block-start: -14%;
  inline-size: 44vw; block-size: 44vw;
  max-inline-size: 560px; max-block-size: 560px;
  background: radial-gradient(closest-side, var(--psp-sage-100), transparent 74%);
}

.psp-forme::after {
  inset-inline-start: -12%;
  inset-block-end: -18%;
  inline-size: 34vw; block-size: 34vw;
  max-inline-size: 430px; max-block-size: 430px;
  background: radial-gradient(closest-side, var(--psp-rose-100), transparent 74%);
  animation-duration: 34s;
  animation-direction: reverse;
}

.psp-forme--rose::before { background: radial-gradient(closest-side, var(--psp-rose-100), transparent 74%); }
.psp-forme--rose::after  { background: radial-gradient(closest-side, var(--psp-sage-100), transparent 74%); }

/* ATTENTION. `overflow: hidden` crée un conteneur de défilement, ce qui
   NEUTRALISE silencieusement le `position: sticky` de tout descendant : le
   `position` calculé sort bien à `sticky` et rien ne bouge. Sur une section qui
   contient une colonne collante, écrire `overflow: clip`, qui confine
   exactement pareil sans créer ce conteneur. */
/* .ma-section.ma-section.ma-section { overflow: clip; } */

/* Sur fond marine, les halos en teintes pleines éclaircissent le fond en
   plaques. Version translucide, à poser sur toute section sombre. */
.psp-sombre.psp-forme::before {
  background: radial-gradient(closest-side, rgba(79, 107, 87, .42), transparent 72%);
  inset-block-start: -16%; inset-inline-end: -12%;
}
.psp-sombre.psp-forme::after {
  background: radial-gradient(closest-side, rgba(142, 78, 86, .38), transparent 72%);
  inset-block-end: -20%; inset-inline-start: -10%;
}


/* ==========================================================================
   4. TROISIÈME HALO · classe `psp-halo`, sur le container INTÉRIEUR
   Un `psp-forme` n'a que deux pseudo-éléments donc deux halos, et deux halos
   aux angles laissent tout le centre plat. Sur une section qui porte une
   grille de quatre ou cinq blocs, ce troisième halo empêche le fond d'être uni.
   Il tourne en 52s contre 26 et 34 : trois durées premières entre elles, donc
   le motif ne se rejoue jamais à l'identique.
   À RÉSERVER aux sections les plus denses. Deux ou trois par page, pas plus.
   ========================================================================== */

.psp-halo { position: relative; }

.psp-halo::before {
  content: "";
  position: absolute;
  z-index: -1;
  pointer-events: none;
  inset-block-start: 18%;
  inset-inline-start: 22%;
  inline-size: 56vw;
  block-size: 56vw;
  max-inline-size: 760px;
  max-block-size: 760px;
  transform: translate(-50%, -20%);
  background: radial-gradient(closest-side, rgba(168, 191, 168, .30), transparent 72%);
  animation: psp-morph 52s ease-in-out infinite;
}

/* DÉCALAGES SECTION PAR SECTION, à écrire dans le CSS DE LA PAGE et pas ici.
   Si le halo revient au même endroit d'une section à l'autre, le motif devient
   un gabarit. Chaque page redéfinit ses positions, et elles doivent différer
   de celles des pages voisines. Gabarit à recopier :

   .ma-section::before { inset-block-start: -20%; inset-inline-end: -18%; inline-size: 42vw; block-size: 42vw; }
   .ma-section::after  { inset-block-end: -22%; inset-inline-start: -10%; inline-size: 28vw; block-size: 28vw; }

   Pour pousser un halo à gauche, penser à remettre `inset-inline-end: auto`,
   sinon les deux insets se battent. */


/* ==========================================================================
   5. SÉPARATIONS COURBES · classe `psp-courbe`
   La section remonte de 68px sur la précédente et lui présente un bord
   elliptique : la couleur du dessus déborde dans les angles et la transition
   devient un mouvement au lieu d'une ligne.

   QUATRE PAR PAGE, réparties. Sur treize sections ce serait un tic ; sur
   quatre c'est un rythme.
   Aucune image, aucun JavaScript, aucun pseudo-élément consommé : la courbe est
   un rayon de bordure sur la section elle-même, donc elle cohabite avec les
   halos de `psp-forme`.
   NE PAS la poser sur une section qui porte déjà une marge négative, comme le
   panneau de repères à cheval.
   ========================================================================== */

.psp-courbe {
  border-start-start-radius: 50% 68px;
  border-start-end-radius: 50% 68px;
  margin-block-start: -68px !important;
  padding-block-start: 180px !important;
  position: relative;
  z-index: 2;
}

@media (max-width: 767px) {
  .psp-courbe {
    border-start-start-radius: 50% 40px;
    border-start-end-radius: 50% 40px;
    margin-block-start: -40px !important;
    padding-block-start: 120px !important;
  }
}


/* ==========================================================================
   6. HERO · photographie sous voile marine, plus motif de pluie
   Composant du §17, identique sur les quatre pages. C'est ce voile qui rend
   lisibles le logo clair et la navigation blanche exigés au §8.
   ========================================================================== */

.psp-hero { position: relative; overflow: hidden; isolation: isolate; }

.psp-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(100deg,
      rgba(251, 242, 241, .97) 0%,
      rgba(251, 242, 241, .94) 34%,
      rgba(251, 242, 241, .84) 62%,
      rgba(245, 228, 228, .62) 100%),
    radial-gradient(70% 90% at 88% 18%, rgba(168, 191, 168, .32), transparent 70%);
}

/* En mobile, le voile passe en vertical : le dégradé oblique laisse le bas du
   texte sur la partie claire de l'image. */
@media (max-width: 767px) {
  .psp-hero::before {
    background:
      linear-gradient(180deg,
        rgba(251, 242, 241, .93) 0%,
        rgba(251, 242, 241, .95) 55%,
        rgba(251, 242, 241, .97) 100%);
  }
}

/* RYTHME VERTICAL DU HERO. Un hero se juge à CINQ écarts, jamais à sa hauteur
   totale. Valeurs mesurées et validées (§21, §22) :
     sous l'en-tête            96 à 190   (64 à 190 en mobile)
     surtitre vers titre       10 à 24
     titre vers bloc suivant   18 à 40
     dernier texte vers boutons 28 à 60
     BOUTONS VERS CE QUI SUIT  88 à 150   <- celui qu'on oublie
   Le cinquième décide de la sensation d'étouffement, parce que le panneau à
   cheval remonte de 84px DANS le hero et mange cet espace sans que ça
   apparaisse dans les réglages Elementor.
   Piège de compensation : aérer le haut d'un hero à hauteur fixe et contenu
   centré PREND l'espace en bas. Toujours re-mesurer le bas après avoir aéré. */
.psp-surtitre--clair { margin-block-end: 14px !important; }
.psp-hero-titre { margin-block-end: 26px !important; }
.psp-hero-titre .elementor-heading-title { text-wrap: balance; }
.psp-hero-chapo { max-inline-size: 33em; }
.psp-hero-chapo p { max-inline-size: 33em; margin: 0; }
.psp-hero-inner > .e-con-inner { margin-inline: auto; }
.psp-hero-actions { padding-block-start: 38px !important; }
.psp-hero-actions > .e-con-inner,
.psp-hero-actions { align-items: center; }

@media (max-width: 767px) {
  .psp-hero-inner > .e-con-inner { max-inline-size: 100%; }
  .psp-hero-actions { padding-block-start: 32px !important; }
}


/* ==========================================================================
   7. BANDE DE RESPIRATION · classe `psp-respire`
   Une pause dans le parcours, sur une page longue. Photographie pleine largeur
   sous voile marine, motif de pluie plus large et plus lent que celui du hero,
   une seule ligne en Fraunces.

   UNE SEULE PAR PAGE, et pas dans le même registre que celle des voisines :
   l'Accueil porte une citation sur fond sauge clair, Consultations une
   affirmation de méthode sur fond sombre. Deux pauses, deux registres.
   La photographie est décorative : le sens est porté par la ligne de texte,
   il n'y a donc pas de texte alternatif à inventer.
   ========================================================================== */

.psp-respire { position: relative; overflow: hidden; isolation: isolate; }

.psp-respire::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(180deg,
      rgba(15, 37, 64, .93) 0%,
      rgba(22, 50, 79, .86) 50%,
      rgba(15, 37, 64, .93) 100%),
    radial-gradient(60% 120% at 20% 50%, rgba(79, 107, 87, .34), transparent 72%);
}

.psp-respire-inner > .e-con-inner {
  max-inline-size: 820px;
  margin-inline: auto;
  text-align: center;
}

/* Widget de TEXTE et non de titre : une grande phrase décorative ne doit pas
   entrer dans la hiérarchie des titres de la page. */
.psp-respire-ligne p {
  margin: 0;
  font-family: var(--psp-titre, "Fraunces"), sans-serif;
  font-size: clamp(27px, 3.4vw, 44px);
  font-weight: 400;
  line-height: 1.28;
  letter-spacing: -.005em;
  text-wrap: balance;
}


/* ==========================================================================
   8. COLLAGE PHOTO · classes `psp-collage`, `psp-collage-a`, `psp-collage-b`
   Grande image à contour organique, vignette en chevauchement, pastille sauge
   qui se déforme derrière. C'est le composant qui casse un mur de texte quand
   une section n'a qu'une colonne.

   Les deux emplacements sont des containers VIDES : leurs URL vivent dans le
   bloc d'emplacements photo généré en fin de CSS de page, jamais ici.
   ========================================================================== */

.psp-collage {
  position: relative;
  padding-block-end: 76px !important;
  padding-inline-end: 62px !important;
}

.psp-collage-a,
.psp-collage-b {
  background-repeat: no-repeat !important;
  background-size: cover !important;
  background-position: center center !important;
  transition: border-radius .5s var(--psp-ease), box-shadow .35s var(--psp-ease);
}

.psp-collage-a {
  min-block-size: 380px;
  border-radius: 46% 54% 40% 60% / 12% 12% 88% 88%;
  box-shadow: var(--psp-ombre);
  width: 100%;
  max-width: 100%;
}

.psp-collage:hover .psp-collage-a { border-radius: 40% 60% 46% 54% / 16% 16% 84% 84%; }

.psp-collage-b {
  position: absolute;
  inset-block-end: 0;
  inset-inline-end: 0;
  inline-size: 58%;
  min-block-size: 200px;
  border-radius: 18px;
  border: 8px solid var(--psp-cream);
  box-shadow: var(--psp-ombre-fo);
}

.psp-collage:hover .psp-collage-b {
  box-shadow: 0 4px 8px rgba(15, 37, 64, .10), 0 22px 50px rgba(15, 37, 64, .20);
}

.psp-collage::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset-block-start: -30px;
  inset-inline-start: -36px;
  inline-size: 172px;
  block-size: 172px;
  background: var(--psp-sage-100);
  border-radius: 62% 38% 47% 53% / 55% 44% 56% 45%;
  animation: psp-morph 24s ease-in-out infinite;
}

@media (max-width: 900px) {
  .psp-collage { padding-inline-end: 44px !important; padding-block-end: 58px !important; }
  .psp-collage-a { min-block-size: 300px; }
}


/* ==========================================================================
   9. EMPLACEMENT PHOTO EN TÊTE DE CARTE · classe `psp-carte-photo`
   Zoom doux au survol, coins bas qui s'arrondissent un peu plus.

   UN EMPLACEMENT PHOTO EST UN CONTAINER VIDE, ET UN CONTAINER VIDE NE PREND
   AUCUNE HAUTEUR. Sans `min-block-size`, le fond est bien posé et l'image est
   INVISIBLE, et un contrôle qui teste `backgroundImage !== none` ne le voit
   pas. Trois garde-fous cumulés, dans cet ordre : le parent étire, l'emplacement
   fait 100%, et `no-repeat` plus `cover` empêchent toute tuile.
   ========================================================================== */

.psp-carte-photo {
  background-repeat: no-repeat !important;
  background-size: cover !important;
  background-position: center center !important;
  min-block-size: 210px;
  border-radius: 0 0 28px 28px;
  transition: border-radius .45s var(--psp-ease), transform .55s var(--psp-ease);
  transform-origin: center;
}

/* Le zoom passe par `transform` et non par `background-size` : la carte porte
   `overflow: hidden`, donc le débordement est masqué proprement, et on ne
   dépend plus d'une valeur qui déformait l'image. */
.psp-carte:hover .psp-carte-photo,
.psp-carte:focus-within .psp-carte-photo {
  transform: scale(1.05);
  border-radius: 0 0 42px 42px;
}


/* ==========================================================================
   10. MICRO-INTERACTIONS · une par famille d'objet, jamais deux
   Toute carte, tout panneau, tout bloc cliquable ou survolable du site prend
   `psp-leve`. Le filet de couleur qui s'allonge prend `psp-filet`.
   ========================================================================== */

.psp-leve {
  transition: transform .3s var(--psp-ease), box-shadow .3s var(--psp-ease);
}

.psp-leve:hover,
.psp-leve:focus-within {
  transform: translateY(-6px);
  box-shadow: var(--psp-ombre-fo);
}

/* Variante douce, pour les blocs de texte sans ombre au repos. */
.psp-leve--doux:hover { transform: translateY(-4px); box-shadow: var(--psp-ombre); }

/* Filet de couleur en tête de bloc, qui s'allonge au survol. */
.psp-filet { position: relative; }

.psp-filet::before {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline-start: 30px;
  inline-size: 44px;
  block-size: 3px;
  border-radius: 0 0 3px 3px;
  background: var(--psp-sage-600);
  transition: inline-size .3s var(--psp-ease);
}

.psp-filet:hover::before { inline-size: 76px; }

.psp-filet--marine::before { background: var(--psp-navy-600); }
.psp-filet--rose::before   { background: var(--psp-rose-700); }
.psp-filet--sauge::before  { background: var(--psp-sage-500); }

/* Barre pleine largeur en tête de panneau, variante sans survol. */
.psp-barre { position: relative; overflow: hidden; }

.psp-barre::before {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  block-size: 4px;
  z-index: 3;
  background: var(--psp-sage-600);
}

.psp-barre--marine::before { background: var(--psp-navy-600); }
.psp-barre--rose::before   { background: var(--psp-rose-700); }


/* ==========================================================================
   11. SIGNES GRAPHIQUES RÉCURRENTS
   Filet avant le surtitre, trait dégradé sous le titre de section centré,
   puces en goutte. C'est ce qui fait qu'une page nouvelle appartient au site.
   ========================================================================== */

.psp-surtitre p { margin: 0; }
.psp-surtitre--centre { margin-block-end: 12px; }
.psp-surtitre--clair p { color: var(--psp-rose-700); }

.psp-surtitre p::before {
  content: "";
  display: inline-block;
  inline-size: 28px;
  block-size: 2px;
  margin-inline-end: 12px;
  vertical-align: middle;
  background: currentColor;
  opacity: .6;
}

.psp-surtitre--centre p::after {
  content: "";
  display: inline-block;
  inline-size: 28px;
  block-size: 2px;
  margin-inline-start: 12px;
  vertical-align: middle;
  background: currentColor;
  opacity: .6;
}

/* AIR SOUS UN TITRE DE SECTION. Corrigé dans le socle le 6 août 2026, dette
   annoncée au §27.8 point 9. La règle d'origine était
   `.psp-section-titre { margin-block-end: 4px }`, et le §27.3 l'expliquait par
   un calibrage sur le titre CENTRÉ, qui reçoit ensuite le trait dégradé de
   22 px.

   MESURE FAITE AVANT DE CORRIGER, sur les cinq pages en ligne : ce n'était pas
   ça. LA RÈGLE NE S'APPLIQUAIT PAS DU TOUT. `margin-block-end` calculé = 0px
   sur les quatre pages publiées, alors que le socle écrit 4px. À 0-1-0 elle
   perd contre la marge de widget qu'Elementor émet dans le CSS du document
   APRÈS le CSS personnalisé : c'est le mécanisme du §26.4bis sur les titres et
   du §18 sur les boutons, ici appliqué à une marge. Les deux rustines de la
   page 87 ne fonctionnaient que parce qu'elles portaient `!important`.

   Écarts titre / bloc suivant relevés à 1440 px avant correction :
     Consultations  « Pourquoi consulter »       -2 px
     Consultations  « Quelles approches »        -2 px
     Qui suis-je    « Formations et diplômes »   14 px
     Prendre RDV    « Où me trouver »            16 px
     Accueil        « Un pôle spécialisé »       30 px
   Norme retenue, celle du §21 pour « titre vers bloc suivant » : 18 à 40 px.

   DEUX RÈGLES, PAS UNE. La marge seule ne suffit pas : l'écart dépendait aussi
   de la marge haute du bloc suivant, qui vaut 18 px sur `psp-texte`, 6 sur un
   `psp-liste` et 0 ailleurs. Même intention, trois résultats. La seconde règle
   la neutralise, pour que l'air vienne d'un seul endroit. */
.psp-section-titre.psp-section-titre.psp-section-titre { margin-block-end: 20px; }

/* Un titre CENTRÉ tire son air du trait dégradé ci-dessous (le `margin: 22px
   auto 0` du ::after). Il ne prend donc pas la marge. Même spécificité, écrite
   après, donc elle gagne. */
.psp-section-titre--centre.psp-section-titre--centre.psp-section-titre--centre { margin-block-end: 0; }

/* Elementor 7 ne pose PAS de `.elementor-widget-container` : le paragraphe est
   enfant DIRECT du widget. Vérifié dans le DOM le 6 août 2026, ne pas le
   supposer. 0-3-1, ce qui bat les 0-1-1 de `.psp-texte p` et `.psp-liste ul`. */
.psp-section-titre.psp-section-titre:not(.psp-section-titre--centre) + .elementor-element > p:first-child,
.psp-section-titre.psp-section-titre:not(.psp-section-titre--centre) + .elementor-element > ul:first-child {
  margin-block-start: 0;
}

.psp-section-titre--centre .elementor-heading-title::after {
  content: "";
  display: block;
  inline-size: 64px;
  block-size: 3px;
  margin: 22px auto 0;
  border-radius: 3px;
  background: linear-gradient(90deg, var(--psp-sage-300), var(--psp-rose-300));
}

/* Puce en goutte, pas un rond : rappel du fil rouge de la pluie. */
.psp-liste ul { margin: 6px 0 0; padding: 0; list-style: none; }

.psp-liste li {
  position: relative;
  padding-inline-start: 28px;
  margin-block-end: 9px;
  font-size: 16px;
  line-height: 1.6;
  max-inline-size: 33em;
}

.psp-liste li:last-child { margin-block-end: 0; }

.psp-liste li::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: .58em;
  inline-size: 11px;
  block-size: 11px;
  background: var(--psp-sage-300);
  border-radius: 50% 50% 50% 0;
  transform: rotate(-45deg);
}

.psp-liste--marine li::before { background: var(--psp-navy-600); }
.psp-liste--rose li::before   { background: var(--psp-rose-300); }

/* Amorce de citation : filet vertical, Fraunces italique. À distinguer de la
   bande de respiration, qui est pleine largeur. Deux formes, deux usages. */
.psp-citation-amorce p {
  margin: 0;
  padding-inline-start: 26px;
  border-inline-start: 3px solid var(--psp-sage-500);
  font-family: var(--psp-titre, "Fraunces"), sans-serif;
  font-size: clamp(21px, 2.1vw, 27px);
  font-weight: 400;
  font-style: italic;
  line-height: 1.42;
  color: var(--psp-navy-900);
  max-inline-size: 26em;
  text-wrap: balance;
}

/* Fraunces rend le & en esperluette ornementale, illisible dans un titre. Le
   §19 tranche : écrire « et ». Cette règle est une ceinture, à étendre à toute
   nouvelle classe de titre de la page. */
.psp-section-titre .elementor-heading-title { font-variant-ligatures: none; font-feature-settings: "dlig" 0; }

/* CEINTURE DE COUPURE DES TITRES. Trouvée le 6 août 2026 en construisant
   /entreprises/, par le contrôle de débordement de titre du §26.4bis.

   Le §26.4bis pose `overflow-wrap: break-word` sur les titres de CARTE, jamais
   sur le H1 ni sur les titres de SECTION, qui sont pourtant les plus gros de la
   page : à 35px en mobile, un mot de quatorze lettres sort de sa boîte. Mesuré
   à 375px : « Accompagnement » débordait de 10px, « fonctionnement » de 23.

   `hyphens: auto` et PAS `overflow-wrap` seul. La page est servie en
   `lang="fr-FR"`, donc le navigateur coupe aux vraies césures françaises et
   pose le trait d'union ; `overflow-wrap` couperait n'importe où, au milieu
   d'un mot, dans un H1 en Fraunces. Le second reste en dernier recours, pour un
   mot qu'aucun motif de césure ne sait couper (une URL, un sigle long).
   Vérifié au banc d'essai à 375px : zéro débordement avec `hyphens` seul. */
.psp-hero-titre.psp-hero-titre.psp-hero-titre .elementor-heading-title,
.psp-section-titre.psp-section-titre.psp-section-titre .elementor-heading-title {
  hyphens: auto;
  overflow-wrap: break-word;
}

/* Marqueur de chantier (§14) : une donnée manque, on l'affiche au lieu de
   l'inventer. À retirer dès que la cliente a répondu. */
.psp-attente-texte p {
  margin: 14px 0 0;
  font-size: 13px;
  font-style: italic;
  color: var(--psp-muted);
  max-inline-size: 33em;
}

.psp-attente-bloc {
  margin-block-start: 14px;
  padding: 14px 16px;
  border-radius: 12px;
  border: 1px dashed var(--psp-sage-500);
  background: var(--psp-sage-50);
}

.psp-attente-bloc p { margin: 0; font-size: 14px; line-height: 1.6; font-style: italic; max-inline-size: 33em; }


/* ==========================================================================
   12. MESURE DE LECTURE. En `em`, toujours.
   ========================================================================== */

.psp-mesure p { max-inline-size: 33em; }
.psp-mesure--centre p { max-inline-size: 33em; margin-inline: auto; }


/* ==========================================================================
   13. MOUVEMENT RÉDUIT. Non négociable, critère WCAG 2.3.3.
   Le kit coupe déjà animations et transitions. On neutralise en plus tout ce
   qui est porté par `transform` et par les pseudo-éléments de forme.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .psp-forme::before,
  .psp-forme::after,
  .psp-halo::before,
  .psp-collage::before{ animation: none; }

  .psp-leve:hover,
  .psp-leve--doux:hover,
  .psp-carte:hover .psp-carte-photo { transform: none; }

  html { scroll-behavior: auto; }
}


/* ==========================================================================
   14. GABARITS DE GRILLE. À recopier, jamais à improviser.

   UNE RANGÉE ORPHELINE NE SE CORRIGE PAS EN AJUSTANT LE `flex-basis`, ELLE SE
   CORRIGE EN IMPOSANT LA GRILLE. Avec une base souple, quatre blocs sortent en
   3 + 1 à 1440 et cinq blocs en 3 + 2 avec la seconde rangée ÉTIRÉE. Mesuré
   deux fois, sur Qui suis-je puis sur Consultations.

   Et il faut TOUJOURS les deux formes de sélecteur : un container boxed
   intercale un `.e-con-inner` et ses enfants sont petits-enfants, un container
   full n'en a aucun et ses enfants sont directs. Une règle qui ne vise qu'une
   des deux formes ne matche rien, EN SILENCE. Test de détection : lire le
   `flex` calculé de l'enfant, `0 1 auto` signale le piège. Et vérifier aussi le
   `flex-wrap` du PARENT : aucun `flex-basis` d'enfant ne provoque un repli si
   le parent refuse le retour à la ligne.

   DEUX BLOCS
     .P > .E, .P > .e-con-inner > .E { flex: 1 1 330px !important; width: auto !important; min-inline-size: 0 !important; }
     @media (max-width: 780px) { ... flex: 1 1 100% !important; }

   TROIS BLOCS · 3 colonnes ou 1, JAMAIS 2 + 1
     .P > .E, .P > .e-con-inner > .E { flex: 1 1 260px !important; width: auto !important; min-inline-size: 0 !important; }
     @media (max-width: 1000px) { ... flex: 0 0 100% !important; }

   QUATRE BLOCS · 2 x 2 imposé, ou 4 colonnes puis 2 x 2
     .P > .E, .P > .e-con-inner > .E { flex: 0 0 calc((100% - 24px) / 2) !important; width: auto !important; min-inline-size: 0 !important; }
     @media (max-width: 760px) { ... flex: 0 0 100% !important; }
     (variante 4 colonnes : calc((100% - 72px) / 4) au-dessus de 1200px)

   CINQ BLOCS · largeur imposée au tiers, `flex-grow: 0`, rangée incomplète
     .P > .E, .P > .e-con-inner > .E { flex: 0 0 calc((100% - 44px) / 3) !important; width: auto !important; min-inline-size: 0 !important; }
     @media (max-width: 1000px) { ... flex: 0 0 calc((100% - 22px) / 2) !important; }
     @media (max-width: 700px)  { ... flex: 0 0 100% !important; }

   Le `calc` soustrait les gouttières : (nombre de colonnes - 1) x écart.
   ========================================================================== */


/* =========================================================================
   ACTUALITÉS · RÈGLES COMMUNES AUX DEUX GABARITS
   7 août 2026. Collé après le socle dans le CSS de l'ARTICLE et dans celui de
   l'INDEX.

   POURQUOI CE FICHIER EXISTE, ET POURQUOI IL EST DUPLIQUÉ
   Un gabarit de Theme Builder n'est pas une page : trois documents Elementor
   cohabitent sur une même URL. Sur `/actualites/` le navigateur charge le CSS
   de l'INDEX plus celui du LOOP ITEM ; sur un article, celui de l'ARTICLE plus
   celui du LOOP ITEM. Le Loop Item n'a donc AUCUN CSS propre : ses règles
   vivent dans les deux documents qui l'hébergent. C'est un choix, et voici
   pourquoi : autrement il faudrait connaître l'ordre de chargement de trois
   feuilles pour savoir laquelle gagne, et cet ordre n'est garanti nulle part.
   Le coût est quatre kilo-octets écrits deux fois, le bénéfice est qu'aucune
   règle ne dépend d'un ordre qu'on ne contrôle pas.

   LES CINQ RÈGLES D'ÉCRITURE DU SOCLE S'APPLIQUENT SANS EXCEPTION.
   ========================================================================= */

/* ---------------------------------------------------------- 0. Fondations */

.psp-section { position: relative; }

/* ---------------------------------------------------------- 1. Boutons
   Vocabulaire arrêté au §17 et stabilisé au §28.5. Recopié tel quel depuis
   `entreprises.css` : ces variantes ne sont pas dans le socle, elles vivent
   dans le CSS de chaque document. */

.psp-bouton.psp-bouton.psp-bouton .elementor-button {
  border-radius: 999px;
  font-weight: 600;
  letter-spacing: .01em;
}

.psp-bouton--clair.psp-bouton--clair.psp-bouton--clair .elementor-button,
.psp-bouton--clair.psp-bouton--clair.psp-bouton--clair .elementor-button svg {
  fill: var(--psp-navy-900);
}
.psp-bouton--clair.psp-bouton--clair.psp-bouton--clair .elementor-button {
  background-color: var(--psp-cream) !important;
  color: var(--psp-navy-900);
  border: 2px solid var(--psp-cream);
  white-space: nowrap;
  padding: 15px 30px;
}
.psp-bouton--clair.psp-bouton--clair.psp-bouton--clair .elementor-button:hover,
.psp-bouton--clair.psp-bouton--clair.psp-bouton--clair .elementor-button:focus-visible {
  background-color: #FFFFFF;
  border-color: #FFFFFF;
  color: var(--psp-navy-900);
  box-shadow: 0 10px 28px rgba(0, 0, 0, .22);
}

.psp-bouton--secondaire.psp-bouton--secondaire.psp-bouton--secondaire .elementor-button {
  background-color: var(--psp-navy-800) !important;
  color: #FFFFFF;
  border: 2px solid var(--psp-navy-800);
  padding: 15px 30px;
}
.psp-bouton--secondaire.psp-bouton--secondaire.psp-bouton--secondaire .elementor-button:hover,
.psp-bouton--secondaire.psp-bouton--secondaire.psp-bouton--secondaire .elementor-button:focus-visible {
  background-color: var(--psp-navy-700);
  border-color: var(--psp-navy-700);
  color: #FFFFFF;
}
.psp-bouton--secondaire.psp-bouton--secondaire.psp-bouton--secondaire { align-self: flex-start; }

/* §28.5 : LA FLÈCHE SORTAIT EN BLANC SUR FOND BLANC sur trois pages publiées.
   Elementor colore le texte du bouton mais pose le `fill` du SVG dans le CSS
   du document, APRÈS le CSS personnalisé. `currentColor` raccroche la flèche à
   la couleur du texte quelle qu'elle soit, fond sombre compris. */
.psp-bouton--lien.psp-bouton--lien.psp-bouton--lien .elementor-button {
  background-color: transparent !important;
  color: var(--psp-navy-700);
  padding: 0;
  border-radius: 0;
  justify-content: flex-start;
  text-align: start;
  text-transform: none;
  font-weight: 500;
  font-size: 15px;
  letter-spacing: 0;
}
.psp-bouton--lien.psp-bouton--lien.psp-bouton--lien .elementor-button svg {
  fill: currentColor !important;
}
.psp-bouton--lien.psp-bouton--lien.psp-bouton--lien .elementor-button-text {
  background-image: linear-gradient(currentColor, currentColor);
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 0 1px;
  padding-block-end: 2px;
  transition: background-size .25s var(--psp-ease);
}
.psp-bouton--lien.psp-bouton--lien.psp-bouton--lien .elementor-button:hover .elementor-button-text,
.psp-bouton--lien.psp-bouton--lien.psp-bouton--lien .elementor-button:focus-visible .elementor-button-text {
  background-size: 100% 1px;
}

/* §27.3 point 4 : `align-self` du WIDGET bat `align-items` de son container.
   Un centrage se reprend sur le widget, jamais sur le parent seul. */
.psp-bouton--centre.psp-bouton--centre.psp-bouton--centre .elementor-button { margin-inline: auto; }
.psp-bouton--centre.psp-bouton--centre.psp-bouton--centre {
  text-align: center;
  align-self: center;
  align-items: center;
}

@media (max-width: 767px) {
  .psp-bouton--clair.psp-bouton--clair.psp-bouton--clair,
  .psp-bouton--clair.psp-bouton--clair.psp-bouton--clair .elementor-button,
  .psp-bouton--secondaire.psp-bouton--secondaire.psp-bouton--secondaire,
  .psp-bouton--secondaire.psp-bouton--secondaire.psp-bouton--secondaire .elementor-button { width: 100%; }
  .psp-bouton--clair.psp-bouton--clair.psp-bouton--clair .elementor-button,
  .psp-bouton--secondaire.psp-bouton--secondaire.psp-bouton--secondaire .elementor-button { justify-content: center; }
}


/* ---------------------------------------------------------- 2. Appel à l'action
   Même bloc que sur les six pages : surtitre, H2, un paragraphe, un bouton. */

.psp-cta-inner > .e-con-inner { max-inline-size: 820px; margin-inline: auto; }

.psp-cta-titre.psp-cta-titre.psp-cta-titre .elementor-heading-title {
  font-size: clamp(28px, 3.2vw, 41px);
  line-height: 1.22;
}

.psp-cta-texte p { margin: 0 0 30px; max-inline-size: 33em; margin-inline: auto; }


/* ---------------------------------------------------------- 3. Ligne de méta
   Catégorie, date, et temps de lecture ajouté par script sur l'article.
   Le widget `post-info` d'Elementor rend une `<ul class="elementor-icon-list-items">`
   et NON un `<p>` : le filet du surtitre du socle, écrit `.psp-surtitre p::before`,
   ne s'y applique pas. D'où ces règles dédiées plutôt qu'un détournement de
   `psp-surtitre`, qui aurait donné une classe qui ne fait rien.

   ICÔNES COUPÉES. Le §2 arbitre que l'iconographie ne porte aucun registre
   médical et que les sections se distinguent par la couleur et la forme : le
   site n'a pas une seule icône hors des flèches de bouton. Le réglage
   `show_icon: none` est posé sur chaque élément du répéteur, cette règle est la
   ceinture. */

.psp-meta .elementor-icon-list-items {
  margin: 0;
  padding: 0;
  list-style: none;
}

.psp-meta .elementor-icon-list-icon { display: none !important; }

.psp-meta .elementor-icon-list-item,
.psp-meta .elementor-icon-list-item a {
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .04em;
  line-height: 1.5;
}

/* Séparateur en point médian entre deux éléments, comme sur tout le site. */
.psp-meta .elementor-inline-item:not(:last-child)::after {
  content: "·";
  margin-inline: 10px;
  opacity: .55;
}


/* ---------------------------------------------------------- 4. Mouvement réduit
   Le socle neutralise halos, pluie, collage et micro-interactions. On ajoute
   ici les seules classes propres aux Actualités qui bougent. */

@media (prefers-reduced-motion: reduce) {
  .psp-art-carte:hover { transform: none; }
  .psp-filtre { transition: none; }
}


/* =========================================================================
   ACTUALITÉS · LA CARTE D'ARTICLE (gabarit Loop Item)
   7 août 2026. Collé dans le CSS de l'INDEX et dans celui de l'ARTICLE, jamais
   dans le gabarit Loop Item lui-même (voir l'en-tête de `actualites-commun.css`).

   LA CARTE RÉUTILISE LE SOCLE, ELLE NE LE RÉÉCRIT PAS :
     `psp-carte`        pour que le zoom de photo du socle se déclenche au survol
     `psp-leve`         translation -6px et ombre au survol
     `psp-barre--marine` barre pleine largeur en tête
     `psp-carte-photo`  cadrage, `no-repeat`, `cover`, zoom, coins bas arrondis

   L'IMAGE MISE EN AVANT EST FACULTATIVE, ET C'EST LE POINT DÉLICAT.
   Le verbatim demande une vignette sur chaque carte. Mais la cliente écrit
   elle-même et nous ne relirons pas ses articles : un jour elle publiera sans
   image mise en avant. Trois réponses possibles, et une seule tient :
     · imposer une image de repli identique pour tous → une grille de neuf
       cartes portant la MÊME photographie, ce qui est pire que rien ;
     · laisser l'emplacement vide → le socle lui donne `min-block-size: 210px`,
       donc un rectangle gris de 210px en tête de carte ;
     · FAIRE DISPARAÎTRE l'emplacement quand il n'y a pas d'image.
   C'est la troisième.

   PREMIÈRE TENTATIVE, ET POURQUOI ELLE A ÉCHOUÉ. La vignette était un container
   VIDE portant l'image mise en avant en FOND dynamique, comme les cinq
   emplacements photo des pages. Le repli devait être un sélecteur d'attribut
   `[style*="background-image"]`, en pariant sur le fait qu'Elementor pose un
   fond dynamique en style EN LIGNE puisqu'il diffère d'un élément de boucle à
   l'autre. MESURÉ À L'ÉCRAN LE 7 AOÛT 2026 : il ne le fait pas. Il émet une
   règle `.elementor-96 .elementor-element-XXXX { background-image: url(…) }`
   dans une feuille EN LIGNE de la page. Aucun attribut `style`, donc la règle
   de hauteur ne se déclenchait sur AUCUNE des deux cartes : l'une avec image et
   l'autre sans sortaient toutes les deux à `photo_h = 0`. C'est le piège 6 du
   §18 dans sa forme la plus pure, le fond posé et l'image invisible, et il a
   fallu MESURER les deux cartes pour le voir, la page n'ayant l'air de rien.

   CORRECTIF RETENU : le widget `theme-post-featured-image`, donc une vraie
   balise `<img>` et non un fond. Trois gains, et aucune perte :
     · quand l'article n'a pas d'image, le widget ne rend PAS de `<img>`, donc
       `:not(:has(img))` fait disparaître le bloc, ce qui est exprimable en CSS
       alors qu'un fond absent ne l'est pas ;
     · l'image porte le texte alternatif de la médiathèque, le chargement
       différé natif et le `srcset` de WordPress ;
     · les deux raisons qui faisaient écarter le widget Image au §17 ne
       s'appliquent pas ici : « Elementor efface les références média à
       l'import » vise un identifiant média ÉCRIT DANS LE JSON, et il n'y en a
       pas, l'image vient du marqueur dynamique ; « un widget Image sans pièce
       jointe n'a aucun texte alternatif exploitable » vise justement le cas où
       il n'y a pas de pièce jointe, et ici il y en a une.
   ========================================================================= */

/* ---------------------------------------------------------- 1. La carte */

.psp-art-carte.psp-art-carte.psp-art-carte {
  background: #FFFFFF;
  border-radius: 20px;
  overflow: hidden;
  block-size: 100%;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  padding: 0 !important;
  box-shadow: 0 1px 2px rgba(15, 37, 64, .05), 0 12px 30px rgba(15, 37, 64, .08);
}

/* La barre du socle est en `z-index: 3` et `position: absolute` sur le parent :
   elle passe donc PAR-DESSUS la photographie, ce qui est voulu, la carte se lit
   comme un objet unique et non comme deux blocs empilés. */

/* ---------------------------------------------------------- 2. L'emplacement photo
   `min-block-size: 0` annule le 210px du socle, qui suppose un container vide
   portant un fond : ici c'est une `<img>` qui donne la hauteur. 0-3-0 contre le
   0-1-0 du socle. */

.psp-art-photo.psp-art-photo.psp-art-photo {
  min-block-size: 0;
  border-radius: 0;
  inline-size: 100%;
  overflow: hidden;
  line-height: 0;               /* pas d'espace fantôme sous une image en ligne */
}

/* PAS D'IMAGE MISE EN AVANT : LE WIDGET N'EXISTE MÊME PAS DANS LE DOM.
   Vérifié : la carte n'a plus qu'UN enfant, son corps. La règle ci-dessous ne
   sert donc que de ceinture, pour le cas où une version d'Elementor rendrait
   une enveloppe vide. Le vrai traitement est le bandeau de repli ci-dessous. */
.psp-art-photo.psp-art-photo.psp-art-photo:not(:has(img)) { display: none !important; }

/* ---------------------------------------------------------- 2bis. BANDEAU DE REPLI
   LE DÉFAUT QUE LA CAPTURE A MONTRÉ, ET QUE TROIS MESURES AVAIENT MANQUÉ.
   Deux cartes côte à côte, l'une avec image et l'autre sans : elles avaient la
   même largeur, la même hauteur et le même alignement de lien, donc TOUTES les
   mesures passaient. À l'écran, la seconde portait 210 PIXELS DE VIDE entre son
   titre et son lien, parce que `equal_height` aligne les hauteurs et que le
   corps de la carte sans image n'a rien pour occuper la place de la photo.
   C'est littéralement la règle du §27.3 : une photographie sur l'une de deux
   cartes jumelles n'est jamais un choix, c'est un oubli.

   TROIS RÉPONSES POSSIBLES, ET LA TROISIÈME EST LA BONNE :
     · exiger l'image mise en avant → on ne relira pas les articles de la
       cliente, donc c'est un vœu, pas une garantie ;
     · une photographie de repli identique pour toutes → une grille de neuf
       cartes portant la même image, ce qui est pire que le vide ;
     · UN BANDEAU DESSINÉ, qui n'imite pas une photographie. Il tient la même
       place, il appartient au vocabulaire du site (sauge vers rose, la goutte
       du fil rouge de la pluie), et il ne prétend rien. Une carte sans image
       reste régulière au lieu d'être trouée.

   MISE EN ŒUVRE. Le bandeau est un `::after` du container de carte, remis en
   tête par `order: -1` puisque la carte est un flex en colonne. Il ne peut pas
   être un `::before` : celui-là porte déjà la barre de couleur du socle
   (`psp-barre`), et un élément n'a que deux pseudo-éléments. C'est la même
   collision que celle qui a fait disparaître le voile du hero, évitée cette
   fois parce qu'on la connaissait. */
.psp-art-carte:not(:has(.psp-art-photo))::after {
  content: "";
  order: -1;
  display: block;
  inline-size: 100%;
  block-size: 200px;
  background:
    radial-gradient(38% 52% at 74% 32%, rgba(251, 249, 245, .55), transparent 70%),
    radial-gradient(46% 60% at 22% 78%, rgba(255, 255, 255, .40), transparent 72%),
    linear-gradient(138deg, var(--psp-sage-100, #DDE7DA) 0%, var(--psp-rose-100, #F5E4E4) 100%);
}

@media (max-width: 767px) {
  .psp-art-carte:not(:has(.psp-art-photo))::after { block-size: 180px; }
}

.psp-art-photo.psp-art-photo.psp-art-photo img {
  display: block;
  inline-size: 100%;
  block-size: 200px;
  object-fit: cover;
  object-position: center center;
  border-radius: 0;
  box-shadow: none;
}

@media (max-width: 767px) {
  .psp-art-photo.psp-art-photo.psp-art-photo img { block-size: 180px; }
}

/* Le zoom du socle se fait par `transform` sur un élément à `overflow: hidden`
   côté carte. Rien à réécrire, sauf le sens du rayon : ici la photo est EN
   TÊTE de carte, donc ce sont les coins hauts qui suivent l'arrondi de la
   carte, et les coins bas restent droits. */
.psp-carte:hover .psp-art-photo.psp-art-photo.psp-art-photo,
.psp-carte:focus-within .psp-art-photo.psp-art-photo.psp-art-photo {
  border-radius: 0;
}


/* ---------------------------------------------------------- 3. Le corps
   `flex: 1` sur le corps et `margin-block-start: auto` sur le lien : sans ces
   deux lignes, le lien de chaque carte se cale sous son propre texte et les
   trois liens d'une rangée ne sont jamais alignés. C'est le défaut 3 du §20
   (204px de vide sous le lien d'un panneau), et son correctif. */

.psp-art-corps.psp-art-corps.psp-art-corps {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  flex: 1 1 auto;
  padding: 26px 26px 24px !important;
  gap: 0 !important;
}

.psp-art-meta.psp-art-meta { margin-block-end: 10px !important; }

.psp-art-meta .elementor-icon-list-item,
.psp-art-meta .elementor-icon-list-item a {
  font-size: 13px;
  text-transform: uppercase;
  letter-spacing: .09em;
  color: var(--psp-sage-600, #4F6B57);
}

/* §26.4bis et §27.1 : toute règle qui habille un titre RÉPÈTE SA CLASSE.
   Sans les quatre répétitions le titre sort à 33px, la typographie globale
   « Sous-titres », et un titre d'article long déborde de sa carte. Quatorze
   classes étaient en défaut sur les quatre premières pages du site. */
.psp-art-titre.psp-art-titre.psp-art-titre.psp-art-titre .elementor-heading-title {
  font-family: var(--psp-titre, "Fraunces"), sans-serif;
  font-size: 22px;
  font-weight: 600;
  line-height: 1.26;
  letter-spacing: -.005em;
  color: var(--psp-navy-900, #0F2540);
  overflow-wrap: break-word;
  -webkit-hyphens: auto;
  hyphens: auto;
  font-variant-ligatures: none;
  font-feature-settings: "dlig" 0;
}

.psp-art-titre.psp-art-titre { margin-block-end: 10px !important; }

/* Le titre est le lien principal de la carte. Il n'est PAS souligné au repos :
   le critère WCAG 1.4.1 vise les liens noyés dans un bloc de texte, pas un
   titre de carte, dont la nature de lien ne fait aucun doute. `recette-page.js`
   exclut d'ailleurs les liens de liste et de titre de ce contrôle depuis la
   session « Pied de page ». */
.psp-art-titre .elementor-heading-title a {
  color: inherit;
  text-decoration: none;
}
.psp-carte:hover .psp-art-titre .elementor-heading-title a,
.psp-art-titre .elementor-heading-title a:focus-visible { color: var(--psp-navy-700, #1E4463); }

/* PAS DE RÈGLE D'EXTRAIT, PARCE QU'IL N'Y A PAS D'EXTRAIT SUR LA CARTE.
   Il y en avait un, construit puis retiré le 7 août 2026 : le marqueur
   `post-excerpt` rend l'extrait SAISI À LA MAIN et rien quand il n'y en a pas,
   or la cliente écrit elle-même et le champ « Résumé » de Gutenberg est dans
   un panneau replié. Une grille où quatre cartes sur neuf portent un résumé
   n'est pas une variation, c'est la règle du §27.3 sur la photographie posée
   sur l'une de deux cartes jumelles. Le raisonnement complet est dans
   `build-actualites.py`, à l'endroit où le widget aurait dû être. */

/* §27.3 point 5 : l'écart « dernier texte vers bouton » du §21 vaut pour tout
   bloc qui se termine par une action, pas seulement pour le hero. Norme 28 à
   60. `margin-block-start: auto` pousse le lien en bas de la carte, la marge
   fixe garantit le plancher quand la carte est courte. */
.psp-art-lien.psp-art-lien {
  margin-block-start: auto !important;
  padding-block-start: 22px !important;
}


/* ---------------------------------------------------------- 4. La grille
   §26.4 : UNE RANGÉE ORPHELINE NE SE CORRIGE PAS EN AJUSTANT LE `flex-basis`,
   ELLE SE CORRIGE EN IMPOSANT LA GRILLE. La grille d'Elementor est ici une
   vraie grille CSS (`.elementor-grid`), pas un flex de containers : le piège
   6bis du §18 ne s'y applique pas, mais le principe si. Trois colonnes, puis
   deux, puis une. Jamais 2 + 1 sur une rangée de trois. */

.psp-index-grille .elementor-grid,
.psp-lire-grille .elementor-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 28px;
}

/* `flex-grow: 0`, largeur imposée au tiers : c'est la parade du §26.4, et elle
   est écrite ici plutôt que laissée à une base souple. Avec `flex-grow: 1`, une
   rangée incomplète étire ses cartes et une carte seule prend toute la largeur. */
.psp-index-grille .elementor-grid > *,
.psp-lire-grille .elementor-grid > * {
  flex: 0 0 calc((100% - 56px) / 3);
  min-inline-size: 0;
}

/* LA GRILLE « À LIRE AUSSI » EST CENTRÉE, CELLE DE L'INDEX NE L'EST PAS, et la
   différence est réfléchie.
   L'index est paginé : une rangée incomplète en fin de liste se lit comme la
   suite d'une grille, alignée à gauche comme les précédentes. « À lire aussi »
   n'affiche JAMAIS plus de trois cartes et en affichera souvent une ou deux :
   une carte seule calée à gauche sous un titre centré se lit comme un défaut.
   Vu à la CAPTURE, avec un seul article voisin. Aucune mesure ne pouvait le
   dire : la carte avait la bonne largeur et la bonne hauteur. */
.psp-lire-grille .elementor-grid { justify-content: center; }

@media (max-width: 1000px) {
  .psp-index-grille .elementor-grid,
  .psp-lire-grille .elementor-grid { gap: 24px; }
  .psp-index-grille .elementor-grid > *,
  .psp-lire-grille .elementor-grid > * { flex: 0 0 calc((100% - 24px) / 2); }
}

@media (max-width: 680px) {
  .psp-index-grille .elementor-grid,
  .psp-lire-grille .elementor-grid { gap: 22px; }
  .psp-index-grille .elementor-grid > *,
  .psp-lire-grille .elementor-grid > * { flex: 0 0 100%; }
}


/* ---------------------------------------------------------- 5. Pagination
   Elementor rend `.elementor-pagination` avec des `<a>` et un `<span class="current">`.
   Cibles tactiles à 44px, critère WCAG 2.5.8, le même plancher que les options
   du formulaire (§25.7). */

.psp-index-grille .elementor-pagination {
  margin-block-start: 44px;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 8px;
}

.psp-index-grille .elementor-pagination .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-inline-size: 44px;
  min-block-size: 44px;
  padding-inline: 12px;
  border-radius: 999px;
  border: 1px solid var(--psp-sage-300, #A8BFA8);
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: 16px;
  font-weight: 500;
  color: var(--psp-navy-700, #1E4463);
  text-decoration: none;
  background: #FFFFFF;
  transition: background-color .2s var(--psp-ease), color .2s var(--psp-ease),
              border-color .2s var(--psp-ease);
}

.psp-index-grille .elementor-pagination .page-numbers:hover,
.psp-index-grille .elementor-pagination .page-numbers:focus-visible {
  background: var(--psp-sage-50, #EEF3EC);
  border-color: var(--psp-sage-600, #4F6B57);
  color: var(--psp-navy-900, #0F2540);
}

.psp-index-grille .elementor-pagination .page-numbers.current {
  background: var(--psp-navy-800, #16324F);
  border-color: var(--psp-navy-800, #16324F);
  color: #FFFFFF;
}


/* =========================================================================
   PÔLE SANTÉ PSY · ÉCHELLE ET MISE EN PAGE DE L'ARTICLE · classe `psp-article`
   Créée le 7 août 2026, session « Actualités ».
   Reprise le 7 août 2026, session « Gabarit d'article, largeur » (§32).

   POURQUOI CE FICHIER EXISTE, ET POURQUOI IL EST DIFFÉRENT DES AUTRES
   Les neuf pages du site sont des blocs composés : chaque bloc de texte porte
   sa classe `psp-*` et sa règle. Un ARTICLE n'a rien de tout ça. Son contenu
   vient de Gutenberg, tapé par la cliente, et nous ne le relirons pas. On ne
   peut donc pas poser une classe par paragraphe : on habille UN conteneur et
   on laisse cascader.

   CONSÉQUENCE : ici on se bat contre DEUX feuilles à la fois, pas une.
     · Elementor, qui émet ses contrôles de widget APRÈS le CSS personnalisé ;
     · Kadence, qui style `.entry-content h2` et consorts en 0-2-1, parfois
       0-3-1 avec un préfixe de contexte.
   D'où la RÉPÉTITION QUADRUPLE de la classe sur toute règle d'élément :
   `.psp-article.psp-article.psp-article.psp-article h2` vaut 0-4-1 et gagne
   contre les deux.

   AUCUNE RÈGLE DE CHAPÔ. On pourrait grossir `p:first-of-type` pour simuler
   une accroche. C'est exactement le genre de règle qui dépend de la façon
   dont la cliente commence son article : elle ne se déclenche pas si elle
   ouvre par un titre, et elle grossit une ligne de trois mots si elle ouvre
   court. L'échelle doit tenir quelle que soit sa façon d'écrire.

   ------------------------------------------------------------------------
   CE QUI A CHANGÉ LE 7 AOÛT 2026, SESSION « LARGEUR » (§32)

   DÉFAUT 1, l'échelle était figée. Toutes les tailles de ce fichier étaient
   en pixels durs : 18px de corps, 30px de H2, 23px de H3. Mesuré au banc
   d'essai, le corps sortait à 18px aussi bien à 768 qu'à 1920px de viewport,
   alors que le §27 avait rendu tout le reste du site fluide le matin même.
   Le gabarit d'article court-circuitait donc l'échelle du kit. Corrigé : le
   corps consomme le jeton global, chaque autre niveau devient une droite
   `clamp(rem, rem + vw, rem)` calibrée entre 360 et 1920px de viewport.
   La partie fixe est en `rem` et jamais en px : un clamp purement en `vw`
   casse le critère WCAG 1.4.4 (§27).

   DÉFAUT 2, 646px de vide de chaque côté. Corrigé par la colonne à 38em, les
   médias qui prennent toute la grille, et le sommaire collant du CSS de
   gabarit. Arbitrage de Toufik du 7 août, mesures dans
   `SESSION-article-largeur.md`.

   LE PIÈGE QUI A COÛTÉ LE PLUS, ET IL EST NEUF.
   La colonne de lecture ne peut PAS s'écrire `max-width: 38em` sur chaque
   bloc. Une valeur en `em` se résout sur la taille de police du bloc qui la
   porte : un H2 à 30px reçoit 38 x 30 = 1140px, un paragraphe à 18,6px reçoit
   707px. Les titres débordaient de 200px de chaque côté de la colonne de
   texte. C'est le §24 (« une borne en pixels ment ») dans sa version
   symétrique : UNE BORNE EN `em` MENT DÈS QU'ELLE QUITTE LE BLOC DONT ELLE
   BORNE LE CORPS.

   PARADE, et c'est la pièce maîtresse de ce fichier : la colonne est une
   longueur ABSOLUE, `--psp-colonne`, égale à 38 fois le clamp du corps,
   développée à la main en rem + vw. Elle vaut la même chose sur un H2, sur
   une légende et sur un paragraphe, et elle suit quand même le corps quand
   l'écran change. Vérifié : les huit familles de blocs sortent à la largeur
   au pixel près, de 375 à 2560px.

       corps         clamp(1.0625rem, 1.010rem + 0.17vw, 1.1875rem)   17 -> 19
       x 38          clamp(40.375rem, 38.38rem + 6.46vw, 45.125rem)  646 -> 722

   Si le jeton de corps du kit change un jour, RECALCULER cette ligne : les
   deux valeurs ne sont pas liées par le CSS, seulement par ce commentaire.
   Une assertion du générateur vérifie qu'elles restent cohérentes.
   ========================================================================= */


/* ---------------------------------------------------------- 1. Le conteneur
   Le widget `theme-post-content` d'Elementor 7 ne pose PAS de
   `.elementor-widget-container` : le contenu Gutenberg est enfant DIRECT du
   widget. D'où les `>` directs.

   LE CONTENEUR PREND TOUTE LA ZONE, LA BORNE DESCEND SUR LES ENFANTS.
   Avant le §32, la borne était sur le conteneur. C'était juste tant que rien
   ne devait en sortir. Dès lors que les images et les tableaux prennent la
   grille, le conteneur doit être large et ce sont les blocs de texte qui se
   bornent. Le `max-width: 100% !important` reste indispensable : Elementor
   pose `max-width` en propriété PHYSIQUE sur ses widgets, et une règle écrite
   en propriété logique ne lui reprend pas la main (piège 5 du §16). */

.psp-article.psp-article.psp-article.psp-article {
  /* 38 x le corps. Voir l'avertissement de recalcul en tête de fichier. */
  --psp-colonne: clamp(40.375rem, 38.38rem + 6.46vw, 45.125rem);
  /* Plafond de hauteur d'un média en pleine grille, voir section 6. */
  --psp-media-max: 70vh;

  max-width: 100% !important;
  max-inline-size: 100%;
  inline-size: 100%;
  align-self: stretch;

  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: var(--e-global-typography-text-font-size, 1.125rem);
  line-height: 1.75;
  color: var(--psp-ink, #1A1F26);
  -webkit-hyphens: auto;
  hyphens: auto;
}

@media (max-width: 767px) {
  .psp-article.psp-article.psp-article.psp-article { line-height: 1.72; }
}

/* LA COLONNE DE LECTURE. Un bloc de texte ne dépasse jamais `--psp-colonne`,
   et il est centré dans la zone. `min(100%, ...)` pour qu'en dessous de la
   colonne, sur un téléphone, il prenne simplement la place disponible. */
.psp-article.psp-article.psp-article.psp-article > * {
  max-width: min(100%, var(--psp-colonne)) !important;
  max-inline-size: min(100%, var(--psp-colonne));
  margin-inline: auto;
}

/* Premier et dernier enfant sans marge propre : l'air vient du padding de
   section, sinon il s'additionne et on ne sait plus d'où il vient. */
.psp-article.psp-article.psp-article > *:first-child { margin-block-start: 0; }
.psp-article.psp-article.psp-article > *:last-child  { margin-block-end: 0; }


/* ---------------------------------------------------------- 2. Paragraphes
   `max-inline-size: none` est RETIRÉ. Il valait 0-4-1 et battait la borne
   posée sur `> *` en 0-4-0 : la règle de colonne était présente et ne
   s'appliquait pas, symptôme type du §27. La borne vit maintenant à un seul
   endroit, sur `> *`. */

.psp-article.psp-article.psp-article.psp-article p {
  margin: 0 0 1.15em;
  font-size: inherit;
  line-height: inherit;
  color: inherit;
}


/* ---------------------------------------------------------- 3. Titres
   Échelle du §4, ramenée à l'intérieur d'un article : le H1 est dans le hero,
   donc le plus gros titre du corps est un H2 et il ne doit pas rivaliser avec
   lui. Chaque niveau est une droite calibrée pour que le rendu validé à
   1440 px ne bouge pas : H2 30, H3 23, H4 19,5. C'est en dessous que ça se
   calme (H2 27,5 à 768, 26 à 375) et au-dessus que ça respire (31,8 au
   plafond). Même principe et mêmes bornes de calibrage qu'au §27.

   Les jetons globaux du kit ne conviennent PAS ici : `--psp-h2` vaut 28 -> 46,
   ce qui mettrait un titre de section d'article au niveau d'un H2 de page.
   Un article a sa propre échelle, plus resserrée, parce que son H1 est déjà
   dans le hero.

   `margin-block-start` généreuse et `margin-block-end` serrée : un titre
   appartient au texte qui le SUIT, pas à celui qui le précède.

   `hyphens: auto` plutôt que `overflow-wrap` seul : la page est servie en
   `lang="fr-FR"`, le navigateur coupe donc aux vraies césures françaises. */

.psp-article.psp-article.psp-article.psp-article h2,
.psp-article.psp-article.psp-article.psp-article h3,
.psp-article.psp-article.psp-article.psp-article h4,
.psp-article.psp-article.psp-article.psp-article h5,
.psp-article.psp-article.psp-article.psp-article h6 {
  font-family: var(--psp-titre, "Fraunces"), sans-serif;
  font-weight: 600;
  line-height: 1.24;
  letter-spacing: -.005em;
  color: var(--psp-navy-900, #0F2540);
  -webkit-hyphens: auto;
  hyphens: auto;
  overflow-wrap: break-word;
  font-variant-ligatures: none;      /* Fraunces rend le & en glyphe orné (§19) */
  font-feature-settings: "dlig" 0;
  text-wrap: pretty;
}

.psp-article.psp-article.psp-article.psp-article h2 {
  font-size: clamp(1.625rem, 1.5417rem + 0.3704vw, 2rem);   /* 26 -> 30 -> 32 */
  margin: 2em 0 .5em;
}

.psp-article.psp-article.psp-article.psp-article h3 {
  font-size: clamp(1.3125rem, 1.2708rem + 0.1852vw, 1.5rem); /* 21 -> 23 -> 24 */
  margin: 1.7em 0 .42em;
  color: var(--psp-navy-800, #16324F);
}

.psp-article.psp-article.psp-article.psp-article h4 {
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: clamp(1.125rem, 1.09375rem + 0.1389vw, 1.28125rem); /* 18 -> 19,5 -> 20,5 */
  font-weight: 600;
  margin: 1.5em 0 .38em;
  color: var(--psp-navy-800, #16324F);
}

.psp-article.psp-article.psp-article.psp-article h5,
.psp-article.psp-article.psp-article.psp-article h6 {
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: clamp(1rem, 0.9792rem + 0.0926vw, 1.09375rem);  /* 16 -> 17 -> 17,5 */
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .06em;
  margin: 1.4em 0 .35em;
  color: var(--psp-muted, #5A6673);
}

/* Un titre qui suit immédiatement un autre titre ne prend pas les 2em : ce
   sont deux niveaux d'un même palier, pas deux sections. */
.psp-article.psp-article.psp-article.psp-article h2 + h3,
.psp-article.psp-article.psp-article.psp-article h3 + h4 { margin-block-start: .9em; }

/* Cible d'ancre du sommaire. Sans cette marge, un clic sur une entrée du
   sommaire pose le titre SOUS l'en-tête sticky, qui fait 68px en état défilé.
   Même correctif qu'au §24 pour l'ancre `#fiche-contact`. */
.psp-article.psp-article.psp-article.psp-article h2[id],
.psp-article.psp-article.psp-article.psp-article h3[id] {
  scroll-margin-block-start: 108px;
}


/* ---------------------------------------------------------- 4. Listes
   Puce en goutte, comme partout ailleurs sur le site (socle §11). La liste
   NUMÉROTÉE prend un compteur en Fraunces : c'est le seul endroit du site où
   un chiffre apparaît dans du texte courant, et le rappel des étapes
   numérotées des pages en fait un signe de famille plutôt qu'un défaut. */

.psp-article.psp-article.psp-article.psp-article ul,
.psp-article.psp-article.psp-article.psp-article ol {
  margin: 0 0 1.2em;
  padding: 0;
  list-style: none;
  counter-reset: psp-num;
}

.psp-article.psp-article.psp-article.psp-article li {
  position: relative;
  padding-inline-start: 30px;
  margin-block-end: .5em;
  font-size: inherit;
  line-height: 1.7;
}

.psp-article.psp-article.psp-article.psp-article li:last-child { margin-block-end: 0; }

.psp-article.psp-article.psp-article.psp-article ul > li::before {
  content: "";
  position: absolute;
  inset-inline-start: 2px;
  inset-block-start: .62em;
  inline-size: 11px;
  block-size: 11px;
  background: var(--psp-sage-300, #A8BFA8);
  border-radius: 50% 50% 50% 0;
  transform: rotate(-45deg);
}

.psp-article.psp-article.psp-article.psp-article ol > li::before {
  counter-increment: psp-num;
  content: counter(psp-num) ".";
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: 0;
  font-family: var(--psp-titre, "Fraunces"), sans-serif;
  font-size: .94em;
  font-weight: 600;
  color: var(--psp-rose-700, #8E4E56);
}

/* Listes imbriquées : on retire le compteur hérité et on décale. */
.psp-article.psp-article.psp-article.psp-article li > ul,
.psp-article.psp-article.psp-article.psp-article li > ol {
  margin: .5em 0 0;
}


/* ---------------------------------------------------------- 5. Citation
   Même forme que `psp-citation-amorce` du socle : filet vertical sauge,
   Fraunces italique. Une citation dans un article et une amorce de citation
   sur une page doivent se ressembler, sinon le site parle deux langues.

   Le jeton `pspcita` du kit (21 -> 34) est trop généreux ici : à 34px une
   citation d'article passerait devant les H2. Échelle propre, 20 -> 23 -> 25. */

.psp-article.psp-article.psp-article.psp-article blockquote {
  margin: 1.8em 0;
  padding: 0 0 0 26px;
  border: 0;
  border-inline-start: 3px solid var(--psp-sage-500, #6E8A72);
  font-family: var(--psp-titre, "Fraunces"), sans-serif;
  font-size: clamp(1.25rem, 1.1875rem + 0.2778vw, 1.5625rem);
  font-style: italic;
  font-weight: 400;
  line-height: 1.45;
  color: var(--psp-navy-900, #0F2540);
  background: none;
  quotes: none;
}

.psp-article.psp-article.psp-article.psp-article blockquote p { margin-block-end: .5em; font-size: inherit; line-height: inherit; }
.psp-article.psp-article.psp-article.psp-article blockquote p:last-child { margin-block-end: 0; }

.psp-article.psp-article.psp-article.psp-article blockquote cite,
.psp-article.psp-article.psp-article.psp-article blockquote .wp-block-quote__citation {
  display: block;
  margin-block-start: .6em;
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: clamp(0.90625rem, 0.8854rem + 0.0926vw, 1rem);
  font-style: normal;
  color: var(--psp-muted, #5A6673);
}


/* ---------------------------------------------------------- 6. Images et médias
   ARBITRAGE DU 7 AOÛT 2026 : les blocs qui ne sont PAS du texte courant
   sortent de la colonne et prennent toute la zone. Le raisonnement est écrit
   dans `SESSION-article-largeur.md` : la contrainte de mesure de lecture porte
   sur du texte qui se lit ligne après ligne, elle n'a aucun sens pour une
   photographie qu'on saisit d'un seul regard, ni pour un tableau qu'on lit en
   colonnes.

   TROIS PIÈGES, TOUS TROIS TROUVÉS À LA CAPTURE ET PAS À LA MESURE.

   1. UNE IMAGE « ALIGNÉE AU CENTRE » DE GUTENBERG SORT EN `DIV.wp-block-image`
      QUI ENVELOPPE UN `FIGURE.aligncenter`. Un sélecteur `figure.wp-block-image`
      ne la voit pas, et elle échappe alors à toutes les règles de largeur.
      Les deux formes sont visées ci-dessous.

   2. SANS PLAFOND DE HAUTEUR, UNE PHOTOGRAPHIE AU FORMAT PORTRAIT RENDUE EN
      PLEINE GRILLE FAIT 1917px DE HAUT, soit deux écrans pour une seule image.
      Mesuré sur le média 99, 1600 x 2400. `--psp-media-max` à 70vh la ramène à
      un peu moins d'un écran. C'est ce plafond qui rend le gain de scroll
      possible : sans lui, élargir la colonne RALLONGE la page de 7,8 %.

   3. LA LÉGENDE DOIT GARDER SA PROPRE BORNE. Sous une image de 1240px, une
      légende non bornée sort à 143 caractères par ligne. Elle reprend
      `--psp-colonne`, qui vaut la même chose qu'ailleurs puisqu'elle est
      absolue, et se centre sous l'image. */

.psp-article.psp-article.psp-article.psp-article figure,
.psp-article.psp-article.psp-article.psp-article .wp-block-image {
  margin: 2em auto;
}

/* Les médias prennent toute la zone. */
.psp-article.psp-article.psp-article.psp-article > figure.wp-block-image,
.psp-article.psp-article.psp-article.psp-article > div.wp-block-image,
.psp-article.psp-article.psp-article.psp-article > figure.wp-block-table,
.psp-article.psp-article.psp-article.psp-article > .wp-block-table,
.psp-article.psp-article.psp-article.psp-article > pre {
  max-width: 100% !important;
  max-inline-size: 100%;
  inline-size: 100%;
  margin-inline: auto;
}

/* Sauf celle que la cliente a choisi de centrer : elle revient dans la
   colonne. C'est le seul réglage de largeur qu'elle contrôle, il est dans le
   guide d'administration. */
.psp-article.psp-article.psp-article.psp-article > div.wp-block-image:has(> figure.aligncenter),
.psp-article.psp-article.psp-article.psp-article > figure.wp-block-image.aligncenter {
  max-width: min(100%, var(--psp-colonne)) !important;
  max-inline-size: min(100%, var(--psp-colonne));
}

.psp-article.psp-article.psp-article.psp-article > div.wp-block-image > figure { margin: 0; }

.psp-article.psp-article.psp-article.psp-article img {
  display: block;
  max-inline-size: 100%;
  block-size: auto;
  border-radius: 18px;
  box-shadow: var(--psp-ombre, 0 2px 6px rgba(15,37,64,.08));
}

/* Le plafond de hauteur, avec `inline-size: auto` pour que l'image reste
   proportionnée, et centrée dans sa figure quand elle est plus étroite. */
.psp-article.psp-article.psp-article.psp-article figure.wp-block-image img,
.psp-article.psp-article.psp-article.psp-article .wp-block-image img {
  max-block-size: var(--psp-media-max);
  inline-size: auto;
  margin-inline: auto;
}

.psp-article.psp-article.psp-article.psp-article figcaption,
.psp-article.psp-article.psp-article.psp-article .wp-element-caption {
  max-width: min(100%, var(--psp-colonne)) !important;
  max-inline-size: min(100%, var(--psp-colonne));
  margin-block-start: .7em;
  margin-inline: auto;
  padding-inline: 0;
  font-size: clamp(0.875rem, 0.8542rem + 0.0926vw, 0.96875rem);
  font-style: italic;
  line-height: 1.55;
  color: var(--psp-muted, #5A6673);
  text-align: center;
}

/* Alignements de Gutenberg. `alignwide` et `alignfull` prennent désormais la
   zone au lieu d'être ramenés à la colonne : depuis le §32 la zone est large,
   ils ont donc un sens. À écrire dans le guide d'administration. */
.psp-article.psp-article.psp-article.psp-article .alignwide,
.psp-article.psp-article.psp-article.psp-article .alignfull {
  inline-size: 100%;
  max-inline-size: 100%;
  margin-inline: auto;
}

.psp-article.psp-article.psp-article.psp-article .aligncenter { margin-inline: auto; }
.psp-article.psp-article.psp-article.psp-article .aligncenter img { margin-inline: auto; }


/* ---------------------------------------------------------- 7. Liens dans le fil
   SOULIGNEMENT PERMANENT, pas au survol. Un lien noyé dans un paragraphe qui
   ne se distingue que par sa couleur échoue au critère WCAG 1.4.1, et c'est
   exactement ce que `recette-page.js` contrôle depuis le §24. Le soulignement
   qui se trace du §5 est réservé aux liens de CARTE, où le lien est seul sur
   sa ligne et où sa nature ne fait aucun doute. */

.psp-article.psp-article.psp-article.psp-article a {
  color: var(--psp-navy-700, #1E4463);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  text-decoration-color: var(--psp-sage-500, #6E8A72);
  transition: color .2s var(--psp-ease, cubic-bezier(.4,0,.2,1)),
              text-decoration-color .2s var(--psp-ease, cubic-bezier(.4,0,.2,1));
}

.psp-article.psp-article.psp-article.psp-article a:hover {
  color: var(--psp-navy-900, #0F2540);
  text-decoration-color: var(--psp-navy-700, #1E4463);
}

/* Une image dans un lien ne prend pas le soulignement. */
.psp-article.psp-article.psp-article.psp-article a:has(> img) { text-decoration: none; }


/* ---------------------------------------------------------- 8. Emphases */

.psp-article.psp-article.psp-article.psp-article strong,
.psp-article.psp-article.psp-article.psp-article b {
  font-weight: 600;
  color: var(--psp-navy-900, #0F2540);
}

.psp-article.psp-article.psp-article.psp-article em,
.psp-article.psp-article.psp-article.psp-article i { font-style: italic; }

.psp-article.psp-article.psp-article.psp-article mark {
  background: var(--psp-sage-100, #DDE7DA);
  color: inherit;
  padding: .05em .2em;
  border-radius: 3px;
}


/* ---------------------------------------------------------- 9. Séparateur
   Il ne prend PAS la grille comme les autres blocs non textuels : c'est un
   signe graphique de 64px, pas un média. La borne de `> *` le plafonne à la
   colonne, `inline-size` le ramène à sa taille, `margin auto` le centre. */

.psp-article.psp-article.psp-article.psp-article hr {
  margin: 2.4em auto;
  inline-size: 64px !important;
  block-size: 3px;
  border: 0;
  border-radius: 3px;
  background: linear-gradient(90deg, var(--psp-sage-300, #A8BFA8), var(--psp-rose-300, #E4BFC1));
}


/* ---------------------------------------------------------- 10. Encadré
   AJOUTÉ LE 7 AOÛT 2026. Le bloc « Groupe » à fond de Gutenberg est le seul
   moyen dont la cliente dispose pour poser un encadré sans écrire de HTML.
   Sans règle il sort à la couleur qu'elle a choisie dans la palette du thème,
   avec un contraste que personne n'a vérifié et un remplissage nul.

   LE SITE IMPOSE SA COULEUR PAR-DESSUS LA SIENNE, délibérément : sauge 50 avec
   du marine dessus donne 11,64 (AAA), et c'est la seule façon de garantir que
   l'encadré reste lisible quel que soit son choix. La contrepartie est écrite
   dans le guide : le sélecteur de couleur de fond ne fera rien de visible. */

.psp-article.psp-article.psp-article.psp-article .wp-block-group.has-background {
  padding: 26px 30px;
  border-radius: 18px;
  border-inline-start: 4px solid var(--psp-sage-500, #6E8A72);
  background: var(--psp-sage-50, #EEF3EC) !important;
  color: var(--psp-ink, #1A1F26);
  margin: 2em auto;
}

.psp-article.psp-article.psp-article.psp-article .wp-block-group.has-background > *:first-child { margin-block-start: 0; }
.psp-article.psp-article.psp-article.psp-article .wp-block-group.has-background > *:last-child { margin-block-end: 0; }

@media (max-width: 767px) {
  .psp-article.psp-article.psp-article.psp-article .wp-block-group.has-background { padding: 20px 22px; }
}


/* ---------------------------------------------------------- 11. Tableau
   La cliente peut en coller un. Sans règle il sort au style du thème, avec
   des bordures grises et un corps qui ne suit pas l'échelle. Il prend la zone
   depuis le §32, et défile horizontalement plutôt que de déborder. */

.psp-article.psp-article.psp-article.psp-article .wp-block-table,
.psp-article.psp-article.psp-article.psp-article figure.wp-block-table { overflow-x: auto; }

.psp-article.psp-article.psp-article.psp-article table {
  inline-size: 100%;
  border-collapse: collapse;
  margin: 1.6em 0;
  font-size: clamp(0.96875rem, 0.9375rem + 0.1389vw, 1.09375rem);
}

.psp-article.psp-article.psp-article.psp-article th,
.psp-article.psp-article.psp-article.psp-article td {
  padding: 10px 14px;
  text-align: start;
  border: 0;
  border-block-end: 1px solid var(--psp-sage-100, #DDE7DA);
}

.psp-article.psp-article.psp-article.psp-article th {
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-weight: 600;
  color: var(--psp-navy-900, #0F2540);
  border-block-end: 2px solid var(--psp-sage-300, #A8BFA8);
}


/* ---------------------------------------------------------- 12. Code
   Improbable sur ce site, mais un copier-coller depuis un PDF produit parfois
   du `<pre>`. Deux règles pour qu'il ne déborde pas. */

.psp-article.psp-article.psp-article.psp-article pre {
  overflow-x: auto;
  padding: 14px 16px;
  border-radius: 12px;
  background: var(--psp-sage-50, #EEF3EC);
  font-size: clamp(0.90625rem, 0.8854rem + 0.0926vw, 1rem);
  line-height: 1.6;
}

.psp-article.psp-article.psp-article.psp-article code {
  font-size: .92em;
  padding: .1em .3em;
  border-radius: 4px;
  background: var(--psp-sage-50, #EEF3EC);
}

.psp-article.psp-article.psp-article.psp-article pre code { padding: 0; background: none; }


/* ---------------------------------------------------------- 13. Ce qu'on ne
   veut PAS voir dans un article, et qui arriverait sans ces lignes.
   Un bloc « intégration » de Gutenberg (YouTube, Vimeo, X) dépose une iframe
   tierce, donc des cookies, donc le bandeau de consentement écarté au §2. On
   ne peut pas l'empêcher côté CSS, mais on peut le rendre VISIBLE pour qui
   relit la page, plutôt que de le laisser passer inaperçu. */

.psp-article.psp-article.psp-article.psp-article iframe {
  max-inline-size: 100%;
  outline: 3px dashed var(--psp-rose-700, #8E4E56);
  outline-offset: 4px;
}


/* =========================================================================
   ACTUALITÉS · GABARIT SINGLE POST, l'article
   7 août 2026. Socle + commun + carte + `psp-article.css` collés en tête à la
   génération.

   CE FICHIER NE PORTE QUE LA MISE EN PAGE DU GABARIT. Toute la typographie du
   texte courant est dans `psp-article.css`, qui se relit seul.

   LE HERO PORTE L'IMAGE MISE EN AVANT, AVEC UN REPLI MARINE.
   Le verbatim demande « Image à la une, titre, catégorie, date, temps de
   lecture ». Le fond du container est un marqueur dynamique : quand l'article
   n'a pas d'image mise en avant, le marqueur ne rend rien et la couleur de
   fond marine 900 du container reste seule sous le voile. Le hero ne se casse
   donc jamais, il devient simplement uni.

   LE HERO N'EST PAS SOUMIS AU CHARGEMENT DIFFÉRÉ. Le piège 5 du §18 vise
   `.e-con.e-parent:nth-of-type(n+4)`, c'est-à-dire la QUATRIÈME section et les
   suivantes : le hero est la première, il n'est pas concerné. La classe
   `e-no-lazyload` est posée en ceinture.
   ========================================================================= */

/* ---------------------------------------------------------- 1. Décalages de halos
   Différents de ceux de l'index, qui est le gabarit VOISIN : un lecteur passe
   de l'un à l'autre en un clic, c'est là que la répétition se verrait le plus. */

.psp-corps.psp-corps::before { inset-block-start: -16%; inset-inline-end: auto; inset-inline-start: -16%; inline-size: 34vw; block-size: 34vw; }
.psp-corps.psp-corps::after  { inset-block-end: -22%; inset-inline-start: auto; inset-inline-end: -12%; inline-size: 28vw; block-size: 28vw; }

.psp-encart.psp-encart::before { inset-block-start: -26%; inset-inline-end: -10%; inline-size: 30vw; block-size: 30vw; }
.psp-encart.psp-encart::after  { inset-block-end: -20%; inset-inline-start: -14%; inline-size: 34vw; block-size: 34vw; }

.psp-lire.psp-lire::before { inset-block-start: -20%; inset-inline-end: -18%; inline-size: 32vw; block-size: 32vw; }
.psp-lire.psp-lire::after  { inset-block-end: -28%; inset-inline-start: -8%; inline-size: 26vw; block-size: 26vw; }

/* Troisième halo : un seul, sur la section la plus dense, qui est le corps. */
.psp-corps-inner.psp-corps-inner::before { inset-block-start: 12%; inset-inline-start: 16%; }


/* ---------------------------------------------------------- 2. Hero d'article
   Trois blocs, un rôle chacun, règle du §20 : le surtitre nomme la rubrique,
   le H1 est le titre de l'article, la ligne de méta porte la catégorie, la date
   et le temps de lecture.

   LE H1 ÉTAIT EN `clamp(30px, 3.9vw, 48px)`, ET C'ÉTAIT DEUX DÉFAUTS EN UN.
   Un clamp dont la partie fixe est en pixels et dont la pente est en `vw` pur
   ne réagit plus au réglage de taille de police par défaut du navigateur :
   c'est le critère WCAG 1.4.4, et c'est exactement ce que le §27 avait corrigé
   partout ailleurs. Et son plafond était atteint dès 1231px, donc le titre
   d'article se figeait à 48px de là jusqu'à 2560, ce qui est le défaut d'origine
   du §27. Repris en rem + vw : 30 à 360, 48 à 1440 (valeur validée, inchangée),
   54 au plafond. */

.psp-art-h1.psp-art-h1.psp-art-h1 .elementor-heading-title {
  font-size: clamp(1.875rem, 1.5rem + 1.6667vw, 3.375rem);   /* 30 -> 48 -> 54 */
  line-height: 1.16;
}

.psp-art-h1 { max-inline-size: 20em; }

/* La ligne de méta est le troisième bloc du hero. Elle est claire sur le voile
   marine : sauge 300 sur marine 900 donne 10,35 (AAA), la même combinaison que
   la signature du logo sur fond marine (§15). */
/* 22px donnaient un écart titre vers méta de 47px, hors de la norme 18 à 40 du
   §21, à toutes les largeurs. Le H1 porte déjà `margin-block-end: 26px` depuis
   le socle : les deux s'additionnent, et c'est la seconde marge qu'on réduit,
   pour que l'air d'un hero vienne d'un seul endroit. Mesuré après
   correction : 35. */
.psp-article-meta { margin-block-start: 10px !important; }

/* 13px en dur figeaient la ligne de méta de 768 à 2560. Elle consomme
   désormais le jeton `pspsurt` du kit, 13 -> 15, comme tous les surtitres du
   site. */
.psp-article-meta .elementor-icon-list-item,
.psp-article-meta .elementor-icon-list-item a {
  color: var(--psp-sage-600, #4F6B57);
  text-transform: uppercase;
  letter-spacing: .09em;
  font-size: var(--e-global-typography-pspsurt-font-size, 0.8125rem);
}

/* Le temps de lecture est ajouté par script. Sans JavaScript, la ligne se
   limite à la catégorie et à la date, ce qui reste juste : c'est une
   amélioration progressive, jamais une condition d'affichage (§18 piège 3). */
.psp-article-meta .psp-lecture { opacity: 1; }


/* ---------------------------------------------------------- 3. Corps
   AVANT LE §32 : la zone était bornée à 860px et la colonne de lecture à
   594px, soit 646px de vide de chaque côté sur un écran de 1440. Le retour de
   Toufik était juste sur les deux points : la page était pauvre, et il n'y
   avait aucune place pour un média qui respire.

   DEPUIS : la zone prend la grille du site, 1240px, la colonne de lecture est
   dans `psp-article.css` à 38em (82 caractères, arbitrage assumé au-delà de la
   fourchette 65-75 du §4), et les médias sortent de la colonne. */

.psp-corps-inner.psp-corps-inner > .e-con-inner {
  max-inline-size: 1240px;
  margin-inline: auto;
}

/* Le widget qui porte les scripts ne doit rien occuper : il est en fin de
   section, invisible, et ne participe à aucune mesure. */
.psp-script { display: none !important; }


/* ---------------------------------------------------------- 3bis. Sommaire ancré
   AJOUTÉ LE 7 AOÛT 2026, arbitrage de Toufik.

   POURQUOI. Un article de 2500 mots fait six à sept écrans de défilement.
   Aucun levier de LARGEUR ne règle ça : mesuré sur l'article de test 113,
   passer de 71 à 82 caractères par ligne ne raccourcit la page que de 8 %, et
   la passer en pleine grille à 143 caractères de 16 %, au prix d'une lecture
   pénible. Le sommaire, lui, ne raccourcit rien du tout et supprime pourtant
   le défilement inutile : le lecteur va directement à sa section. C'est le
   seul des trois dispositifs qui fasse gagner du temps réel.

   IL EST CONDITIONNEL, ET SON ABSENCE N'EST JAMAIS UN DÉFAUT.
     · au-dessus de 1200px seulement, sinon il mange la colonne de lecture ;
     · à partir de QUATRE titres seulement, contrôlé par le script : un
       sommaire de deux entrées dans 250px annonce une structure que l'article
       n'a pas.
   Il est construit par un script en ligne, comme le temps de lecture : aucun
   appel réseau, aucun cookie, aucun stockage, donc pas de bandeau de
   consentement (§2). Sans JavaScript, l'article est simplement centré et
   complet : amélioration progressive, jamais condition d'affichage.

   TROIS PIÈGES, TOUS PAYÉS EN MAQUETTE.

   1. `overflow: hidden` DE `psp-forme` NEUTRALISE `position: sticky` DE TOUT
      DESCENDANT. C'est le piège 2 du socle, déjà payé au §24 sur le bloc « Où
      me trouver ». `overflow: clip` confine exactement pareil sans créer de
      conteneur de défilement.

   2. `.e-con-inner` D'ELEMENTOR EST EN `flex-direction: column`. Sans `row`,
      la colonne latérale s'empile AU-DESSUS du texte et ajoute 698px de
      hauteur au lieu de consommer le vide. C'est le piège 6bis du §18 dans une
      version « direction », jamais rencontrée jusqu'ici : le `flex` de
      l'enfant était bon, le `flex-wrap` du parent aussi, et c'est la
      DIRECTION qui était fausse. À ajouter à la liste des choses à lire avant
      d'écrire une règle flex sur un container Elementor.

   3. UN ITEM FLEX AVEC `max-width: 100%` NE RÉTRÉCIT PAS. Le pourcentage se
      résout sur le conteneur entier, pas sur la place restante : le corps
      d'article sortait à 1240px à côté d'une colonne de 250, donc en
      débordement silencieux masqué par l'`overflow` de la section. Il faut
      `flex: 1 1 0%`, `max-width: none` et `min-inline-size: 0` ensemble. */

.psp-sommaire { display: none; }

.psp-sommaire-titre {
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: var(--e-global-typography-pspsurt-font-size, 0.8125rem);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .09em;
  color: var(--psp-muted, #5A6673);
  margin: 0 0 14px;
  padding-block-end: 12px;
  border-block-end: 1px solid var(--psp-sage-300, #A8BFA8);
}

.psp-sommaire ol { list-style: none; margin: 0; padding: 0; }
.psp-sommaire li { margin: 0 0 11px; padding: 0; }
.psp-sommaire li::before { content: none; }

.psp-sommaire a {
  display: block;
  font-family: "Source Sans 3", system-ui, sans-serif;
  font-size: 15px;
  line-height: 1.4;
  color: var(--psp-navy-700, #1E4463);
  text-decoration: underline;
  text-decoration-color: transparent;
  text-underline-offset: 3px;
  transition: color .2s var(--psp-ease, cubic-bezier(.4,0,.2,1)),
              text-decoration-color .2s var(--psp-ease, cubic-bezier(.4,0,.2,1));
}

.psp-sommaire a:hover,
.psp-sommaire a:focus-visible {
  color: var(--psp-navy-900, #0F2540);
  text-decoration-color: var(--psp-sage-500, #6E8A72);
}

/* Les entrées de niveau trois sont décalées et plus discrètes : le sommaire
   doit se lire en un coup d'oeil comme une structure, pas comme une liste. */
.psp-sommaire li.psp-n3 a {
  padding-inline-start: 14px;
  font-size: 14px;
  color: var(--psp-muted, #5A6673);
}

@media (min-width: 1200px) {
  .psp-sommaire.psp-sommaire { display: block; }

  /* piège 1 */
  .psp-corps.psp-corps.psp-corps { overflow: clip; }

  /* piège 2 : la DIRECTION, pas seulement le wrap */
  .psp-corps-inner.psp-corps-inner > .e-con-inner {
    display: flex !important;
    flex-direction: row !important;
    flex-wrap: nowrap !important;
    align-items: flex-start;
    gap: 60px;
  }

  .psp-corps-inner.psp-corps-inner > .e-con-inner > .psp-sommaire {
    flex: 0 0 250px !important;
    inline-size: 250px !important;
    position: sticky;
    /* en-tête en état défilé 68px, plus 36px d'air */
    inset-block-start: 104px;
    order: -1;
  }

  /* piège 3 : les trois déclarations sont nécessaires ensemble */
  .psp-corps-inner.psp-corps-inner > .e-con-inner > .psp-article.psp-article.psp-article.psp-article {
    flex: 1 1 0% !important;
    inline-size: auto !important;
    max-width: none !important;
    min-inline-size: 0 !important;
    align-self: flex-start;
  }
}

@media (prefers-reduced-motion: reduce) {
  .psp-sommaire a { transition: none; }
}


/* ---------------------------------------------------------- 4. Encart de fin
   Texte du verbatim, à un mot près : « Le blog ne remplace pas une
   consultation » devient « Ces articles ne remplacent pas une consultation »,
   parce que le mot « blog » vient de Toufik et que la cliente a arrêté
   « Actualités » (§23). C'est le seul écart de rédaction de ce gabarit.

   C'EST LE SEUL APPEL À L'ACTION DE LA PAGE. On aurait pu ajouter un bloc
   marine en fin de page comme sur les six autres : ce serait deux boutons vers
   la même fiche contact sur un même écran, ce que le §24 s'interdit
   explicitement. L'encart prend donc le fond marine et devient le point
   culminant visuel de l'article. */

.psp-encart-inner > .e-con-inner { max-inline-size: 760px; margin-inline: auto; }

.psp-encart-titre.psp-encart-titre.psp-encart-titre.psp-encart-titre .elementor-heading-title {
  font-size: clamp(1.5rem, 1.3542rem + 0.6481vw, 2.125rem);   /* 24 -> 34 */
  line-height: 1.24;
}

.psp-encart-titre.psp-encart-titre { margin-block-end: 16px !important; }

.psp-encart-texte p { margin: 0 0 30px; max-inline-size: 33em; margin-inline: auto; }


/* ---------------------------------------------------------- 5. À lire aussi
   Trois articles de la même catégorie, comme le demande le verbatim. La grille
   et la carte viennent de `actualites-carte.css`, rien n'est réécrit ici.

   LA SECTION DISPARAÎT QUAND LA REQUÊTE NE REND RIEN. Sur un site qui vient
   d'ouvrir, un article n'a aucun voisin dans sa catégorie : sans cette règle,
   le lecteur verrait un titre « À lire aussi » suivi de rien du tout.

   CONSÉQUENCE SUR LE RYTHME DES FONDS, et elle est bonne : quand la section
   est masquée, l'encart marine 800 devient la dernière section avant le pied
   de page marine 900, ce qui est exactement la fin de page des six autres
   pages du site (§17, section 7). */

.psp-lire-inner > .e-con-inner { max-inline-size: 1240px; margin-inline: auto; }

.psp-lire:not(:has(.elementor-loop-container > *)) { display: none !important; }

.psp-lire-titre.psp-lire-titre.psp-lire-titre.psp-lire-titre .elementor-heading-title {
  font-size: clamp(1.625rem, 1.4792rem + 0.6481vw, 2.25rem);   /* 26 -> 36 */
  line-height: 1.24;
}/* End custom CSS */