@charset "UTF-8";
/* ==========================================================================
   CLIENT -- LE SEUL FICHIER A EDITER POUR FORKER SUR UN NOUVEAU CLIENT.
   Il ne contient QUE les valeurs de marque (couleurs + polices).
   Toute la machinerie (--color-*, echelles fluides, utilities, $theme-colors)
   se derive de ces valeurs dans vars/_vars.scss et n'a jamais a etre touchee.

   Client courant : LES ATELIERS MAISON MARIA STELLA (Perpignan).

   TOUTES LES VALEURS CI-DESSOUS SONT MESUREES, PAS CHOISIES. Elles ont ete
   prelevees sur son logo et ses deux documents de communication, avec
   `proto/design-refs/palette.py` (quantification + contrastes WCAG).
   Le releve complet, avec les points de prelevement :
   `proto/design-refs/maison-maria-stella/RELEVE.md`.
   ========================================================================== */
/* ==========================================================================
   VARS -- machinerie generique, derivee de vars/_client.scss.
   NE JAMAIS mettre de valeur specifique client ici : tout vient de $brand-*.
   Nomenclature canonique : --color-<nom> (sans prefixe Elementor).
   ========================================================================== */
/* ==========================================================================
   CSS CUSTOM PROPERTIES
   ========================================================================== */
:root,
body {
  --color-primary: #AF6D5D;
  --color-secondary: #01334D;
  --color-accent: #A32C8B;
  --color-text: #3E3338;
  --color-white: #FFFFFF;
  --color-black: #1C1418;
  --color-surface: #FDE7E8;
  --color-surface-alt: #FFFFFF;
  --color-bg-dark: #01334D;
  --color-bg-darker: #01222F;
  --color-primary-alpha: rgba(172, 98, 89, 0.1254901961);
  --color-muted: #9A8B87;
  --color-on-primary: #FDECEF;
  --color-highlight: #FBC08E;
  --color-accent-soft: #CB7DB4;
  --color-accent-warm: #F37545;
  --color-primary-ink: #96594A;
  --color-highlight-ink: #CF6307;
  --color-tertiary: #55766D;
  --color-tertiary-ink: #4D6B63;
  --e-global-color-primary: var(--color-primary);
  --e-global-color-secondary: var(--color-secondary);
  --e-global-color-accent: var(--color-accent);
  --e-global-color-text: var(--color-text);
  --e-global-color-white: var(--color-white);
  --e-global-color-black: var(--color-black);
  --e-global-color-surface: var(--color-surface);
  --e-global-color-surface-alt: var(--color-surface-alt);
  --e-global-color-bg-dark: var(--color-bg-dark);
  --e-global-color-bg-darker: var(--color-bg-darker);
  --e-global-color-primary-alpha: var(--color-primary-alpha);
  --e-global-color-muted: var(--color-muted);
  --e-global-color-on-primary: var(--color-on-primary);
  --e-global-color-highlight: var(--color-highlight);
  --e-global-color-accent-soft: var(--color-accent-soft);
  --e-global-color-accent-warm: var(--color-accent-warm);
  --e-global-color-primary-ink: var(--color-primary-ink);
  --e-global-color-highlight-ink: var(--color-highlight-ink);
  --e-global-color-tertiary: var(--color-tertiary);
  --e-global-color-tertiary-ink: var(--color-tertiary-ink);
  /* Familles de police en custom properties. Les feuilles de FEATURE sont des
     entrees Mix autonomes : elles n'ont aucun acces aux variables SCSS, donc
     aucun moyen de demander « la police de titre ». Faute de ces deux tokens,
     `features/realisations.scss` appelait `var(--font-primary)` -- un nom qui
     n'a jamais existe nulle part -- et retombait en silence sur `inherit`,
     c'est-a-dire sur la police de CORPS pour ses trois titres. */
  --font-heading: Fraunces, Georgia, serif;
  --font-body: Montserrat, system-ui, sans-serif;
  --e-global-typography-primary-font-family: Fraunces, Georgia, serif;
  --e-global-typography-primary-font-weight: 700;
  --e-global-typography-secondary-font-family: Fraunces, Georgia, serif;
  --e-global-typography-secondary-font-weight: 700;
  --e-global-typography-text-font-family: Montserrat, system-ui, sans-serif;
  --e-global-typography-text-font-weight: 400;
  --e-global-typography-accent-font-family: Montserrat, system-ui, sans-serif;
  --e-global-typography-accent-font-weight: 700;
  --e-global-typography-display-font-family: Fraunces, Georgia, serif;
  --e-global-typography-overline-font-family: Montserrat, system-ui, sans-serif;
  --e-global-typography-caption-font-family: Montserrat, system-ui, sans-serif;
  /* --- Typographie fluide (echelle cross-project) --- */
  --fs-xs: clamp(0.75rem, calc(0.71rem + 0.2vw), 0.875rem);
  --fs-s: clamp(0.875rem, calc(0.83rem + 0.2vw), 1rem);
  --fs-m: clamp(1rem, calc(0.96rem + 0.3vw), 1.325rem);
  --fs-l: clamp(1rem, calc(1rem + 0.63vw), 1.5rem);
  --fs-xl: clamp(1.125rem, calc(1.25rem + 0.755vw), 2.5rem);
  --fs-xxl: clamp(1.25rem, calc(1.25rem + 1.5vw), 3.5rem);
  --fs-xxxl: clamp(1.5rem, calc(1.5rem + 3vw), 5rem);
  /* --- Espacements fluides --- */
  --space-xs: clamp(0.5rem, 0.375rem + 0.625vw, 1rem);
  --space-s: clamp(1rem, 0.75rem + 1.25vw, 2rem);
  --space-m: clamp(1.5rem, 1.125rem + 1.875vw, 3rem);
  --space-l: clamp(2rem, 0.5rem + 7.5vw, 4rem);
  --space-xl: clamp(3rem, 1.25rem + 2.75vw, 6rem);
  --space-xxl: clamp(4rem, 2rem + 7vw, 8rem);
  --space-xxxl: clamp(5rem, 3rem + 9vw, 12rem);
  /* --- Animations : decalage initial des reveals au scroll (.anim--up/left/...) --- */
  --anim-shift: 2rem;
  /* --- Rayons : tokens CSS derives des $radius-* (dispo dans les entries isolees, ex lexique) --- */
  --radius-s: 1px;
  --radius-m: 2px;
  --radius-l: 4px;
  --shadow: none;
  --shadow-hover: 0 10px 28px rgba(28, 20, 24, 0.12);
  --border-width: 1px;
  /* --- Boutons + liens (source : vars/_client.scss $brand-btn-* / $brand-link-hover) --- */
  --btn-radius: 999px;
  --btn-padding: 1.05em 2.4em;
  --link-hover: var(--color-accent);
  /* --- Scheme de surfaces actif (source : vars/_client.scss $scheme-active) --- */
  --surface-section: var(--color-surface);
  --surface-section-alt: var(--color-white);
  --surface-card: var(--color-white);
  --surface-field: var(--color-white);
  --text-prose: #4A3F44;
  --text-subtle: #6D6262;
  --text-heading: var(--color-secondary);
  --text-heading-sub: var(--color-accent);
  --text-accent-label: var(--color-primary);
  --divider: rgba(172, 98, 89, 0.2);
  --scheme-ink: #3E3338;
}

/* --- Headings : tailles fluides (couleur + police via commons/_theme-style) --- */
h1 {
  font-size: var(--fs-xxxl);
  line-height: 1.1;
}

h2 {
  font-size: var(--fs-xxl);
  line-height: 1.15;
}

h3 {
  font-size: var(--fs-xl);
  line-height: 1.2;
}

h4 {
  font-size: var(--fs-l);
  line-height: 1.3;
}

h5 {
  font-size: var(--fs-m);
  line-height: 1.4;
}

h6 {
  font-size: var(--fs-s);
  line-height: 1.5;
}

/* ==========================================================================
   FONTS -- Maison Maria Stella, self-hosted (woff2), subsets latin + latin-ext.
   Pose au fork le 2026-08-05. Remplace les Poppins du template (Vesta).

   Les trois familles sont celles que la cliente emploie DEJA dans sa
   communication (logo, affiche A3, programme d'ete) :

   - Fraunces   : equivalent Google Fonts de MISKAN, la serif de son logo.
                  Servie avec l'axe WONK a 1 et SOFT a 50 : c'est WONK qui
                  produit les formes groovy irregulieres de « Maria Stella ».
                  VARIABLE : un seul fichier couvre 400 a 800.
   - Anton      : sa police de gros titres (« ARTS PLASTIQUES »).
                  N'EXISTE QU'EN 400. Ne jamais lui demander une autre graisse :
                  `font-synthesis: none` (commons/_base.scss) rendrait le
                  tracé d'origine, et sans cette regle le navigateur
                  fabriquerait un faux gras qui bave sur un grand titre.
   - Montserrat : sa police de textes et d'etiquettes. VARIABLE, 300 a 700.

   Deux familles sur trois etant variables, le site charge 6 fichiers pour
   toute sa hierarchie, contre 6 chez Vesta pour 3 graisses figees.
   ========================================================================== */
/* --- Fraunces (titres) -- variable 400..800, SOFT 50, WONK 1 --- */
@font-face {
  font-family: "Fraunces";
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("fonts/fraunces-var-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Fraunces";
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("fonts/fraunces-var-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* --- Anton (display) -- 400 UNIQUEMENT --- */
@font-face {
  font-family: "Anton";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/anton-400-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Anton";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/anton-400-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* --- Montserrat (textes) -- variable 300..700 --- */
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url("fonts/montserrat-var-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url("fonts/montserrat-var-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* ==========================================================================
   RESET CSS MODERNE
   (Remplace le reset.css et theme.css natifs du thème Hello)
   ========================================================================== */
*, *::before, *::after {
  box-sizing: border-box;
}

* {
  margin: 0;
  padding: 0;
}

body {
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

img, picture, video, canvas, svg {
  display: block;
  max-width: 100%;
  height: auto;
}

input, button, textarea, select {
  font: inherit;
}

p, h1, h2, h3, h4, h5, h6 {
  overflow-wrap: break-word;
}

ul:not([class]), ol:not([class]) {
  padding-left: var(--space-l);
}

/* ==========================================================================
   MIXINS & OUTILS SCSS
   ========================================================================== */
/* ==========================================================================
   STYLES DE BASE (HTML Tags bruts)
   Structure et marges uniquement. Le style visuel est géré dans Elementor.
   ========================================================================== */
/* REGLE DE PROJET, VALABLE POUR LE TEMPLATE ET TOUS SES FORKS :
   jamais de graisse synthetique. Beaucoup de polices d'affichage n'existent qu'en une
   seule graisse (Gasoek One n'a que le 400) ; leur demander un 700 ou un 900 fait
   FABRIQUER le gras par le navigateur, qui epaissit le trace au rendu. Sur un grand
   titre ou un prix, c'est illisible.

   `font-synthesis: none` interdit cette fabrication a l'echelle du document : une police
   qui possede reellement la graisse demandee la sert normalement (DM Sans a ses fichiers
   400 a 700), une police qui ne l'a pas rend son trace d'origine au lieu de le baver.
   La regle est donc un FILET, pas une contrainte : elle n'enleve aucun vrai gras.

   Corollaire a respecter en ecrivant du SCSS : ne poser une graisse autre que 400 que
   sur une famille dont le fichier existe. */
html {
  font-synthesis: none;
}

h1, h2, h3, h4, h5, h6 {
  margin-top: 0;
  margin-bottom: var(--space-s);
  line-height: 1;
}

p {
  margin-top: 0;
  margin-bottom: var(--space-xs);
}
p + p {
  margin-top: var(--space-xs);
}

a {
  text-decoration: none;
  transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
}

p a:not(.proto-term):not(.pmb-btn) {
  text-decoration: underline;
  text-underline-offset: 4px;
}
p a:not(.proto-term):not(.pmb-btn):hover {
  text-decoration-color: transparent;
}

ul, ol {
  margin-top: 0;
  margin-bottom: var(--space-xs);
  padding-left: var(--space-l);
}

li {
  margin-bottom: var(--space-xs);
}

blockquote {
  margin: var(--space-m) 0;
  padding: var(--space-m) var(--space-l);
  border-left: 4px solid var(--color-primary);
  background-color: color-mix(in srgb, var(--color-primary), transparent 95%);
  font-style: italic;
}
blockquote p:last-child {
  margin-bottom: 0;
}

hr {
  border: none;
  border-top: 1px solid color-mix(in srgb, var(--color-text), transparent 80%);
  margin: var(--space-xl) 0;
}

/* ==========================================================================
   THEME STYLE -- replique le Theme Style du kit Elementor (4652 __globals__)
   en SCSS, pour que le style visuel de base survive a la sortie d'Elementor.
   Source : dump kit session 36 (body/links/headings/forms). Valeurs = tokens kit.
   ========================================================================== */
body {
  background-color: var(--surface-section, #fff);
  color: var(--color-text, #0D0D0D);
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: var(--e-global-typography-text-font-weight, 300);
  font-size: 1rem;
  line-height: 1.6;
}

a {
  color: var(--color-primary, #AB0018);
}
a:hover {
  color: var(--link-hover, var(--color-accent, #BD294D));
}

h1, h2, h3, h4, h5, h6 {
  color: var(--color-text, #0D0D0D);
  font-family: "Fraunces", Georgia, serif;
  font-weight: var(--e-global-typography-primary-font-weight, 600);
}

/* Champs de formulaire : label en couleur texte, focus en couleur primary. */
label {
  color: var(--color-text, #0D0D0D);
}

input, textarea, select {
  font-family: "Montserrat", system-ui, sans-serif;
  /* Le contour natif est remplace, jamais simplement supprime : seul, `outline: none`
     laisse une bordure de 1px pour tout indice de focus, ce qui ne se voit pas sur un
     champ deja borde. L'anneau reprend la forme employee par les champs des blocs
     natifs, pour que le focus se signale partout pareil. */
}
input:focus-visible, input:focus, textarea:focus-visible, textarea:focus, select:focus-visible, select:focus {
  border-color: var(--color-primary, #AB0018);
  outline: none;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 25%, transparent);
}

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  margin: 0;
}

.site-main,
main {
  flex-grow: 1;
}

.site-header,
.site-footer {
  flex-shrink: 0;
}

.emoji {
  display: inline !important;
  height: 1em !important;
  width: 1em !important;
  vertical-align: -0.1em !important;
  margin: 0 0.07em !important;
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  padding: 0 !important;
}

h1,
h2 {
  hyphens: auto;
  text-wrap: balance;
}

/* ==========================================================================
   UTILITIES — Classes utilitaires cross-projets.
   Noms en anglais, semantiques, independants du projet client.
   ========================================================================== */
.text-xs, .text-xs > .elementor-widget-container, .text-xs .elementor-heading-title, .text-xs .elementor-text-editor, .text-xs.e-con, .text-xs.e-container {
  font-size: var(--fs-xs);
}

.text-s, .text-s > .elementor-widget-container, .text-s .elementor-heading-title, .text-s .elementor-text-editor, .text-s.e-con, .text-s.e-container {
  font-size: var(--fs-s);
}

.text-m, .text-m > .elementor-widget-container, .text-m .elementor-heading-title, .text-m .elementor-text-editor, .text-m.e-con, .text-m.e-container {
  font-size: var(--fs-m);
}

.text-l, .text-l > .elementor-widget-container, .text-l .elementor-heading-title, .text-l .elementor-text-editor, .text-l.e-con, .text-l.e-container {
  font-size: var(--fs-l);
  line-height: 1.3;
}

.text-xl, .text-xl > .elementor-widget-container, .text-xl .elementor-heading-title, .text-xl .elementor-text-editor, .text-xl.e-con, .text-xl.e-container {
  font-size: var(--fs-xl);
  line-height: 1.2;
  font-weight: 700;
}

.text-xxl, .text-xxl > .elementor-widget-container, .text-xxl .elementor-heading-title, .text-xxl .elementor-text-editor, .text-xxl.e-con, .text-xxl.e-container {
  font-size: var(--fs-xxl);
  line-height: 1.1;
  font-weight: 800;
}

.text-xxxl, .text-xxxl > .elementor-widget-container, .text-xxxl .elementor-heading-title, .text-xxxl .elementor-text-editor, .text-xxxl.e-con, .text-xxxl.e-container {
  font-size: var(--fs-xxxl);
  line-height: 1.1;
  font-weight: 900;
}

/* ==========================================================================
   2. Familles de polices (slots Elementor standard)
   ========================================================================== */
.font-primary, .font-primary > .elementor-widget-container, .font-primary .elementor-heading-title, .font-primary .elementor-text-editor, .font-primary.e-con, .font-primary.e-container {
  font-family: "Fraunces", Georgia, serif;
}

.font-secondary, .font-secondary > .elementor-widget-container, .font-secondary .elementor-heading-title, .font-secondary .elementor-text-editor, .font-secondary.e-con, .font-secondary.e-container {
  font-family: "Fraunces", Georgia, serif;
}

.font-text, .font-text > .elementor-widget-container, .font-text .elementor-heading-title, .font-text .elementor-text-editor, .font-text.e-con, .font-text.e-container {
  font-family: "Montserrat", system-ui, sans-serif;
}

.font-accent, .font-accent > .elementor-widget-container, .font-accent .elementor-heading-title, .font-accent .elementor-text-editor, .font-accent.e-con, .font-accent.e-container {
  font-family: "Montserrat", system-ui, sans-serif;
}

.font-display, .font-display > .elementor-widget-container, .font-display .elementor-heading-title, .font-display .elementor-text-editor, .font-display.e-con, .font-display.e-container {
  font-family: "Fraunces", Georgia, serif;
}

.font-overline, .font-overline > .elementor-widget-container, .font-overline .elementor-heading-title, .font-overline .elementor-text-editor, .font-overline.e-con, .font-overline.e-container {
  font-family: "Montserrat", system-ui, sans-serif;
}

.font-caption, .font-caption > .elementor-widget-container, .font-caption .elementor-heading-title, .font-caption .elementor-text-editor, .font-caption.e-con, .font-caption.e-container {
  font-family: "Montserrat", system-ui, sans-serif;
}

/* ==========================================================================
   3. Styles typographiques complets (shortcuts Elementor Global Typography)
   Mapping slots kit : primary=Heading | secondary=Subheading | text=Body | accent=UI/Labels
   ========================================================================== */
.typo-heading, .typo-heading > .elementor-widget-container, .typo-heading .elementor-heading-title, .typo-heading .elementor-text-editor, .typo-heading.e-con, .typo-heading.e-container {
  font-family: var(--e-global-typography-primary-font-family);
  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);
}

.typo-subheading, .typo-subheading > .elementor-widget-container, .typo-subheading .elementor-heading-title, .typo-subheading .elementor-text-editor, .typo-subheading.e-con, .typo-subheading.e-container {
  font-family: var(--e-global-typography-secondary-font-family);
  font-size: var(--e-global-typography-secondary-font-size);
  font-weight: var(--e-global-typography-secondary-font-weight);
  text-transform: var(--e-global-typography-secondary-text-transform);
  line-height: var(--e-global-typography-secondary-line-height);
}

.typo-body, .typo-body > .elementor-widget-container, .typo-body .elementor-heading-title, .typo-body .elementor-text-editor, .typo-body.e-con, .typo-body.e-container {
  font-family: var(--e-global-typography-text-font-family);
  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);
}

.typo-ui, .typo-ui > .elementor-widget-container, .typo-ui .elementor-heading-title, .typo-ui .elementor-text-editor, .typo-ui.e-con, .typo-ui.e-container {
  font-family: var(--e-global-typography-accent-font-family);
  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);
}

.typo-display, .typo-display > .elementor-widget-container, .typo-display .elementor-heading-title, .typo-display .elementor-text-editor, .typo-display.e-con, .typo-display.e-container {
  font-family: var(--e-global-typography-display-font-family);
  font-weight: var(--e-global-typography-display-font-weight);
  line-height: var(--e-global-typography-display-line-height);
  font-style: var(--e-global-typography-display-font-style);
}

.typo-overline, .typo-overline > .elementor-widget-container, .typo-overline .elementor-heading-title, .typo-overline .elementor-text-editor, .typo-overline.e-con, .typo-overline.e-container {
  font-family: var(--e-global-typography-overline-font-family);
  font-size: var(--e-global-typography-overline-font-size);
  font-weight: var(--e-global-typography-overline-font-weight);
  text-transform: var(--e-global-typography-overline-text-transform);
  letter-spacing: var(--e-global-typography-overline-letter-spacing);
}

.typo-caption, .typo-caption > .elementor-widget-container, .typo-caption .elementor-heading-title, .typo-caption .elementor-text-editor, .typo-caption.e-con, .typo-caption.e-container {
  font-family: var(--e-global-typography-caption-font-family);
  font-size: var(--e-global-typography-caption-font-size);
  font-weight: var(--e-global-typography-caption-font-weight);
  font-style: var(--e-global-typography-caption-font-style);
  line-height: var(--e-global-typography-caption-line-height);
}

/* ==========================================================================
   4. Couleurs — genere depuis $theme-colors defini dans vars/_client.scss
   ========================================================================== */
.color-primary, .color-primary > .elementor-widget-container, .color-primary .elementor-heading-title, .color-primary .elementor-text-editor, .color-primary.e-con, .color-primary.e-container {
  color: var(--color-primary) !important;
}

.bg-primary {
  background-color: var(--color-primary) !important;
}

.fill-primary {
  fill: var(--color-primary) !important;
}

.stroke-primary {
  stroke: var(--color-primary) !important;
}

.color-secondary, .color-secondary > .elementor-widget-container, .color-secondary .elementor-heading-title, .color-secondary .elementor-text-editor, .color-secondary.e-con, .color-secondary.e-container {
  color: var(--color-secondary) !important;
}

.bg-secondary {
  background-color: var(--color-secondary) !important;
}

.fill-secondary {
  fill: var(--color-secondary) !important;
}

.stroke-secondary {
  stroke: var(--color-secondary) !important;
}

.color-accent, .color-accent > .elementor-widget-container, .color-accent .elementor-heading-title, .color-accent .elementor-text-editor, .color-accent.e-con, .color-accent.e-container {
  color: var(--color-accent) !important;
}

.bg-accent {
  background-color: var(--color-accent) !important;
}

.fill-accent {
  fill: var(--color-accent) !important;
}

.stroke-accent {
  stroke: var(--color-accent) !important;
}

.color-text, .color-text > .elementor-widget-container, .color-text .elementor-heading-title, .color-text .elementor-text-editor, .color-text.e-con, .color-text.e-container {
  color: var(--color-text) !important;
}

.bg-text {
  background-color: var(--color-text) !important;
}

.fill-text {
  fill: var(--color-text) !important;
}

.stroke-text {
  stroke: var(--color-text) !important;
}

.color-white, .color-white > .elementor-widget-container, .color-white .elementor-heading-title, .color-white .elementor-text-editor, .color-white.e-con, .color-white.e-container {
  color: var(--color-white) !important;
}

.bg-white {
  background-color: var(--color-white) !important;
}

.fill-white {
  fill: var(--color-white) !important;
}

.stroke-white {
  stroke: var(--color-white) !important;
}

.color-black, .color-black > .elementor-widget-container, .color-black .elementor-heading-title, .color-black .elementor-text-editor, .color-black.e-con, .color-black.e-container {
  color: var(--color-black) !important;
}

.bg-black {
  background-color: var(--color-black) !important;
}

.fill-black {
  fill: var(--color-black) !important;
}

.stroke-black {
  stroke: var(--color-black) !important;
}

.color-surface, .color-surface > .elementor-widget-container, .color-surface .elementor-heading-title, .color-surface .elementor-text-editor, .color-surface.e-con, .color-surface.e-container {
  color: var(--color-surface) !important;
}

.bg-surface {
  background-color: var(--color-surface) !important;
}

.fill-surface {
  fill: var(--color-surface) !important;
}

.stroke-surface {
  stroke: var(--color-surface) !important;
}

.color-surface-alt, .color-surface-alt > .elementor-widget-container, .color-surface-alt .elementor-heading-title, .color-surface-alt .elementor-text-editor, .color-surface-alt.e-con, .color-surface-alt.e-container {
  color: var(--color-surface-alt) !important;
}

.bg-surface-alt {
  background-color: var(--color-surface-alt) !important;
}

.fill-surface-alt {
  fill: var(--color-surface-alt) !important;
}

.stroke-surface-alt {
  stroke: var(--color-surface-alt) !important;
}

.color-bg-dark, .color-bg-dark > .elementor-widget-container, .color-bg-dark .elementor-heading-title, .color-bg-dark .elementor-text-editor, .color-bg-dark.e-con, .color-bg-dark.e-container {
  color: var(--color-bg-dark) !important;
}

.bg-bg-dark {
  background-color: var(--color-bg-dark) !important;
}

.fill-bg-dark {
  fill: var(--color-bg-dark) !important;
}

.stroke-bg-dark {
  stroke: var(--color-bg-dark) !important;
}

.color-bg-darker, .color-bg-darker > .elementor-widget-container, .color-bg-darker .elementor-heading-title, .color-bg-darker .elementor-text-editor, .color-bg-darker.e-con, .color-bg-darker.e-container {
  color: var(--color-bg-darker) !important;
}

.bg-bg-darker {
  background-color: var(--color-bg-darker) !important;
}

.fill-bg-darker {
  fill: var(--color-bg-darker) !important;
}

.stroke-bg-darker {
  stroke: var(--color-bg-darker) !important;
}

.color-primary-alpha, .color-primary-alpha > .elementor-widget-container, .color-primary-alpha .elementor-heading-title, .color-primary-alpha .elementor-text-editor, .color-primary-alpha.e-con, .color-primary-alpha.e-container {
  color: var(--color-primary-alpha) !important;
}

.bg-primary-alpha {
  background-color: var(--color-primary-alpha) !important;
}

.fill-primary-alpha {
  fill: var(--color-primary-alpha) !important;
}

.stroke-primary-alpha {
  stroke: var(--color-primary-alpha) !important;
}

.color-muted, .color-muted > .elementor-widget-container, .color-muted .elementor-heading-title, .color-muted .elementor-text-editor, .color-muted.e-con, .color-muted.e-container {
  color: var(--color-muted) !important;
}

.bg-muted {
  background-color: var(--color-muted) !important;
}

.fill-muted {
  fill: var(--color-muted) !important;
}

.stroke-muted {
  stroke: var(--color-muted) !important;
}

.color-on-primary, .color-on-primary > .elementor-widget-container, .color-on-primary .elementor-heading-title, .color-on-primary .elementor-text-editor, .color-on-primary.e-con, .color-on-primary.e-container {
  color: var(--color-on-primary) !important;
}

.bg-on-primary {
  background-color: var(--color-on-primary) !important;
}

.fill-on-primary {
  fill: var(--color-on-primary) !important;
}

.stroke-on-primary {
  stroke: var(--color-on-primary) !important;
}

.color-highlight, .color-highlight > .elementor-widget-container, .color-highlight .elementor-heading-title, .color-highlight .elementor-text-editor, .color-highlight.e-con, .color-highlight.e-container {
  color: var(--color-highlight) !important;
}

.bg-highlight {
  background-color: var(--color-highlight) !important;
}

.fill-highlight {
  fill: var(--color-highlight) !important;
}

.stroke-highlight {
  stroke: var(--color-highlight) !important;
}

.color-accent-soft, .color-accent-soft > .elementor-widget-container, .color-accent-soft .elementor-heading-title, .color-accent-soft .elementor-text-editor, .color-accent-soft.e-con, .color-accent-soft.e-container {
  color: var(--color-accent-soft) !important;
}

.bg-accent-soft {
  background-color: var(--color-accent-soft) !important;
}

.fill-accent-soft {
  fill: var(--color-accent-soft) !important;
}

.stroke-accent-soft {
  stroke: var(--color-accent-soft) !important;
}

.color-accent-warm, .color-accent-warm > .elementor-widget-container, .color-accent-warm .elementor-heading-title, .color-accent-warm .elementor-text-editor, .color-accent-warm.e-con, .color-accent-warm.e-container {
  color: var(--color-accent-warm) !important;
}

.bg-accent-warm {
  background-color: var(--color-accent-warm) !important;
}

.fill-accent-warm {
  fill: var(--color-accent-warm) !important;
}

.stroke-accent-warm {
  stroke: var(--color-accent-warm) !important;
}

.color-primary-ink, .color-primary-ink > .elementor-widget-container, .color-primary-ink .elementor-heading-title, .color-primary-ink .elementor-text-editor, .color-primary-ink.e-con, .color-primary-ink.e-container {
  color: var(--color-primary-ink) !important;
}

.bg-primary-ink {
  background-color: var(--color-primary-ink) !important;
}

.fill-primary-ink {
  fill: var(--color-primary-ink) !important;
}

.stroke-primary-ink {
  stroke: var(--color-primary-ink) !important;
}

.color-highlight-ink, .color-highlight-ink > .elementor-widget-container, .color-highlight-ink .elementor-heading-title, .color-highlight-ink .elementor-text-editor, .color-highlight-ink.e-con, .color-highlight-ink.e-container {
  color: var(--color-highlight-ink) !important;
}

.bg-highlight-ink {
  background-color: var(--color-highlight-ink) !important;
}

.fill-highlight-ink {
  fill: var(--color-highlight-ink) !important;
}

.stroke-highlight-ink {
  stroke: var(--color-highlight-ink) !important;
}

.color-tertiary, .color-tertiary > .elementor-widget-container, .color-tertiary .elementor-heading-title, .color-tertiary .elementor-text-editor, .color-tertiary.e-con, .color-tertiary.e-container {
  color: var(--color-tertiary) !important;
}

.bg-tertiary {
  background-color: var(--color-tertiary) !important;
}

.fill-tertiary {
  fill: var(--color-tertiary) !important;
}

.stroke-tertiary {
  stroke: var(--color-tertiary) !important;
}

.color-tertiary-ink, .color-tertiary-ink > .elementor-widget-container, .color-tertiary-ink .elementor-heading-title, .color-tertiary-ink .elementor-text-editor, .color-tertiary-ink.e-con, .color-tertiary-ink.e-container {
  color: var(--color-tertiary-ink) !important;
}

.bg-tertiary-ink {
  background-color: var(--color-tertiary-ink) !important;
}

.fill-tertiary-ink {
  fill: var(--color-tertiary-ink) !important;
}

.stroke-tertiary-ink {
  stroke: var(--color-tertiary-ink) !important;
}

/* ==========================================================================
   5. Espacements — genere depuis $spacing-sizes
   ========================================================================== */
.gap-xs {
  gap: var(--space-xs) !important;
}

.p-xs {
  padding: var(--space-xs) !important;
}

.pt-xs {
  padding-top: var(--space-xs) !important;
}

.pb-xs {
  padding-bottom: var(--space-xs) !important;
}

.pl-xs {
  padding-left: var(--space-xs) !important;
}

.pr-xs {
  padding-right: var(--space-xs) !important;
}

.py-xs {
  padding-top: var(--space-xs) !important;
  padding-bottom: var(--space-xs) !important;
}

.px-xs {
  padding-left: var(--space-xs) !important;
  padding-right: var(--space-xs) !important;
}

.m-xs {
  margin: var(--space-xs) !important;
}

.mt-xs {
  margin-top: var(--space-xs) !important;
}

.mb-xs {
  margin-bottom: var(--space-xs) !important;
}

.ml-xs {
  margin-left: var(--space-xs) !important;
}

.mr-xs {
  margin-right: var(--space-xs) !important;
}

.my-xs {
  margin-top: var(--space-xs) !important;
  margin-bottom: var(--space-xs) !important;
}

.mx-xs {
  margin-left: var(--space-xs) !important;
  margin-right: var(--space-xs) !important;
}

.gap-s {
  gap: var(--space-s) !important;
}

.p-s {
  padding: var(--space-s) !important;
}

.pt-s {
  padding-top: var(--space-s) !important;
}

.pb-s {
  padding-bottom: var(--space-s) !important;
}

.pl-s {
  padding-left: var(--space-s) !important;
}

.pr-s {
  padding-right: var(--space-s) !important;
}

.py-s {
  padding-top: var(--space-s) !important;
  padding-bottom: var(--space-s) !important;
}

.px-s {
  padding-left: var(--space-s) !important;
  padding-right: var(--space-s) !important;
}

.m-s {
  margin: var(--space-s) !important;
}

.mt-s {
  margin-top: var(--space-s) !important;
}

.mb-s {
  margin-bottom: var(--space-s) !important;
}

.ml-s {
  margin-left: var(--space-s) !important;
}

.mr-s {
  margin-right: var(--space-s) !important;
}

.my-s {
  margin-top: var(--space-s) !important;
  margin-bottom: var(--space-s) !important;
}

.mx-s {
  margin-left: var(--space-s) !important;
  margin-right: var(--space-s) !important;
}

.gap-m {
  gap: var(--space-m) !important;
}

.p-m {
  padding: var(--space-m) !important;
}

.pt-m {
  padding-top: var(--space-m) !important;
}

.pb-m {
  padding-bottom: var(--space-m) !important;
}

.pl-m {
  padding-left: var(--space-m) !important;
}

.pr-m {
  padding-right: var(--space-m) !important;
}

.py-m {
  padding-top: var(--space-m) !important;
  padding-bottom: var(--space-m) !important;
}

.px-m {
  padding-left: var(--space-m) !important;
  padding-right: var(--space-m) !important;
}

.m-m {
  margin: var(--space-m) !important;
}

.mt-m {
  margin-top: var(--space-m) !important;
}

.mb-m {
  margin-bottom: var(--space-m) !important;
}

.ml-m {
  margin-left: var(--space-m) !important;
}

.mr-m {
  margin-right: var(--space-m) !important;
}

.my-m {
  margin-top: var(--space-m) !important;
  margin-bottom: var(--space-m) !important;
}

.mx-m {
  margin-left: var(--space-m) !important;
  margin-right: var(--space-m) !important;
}

.gap-l {
  gap: var(--space-l) !important;
}

.p-l {
  padding: var(--space-l) !important;
}

.pt-l {
  padding-top: var(--space-l) !important;
}

.pb-l {
  padding-bottom: var(--space-l) !important;
}

.pl-l {
  padding-left: var(--space-l) !important;
}

.pr-l {
  padding-right: var(--space-l) !important;
}

.py-l {
  padding-top: var(--space-l) !important;
  padding-bottom: var(--space-l) !important;
}

.px-l {
  padding-left: var(--space-l) !important;
  padding-right: var(--space-l) !important;
}

.m-l {
  margin: var(--space-l) !important;
}

.mt-l {
  margin-top: var(--space-l) !important;
}

.mb-l {
  margin-bottom: var(--space-l) !important;
}

.ml-l {
  margin-left: var(--space-l) !important;
}

.mr-l {
  margin-right: var(--space-l) !important;
}

.my-l {
  margin-top: var(--space-l) !important;
  margin-bottom: var(--space-l) !important;
}

.mx-l {
  margin-left: var(--space-l) !important;
  margin-right: var(--space-l) !important;
}

.gap-xl {
  gap: var(--space-xl) !important;
}

.p-xl {
  padding: var(--space-xl) !important;
}

.pt-xl {
  padding-top: var(--space-xl) !important;
}

.pb-xl {
  padding-bottom: var(--space-xl) !important;
}

.pl-xl {
  padding-left: var(--space-xl) !important;
}

.pr-xl {
  padding-right: var(--space-xl) !important;
}

.py-xl {
  padding-top: var(--space-xl) !important;
  padding-bottom: var(--space-xl) !important;
}

.px-xl {
  padding-left: var(--space-xl) !important;
  padding-right: var(--space-xl) !important;
}

.m-xl {
  margin: var(--space-xl) !important;
}

.mt-xl {
  margin-top: var(--space-xl) !important;
}

.mb-xl {
  margin-bottom: var(--space-xl) !important;
}

.ml-xl {
  margin-left: var(--space-xl) !important;
}

.mr-xl {
  margin-right: var(--space-xl) !important;
}

.my-xl {
  margin-top: var(--space-xl) !important;
  margin-bottom: var(--space-xl) !important;
}

.mx-xl {
  margin-left: var(--space-xl) !important;
  margin-right: var(--space-xl) !important;
}

.gap-xxl {
  gap: var(--space-xxl) !important;
}

.p-xxl {
  padding: var(--space-xxl) !important;
}

.pt-xxl {
  padding-top: var(--space-xxl) !important;
}

.pb-xxl {
  padding-bottom: var(--space-xxl) !important;
}

.pl-xxl {
  padding-left: var(--space-xxl) !important;
}

.pr-xxl {
  padding-right: var(--space-xxl) !important;
}

.py-xxl {
  padding-top: var(--space-xxl) !important;
  padding-bottom: var(--space-xxl) !important;
}

.px-xxl {
  padding-left: var(--space-xxl) !important;
  padding-right: var(--space-xxl) !important;
}

.m-xxl {
  margin: var(--space-xxl) !important;
}

.mt-xxl {
  margin-top: var(--space-xxl) !important;
}

.mb-xxl {
  margin-bottom: var(--space-xxl) !important;
}

.ml-xxl {
  margin-left: var(--space-xxl) !important;
}

.mr-xxl {
  margin-right: var(--space-xxl) !important;
}

.my-xxl {
  margin-top: var(--space-xxl) !important;
  margin-bottom: var(--space-xxl) !important;
}

.mx-xxl {
  margin-left: var(--space-xxl) !important;
  margin-right: var(--space-xxl) !important;
}

.gap-xxxl {
  gap: var(--space-xxxl) !important;
}

.p-xxxl {
  padding: var(--space-xxxl) !important;
}

.pt-xxxl {
  padding-top: var(--space-xxxl) !important;
}

.pb-xxxl {
  padding-bottom: var(--space-xxxl) !important;
}

.pl-xxxl {
  padding-left: var(--space-xxxl) !important;
}

.pr-xxxl {
  padding-right: var(--space-xxxl) !important;
}

.py-xxxl {
  padding-top: var(--space-xxxl) !important;
  padding-bottom: var(--space-xxxl) !important;
}

.px-xxxl {
  padding-left: var(--space-xxxl) !important;
  padding-right: var(--space-xxxl) !important;
}

.m-xxxl {
  margin: var(--space-xxxl) !important;
}

.mt-xxxl {
  margin-top: var(--space-xxxl) !important;
}

.mb-xxxl {
  margin-bottom: var(--space-xxxl) !important;
}

.ml-xxxl {
  margin-left: var(--space-xxxl) !important;
}

.mr-xxxl {
  margin-right: var(--space-xxxl) !important;
}

.my-xxxl {
  margin-top: var(--space-xxxl) !important;
  margin-bottom: var(--space-xxxl) !important;
}

.mx-xxxl {
  margin-left: var(--space-xxxl) !important;
  margin-right: var(--space-xxxl) !important;
}

/* ==========================================================================
   6. Utilitaires UI
   ========================================================================== */
.mx-auto {
  margin-left: auto !important;
  margin-right: auto !important;
}

.line-clamp-1, .line-clamp-1 > .elementor-widget-container, .line-clamp-1 .elementor-heading-title, .line-clamp-1 .elementor-text-editor, .line-clamp-1.e-con, .line-clamp-1.e-container {
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  word-break: break-word;
}

.line-clamp-2, .line-clamp-2 > .elementor-widget-container, .line-clamp-2 .elementor-heading-title, .line-clamp-2 .elementor-text-editor, .line-clamp-2.e-con, .line-clamp-2.e-container {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  word-break: break-word;
}

.line-clamp-3, .line-clamp-3 > .elementor-widget-container, .line-clamp-3 .elementor-heading-title, .line-clamp-3 .elementor-text-editor, .line-clamp-3.e-con, .line-clamp-3.e-container {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  word-break: break-word;
}

.img-cover, .ratio-16-9, .ratio-4-3, .ratio-1-1 {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.ratio-1-1 {
  aspect-ratio: 1/1;
}

.ratio-4-3 {
  aspect-ratio: 4/3;
}

.ratio-16-9 {
  aspect-ratio: 16/9;
}

.absolute-cover {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

.absolute-center {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}

/* ==========================================================================
   7. Display
   ========================================================================== */
.d-none {
  display: none !important;
}

.d-block {
  display: block !important;
}

.d-flex {
  display: flex !important;
}

.d-grid {
  display: grid !important;
}

.d-inline {
  display: inline !important;
}

.d-inline-block {
  display: inline-block !important;
}

.d-inline-flex {
  display: inline-flex !important;
}

/* ==========================================================================
   8. Alignement texte
   ========================================================================== */
.text-left, .text-left > .elementor-widget-container, .text-left .elementor-heading-title, .text-left .elementor-text-editor, .text-left.e-con, .text-left.e-container {
  text-align: left !important;
}

.text-center, .text-center > .elementor-widget-container, .text-center .elementor-heading-title, .text-center .elementor-text-editor, .text-center.e-con, .text-center.e-container {
  text-align: center !important;
}

.text-right, .text-right > .elementor-widget-container, .text-right .elementor-heading-title, .text-right .elementor-text-editor, .text-right.e-con, .text-right.e-container {
  text-align: right !important;
}

/* ==========================================================================
   9. Font weight
   ========================================================================== */
.fw-normal, .fw-normal > .elementor-widget-container, .fw-normal .elementor-heading-title, .fw-normal .elementor-text-editor, .fw-normal.e-con, .fw-normal.e-container {
  font-weight: 400 !important;
}

.fw-medium, .fw-medium > .elementor-widget-container, .fw-medium .elementor-heading-title, .fw-medium .elementor-text-editor, .fw-medium.e-con, .fw-medium.e-container {
  font-weight: 500 !important;
}

.fw-bold, .fw-bold > .elementor-widget-container, .fw-bold .elementor-heading-title, .fw-bold .elementor-text-editor, .fw-bold.e-con, .fw-bold.e-container {
  font-weight: 700 !important;
}

.fw-black, .fw-black > .elementor-widget-container, .fw-black .elementor-heading-title, .fw-black .elementor-text-editor, .fw-black.e-con, .fw-black.e-container {
  font-weight: 900 !important;
}

/* ==========================================================================
   10. Border radius
   ========================================================================== */
.rounded-s {
  border-radius: 1px !important;
}

.rounded-m {
  border-radius: 2px !important;
}

.rounded-l {
  border-radius: 4px !important;
}

.rounded-full {
  border-radius: 9999px !important;
}

/* ==========================================================================
   11. Dimensions et divers
   ========================================================================== */
.w-full {
  width: 100% !important;
}

.h-full {
  height: 100% !important;
}

.transition-base {
  transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1) !important;
}

.cursor-pointer {
  cursor: pointer !important;
}

.ovy {
  overflow-y: hidden;
}

.ovx {
  overflow-x: hidden;
}

/* ==========================================================================
   12. Layout Flexbox
   ========================================================================== */
.l-flex-center {
  display: flex !important;
  flex-direction: row !important;
  justify-content: center !important;
  align-items: center !important;
  flex-wrap: wrap !important;
}

.l-flex-between {
  display: flex !important;
  flex-direction: row !important;
  justify-content: space-between !important;
  align-items: center !important;
  flex-wrap: wrap !important;
}

.l-flex-col {
  display: flex !important;
  flex-direction: column !important;
  justify-content: flex-start !important;
  align-items: stretch !important;
  flex-wrap: nowrap !important;
}

.l-items-center {
  align-items: center !important;
}

.l-justify-center {
  justify-content: center !important;
}

.l-justify-between {
  justify-content: space-between !important;
}

/* ==========================================================================
   13. Layout Grid
   ========================================================================== */
.l-grid {
  display: grid !important;
}

.l-grid-auto-s {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)) !important;
  gap: var(--space-s) !important;
}

.l-grid-auto-m {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)) !important;
  gap: var(--space-m) !important;
}

.l-grid-auto-l {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 450px), 1fr)) !important;
  gap: var(--space-l) !important;
}

.l-grid-1, .l-grid-1 > .elementor-widget-container, .l-grid-1 .elementor-heading-title, .l-grid-1 .elementor-text-editor, .l-grid-1.e-con, .l-grid-1.e-container {
  display: grid !important;
  grid-template-columns: repeat(1, 1fr) !important;
}

.l-grid-2, .l-grid-2 > .elementor-widget-container, .l-grid-2 .elementor-heading-title, .l-grid-2 .elementor-text-editor, .l-grid-2.e-con, .l-grid-2.e-container {
  display: grid !important;
  grid-template-columns: repeat(2, 1fr) !important;
}

.l-grid-3, .l-grid-3 > .elementor-widget-container, .l-grid-3 .elementor-heading-title, .l-grid-3 .elementor-text-editor, .l-grid-3.e-con, .l-grid-3.e-container {
  display: grid !important;
  grid-template-columns: repeat(3, 1fr) !important;
}

.l-grid-4, .l-grid-4 > .elementor-widget-container, .l-grid-4 .elementor-heading-title, .l-grid-4 .elementor-text-editor, .l-grid-4.e-con, .l-grid-4.e-container {
  display: grid !important;
  grid-template-columns: repeat(4, 1fr) !important;
}

/* ==========================================================================
   14. Responsive (genere automatiquement pour -t et -m)
   ========================================================================== */
@media (min-width: 768px) {
  .d-none-m {
    display: none !important;
  }
  .d-block-m {
    display: block !important;
  }
  .d-flex-m {
    display: flex !important;
  }
  .d-grid-m {
    display: grid !important;
  }
  .l-flex-col-m {
    flex-direction: column !important;
  }
  .l-flex-row-m {
    flex-direction: row !important;
  }
  .l-grid-1-m, .l-grid-1-m > .elementor-widget-container, .l-grid-1-m .elementor-heading-title, .l-grid-1-m .elementor-text-editor, .l-grid-1-m.e-con, .l-grid-1-m.e-container {
    grid-template-columns: repeat(1, 1fr) !important;
  }
  .l-grid-2-m, .l-grid-2-m > .elementor-widget-container, .l-grid-2-m .elementor-heading-title, .l-grid-2-m .elementor-text-editor, .l-grid-2-m.e-con, .l-grid-2-m.e-container {
    grid-template-columns: repeat(2, 1fr) !important;
  }
  .l-grid-3-m, .l-grid-3-m > .elementor-widget-container, .l-grid-3-m .elementor-heading-title, .l-grid-3-m .elementor-text-editor, .l-grid-3-m.e-con, .l-grid-3-m.e-container {
    grid-template-columns: repeat(3, 1fr) !important;
  }
  .l-grid-4-m, .l-grid-4-m > .elementor-widget-container, .l-grid-4-m .elementor-heading-title, .l-grid-4-m .elementor-text-editor, .l-grid-4-m.e-con, .l-grid-4-m.e-container {
    grid-template-columns: repeat(4, 1fr) !important;
  }
}
@media (min-width: 1025px) {
  .d-none-t {
    display: none !important;
  }
  .d-block-t {
    display: block !important;
  }
  .d-flex-t {
    display: flex !important;
  }
  .d-grid-t {
    display: grid !important;
  }
  .l-flex-col-t {
    flex-direction: column !important;
  }
  .l-flex-row-t {
    flex-direction: row !important;
  }
  .l-grid-1-t, .l-grid-1-t > .elementor-widget-container, .l-grid-1-t .elementor-heading-title, .l-grid-1-t .elementor-text-editor, .l-grid-1-t.e-con, .l-grid-1-t.e-container {
    grid-template-columns: repeat(1, 1fr) !important;
  }
  .l-grid-2-t, .l-grid-2-t > .elementor-widget-container, .l-grid-2-t .elementor-heading-title, .l-grid-2-t .elementor-text-editor, .l-grid-2-t.e-con, .l-grid-2-t.e-container {
    grid-template-columns: repeat(2, 1fr) !important;
  }
  .l-grid-3-t, .l-grid-3-t > .elementor-widget-container, .l-grid-3-t .elementor-heading-title, .l-grid-3-t .elementor-text-editor, .l-grid-3-t.e-con, .l-grid-3-t.e-container {
    grid-template-columns: repeat(3, 1fr) !important;
  }
  .l-grid-4-t, .l-grid-4-t > .elementor-widget-container, .l-grid-4-t .elementor-heading-title, .l-grid-4-t .elementor-text-editor, .l-grid-4-t.e-con, .l-grid-4-t.e-container {
    grid-template-columns: repeat(4, 1fr) !important;
  }
}
@media (min-width: 1441px) {
  .d-none-w {
    display: none !important;
  }
  .d-block-w {
    display: block !important;
  }
  .d-flex-w {
    display: flex !important;
  }
  .d-grid-w {
    display: grid !important;
  }
  .l-flex-col-w {
    flex-direction: column !important;
  }
  .l-flex-row-w {
    flex-direction: row !important;
  }
  .l-grid-1-w, .l-grid-1-w > .elementor-widget-container, .l-grid-1-w .elementor-heading-title, .l-grid-1-w .elementor-text-editor, .l-grid-1-w.e-con, .l-grid-1-w.e-container {
    grid-template-columns: repeat(1, 1fr) !important;
  }
  .l-grid-2-w, .l-grid-2-w > .elementor-widget-container, .l-grid-2-w .elementor-heading-title, .l-grid-2-w .elementor-text-editor, .l-grid-2-w.e-con, .l-grid-2-w.e-container {
    grid-template-columns: repeat(2, 1fr) !important;
  }
  .l-grid-3-w, .l-grid-3-w > .elementor-widget-container, .l-grid-3-w .elementor-heading-title, .l-grid-3-w .elementor-text-editor, .l-grid-3-w.e-con, .l-grid-3-w.e-container {
    grid-template-columns: repeat(3, 1fr) !important;
  }
  .l-grid-4-w, .l-grid-4-w > .elementor-widget-container, .l-grid-4-w .elementor-heading-title, .l-grid-4-w .elementor-text-editor, .l-grid-4-w.e-con, .l-grid-4-w.e-container {
    grid-template-columns: repeat(4, 1fr) !important;
  }
}
/* ==========================================================================
   15. Espacements internes (sections Elementor)
   ========================================================================== */
.inner_spacer_top, .mms-galerie, .inner_spacer_y, .mms-acc-atelier, .mms-at-social, .mms-at-liste, .mms-at-tete, .mms-co-artistes, .mms-co-fin, .mms-co-fiche, .mms-co-tete, .mms-lex-suite, .mms-lex-fin, .mms-lex-vide, .mms-lex-corps, .mms-lex-tete, .mms-hebdo, .mms-fx-pratique, .mms-fx-collab, .mms-fx-tete, .mms-inscription, .mms-avis, .mms-fondatrice, .mms-collab, .mms-formules, .mms-piliers, .mms-manifeste, .mms-hero, .inner_spacer_xy {
  padding-top: var(--space-xxxl);
}

.inner_spacer_bottom, .inner_spacer_y, .mms-acc-atelier, .mms-at-social, .mms-at-liste, .mms-at-tete, .mms-co-artistes, .mms-co-fin, .mms-co-fiche, .mms-co-tete, .mms-lex-suite, .mms-lex-fin, .mms-lex-vide, .mms-lex-corps, .mms-lex-tete, .mms-hebdo, .mms-fx-pratique, .mms-fx-collab, .mms-fx-tete, .mms-inscription, .mms-avis, .mms-fondatrice, .mms-collab, .mms-formules, .mms-piliers, .mms-manifeste, .mms-hero, .inner_spacer_xy {
  padding-bottom: var(--space-xxxl);
}

.inner_spacer_left, .inner_spacer_x, .inner_spacer_xy {
  padding-left: var(--space-l);
}

.inner_spacer_right, .inner_spacer_x, .inner_spacer_xy {
  padding-right: var(--space-l);
}

.margin-bottom-gutter {
  margin-bottom: var(--space-m);
}

.margin-bottom-gutter2 {
  margin-bottom: calc(var(--space-m) * 2);
}

.elementor-menu-cart__toggle_button.elementor-button.elementor-size-sm {
  padding: 0;
}

/* ==========================================================================
   16. Variantes bouton -- remplacent les defaults du kit
   Appliquer via Advanced > CSS Classes sur le widget Button Elementor.
   .btn-primary : CTA principal (fond primary, texte blanc)
   .btn-ghost   : contour seul (fond transparent, bordure primary)
   .btn-text    : lien discret (pas de fond ni bordure, underline)
   ========================================================================== */
.btn-primary .elementor-button {
  display: inline-flex !important;
  align-items: center;
  gap: 0.5em;
  width: auto;
  border-radius: 999px;
  padding: 1em 1.9em;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 600;
  font-size: var(--fs-s);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  border: 2px solid transparent;
  text-decoration: none;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
}
.btn-primary .elementor-button:hover {
  transform: translateY(-2px);
}
.btn-primary .elementor-button {
  background-color: var(--color-primary);
  color: var(--color-white);
  border-color: var(--color-primary);
}
.btn-primary .elementor-button:hover {
  background-color: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-white);
}

.btn-ghost .elementor-button {
  display: inline-flex !important;
  align-items: center;
  gap: 0.5em;
  width: auto;
  border-radius: 999px;
  padding: 1em 1.9em;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 600;
  font-size: var(--fs-s);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  border: 2px solid transparent;
  text-decoration: none;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
}
.btn-ghost .elementor-button:hover {
  transform: translateY(-2px);
}
.btn-ghost .elementor-button {
  background-color: transparent;
  color: var(--color-primary);
  border-color: var(--color-primary);
}
.btn-ghost .elementor-button:hover {
  background-color: var(--color-primary);
  color: var(--color-white);
}

.btn-white .elementor-button {
  display: inline-flex !important;
  align-items: center;
  gap: 0.5em;
  width: auto;
  border-radius: 999px;
  padding: 1em 1.9em;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 600;
  font-size: var(--fs-s);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  border: 2px solid transparent;
  text-decoration: none;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
}
.btn-white .elementor-button:hover {
  transform: translateY(-2px);
}
.btn-white .elementor-button {
  background-color: var(--color-white);
  color: var(--color-primary);
  border-color: var(--color-white);
}
.btn-white .elementor-button:hover {
  background-color: transparent;
  color: var(--color-white);
}

.btn-text .elementor-button {
  display: inline-flex !important;
  align-items: center;
  gap: 0.4em;
  background: transparent !important;
  border: none !important;
  padding: 0 !important;
  color: var(--color-primary);
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 600;
  font-size: var(--fs-s);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  text-decoration: none;
  fill: currentColor;
  transition: color 0.2s ease, gap 0.2s ease;
}
.btn-text .elementor-button:hover {
  color: var(--color-accent);
  gap: 0.7em;
}

/* ==========================================================================
   18. Overline -- etiquette de section (petit uppercase avant H2)
   Appliquer via Advanced > CSS Classes sur un widget Heading ou Text Editor.
   .pm-overline : texte en primary (sur fond clair)
   .pm-overline--light : texte blanc translucide (sur fond sombre ou primary)
   ========================================================================== */
.pm-overline, .pm-overline > .elementor-widget-container, .pm-overline .elementor-heading-title, .pm-overline .elementor-text-editor, .pm-overline.e-con, .pm-overline.e-container {
  display: block !important;
  font-size: var(--fs-xs) !important;
  font-weight: 700 !important;
  letter-spacing: 0.15em !important;
  text-transform: uppercase !important;
  color: var(--color-primary) !important;
  margin-bottom: var(--space-xs) !important;
  line-height: 1.5 !important;
}

.pm-overline--light, .pm-overline--light > .elementor-widget-container, .pm-overline--light .elementor-heading-title, .pm-overline--light .elementor-text-editor, .pm-overline--light.e-con, .pm-overline--light.e-container {
  display: block !important;
  font-size: var(--fs-xs) !important;
  font-weight: 700 !important;
  letter-spacing: 0.15em !important;
  text-transform: uppercase !important;
  color: var(--color-white) !important;
  opacity: 0.7 !important;
  margin-bottom: var(--space-xs) !important;
  line-height: 1.5 !important;
}

/* ==========================================================================
   19. Section spacing -- padding vertical responsive centralise
   Usage : ajouter la classe CSS "section-y" sur tout container de section
   Elementor via Advanced > CSS Classes. Remplace les padding px hardcodes.
   Variante .section-y-tight pour sections compactes (CTA inline, etc.)
   ========================================================================== */
:root {
  --pmb-section-y-mobile: var(--space-xl);
  --pmb-section-y-tablet: var(--space-xxl);
  --pmb-section-y-desktop: var(--space-xxl);
  --pmb-section-x-mobile: var(--space-s);
  --pmb-section-x-desktop: var(--space-l);
}

.section-y {
  padding-top: var(--pmb-section-y-mobile) !important;
  padding-bottom: var(--pmb-section-y-mobile) !important;
  padding-left: var(--pmb-section-x-mobile) !important;
  padding-right: var(--pmb-section-x-mobile) !important;
}
@media (min-width: 768px) {
  .section-y {
    padding-top: var(--pmb-section-y-tablet) !important;
    padding-bottom: var(--pmb-section-y-tablet) !important;
    padding-left: var(--pmb-section-x-desktop) !important;
    padding-right: var(--pmb-section-x-desktop) !important;
  }
}
@media (min-width: 1025px) {
  .section-y {
    padding-top: var(--pmb-section-y-desktop) !important;
    padding-bottom: var(--pmb-section-y-desktop) !important;
  }
}

.section-y-tight {
  padding-top: var(--space-l) !important;
  padding-bottom: var(--space-l) !important;
  padding-left: var(--pmb-section-x-mobile) !important;
  padding-right: var(--pmb-section-x-mobile) !important;
}
@media (min-width: 768px) {
  .section-y-tight {
    padding-top: var(--space-xl) !important;
    padding-bottom: var(--space-xl) !important;
    padding-left: var(--pmb-section-x-desktop) !important;
    padding-right: var(--pmb-section-x-desktop) !important;
  }
}
@media (min-width: 1025px) {
  .section-y-tight {
    padding-top: var(--space-xl) !important;
    padding-bottom: var(--space-xl) !important;
  }
}

.section-y-hero {
  padding-top: var(--space-xxl) !important;
  padding-bottom: var(--space-xxl) !important;
  padding-left: var(--pmb-section-x-mobile) !important;
  padding-right: var(--pmb-section-x-mobile) !important;
}
@media (min-width: 768px) {
  .section-y-hero {
    padding-top: var(--space-xxxl) !important;
    padding-bottom: var(--space-xxxl) !important;
    padding-left: var(--pmb-section-x-desktop) !important;
    padding-right: var(--pmb-section-x-desktop) !important;
  }
}
@media (min-width: 1025px) {
  .section-y-hero {
    padding-top: var(--space-xxxl) !important;
    padding-bottom: var(--space-xxxl) !important;
  }
}

*::-webkit-scrollbar-track {
  -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  background-color: var(--color-surface);
}

*::-webkit-scrollbar {
  width: 6px;
  background-color: var(--color-surface);
}

*::-webkit-scrollbar-thumb {
  background-color: var(--color-primary);
}

.hide-scroll::-webkit-scrollbar {
  display: none;
}
.hide-scroll {
  -ms-overflow-style: none; /* IE and Edge */
  scrollbar-width: none; /* Firefox */
}

html.has-anim .anim {
  opacity: 0;
  will-change: opacity, transform;
}
html.has-anim .anim--up {
  transform: translateY(var(--anim-shift));
}
html.has-anim .anim--down {
  transform: translateY(calc(-1 * var(--anim-shift)));
}
html.has-anim .anim--left {
  transform: translateX(var(--anim-shift));
}
html.has-anim .anim--right {
  transform: translateX(calc(-1 * var(--anim-shift)));
}
html.has-anim .anim--zoom {
  transform: scale(0.94);
}
html.has-anim [data-pmb-reveal] {
  opacity: 0;
  visibility: hidden;
}

/* ==========================================================================
   NATIVE BLOCKS -- design des blocs Gutenberg natifs proto (.pmb-*).
   Remplace assets/blocks/proto-blocks.css (CSS statique). Tout en SCSS,
   sur les tokens du theme (--color-*, --fs-*, --space-*) + mixins.
   Reference design : exemple.html (versions HTML natives des layouts Elementor).
   Migration progressive : ce qui n'est pas encore ici reste dans proto-blocks.css.
   ========================================================================== */
:root {
  --pmb-fs-h3: clamp(1.3rem, 1.15rem + 0.7vw, 1.5rem);
}

:root {
  --pmb-tracking-head: -0.03em;
}

:root {
  --pmb-fs-lead: clamp(1.15rem, 1rem + 0.6vw, 1.5rem);
}

:root {
  --pmb-btn-fs: var(--fs-s);
}

:root {
  --pmb-lh-prose: 1.7;
}

:root {
  --pmb-cover-min-height: 80vh;
}

:root {
  --pmb-cover-title-size: clamp(2rem, 1.2rem + 3.4vw, 3.75rem);
  --pmb-cover-title-weight: 700;
  --pmb-cover-title-font: Fraunces, Georgia, serif;
}

/* --- Appel a l'action optionnel en pied de bloc (socle commun) --- */
.pmb-text__cta,
.pmb-section__cta {
  margin: var(--space-m) 0 0;
}

.pmb--center .pmb-section__cta {
  text-align: center;
}

/* Embleme optionnel du cover : une marque posee au-dessus de l'enonce. Le socle
   se contente de le rendre lisible et centre ; ses dimensions et sa respiration
   appartiennent au fork (per-block vars). */
.pmb-cover__emblem {
  display: block;
  width: auto;
  max-width: var(--pmb-cover-emblem-max, 12rem);
  height: auto;
  margin: 0 auto var(--pmb-cover-emblem-gap, var(--space-m));
}

/* ==========================================================================
   SOCLE COMMUN
   ========================================================================== */
.pmb {
  box-sizing: border-box;
  font-family: "Montserrat", system-ui, sans-serif;
  color: var(--color-text);
}
.pmb, .pmb *, .pmb *::before, .pmb *::after {
  box-sizing: border-box;
}

.pmb:not(.pmb--has-bg) {
  background-color: var(--surface-section);
}

.pmb:nth-of-type(even):not(.pmb--has-bg):not(.pmb--no-alt) {
  background-color: var(--surface-section-alt);
}

:root {
  --pmb-inner-max: 1280px;
  --pmb-inner-md: 1024px;
  --pmb-inner-narrow: 896px;
  --pmb-inner-xs: 768px;
}

.pmb-inner {
  max-width: var(--pmb-inner-max);
  margin-inline: auto;
}
.pmb-inner--md {
  max-width: var(--pmb-inner-md);
}
.pmb-inner--narrow {
  max-width: var(--pmb-inner-narrow);
}
.pmb-inner--xs {
  max-width: var(--pmb-inner-xs);
}

.pmb-h2 {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2rem, 1.25rem + 2.6vw, 3rem);
  line-height: 1.12;
  letter-spacing: var(--pmb-tracking-head);
  color: var(--text-heading);
  margin: 0 0 var(--space-m);
}
.pmb-h2 .color-primary, .pmb-h2 span {
  color: var(--color-primary);
}

.pmb-rich > p:last-child {
  margin-bottom: 0;
}

.pmb-lead {
  font-size: var(--pmb-fs-lead);
  line-height: 1.6;
  color: var(--text-prose);
  margin: 0 0 var(--space-m);
}

.pmb-eyebrow {
  display: inline-block;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: var(--fs-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.15em;
  padding: 0.35em 1em;
  border-radius: 999px;
  background: color-mix(in srgb, var(--text-accent-label) 10%, transparent);
  color: var(--text-accent-label);
  margin-bottom: var(--space-s);
}
.pmb-eyebrow--glass {
  display: inline-flex;
  align-items: center;
  gap: 0.55em;
  background: rgba(255, 255, 255, 0.1);
  border: 1px solid rgba(255, 255, 255, 0.2);
  backdrop-filter: blur(8px);
  color: #fff;
}
.pmb-eyebrow__dot {
  width: 0.5em;
  height: 0.5em;
  border-radius: 999px;
  background: var(--color-primary);
  flex: none;
}

.pmb-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: var(--pmb-btn-fs);
  line-height: 1;
  text-decoration: none;
  padding: var(--btn-padding);
  border-radius: var(--btn-radius);
  background: var(--color-primary);
  color: var(--color-on-primary);
  box-shadow: 0 10px 20px color-mix(in srgb, var(--color-primary) 20%, transparent);
  transition: transform 0.25s ease, background-color 0.25s ease;
}
.pmb-btn:hover {
  transform: translateY(-2px);
  background: color-mix(in srgb, var(--color-primary) 82%, #000);
  color: var(--color-on-primary);
}
.pmb-btn[hidden] {
  display: none;
}
.pmb-btn--white {
  background: var(--color-on-primary);
  color: var(--color-primary);
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.12);
}
.pmb-btn--white:hover {
  background: var(--color-surface-alt);
  color: var(--color-primary);
}

.pmb-link {
  display: inline-flex;
  align-items: center;
  gap: 0.4em;
  font-weight: 700;
  color: var(--text-accent-label);
  text-decoration: none;
  transition: gap 0.25s ease;
}
.pmb-link::after {
  content: "→";
}
.pmb-link:hover {
  gap: 0.8em;
  color: var(--text-accent-label);
}

.pmb-prose {
  font-size: var(--fs-m);
  line-height: var(--pmb-lh-prose);
  color: var(--text-prose);
}
.pmb-prose p {
  margin: 0 0 0.9em;
}
.pmb-prose p:last-child {
  margin-bottom: 0;
}
.pmb-prose a {
  color: var(--text-accent-label);
  text-underline-offset: 0.15em;
}

.pmb-media {
  position: relative;
  border-radius: 6px;
  overflow: hidden;
  box-shadow: var(--shadow-hover);
}
.pmb-media img, .pmb-media video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s ease;
}
.pmb-media--portrait img, .pmb-media--portrait video {
  aspect-ratio: 3/4;
}
.pmb-media--landscape img, .pmb-media--landscape video {
  aspect-ratio: 4/3;
}
.pmb-media--square img, .pmb-media--square video {
  aspect-ratio: 1/1;
}
.pmb-media--wide img, .pmb-media--wide video {
  aspect-ratio: 16/9;
}

.pmb-blob {
  position: absolute;
  z-index: -1;
  border-radius: 999px;
  background: color-mix(in srgb, var(--color-primary) 6%, transparent);
  filter: blur(48px);
  pointer-events: none;
}

/* ==========================================================================
   HERO -- exemple.html section 1 (plein ecran, image/video de fond)
   ========================================================================== */
.pmb-hero {
  --pmb-hero-min-height: 100vh;
  --pmb-hero-min-height-sm: 88vh;
  --pmb-hero-overlay: rgba(0, 0, 0, .5);
  --pmb-hero-aspect: auto;
  position: relative;
  display: flex;
  align-items: center;
  min-height: var(--pmb-hero-min-height);
  aspect-ratio: var(--pmb-hero-aspect);
  /* LA LARGEUR EST FIXEE, SANS QUOI LE RATIO LA CALCULE.
     Signale par Jonathan : le hero ajoutait un defilement HORIZONTAL a la
     fenetre. `aspect-ratio` marche dans les deux sens -- sans largeur imposee,
     le navigateur deduit la LARGEUR de la hauteur, et un contenu haut (un titre
     long, davantage en mobile) la porte au-dela de l'ecran. Le ratio est
     conserve : c'est desormais la hauteur qui s'en deduit, ce qui est le sens
     voulu. `max-width` en second rideau, pour qu'aucune valeur heritee ne
     puisse redeborder. */
  width: 100%;
  max-width: 100%;
  padding-block: var(--pmb-section-y-desktop);
  --pmb-hero-inline: var(--space-l);
  padding-inline: var(--pmb-hero-inline);
  overflow: hidden;
  background-color: var(--color-black);
  background-size: cover;
  background-position: center;
}
.pmb-hero__media-wrap {
  position: absolute;
  inset: 0;
  overflow: hidden;
  z-index: 0;
}
.pmb-hero__media {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}
.pmb-hero__overlay {
  position: absolute;
  inset: 0;
  background: var(--pmb-hero-overlay);
  z-index: 1;
}
.pmb-hero__inner {
  position: relative;
  z-index: 2;
  width: 100%;
}
.pmb-hero__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2.75rem, 1.3rem + 6vw, 6rem);
  line-height: 1.08;
  letter-spacing: var(--pmb-tracking-head);
  color: #fff;
  margin: 0 0 var(--space-m);
  max-width: 16ch;
}
.pmb-hero__title .color-primary, .pmb-hero__title span {
  color: var(--color-primary);
}
.pmb-hero__meta {
  font-size: var(--fs-s);
  line-height: 1.4;
  color: rgba(255, 255, 255, 0.72);
  margin: 0 0 var(--space-m);
}
.pmb-hero__title:has(+ .pmb-hero__meta) {
  margin-bottom: var(--space-xs);
}
.pmb-hero__intro {
  font-size: var(--pmb-fs-lead);
  line-height: 1.6;
  color: rgba(255, 255, 255, 0.82);
  margin: 0 0 var(--space-l);
  max-width: 42ch;
}
@media (max-width: 1024px) {
  .pmb-hero {
    min-height: var(--pmb-hero-min-height-sm);
    text-align: center;
  }
  .pmb-hero__title, .pmb-hero__intro {
    margin-inline: auto;
  }
}

/* --- LE CTA EN FLUX : une seule declaration pour tous les blocs -------------
   `.pmb-btn` et `.pmb-link` sont des `inline-flex` sans marge : pose apres de la
   prose, le CTA se collait au dernier paragraphe. Le defaut se voyait sur
   pm-snippet mais il est GENERAL -- tous les blocs qui posent un CTA le suivent
   d'un texte.
   Une regle, pas une par bloc : le CTA est le meme composant partout, sa
   respiration se declare donc au meme endroit que lui. */
.pmb :is(.pmb-prose, p) + :is(.pmb-btn, .pmb-link) {
  margin-top: var(--space-l);
}

/* --- Hero A FIGURE : texte d'un cote, illustration de l'autre ---------------
   Emis UNIQUEMENT quand le bloc porte une figure (classe `--figure` posee par le
   rendu) : sans elle, aucune de ces regles ne s'applique et le hero est celui
   d'avant, a l'octet pres.

   Le hero est deja un conteneur flex centre verticalement : la figure est donc
   simplement un SECOND enfant, et les deux colonnes naissent sans reecrire la
   structure. C'est aussi ainsi que la prod Widaki le construit (une rangee
   `justify-content: center` portant la colonne de texte puis l'image).

   La figure garde sa taille naturelle, bornee par --pmb-hero-figure-max : une
   illustration detouree n'a pas de largeur "juste" en soi, c'est le fork qui
   sait la sienne. */
.pmb-hero--figure {
  --pmb-hero-figure-max: 800px;
  --pmb-hero-figure-gap: var(--space-l);
  justify-content: center;
  gap: var(--pmb-hero-figure-gap);
  padding: 0;
}
.pmb-hero--figure .pmb-hero__inner {
  margin-inline: 0;
  flex: 1 1 26rem;
  padding-block: var(--pmb-section-y-desktop);
  padding-inline: var(--space-l);
}
.pmb-hero--figure .pmb-hero__figure {
  position: relative;
  z-index: 2;
  flex: 0 1 auto;
  min-width: 0;
  max-width: min(100%, var(--pmb-hero-figure-max));
  margin: 0;
}
.pmb-hero--figure .pmb-hero__figure-img {
  display: block;
  width: 100%;
  height: auto;
}
@media (max-width: 1024px) {
  .pmb-hero--figure {
    flex-wrap: wrap;
  }
  .pmb-hero--figure .pmb-hero__inner {
    flex-basis: 100%;
  }
  .pmb-hero--figure .pmb-hero__figure {
    max-width: min(100%, 22rem);
    margin-inline: auto;
  }
}

/* ==========================================================================
   INTRO -- exemple.html section 2 (chiffre geant + bloc engagement)
   ========================================================================== */
.pmb-intro {
  --pmb-intro-figure-size: clamp(7rem, 2rem + 22vw, 18rem);
  overflow: hidden;
}
.pmb-intro__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
  align-items: center;
  /* minmax(0, 1fr) et non 1fr : `1fr` = minmax(auto, 1fr), dont le minimum
     est le CONTENU (piege s86/s87, deja paye sur data-row). Une figure
     geante + le nowrap de la ligne chiffre gonflent le min-content de la
     colonne gauche, qui VOLE la place et compresse le contenu (mesure
     widaki : colonne texte reduite a ~285px). Une piste ne peut plus
     ecraser l'autre, par construction. */
}
@media (min-width: 1025px) {
  .pmb-intro__grid {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--space-xl);
  }
}
.pmb-intro__figure-wrap {
  position: relative;
}
.pmb-intro__figure-row {
  display: flex;
  align-items: baseline;
  gap: var(--space-s);
  flex-wrap: nowrap;
}
.pmb-intro .pmb-figure {
  font-size: var(--pmb-intro-figure-size);
}
.pmb-intro__label {
  display: flex;
  flex-direction: column;
}
.pmb-intro__unit {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  line-height: 1.1;
  color: var(--color-text);
}
.pmb-intro__detail {
  color: var(--text-prose);
  font-weight: 500;
  margin-top: 0.4rem;
}
.pmb-intro .pmb-blob {
  top: -2.5rem;
  left: -2.5rem;
  width: 11rem;
  height: 11rem;
}

.pmb-figure {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(7rem, 2rem + 22vw, 18rem);
  line-height: 0.9;
  color: var(--color-primary);
  display: inline-block;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* ==========================================================================
   STATS -- exemple.html section 5 (cartes blanches)
   ========================================================================== */
.pmb-stats__title {
  text-align: center;
}
.pmb-stats__row {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-m);
}
@media (min-width: 1025px) {
  .pmb-stats__row {
    grid-template-columns: repeat(4, 1fr);
  }
}

.pmb-stat-card {
  background: var(--surface-card);
  padding: var(--space-m);
  border-radius: 4px;
  box-shadow: var(--shadow);
  border: var(--border-width) solid color-mix(in srgb, var(--color-primary) 6%, transparent);
  text-align: center;
}
.pmb-stat-card__value {
  display: block;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2.25rem, 1.4rem + 2.2vw, 3rem);
  line-height: 1;
  color: var(--color-primary);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.pmb-stat-card__label {
  display: block;
  margin-top: 0.6rem;
  font-size: var(--fs-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--color-text);
}

/* ==========================================================================
   COMPARATIF -- exemple.html section 10 (2 colonnes + checkmarks + divider)
   ========================================================================== */
.pmb-comparatif__title {
  text-align: center;
}
.pmb-comparatif__cols {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-m);
}
@media (min-width: 768px) {
  .pmb-comparatif__cols {
    grid-template-columns: 1fr 1fr;
    gap: 0;
  }
}
.pmb-comparatif__col {
  padding: var(--space-m);
}
.pmb-comparatif__col-title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  text-align: center;
  color: var(--color-primary);
  margin: 0 0 var(--space-m);
}
.pmb-comparatif__divider {
  display: none;
}
@media (min-width: 768px) {
  .pmb-comparatif__divider {
    display: block;
    position: absolute;
    left: 50%;
    top: var(--space-m);
    bottom: var(--space-m);
    width: 1px;
    background: color-mix(in srgb, var(--color-primary) 20%, transparent);
  }
}
.pmb-comparatif ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
.pmb-comparatif li {
  position: relative;
  padding-left: 2rem;
  margin-bottom: 1rem;
  color: var(--text-prose);
  font-weight: 500;
  line-height: 1.45;
}
.pmb-comparatif li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.1em;
  width: 1.25rem;
  height: 1.25rem;
  background-color: var(--color-primary);
  mask: var(--pmb-check) center/contain no-repeat;
}
.pmb-comparatif {
  /* Le CONTENU porte deja son marqueur : chaque ligne ouvre sur un emoji qui dit
     son camp, ce que cfg_designer_schema demande au Designer en toutes lettres
     ("the emoji IS the marker"). La coche du bloc ferait alors doublon, et pire
     qu'un doublon : identique des deux cotes, elle affirme "oui" devant une
     ligne qui avertit, donc elle CONTREDIT le texte qu'elle precede. Meme
     famille que `.pmb-liste__list--nue`, defaut deja paye en s86.
     La classe est POSEE PAR LE RENDU, jamais devinee ici : le CSS ne sait pas
     lire le premier caractere d'une ligne. Mesure s103 sur la production :
     10 blocs sur 11 n'ont aucun marqueur dans leur texte et gardent donc leur
     coche -- la zero-regression est acquise par construction, pas par vigilance. */
}
.pmb-comparatif--marqueurs-texte li {
  padding-left: 0;
}
.pmb-comparatif--marqueurs-texte li::before {
  content: none;
}

/* ==========================================================================
   SNIPPET -- exemple.html section 7 (texte + image arrondie + blob)
   ========================================================================== */
.pmb-snippet__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
  align-items: center;
}
@media (min-width: 1025px) {
  .pmb-snippet__grid {
    grid-template-columns: 1fr 1fr;
    gap: var(--space-xl);
  }
}
.pmb-snippet__figure {
  position: relative;
}
.pmb-snippet .pmb-media {
  border-radius: 6px;
}
.pmb-snippet .pmb-blob {
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 110%;
  height: 110%;
}

/* ==========================================================================
   TEXT STANDARD -- exemple.html section 3 (bloc centre, prose large)
   ========================================================================== */
.pmb-text .pmb-h2 {
  text-align: center;
  margin-inline: auto;
}
.pmb-text .pmb-prose {
  font-size: var(--pmb-fs-lead);
  font-weight: 400;
  color: var(--text-prose);
}

/* ==========================================================================
   COVER (full-impact / media-full) -- exemple.html sections 6 & 17
   ========================================================================== */
.pmb-cover {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: var(--pmb-cover-min-height);
  padding-block: var(--space-xxl);
  padding-inline: var(--space-l);
  overflow: hidden;
  background-size: cover;
  background-position: center;
  background-color: var(--color-black);
  text-align: center;
}
.pmb-cover__media-wrap {
  position: absolute;
  inset: 0;
  overflow: hidden;
  z-index: 0;
}
.pmb-cover__media {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}
.pmb-cover__overlay {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.42);
  z-index: 1;
}
.pmb-cover__inner {
  position: relative;
  z-index: 2;
  color: #fff;
}
.pmb-cover__title {
  font-family: var(--pmb-cover-title-font);
  font-weight: var(--pmb-cover-title-weight);
  font-size: var(--pmb-cover-title-size);
  line-height: 1.1;
  letter-spacing: var(--pmb-tracking-head);
  color: #fff;
  margin: 0 0 var(--space-s);
}
.pmb-cover__title .color-primary, .pmb-cover__title span {
  color: var(--color-primary);
}
.pmb-cover__text {
  font-size: var(--pmb-fs-lead);
  line-height: 1.6;
  color: rgba(255, 255, 255, 0.9);
  margin: 0 auto;
  max-width: 52ch;
}

/* ==========================================================================
   DEEP CLASSIC -- exemple.html section 4 (paires alternees + note de cloture)
   ========================================================================== */
.pmb-deep__h2 {
  display: inline-block;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.6rem, 1.35rem + 1vw, 1.875rem);
  color: var(--color-primary);
  border-bottom: 1px solid color-mix(in srgb, var(--color-primary) 12%, transparent);
  padding-bottom: 0.4rem;
  margin: 0 0 var(--space-xl);
}
.pmb-deep__pair {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
  align-items: center;
  margin-top: var(--space-xxl);
}
@media (min-width: 1025px) {
  .pmb-deep__pair {
    grid-template-columns: 1fr 1fr;
    gap: var(--space-xl);
  }
}
.pmb-deep__pair:first-of-type {
  margin-top: var(--space-l);
}
@media (min-width: 1025px) {
  .pmb-deep__pair--rev .pmb-media {
    order: 2;
  }
}
.pmb-deep__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--text-heading-sub);
  border-left: 4px solid var(--color-primary);
  padding-left: 1.2rem;
  margin: 0 0 0.8rem;
}
.pmb-deep .pmb-media--landscape img, .pmb-deep .pmb-media--landscape video {
  aspect-ratio: 4/3;
}

.pmb-freenote {
  margin-top: var(--space-xxl);
  background: var(--surface-section-alt);
  border-radius: 6px;
  padding: var(--space-l);
  text-align: center;
  font-size: var(--pmb-fs-lead);
  font-style: italic;
  line-height: 1.6;
  color: var(--color-text);
}
.pmb-freenote p {
  margin: 0;
}

/* ==========================================================================
   MAGAZINE -- exemple.html section 8 (portrait + 4 etapes 2x2, gros numeros)
   ========================================================================== */
.pmb-magazine__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
  align-items: center;
}
@media (min-width: 1025px) {
  .pmb-magazine__grid {
    grid-template-columns: 5fr 7fr;
    gap: var(--space-xl);
  }
}
.pmb-magazine .pmb-media--portrait img, .pmb-magazine .pmb-media--portrait video {
  aspect-ratio: 3/4;
}
.pmb-magazine__head {
  margin-bottom: var(--space-l);
}
.pmb-magazine__steps {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
}
@media (min-width: 768px) {
  .pmb-magazine__steps {
    grid-template-columns: 1fr 1fr;
  }
}

.pmb-step__num {
  display: block;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-style: italic;
  font-size: clamp(3rem, 2rem + 3vw, 3.75rem);
  line-height: 1;
  color: color-mix(in srgb, var(--color-primary) 14%, transparent);
  margin-bottom: -0.2em;
}
.pmb-step__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--text-heading-sub);
  margin: 0.4rem 0 0.4rem;
}
.pmb-step__text {
  color: var(--text-prose);
  line-height: 1.6;
  margin: 0;
}

/* ==========================================================================
   MAGAZINE PORTRAIT -- image laterale du sol au plafond, propos a cote

   Distinct de `.pmb-magazine` ci-dessus, qui numerote ses etapes. Ici l'image
   tient toute la colonne de gauche et le texte se deroule a droite.
   Proportions et ratio releves sur le layout d'origine (0.85fr / 1.15fr,
   image en 9/16, alignement en haut).
   ========================================================================== */
.pmb-magazine-portrait__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
}
@media (min-width: 768px) {
  .pmb-magazine-portrait__grid {
    grid-template-columns: 0.85fr 1.15fr;
    gap: var(--space-xl);
    align-items: start;
  }
}
@media (min-width: 768px) {
  .pmb-magazine-portrait__figure {
    align-self: stretch;
  }
}
.pmb-magazine-portrait__figure img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  aspect-ratio: 9/16;
}
.pmb-magazine-portrait__h2 {
  margin-bottom: var(--space-m);
}
.pmb-magazine-portrait__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--text-heading-sub);
  margin: var(--space-m) 0 0.4rem;
}
.pmb-magazine-portrait__h2 + .pmb-magazine-portrait__title {
  margin-top: 0;
}

/* ==========================================================================
   IMPACT EMPILE -- titre, chapeau, puis une image large

   Distinct de `.pmb-cover` (full-impact / media-full), qui pose l'image en
   fond et ecrit par-dessus. Ici l'image reste entiere, sous le texte.
   ========================================================================== */
.pmb-impact-stack__title, .pmb-impact-stack__intro {
  text-align: center;
  max-width: 800px;
  margin-inline: auto;
}
.pmb-impact-stack__intro {
  margin-top: var(--space-m);
}
.pmb-impact-stack__figure {
  margin-top: var(--space-l);
}
.pmb-impact-stack__figure img {
  width: 100%;
  height: auto;
  object-fit: cover;
  aspect-ratio: 21/9;
  display: block;
}

/* ==========================================================================
   DUAL SPEC -- exemple.html section 9 (2 fiches image carree + titre + texte)
   ========================================================================== */
.pmb-dual__title {
  text-align: center;
  margin-bottom: var(--space-l);
}
.pmb-dual__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
}
@media (min-width: 1025px) {
  .pmb-dual__grid {
    grid-template-columns: 1fr 1fr;
    gap: var(--space-xl);
  }
}

.pmb-spec .pmb-media {
  border-radius: 4px;
  box-shadow: var(--shadow);
  margin-bottom: var(--space-m);
}
.pmb-spec .pmb-media--square img, .pmb-spec .pmb-media--square video {
  aspect-ratio: 1/1;
}
.pmb-spec:hover .pmb-media img, .pmb-spec:hover .pmb-media video {
  transform: scale(1.05);
}
.pmb-spec__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--text-heading-sub);
  margin: 0 0 0.5rem;
}
.pmb-spec__text {
  font-size: var(--pmb-fs-lead);
  color: var(--text-prose);
}

/* ==========================================================================
   DATA ROW -- exemple.html section 13 (4 cartes bordees)
   ========================================================================== */
.pmb-data-row__title {
  text-align: center;
  margin-bottom: var(--space-l);
}
.pmb-data-row__row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
  gap: var(--space-m);
}
@media (min-width: 768px) {
  .pmb-data-row__row {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (min-width: 1025px) {
  .pmb-data-row__row {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}

.pmb-data-card {
  border: 2px solid var(--divider);
  border-radius: 6px;
  padding: var(--space-m);
  text-align: center;
}
.pmb-data-card__value {
  display: block;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2.25rem, 1.4rem + 2.2vw, 3rem);
  line-height: 1;
  color: var(--color-primary);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.pmb-data-card__label {
  display: block;
  margin-top: 0.6rem;
  font-size: var(--fs-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--color-text);
}

/* ==========================================================================
   QUOTE HIGHLIGHT -- exemple.html section 14 (texte + citation + portrait)
   ========================================================================== */
.pmb-quote-section__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
  align-items: center;
}
@media (min-width: 1025px) {
  .pmb-quote-section__grid {
    grid-template-columns: 1fr 1fr;
    gap: var(--space-xl);
  }
}
.pmb-quote-section .pmb-media--portrait img, .pmb-quote-section .pmb-media--portrait video {
  aspect-ratio: 4/5;
}

.pmb-quote {
  position: relative;
  border-left: 4px solid var(--color-primary);
  padding: 0.2rem 0 0.2rem 2.2rem;
  margin: var(--space-m) 0 0;
  font-size: var(--pmb-fs-h3);
  line-height: 1.4;
  font-style: italic;
  color: var(--color-text);
}
.pmb-quote__author {
  display: block;
  margin-top: 1rem;
  font-size: var(--fs-s);
  font-weight: 700;
  font-style: normal;
  color: var(--color-text);
}

/* ==========================================================================
   CTA BANNER -- exemple.html section 18 (fond primary, image + panneau texte)
   ========================================================================== */
.pmb-cta {
  background: var(--pmb-cta-bg, var(--color-primary));
  color: var(--pmb-cta-ink, var(--color-on-primary));
  overflow: hidden;
}
.pmb-cta__grid {
  display: grid;
  grid-template-columns: 1fr;
  align-items: stretch;
}
@media (min-width: 1025px) {
  .pmb-cta:not(.pmb-cta--center) .pmb-cta__grid {
    grid-template-columns: 1fr 1fr;
  }
}
.pmb-cta__media {
  position: relative;
  min-height: 280px;
  overflow: hidden;
}
.pmb-cta__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.pmb-cta__body {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  gap: var(--space-s);
  padding: var(--space-xl) var(--space-l);
}
@media (min-width: 1025px) {
  .pmb-cta__body {
    padding: var(--space-xxl);
  }
}
.pmb-cta__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2rem, 1.25rem + 2.6vw, 3rem);
  line-height: 1.12;
  letter-spacing: var(--pmb-tracking-head);
  color: var(--pmb-cta-ink, var(--color-on-primary));
  margin: 0;
}
.pmb-cta__text {
  font-size: var(--pmb-fs-lead);
  color: color-mix(in srgb, var(--pmb-cta-ink, var(--color-on-primary)) 92%, transparent);
  margin: 0;
}
.pmb-cta__text--2 {
  font-size: var(--fs-s);
  color: color-mix(in srgb, var(--pmb-cta-ink, var(--color-on-primary)) 70%, transparent);
}
.pmb-cta__text a, .pmb-cta__body a:not(.pmb-btn) {
  color: var(--pmb-cta-ink, var(--color-on-primary));
  text-decoration: underline;
  text-underline-offset: 2px;
}
.pmb-cta__text a:hover, .pmb-cta__body a:not(.pmb-btn):hover {
  opacity: 0.82;
}
.pmb-cta--center {
  text-align: center;
}
.pmb-cta--center .pmb-cta__body {
  align-items: center;
  padding-block: var(--space-xxl);
}

/* ==========================================================================
   FAQ -- exemple.html section 19 (accordeon natif <details>, cartes blanches)
   ========================================================================== */
.pmb-faq__title {
  text-align: center;
  margin-bottom: var(--space-l);
}
.pmb-faq__item {
  background: var(--surface-card);
  border-radius: 4px;
  box-shadow: var(--shadow);
  margin-bottom: var(--space-s);
  overflow: hidden;
}
.pmb-faq__q {
  cursor: pointer;
  list-style: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--fs-m);
  color: var(--color-text);
  padding: var(--space-s) var(--space-m);
}
.pmb-faq__q::-webkit-details-marker {
  display: none;
}
.pmb-faq__q::after {
  content: "";
  flex: none;
  width: 1.3rem;
  height: 1.3rem;
  background-color: var(--color-primary);
  mask: var(--pmb-chevron) center/contain no-repeat;
  transition: transform 0.3s ease;
}
.pmb-faq__item[open] .pmb-faq__q::after {
  transform: rotate(180deg);
}
.pmb-faq__a {
  padding: 0 var(--space-m) var(--space-m);
  color: var(--text-prose);
  line-height: 1.7;
  border-top: 1px solid var(--divider);
}
.pmb-faq__a p {
  margin: 0.8em 0 0;
}

/* ==========================================================================
   LOOPS (marques / certifications) -- cartes logo-forward (CPT)
   ========================================================================== */
.pmb-loop__title {
  text-align: center;
}
.pmb-loop__intro {
  text-align: center;
  max-width: 60ch;
  margin: 0 auto var(--space-l);
  color: var(--text-prose);
  line-height: 1.6;
}

/* --- CAROUSEL marques (GSAP Draggable + inertie) --- */
.pmb-carousel {
  position: relative;
}
.pmb-carousel__viewport {
  overflow: hidden;
  padding: 10px 4px 26px;
  cursor: grab;
}
.pmb-carousel__viewport:active {
  cursor: grabbing;
}
.pmb-carousel__viewport:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
  border-radius: 4px;
}
.pmb-carousel__track {
  display: flex;
  gap: var(--space-m);
  align-items: stretch;
  will-change: transform;
}
.pmb-carousel__slide {
  flex: 0 0 clamp(300px, 86vw, 380px);
  display: flex;
}
.pmb-carousel__nav {
  position: absolute;
  top: calc(50% - 13px);
  z-index: 3;
  transform: translateY(-50%);
  width: 48px;
  height: 48px;
  border-radius: 50%;
  border: 0;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--color-primary);
  color: var(--color-on-primary);
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.2);
  transition: background 0.2s ease, transform 0.2s ease, opacity 0.2s ease;
}
.pmb-carousel__nav:hover:not(:disabled) {
  background: var(--color-secondary);
  transform: translateY(-50%) scale(1.06);
}
.pmb-carousel__nav:disabled {
  opacity: 0.3;
  cursor: default;
}
.pmb-carousel__nav:focus-visible {
  outline: 2px solid var(--color-secondary);
  outline-offset: 3px;
}
.pmb-carousel__nav--prev {
  left: -8px;
}
.pmb-carousel__nav--next {
  right: -8px;
}
.pmb-carousel__dots {
  display: flex;
  justify-content: center;
  gap: 0.5rem;
  margin-top: var(--space-s);
}
.pmb-carousel__dot {
  width: 8px;
  height: 8px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  cursor: pointer;
  background: color-mix(in srgb, var(--scheme-ink) 16%, transparent);
  transition: background 0.25s ease, width 0.25s ease;
}
.pmb-carousel__dot.is-active {
  background: var(--color-primary);
  width: 22px;
  border-radius: 4px;
}
@media (max-width: 1024px) {
  .pmb-carousel__nav {
    display: none;
  }
}

.pmb-brand-card {
  position: relative;
  overflow: hidden;
  width: 100%;
  background: var(--surface-card);
  border: var(--border-width) solid color-mix(in srgb, var(--scheme-ink) 6%, transparent);
  border-radius: 4px;
  padding: var(--space-m);
  display: flex;
  flex-direction: column;
  text-align: left;
  box-shadow: var(--shadow);
  transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}
.pmb-brand-card::before {
  content: "";
  position: absolute;
  inset: 0 0 auto;
  height: 4px;
  background: linear-gradient(90deg, var(--color-primary), var(--color-secondary));
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s ease;
}
.pmb-brand-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-hover);
  border-color: transparent;
}
.pmb-brand-card:hover::before {
  transform: scaleX(1);
}
.pmb-brand-card__logo {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  margin-bottom: var(--space-m);
}
.pmb-brand-card__logo img {
  width: 100%;
  height: auto;
  max-height: 140px;
  object-fit: contain;
  object-position: left center;
}
.pmb-brand-card__name {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--color-text);
  margin: 0 0 0.3rem;
}
.pmb-brand-card__tagline {
  font-size: var(--fs-s);
  color: var(--text-accent-label);
  font-weight: 600;
  margin: 0 0 0.5rem;
}
.pmb-brand-card__text {
  font-size: var(--fs-s);
  color: var(--text-subtle);
  line-height: 1.55;
  margin: 0 0 0.8rem;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  word-break: break-word;
}
.pmb-brand-card__link {
  margin-top: auto;
  font-weight: 600;
  color: var(--color-primary);
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
}
.pmb-brand-card__link span {
  transition: transform 0.2s ease;
}
.pmb-brand-card__link:hover span {
  transform: translateX(3px);
}

/* --- MARQUES en GRILLE (page dediee) : descriptions completes, non tronquees --- */
.pmb-brands-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: var(--space-l);
  align-items: start;
}

.pmb-marques--grid .pmb-brand-card__text {
  display: block;
  overflow: visible;
  -webkit-line-clamp: unset;
}

/* --- CERTIFICATIONS : badges en colonne, logo pleine largeur en tete --- */
.pmb-certs-grid {
  list-style: none;
  margin: 0 auto;
  padding: 0;
  max-width: 880px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
  gap: var(--space-m);
}

.pmb-cert {
  background: var(--surface-card);
  border: var(--border-width) solid color-mix(in srgb, var(--scheme-ink) 6%, transparent);
  border-radius: 4px;
  padding: var(--space-m);
  display: flex;
  flex-direction: column;
  text-align: left;
  align-items: stretch;
  transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}
.pmb-cert:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-hover);
  border-color: transparent;
}
.pmb-cert__logo {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  margin-bottom: var(--space-m);
}
.pmb-cert__logo img {
  width: 100%;
  height: auto;
  max-height: 120px;
  object-fit: contain;
  object-position: left center;
}
.pmb-cert__body {
  width: 100%;
}
.pmb-cert__name {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--fs-m);
  color: var(--color-text);
  margin: 0 0 0.25rem;
}
.pmb-cert__display {
  font-size: var(--fs-s);
  color: var(--text-accent-label);
  font-weight: 600;
  margin: 0 0 0.4rem;
}
.pmb-cert__benefit {
  font-size: var(--fs-s);
  color: var(--text-subtle);
  line-height: 1.55;
  margin: 0 0 0.6rem;
}
.pmb-cert__link {
  font-size: var(--fs-s);
  font-weight: 600;
  color: var(--color-primary);
  display: inline-flex;
  align-items: center;
  gap: 0.3em;
}

/* ==========================================================================
   LEGAL (pages obligatoires : prose alignee a gauche)
   ========================================================================== */
.proto-legal {
  text-align: left;
}
.proto-legal__title {
  font-size: clamp(2rem, 1.25rem + 2.6vw, 3rem);
  margin: 0 0 var(--space-m);
}
.proto-legal__body {
  color: var(--text-prose);
  line-height: 1.65;
  font-size: var(--fs-m);
}
.proto-legal__body h2, .proto-legal__body h3 {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  color: var(--color-text);
  margin: var(--space-m) 0 0.5rem;
}
.proto-legal__body h3 {
  font-size: var(--fs-l);
}
.proto-legal__body p {
  margin: 0 0 0.9rem;
}
.proto-legal__body ul, .proto-legal__body ol {
  margin: 0 0 0.9rem 1.3rem;
}
.proto-legal__body li {
  margin-bottom: 0.35rem;
}
.proto-legal__body a {
  color: var(--color-primary);
  text-decoration: underline;
}
.proto-legal__body strong {
  color: var(--color-text);
}

/* ==========================================================================
   CONTACT (coordonnees + carte)
   ========================================================================== */
.proto-contact__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
  align-items: stretch;
}
@media (min-width: 1025px) {
  .proto-contact__grid {
    grid-template-columns: 1fr 1.1fr;
  }
}
.proto-contact__intro {
  color: var(--text-subtle);
  line-height: 1.6;
  margin: 0.4rem 0 var(--space-m);
  max-width: 52ch;
}
.proto-contact__list {
  list-style: none;
  margin: 0 0 var(--space-l);
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-s);
}
.proto-contact__list li {
  display: flex;
  align-items: flex-start;
  gap: 0.7rem;
  font-size: var(--fs-m);
  line-height: 1.4;
}
.proto-contact__list a {
  color: var(--color-text);
  text-decoration: none;
}
.proto-contact__list a:hover {
  color: var(--color-primary);
}
.proto-contact__ico {
  color: var(--color-primary);
  flex: 0 0 auto;
  margin-top: 0.15em;
}
.proto-contact__cta {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-s);
}
.proto-contact__map {
  min-height: 360px;
  border-radius: 4px;
  overflow: hidden;
  box-shadow: var(--shadow);
}
.proto-contact__map iframe {
  display: block;
  width: 100%;
  height: 100%;
  min-height: 360px;
  border: 0;
}

/* ==========================================================================
   MODALES NATIVES (<dialog> HTML natif -- remplace les Popups Elementor)
   ========================================================================== */
.proto-modal {
  width: calc(100% - 2rem);
  max-width: 480px;
  margin: auto;
  max-height: calc(100vh - 2rem);
  padding: 0;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--color-text);
  overflow: visible;
  opacity: 0;
  transform: translateY(14px) scale(0.98);
  transition: opacity 0.25s ease, transform 0.25s ease, overlay 0.25s ease allow-discrete, display 0.25s ease allow-discrete;
}
.proto-modal[open] {
  opacity: 1;
  transform: none;
}
@starting-style {
  .proto-modal[open] {
    opacity: 0;
    transform: translateY(14px) scale(0.98);
  }
}
.proto-modal::backdrop {
  background: color-mix(in srgb, var(--color-bg-darker) 55%, transparent);
  backdrop-filter: blur(3px);
}
.proto-modal__form {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
  background: var(--surface-card);
  border-radius: 6px;
  padding: var(--space-l);
  box-shadow: 0 40px 80px rgba(0, 0, 0, 0.3);
  max-height: calc(100vh - 2rem);
  overflow-y: auto;
}
.proto-modal__close {
  position: absolute;
  top: 10px;
  right: 14px;
  background: none;
  border: 0;
  font-size: 1.9rem;
  line-height: 1;
  cursor: pointer;
  color: #9aa0a6;
  transition: color 0.2s ease;
}
.proto-modal__close:hover {
  color: var(--color-primary);
}
.proto-modal__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  line-height: 1.15;
  color: var(--color-text);
  margin: 0 1.6rem 0.1rem 0;
}
.proto-modal__intro {
  color: var(--text-subtle);
  font-size: var(--fs-s);
  line-height: 1.5;
  margin: 0 0 0.5rem;
}
.proto-modal__field {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}
.proto-modal__field span {
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--text-subtle);
}
.proto-modal__field span em {
  color: var(--color-primary);
  font-style: normal;
}
.proto-modal__field input, .proto-modal__field textarea, .proto-modal__field select {
  width: 100%;
  padding: 0.7em 0.9em;
  font: inherit;
  color: var(--color-text);
  border: 1px solid color-mix(in srgb, var(--scheme-ink) 18%, transparent);
  border-radius: 2px;
  background: var(--surface-field);
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.proto-modal__field input:focus, .proto-modal__field textarea:focus, .proto-modal__field select:focus {
  border-color: var(--color-primary);
  outline: none;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 15%, transparent);
}
.proto-modal__field textarea {
  resize: vertical;
  min-height: 90px;
}
.proto-modal__field select {
  appearance: none;
  -webkit-appearance: none;
  cursor: pointer;
  padding-right: 2.4em;
  background-image: var(--pmb-chevron);
  background-repeat: no-repeat;
  background-position: right 0.85em center;
  background-size: 0.85em;
}
.proto-modal__hp {
  position: absolute !important;
  left: -9999px;
  width: 1px;
  height: 1px;
  opacity: 0;
}
.proto-modal__submit {
  margin-top: 0.5rem;
  width: 100%;
  justify-content: center;
  border: 0;
  cursor: pointer;
}
.proto-modal__submit[disabled] {
  opacity: 0.6;
  cursor: default;
  transform: none;
}
.proto-modal__feedback {
  margin: 0.2rem 0 0;
  font-size: var(--fs-s);
  min-height: 1.2em;
}
.proto-modal__feedback.is-ok {
  color: #1a7f37;
}
.proto-modal__feedback.is-error {
  color: var(--color-primary);
}

/* ==========================================================================
   Variables d'icones (data-uri)
   ========================================================================== */
:root {
  --pmb-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='black'%3E%3Cpath d='M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z'/%3E%3C/svg%3E");
  --pmb-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M19 9l-7 7-7-7'/%3E%3C/svg%3E");
}

/* ==========================================================================
   LISTE (W-79) -- titre facultatif + lignes ; le <ul>/<ol> est reconstruit au
   rendu, jamais saisi en HTML. Trois styles : puces, numerotee, coches.
   ========================================================================== */
.pmb-liste__list {
  list-style: none;
  margin: var(--space-m) 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-s);
}
.pmb-liste__list li {
  position: relative;
  padding-left: 1.75rem;
  color: var(--text-prose);
  /* Taille POSEE et non heritee : hors d'un `.pmb-prose`, une liste
     retomberait sur celle du corps. Releve sur le rendu actuel des
     points cles : 19,68px pour un interligne de 29,52 (soit 1,5). */
  font-size: var(--fs-m);
  line-height: 1.5;
}
.pmb-liste__list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.55em;
  width: 0.5rem;
  height: 0.5rem;
  border-radius: 50%;
  background: var(--color-primary);
}
.pmb-liste {
  /* NUE : aucun marqueur. Pour les listes dont le CONTENU porte deja son
     signe (les points cles du wiki commencent chacun par un emoji) -- y
     ajouter une puce ferait doublon, defaut paye en s86 sur le comparatif.
     Valeurs RELEVEES sur le rendu actuel de ces listes (`.pmb-prose ul`) :
     bloc, sans retrait, 15px entre items, interligne 1,5 -- de sorte que la
     conversion d'un contenu existant ne deplace aucune hauteur. */
}
.pmb-liste__list--nue {
  display: block;
  margin: 0 0 var(--space-xs);
}
.pmb-liste__list--nue li {
  padding-left: 0;
  margin-bottom: var(--space-xs);
}
.pmb-liste__list--nue li::before {
  content: none;
}
.pmb-liste {
  /* Deux colonnes a partir de 768px seulement : `respond-to(mobile)` compile
     en `min-width: 768px`, donc TOUT SAUF le mobile (piege du nom, s84). En
     dessous, une colonne unique reste plus lisible. */
}
@media (min-width: 768px) {
  .pmb-liste__list--2col {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-l);
  }
}
.pmb-liste {
  /* Numerotee : le compteur remplace la puce, d'ou la remise a zero de la
     forme ronde heritee ci-dessus. */
}
.pmb-liste__list--numerotee {
  counter-reset: pmb-liste;
}
.pmb-liste__list--numerotee li {
  counter-increment: pmb-liste;
  padding-left: 2.25rem;
}
.pmb-liste__list--numerotee li::before {
  content: counter(pmb-liste) ".";
  top: 0;
  width: auto;
  height: auto;
  border-radius: 0;
  background: none;
  color: var(--color-primary);
  font-weight: 700;
  font-family: "Fraunces", Georgia, serif;
}
.pmb-liste {
  /* Coches : on reutilise `--pmb-check`, la meme icone que le comparatif,
     declaree sur :root -- on ne redeclare pas une data-uri deja disponible. */
}
.pmb-liste__list--coches li {
  padding-left: 2rem;
}
.pmb-liste__list--coches li::before {
  top: 0.1em;
  width: 1.25rem;
  height: 1.25rem;
  border-radius: 0;
  background-color: var(--color-primary);
  mask: var(--pmb-check) center/contain no-repeat;
}

/* ==========================================================================
   BLOCS W3 (catalogue enrichi) -- features / timeline / gallery / slider / carousel
   Spec : proto/specs/2026-07-18-blocs-catalogue-w3-design.md. Tokens-only + per-block vars.
   ========================================================================== */
/* --- FEATURES : grille emoji + titre + sous-titre + texte --- */
.pmb-features {
  --pmb-features-cols: 3;
  --pmb-features-gap: var(--space-l);
  --pmb-features-icon-size: 2.6rem;
  --pmb-features-icon-align: inherit;
  --pmb-features-align: left;
}
.pmb-features--2col {
  --pmb-features-cols: 2;
}
.pmb-features--3col {
  --pmb-features-cols: 3;
}
.pmb-features--4col {
  --pmb-features-cols: 4;
}
.pmb-features__head {
  max-width: 760px;
  margin-bottom: var(--space-l);
}
.pmb-features__grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--pmb-features-gap);
  grid-template-columns: 1fr;
}
@media (min-width: 768px) {
  .pmb-features__grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
@media (min-width: 1025px) {
  .pmb-features__grid {
    grid-template-columns: repeat(var(--pmb-features-cols), 1fr);
  }
}

.pmb-feature {
  text-align: var(--pmb-features-align);
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}
.pmb-feature__icon {
  font-size: var(--pmb-features-icon-size);
  line-height: 1;
  margin-bottom: 0.3rem;
  text-align: var(--pmb-features-icon-align);
}
.pmb-feature__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--text-heading-sub);
  margin: 0;
}
.pmb-feature__sub {
  font-size: var(--fs-s);
  font-weight: 600;
  color: var(--text-accent-label);
  margin: 0;
}
.pmb-feature__text {
  font-size: var(--fs-m);
  line-height: 1.6;
  color: var(--text-prose);
  margin: 0.1rem 0 0;
}
.pmb-feature {
  /* Le `gap` de la carte est cale sur l'ecart ICONE / titre, trop serre pour
     separer un titre de son paragraphe : le texte collait a son titre.
     L'ecart est pose sur le TEXTE et non sur le titre, pour qu'un sous-titre
     intercale reste solidaire du titre, ce qu'il doit rester. */
}
.pmb-feature__title + .pmb-feature__text, .pmb-feature__sub + .pmb-feature__text {
  margin-top: 0.55rem;
}

.pmb-features--boxed {
  --pmb-features-gap: var(--space-m);
}
.pmb-features--boxed .pmb-feature {
  background: var(--surface-card);
  border: var(--border-width) solid color-mix(in srgb, var(--scheme-ink) 6%, transparent);
  border-radius: var(--radius-m);
  box-shadow: var(--shadow);
  padding: var(--space-m);
  transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.pmb-features--boxed .pmb-feature:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-hover);
}

/* --- QUOTE variante LISTE (temoignages : citations courtes centrees) --- */
.pmb-quote--list {
  --pmb-quote-gap: var(--space-l);
  text-align: center;
}
.pmb-quote--list .pmb-quote__head {
  max-width: 720px;
  margin: 0 auto var(--space-l);
}
.pmb-quote--list .pmb-quote__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--pmb-quote-gap);
}
.pmb-quote--list .pmb-quote__item {
  max-width: 720px;
  margin-inline: auto;
}
.pmb-quote--list .pmb-quote {
  position: relative;
  margin: 0;
  border: 0;
  padding: 0;
  background: none;
  border-radius: 0;
  font-style: normal;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  line-height: 1.3;
  color: var(--color-text);
}
.pmb-quote--list .pmb-quote::before {
  content: "“";
  display: block;
  font-family: Georgia, serif;
  font-size: 3rem;
  line-height: 0.5;
  color: var(--color-primary);
  margin-bottom: 0.35rem;
}
.pmb-quote--list .pmb-quote__author {
  display: block;
  margin-top: 0.6rem;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 600;
  font-style: normal;
  font-size: var(--fs-s);
  color: var(--text-accent-label);
}

/* --- TIMELINE : ligne verticale + etapes alternees G/D --- */
.pmb-timeline {
  --pmb-timeline-line-color: var(--color-primary);
  --pmb-timeline-dot-size: 16px;
  --pmb-timeline-card-bg: var(--surface-card);
}
.pmb-timeline__head {
  text-align: center;
  max-width: 720px;
  margin: 0 auto var(--space-xl);
}
.pmb-timeline__track {
  position: relative;
  list-style: none;
  margin: 0;
  padding: 0;
}
.pmb-timeline__line {
  position: absolute;
  top: 4px;
  bottom: 4px;
  left: 20px;
  width: 3px;
  border-radius: 3px;
  background: var(--pmb-timeline-line-color);
  transform-origin: top center;
}
@media (min-width: 1025px) {
  .pmb-timeline__line {
    left: 50%;
    transform: translateX(-50%);
  }
}
.pmb-timeline__step {
  position: relative;
  padding-left: 52px;
  margin-bottom: var(--space-l);
}
.pmb-timeline__step:last-child {
  margin-bottom: 0;
}
.pmb-timeline__dot {
  position: absolute;
  top: 8px;
  z-index: 2;
  left: 20px;
  transform: translateX(-50%);
  width: var(--pmb-timeline-dot-size);
  height: var(--pmb-timeline-dot-size);
  border-radius: 50%;
  background: var(--pmb-timeline-line-color);
  box-shadow: 0 0 0 4px var(--surface-section);
}
.pmb-timeline__card {
  background: var(--pmb-timeline-card-bg);
  text-align: left;
  border: var(--border-width) solid color-mix(in srgb, var(--scheme-ink) 8%, transparent);
  border-radius: var(--radius-m);
  box-shadow: var(--shadow);
  padding: var(--space-m);
}
.pmb-timeline__img {
  display: block;
  width: 100%;
  aspect-ratio: 4/3;
  object-fit: cover;
  border-radius: var(--radius-s);
  margin-bottom: var(--space-s);
}
.pmb-timeline__title {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 0.4rem;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--text-heading-sub);
}
.pmb-timeline__icon {
  font-size: 1.35em;
  line-height: 1;
  flex: none;
}
.pmb-timeline .pmb-prose {
  color: var(--text-prose);
  line-height: 1.6;
  font-size: var(--fs-m);
}
@media (min-width: 1025px) {
  .pmb-timeline .pmb-timeline__step {
    width: 50%;
    box-sizing: border-box;
    padding-left: 0;
  }
  .pmb-timeline .pmb-timeline__step:nth-of-type(odd) {
    padding-right: calc(var(--space-l) + 18px);
  }
  .pmb-timeline .pmb-timeline__step:nth-of-type(even) {
    margin-left: 50%;
    padding-left: calc(var(--space-l) + 18px);
  }
  .pmb-timeline .pmb-timeline__step:nth-of-type(odd) .pmb-timeline__dot {
    left: auto;
    right: 0;
    transform: translateX(50%);
  }
  .pmb-timeline .pmb-timeline__step:nth-of-type(even) .pmb-timeline__dot {
    left: 0;
    transform: translateX(-50%);
  }
}

/* --- GALLERY : grille / mosaique + lightbox --- */
.pmb-gallery {
  --pmb-gallery-cols: 3;
  --pmb-gallery-gap: var(--space-s);
  --pmb-gallery-radius: var(--radius-m);
}
.pmb-gallery--2col {
  --pmb-gallery-cols: 2;
}
.pmb-gallery--3col {
  --pmb-gallery-cols: 3;
}
.pmb-gallery--4col {
  --pmb-gallery-cols: 4;
}
.pmb-gallery__head {
  text-align: center;
  max-width: 720px;
  margin: 0 auto var(--space-l);
}
.pmb-gallery__item {
  margin: 0;
}
.pmb-gallery__open {
  display: block;
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  cursor: zoom-in;
  border-radius: var(--pmb-gallery-radius);
  overflow: hidden;
  line-height: 0;
}
.pmb-gallery__open:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 3px;
}
.pmb-gallery__open img {
  display: block;
  width: 100%;
  height: auto;
  transition: transform 0.4s ease;
}
.pmb-gallery__open:hover img {
  transform: scale(1.05);
}
.pmb-gallery__cap {
  margin-top: 0.4rem;
  font-size: var(--fs-s);
  color: var(--text-subtle);
  text-align: center;
}
.pmb-gallery--grid .pmb-gallery__grid {
  display: grid;
  gap: var(--pmb-gallery-gap);
  grid-template-columns: repeat(2, 1fr);
}
@media (min-width: 768px) {
  .pmb-gallery--grid .pmb-gallery__grid {
    grid-template-columns: repeat(var(--pmb-gallery-cols), 1fr);
  }
}
.pmb-gallery--grid .pmb-gallery__grid .pmb-gallery__open img {
  aspect-ratio: 4/3;
  height: 100%;
  object-fit: cover;
}
.pmb-gallery--masonry .pmb-gallery__grid {
  columns: 2;
  column-gap: var(--pmb-gallery-gap);
}
@media (min-width: 768px) {
  .pmb-gallery--masonry .pmb-gallery__grid {
    columns: var(--pmb-gallery-cols);
  }
}
.pmb-gallery--masonry .pmb-gallery__grid .pmb-gallery__item {
  break-inside: avoid;
  margin-bottom: var(--pmb-gallery-gap);
}

/* Lightbox (overlay injecte par le JS -- initGallery) */
.pmb-lightbox {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.92);
  padding: var(--space-l);
}
.pmb-lightbox.is-open {
  display: flex;
}
.pmb-lightbox__img {
  width: auto;
  height: auto;
  max-width: 92vw;
  max-height: 86vh;
  object-fit: contain;
  border-radius: var(--radius-s);
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.5);
}
.pmb-lightbox__cap {
  position: absolute;
  bottom: 18px;
  left: 0;
  right: 0;
  text-align: center;
  color: #fff;
  font-size: var(--fs-s);
  opacity: 0.85;
}
.pmb-lightbox__btn {
  position: absolute;
  background: rgba(255, 255, 255, 0.12);
  color: #fff;
  border: 0;
  cursor: pointer;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.6rem;
  line-height: 1;
  transition: background 0.2s ease;
}
.pmb-lightbox__btn:hover {
  background: rgba(255, 255, 255, 0.25);
}
.pmb-lightbox__btn:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 2px;
}
.pmb-lightbox__close {
  top: 20px;
  right: 20px;
}
.pmb-lightbox__prev {
  left: 20px;
  top: 50%;
  transform: translateY(-50%);
}
.pmb-lightbox__next {
  right: 20px;
  top: 50%;
  transform: translateY(-50%);
}
@media (max-width: 767px) {
  .pmb-lightbox .pmb-lightbox__prev, .pmb-lightbox .pmb-lightbox__next {
    display: none;
  }
}

/* --- MARQUEE : titre/mot oversize defilant (droite -> gauche, moteur initMarquee) --- */
.pmb-marquee {
  --pmb-marquee-size: clamp(3rem, 10vw, 9rem);
  --pmb-marquee-speed: 30s;
  --pmb-marquee-gap: .3em;
  overflow: hidden;
}
.pmb-marquee__track {
  display: flex;
  flex-wrap: nowrap;
  white-space: nowrap;
  width: max-content;
  will-change: transform;
}
.pmb-marquee__unit {
  display: inline-flex;
  align-items: center;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-marquee-size);
  line-height: 1.05;
  color: var(--color-text);
  text-transform: uppercase;
}
.pmb-marquee__sep {
  font-style: normal;
  color: var(--color-primary);
  padding: 0 var(--pmb-marquee-gap);
}
.pmb-marquee--outline .pmb-marquee__unit {
  color: transparent;
  -webkit-text-stroke: 2px var(--color-text);
}

/* --- SLIDER : slides pleine largeur (moteur carousel --slider) --- */
.pmb-slider {
  position: relative;
}

.pmb-carousel--slider {
  --pmb-slider-min-height: 72vh;
}
.pmb-carousel--slider .pmb-carousel__viewport {
  padding: 0;
}
.pmb-carousel--slider .pmb-carousel__track {
  gap: 0;
}
.pmb-carousel--slider .pmb-carousel__nav {
  background: rgba(255, 255, 255, 0.9);
  color: var(--color-text);
}
.pmb-carousel--slider .pmb-carousel__nav--prev {
  left: 20px;
}
.pmb-carousel--slider .pmb-carousel__nav--next {
  right: 20px;
}
.pmb-carousel--slider .pmb-carousel__nav:hover:not(:disabled) {
  background: #fff;
}
.pmb-carousel--slider .pmb-carousel__dots {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 20px;
  margin: 0;
  z-index: 3;
}

.pmb-carousel--band {
  --pmb-slider-min-height: 44vh;
}

.pmb-slide {
  position: relative;
  flex: 0 0 100%;
  box-sizing: border-box;
  min-height: var(--pmb-slider-min-height);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-xxl) var(--space-l);
  text-align: center;
  overflow: hidden;
  background-size: cover;
  background-position: center;
  color: var(--color-text);
}
.pmb-slide--dark {
  color: #fff;
}
.pmb-slide__overlay {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.45);
}
.pmb-slide__inner {
  position: relative;
  z-index: 1;
  max-width: 820px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-s);
}
.pmb-slide__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2rem, 1.2rem + 3.4vw, 3.75rem);
  line-height: 1.08;
  letter-spacing: var(--pmb-tracking-head);
  color: inherit;
  margin: 0;
}
.pmb-slide__title .color-primary, .pmb-slide__title span {
  color: var(--color-primary);
}
.pmb-slide__text {
  font-size: var(--pmb-fs-lead);
  line-height: 1.5;
  margin: 0;
  color: inherit;
  opacity: 0.95;
  max-width: 60ch;
}

/* --- CAROUSEL de cartes (pm-carousel) --- */
.pmb-carousel-section {
  --pmb-carousel-visible: 3;
  --pmb-carousel-card-radius: var(--radius-m);
  --pmb-carousel-image-shape: 4 / 3;
}
.pmb-carousel-section .pmb-carousel__slide {
  flex: 0 0 calc((100% - (var(--pmb-carousel-visible) - 1) * var(--space-m)) / var(--pmb-carousel-visible));
}
@media (max-width: 767px) {
  .pmb-carousel-section .pmb-carousel__slide {
    flex-basis: 82%;
  }
}

.pmb-carousel__card {
  background: var(--surface-card);
  overflow: hidden;
  width: 100%;
  border: var(--border-width) solid color-mix(in srgb, var(--scheme-ink) 6%, transparent);
  border-radius: var(--pmb-carousel-card-radius);
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
  text-align: left;
  transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.pmb-carousel__card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-hover);
}
.pmb-carousel__card-media {
  position: relative;
  aspect-ratio: var(--pmb-carousel-image-shape);
  overflow: hidden;
}
.pmb-carousel__card-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.pmb-carousel__card-body {
  padding: var(--space-m);
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  flex: 1;
}
.pmb-carousel__card-title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: var(--pmb-fs-h3);
  color: var(--color-text);
  margin: 0;
}
.pmb-carousel__card-text {
  font-size: var(--fs-s);
  color: var(--text-subtle);
  line-height: 1.55;
  margin: 0;
}
.pmb-carousel__card-link {
  margin-top: auto;
  padding-top: 0.5rem;
  font-weight: 600;
  color: var(--color-primary);
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
}
.pmb-carousel__card-link span {
  transition: transform 0.2s ease;
}
.pmb-carousel__card-link:hover span {
  transform: translateX(3px);
}

.pmb-carousel__badge {
  position: absolute;
  top: 10px;
  left: 10px;
  z-index: 2;
  background: var(--color-primary);
  color: var(--color-on-primary);
  font-size: var(--fs-xs);
  font-weight: 700;
  letter-spacing: 0.03em;
  padding: 0.3em 0.7em;
  border-radius: var(--radius-s);
}

.pmb--scheme-light {
  --surface-section: var(--color-surface);
  --surface-section-alt: var(--color-white);
  --surface-card: var(--color-white);
  --surface-field: var(--color-white);
  --text-prose: #4A3F44;
  --text-subtle: #6D6262;
  --text-heading: var(--color-secondary);
  --text-heading-sub: var(--color-accent);
  --text-accent-label: var(--color-primary);
  --divider: rgba(172, 98, 89, 0.2);
  --scheme-ink: #3E3338;
  color: var(--text-prose);
}

.pmb--scheme-dark {
  --surface-section: #01334D;
  --surface-section-alt: #01222F;
  --surface-card: #073F5C;
  --surface-field: #073F5C;
  --text-prose: #FDE7E8;
  --text-subtle: rgba(253, 231, 232, 0.72);
  --text-heading: #FFFFFF;
  --text-heading-sub: var(--color-highlight);
  --text-accent-label: var(--color-highlight);
  --divider: rgba(253, 231, 232, 0.18);
  --scheme-ink: #FDE7E8;
  color: var(--text-prose);
}

.pmb--scheme-brand {
  --surface-section: transparent;
  --surface-section-alt: transparent;
  --surface-card: rgba(255, 255, 255, 0.12);
  --surface-field: rgba(255, 255, 255, 0.12);
  --text-prose: var(--color-on-primary);
  --text-subtle: var(--color-on-primary);
  --text-heading: var(--color-on-primary);
  --text-heading-sub: var(--color-on-primary);
  --text-accent-label: var(--color-on-primary);
  --divider: rgba(0, 0, 0, 0.15);
  --scheme-ink: var(--color-on-primary);
  color: var(--text-prose);
}

.pmb--bg-color {
  background-color: var(--pmb-bg-color);
}

.pmb--bg-image {
  position: relative;
  isolation: isolate;
  overflow: hidden;
}
.pmb--bg-image .pmb__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  background: var(--pmb-bg-image) center/cover no-repeat;
}
.pmb--bg-image > .pmb-inner {
  position: relative;
  z-index: 1;
}

.pmb--overlay-dark .pmb__bg::after,
.pmb--overlay-light .pmb__bg::after,
.pmb--overlay-gradient .pmb__bg::after {
  content: "";
  position: absolute;
  inset: 0;
}

.pmb--overlay-dark .pmb__bg::after {
  background: rgba(1, 34, 47, 0.58);
}

.pmb--overlay-light .pmb__bg::after {
  background: rgba(253, 231, 232, 0.55);
}

.pmb--overlay-gradient .pmb__bg::after {
  background: linear-gradient(180deg, rgba(1, 34, 47, 0.1), rgba(1, 34, 47, 0.72));
}

@media (min-width: 1025px) {
  .pmb--reverse .pmb-intro__grid > *:first-child,
  .pmb--reverse .pmb-snippet__grid > *:first-child,
  .pmb--reverse .pmb-quote-section__grid > *:first-child,
  .pmb--reverse .pmb-magazine__grid > *:first-child,
  .pmb--reverse .pmb-dual__grid > *:first-child {
    order: 2;
  }
  .pmb--reverse .pmb-intro__grid > *:nth-child(2),
  .pmb--reverse .pmb-snippet__grid > *:nth-child(2),
  .pmb--reverse .pmb-quote-section__grid > *:nth-child(2),
  .pmb--reverse .pmb-magazine__grid > *:nth-child(2),
  .pmb--reverse .pmb-dual__grid > *:nth-child(2) {
    order: 1;
  }
}

.pmb--full > .pmb-inner {
  max-width: none;
}

.pmb--pad-none {
  --pmb-section-y-mobile: 0;
  --pmb-section-y-tablet: 0;
  --pmb-section-y-desktop: 0;
}

.pmb--pad-compact {
  --pmb-section-y-mobile: var(--space-l);
  --pmb-section-y-tablet: var(--space-l);
  --pmb-section-y-desktop: var(--space-l);
}

.pmb--pad-large {
  --pmb-section-y-mobile: calc(var(--space-xxl) * 1.6);
  --pmb-section-y-tablet: calc(var(--space-xxl) * 1.6);
  --pmb-section-y-desktop: calc(var(--space-xxl) * 1.6);
}

.pmb--center {
  text-align: center;
}
.pmb--center > .pmb-inner {
  align-items: center;
}
.pmb--center .pmb-features__head {
  margin-inline: auto;
}

.pmb-timeline--card-light .pmb-timeline__card {
  --surface-section: var(--color-surface);
  --surface-section-alt: var(--color-white);
  --surface-card: var(--color-white);
  --surface-field: var(--color-white);
  --text-prose: #4A3F44;
  --text-subtle: #6D6262;
  --text-heading: var(--color-secondary);
  --text-heading-sub: var(--color-accent);
  --text-accent-label: var(--color-primary);
  --divider: rgba(172, 98, 89, 0.2);
  --scheme-ink: #3E3338;
  color: var(--text-prose);
  --pmb-timeline-card-bg: var(--surface-card);
}

.pmb-timeline--card-dark .pmb-timeline__card {
  --surface-section: #01334D;
  --surface-section-alt: #01222F;
  --surface-card: #073F5C;
  --surface-field: #073F5C;
  --text-prose: #FDE7E8;
  --text-subtle: rgba(253, 231, 232, 0.72);
  --text-heading: #FFFFFF;
  --text-heading-sub: var(--color-highlight);
  --text-accent-label: var(--color-highlight);
  --divider: rgba(253, 231, 232, 0.18);
  --scheme-ink: #FDE7E8;
  color: var(--text-prose);
  --pmb-timeline-card-bg: var(--surface-card);
}

.pmb--hover-tint .pmb-feature {
  transition: background-color 0.25s ease;
}
.pmb--hover-tint .pmb-feature:hover, .pmb--hover-tint .pmb-feature:focus-within {
  background-color: var(--color-primary-alpha);
}

@media (prefers-reduced-motion: reduce) {
  .pmb--hover-tint .pmb-feature {
    transition: none;
  }
}
/* ==========================================================================
   SITE CHROME -- header / footer natifs (sortie Elementor).
   Replique FIDELE de vesta-2026.test (mesure via CSS computed), 100% vars du kit.
   Couleurs source : header tout blanc (texte primary), social secondary,
   dropdown surface-alt ; footer = contact(image) / showroom(image) /
   colonnes(blanc) / copyright(secondary).
   ========================================================================== */
html body .site-main {
  max-width: none;
  width: 100%;
  margin: 0;
  padding: 0;
}

.site-header {
  display: contents;
}

/* --- TOP BAR (fond blanc, texte primary) --- */
.site-topbar {
  background: var(--surface-card);
  color: var(--color-primary);
  font-size: var(--fs-xs);
  border-bottom: 1px solid var(--divider);
}
.site-topbar a {
  color: inherit;
  text-decoration: none;
}
.site-topbar a:hover {
  color: var(--color-secondary);
}
.site-topbar__inner {
  max-width: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  padding: 0.5rem var(--space-xl);
  flex-wrap: wrap;
}
.site-topbar__right {
  display: flex;
  align-items: center;
  gap: 1.2rem;
}
.site-topbar__phone {
  font-weight: 700;
}

/* --- SOCIAL (carres : icone blanche sur fond primary) --- */
.site-social {
  display: inline-flex;
  gap: 0.4rem;
}

.site-social .site-social__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: var(--radius-m);
  background: var(--color-primary);
  color: #fff;
  transition: background 0.2s ease;
}
.site-social .site-social__link:hover {
  background: var(--color-secondary);
  color: #fff;
}

/* --- NAV (fond blanc, liens primary) --- */
.site-nav {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--surface-card);
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
}
.site-nav__inner {
  max-width: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.55rem var(--space-xl);
  position: relative;
}
.site-nav__brand {
  display: inline-flex;
  align-items: center;
}
.site-nav__logo {
  font-family: "Fraunces", Georgia, serif;
  font-weight: var(--e-global-typography-primary-font-weight, 700);
  font-size: 1.7rem;
  line-height: 1;
  color: var(--color-primary);
  text-decoration: none;
  display: inline-flex;
  flex-direction: column;
}
.site-nav__logo span {
  font-size: 0.6rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-secondary);
}
.site-nav .custom-logo-link {
  display: inline-flex;
  align-items: center;
  line-height: 0;
}
.site-nav .custom-logo-link img {
  display: block;
  height: auto;
  max-height: 42px;
  width: auto;
}
.site-nav__collapse {
  display: flex;
  align-items: center;
  gap: var(--space-m);
}
.site-nav__menu {
  display: flex;
  align-items: center;
  gap: var(--space-m);
  list-style: none;
  margin: 0;
  padding: 0;
}
.site-nav__menu a {
  color: var(--color-primary);
  text-decoration: none;
  font-weight: 500;
  font-size: var(--fs-s);
  letter-spacing: 0.005em;
  transition: color 0.2s ease;
}
.site-nav__menu a:hover, .site-nav__menu .current-menu-item > a, .site-nav__menu .current-menu-ancestor > a {
  color: var(--color-secondary);
}
.site-nav__menu .menu-item-has-children {
  position: relative;
}
.site-nav__menu .menu-item-has-children > a::after {
  content: "";
  display: inline-block;
  width: 0.42em;
  height: 0.42em;
  margin-left: 0.45em;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-2px) rotate(45deg);
}
.site-nav__menu .sub-menu {
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 240px;
  background: var(--surface-section-alt);
  box-shadow: 0 16px 36px rgba(0, 0, 0, 0.12);
  border-radius: 10px;
  padding: 0.5rem 0;
  list-style: none;
  margin: 0;
  z-index: 10;
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
}
.site-nav__menu .sub-menu li {
  display: block;
}
.site-nav__menu .sub-menu a {
  display: block;
  padding: 0.6rem 1.3rem;
  font-weight: 500;
}
.site-nav__menu .sub-menu a:hover {
  background: color-mix(in srgb, var(--scheme-ink) 4%, transparent);
  color: var(--color-secondary);
}
.site-nav__menu {
  /* `:focus-within` autant que `:hover` : le sous-menu est masque par
     `visibility: hidden`, ce qui le retire AUSSI de l'ordre de tabulation.
     Sans cette ligne, un visiteur au clavier ne peut atteindre aucune entree
     de sous-menu -- et l'element parent ne mene nulle part (href="#"). */
}
.site-nav__menu .menu-item-has-children:hover > .sub-menu,
.site-nav__menu .menu-item-has-children:focus-within > .sub-menu {
  opacity: 1;
  visibility: visible;
  transform: none;
}
.site-nav__menu .menu-item-home {
  display: none;
}
.site-nav__toggle {
  display: none;
}

/* --- BOUTON PILL secondary (CTA header + boutons promo footer), style source --- */
.site-nav .site-nav__cta,
.site-promo .pmb-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--color-secondary);
  color: #fff !important;
  font-weight: 600;
  text-decoration: none;
  border: 0;
  cursor: pointer;
  border-radius: var(--btn-radius);
  line-height: 1.2;
  transition: background 0.2s ease, transform 0.2s ease;
}
.site-nav .site-nav__cta:hover,
.site-promo .pmb-btn:hover {
  background: var(--color-primary);
  transform: translateY(-1px);
}

.site-nav .site-nav__cta {
  padding: 0.7em 1.6em;
  font-size: var(--fs-xs);
}

.site-promo .pmb-btn {
  padding: 1em 2.6em;
  font-size: var(--fs-s);
  box-shadow: 0 12px 30px rgba(0, 0, 0, 0.18);
}

/* --- NAV responsive : burger + drawer offscreen (slide depuis la droite), <= tablet --- */
body.nav-open {
  overflow: hidden;
}

@media (max-width: 1024px) {
  .site-nav__toggle {
    display: inline-flex;
    flex-direction: column;
    gap: 5px;
    cursor: pointer;
    background: none;
    border: 0;
    padding: 8px;
    position: relative;
    z-index: 130;
  }
  .site-nav__toggle span {
    display: block;
    width: 26px;
    height: 2px;
    border-radius: 2px;
    background: var(--color-primary);
    transition: transform 0.25s ease, opacity 0.25s ease;
  }
  .site-nav__collapse {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    z-index: 120;
    width: min(86vw, 340px);
    height: 100dvh;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: var(--space-xs);
    background: var(--surface-card);
    padding: calc(var(--space-xl) + 1rem) var(--space-l) var(--space-l);
    box-shadow: -24px 0 60px rgba(0, 0, 0, 0.22);
    transform: translateX(100%);
    transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);
    overflow-y: auto;
    overscroll-behavior: contain;
  }
  .site-nav.is-open .site-nav__collapse {
    transform: translateX(0);
  }
  .site-nav__backdrop {
    position: fixed;
    inset: 0;
    z-index: 110;
    background: color-mix(in srgb, var(--color-bg-darker) 50%, transparent);
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s ease, visibility 0.3s ease;
  }
  .site-nav.is-open .site-nav__backdrop {
    opacity: 1;
    visibility: visible;
  }
  .site-nav.is-open .site-nav__toggle span:nth-child(1) {
    transform: translateY(7px) rotate(45deg);
  }
  .site-nav.is-open .site-nav__toggle span:nth-child(2) {
    opacity: 0;
  }
  .site-nav.is-open .site-nav__toggle span:nth-child(3) {
    transform: translateY(-7px) rotate(-45deg);
  }
  .site-nav__menu {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
  }
  .site-nav__menu > li {
    border-bottom: 1px solid var(--divider);
  }
  .site-nav__menu .menu-item-home {
    display: block;
  }
  .site-nav__menu a {
    display: block;
    padding: 0.85rem 0;
    font-size: var(--fs-m);
  }
  .site-nav__menu .menu-item-has-children > a::after {
    float: right;
    margin-top: 0.5em;
  }
  .site-nav__menu .sub-menu {
    position: static;
    opacity: 1;
    visibility: visible;
    transform: none;
    min-width: 0;
    box-shadow: none;
    border-radius: 0;
    padding: 0 0 0.5rem 0.8rem;
    background: transparent;
  }
  .site-nav__menu .sub-menu a {
    padding: 0.5rem 0;
    font-size: var(--fs-s);
  }
  .site-nav .site-nav__cta {
    align-self: stretch;
    justify-content: center;
    margin-top: var(--space-m);
  }
}
/* Mouvement reduit : le tiroir s'ouvre et se ferme sans glissement ni fondu.
   Additif, aucune declaration existante n'est touchee. */
@media (prefers-reduced-motion: reduce) {
  .site-nav__collapse,
  .site-nav__backdrop,
  .site-nav__toggle span,
  [data-pmb-drawer-panel],
  [data-pmb-drawer-backdrop] {
    transition: none !important;
  }
}
/* ==========================================================================
   FOOTER -- jusqu'a 4 bandes successives :
   1) bande promo "cover"  2) bande promo "aside"  3) colonnes  4) copyright.
   Les deux bandes promo sont OPTIONNELLES (pilotees par la fiche client) : un
   fork qui ne les remplit pas n'a que les blocs 3 et 4.
   ========================================================================== */
/* --- BANDE PROMO, variante COVER (image plein cadre, contenu centre, texte clair) --- */
.site-promo--cover {
  background-color: var(--surface-section-alt);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  min-height: 600px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-xxl) var(--space-xl);
  text-align: center;
}
.site-promo--cover .site-promo__inner {
  max-width: 900px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-s);
}
.site-promo--cover .site-promo__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: var(--e-global-typography-primary-font-weight, 700);
  font-size: var(--fs-xl);
  line-height: 1.2;
  color: var(--color-surface-alt);
  margin: 0 0 var(--space-s);
}
.site-promo--cover .site-promo__desc {
  font-size: var(--fs-m);
  line-height: 1.6;
  color: #fff;
  margin: 0 0 var(--space-xs);
  max-width: 60ch;
}

/* --- BANDE PROMO, variante ASIDE (image a droite, contenu a gauche, titre primary) --- */
.site-promo--aside {
  background-color: var(--surface-section-alt);
  background-repeat: no-repeat;
  background-position: right center;
  background-size: auto 100%;
  min-height: 620px;
  display: flex;
  align-items: center;
  padding: var(--space-xxl) var(--space-xl);
}
.site-promo--aside .site-promo__inner {
  max-width: 1600px;
  margin-inline: auto;
  width: 100%;
}
.site-promo--aside .site-promo__text {
  max-width: 46%;
}
.site-promo--aside .site-promo__title {
  font-family: "Fraunces", Georgia, serif;
  font-weight: var(--e-global-typography-primary-font-weight, 700);
  font-size: var(--fs-xxxl);
  line-height: 1.1;
  color: var(--color-primary);
  margin: 0 0 var(--space-xs);
}
.site-promo--aside .site-promo__desc {
  font-size: var(--fs-m);
  line-height: 1.6;
  color: var(--color-text);
  margin: 0 0 var(--space-m);
}
@media (max-width: 1024px) {
  .site-promo--aside {
    background-image: none !important;
  }
  .site-promo--aside .site-promo__text {
    max-width: 100%;
  }
}

/* --- BLOC 3 : FOOTER COLONNES (fond blanc, texte fonce) --- */
.site-footer {
  background: var(--surface-card);
  color: var(--color-text);
  padding: 72px var(--space-xl);
}
.site-footer a {
  color: var(--color-text);
  text-decoration: none;
  transition: color 0.2s ease;
}
.site-footer a:hover {
  color: var(--color-primary);
}
.site-footer__inner {
  max-width: 1600px;
  margin-inline: auto;
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-l);
}
@media (min-width: 768px) {
  .site-footer__inner {
    grid-template-columns: 1fr 1fr;
  }
}
@media (min-width: 1025px) {
  .site-footer__inner {
    grid-template-columns: var(--footer-tracks, 1.6fr 1fr 1fr 1.3fr);
    gap: var(--space-xl);
  }
}
.site-footer__logo {
  font-family: "Fraunces", Georgia, serif;
  font-weight: var(--e-global-typography-primary-font-weight, 700);
  font-size: 1.7rem;
  color: var(--color-primary);
  text-decoration: none;
  display: inline-flex;
  flex-direction: column;
  line-height: 1;
}
.site-footer__logo span {
  font-size: 0.6rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-secondary);
}
.site-footer__logo img {
  max-width: var(--logo-footer-max, 190px);
  height: auto;
  display: block;
}
.site-footer__tagline {
  font-size: var(--fs-s);
  line-height: 1.6;
  max-width: 42ch;
  margin: 0.9rem 0 1.1rem;
}
.site-footer__title {
  color: var(--color-primary);
  font-family: "Fraunces", Georgia, serif;
  font-weight: var(--e-global-typography-primary-font-weight, 700);
  font-size: var(--fs-m);
  margin: 0 0 1rem;
}
.site-footer__menu, .site-footer__contact {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  font-size: var(--fs-s);
}
.site-footer .site-social {
  margin-top: 1rem;
}

/* --- BLOC 4 : COPYRIGHT (fond secondary, texte blanc) --- */
.site-footer__bottom {
  background: var(--color-secondary);
  color: #fff;
  font-size: var(--fs-xs);
}
.site-footer__bottom-inner {
  max-width: 1600px;
  margin-inline: auto;
  padding: 0.9rem var(--space-xl);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  flex-wrap: wrap;
}
.site-footer__bottom p {
  margin: 0;
}
.site-footer__bottom a {
  color: #fff;
  text-decoration: none;
  margin-left: 1.2rem;
}
.site-footer__bottom a:hover {
  text-decoration: underline;
}
.site-footer__bottom .site-footer__legal a:first-child {
  margin-left: 0;
}
.site-footer__bottom .site-footer__credit a {
  margin-left: 0.35rem;
  text-decoration: underline;
}

/* --- Page 404 (W-73) -----------------------------------------------------
   Il n'y avait aucune 404 : WordPress retombait sur l'index.php du parent.
   Tokens uniquement, aucune valeur de marque : un fork qui change ses jetons
   change cette page sans y toucher. */
.proto-404 {
  text-align: center;
}
.proto-404__code {
  margin: 0 0 var(--space-s);
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  /* Un nombre qui sert de signal visuel, pas de texte a lire : il est
     donc `aria-hidden` cote markup, et discret ici. */
  font-size: var(--fs-xxxl);
  line-height: 1;
  color: var(--color-primary);
  opacity: 0.35;
}
.proto-404__title {
  margin: 0 0 var(--space-s);
}
.proto-404__text {
  margin: 0 auto var(--space-l);
  max-width: 52ch;
  color: var(--text-prose);
}
.proto-404__search {
  margin-bottom: var(--space-l);
}
.proto-404__search input[type=search] {
  min-width: min(100%, 22rem);
}
.proto-404__links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-xs);
  margin-bottom: var(--space-l);
}
.proto-404__link {
  padding: var(--space-xs) var(--space-s);
  border: var(--border-width) solid var(--divider);
  border-radius: var(--radius-l);
  color: var(--text-prose);
  text-decoration: none;
  font-size: var(--fs-s);
}
.proto-404__link:hover {
  border-color: var(--color-primary);
}
.proto-404__home {
  margin: 0;
}

/* ---------------------------------------------------------------------------
   Retour en haut de page
   Pastille en bas a gauche, absente tant que le defilement est court. Elle
   n'apparait pas par `display` mais par opacite et deplacement : le JS retire
   `hidden` une fois pour toutes, et la transition fait le reste -- une bascule
   de `display` ne peut pas s'animer.
   Tokens uniquement : un fork qui change sa palette la suit sans y toucher.
--------------------------------------------------------------------------- */
.proto-scrolltop {
  position: fixed;
  z-index: 10000;
  left: var(--space-s);
  /* AU-DESSUS DE CE QUI OCCUPE LE BAS DE L'ECRAN. Le sommaire est une barre
     collante en pied de fenetre : sans cela le bouton empiete dessus. La
     hauteur n'est pas ecrite en dur -- le script la MESURE et la pose ici,
     de sorte qu'une barre plus haute (ou son absence) est suivie sans
     retoucher le style. Le repli vaut 0 : sans barre, le bouton reste bas. */
  bottom: calc(var(--space-s) + var(--proto-barre-basse, 0px));
  inline-size: 46px;
  block-size: 46px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: var(--border-width) solid var(--color-primary);
  border-radius: 50%;
  background: var(--color-surface);
  color: var(--color-primary);
  cursor: pointer;
  box-shadow: var(--shadow);
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 0.2s ease, transform 0.2s ease, background-color 0.2s ease, color 0.2s ease;
}
.proto-scrolltop[hidden] {
  display: none;
}
.proto-scrolltop.is-visible {
  opacity: 1;
  transform: translateY(0);
}
.proto-scrolltop svg {
  display: block;
}
.proto-scrolltop:hover, .proto-scrolltop:focus-visible {
  background: var(--color-primary);
  color: var(--color-on-primary);
}
.proto-scrolltop:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 3px;
}
@media (prefers-reduced-motion: reduce) {
  .proto-scrolltop {
    transition: none;
    transform: none;
  }
  .proto-scrolltop.is-visible {
    transform: none;
  }
}

/* ==========================================================================
   CLIENT TYPOGRAPHY -- hook de personnalisation du fork.
   VIDE dans le template. Importe en DERNIER dans app.scss : ses regles
   gagnent sur les modules, ce qui permet de rester ADDITIF.

   FORK : LES ATELIERS MAISON MARIA STELLA.

   Ce fichier ne pose pas un gout, il PORTE LES PROCEDES que la cliente emploie
   deja dans sa communication imprimee, releves sur son logo, son affiche A3 et
   son programme d'ete : `proto/design-refs/maison-maria-stella/RELEVE.md`.

     1. le TITRE-AFFICHE      (lignes empilees, chacune dans son aplat)
     2. le MOT PORTEUR        (un mot en couleur dans un titre courant)
     3. la CARTE DE COULEUR   (aplat decale derriere les photos)
     4. les ETIQUETTES        (rectangles pleins, capitales espacees)
     5. les PICTOGRAMMES      (au trait, jamais d'emoji)

   On les porte, on ne les invente pas.
   ========================================================================== */
/* --------------------------------------------------------------------------
   1. LE TITRE-AFFICHE
   --------------------------------------------------------------------------
   LE procede central de la refonte, et la correction d'une erreur de lecture.

   CE QUI AVAIT ETE MAL COMPRIS : le « titre a deux niveaux » avait ete rendu
   comme un mot enorme POSE AU MILIEU d'une phrase, et le surlignage comme un
   coup de marqueur sur ce mot. Ni l'un ni l'autre n'est ce que montrent les
   references.

   CE QUE MONTRENT REELLEMENT LES DEUX SOURCES, et elles disent la meme chose :
   - son programme d'ete : « les ateliers » sur UNE LIGNE, petit, bleu petrole,
     puis « ARTS PLASTIQUES » sur LA LIGNE SUIVANTE, enorme, magenta.
   - l'affiche « Out of Office Day » : « Out of » dans un aplat, retour a la
     ligne, « Office Day » dans un second aplat d'une autre couleur, decale.
   Dans les deux cas, l'unite n'est pas le MOT, c'est LA LIGNE. Chaque ligne
   porte son aplat, sa couleur, sa taille, et les lignes se decalent.

   C'est aussi ce qui reglait, sans qu'on le voie, le probleme d'echelle : un
   ecart de corps de 1 a 3 est juste entre deux LIGNES, et laid entre deux mots
   d'une meme phrase.

   LARGEUR AU TEXTE : `display: table` donne a chaque ligne la largeur exacte de
   son contenu, sans passer par `fit-content` (que le retour a la ligne d'un
   inline-block ne respecte pas) et sans creer de contexte d'empilement, qui
   casserait le fondu des lettres evidees (voir plus bas).
   -------------------------------------------------------------------------- */
.mms-aff__l {
  display: table;
  width: auto;
  padding: 0.04em 0.3em 0.16em;
  border-radius: 0;
  line-height: 1.02;
  /* UNE LIGNE D'AFFICHE NE SE REPLIE PAS.
     Sans cela, `display: table` prend bien la largeur du contenu, mais un
     texte trop long pour la colonne se replie a l'interieur : l'aplat
     devient un grand rectangle et le procede s'effondre (mesure en capture,
     « ENFANTS ET ADO » sur deux lignes dans un pave rose). Le decoupage en
     lignes est un choix d'auteur, pas un effet de la largeur disponible. */
  white-space: nowrap;
}

.mms-aff__l {
  /* ROTATION TERRACOTTA -> BLEU PETROLE -> MAGENTA, ENCRE CONSTANTE.
     Reprise du remix valide par Jonathan le 2026-08-05. La version
     precedente donnait a chaque ligne un couple fond/encre different
     (abricot+bleu, bleu+rose, magenta+blanc) : trois systemes empiles, que
     l'oeil lit comme trois etiquettes sans rapport.
     Ici l'encre ne bouge JAMAIS -- c'est elle qui fait tenir le titre
     ensemble pendant que le fond change. Contrastes, calcules sur les
     luminances du releve :
       rose pale sur terracotta   4,4:1  -- gros titres uniquement, ce qui est
                                           precisement le cas ici
       rose pale sur bleu petrole 13,7:1
       rose pale sur magenta       6,4:1 */
  color: var(--color-surface);
}
.mms-aff__l:nth-child(3n+1) {
  background: var(--color-primary);
}
.mms-aff__l:nth-child(3n+2) {
  background: var(--color-secondary);
  margin-left: 1.6rem;
}
.mms-aff__l:nth-child(3n+3) {
  background: var(--color-accent);
  margin-left: calc(1.6rem * 2);
}
.mms-aff__l {
  /* UN PETIT ESPACE ENTRE LES APLATS, PAS UN CHEVAUCHEMENT.
     Premiere version : les lignes se recouvraient de .06em, ce qui les
     soudait en un pave. Mesure sur la reference (2026-08-05) : les aplats y
     sont separes de **4px pour un corps de 96px**, soit .042em. C'est ce
     filet de fond qui detache les lignes et donne sa nettete au bloc. */
}
.mms-aff__l + .mms-aff__l {
  margin-top: 0.042em;
}

/* UNE SEULE POLICE QUAND LE TITRE EST SUR UNE IMAGE.
   Consigne de Jonathan, 2026-08-05 : on ne melange plus les polices sur une
   image ; le melange reste autorise sur fond clair, ou l'oeil a le calme
   necessaire pour le lire comme une intention.
   Sur une photo, deux polices dans un meme titre se lisent comme un accident.

   LES VALEURS SONT MESUREES SUR LA REFERENCE, pas estimees : Anton a 96px,
   `line-height` a 96px (donc exactement 1), padding 8px / 24px. Rapporte au
   corps, cela donne .085em et .25em -- et une hauteur d'aplat de 112px, que
   l'on retrouve bien. La taille passe par une variable pour qu'un h2 de
   section ne herite pas de l'echelle d'un h1 de page. */
.mms-aff--mono .mms-aff__l {
  font-family: "Anton", Impact, sans-serif;
  font-weight: 400;
  text-transform: uppercase;
  font-size: var(--mms-aff-taille, clamp(1.9rem, 4.6vw, 4rem));
  letter-spacing: 0.005em;
  line-height: 1;
  padding: 0.085em 0.25em;
}

/* La ligne d'IMPACT : c'est ICI qu'Anton vit, et nulle part ailleurs.
   Anton n'existe qu'en 400 (le theme pose `font-synthesis: none`, lui demander
   un 700 ne ferait rien) et elle est CONDENSEE : a corps egal elle parait plus
   courte que Fraunces, d'ou l'agrandissement, qui retablit l'equilibre optique
   plutot qu'il ne grossit le mot. */
.mms-aff__l--impact {
  font-family: "Anton", Impact, sans-serif;
  font-weight: 400;
  text-transform: uppercase;
  /* `min()` est la CONTREPARTIE de `white-space: nowrap` : la ligne ne
     pouvant plus se replier, c'est sa taille qui doit ceder quand l'ecran
     retrecit, sinon elle deborde et provoque un defilement horizontal.
     La borne en `vw` est calibree sur la ligne la plus longue de l'accueil
     (« ET LE TEMPS QUI RALENTIT »), verifiee a 375 px. */
  /* Meme correctif que pour la ligne courante : `1.62em` renvoyait a la taille
     heritee, pas a `--mms-aff-taille`. Le repli garde le comportement d'avant. */
  font-size: min(var(--mms-aff-taille, 1em) * 1.62, 11.5vw);
  letter-spacing: 0.005em;
  line-height: 0.96;
  padding-bottom: 0.1em;
}

/* Meme raison pour les lignes courantes, en serif : elles sont moins hautes,
   donc la borne est plus basse.

   `--mms-aff-taille` EST LUE ICI, ET ELLE NE L'ETAIT PAS (corrige le 2026-08-07).
   Cette regle et `.mms-aff--mono .mms-aff__l` ont EXACTEMENT la meme specificite
   (0,2,0) : `:not()` ne compte pas, mais l'argument qu'il contient compte comme
   une classe. A egalite, c'est l'ordre qui tranche, et celle-ci est declaree
   apres -- elle gagnait donc toujours, avec son `1em` qui renvoie a la taille
   HERITEE du titre, jamais a la variable.

   Consequence, restee invisible : `.mms-hero__titre` posait
   `--mms-aff-taille: clamp(2.35rem, 6.6vw, 6rem)` avec un commentaire annoncant
   « 96px a 1440 », et le titre mesurait 67,2px -- la taille par defaut d'un h1.
   La declaration etait morte-nee. Meme famille que la cascade du pied de page.

   Le repli `1em` garde le comportement d'avant partout ou la variable n'est pas
   posee : ce correctif ne grossit QUE les titres qui l'avaient demande. */
.mms-aff__l:not(.mms-aff__l--impact) {
  font-size: min(var(--mms-aff-taille, 1em), 7vw);
}

/* Le titre qui porte des lignes-affiche n'a plus besoin de l'interlignage d'un
   titre courant : chaque ligne apporte le sien. */
.pmb-hero__title:has(.mms-aff__l),
.pmb-h2:has(.mms-aff__l),
.pmb-cover__title:has(.mms-aff__l),
.pmb-cta__title:has(.mms-aff__l) {
  line-height: 1;
  letter-spacing: -0.005em;
}

/* --- LES LETTRES EVIDEES, quand le titre est pose sur une photo -------------
   Sur l'affiche de reference, les lettres ne sont pas encrees : elles sont
   DECOUPEES dans l'aplat, et c'est la photo qui se voit au travers.

   POURQUOI CE N'EST PAS FAIT EN CSS, et la mesure qui l'a tranche :
   `mix-blend-mode: lighten` rend exactement cet effet et fut la premiere
   implementation. Elle ne marche pas ici. Un blend se calcule dans le CONTEXTE
   D'EMPILEMENT du parent, or `.pmb-hero__inner` porte
   `position: relative; z-index: 2` -- et un z-index sur un element positionne
   en CREE un. Le titre s'y retrouve isole de la photo, peinte un cran
   au-dessus sur la `<section>` : le backdrop est transparent,
   `lighten(noir, transparent)` vaut noir, et on obtient des lettres NOIRES
   OPAQUES sans la moindre erreur.

   Un masque SVG, lui, produit de la vraie transparence alpha et se moque des
   contextes d'empilement : c'est `assets/fork/affiche.js` qui le pose.

   ETAT PAR DEFAUT = LE REPLI. Les regles ci-dessous rendent un aplat plein
   avec des lettres en bleu petrole : parfaitement lisible si le JS ne
   s'execute pas. C'est la classe `.mms-evide-actif`, posee par le script une
   fois les masques en place, qui efface l'aplat et l'encre CSS pour laisser
   voir le SVG. Jamais l'inverse : rien ne doit dependre du JS pour rester
   lisible. */
.mms-aff--evide .mms-aff__l {
  position: relative;
  color: var(--color-secondary);
  background: var(--color-highlight);
}

.mms-aff--evide .mms-aff__l:nth-child(3n+2) {
  background: var(--color-surface);
}

.mms-aff--evide .mms-aff__l:nth-child(3n+3) {
  background: var(--color-white);
}

/* Le masque est en place : l'aplat et l'encre passent au SVG. Le texte reste
   dans le DOM (lecteurs d'ecran, moteurs), simplement transparent -- c'est lui
   qui continue de donner sa largeur et sa hauteur a la boite. */
.mms-evide-actif .mms-aff--evide .mms-aff__l {
  background: transparent;
  color: transparent;
}

.mms-aff__svg {
  position: absolute;
  inset: 0;
  display: block;
  pointer-events: none;
}

/* --------------------------------------------------------------------------
   2. LE MOT PORTEUR, dans un titre courant
   --------------------------------------------------------------------------
   Tous les titres ne sont pas des affiches. Pour les titres courants, un seul
   mot prend la couleur, ET RIEN D'AUTRE.

   CORRECTION DU 2026-08-05 : ce mot etait auparavant bascule en Anton
   capitales et agrandi de 12 %. Pose au milieu d'une phrase en serif, l'ecart
   de corps et de dessin etait laid -- juge sur capture, et a juste titre.
   Anton est un choix de LIGNE, pas de mot. Ici, seule la couleur change.

   LE VEHICULE EST `.mms-mot`, PAS `.color-primary`. Mesure du 2026-08-05 :
   `.color-primary` n'est pas une classe semantique mais un UTILITAIRE genere
   avec `!important` (`mixins/_mixins.scss`). Aucune regle sans `!important` ne
   peut donc le recolorer : les regles de couleur ecrites en session 2
   compilaient, matchaient l'element, et n'ont JAMAIS rien colore. Le defaut de
   fond est consigne en A6 de `proto/REMONTEES-TEMPLATE.md`.
   -------------------------------------------------------------------------- */
/* Sur fond clair, le mot prend le MAGENTA de ses sous-titres, pas le
   terracotta : c'est le contraste qu'elle emploie, et le magenta tient 6,8:1
   sur blanc quand le terracotta n'est qu'a 4,5:1. */
.pmb-hero__title .mms-mot,
.pmb-h2 .mms-mot {
  color: var(--color-accent);
}

/* Sur une section peinte ou une image, l'encre de marque redevient necessaire :
   le magenta sur terracotta serait illisible. */
.pmb-cover__title .mms-mot,
.pmb-cta__title .mms-mot,
.pmb--scheme-brand .pmb-h2 .mms-mot,
.pmb--has-bg .pmb-h2 .mms-mot,
.pmb--has-bg .pmb-hero__title .mms-mot {
  color: var(--color-on-primary);
}

/* --------------------------------------------------------------------------
   3. LA CARTE DE COULEUR DECALEE DERRIERE LA PHOTO
   --------------------------------------------------------------------------
   Sur son affiche A3, la photo des enfants repose sur un aplat magenta
   legerement decale vers le haut a gauche. C'est SON relief : pas une ombre
   portee, un aplat franc. Ses documents ne portent aucune ombre.

   Rendu en `::before` : aucun element ajoute au DOM, donc aucune modification
   du PHP. `z-index: 0` sur le media et `-1` sur l'aplat le posent derriere sans
   creer de contexte d'empilement qui piegerait la lightbox de la galerie.
   -------------------------------------------------------------------------- */
/* NE CIBLER QUE DE VRAIS CONTENEURS DE PHOTO.
   Mesure du 2026-08-05, apres DEUX erreurs de suite dues au nom des classes :
   ni `.pmb-intro__figure-wrap` ni `.pmb-figure` ne portent d'image.
   `.pmb-figure` est le CHIFFRE lui-meme (`<span data-pmb-count>10</span>`) :
   l'aplat le recouvrait et le « 10 » disparaissait.
   Le seul vrai conteneur de photo est `.pmb-media`.
   **Un nom de classe ne prouve rien : lire le DOM rendu avant de cibler.** */
.pmb-snippet .pmb-media {
  position: relative;
  z-index: 0;
}
.pmb-snippet .pmb-media::before {
  content: "";
  position: absolute;
  z-index: -1;
  top: -18px;
  left: -18px;
  width: 100%;
  height: 100%;
  background: var(--color-accent);
  border-radius: var(--radius-l);
  pointer-events: none;
}

@media (max-width: 782px) {
  .pmb-snippet .pmb-media::before {
    top: -10px;
    left: -10px;
  }
}
/* --------------------------------------------------------------------------
   4. LES ETIQUETTES RECTANGULAIRES
   --------------------------------------------------------------------------
   Ses coordonnees et ses prix sont poses dans des rectangles pleins, texte en
   capitales fortement espacees : « 3 RUE CHARLES DE SAINT AUBIN »,
   « 25 EUR LA DEMI-JOURNEE ». C'est son element d'interface le plus
   reconnaissable, et le socle rend deja des eyebrows : il suffit de les
   redresser. Le socle les rend en PILULE, on les remet a l'angle droit.
   -------------------------------------------------------------------------- */
.pmb-eyebrow {
  border-radius: 0;
  background: var(--color-highlight);
  color: var(--color-black);
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  padding: 0.5em 1.05em;
}

/* Posee sur une image ou une section peinte, l'etiquette abricot disparaitrait.
   La variante `--glass` du socle est deja prevue pour ce cas : on lui donne le
   terracotta plein plutot qu'un verre depoli, qui n'existe pas chez elle. */
.pmb-eyebrow--glass {
  background: var(--color-primary);
  color: var(--color-on-primary);
  backdrop-filter: none;
}

/* Le point anime du hero prend l'encre de l'etiquette qui le porte. */
.pmb-eyebrow__dot {
  background: currentColor;
}

/* --------------------------------------------------------------------------
   5. LES PICTOGRAMMES AU TRAIT, A LA PLACE DES EMOJI
   --------------------------------------------------------------------------
   Les emoji disaient CENTRE DE LOISIRS, exactement ce que Caroline proscrit,
   alors qu'elle a choisi elle-meme « un lieu haut de gamme, rare et precieux ».
   Ils sont remplaces par des pictogrammes Lucide, servis par le registre
   `proto_pmb_icone()` (inc/proto-native-blocks.php).

   DEUX REGLAGES, ET LEUR RAISON CHIFFREE.
   - La taille du socle (2,6rem) etait calibree pour un GLYPHE, pas pour un
     trait : un pictogramme de 41px au trait fait tache a cote d'une carte de
     texte. Ramene a 1,9rem, soit 30px, l'echelle d'une icone de carte.
   - L'epaisseur est ramenee de 1,8 a 1,3. Le trait rendu vaut alors
     1,3 x 30/24 = **1,65px**, la meme valeur que les icones de contact du
     socle (1,8 a 20px = 1,5px). Sans ce reglage, le trait montait a 3,1px et
     le pictogramme paraissait gras et bon marche.

   La couleur passe par `--text-heading`, pas par une teinte en dur : elle rend
   le bleu petrole sur fond clair, du blanc en section sombre et l'encre de
   marque en section peinte. Une seule regle, aucune variante a maintenir.
   -------------------------------------------------------------------------- */
.pmb-features {
  --pmb-features-icon-size: 1.9rem;
}

.pmb-ico {
  display: block;
  color: var(--text-heading);
  stroke-width: 1.3;
}

.pmb-feature__icon,
.pmb-timeline__icon {
  margin-bottom: 0.55rem;
}

/* --------------------------------------------------------------------------
   6. LES FORMES QUI SE BALADENT
   --------------------------------------------------------------------------
   Injectees par `inc/fork.php` (filtre `render_block`), animees par
   `assets/fork/deco.js`. Elles cassent la grille : c'est ce qui empeche une
   page de blocs empiles de ressembler a un gabarit.

   TROIS PRECAUTIONS, chacune pour un defaut precis :
   - `overflow: hidden` sur la section qui en porte : les formes DEBORDENT
     volontairement des bords (elles sont coupees, comme sur l'affiche). Sans
     cette regle, elles creeraient un defilement horizontal, qui est le defaut
     le plus vite reproche a une page.
   - `z-index: 0` sur la forme et `position: relative` sur le contenu : un
     ornement ne doit jamais passer DEVANT un texte ni intercepter un clic.
     `pointer-events: none` s'en charge aussi, ceinture et bretelles.
   - des opacites basses : ses documents laissent respirer, et les travaux des
     enfants sont deja tres colores. Une forme qui se remarque a egalite avec
     le texte est une forme ratee.
   -------------------------------------------------------------------------- */
.pmb:has(.mms-deco) {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}
.pmb:has(.mms-deco) > .pmb-inner {
  position: relative;
  z-index: 1;
}

.mms-deco {
  position: absolute;
  inset: 0;
  pointer-events: none;
  display: block;
  /* NEGATIF, MAIS SEULEMENT PARCE QUE LA SECTION EST ISOLEE (2026-08-07).
     Trois etats mesures, dans cet ordre :
       `z-index: 0`   -- la forme passait PAR-DESSUS le contenu des que celui-ci
                         n'etait pas lui-meme positionne. Mesure : le triangle
                         de la bande des oeuvres recouvrait les planches des
                         eleves. La regle qui protegeait le contenu
                         (`.pmb:has(.mms-deco) > .pmb-inner { z-index: 1 }`) ne
                         vise que les blocs du socle, dont l'accueil n'emploie
                         AUCUN : elle ne s'appliquait nulle part ici.
       `z-index: -1`  -- toutes les formes ont DISPARU. Une `section` en
                         `position: relative` SANS z-index ne cree pas de
                         contexte d'empilement : l'enfant negatif remonte au
                         contexte du dessus et se fait peindre DERRIERE le fond
                         opaque de la section.
       `-1` + section ISOLEE -- le bon etat. `isolation: isolate` fait de la
                         section un contexte d'empilement, donc la forme est
                         peinte apres le fond de CETTE section et avant son
                         contenu, sans qu'on ait a positionner quoi que ce soit
                         d'autre -- ce qui aurait casse des mises en page qu'on
                         ne controle pas. */
  z-index: -1;
}

.mms-deco__i {
  position: absolute;
  display: block;
  will-change: transform;
}
.mms-deco__i svg {
  display: block;
  width: 100%;
  height: 100%;
}

/* Les positions vivent ICI et pas dans le PHP : une coordonnee est un choix de
   design, elle se retouche avec le reste du design. */
/* Les opacites ont ete MONTEES apres capture : a .12, les formes etaient si
   discretes qu'elles ne cassaient plus rien -- elles ne se voyaient qu'en
   sachant qu'elles etaient la, ce qui est le pire des deux mondes (du poids,
   aucun effet). Sur l'affiche de reference, elles sont franches. */
.mms-deco__i--1 {
  top: -5%;
  right: -4%;
  width: clamp(150px, 20vw, 300px);
  aspect-ratio: 1;
  color: var(--color-primary);
  opacity: 0.3;
}

.mms-deco__i--2 {
  bottom: -7%;
  left: -5%;
  width: clamp(170px, 24vw, 360px);
  aspect-ratio: 1;
  color: var(--color-accent);
  opacity: 0.26;
}

/* DEUX PLACEMENTS DE PLUS, parce que quatre formes sur treize sections ne font
   pas un decor : elles font trois accidents. Les rangs 3 et 4 tiennent les FLANCS
   a mi-hauteur, la ou 1 et 2 tiennent les coins -- sans quoi toute forme ajoutee
   se serait empilee dans le meme angle que la precedente. */
.mms-deco__i--3 {
  top: 28%;
  left: -6%;
  width: clamp(120px, 16vw, 250px);
  aspect-ratio: 1;
  color: var(--color-highlight);
  opacity: 0.38;
}

.mms-deco__i--4 {
  bottom: 12%;
  right: -5%;
  width: clamp(135px, 18vw, 285px);
  aspect-ratio: 1;
  color: var(--color-secondary);
  opacity: 0.22;
}

/* Une section du fork qui accueille un ornement doit lui donner un REFERENT :
   `.mms-deco` est en `position: absolute; inset: 0`, donc sans cela il se calerait
   sur le premier ancetre positionne -- souvent la page entiere. Le socle ne pose
   la regle que pour ses blocs `.pmb`, et l'accueil n'en emploie aucun.
   Pas d'`overflow` ici : `.mms-accueil` porte deja `overflow-x: clip`, et les
   debordements verticaux sont VOULUS -- c'est eux qui cousent les sections. */
/* `isolation: isolate` EST INDISPENSABLE, pas decoratif : sans lui, le
   `z-index: -1` de `.mms-deco` sort de la section et la forme se fait peindre
   derriere son fond. Voir la note sur `.mms-deco`. */
:is(.mms-accueil, .mms-page) section:has(> .mms-deco) {
  position: relative;
  isolation: isolate;
}

/* Le carre reprend le cadrage pivote de ses photos : jamais parfaitement
   d'aplomb. La rotation est portee par une CUSTOM PROPERTY parce que le
   parallaxe ecrit dans `transform` : si la rotation y etait ecrite en dur,
   la premiere image du tween l'ecraserait. */
.mms-deco__i--carre {
  --mms-rot: -12deg;
}

.mms-deco__i--arc {
  --mms-rot: 8deg;
  opacity: 0.5;
}

.mms-deco__i--zigzag {
  --mms-rot: -6deg;
  opacity: 0.75;
  color: var(--color-highlight);
}

.mms-deco__i--anneau {
  --mms-rot: 0deg;
  opacity: 0.4;
}

.mms-deco__i svg {
  transform: rotate(var(--mms-rot, 0deg));
}

/* Une section peinte ou sombre : l'ornement passe a l'encre claire, sinon il
   disparait dans le fond. */
.pmb--scheme-brand .mms-deco__i,
.pmb--has-bg .mms-deco__i {
  color: var(--color-on-primary);
  opacity: 0.16;
}

@media (prefers-reduced-motion: reduce) {
  .mms-deco__i {
    will-change: auto;
  }
}
/* Sur un ecran etroit, les ornements mangent la place du texte sans rien
   apporter : ils sont reduits, pas seulement rapetisses. */
@media (max-width: 782px) {
  .mms-deco__i--2 {
    display: none;
  }
  .mms-deco__i--1 {
    opacity: 0.09;
  }
}
/* --------------------------------------------------------------------------
   LES FORMES SEMEES (2026-08-07)
   --------------------------------------------------------------------------
   Le semeur de `assets/fork/deco.js` porte la taille, la position, la couleur et
   l'opacite EN INLINE : ce sont des valeurs calculees par forme, elles n'ont pas
   d'equivalent en feuille. Le SCSS ne garde ici que ce qui vaut pour TOUTES --
   et le sprite, qui n'a rien a montrer.

   Pourquoi une nuee et non quatre ornements : mesure du 2026-08-07 sur l'accueil,
   huit formes sur 10,9 ecrans, toutes entre 218 et 377px. Ni densite, ni
   contraste d'echelle. Ses affiches, elles, superposent des elements « de tailles
   franchement differentes ». La densite se tient par la PROFONDEUR (trois couches
   d'opacite et de vitesse), jamais par la saturation : « motifs trop charges »
   est une de ses anti-references.
   -------------------------------------------------------------------------- */
/* Le sprite des traces : emis une fois par `mms_deco_sprite()`, jamais visible.
   `position: absolute` en plus des dimensions nulles, sinon il occupe une ligne
   dans le flux et decale le premier bloc de la page d'une hauteur de texte. */
.mms-deco-sprite {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}

/* Le recentrage (`margin` a moitie du cote) est pose EN INLINE par le semeur :
   il depend de la taille de chaque forme, qu'une feuille ne connait pas. On ne
   peut pas non plus le faire par `translate(-50%, -50%)`, puisque le parallaxe
   ecrit dans `transform` et l'ecraserait a la premiere image. */
/* Une section peinte recoit deja son encre claire par le JS (un style inline bat
   la feuille, donc la couleur ne peut pas etre posee ici). Il reste le TRAIT :
   sur fond sombre, un filet de 7 unites disparait avant un aplat. */
.mms-deco__i--semee.is-sur-sombre svg [stroke],
.mms-deco__i--semee.is-sur-sombre svg use {
  stroke-width: 9;
}

/* Aucun z-index par couche : c'est le CONTENEUR `.mms-deco` qui passe derriere le
   contenu, d'un seul coup et pour toutes les formes. Les empiler entre elles n'a
   pas de sens -- un collage se lit par l'opacite et l'echelle, pas par l'ordre. */
/* Sur un ecran etroit, le semeur reduit deja le nombre de formes. Les plus
   grandes restent, mais retenues : sur 390px de large, une forme de 600px n'est
   plus un ornement, c'est un fond. */
@media (max-width: 782px) {
  .mms-deco__i--semee.mms-deco__i--c0 {
    opacity: 0.06 !important;
  }
  .mms-deco__i--semee.mms-deco__i--c2 {
    opacity: 0.45 !important;
  }
}
/* On retire l'animation, jamais le decor : les formes semees restent en place et
   visibles, simplement immobiles. Le JS ne pose alors aucun ScrollTrigger. */
@media (prefers-reduced-motion: reduce) {
  .mms-deco__i--semee {
    will-change: auto;
  }
}
/* --------------------------------------------------------------------------
   7. L'EMPHASE DANS LES PARAGRAPHES
   --------------------------------------------------------------------------
   Constat du 2026-08-05 : AUCUN texte du site ne portait de gras. Un paragraphe
   entierement en 400 n'offre aucun point d'accroche -- l'oeil n'y trouve rien
   ou se poser, et pose sur une image il passe carrement au travers.

   GRAS SEUL, PAS DE COULEUR, et c'est un arbitrage explicite de Jonathan : les
   paragraphes porteront bientot des LIENS et des definitions de lexique, qui
   ont chacun leur signal visuel. Une troisieme teinte dans la meme phrase
   rendrait l'ensemble indigeste. L'emphase se distingue donc par la GRAISSE, et
   elle seule.

   Montserrat est variable 300..700 : le 700 existe reellement, il n'est pas
   synthetise -- ce que le theme interdit de toute facon (`font-synthesis: none`).
   -------------------------------------------------------------------------- */
.mms-accueil :is(p, li, dd, figcaption) :is(strong, b),
.pmb-prose :is(strong, b),
.pmb-feature__text :is(strong, b),
.mms-footer :is(p, li) :is(strong, b) {
  font-weight: 700;
  color: inherit;
}

/* --------------------------------------------------------------------------
   AJUSTEMENTS DE TON
   --------------------------------------------------------------------------
   Fraunces est une serif a fort contraste : aux grandes tailles, son
   interlignage par defaut est trop lache et ses titres se delitent.
   -------------------------------------------------------------------------- */
.pmb-hero__title,
.pmb-cover__title {
  line-height: 1.02;
  letter-spacing: -0.012em;
}

.pmb-h2 {
  line-height: 1.08;
  letter-spacing: -0.008em;
}

/* Les sous-titres de cartes reprennent le magenta de ses categories d'atelier,
   deja pose en token de scheme (`heading-sub`). Le prix, lui, garde le
   terracotta : sur son programme, le tarif n'est jamais de la meme couleur que
   le titre qu'il accompagne. */
.pmb-feature__sub {
  color: var(--color-primary);
  font-weight: 700;
  letter-spacing: 0.01em;
}

/* --------------------------------------------------------------------------
   LES PAGES EN COMPOSITION LIBRE
   --------------------------------------------------------------------------
   Importees ICI, et pas dans `app.scss`, pour une raison de fork : `app.scss`
   appartient au template et evolue avec lui. Un fork qui l'edite se met a
   conflicter au merge sur le fichier le plus central du socle. Ce fichier-ci
   est LE hook prevu pour le fork, et il est charge en dernier : c'est donc le
   bon point d'entree.
   -------------------------------------------------------------------------- */
/* ==========================================================================
   ACCUEIL -- COMPOSITION LIBRE. Les Ateliers Maison Maria Stella.
   Patron : `front-page.php`. Aucun bloc `pm-*` n'intervient ici.

   POURQUOI UNE FEUILLE A PART : ce n'est pas un « skin » pose sur des modules,
   c'est la mise en page elle-meme. Elle emploie une grille de 12 colonnes, des
   debordements et des chevauchements -- tout ce que la grammaire des blocs
   (section > conteneur centre > en-tete > grille reguliere) rend impossible.

   ELLE NE REDEFINIT AUCUN JETON. Couleurs, polices, rayons et espaces viennent
   tous de `vars/_client.scss`, mesures sur son logo et ses documents.
   ========================================================================== */
/* UNE SEULE SOURCE DE VERITE POUR LE RYTHME VERTICAL.
   Les sections de cette page etendent `.inner_spacer_y`
   (commons/_utilities.scss), le helper que le socle prevoit pour l'espacement
   interne en Y. Il tire sa valeur de `--space-xxxl`, le cran le plus haut de
   l'echelle d'espacement.

   DEUX ERREURS FAITES ICI, ET CORRIGEES : cette page a d'abord pose son propre
   `--mms-air` en `clamp(4rem, 10vw, 9.5rem)`, puis un `--mms-section-y` en
   `clamp(5rem, 11vw, 11.5rem)`. Or `--space-xxxl` vaut
   `clamp(5rem, 3rem + 9vw, 12rem)` : je reecrivais, a un cheveu pres, une
   echelle qui existait deja. Un second systeme d'espacement a cote du premier,
   c'est deux valeurs a changer a chaque reglage, et un fork qui cesse de
   repondre au reglage global.

   Regle qui vaut pour tout ce fichier : ce qui existe dans le socle se
   CONSOMME, jamais ne se recopie. */
/* La gouttiere et la colonne sont posees sur `:root` et non sur la page : le
   chrome (header, pied de page) s'aligne sur la MEME gouttiere que le contenu,
   sinon le logo et le titre ne tombent pas sur la meme verticale. Une seule
   declaration, consommee partout. */
:root {
  --mms-marge: var(--space-l);
  --mms-colonne: minmax(0, 1fr);
  /* UNE COULEUR PAR CATEGORIE D'ATELIER -- son systeme, releve sur son
     programme d'ete. Ce n'est pas decoratif, c'est un REPERAGE : la meme
     formule porte la meme couleur partout ou elle apparait.

     Les valeurs vivent ici et non sur les classes, parce qu'elles sont
     desormais lues par DEUX pages (l'apercu de l'accueil et le detail de
     `page-les-formules.php`). Posees sur les classes, il aurait fallu les
     maintenir aux deux endroits -- et le jour ou l'une derive, le reperage
     ne repere plus rien. */
  --mms-cat-annee: var(--color-accent);
  --mms-cat-duo: var(--color-accent-soft);
  --mms-cat-stage: var(--color-accent-warm);
  --mms-cat-anniv: var(--color-highlight);
  /* LES COLLAB' AVAIENT LA MEME COULEUR QUE LES ANNIVERSAIRES (2026-08-08).
     Les deux valaient `--color-highlight` : le code couleur comptait donc
     cinq categories pour quatre teintes, et deux offres qui n'ont rien a voir
     se repondaient sur toute la longueur du site. Personne ne l'avait releve,
     parce qu'un reperage par couleur ne se lit jamais categorie par categorie.

     Le vert-de-gris arrive precisement la : c'est la seule teinte FROIDE de
     la palette hors du bleu petrole, et les Collab' sont ce que l'atelier a
     de plus a part -- un artiste invite, une fois. */
  --mms-cat-collab: var(--color-tertiary);
}

.mms-accueil {
  overflow-x: clip;
  background: var(--color-white);
  color: var(--color-text);
  font-family: "Montserrat", system-ui, sans-serif;
}

/* La grille de reference. Douze colonnes, pas six : c'est ce qui autorise les
   placements a 5/12 ou 7/12, donc l'asymetrie. Une grille a 2 ou 3 colonnes ne
   sait produire que des moities et des tiers, et toute page finit centree. */
.mms-grille {
  display: grid;
  grid-template-columns: repeat(12, var(--mms-colonne));
  gap: clamp(1.5rem, 3vw, 3rem);
  max-width: 1560px;
  margin-inline: auto;
  padding-inline: var(--mms-marge);
}

.mms-titre {
  margin: 0;
}

/* --- Les briques communes ------------------------------------------------- */
/* L'ETIQUETTE N'EST PLUS UN APLAT : ELLE EST UN LIBELLE AU FILET.
   Elle etait un rectangle plein a encre claire -- exactement ce qu'est une ligne
   de titre `.mms-aff__l`. Deux objets de meme nature a deux tailles : l'oeil les
   lit comme un seul systeme repete, et le titre perd son rang puisque son voisin
   minuscule emploie le meme procede que lui.

   SUR SES AFFICHES, LES DEUX SONT DISTINCTS : le mot d'impact (« MANGA ») est en
   COULEUR PLEINE, sans fond ; seul le petit libellé de role porte un aplat. Le
   titre du site ayant fait le choix inverse -- l'aplat, valide en session 3 --
   c'est a l'etiquette de changer de nature pour que la hierarchie revienne.

   Le filet + les capitales espacees gardent son vocabulaire (elle espace ses
   capitales partout) sans lui reprendre son procede de titre. */
/* CE QUI LA DISTINGUE DU TITRE N'EST PAS L'APLAT, C'EST SA POLARITE.
   Elle etait un rectangle plein a encre CLAIRE, et sa variante `--bleu` employait
   meme le couple exact d'une ligne de titre (fond bleu petrole + encre rose pale).
   Deux objets de meme nature a deux tailles : l'oeil les lit comme un seul systeme
   repete, et le titre perd son rang.

   SES AFFICHES TRANCHENT, ET ELLES SONT CONSTANTES SUR LES TROIS : le mot d'impact
   est en couleur saturee a encre claire, tandis que le libelle de role est
   TOUJOURS abricot a encre SOMBRE. Ce n'est pas la forme qui separe les deux, c'est
   l'inversion de polarite -- et le fait que l'etiquette ne change jamais de couleur
   quand le titre, lui, tourne (terracotta, petrole, magenta).

   D'OU UNE SEULE ETIQUETTE, ABRICOT PARTOUT. Une premiere tentative l'avait privee
   d'aplat pour la distinguer : mesure du 2026-08-06, elle ressortait a 1:1 sur la
   section inscription (terracotta sur terracotta) et a 2,42:1 sur la section des
   Collab'. Retirer un aplat, c'est rendre le texte dependant d'un fond qu'on n'a
   pas choisi -- exactement ce qui rendait les icones du pied invisibles. Un aplat
   opaque, lui, emporte son contraste : 8,24:1, sur n'importe quelle section. */
.mms-etiq {
  display: inline-block;
  background: var(--color-highlight);
  color: var(--color-secondary);
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: clamp(0.68rem, 0.8vw, 0.78rem);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  padding: 0.55em 1.1em;
  border-radius: 0;
  /* Les deux variantes de couleur SURVIVENT DANS LE HTML mais ne colorent plus :
     l'etiquette est desormais un objet unique. Elles sont conservees inertes
     plutot que retirees de dix appels PHP, ou un oubli aurait laisse une classe
     morte sans que rien ne le signale. */
}
.mms-etiq--bleu, .mms-etiq--abricot {
  background: var(--color-highlight);
  color: var(--color-secondary);
}
.mms-etiq {
  /* Le prix n'a jamais ete une etiquette : c'est un CHIFFRE, et il n'a donc ni
     aplat ni capitales espacees a la meme mesure. */
}
.mms-etiq--prix {
  background: transparent;
  color: var(--color-primary-ink);
  padding-inline: 0;
  letter-spacing: 0.1em;
}

.mms-btn {
  display: inline-block;
  background: var(--color-primary-ink);
  color: var(--color-on-primary);
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.92rem;
  letter-spacing: 0.02em;
  padding: 1.05em 2.4em;
  border-radius: 999px;
  text-decoration: none;
  transition: background-color 0.2s ease, color 0.2s ease;
}
.mms-btn:hover, .mms-btn:focus-visible {
  background: var(--color-secondary);
  color: var(--color-surface);
}
.mms-btn--clair {
  background: var(--color-surface);
  color: var(--color-primary-ink);
}
.mms-btn--clair:hover, .mms-btn--clair:focus-visible {
  background: var(--color-white);
  color: var(--color-secondary);
}
.mms-btn--fantome {
  background: transparent;
  color: var(--color-on-primary);
  box-shadow: inset 0 0 0 1.5px currentColor;
}
.mms-btn--fantome:hover, .mms-btn--fantome:focus-visible {
  background: var(--color-on-primary);
  color: var(--color-primary-ink);
  box-shadow: none;
}

/* UN BOUTON NE SE SOULIGNE PAS, ET IL FALLAIT ALLER LE CHERCHER (2026-08-07).
   `.mms-btn` declare pourtant `text-decoration: none`. Le soulignage venait du
   socle : `p a:not(.proto-term):not(.pmb-btn) { text-decoration: underline }`.
   Cette regle a prevu une exception pour SES boutons (`.pmb-btn`) et ignore
   ceux du fork, et sa specificite -- deux elements plus deux classes portees
   par les `:not()`, soit (0,2,2) -- ecrase le (0,1,0) de `.mms-btn`.
   Tous les boutons poses dans un `<p>` etaient donc soulignes : ceux du hero,
   ceux de la section inscription. Mesure par `CSS.getMatchedStylesForNode`,
   parce que relire le SCSS du fork ne pouvait pas le montrer.
   On egale sa specificite et on passe apres : deux classes, deux elements.
   A remonter au socle -- l'exception devrait viser tout bouton, pas seulement
   les siens. */
:is(.mms-accueil, .mms-page) p a.mms-btn {
  text-decoration: none;
}

.mms-lien {
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 600;
  font-size: 0.92rem;
  color: inherit;
  text-underline-offset: 0.35em;
  text-decoration-thickness: 1.5px;
  /* LE TRAIT PREND LA COULEUR DE SA SECTION (2026-08-08, demande de Jonathan).
     Il valait `currentColor` partout : tous les liens du site portaient donc
     le meme filet brun-gris, quelle que soit la section qui les accueillait.

     UNE VARIABLE PLUTOT QU'UNE COULEUR PAR ENDROIT. Chaque section surcharge
     `--mms-lien-trait` sur son conteneur, et l'heritage fait le reste : un
     lien ajoute demain dans l'une d'elles prend la bonne couleur sans que
     personne y pense. Ecrire la couleur sur chaque `.mms-lien` aurait produit
     autant de regles a maintenir que de sections.

     Le repli `currentColor` garde le comportement actuel partout ou aucune
     section ne se prononce : rien ne change tant qu'on ne le demande pas.

     CONTRASTE : un soulignage est un composant graphique (WCAG 1.4.11), donc
     le seuil est 3:1, pas 4,5. Les trois teintes employees ici valent 5,4:1
     (accent), 4,23:1 (tertiary) et 3,44:1 (primary) sur le rose pale. Le
     TEXTE, lui, garde sa propre couleur et son propre contraste. */
  text-decoration-color: var(--mms-lien-trait, currentColor);
}

/* ET IL FAUT EGALER LE SOCLE, SINON RIEN NE SE VOIT.
   Premiere ecriture : la regle ci-dessus, seule. Mesure sur les trois pages :
   **les neuf liens rendaient `currentColor`**, pas une couleur de section.

   SOURCE CONFIRMEE, `dist/app.css` : `p a:not(.proto-term):not(.pmb-btn) {
   text-decoration: underline }` du socle. C'est le RACCOURCI, et un raccourci
   REINITIALISE ses longhands -- `text-decoration-color` y repasse a
   `currentColor`. Sa specificite (0,2,2 : deux elements plus les deux classes
   des `:not()`) ecrase le (0,1,0) de `.mms-lien`.

   Le fork avait deja rencontre CETTE regle, pour ses boutons soulignes, et
   avait du l'egaler de la meme facon. La lecon ne perime pas : une longhand du
   fork ne survit pas a un raccourci du socle plus specifique.

   On egale donc (0,2,2) et on passe apres. Les `.mms-lien` qui ne vivent pas
   dans un `<p>` gardent la regle generale ci-dessus, qui leur suffit. */
:is(.mms-accueil, .mms-page) p a.mms-lien {
  text-decoration-color: var(--mms-lien-trait, currentColor);
}

/* La couleur du trait suit la CATEGORIE de la section, jamais le hasard.
   MAIS ELLE SUIT AUSSI LE FOND, et c'est une mesure qui l'a impose : le
   vert-de-gris pose sur les DEUX sections Collab' rendait **2,65:1 sur
   l'accueil**, sous le seuil de 3:1 des composants graphiques. La section
   Collab' de l'accueil est peinte en BLEU PETROLE, celle de la page des
   formules est sur fond clair -- je les avais traitees ensemble en supposant
   le meme fond, sans le lire.

   Sur fond sombre, la palette a deja son jeton : l'abricot, que le scheme
   sombre du socle emploie pour ses etiquettes. Le vert-de-gris reste sur les
   fonds clairs, ou il vaut 4,23:1 (rose) et 5,00:1 (blanc).

   ET LA MEME SUPPOSITION M'A EU DEUX FOIS : j'ai corrige l'accueil en croyant
   que la section Collab' de la page des formules, elle, etait claire. Mesure :
   **fond bleu petrole egalement**, meme 2,65:1. Les DEUX sections Collab' du
   site sont sombres. Le vert-de-gris n'y a donc aucune place en trait -- il
   vit dans le code couleur des categories, qui se rend sur fond clair. */
.mms-collab {
  --mms-lien-trait: var(--color-highlight);
} /* fond bleu petrole */
.mms-fx-collab {
  --mms-lien-trait: var(--color-highlight);
} /* fond bleu petrole, mesure */
.mms-hebdo {
  --mms-lien-trait: var(--color-highlight);
} /* fond bleu petrole */
.mms-fx-tete {
  --mms-lien-trait: var(--color-accent);
}

.mms-ag {
  --mms-lien-trait: var(--color-accent-warm);
}

/* Un focus VISIBLE partout, en abricot : sur ses trois fonds (rose pale, bleu
   petrole, terracotta) l'abricot reste detache. Un anneau bleu par defaut
   disparaitrait sur la section bleue.

   LE SELECTEUR PORTE LES DEUX RACINES, et ce n'est pas cosmetique : tant qu'il
   ne visait que `.mms-accueil`, toute page composee ensuite retombait sur
   l'anneau par defaut du navigateur -- invisible sur la section bleu petrole,
   sans qu'aucune erreur ne le dise. Une regle d'accessibilite attachee a UNE
   page est une regle qui se perd a la page suivante. */
:is(.mms-accueil, .mms-page) :is(a, button, summary):focus-visible {
  outline: 3px solid var(--color-highlight);
  outline-offset: 3px;
}

/* --------------------------------------------------------------------------
   1. LE HERO
   -------------------------------------------------------------------------- */
/* LE HERO N'EST PLUS UNE PHOTO PLEIN ECRAN.
   Arbitrage du 2026-08-05, apres comparaison avec le remix valide : une photo
   plein cadre sous un voile sombre eteint la marque. Elle a une palette tres
   claire, et son fond rose pale EST son identite -- c'est le fond de ses deux
   documents imprimes. Le hero le reprend, et la photo devient un OBJET pose
   dessus, sur sa carte de couleur decalee. La couleur revient alors la ou elle
   compte : dans les aplats du titre. */
/* SA SALLE PASSE SOUS LE FOND (2026-08-07, demande de Jonathan).
   L'arbitrage ci-dessus tient toujours : ce n'est PAS une photo plein cadre
   sous un voile sombre. Le voile est son rose pale a 90%, donc la photo ne se
   lit pas -- elle se devine. Elle apporte une MATIERE la ou il n'y avait qu'un
   aplat : les carreaux de ciment, le bois de la table, la lumiere de la fenetre.
   Le fond de marque reste le fond de marque.

   Le voile est un `::before` et non un `background-blend-mode` : le blend
   melangerait les deux couches au lieu d'en poser une SUR l'autre, et le rose
   virerait avec chaque zone de la photo. Une couche opaque a 90% se comporte
   partout pareil -- c'est le meme principe que l'aplat qui porte son contraste.

   L'image est prise dans le THEME et non en mediatheque : un fond CSS n'a pas
   de `srcset` a gagner, et le fichier suit le depot au lieu de dependre d'une
   base a migrer.

   LE CHEMIN EST RELATIF A `dist/`, PAS A CE FICHIER. Laravel Mix ne reecrit pas
   les `url()` de ce projet : elles sont recopiees telles quelles dans
   `dist/app.css`. Ecrire `../fork/...` -- juste depuis `assets/scss/vars/` --
   compile en un chemin qui pointe sur `<theme>/fork/`, et rend 404. Mesure du
   2026-08-07 : 404 sur le chemin compile, 200 sur le fichier reel. C'est la
   convention des fontes du socle (`url('fonts/...')`, relatif a `dist/`). */
/* `cover`, ET LE CALCUL A PERIME LA REGLE PRECEDENTE (2026-08-08).
   -------------------------------------------------------------------------
   Ce fond etait en `auto 135%` pour menager du jeu vertical au parallaxe :
   `cover` sur une image 1600x1200 dans un cadre de 1440x1043 ne laissait que
   37px a deplacer. C'etait juste a l'epoque, avec CETTE image et CE cadre.

   Deux choses ont change depuis, et personne n'a refait le calcul : le hero est
   passe a `min-height: 80vh`, et la photo est devenue plus panoramique
   (2048x1436, ratio 1,426 contre 1,333). Or, en `auto 135%`, la largeur rendue
   vaut hauteur_cadre x 1,35 x 1,426, soit hauteur_cadre x 1,925 : le fond ne
   couvre donc que si le cadre est MOINS large que 1,925 fois sa hauteur.

   A 80vh, aucun ecran courant ne tient cette condition -- mesure :

     1440 x 900   ratio 2,00 -> 53px de bord nu     (cover : 289px de jeu)
     1920 x 1080  ratio 2,22 -> 256px de bord nu    (cover : 482px)
     3840 x 2160  ratio 2,22 -> 512px de bord nu    (cover : 964px)
     3440 x 1440  ratio 2,99 -> 1221px de bord nu   (cover : 1260px)

   Le bord etait donc visible PARTOUT, pas seulement en 4K -- Jonathan l'a vu
   sur le sien. Et `cover` ne coute rien au parallaxe : il en donne plus, parce
   que l'image y est calee sur la largeur et deborde d'autant en hauteur.
   **La regle n'etait pas fausse, elle avait cesse d'etre vraie.** */
.mms-hero {
  position: relative;
  background: var(--color-surface) url("../assets/fork/atelier.webp") center 0/cover no-repeat;
}
.mms-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: var(--color-surface);
  opacity: 0.9;
  pointer-events: none;
}
.mms-hero {
  /* Le contenu repasse au-dessus du voile. Sans cela, la grille du hero se
     retrouverait derriere lui et la page paraitrait delavee. */
}
.mms-hero > * {
  position: relative;
  z-index: 1;
}
.mms-hero {
  overflow: hidden;
  /* UN HERO PLUS HAUT, A 80vh COMME LA REFERENCE.
     La version precedente plafonnait a 880px (`min(88svh, 880px)`) : sur un
     grand ecran le plafond gagnait toujours, et la demande d'un hero plus
     haut restait sans effet visible. Le plafond est retire, la mesure est
     celle du remix. */
  min-height: 80vh;
  display: grid;
  align-items: center;
}
.mms-hero__grille {
  align-items: center;
  row-gap: clamp(2.5rem, 5vw, 4rem);
  width: 100%;
}
.mms-hero__contenu {
  grid-column: 1/span 6;
  display: grid;
  gap: clamp(0.9rem, 1.6vw, 1.5rem);
  justify-items: start;
}
.mms-hero {
  /* L'echelle du titre de PAGE, mesuree sur la reference : 96px a 1440.
     6.6vw les redonne exactement, et le clamp tient les deux extremes. */
}
.mms-hero__titre {
  --mms-aff-taille: clamp(2.35rem, 6.6vw, 6rem);
}
.mms-hero {
  /* L'accroche est SA phrase, choisie par elle a la question du
     positionnement. En Fraunces italique : c'est la voix de la maison, pas
     une ligne d'interface. */
}
.mms-hero__accroche {
  margin: 0.5rem 0 0;
  font-family: "Fraunces", Georgia, serif;
  font-style: italic;
  font-weight: 600;
  font-size: clamp(1.15rem, 1.9vw, 1.7rem);
  line-height: 1.35;
  color: var(--color-secondary);
  max-width: 26ch;
}
.mms-hero__intro {
  margin: 0;
  color: #4A3F44;
  font-size: clamp(0.98rem, 1.15vw, 1.08rem);
  line-height: 1.7;
  max-width: 40ch;
}
.mms-hero__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(1rem, 2vw, 2rem);
  margin: 0.5rem 0 0;
}
.mms-hero {
  /* L'adresse RESPIRE sous les boutons (2026-08-07). A .3rem elle leur etait
     collee et se lisait comme une troisieme action. */
}
.mms-hero__adresse {
  margin: clamp(1.1rem, 2vw, 1.8rem) 0 0;
}
.mms-hero__media {
  grid-column: 8/span 5;
  position: relative;
  margin: 0;
  z-index: 0;
  /* Sa carte de couleur decalee, en terracotta, poussee vers le bas a
     droite comme sur le remix. Aplat franc, aucune ombre. */
}
.mms-hero__media::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset: 26px -26px -26px auto;
  width: 100%;
  background: var(--color-primary);
}
.mms-hero {
  /* LE CADRE. Il portait auparavant une seule photo, extraite de son A3, et
     un agrandissement charge de sortir du champ la bande magenta restee dans
     le fichier. Cette rustine n'a plus lieu d'etre : le cadre accueille
     desormais le carrousel de ses oeuvres, dont les fichiers sont propres.
     Il ne lui reste que son role de fenetre -- rapport fixe et debordement
     masque, pour que les six vues aient exactement la meme boite. */
}
.mms-hero__cadre {
  display: block;
  position: relative;
  overflow: hidden;
  aspect-ratio: 4/5;
  background: var(--color-secondary);
}

/* --------------------------------------------------------------------------
   LE CARROUSEL DES OEUVRES (dans le cadre du hero)
   --------------------------------------------------------------------------
   Fondu enchaine, pas de glissement lateral : ces planches ne se lisent pas
   comme une sequence, elles se REMPLACENT. Un glissement suggererait un ordre
   et inviterait a chercher les fleches ; le fondu laisse le cadre tranquille
   et garde toute l'attention sur le titre, qui est le sujet du hero.
   -------------------------------------------------------------------------- */
.mms-carrousel__vues {
  list-style: none;
  margin: 0;
  padding: 0;
  position: absolute;
  inset: 0;
}
.mms-carrousel__vue {
  position: absolute;
  inset: 0;
  opacity: 0;
  /* `visibility` en plus de l'opacite : une vue a opacite nulle reste
     focusable et lisible par les technologies d'assistance. */
  visibility: hidden;
  transition: opacity 0.85s ease, visibility 0s linear 0.85s;
}
.mms-carrousel__vue.est-active {
  opacity: 1;
  visibility: visible;
  transition: opacity 0.85s ease, visibility 0s;
}
.mms-carrousel__img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.mms-carrousel {
  /* Le lent rapproche : 4% sur toute la duree d'affichage. Assez pour que le
     cadre ne soit jamais fige, assez peu pour ne pas amputer la planche. */
}
.mms-carrousel__vue.est-active .mms-carrousel__img {
  animation: mms-rapproche 6.4s ease-out both;
}
.mms-carrousel {
  /* LES COMMANDES : pause et fleches partagent le meme dessin, decrit UNE
     fois. Un aplat plein, comme tout ce qui se pose sur une image chez elle,
     et 44px de cote -- la cible tactile minimale, jamais moins. Aucune ne se
     cache au survol : une commande qu'il faut chercher ne remplit pas son
     office, et sur telephone il n'y a pas de survol du tout. */
}
.mms-carrousel .mms-carrousel__fleche, .mms-carrousel .mms-carrousel__pause {
  width: 44px;
  height: 44px;
  display: grid;
  place-items: center;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--color-secondary);
  color: var(--color-highlight);
  cursor: pointer;
  transition: background-color 0.2s ease, color 0.2s ease;
}
.mms-carrousel .mms-carrousel__fleche:hover, .mms-carrousel .mms-carrousel__pause:hover, .mms-carrousel .mms-carrousel__fleche:focus-visible, .mms-carrousel .mms-carrousel__pause:focus-visible {
  background: var(--color-highlight);
  color: var(--color-secondary);
}
.mms-carrousel__pause {
  position: absolute;
  z-index: 3;
  top: clamp(0.7rem, 1.4vw, 1.1rem);
  right: clamp(0.7rem, 1.4vw, 1.1rem);
}
.mms-carrousel__pause svg {
  width: 17px;
  height: 17px;
  fill: currentColor;
}
.mms-carrousel__fleches {
  position: absolute;
  z-index: 3;
  right: clamp(0.7rem, 1.4vw, 1.1rem);
  bottom: clamp(1rem, 1.8vw, 1.4rem);
  display: flex;
  gap: 0.5rem;
}
.mms-carrousel__fleche {
  /* Les chevrons sont traces, pas remplis : un `fill` en ferait deux
     triangles pleins, qui pesent trop a cote de l'icone de pause. */
}
.mms-carrousel__fleche svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.mms-carrousel {
  /* Le libelle est lu, jamais vu : il change avec l'etat du bouton, ce qui
     est le seul moyen d'annoncer « pause » puis « reprendre ». */
}
.mms-carrousel__label {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.mms-carrousel__ico-lecture {
  display: none;
}
.mms-carrousel__pause[aria-pressed=true] .mms-carrousel__ico-pause {
  display: none;
}
.mms-carrousel__pause[aria-pressed=true] .mms-carrousel__ico-lecture {
  display: block;
}
.mms-carrousel {
  /* LA REGLETTE plutot que des pastilles rondes : la pastille tournante de
     l'enseigne occupe deja le coin bas gauche du cadre, et six petits ronds
     de plus auraient fait doublon a trois centimetres d'elle. */
}
.mms-carrousel__reglette {
  position: absolute;
  z-index: 3;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  gap: 2px;
}
.mms-carrousel__segment {
  flex: 1 1 0;
  height: 3px;
  background: rgba(253, 231, 232, 0.35);
  overflow: hidden;
}
.mms-carrousel__segment::after {
  content: "";
  display: block;
  height: 100%;
  width: 0;
  background: var(--color-highlight);
}
.mms-carrousel__segment.est-active::after {
  animation: mms-avance 5.4s linear forwards;
}
.mms-carrousel__segment.est-passe::after {
  width: 100%;
}
.mms-carrousel {
  /* A l'arret, l'avancement se fige la ou il en est plutot que de repartir. */
}
.mms-carrousel.est-en-pause .mms-carrousel__vue.est-active .mms-carrousel__img, .mms-carrousel.est-en-pause .mms-carrousel__segment.est-active::after {
  animation-play-state: paused;
}

@keyframes mms-rapproche {
  from {
    transform: scale(1);
  }
  to {
    transform: scale(1.04);
  }
}
@keyframes mms-avance {
  from {
    width: 0;
  }
  to {
    width: 100%;
  }
}
/* La pastille ronde a texte curviligne, detail repris de l'affiche de
   reference. Elle tourne lentement : c'est le seul mouvement autonome de la
   page, et il s'arrete sous `prefers-reduced-motion`. */
/* La pastille CHEVAUCHE le bord gauche de la photo : elle fait le lien entre
   la colonne de texte et l'image, et empeche les deux moities du hero de se
   lire comme deux blocs juxtaposes. */
.mms-pastille {
  position: absolute;
  z-index: 2;
  left: clamp(-2.5rem, -3vw, -1.5rem);
  bottom: clamp(1.5rem, 4vw, 3rem);
  width: clamp(90px, 10vw, 142px);
  aspect-ratio: 1;
  display: grid;
  place-items: center;
  /* UN DISQUE PLEIN, PAS UN TEXTE POSE SUR LA PHOTO.
     Premiere version : texte abricot directement sur l'image. Illisible --
     une photo n'offre aucun fond stable, le contraste change a chaque pixel.
     Le disque en bleu petrole donne un fond constant, et l'abricot dessus
     tient 8,4:1. C'est la meme logique que ses etiquettes rectangulaires :
     chez elle, un texte pose sur une image est TOUJOURS sur un aplat. */
  background: var(--color-secondary);
  border-radius: 50%;
}
.mms-pastille svg {
  width: 100%;
  height: 100%;
  animation: mms-tourne 26s linear infinite;
}
.mms-pastille {
  /* LE CORPS SE CALCULE SUR LA LONGUEUR DU TEXTE, il ne se choisit pas.
     Le cercle developpe 2 x pi x 44 = 276 unites, et `textPath` NE TRONQUE
     PAS : au-dela, il repart par-dessus son debut et les lettres se
     chevauchent.

     « Quelques oeuvres d'eleves . » fait 28 signes, dont 3 espaces. En
     capitales de Montserrat Bold, une lettre occupe ~0,62em et un espace
     ~0,28em, plus 0,1em d'approche dans les deux cas. A 13,6 :
       25 signes x 13,6 x 0,72 = 245
        3 espaces x 13,6 x 0,38 =  16
     soit ~261 unites sur 276 disponibles. Ca tient, avec peu de marge.
     Verifie en capture a 14 : le texte fait le tour sans se recouvrir.

     Le texte precedent (« Les Ateliers Creatifs Maison Maria Stella », 43
     signes) imposait 9px. Ce libelle-ci, plus court, autorise un corps
     nettement plus lisible. TOUTE mention ajoutee ici impose de refaire ce
     calcul, et de VERIFIER EN CAPTURE : le calcul donne un ordre de
     grandeur, la police tranche. */
}
.mms-pastille text {
  fill: var(--color-highlight);
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 14px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.mms-pastille__coeur {
  position: absolute;
  width: 34%;
  color: var(--color-highlight);
}
.mms-pastille__coeur svg {
  width: 100%;
  height: auto;
  animation: none;
  stroke-width: 1.4;
}

@keyframes mms-tourne {
  to {
    transform: rotate(360deg);
  }
}
/* --------------------------------------------------------------------------
   2. LE BANDEAU DES MATIERES
   -------------------------------------------------------------------------- */
.mms-bandeau {
  background: var(--color-secondary);
  color: var(--color-surface);
  padding: clamp(0.9rem, 1.6vw, 1.35rem) 0;
  overflow: hidden;
}
.mms-bandeau__piste {
  display: flex;
  width: max-content;
  animation: mms-defile 38s linear infinite;
}
.mms-bandeau__suite {
  display: flex;
  align-items: center;
}
.mms-bandeau__mot {
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 600;
  font-size: clamp(0.78rem, 1vw, 0.95rem);
  text-transform: uppercase;
  letter-spacing: 0.22em;
  padding-inline: clamp(1rem, 2vw, 2rem);
  white-space: nowrap;
}
.mms-bandeau__sep {
  color: var(--color-highlight);
  font-size: 0.6em;
}

@keyframes mms-defile {
  to {
    transform: translateX(-50%);
  }
}
/* --------------------------------------------------------------------------
   3. LE MANIFESTE
   -------------------------------------------------------------------------- */
.mms-manifeste {
  position: relative;
  background: var(--color-surface);
}
.mms-manifeste .mms-grille {
  align-items: start;
}
.mms-manifeste__chiffre {
  grid-column: 1/span 4;
  display: grid;
  justify-items: start;
  gap: 0.6rem;
  /* Le chiffre REMONTE dans la section : il mord sur l'air du dessus au
     lieu de s'aligner sagement avec le texte. Deux elements qui ne
     partent pas de la meme ligne, c'est ce qui fait la composition. */
  margin-top: clamp(-3.5rem, -3vw, -1rem);
}
.mms-manifeste__propos {
  grid-column: 6/span 7;
  display: grid;
  gap: 1.4rem;
  justify-items: start;
  margin-top: clamp(2rem, 6vw, 5.5rem);
}
.mms-manifeste__propos p {
  margin: 0;
  font-size: clamp(1rem, 1.2vw, 1.15rem);
  line-height: 1.72;
  max-width: 46ch;
}

/* `.mms-chiffre` a ete RETIRE le 2026-08-07 avec le « 10 » qu'il habillait :
   son logo occupe desormais cette place. Mesure faite avant de supprimer --
   `grep -rn "mms-chiffre" --include=*.php` ne rend plus rien. Un style orphelin
   se relit comme un composant existant, et la session suivante le cherche. */
/* --------------------------------------------------------------------------
   SON LOGO QUI S'ECRIT (3. LE MANIFESTE)
   --------------------------------------------------------------------------
   Trois etats, et l'ordre dans lequel ils sont ecrits compte :

   1. AU REPOS -- lettres pleines, aucun filet. C'est l'etat par DEFAUT, donc
      celui qu'on voit si le JS ne tourne pas, s'il echoue, ou sous
      `prefers-reduced-motion`. Un logo dont la panne serait l'invisibilite
      serait un mauvais logo.
   2. `.is-trace` -- lettres vides, filet apparent. Pose par le JS, et
      seulement par lui.
   3. `.is-fini` -- retour a l'etat 1, une fois le geste accompli.

   `vector-effect: non-scaling-stroke` N'EST PAS UN DETAIL : le viewBox fait
   1437 unites de large pour environ 400px affiches. Sans lui, un `stroke-width`
   de 2 serait divise par 3,5 a l'ecran et le trace serait un cheveu.
   -------------------------------------------------------------------------- */
.mms-logo-trace {
  width: 100%;
  max-width: clamp(240px, 32vw, 430px);
  line-height: 0;
}
.mms-logo-trace__svg {
  display: block;
  width: 100%;
  height: auto;
}
.mms-logo-trace {
  /* UNE SEULE ENCRE, ET IL A FALLU LA MESURER POUR LE SAVOIR. Le fichier source
     repartissait ses 56 traces en DEUX classes, `.cls-1` (53) et `.cls-2` (3),
     ce qui laissait croire a un logo bicolore -- des points ou un ornement.
     Releve des boites englobantes : les trois traces de `.cls-2` sont en HAUT du
     dessin (y de 0 a 110), ce sont les lettres du mot « Les ». Son logo est
     monochrome, comme le montre `proto/design-refs/logo.png`. Les deux classes
     ont donc ete fusionnees dans le fichier.
     Les couleurs vivent ici et non dans le SVG : son `<style>` interne a ete
     retire, sans quoi ses classes fuiraient dans toute la page. */
}
.mms-logo-trace .mms-logo__lettre {
  fill: var(--color-primary);
}
.mms-logo-trace.is-trace path {
  fill-opacity: 0;
  stroke: var(--color-primary);
  stroke-width: 2;
  stroke-opacity: 1;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
}
.mms-logo-trace.is-fini path {
  fill-opacity: 1;
  stroke-opacity: 0;
}

/* Dans le manifeste, le logo prend la place du chiffre : il remonte comme lui
   pour continuer de mordre sur l'air du dessus. */
.mms-logo-trace--manifeste {
  max-width: clamp(230px, 30vw, 400px);
}

/* --------------------------------------------------------------------------
   4. LES PILIERS, EN ESCALIER
   -------------------------------------------------------------------------- */
.mms-piliers {
  background: var(--color-secondary);
  color: var(--color-surface);
}
.mms-piliers__liste {
  list-style: none;
  margin: 0 auto;
  padding-inline: var(--mms-marge);
  max-width: 1560px;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(1.75rem, 3.4vw, 3.5rem);
  align-items: start;
}

.mms-pilier {
  display: grid;
  gap: 0.7rem;
  justify-items: start;
  /* L'ESCALIER : chaque colonne descend un peu plus que la precedente.
     Trois colonnes alignees se lisent comme un tableau ; decalees, elles se
     lisent comme une composition. */
}
.mms-pilier:nth-child(2) {
  margin-top: clamp(1.5rem, 4vw, 4rem);
}
.mms-pilier:nth-child(3) {
  margin-top: clamp(3rem, 8vw, 8rem);
}
.mms-pilier__ico {
  display: block;
  width: clamp(30px, 3vw, 38px);
  color: var(--color-highlight);
}
.mms-pilier__ico svg {
  width: 100%;
  height: auto;
  stroke-width: 1.3;
}
.mms-pilier__titre {
  margin: 0.2rem 0 0;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.35rem, 2vw, 1.85rem);
  color: var(--color-white);
  letter-spacing: -0.01em;
}
.mms-pilier p {
  margin: 0;
  line-height: 1.72;
  color: rgba(253, 231, 232, 0.82);
  max-width: 38ch;
}

/* --------------------------------------------------------------------------
   5. LA MAISON -- titre decoupe qui chevauche le bord de l'image
   -------------------------------------------------------------------------- */
.mms-maison {
  position: relative;
  isolation: isolate;
  background: var(--color-white);
  /* `overflow: hidden` EST LA CONDITION DU PARALLAXE, pas un ornement :
     l'image fait 128% de son cadre pour avoir de quoi deriver, et sans
     decoupe elle recouvrirait la section suivante. */
  /* A 80vh COMME LE HERO (2026-08-09, demande de Jonathan : les porteurs
     d'image de fond a la meme echelle que lui).

     ET LE PLAFOND EST RETIRE, exactement pour la raison notee sur le hero en
     session 10 : `clamp(340px, 62vh, 660px)` plafonnait a 660px, donc dessus
     de ~1065px de hauteur d'ecran c'est le PLAFOND qui gagnait, toujours. Une
     demande de « plus haut » y serait restee sans effet visible sur les
     grands ecrans -- le defaut exact que le hero avait paye.

     `min-height` et non `height` : l'image du bloc est en `position:
     absolute`, le media n'a donc aucune hauteur naturelle, et c'est cette
     propriete seule qui la lui donne. */
}
.mms-maison__media {
  position: relative;
  overflow: hidden;
  min-height: 80vh;
}
.mms-maison__img {
  display: block;
  width: 100%;
  /* 128% : les 28% en trop sont la marge que `parallaxe.js` parcourt.
     `top: -14%` centre cette marge, pour que l'image soit cadree comme
     avant au milieu de sa course. */
  height: 128%;
  position: absolute;
  inset: -14% 0 auto 0;
  object-fit: cover;
}
.mms-maison {
  /* LE VOILE EST INVERSE : c'est le BAS qui s'assombrit, parce que c'est en bas
     que le texte se pose desormais. Il descendait de .5 a .18, donc il eclaircissait
     precisement la zone qui allait porter le titre. */
}
.mms-maison__voile {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(1, 34, 47, 0.18), rgba(1, 34, 47, 0.68));
}
.mms-maison {
  /* LE TEXTE EST POSE SUR L'IMAGE, ET NON PLUS EMPILE DESSOUS.
     Mesure du 2026-08-06 avant correctif : media en 1440x620 puis contenu a
     y+620, sur du BLANC, sans le moindre chevauchement. Le bloc portait
     pourtant un `__voile` -- l'intention etait la depuis l'origine, la mise en
     page ne l'a jamais realisee.

     L'HISTOIRE DE CE BLOC EXPLIQUE POURQUOI. Une premiere version faisait
     remonter tout le contenu par une marge negative ; le paragraphe, en encre
     sombre, se retrouvait a cheval sur le bord bas de la photo : moitie lisible,
     moitie non. La correction d'alors a fait retomber le paragraphe sous
     l'image, et le blanc est arrive avec lui.

     LA SORTIE ETAIT DEJA ECRITE DANS CE FICHIER : « un texte pose sur une image
     est TOUJOURS sur un aplat ». Le paragraphe recoit donc le sien. Et le
     placement reprend celui de `.mms-matieres__contenu`, le bloc voisin qui
     reussit deja ce que celui-ci ratait -- on ne reinvente pas un calage qui
     fonctionne quinze sections plus haut. */
}
.mms-maison__contenu {
  position: absolute;
  inset: auto auto 0 0;
  z-index: 1;
  width: 100%;
  max-width: 1560px;
  left: 50%;
  transform: translateX(-50%);
  padding: 0 var(--mms-marge) clamp(2rem, 4vw, 3.5rem);
  display: grid;
  gap: 1.2rem;
  justify-items: start;
  /* Le titre porte deja ses propres aplats : son fond ne depend pas de ce
     qu'il y a dessous, il n'a donc besoin de rien. */
}
.mms-maison__contenu > .mms-titre {
  margin-top: 0;
}
.mms-maison__contenu {
  /* LE CARTOUCHE : un aplat plein, a angles droits, comme les etiquettes de
     ses affiches. Il rend le contraste DETERMINISTE -- une couleur sur une
     couleur, jamais une couleur sur une photo dont on ne maitrise ni le
     cadrage ni la luminosite.
     Le GRAS n'est pas un ornement : sur une image, une graisse de texte
     courant se delave des que la photo change. */
}
.mms-maison__contenu p {
  margin: 0;
  max-width: 46ch;
  line-height: 1.65;
  background: var(--color-secondary);
  color: var(--color-surface);
  font-weight: 600;
  font-size: clamp(1rem, 1.15vw, 1.1rem);
  padding: clamp(0.9rem, 1.4vw, 1.15rem) clamp(1.1rem, 1.8vw, 1.5rem);
}
.mms-maison__contenu p strong {
  color: var(--color-highlight);
  font-weight: 700;
}

/* --------------------------------------------------------------------------
   6. LES FORMULES -- une couleur par categorie, c'est SON systeme
   -------------------------------------------------------------------------- */
.mms-formules {
  background: var(--color-surface);
}
.mms-formules__tete {
  max-width: 1560px;
  margin-inline: auto;
  padding-inline: var(--mms-marge);
  display: grid;
  gap: 1.1rem;
  justify-items: start;
  margin-bottom: clamp(2.5rem, 5vw, 4.5rem);
}
.mms-formules__liste {
  list-style: none;
  margin: 0 auto;
  padding-inline: var(--mms-marge);
  max-width: 1560px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
  gap: clamp(1.25rem, 2vw, 2rem);
}

.mms-formule {
  --mms-cat: var(--color-accent);
  position: relative;
  background: var(--color-white);
  padding: clamp(1.5rem, 2.4vw, 2.2rem);
  display: grid;
  gap: 0.55rem;
  align-content: start;
  border-radius: 0;
  /* La couleur de categorie est portee par un FILET EPAIS en tete de carte,
     pas par un fond teinte : ses grandes surfaces restent pales pour ne pas
     concurrencer les travaux des enfants, qui sont tres colores. */
}
.mms-formule::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 6px;
  background: var(--mms-cat);
}
.mms-formule--annee {
  --mms-cat: var(--mms-cat-annee);
}
.mms-formule--duo {
  --mms-cat: var(--mms-cat-duo);
}
.mms-formule--stage {
  --mms-cat: var(--mms-cat-stage);
}
.mms-formule--anniv {
  --mms-cat: var(--mms-cat-anniv);
}
.mms-formule__ico {
  display: block;
  width: 30px;
  color: var(--mms-cat);
  margin-bottom: 0.3rem;
}
.mms-formule__ico svg {
  width: 100%;
  height: auto;
  stroke-width: 1.3;
}
.mms-formule__titre {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.12rem, 1.4vw, 1.3rem);
  color: var(--color-secondary);
  letter-spacing: -0.005em;
}
.mms-formule p {
  margin: 0.35rem 0 0;
  line-height: 1.68;
  font-size: 0.96rem;
  color: #4A3F44;
}
.mms-formule {
  /* LA CARTE MENE AU DETAIL DE SA FORMULE.
     Le lien n'enveloppe que le TITRE dans le patron, et son `::after`
     recouvre la carte : la souris peut cliquer partout, et le nom accessible
     du lien reste « Les ateliers de l'annee » au lieu d'avaler le tarif et
     les creneaux. Une carte entierement enveloppee dans une balise `a`
     s'annonce d'un seul tenant, et devient illisible a l'oreille. */
}
.mms-formule__lien {
  color: inherit;
  text-decoration: none;
}
.mms-formule__lien::after {
  content: "";
  position: absolute;
  inset: 0;
}
.mms-formule__lien:hover, .mms-formule__lien:focus-visible {
  /* `primary-ink` et non `primary` : le terracotta d'aplat vaut
     3,44:1 sur le rose pale et 4,06:1 sur le blanc, donc sous AA
     pour du texte. Voir la note de `_client.scss`. */
  color: var(--color-primary-ink);
  text-decoration: underline;
  text-underline-offset: 0.28em;
  text-decoration-thickness: 2px;
}
.mms-formule {
  /* Le survol se voit sur la CARTE, pas seulement sur le mot : sans lui, rien
     ne dit qu'une carte entiere est cliquable. Un filet, jamais une ombre --
     ses documents n'en portent aucune. */
}
.mms-formule:hover {
  box-shadow: inset 0 0 0 1px var(--mms-cat);
}

.mms-formules__suite {
  max-width: 1560px;
  margin: clamp(1.5rem, 3vw, 2.5rem) auto 0;
  padding-inline: var(--mms-marge);
}

/* --------------------------------------------------------------------------
   7. LES COLLAB'
   -------------------------------------------------------------------------- */
.mms-collab {
  position: relative;
  background: var(--color-secondary);
  color: var(--color-surface);
  overflow: hidden;
}
.mms-collab .mms-grille {
  align-items: center;
  row-gap: clamp(2rem, 4vw, 3.5rem);
}
.mms-collab__propos {
  grid-column: 1/span 5;
  display: grid;
  gap: 1.2rem;
  justify-items: start;
}
.mms-collab__propos p {
  margin: 0;
  max-width: 38ch;
  line-height: 1.72;
  color: rgba(253, 231, 232, 0.84);
}
.mms-collab {
  /* DEUX NOMS AU DEPART, SEPT AUJOURD'HUI : LA LISTE A CHANGE DE NATURE.
     Elle tenait en lignes « nom ......... specialite » alignees sur la
     meme base. A sept entrees, ce dessin casse : « La cuisiniste qui fait du
     bien » et « Art culinaire creatif et vegetal » ne tiennent pas cote a
     cote dans cinq colonnes, et le `nowrap` qui protegeait la specialite la
     faisait deborder de la grille au lieu de se replier.

     La specialite passe donc SOUS le nom, et la liste sur deux colonnes :
     sept entrees empilees auraient fait une colonne plus haute que le propos
     d'a cote, et deseequilibre la section. */
}
.mms-collab__noms {
  grid-column: 7/span 6;
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(1.1rem, 2vw, 1.7rem) clamp(1.5rem, 3vw, 2.75rem);
}
.mms-collab__noms li {
  display: grid;
  gap: 0.3rem;
  align-content: start;
  padding-bottom: 0.75rem;
  border-bottom: 1px solid rgba(253, 231, 232, 0.26);
}
.mms-collab__nom {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.05rem, 1.55vw, 1.35rem);
  line-height: 1.25;
  color: var(--color-white);
  text-wrap: balance;
}
.mms-collab__quoi {
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  line-height: 1.4;
  color: var(--color-highlight);
}
.mms-collab {
  /* LE PSEUDO, EN TROISIEME LIGNE (2026-08-08).
     Il est DERIVE de l'URL cote PHP, donc il ne peut pas diverger du lien.

     IL EST PLUS DISCRET QUE LA SPECIALITE, ET C'EST VOULU : la hierarchie va
     du nom (ce qu'on cherche) a la discipline (ce qui interesse) au pseudo
     (ce qui permet d'aller voir). Le mettre en abricot comme la specialite
     aurait donne deux lignes de meme rang sous le nom, et l'oeil n'aurait
     plus su laquelle lire en premier -- exactement le defaut de polarite que
     ce projet a deja paye sur ses etiquettes.

     Contraste MESURE, et non estime : le rose a 72 % compose sur le bleu
     petrole donne rgb(182,181,189), soit **6,53:1** -- au-dessus du seuil AA
     malgre sa petite taille. (La premiere ecriture de ce commentaire annoncait
     6,9 : un chiffre de tete, faux, dans un commentaire que personne n'aurait
     reverifie. C'est exactement ce que ce projet appelle une declaration
     morte, en version documentaire.)
     La hierarchie tient dans les trois valeurs : nom 13,27 > specialite
     8,24 > pseudo 6,53. */
}
.mms-collab__compte {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.74rem;
  letter-spacing: 0.02em;
  line-height: 1.4;
  color: rgba(253, 231, 232, 0.72);
  word-break: break-word;
}
.mms-collab {
  /* LE SOULIGNAGE SUIT LE SURVOL DE TOUTE LA LIGNE, pas du seul pseudo : c'est
     le bloc entier qui est cliquable, et signaler l'interaction sur une seule
     de ses trois lignes laisserait croire que les deux autres ne le sont pas. */
}
.mms-collab__lien {
  display: grid;
  gap: 0.3rem;
  text-decoration: none;
  color: inherit;
}
.mms-collab__lien:hover .mms-collab__compte, .mms-collab__lien:focus-visible .mms-collab__compte {
  color: var(--color-highlight);
  text-decoration: underline;
  text-underline-offset: 0.25em;
}

/* --------------------------------------------------------------------------
   8. LA BANDE DES OEUVRES
   --------------------------------------------------------------------------
   Meme mecanique que le bandeau des matieres, et le MEME keyframe : la piste
   est dupliquee a l'identique et se translate de la moitie de sa largeur, si
   bien que le raccord tombe pile sur le debut du second exemplaire. C'est la
   seule facon de boucler sans saut, et il n'y a aucune raison d'en ecrire une
   deuxieme version ici -- `mms-defile` existe, on s'en sert.

   Ce qui change : la HAUTEUR est fixe et la largeur suit. Les planches gardent
   donc leur format d'origine, du carre a l'italienne au portrait etroit, et
   c'est ce qui donne son rythme irregulier a la bande. Un recadrage uniforme
   aurait aligne 23 rectangles identiques -- une planche-contact, pas une
   bande. Et amputer une oeuvre d'enfant pour faire joli n'est pas une option.
   -------------------------------------------------------------------------- */
.mms-galerie {
  background: var(--color-surface);
  overflow: hidden;
  /* HAUT ET BAS NE SONT PAS SYMETRIQUES ICI, et c'est le seul endroit de la
     page ou ils ne le sont pas. Au-dessus, un titre a besoin de son air
     complet. En dessous, la bande est un objet a bord franc : lui donner le
     meme vide qu'a un paragraphe la faisait flotter au milieu du rose. Un
     cran plus bas sur LA MEME echelle -- aucune valeur inventee. */
  padding-bottom: var(--space-xxl);
}
.mms-galerie__entete {
  margin-bottom: clamp(2rem, 4vw, 3.25rem);
}
.mms-galerie__propos {
  grid-column: 2/span 8;
  display: grid;
  gap: 1.1rem;
  justify-items: start;
}
.mms-galerie__propos p {
  margin: 0;
  max-width: 52ch;
  line-height: 1.72;
  color: #4A3F44;
}
.mms-galerie__piste {
  display: flex;
  width: max-content;
  animation: mms-defile 96s linear infinite;
}
.mms-galerie__suite {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
}
.mms-galerie__vue {
  flex: 0 0 auto;
  height: clamp(180px, 24vw, 300px);
  /* Un filet clair entre deux planches : elles sont « collees », mais
     deux fonds creme voisins se confondraient sans cette couture. */
  border-right: 1px solid var(--color-surface);
}
.mms-galerie__img {
  display: block;
  width: auto;
  height: 100%;
  object-fit: contain;
}
.mms-galerie {
  /* Le survol arrete la bande : sans cela, une planche qu'on veut regarder
     s'echappe, et c'est exactement le moment ou le visiteur s'y interesse.
     NE VAUT QUE POUR LE REPLI SANS JAVASCRIPT : le survol n'existe pas sur un
     telephone, ce qui laissait la bande incontrolable la ou elle prend le plus
     de place. C'est `galerie.js` qui traite le cas general. */
}
.mms-galerie:hover .mms-galerie__piste:not(.est-pilotee), .mms-galerie:focus-within .mms-galerie__piste:not(.est-pilotee) {
  animation-play-state: paused;
}
.mms-galerie {
  /* LA BANDE PILOTEE : on ne translate plus, on DEFILE.
     La classe est posee par `galerie.js` et par lui seul -- sans le script,
     tout ce bloc reste inerte et l'animation CSS ci-dessus continue d'operer.

     Le mouvement rendu est identique, mais il devient une position de
     defilement : le swipe tactile, son inertie et son rebond sont alors pris
     en charge par le navigateur, ce qu'aucun code maison n'egale. La piste
     reprend la largeur du conteneur -- en `max-content` elle deborde sans
     jamais pouvoir defiler -- et ce sont ses deux exemplaires qui debordent
     a l'interieur. */
}
.mms-galerie__piste.est-pilotee {
  width: 100%;
  overflow-x: auto;
  animation: none;
  cursor: grab;
  /* La barre de defilement est retiree : elle traverserait la bande de
     part en part, et le geste est deja indique par le curseur et par le
     mouvement lui-meme. Le parcours au clavier reste possible. */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.mms-galerie__piste.est-pilotee::-webkit-scrollbar {
  display: none;
}
.mms-galerie__piste.est-pilotee {
  /* Sans cela, arriver au bout de la bande d'un coup de doigt declenche
     le geste de retour arriere du navigateur, et le visiteur quitte la
     page en croyant faire glisser une image. */
  overscroll-behavior-x: contain;
}
.mms-galerie__piste.est-pilotee.est-saisie {
  cursor: grabbing;
}
.mms-galerie__piste.est-pilotee {
  /* LES DEUX EXEMPLAIRES GARDENT LEUR LARGEUR NATURELLE.
     La piste etait en `width: max-content` : ses `ul` prenaient donc la
     place qu'il leur fallait. En passant a `width: 100%`, ils sont
     devenus deux enfants flex qui se PARTAGENT la largeur visible, et
     `getBoundingClientRect()` a cesse de dire leur vraie taille --
     mesure du 2026-08-07 : 720px annonces pour un exemplaire qui en fait
     3146. Le contenu debordait quand meme (les planches sont en
     `flex: 0 0 auto`), donc le rendu semblait juste : seul le CALCUL de
     la vitesse etait faux, et il l'etait d'un facteur quatre. */
}
.mms-galerie__piste.est-pilotee .mms-galerie__suite {
  flex: 0 0 auto;
}

/* --------------------------------------------------------------------------
   9. LA FONDATRICE -- sa carte de couleur decalee derriere la photo
   -------------------------------------------------------------------------- */
.mms-fondatrice {
  background: var(--color-white);
}
.mms-fondatrice .mms-grille {
  align-items: center;
  row-gap: clamp(2.5rem, 5vw, 4rem);
}
.mms-fondatrice__media {
  grid-column: 1/span 6;
  position: relative;
  margin: 0;
  z-index: 0;
  /* Le procede releve sur son A3 : un aplat franc, decale, en guise de
     socle. Pas une ombre portee -- ses documents n'en portent aucune. */
}
.mms-fondatrice__media::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset: auto auto -22px -22px;
  width: 100%;
  height: 100%;
  background: var(--color-accent);
}
.mms-fondatrice__img {
  display: block;
  width: 100%;
  height: auto;
}
.mms-fondatrice__mot {
  grid-column: 8/span 5;
  display: grid;
  gap: 1rem;
  justify-items: start;
}
.mms-fondatrice__mot p {
  margin: 0;
  line-height: 1.74;
  max-width: 44ch;
}
.mms-fondatrice__nom {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2rem, 3.4vw, 3.1rem);
  color: var(--color-secondary);
  letter-spacing: -0.02em;
  line-height: 1.05;
}

/* --------------------------------------------------------------------------
   10. LES MATIERES
   -------------------------------------------------------------------------- */
.mms-matieres {
  position: relative;
  isolation: isolate;
  /* Meme mecanique que `mms-maison` : la decoupe rend la derive possible.
     Et meme hauteur -- 80vh sans plafond, comme le hero (2026-08-09). Elle
     plafonnait a 600px, soit 56% seulement de la hauteur d'un ecran courant :
     c'etait la plus courte des treize sections de l'accueil. */
}
.mms-matieres__media {
  position: relative;
  overflow: hidden;
  min-height: 80vh;
}
.mms-matieres__img {
  display: block;
  width: 100%;
  height: 128%;
  position: absolute;
  inset: -14% 0 auto 0;
  object-fit: cover;
}
.mms-matieres {
  /* Le voile reste calé sur le CADRE et non sur l'image : il ne doit pas
     deriver avec elle, sinon le texte qu'il protege perdrait son fond en
     cours de course. */
}
.mms-matieres__voile {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(90deg, rgba(1, 34, 47, 0.66), rgba(1, 34, 47, 0.18));
}
.mms-matieres__contenu {
  position: absolute;
  inset: auto auto 0 0;
  z-index: 1;
  width: 100%;
  max-width: 1560px;
  left: 50%;
  transform: translateX(-50%);
  padding: 0 var(--mms-marge) clamp(2rem, 4vw, 3.5rem);
  display: grid;
  gap: 1rem;
  justify-items: start;
}
.mms-matieres__contenu p {
  margin: 0;
  max-width: 40ch;
  color: var(--color-surface);
  line-height: 1.7;
}

/* --------------------------------------------------------------------------
   11. LES QUESTIONS -- section SERREE
   -------------------------------------------------------------------------- */
.mms-questions {
  background: var(--color-surface);
  /* PLUS SERREE QUE LE MANIFESTE, MAIS SUR L'ECHELLE DU SOCLE.
     L'intention tient : c'est l'ECART entre deux sections qui fait le rythme,
     et une page dont tout respire pareil n'en a aucun. La VALEUR, elle,
     etait fausse -- un `clamp(2.5rem, 5vw, 4.5rem)` invente, en dessous du
     plus petit cran de l'echelle, qui ecrasait le titre et les trois
     questions entre la photo des pigments et le bloc d'inscription.

     `--space-xxl` (4rem a 8rem) contre `--space-xxxl` (5rem a 12rem) pour
     les autres sections : l'ecart reste franc, et il suit le reglage global
     au lieu de vivre a cote. */
  padding-block: var(--space-xxl);
}
.mms-questions .mms-grille {
  align-items: start;
  row-gap: 2rem;
}
.mms-questions__tete {
  grid-column: 1/span 4;
  display: grid;
  gap: 1rem;
  justify-items: start;
}
.mms-questions__liste {
  grid-column: 6/span 7;
}

.mms-question {
  border-top: 1px solid rgba(172, 98, 89, 0.28);
}
.mms-question:last-child {
  border-bottom: 1px solid rgba(172, 98, 89, 0.28);
}
.mms-question summary {
  cursor: pointer;
  list-style: none;
  padding: 1.15rem 2.5rem 1.15rem 0;
  position: relative;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1rem, 1.25vw, 1.14rem);
  color: var(--color-secondary);
}
.mms-question summary::-webkit-details-marker {
  display: none;
}
.mms-question summary {
  /* Le signe change d'etat : la couleur seule ne doit jamais etre le
     seul indicateur (regle d'accessibilite du skill). */
}
.mms-question summary::after {
  content: "+";
  position: absolute;
  right: 0.2rem;
  top: 50%;
  transform: translateY(-50%);
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 1.3rem;
  color: var(--color-primary-ink);
}
.mms-question[open] summary::after {
  content: "–";
}
.mms-question__reponse p {
  margin: 0 0 1.3rem;
  max-width: 62ch;
  line-height: 1.74;
  color: #4A3F44;
}

/* --------------------------------------------------------------------------
   12. LES AVIS GOOGLE -- on REPEINT le rendu du socle, on ne le refait pas
   --------------------------------------------------------------------------
   Le patron appelle `proto_avis_render()` : le HTML et les classes
   `.proto-avis__*` appartiennent au socle. Les regles ci-dessous ne font que
   les rehabiller DANS LE CONTEXTE `.mms-avis`. Aucune n'est portee sur
   `.proto-avis` seul -- une feature repeinte globalement par un fork cesse de
   ressembler a elle-meme partout ailleurs, et le jour ou le socle evolue,
   personne ne sait plus qui a decide quoi.

   LE LOGO GOOGLE ET LES LIENS RESTENT. Ce sont eux qui font la preuve : un avis
   qui ne pointe pas vers sa source n'est qu'un temoignage recopie.
   -------------------------------------------------------------------------- */
.mms-avis {
  background: var(--color-white);
  /* La bande d'avis sort de la gouttiere pour atteindre le bord de l'ecran :
     sans decoupe ici, elle ajouterait une barre de defilement horizontale a
     la PAGE ENTIERE. `clip` plutot que `hidden` : `hidden` ferait de la
     section un conteneur de defilement, ce qui casserait tout `position:
     sticky` a l'interieur et modifierait le comportement des ancres. */
  overflow-x: clip;
}
.mms-avis .mms-grille {
  align-items: start;
  row-gap: clamp(2rem, 4vw, 3rem);
}
.mms-avis {
  /* LE TITRE ET LES AVIS SONT EMPILES, PAS COTE A COTE, ET C'EST UNE
     CORRECTION. Ils occupaient deux colonnes voisines (1-4 et 5-12), ce qui
     semblait sain -- sauf que le titre-affiche DEBORDE volontairement de sa
     colonne : ses lignes sont decalees les unes par rapport aux autres, et
     la plus longue passait sous les cartes d'avis. Un titre qui deborde ne
     peut pas cohabiter lateralement avec un bloc dense ; il lui faut sa
     largeur entiere. */
}
.mms-avis__propos {
  grid-column: 1/-1;
  display: grid;
  gap: 1.2rem;
  justify-items: start;
  margin-bottom: clamp(1.75rem, 3.5vw, 3rem);
}
.mms-avis__socle {
  grid-column: 1/-1;
}
.mms-avis {
  /* UNE SECTION IMBRIQUEE NE DOIT PAS PORTER DES ESPACEMENTS DE SECTION.
     SOURCE : `dist/features/avis-google.css` --
     `.proto-avis { padding-block: var(--space-xxl); padding-inline: var(--space-l) }`.
     C'est juste quand la feature occupe la page entiere ; ici elle vit dans
     une colonne d'une grille qui pose deja sa gouttiere et son rythme.

     Les deux se cumulaient donc, et ni l'un ni l'autre ne se voyait comme
     tel. Mesure du 2026-08-05 : la liste ne faisait que 619px dans un
     conteneur de 747 -- 64px voles de chaque cote -- ce qui empechait une
     troisieme carte de tenir ; et le `padding-block` s'ajoutait au
     `.inner_spacer_y` de la section, d'ou le grand vide sous les avis.
     Deux symptomes sans rapport apparent, une seule cause. */
}
.mms-avis .proto-avis {
  padding: 0;
}
.mms-avis {
  /* Tout le bloc d'avis cale a DROITE, sous un titre cale a gauche : c'est le
     decalage qui fait la composition. Le score, la liste et le lien vers
     Google suivent donc le meme bord. */
}
.mms-avis .proto-avis__head {
  margin-bottom: clamp(1.25rem, 2.5vw, 2rem);
}
.mms-avis .proto-avis__score {
  display: flex;
  align-items: baseline;
  gap: 0.7rem;
  flex-wrap: wrap;
  justify-content: flex-end;
  margin: 0;
}
.mms-avis {
  /* LE SOCLE CENTRE SES BLOCS ET LES BORNE A 1280px -- il est fait pour une
     page entiere. Ici, la largeur utile est deja celle de la grille de la
     page, et un second centrage a l'interieur empeche tout calage sur un
     bord : mesure du 2026-08-05, la liste ne faisait que 1011px dans un
     conteneur de 1312 et se centrait, si bien que `justify-content: end`
     n'avait plus rien a pousser. On rend donc leur pleine largeur au bandeau
     de score et a la liste, et ce sont eux qui alignent leur contenu. */
}
.mms-avis .proto-avis__head,
.mms-avis .proto-avis__list {
  max-width: none;
  margin-inline: 0;
  width: 100%;
}
.mms-avis .proto-avis__score-num {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(2rem, 3.4vw, 2.9rem);
  line-height: 1;
  color: var(--color-primary);
}
.mms-avis .proto-avis__stars {
  color: var(--color-highlight-ink);
  font-size: 1.15rem;
  letter-spacing: 0.08em;
}
.mms-avis .proto-avis__count {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: var(--color-secondary);
}
.mms-avis {
  /* LE NOMBRE DE COLONNES RESTE CELUI DU SOCLE, ET C'EST UN RETOUR EN
     ARRIERE ASSUME. Ce fork avait force `repeat(2, minmax(0, 1fr))`.
     Or elle a QUATRE avis dont un sans texte -- le socle saute les avis
     vides (`fetch.php`) -- donc trois cartes : en deux colonnes, la
     troisieme restait seule sur sa ligne. L'`auto-fit` du socle en pose
     trois de front quand la place existe, et se replie tout seul quand elle
     manque ou qu'un avis s'ajoute.

     C'est la regle de ce fichier appliquee a la lettre : on REPEINT une
     feature, on ne redecide pas sa structure. Seul l'ecartement suit
     l'echelle de la page. */
  /* UNE SEULE LIGNE, QU'ON FAIT GLISSER (arbitrage Jonathan, 2026-08-07).
     C'est la meme reponse que pour la bande des oeuvres, au meme probleme :
     le nombre d'avis ne nous appartient pas. Elle en avait quatre, puis
     cinq ; toute mise en page qui « tombe juste » pour un compte donne se
     recasse au suivant. En grille, quatre laissaient un orphelin et cinq en
     auraient laisse un autre.

     Une ligne unique n'a plus de derniere ligne a rattraper : elle deborde,
     et le debordement devient le geste. `galerie.js` y pose le glisser a la
     souris ; le doigt, lui, est servi par le navigateur.

     LE CALAGE A DROITE DE LA COMPOSITION DISPARAIT ICI, ET C'EST VOULU. Une
     piste qui deborde ET qui se cale a droite rend son DEBUT inatteignable :
     le contenu passe en dehors du bord de depart du defilement. Le bandeau
     de score, lui, reste a droite -- c'est lui qui tient le decalage. */
}
.mms-avis .proto-avis__list {
  gap: clamp(1rem, 2vw, 1.6rem);
  display: flex;
  flex-wrap: nowrap;
  justify-content: flex-start;
  align-items: stretch;
}
.mms-avis {
  /* NI GRANDIR NI RETRECIR (`flex: 0 0`). En bande, un `flex-shrink` par
     defaut comprimerait les cinq cartes dans la largeur disponible au lieu
     de les faire deborder : il n'y aurait plus rien a faire glisser, et des
     cartes illisibles. La borne de 320px reste celle d'avant -- des cartes
     de 470px pour six lignes de texte se lisent mal. */
}
.mms-avis .proto-avis__item {
  flex: 0 0 320px;
}
.mms-avis {
  /* Meme mecanique que la bande des oeuvres, et la classe est posee par le
     meme script. Les avis ne defilent JAMAIS seuls : ce sont des phrases a
     lire, et un texte qui avance pendant qu'on le lit est une nuisance. */
}
.mms-avis .proto-avis__list.est-pilotee {
  overflow-x: auto;
  cursor: grab;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.mms-avis .proto-avis__list.est-pilotee::-webkit-scrollbar {
  display: none;
}
.mms-avis .proto-avis__list.est-pilotee {
  overscroll-behavior-x: contain;
  /* ELLE VA JUSQU'AU BORD DE L'ECRAN (arbitrage Jonathan, 2026-08-07).
     Une bande qui s'arrete sur la gouttiere de la page ne se lit pas
     comme « ca continue », mais comme « c'est coupe » : le vide a droite
     donne l'impression d'une carte tronquee par erreur, pas d'un
     defilement. On annule donc, a DROITE seulement, ce qui l'en separe :
     la gouttiere de la grille, et la moitie du vide de centrage quand la
     fenetre depasse la largeur maximale de la page. Le bord GAUCHE reste
     aligne sur le texte -- c'est lui qui tient la composition.

     `max(0px, ...)` parce que sous 1560px il n'y a aucun vide de
     centrage a rattraper : sans lui, la marge deviendrait positive et
     rentrerait la bande au lieu de la sortir. */
  /* `width: auto` EST INDISPENSABLE, et c'est tout sauf evident : la
     regle qui rend sa pleine largeur a la liste (plus haut dans ce
     fichier) lui pose `width: 100%`. Avec une largeur EXPLICITE, une
     marge droite negative n'elargit rien du tout -- elle ne fait que
     decaler ce qui suit dans le flux. Mesure du 2026-08-07 : la bande
     restait a 64px du bord a 1440, et a 184px a 1800, soit trait pour
     trait ce que la marge etait censee annuler. La declaration etait
     ecrite, juste, et sans le moindre effet. */
  width: auto;
  margin-right: calc(-1 * (max(0px, 100vw - 1560px) / 2 + var(--mms-marge)));
  padding-right: var(--mms-marge);
  /* LE FONDU DIT « CA CONTINUE ». Un masque plutot qu'un degrade pose
     par-dessus : il suit le fond quel qu'il soit, alors qu'un calque
     colore aurait fige le blanc de cette section et se serait vu ailleurs.
     Il disparait quand la bande est au bout -- garder un fondu la ou il
     n'y a plus rien promettrait un contenu qui n'existe pas. */
  --mms-fondu: clamp(2.5rem, 7vw, 6rem);
  mask-image: linear-gradient(to right, #000 calc(100% - var(--mms-fondu)), transparent);
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - var(--mms-fondu)), transparent);
  transition: mask-image 0.25s linear;
}
.mms-avis .proto-avis__list.est-pilotee.est-au-bout {
  mask-image: none;
  -webkit-mask-image: none;
}
.mms-avis .proto-avis__list.est-pilotee.est-saisie {
  cursor: grabbing;
}
.mms-avis {
  /* Le fond rose pale plutot qu'une ombre portee : ses documents n'en portent
     aucune, le relief y vient de la couleur. */
}
.mms-avis .proto-avis__item {
  background: var(--color-surface);
  border-radius: 0;
  box-shadow: none;
  padding: clamp(1.15rem, 2vw, 1.6rem);
  display: grid;
  gap: 0.55rem;
  align-content: start;
  position: relative;
}
.mms-avis .proto-avis__glogo {
  position: absolute;
  top: 1rem;
  right: 1rem;
  opacity: 0.75;
}
.mms-avis .proto-avis__meta {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  flex-wrap: wrap;
}
.mms-avis .proto-avis__photo {
  border-radius: 50%;
}
.mms-avis .proto-avis__author {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: 1rem;
  color: var(--color-secondary);
  text-decoration: none;
}
.mms-avis .proto-avis__author:hover, .mms-avis .proto-avis__author:focus-visible {
  text-decoration: underline;
  text-underline-offset: 0.3em;
}
.mms-avis .proto-avis__when {
  font-size: 0.78rem;
  color: #6B5C60;
}
.mms-avis .proto-avis__rating {
  color: var(--color-highlight-ink);
  letter-spacing: 0.06em;
}
.mms-avis .proto-avis__text {
  margin: 0;
  font-size: 0.95rem;
  line-height: 1.65;
  color: var(--color-text);
  /* Quatre avis de longueurs tres inegales donnaient des cartes en
     escalier. On borne, et le lien vers Google porte la suite. */
  display: -webkit-box;
  -webkit-line-clamp: 7;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.mms-avis {
  /* LE LIEN VERS GOOGLE SUIT LE MEME BORD QUE LES CARTES.
     Deux pieges enchaines ici, et le second etait de mon fait.

     1. Le socle le pose en `display: flex; width: fit-content;
        margin: var(--space-l) auto 0` : les deux `auto` le CENTRENT. Un
        `text-align: right` n'a aucune prise la-dessus -- il aligne le
        contenu D'UN bloc, pas le bloc lui-meme.
     2. Corriger par `margin-left: auto` ne suffisait pas non plus tant que
        ce fichier lui imposait `display: inline-block` : sur un inline-block,
        une marge automatique est calculee a ZERO. Les marges auto ne
        deplacent que les elements de niveau bloc. Mesure du 2026-08-05 :
        `margin` calcule a `24px 0px 0px` malgre la regle `auto`.

     D'ou ce triplet, indissociable : niveau bloc, largeur ajustee au
     contenu, et une seule marge automatique -- a gauche. */
}
.mms-avis .proto-avis__more {
  display: block;
  width: fit-content;
  margin: clamp(1rem, 2vw, 1.5rem) 0 0 auto;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.8rem;
  letter-spacing: 0.06em;
  color: var(--color-primary-ink);
  text-underline-offset: 0.35em;
}

/* --------------------------------------------------------------------------
   13. L'INSCRIPTION
   -------------------------------------------------------------------------- */
.mms-inscription {
  position: relative;
  overflow: hidden;
  background: var(--color-primary-ink);
  color: var(--color-on-primary);
  text-align: center;
  padding-inline: var(--mms-marge);
  display: grid;
  justify-items: center;
  gap: 1.35rem;
}
.mms-inscription__titre {
  display: grid;
  justify-items: center;
}
.mms-inscription__mot {
  margin: 0;
  max-width: 44ch;
  line-height: 1.7;
  font-size: clamp(1rem, 1.2vw, 1.12rem);
}
.mms-inscription__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  justify-content: center;
  margin: 0.5rem 0 0;
}
.mms-inscription {
  /* Meme respiration que dans le hero : l'adresse n'est pas un troisieme bouton. */
}
.mms-inscription__adresse {
  margin: clamp(1.3rem, 2.4vw, 2.2rem) 0 0;
}

/* --------------------------------------------------------------------------
   LES SORTIES AJOUTEES DANS LE CORPS DE L'ACCUEIL (2026-08-07)
   --------------------------------------------------------------------------
   Mesure avant : DIX sections sur treize n'avaient aucune sortie, soit 7,3
   ecrans d'affilee entre le hero et le bloc d'inscription. Trois sorties ont
   ete ajoutees, pas dix : une page ou chaque section pousse a l'action se lit
   comme un tunnel, et « institution, pas activite » est un principe du contrat
   de design. Chacune repond a la question que le lecteur se pose A CET
   ENDROIT -- « quand ? » apres les artistes, « comment m'inscrire ? » apres la
   fondatrice, « et ma question a moi ? » apres la FAQ.
   -------------------------------------------------------------------------- */
/* `grid-column` MANQUAIT, ET C'EST TOUTE L'EXPLICATION (2026-08-08).
   Ce paragraphe est un enfant DIRECT de `.mms-grille`. Sans portee de colonne,
   il n'en occupe qu'UNE SEULE -- mesure : **69,7px de large dans une grille de
   1440**, et « Voir les prochaines dates » se cassait sur TROIS lignes, mots
   coupes en plein milieu (le `overflow-wrap: break-word` herite fait le reste).

   Ses deux voisins de la meme section, `__propos` et `__noms`, portent tous
   deux `grid-column: 1 / -1`. Celui-la ne l'a jamais eu : il a ete ajoute en
   session 7 avec les sorties de section, et la ligne de portee a ete oubliee.
   Rien ne le signalait -- le texte s'affichait, simplement illisible. */
/* DEUX SORTIES DEPUIS LE 2026-08-12 -- la page des Collab' d'abord, l'Agenda
   ensuite -- d'ou le passage en flex : deux liens dans un `<p>` se suivraient
   sans le moindre espace, et se liraient comme un seul libelle. Le `wrap` les
   empile sur un telephone plutot que de les serrer. */
.mms-collab__sortie {
  grid-column: 1/-1;
  margin: clamp(1.4rem, 2.6vw, 2.4rem) 0 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem 1.8rem;
}

.mms-fondatrice__actions {
  margin: clamp(1.2rem, 2.2vw, 1.9rem) 0 0;
}

.mms-questions__sortie {
  margin: clamp(1.5rem, 2.8vw, 2.4rem) 0 0;
  font-size: clamp(0.94rem, 1.05vw, 1.02rem);
  line-height: 1.7;
  color: var(--color-text);
}

/* --------------------------------------------------------------------------
   L'ADRESSE, QUI MENE A SA FICHE GOOGLE MAPS
   --------------------------------------------------------------------------
   Elle etait rendue par `mms_etiquette()` : capitales tres espacees, graisse
   700 et aplat abricot. C'est le traitement d'un LIBELLE -- « L'AGENDA »,
   « NOTRE PARTI PRIS » -- alors qu'une adresse est une information qu'on lit,
   qu'on recopie et sur laquelle on clique. Le mot d'ordre du contrat de design
   s'applique : la polarite separe les NIVEAUX, et une adresse n'est pas du
   meme niveau qu'un intertitre.
   -------------------------------------------------------------------------- */
.mms-adresse {
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 400;
  font-size: clamp(0.92rem, 1.05vw, 1rem);
  line-height: 1.6;
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 0.3em;
  text-decoration-thickness: 1px;
  text-decoration-color: color-mix(in srgb, currentColor 45%, transparent);
  transition: text-decoration-color 0.2s ease, color 0.2s ease;
}
.mms-adresse:hover, .mms-adresse:focus-visible {
  color: var(--color-primary-ink);
  text-decoration-color: currentColor;
}

/* Sur les sections peintes (l'inscription est en terracotta), l'encre de survol
   doit s'eclaircir : `primary-ink` y disparaitrait. */
.mms-inscription .mms-adresse:hover,
.mms-inscription .mms-adresse:focus-visible {
  color: var(--color-on-primary);
}

/* Un titre centre doit voir ses lignes centrees, sinon le decalage lateral du
   systeme affiche le fait boiter. Le decalage est donc neutralise ici. */
.mms-inscription .mms-aff__l {
  margin-left: 0 !important;
}

.mms-inscription .mms-aff {
  display: grid;
  justify-items: center;
}

/* --------------------------------------------------------------------------
   RESPONSIVE
   --------------------------------------------------------------------------
   La grille de 12 colonnes ne tient pas sous 900 px : les placements explicites
   y produiraient des colonnes de deux caracteres. On repasse en flux simple, et
   les decalages d'escalier disparaissent -- sur un ecran etroit ils ne se
   lisent plus comme une composition, seulement comme des trous.
   -------------------------------------------------------------------------- */
@media (max-width: 900px) {
  .mms-grille {
    grid-template-columns: minmax(0, 1fr);
  }
  .mms-hero__contenu,
  .mms-hero__media,
  .mms-manifeste__chiffre,
  .mms-manifeste__propos,
  .mms-collab__propos,
  .mms-collab__noms,
  .mms-fondatrice__media,
  .mms-fondatrice__mot,
  .mms-galerie__propos,
  .mms-questions__tete,
  .mms-questions__liste {
    grid-column: 1/-1;
  }
  /* Deux colonnes de noms dans une gouttiere de telephone donneraient des
     colonnes de six caracteres : une seule, et les sept se lisent. */
  .mms-collab__noms {
    grid-template-columns: minmax(0, 1fr);
  }
  .mms-hero__media::before {
    inset: 16px -16px -16px auto;
  }
  .mms-hero__cadre {
    aspect-ratio: 4/3;
  }
  .mms-manifeste__chiffre {
    margin-top: 0;
  }
  .mms-manifeste__propos {
    margin-top: 0;
  }
  .mms-piliers__liste {
    grid-template-columns: minmax(0, 1fr);
  }
  .mms-pilier:nth-child(2),
  .mms-pilier:nth-child(3) {
    margin-top: 0;
  }
  /* Sur telephone, le contenu SORT de l'image et devient un bloc plein, exactement
     comme `.mms-matieres__contenu` ci-dessous : superposer un titre a deux niveaux
     et un paragraphe sur une image de 340px les tasserait l'un sur l'autre.
     Le cartouche du paragraphe s'efface alors -- il ferait un bleu sur un bleu --
     mais le GRAS et l'encre claire restent : c'est le meme bloc, pas un autre. */
  .mms-maison__contenu {
    position: static;
    transform: none;
    left: auto;
    background: var(--color-secondary);
    padding-block: var(--space-m);
  }
  .mms-maison__voile {
    background: rgba(1, 34, 47, 0.45);
  }
  .mms-maison__contenu p {
    background: transparent;
    padding-inline: 0;
  }
  .mms-matieres__contenu {
    position: static;
    transform: none;
    left: auto;
    background: var(--color-secondary);
    padding-block: var(--space-m);
  }
  .mms-matieres__voile {
    background: rgba(1, 34, 47, 0.45);
  }
  .mms-hero__titre {
    margin-left: 0;
  }
  .mms-pastille {
    display: none;
  }
}
@media (prefers-reduced-motion: reduce) {
  .mms-bandeau__piste,
  .mms-galerie__piste,
  .mms-pastille svg {
    animation: none;
  }
  /* Le carrousel ne demarre pas non plus (le script s'en charge), mais ses
     animations d'entree doivent tomber ici aussi : un fondu et un rapproche
     se declenchent au premier rendu, avant meme que le script ait la main. */
  .mms-carrousel__vue {
    transition: none;
  }
  .mms-carrousel__vue.est-active .mms-carrousel__img,
  .mms-carrousel__segment.est-active::after {
    animation: none;
  }
  .mms-carrousel__segment.est-active::after {
    width: 100%;
  }
  /* La bande s'arrete, donc elle doit pouvoir se parcourir a la main. La
     piste reprend la largeur du conteneur -- en `max-content` elle deborde
     sans jamais defiler -- et le second exemplaire, qui n'existait que pour
     la boucle, disparait : a l'arret il ne serait qu'un doublon. */
  .mms-galerie__piste {
    width: 100%;
    overflow-x: auto;
  }
  .mms-galerie__suite[aria-hidden=true] {
    display: none;
  }
}
/* ==========================================================================
   LE CHROME DU FORK -- header et pied de page.
   Patrons : `template-parts/chrome/header-mms.php` et `footer-mms.php`,
   servis par le filtre `proto_chrome_variant` (inc/fork.php).

   Ce fichier ne pose QUE l'apparence. Toute la mecanique -- ouverture du menu
   mobile, voile, menu WordPress -- reste celle du socle, dont les classes sont
   conservees dans le patron (`site-nav__toggle`, `site-nav__collapse`,
   `data-pmb-drawer`). Une seule mecanique, un seul comportement a maintenir.
   ========================================================================== */
/* --------------------------------------------------------------------------
   LA BARRE HAUTE
   --------------------------------------------------------------------------
   Un aplat terracotta plein, du texte en capitales espacees : c'est le procede
   de ses ETIQUETTES imprimees, porte a la largeur de l'ecran. Elle donne au
   site sa premiere couleur de marque avant meme le logo.
   -------------------------------------------------------------------------- */
.mms-topbar {
  background: var(--color-primary);
  color: var(--color-on-primary);
}
.mms-topbar__inner {
  max-width: 1560px;
  margin-inline: auto;
  padding: 0.55rem var(--mms-marge);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
}
.mms-topbar__right {
  display: flex;
  align-items: center;
  gap: clamp(0.9rem, 2vw, 1.6rem);
}
.mms-topbar__item {
  color: inherit;
  text-decoration: none;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.13em;
  text-transform: uppercase;
}
.mms-topbar__item:hover, .mms-topbar__item:focus-visible {
  text-decoration: underline;
  text-underline-offset: 0.3em;
}
.mms-topbar__item--fort {
  font-weight: 700;
}

.mms-social {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  /* LA PASTILLE EST PLEINE AU REPOS, ET NON AU SURVOL.
     Mesure du 2026-08-06 sur l'etat de REPOS : 3,56:1 au header, et 1,1:1 au pied.
     Une icone nue prend la couleur de son contexte, donc elle depend d'un fond qui
     n'a pas ete choisi pour elle. Un aplat plein, lui, emporte son propre contraste
     -- et c'est aussi le procede des affiches de la cliente, qui ne connaissent que
     des aplats.

     LE SELECTEUR PORTE DEUX CLASSES, ET C'EST LA CORRECTION DE FOND. Le socle pose
     `.site-footer a { color: var(--color-text) }`, soit une classe PLUS un element :
     il battait `.mms-social__link` (une seule classe) et le `color: inherit` n'a
     jamais rien herite. Le `color: highlight` pose sur le parent `.mms-social--pied`
     etait donc mort : une regle plus specifique colorait l'enfant directement.
     Meme famille que le piege A6, en version specificite au lieu de !important. */
}
.mms-social .mms-social__link {
  position: relative;
  display: grid;
  place-items: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--color-on-primary);
  color: var(--color-primary-ink);
  transition: background-color 0.2s ease, color 0.2s ease;
  /* Cible tactile de 44px SANS toucher a la mise en page : la pastille reste
     dessinee a 28px, la zone cliquable est etendue par un pseudo-element.
     Agrandir le lien lui-meme aurait fait grossir la barre fine du header. */
}
.mms-social .mms-social__link::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 44px;
  height: 44px;
  transform: translate(-50%, -50%);
}
.mms-social .mms-social__link {
  /* Le survol INVERSE l'aplat. Pas de transformation d'echelle : elle
     deplacerait ses voisines dans une barre serree. */
}
.mms-social .mms-social__link:hover, .mms-social .mms-social__link:focus-visible {
  background: var(--color-secondary);
  color: var(--color-on-primary);
}

/* --------------------------------------------------------------------------
   LA BARRE DE NAVIGATION
   -------------------------------------------------------------------------- */
.mms-header {
  /* Collante, mais SANS ombre portee : ses documents n'en portent aucune, le
     relief y vient de la couleur et du decalage. Un filet suffit a detacher
     la barre du contenu qui defile dessous. */
  position: sticky;
  top: 0;
  z-index: 60;
}

.mms-nav {
  background: var(--color-white);
  border-bottom: 1px solid rgba(172, 98, 89, 0.22);
}
.mms-nav__inner {
  max-width: 1560px;
  margin-inline: auto;
  padding: 0.7rem var(--mms-marge);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: clamp(1rem, 3vw, 2.5rem);
}
.mms-nav {
  /* SON logo porte l'enseigne complete. Sa hauteur est le seul reglage : le
     SVG est en ratio 4,3:1, la largeur suit.

     ON CIBLE `img` ET `svg`, ET C'EST INDISPENSABLE : le plugin SVG Support,
     actif sur ce site, REMPLACE au chargement le `<img src="*.svg">` par le
     SVG inline (classes `replaced-svg svg-replaced-N`). Une regle qui ne
     vise que `img` cesse donc de s'appliquer une fois la page chargee, et le
     logo se retrouve sans dimensions -- invisible, sans la moindre erreur.
     Mesure du 2026-08-05 : `document.querySelector('.mms-nav__logo img')`
     rend `null` en front alors que le HTML servi contient bien l'`<img>`. */
}
.mms-nav__logo {
  display: block;
  flex: 0 0 auto;
  line-height: 0;
}
.mms-nav__logo img, .mms-nav__logo svg {
  display: block;
  height: clamp(30px, 3.4vw, 44px);
  width: auto;
}
.mms-nav__collapse {
  display: flex;
  align-items: center;
  gap: clamp(1rem, 2.5vw, 2.2rem);
}
.mms-nav__menu {
  display: flex;
  align-items: center;
  gap: clamp(0.9rem, 2vw, 2rem);
  list-style: none;
  margin: 0;
  padding: 0;
}
.mms-nav__menu a {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-secondary);
  text-decoration: none;
  padding-block: 0.4rem;
  border-bottom: 2px solid transparent;
  transition: color 0.2s ease, border-color 0.2s ease;
}
.mms-nav__menu a:hover, .mms-nav__menu a:focus-visible {
  color: var(--color-primary);
  border-bottom-color: var(--color-primary);
}
.mms-nav__menu {
  /* La page courante se signale par le TRAIT, pas seulement par la
     couleur : la couleur seule ne doit jamais etre le seul indicateur. */
}
.mms-nav__menu .current-menu-item > a,
.mms-nav__menu .current_page_item > a {
  color: var(--color-primary);
  border-bottom-color: var(--color-primary);
}
.mms-nav__cta {
  flex: 0 0 auto;
  padding: 0.8em 1.6em;
  font-size: 0.8rem;
}
.mms-nav__toggle {
  display: none;
}

/* --------------------------------------------------------------------------
   LE PIED DE PAGE
   -------------------------------------------------------------------------- */
.mms-footer {
  background: var(--color-secondary);
  color: var(--color-surface);
  font-family: "Montserrat", system-ui, sans-serif;
  /* UN CRAN EN DESSOUS DES SECTIONS DE CONTENU, ET C'EST VOULU.
     `.inner_spacer_y` vaut `--space-xxxl` : juste pour une section qui porte
     un propos, beaucoup trop pour un pied de page, ou il ouvrait un vide de
     plus de 180px au-dessus du premier mot (mesure en capture). On consomme
     le cran inferieur de LA MEME echelle -- pas une valeur inventee. */
}
.mms-footer__haut {
  padding-block: var(--space-xxl);
  row-gap: clamp(2.25rem, 4vw, 3.5rem);
  align-items: start;
}
.mms-footer__marque {
  grid-column: 1/span 3;
  display: grid;
  gap: 1rem;
  justify-items: start;
}
.mms-footer__col {
  grid-column: span 3;
  display: grid;
  gap: 0.9rem;
  justify-items: start;
}
.mms-footer {
  /* La colonne d'action portait un bouton casse sur trois lignes : une pilule
     n'a pas de place pour se replier. Elle recoit une colonne de plus, et le
     bouton refuse le retour a la ligne. */
}
.mms-footer__col--action {
  grid-column: span 3;
}
.mms-footer {
  /* Le logo est monochrome terracotta : sur le bleu petrole, son contraste
     tombe. Comme le plugin SVG Support l'a rendu INLINE (voir la note du
     header), sa couleur se pilote directement : on repeint son unique classe
     interne plutot que d'appliquer un `filter`, qui ne saurait donner qu'un
     blanc pur. Ici c'est son rose pale qui est pose, celui de son logo.
     Le `filter` reste en repli pour le cas ou le plugin serait desactive et
     l'image servie en `<img>`. */
}
.mms-footer__logo img, .mms-footer__logo svg {
  display: block;
  height: clamp(34px, 3.6vw, 48px);
  width: auto;
}
.mms-footer__logo img {
  filter: brightness(0) invert(1);
}
.mms-footer__logo svg .cls-1, .mms-footer__logo svg path {
  fill: var(--color-surface);
}
.mms-footer {
  /* SA VIGNETTE CARREE (2026-08-07, demande de Jonathan).
     Deux reglages de la version horizontale doivent etre DEFAITS ici, et pas
     seulement completes :
       - le `filter: brightness(0) invert(1)` rendrait la vignette entierement
         BLANCHE. Il existait parce que le logo horizontal est monochrome
         terracotta et disparaissait sur le bleu petrole ; le carre, lui,
         porte son propre fond et n'a rien a corriger ;
       - la hauteur de 34 a 48px est calee sur un ratio 4,3:1. Un carre a 48px
         serait un timbre : il lui faut sa propre echelle.
     Pas d'arrondi : ses aplats sont a angles droits (contrat de design). */
}
.mms-footer__logo--carre img, .mms-footer__logo--carre svg {
  /* Grossie le 2026-08-07 : a 132px la vignette se lisait comme une
     icone posee a cote du texte, pas comme l'enseigne de la maison.
     Le pied est le dernier endroit ou on la voit, elle peut tenir sa
     place. */
  height: clamp(132px, 13vw, 196px);
  width: auto;
  filter: none;
}
.mms-footer__tagline {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-style: italic;
  font-size: 1.02rem;
  color: var(--color-highlight);
}
.mms-footer__titre {
  margin: 0;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.17em;
  text-transform: uppercase;
  color: var(--color-highlight);
}
.mms-footer {
  /* LE SURVOL DES LIENS DU PIED PASSAIT A 3,27:1 (mesure du 2026-08-08).
     SOURCE : `.site-footer a:hover { color: var(--color-primary) }` du socle.
     Le terracotta sur le bleu petrole vaut **3,27:1** -- sous le seuil, et
     c'est le seul etat ou l'adresse, le telephone et l'e-mail deviennent
     moins lisibles qu'au repos, ou ils sont a 11,23:1. Un survol est censé
     aider a viser, pas effacer ce qu'on vise.

     Le pied emploie deja l'abricot pour ses liens de bas de page : on le
     reprend plutot que d'introduire une troisieme couleur. 8,24:1.

     `.mms-footer a:hover` egale la specificite du socle (une classe, un
     element, une pseudo-classe) et passe apres : c'est ce qu'il faut, un
     `color` du fork sur une seule classe n'aurait rien change.

     ON NE VISE QUE LES LIENS DE TEXTE, ET IL A FALLU DEUX ESSAIS RATES POUR
     Y VENIR. Une regle large sur `a` dans un chrome atteint des composants
     qu'on n'a pas en tete :

       1. `.mms-footer a:hover` imposait l'abricot au bouton « Inscrire mon
          enfant », qui prend un fond BLANC au survol : **1,61:1**.
       2. `a:not(.mms-btn):hover` (0,3,1) battait alors
          `.mms-social--pied .mms-social__link:hover` (0,2,1) : les icones
          sociales passaient de **11,64:1 a 1,41:1**, abricot sur rose pale.
          Un `:not()` qui ecarte un composant AUGMENTE la specificite, donc
          en ecrase d'autres -- l'exact inverse de l'effet recherche.

     Ces deux composants savent deja se peindre. On nomme donc les seuls
     endroits qui ne le savent pas : les coordonnees et les paragraphes.
     Specificite (0,2,1), au-dessus du socle, sans mordre sur personne. */
}
.mms-footer__liste a:hover, .mms-footer__liste a:focus-visible, .mms-footer__mot a:hover, .mms-footer__mot a:focus-visible {
  color: var(--color-highlight);
}
.mms-footer {
  /* ET LE BOUTON DU PIED RECUPERE SA PROPRE ENCRE. `.mms-btn--clair:hover`
     (0,1,1) est a EGALITE avec `.site-footer a:hover` du socle : seul l'ordre
     de declaration tranche, et c'est le socle qui passe apres. Le bouton
     sortait donc en terracotta sur blanc, **4,06:1** -- le contraste que ce
     projet a mesure et documente comme insuffisant. Defaut PREEXISTANT, que
     mon premier correctif avait masque par accident.
     Une classe de plus suffit a trancher : 11,23:1. */
}
.mms-footer .mms-btn--clair:hover,
.mms-footer .mms-btn--clair:focus-visible {
  color: var(--color-secondary);
}
.mms-footer__liste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.55rem;
  font-size: 0.95rem;
  line-height: 1.55;
}
.mms-footer__liste a {
  color: inherit;
  text-decoration: none;
}
.mms-footer__liste a:hover, .mms-footer__liste a:focus-visible {
  text-decoration: underline;
  text-underline-offset: 0.3em;
}
.mms-footer__liste--horaires {
  font-size: 0.9rem;
  color: rgba(253, 231, 232, 0.82);
}
.mms-footer__mot {
  margin: 0;
  font-size: 0.95rem;
  line-height: 1.6;
  color: rgba(253, 231, 232, 0.82);
  max-width: 32ch;
  /* UN LIEN POSE ICI SE FAIT COLORER PAR LE SOCLE, ET LA MESURE L'A DIT.
     `.site-footer a { color: var(--color-text) }` (0,1,1) bat toute regle
     du fork a une seule classe, et un enfant colore directement N'HERITE
     PAS de son parent : le lien ajoute sous les creneaux est ressorti a
     **1,1:1**, encre #3E3338 sur le bleu petrole, dans un SCSS qui se
     relit comme juste.

     Le pied traitait deja le cas a deux endroits -- `.mms-footer__liste a`
     en `inherit`, `.mms-footer__bas-inner a` en abricot -- et `__mot`
     etait le seul bloc a ne pas l'avoir, parce qu'il n'avait jamais
     contenu de lien. On reprend le geste du bas de page, mesure a
     8,24:1, plutot que d'en inventer un troisieme. */
}
.mms-footer__mot a {
  color: var(--color-highlight);
  text-underline-offset: 0.3em;
}
.mms-footer__bas {
  border-top: 1px solid rgba(253, 231, 232, 0.2);
}
.mms-footer__bas-inner {
  max-width: 1560px;
  margin-inline: auto;
  padding: 1.1rem var(--mms-marge);
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem 1.5rem;
  align-items: center;
  justify-content: space-between;
  font-size: 0.8rem;
  color: rgba(253, 231, 232, 0.7);
}
.mms-footer__bas-inner p {
  margin: 0;
}
.mms-footer__bas-inner a {
  color: var(--color-highlight);
}

/* Sur le bleu petrole, les icones sociales heritaient d'une encre sombre et
   disparaissaient : elles prennent l'abricot, comme les autres reperes du pied
   de page. */
/* AU PIED, LE FOND EST LE BLEU PETROLE : c'est l'abricot qui porte la pastille.
   L'ancien etat de repos etait un simple anneau abricot a 45 % d'opacite sur une
   icone censee heriter de l'abricot -- elle heritait en realite de --color-text
   (#3E3338) a cause de `.site-footer a`, soit 1,1:1 sur le bleu : invisible.
   Mesure a l'appui, pas une impression. */
.mms-social--pied .mms-social__link {
  width: 30px;
  height: 30px;
  background: var(--color-highlight);
  color: var(--color-secondary);
  box-shadow: none;
}

.mms-social--pied .mms-social__link:hover,
.mms-social--pied .mms-social__link:focus-visible {
  background: var(--color-on-primary);
  color: var(--color-secondary);
}

/* Une pilule ne se replie pas : dans une colonne etroite, le libelle sortait
   sur trois lignes. */
.mms-footer .mms-btn {
  white-space: nowrap;
}

/* Le focus du chrome suit la meme regle que celui des pages : l'abricot est la
   seule couleur qui tienne sur ses trois fonds. */
.mms-header :is(a, button):focus-visible,
.mms-footer :is(a, button):focus-visible {
  outline: 3px solid var(--color-highlight);
  outline-offset: 3px;
}

/* --------------------------------------------------------------------------
   MOBILE -- le menu passe en tiroir
   --------------------------------------------------------------------------
   Le tiroir lui-meme (ouverture, voile, blocage du defilement) est celui du
   socle : on ne redecrit que son apparence.
   -------------------------------------------------------------------------- */
@media (max-width: 900px) {
  .mms-nav__toggle {
    display: grid;
    gap: 5px;
    background: none;
    border: 0;
    padding: 0.5rem;
    cursor: pointer;
  }
  .mms-nav__toggle span {
    display: block;
    width: 24px;
    height: 2px;
    background: var(--color-secondary);
  }
  .mms-nav__collapse {
    flex-direction: column;
    align-items: flex-start;
    gap: 1.25rem;
  }
  .mms-nav__menu {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.35rem;
  }
  .mms-nav__menu a {
    font-size: 0.95rem;
    letter-spacing: 0.1em;
  }
  .mms-topbar__item:not(.mms-topbar__item--fort) {
    display: none;
  }
  .mms-footer__marque,
  .mms-footer__col,
  .mms-footer__col--action {
    grid-column: 1/-1;
  }
}
/* --------------------------------------------------------------------------
   LE BOUTON D'ENVOI DES MODALES
   --------------------------------------------------------------------------
   MESURE DU 2026-08-12 : « Envoyer ma demande », « Envoyer » et le bouton de la
   modale des artistes ressortaient tous a **3,56:1** -- un echec AA, sur le
   bouton de conversion principal du site, et cela depuis la session 7.

   SOURCE : `.pmb-btn { background: var(--color-primary) }` (socle). C'est le
   couple exact que ce projet a deja mesure et documente : `on-primary` (#FDECEF)
   sur `primary` (#AF6D5D) vaut 3,56:1, et AUCUNE encre ne passe sur ce
   terracotta -- pas meme le blanc pur (4,06:1). La seule issue est d'assombrir
   LE FOND : `primary-ink` porte `on-primary` a **4,82:1**.

   C'est la regle qui vaut partout ailleurs sur ce site : `primary` pour les
   aplats muets, `primary-ink` des qu'il y a du texte.

   POURQUOI CETTE REGLE GAGNE, alors qu'elle a la MEME specificite (0,1,0) que
   celle du socle : a specificite egale, l'ordre de declaration tranche -- et cet
   ordre est structurel ici, pas accidentel. Le hook du fork est le DERNIER
   import d'`app.scss` (ligne 23), donc ses feuilles sortent apres. Mesure sur le
   CSS compile : `.pmb-btn` du socle en ligne 2153, les regles de ce fichier a
   partir de 8277.

   Le survol est repris avec : le socle assombrit `primary` a 82 % (#90594C), ce
   qui est plus CLAIR que le nouveau fond -- le bouton se serait eclairci au
   survol, soit l'inverse du geste attendu.

   A remonter au socle en A40 : `.pmb-btn` devrait lire `var(--pmb-btn-bg,
   var(--color-primary))`, exactement comme `--footer-link` corrige en A20. Une
   custom property herite, donc un fork la surcharge sans disputer de
   specificite. */
.pmb-btn {
  background: var(--color-primary-ink);
}

.pmb-btn:hover,
.pmb-btn:focus-visible {
  background: color-mix(in srgb, var(--color-primary-ink) 88%, #000);
}

/* ==========================================================================
   LES FORMULES -- le detail des ateliers. Patron : `page-les-formules.php`.

   MEME GRAMMAIRE QUE L'ACCUEIL, PAS LE MEME RYTHME. La page d'accueil doit
   seduire, celle-ci doit se LIRE et se COMPARER : un parent y cherche un
   creneau, un tarif, ce qui est compris. La composition s'y plie -- moins de
   debordements, des donnees alignees, un code couleur qui tient le fil.

   ELLE NE REDEFINIT AUCUN JETON, et ne recopie aucune valeur d'espacement :
   les sections etendent `.inner_spacer_y` du socle, comme celles de l'accueil.
   ========================================================================== */
/* --------------------------------------------------------------------------
   0. LA BASE COMMUNE AUX PAGES COMPOSEES
   -------------------------------------------------------------------------- */
/* `.mms-page` porte ce que `.mms-accueil` portait pour lui seul. Toute page
   composee a la main la prend : c'est ce qui evite qu'une regle de fond soit
   attachee a UNE page et se perde a la suivante. */
.mms-page {
  overflow-x: clip;
  background: var(--color-white);
  color: var(--color-text);
  font-family: "Montserrat", system-ui, sans-serif;
}

/* LE DEFILEMENT DOUX, ET SA GARDE.
   Les cartes de l'accueil menent a une ANCRE de cette page : sans transition,
   l'arrivee est un saut sec et on ne sait pas ou l'on a atterri.

   La garde n'est pas une precaution de principe : un defilement anime sur une
   longue page est une cause connue de nausee (WCAG 2.3.3). `prefers-reduced-
   motion` le coupe net, et l'ancre fonctionne toujours -- elle saute, ce qui
   est precisement ce que ces utilisateurs demandent. */
@media (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}
/* LA BARRE EST COLLANTE : sans cette reserve, la cible d'une ancre se cale en
   haut du VIEWPORT, donc SOUS la barre, et le titre de la formule qu'on vient
   de demander est le seul element cache. Le symptome est deroutant -- la page
   a bien bouge, mais elle montre le mauvais endroit. */
:root {
  --mms-ancre: clamp(5.5rem, 9vw, 7.5rem);
}

.mms-fx,
.mms-fx-collab,
.mms-fx-pratique,
.mms-hebdo,
.mms-ag {
  scroll-margin-top: var(--mms-ancre);
}

/* LA TETE D'UNE PAGE COMPOSEE RESPIRE, ET CE N'ETAIT VRAI QUE SUR UNE PAGE.
   --------------------------------------------------------------------------
   RELEVE DE JONATHAN LE 2026-08-12 : sur L'Atelier et sur Les Collab', le texte
   sous le titre est colle -- contrairement a l'Agenda.

   MESURE DES TROIS TETES : l'Agenda pose **22px** entre l'etiquette et le titre
   comme entre le titre et le texte ; les deux autres **zero**. Aucune des trois
   n'a pourtant la moindre marge : l'ecart venait du `display: grid` et de son
   `gap: 1.4rem`, poses sur le seul `.mms-fx-tete__contenu`. Les deux pages
   ecrites plus tard n'ont repris que le `grid-column`, qui est ce qui SAUTE aux
   yeux dans la regle -- le reste est parti avec.

   C'est le patron de tete du fork : il vit donc ICI, dans la base commune aux
   pages composees, et les trois s'y raccrochent. Une regle de mise en page
   attachee a UNE page est une regle qui se perd a la page suivante -- c'est
   exactement ce qui vient d'arriver, et le meme raisonnement que le focus
   visible juste au-dessus.

   `justify-items: start` va avec le `gap` et n'est pas decoratif : sans lui,
   l'etiquette s'etirerait sur toute la largeur de la colonne au lieu de garder
   la largeur de son texte. */
.mms-fx-tete__contenu,
.mms-co-tete__contenu,
.mms-at-tete__contenu {
  display: grid;
  gap: 1.4rem;
  justify-items: start;
}

/* --------------------------------------------------------------------------
   LE SOMMAIRE DE L'AGENDA : UN ROND COUPE EN DIAGONALE
   --------------------------------------------------------------------------
   C'ETAIT UN CARRE JUSQU'AU 2026-08-12 : Caroline prefere un rond. La classe
   garde son nom -- `mms-somm-carre` -- et c'est un choix, pas un oubli : le
   renommer imposerait de toucher au patron, au SCSS et a toute reference
   future, pour un gain nul a l'ecran. Ce commentaire dit ce qu'elle est.

   La page porte deux contenus de nature opposee -- ce qui revient CHAQUE
   SEMAINE, et ce qui n'arrive QU'UNE FOIS -- et rien ne le disait avant d'avoir
   defile. La moitie droite du hero etait vide.

   `clip-path` PLUTOT QU'UN SVG, et ce n'est pas un raccourci : la propriete
   decoupe aussi la zone de CLIC, donc chaque moitie n'est cliquable que sur son
   triangle reel. Un `<svg>` aurait demande de refaire ce decoupage, et son
   `<text>` aurait perdu la Montserrat en capitales espacees, la selection et la
   lecture par un lecteur d'ecran.

   AUCUNE ENCRE NE PASSE SUR LE TERRACOTTA, PAS MEME LE BLANC (4,06:1) : les
   deux aplats sont donc `accent` et `secondary`, les deux couleurs sombres de
   la palette. Le magenta est par ailleurs le jeton le moins employe du site,
   alors qu'il porte ses sous-titres sur ses propres affiches.
   -------------------------------------------------------------------------- */
.mms-somm-carre {
  grid-column: 9/-1;
  align-self: center;
  justify-self: center;
  position: relative;
  width: min(100%, 21rem);
  aspect-ratio: 1;
  /* Le pivot vient de ses affiches, qui sont des collages d'images pivotees.
     Trois degres suffisent : au-dela, le carre cesse d'etre un carre pose et
     devient un ornement, ce que le contrat de design refuse. */
  transform: rotate(-3deg);
}
@media (max-width: 900px) {
  .mms-somm-carre {
    grid-column: 1/-1;
    width: min(100%, 17rem);
    margin-top: 2rem;
  }
}
.mms-somm-carre__moitie {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  /* LE PASSAGE AU DISQUE A DEMANDE PLUS DE MARGE, ET LA CAPTURE L'A DIT
     AVANT TOUTE MESURE : « CHAQUE SEMAINE » sortait coupe a gauche et
     « Les stages et Collab' » a droite.
     Un texte qui tenait dans un TRIANGLE ne tient pas dans un
     DEMI-DISQUE : les deux ont la meme boite, mais le second a des bords
     courbes qui rognent precisement les coins ou le texte etait cale.
     Pour rester dans le disque, il faut rentrer d'environ 29 % du rayon
     sur chaque axe -- d'ou ces 15 %.
     EN POURCENTAGE ET NON EN `rem` : la valeur suit alors la taille du
     sommaire, qui passe de 21rem a 17rem sous 900px. Un padding fixe
     aurait ete juste sur une seule des deux tailles.
     17 % et non 15 : a 15, la mesure des coins de texte contre le rayon
     donnait encore 1 a 3px de depassement aux deux tailles. */
  padding: 17%;
  text-decoration: none;
  transition: transform 0.28s ease;
  /* AU SURVOL, LE TEXTE PASSAIT EN MAGENTA -- SUR UN FOND MAGENTA.
     Releve par Jonathan sur le rendu, mesure ensuite : **1,00:1** sur la
     moitie haute, 1,09:1 sur la basse. Le texte disparaissait purement.

     SOURCE CONFIRMEE, `dist/app.css` : `a:hover { color: var(--link-hover,
     var(--color-accent)) }` du socle. Une classe plus un element (0,1,1)
     contre la classe seule de la moitie (0,1,0) : au survol, c'est le
     socle qui decide. C'est le meme mecanisme que les icones du pied
     mesurees a 1,1:1 en session 7, dans sa variante `:hover`.

     LE SOCLE A PREVU LA SORTIE, et c'est elle qu'on emprunte : il lit
     `--link-hover` avant son defaut. On la pose, plutot que de surencherir
     en specificite -- une variable se surcharge, une specificite se
     dispute. */
  --link-hover: var(--color-surface);
  /* Le decoupage porte la moitie ET sa zone de clic. Les deux polygones
     ne partagent pas exactement la diagonale : celui du bas est decale de
     7px, ce qui laisse voir le fond du hero entre les deux. C'est le trait
     de coupe, et il vient de la meme grammaire que ses aplats francs. */
  /* LES DEUX TRIANGLES SONT DECALES SUR X (demande de Jonathan).
     Ils partageaient leur diagonale a 7px pres : le carre se lisait comme
     un carre coupe. Ecartes horizontalement, ils se lisent comme DEUX
     formes posees l'une contre l'autre -- c'est le collage de ses
     affiches, ou les elements se chevauchent sans jamais s'aligner.

     Le decalage vit dans une variable : le survol le REPREND et l'amplifie
     plutot que de l'ecraser. Deux `transform` concurrents sur le meme
     element, c'est le dernier declare qui gagne, et l'ecart au repos
     disparaitrait au survol sans qu'on comprenne pourquoi. */
  --mms-ecart: 9px;
  /* UN ROND, ET PLUS UN CARRE (demande de Caroline, 2026-08-12).
     -------------------------------------------------------------------
     La forme change, le procede ne change pas : chaque moitie reste un
     `clip-path` triangulaire, et `border-radius: 50%` vient s'y ajouter.
     Les deux se COMBINENT -- le rendu est leur intersection -- donc un
     triangle inscrit dans un disque donne un demi-disque, sans qu'aucune
     geometrie ne soit reecrite. Le decalage, le survol qui ecarte, le
     trait de coupe et le focus continuent de fonctionner tels quels.

     POURQUOI PAS `border-radius` SUR LE PARENT AVEC `overflow: hidden` :
     les moities se DEPLACENT au survol, et un parent qui rogne aurait
     masque ce mouvement -- on aurait supprime le geste en changeant la
     forme. */
  border-radius: 50%;
}
.mms-somm-carre__moitie--haut {
  clip-path: polygon(0 0, 100% 0, 0 100%);
  background: var(--color-accent);
  color: var(--color-surface);
  align-items: flex-start;
  transform: translateX(calc(var(--mms-ecart) * -1));
}
.mms-somm-carre__moitie {
  /* LE BLEU PETROLE REMPLACE LE VERT-DE-GRIS (demande de Caroline).
     -------------------------------------------------------------------
     La moitie basse portait `tertiary-ink` (#4D6B63). Le bleu petrole est
     celui de ses CARTOUCHES sur les quatre affiches : il fait couple avec
     le magenta de la moitie haute, quand le vert introduisait une
     troisieme famille que ses documents ne portent nulle part.
     Mesure : son rose `surface` sur ce bleu vaut **11,64:1**, contre
     4,96:1 sur le vert -- on y gagne aussi en lisibilite.

     ET LE VERT-DE-GRIS N'EN DEVIENT PAS ORPHELIN pour autant : depuis le
     2026-08-12 il est l'un des cinq aplats de technique de L'Atelier
     (`mms-tech-5`, 5,00:1 sous du blanc). Le commentaire precedent
     annoncait ici « son premier emploi visible » -- ce n'est plus vrai, et
     un commentaire faux coute plus cher que pas de commentaire. */
}
.mms-somm-carre__moitie--bas {
  clip-path: polygon(100% 7px, 100% 100%, 7px 100%);
  background: var(--color-secondary);
  color: var(--color-surface);
  align-items: flex-end;
  text-align: right;
  justify-content: flex-end;
  transform: translateX(var(--mms-ecart));
}
.mms-somm-carre__moitie {
  /* Le triangle avance vers son propre coin : le haut vers le haut-gauche,
     le bas vers le bas-droite. Le trait de coupe s'ouvre, les deux aplats
     se separent -- c'est le collage qui se decolle, pas un bouton qui
     gonfle. */
}
.mms-somm-carre__moitie--haut:hover, .mms-somm-carre__moitie--haut:focus-visible {
  transform: translate(calc(var(--mms-ecart) * -1 - 6px), -6px);
}
.mms-somm-carre__moitie--bas:hover, .mms-somm-carre__moitie--bas:focus-visible {
  transform: translate(calc(var(--mms-ecart) + 6px), 6px);
}
.mms-somm-carre__moitie {
  /* Le focus doit rester visible SUR une forme decoupee : un `outline`
     serait rogne par le `clip-path`, qui coupe tout ce qui deborde. On
     passe donc par une ombre interne, qui vit A L'INTERIEUR du triangle. */
}
.mms-somm-carre__moitie:focus-visible {
  outline: none;
  box-shadow: inset 0 0 0 3px var(--color-highlight);
}
.mms-somm-carre {
  /* PAS D'OPACITE ICI, ET C'EST UNE MESURE QUI L'A DIT. Un `opacity: .85`
     posait le sur-titre a **4,33:1 sur le magenta** -- sous le seuil AA, pour
     un texte de 10,9px. Le meme reglage passait sur le bleu (8,5:1) : le
     defaut n'existait que sur une moitie du carre, ce qui est exactement la
     facon dont on ne le voit pas en relisant la regle.

     L'opacite etait de toute facon redondante : la taille (10,9px contre
     19,4) et les capitales tres espacees hierarchisent deja les deux lignes.
     A pleine encre, le sur-titre passe a 5,4:1. */
}
.mms-somm-carre__quoi {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.76rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.mms-somm-carre {
  /* AGRANDI (demande de Jonathan). `max-width` reste en `em` : il suit la
     taille au lieu de la contraindre, donc le texte continue de tenir DANS le
     triangle et non dans le carre -- c'est l'hypotenuse qui borne la place,
     pas le cote. */
}
.mms-somm-carre__titre {
  font-family: "Fraunces", Georgia, serif;
  font-size: clamp(1.14rem, 1.6vw, 1.42rem);
  line-height: 1.18;
  max-width: 8em;
}
@media (prefers-reduced-motion: reduce) {
  .mms-somm-carre__moitie {
    transition: none;
  }
  .mms-somm-carre__moitie--haut:hover, .mms-somm-carre__moitie--bas:hover {
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   1. L'OUVERTURE
   -------------------------------------------------------------------------- */
.mms-fx-tete {
  position: relative;
  background: var(--color-surface);
  /* La grille et son `gap` sont remontes dans la base commune aux pages
     composees (section 0) : ils valent pour les trois tetes du site, pas pour
     celle-ci seule. Ne reste ici que ce qui lui est propre. */
}
.mms-fx-tete__contenu {
  grid-column: 1/span 8;
}
@media (max-width: 900px) {
  .mms-fx-tete__contenu {
    grid-column: 1/-1;
  }
}
.mms-fx-tete__mot {
  margin: 0;
  max-width: 54ch;
  font-size: clamp(1rem, 1.15vw, 1.12rem);
  line-height: 1.72;
  color: #4A3F44;
}

/* CE QUI VAUT PARTOUT : quatre faits, en ligne, sans puce ronde. Le filet
   vertical terracotta les rattache visuellement les uns aux autres sans
   ajouter d'ornement -- ses documents ponctuent au filet, jamais a la puce. */
.mms-fx-partout {
  list-style: none;
  margin: 0.6rem 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.6rem;
}
.mms-fx-partout li {
  position: relative;
  padding-left: 0.9rem;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.88rem;
  line-height: 1.5;
  color: var(--color-secondary);
}
.mms-fx-partout li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.28em;
  bottom: 0.28em;
  width: 3px;
  background: var(--color-primary);
}

/* --------------------------------------------------------------------------
   2. LE SOMMAIRE D'ANCRES
   -------------------------------------------------------------------------- */
.mms-fx-sommaire {
  background: var(--color-white);
  padding-block: clamp(1.5rem, 3vw, 2.5rem);
}
.mms-fx-sommaire ul {
  list-style: none;
  margin: 0 auto;
  padding-inline: var(--mms-marge);
  max-width: 1560px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
  gap: clamp(0.75rem, 1.4vw, 1.1rem);
}

.mms-fx-somm {
  --mms-cat: var(--color-accent);
}
.mms-fx-somm--annee {
  --mms-cat: var(--mms-cat-annee);
}
.mms-fx-somm--duo {
  --mms-cat: var(--mms-cat-duo);
}
.mms-fx-somm--stage {
  --mms-cat: var(--mms-cat-stage);
}
.mms-fx-somm--anniv {
  --mms-cat: var(--mms-cat-anniv);
}
.mms-fx-somm a {
  position: relative;
  display: grid;
  gap: 0.25rem;
  padding: 0.95rem 1.1rem 0.95rem 1.5rem;
  text-decoration: none;
  color: var(--color-secondary);
  background: var(--color-surface);
  border-radius: 0;
  /* LE FILET FAIT 8px, PAS 3.
     Mesure de la premiere version : a 3px sur fond rose pale, les quatre
     couleurs de categorie etaient indiscernables a la distance de
     lecture -- le reperage ne reperait rien, alors que les valeurs
     etaient bonnes (`_client.scss:45-47`). Un code couleur qu'il faut
     chercher a l'oeil n'est pas un code couleur.
     La bande passe donc a 8px, et un carre plein la redouble en tete de
     titre : la couleur devient lisible AVANT le texte. */
  box-shadow: inset 8px 0 0 0 var(--mms-cat);
  /* Le survol epaissit le filet et eclaircit le fond. PAS de deplacement :
     un `transform` au survol decale ce que l'oeil vise au moment ou il
     clique, et c'est une gene reelle a la souris comme au trackpad. */
  transition: background-color 0.2s ease, box-shadow 0.2s ease;
}
.mms-fx-somm a:hover, .mms-fx-somm a:focus-visible {
  background: var(--color-white);
  box-shadow: inset 14px 0 0 0 var(--mms-cat);
}
.mms-fx-somm__titre {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: 0.98rem;
  line-height: 1.35;
  /* Le carre plein, SA forme : ses documents ponctuent au carre, jamais
     a la pastille ronde ni a la coche. */
}
.mms-fx-somm__titre::before {
  content: "";
  flex: 0 0 auto;
  width: 9px;
  height: 9px;
  background: var(--mms-cat);
}
.mms-fx-somm__prix {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.82rem;
  letter-spacing: 0.04em;
  color: var(--color-primary-ink);
}

/* --------------------------------------------------------------------------
   3. LES QUATRE FORMULES
   -------------------------------------------------------------------------- */
.mms-fx {
  --mms-cat: var(--color-accent);
  position: relative;
  background: var(--color-white);
  /* UN CRAN EN DESSOUS DE `.inner_spacer_y`, ET C'EST DELIBERE.
     SOURCE : `commons/_utilities.scss:271-272` -- le helper pose
     `--space-xxxl` EN HAUT ET EN BAS, soit pres de 400px par section a
     1440. Mesure de la premiere version de cette page : quatre sections de
     donnees courtes separees par de tels vides se lisaient comme quatre
     pages presque blanches.

     Ce n'est pas le helper qui a tort, c'est son emploi ici : il est calibre
     pour une section SIGNATURE, qui a besoin de silence autour d'elle. Une
     section de DONNEES, qu'on parcourt en comparant, doit rester dense --
     sinon comparer demande de faire defiler.

     On descend donc d'un cran DANS L'ECHELLE DU SOCLE (`--space-xxl`), on
     n'invente pas une valeur : le fork continue de repondre au reglage
     global. Le socle a lui-meme releve ce point (meme fichier, l.422). */
  padding-block: var(--space-xxl);
}
.mms-fx--annee {
  --mms-cat: var(--mms-cat-annee);
}
.mms-fx--duo {
  --mms-cat: var(--mms-cat-duo);
}
.mms-fx--stage {
  --mms-cat: var(--mms-cat-stage);
}
.mms-fx--anniv {
  --mms-cat: var(--mms-cat-anniv);
}
.mms-fx {
  /* L'ALTERNANCE DES FONDS FAIT LE DECOUPAGE. Quatre sections de meme
     densite a la suite se lisent comme un seul long bloc : c'est le defaut
     qui avait ete reproche a la premiere version de l'accueil. */
}
.mms-fx--pair {
  background: var(--color-surface);
}
.mms-fx {
  /* Le filet de categorie, en tete de section et sur toute la largeur : c'est
     lui qui dit « nouvelle formule » avant meme qu'on ait lu le titre. */
}
.mms-fx::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 6px;
  background: var(--mms-cat);
}
.mms-fx .mms-grille {
  align-items: start;
  row-gap: clamp(2rem, 4vw, 3rem);
}
.mms-fx__propos {
  grid-column: 1/span 6;
  display: grid;
  gap: 1.05rem;
  justify-items: start;
}
@media (max-width: 900px) {
  .mms-fx__propos {
    grid-column: 1/-1;
  }
}
.mms-fx {
  /* LE NUMERO D'ORDRE, en gros et en pale. Il donne le compte (« il y en a
     quatre, j'en lis la deuxieme ») sans ajouter un mot a la page. Il est
     `aria-hidden` cote patron : lu a voix haute, « zero deux » n'apprend
     rien et coupe le titre de son chapeau. */
}
.mms-fx__rang {
  font-family: "Anton", Impact, sans-serif;
  font-size: clamp(2.6rem, 5vw, 4.2rem);
  line-height: 0.8;
  color: var(--mms-cat);
  opacity: 0.45;
}
.mms-fx__ico {
  display: block;
  width: 32px;
  color: var(--mms-cat);
}
.mms-fx__ico svg {
  width: 100%;
  height: auto;
  stroke-width: 1.3;
}
.mms-fx__titre {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.5rem, 2.6vw, 2.2rem);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--color-secondary);
}
.mms-fx__chapeau {
  margin: 0;
  max-width: 46ch;
  font-size: clamp(0.98rem, 1.1vw, 1.06rem);
  line-height: 1.72;
  color: #4A3F44;
}
.mms-fx__cta {
  margin: 0.4rem 0 0;
}
.mms-fx {
  /* LES DONNEES, calees a droite de la grille. Elles forment une colonne
     verticale continue d'une formule a l'autre : c'est ce qui rend la
     comparaison possible en descendant la page. */
}
.mms-fx__donnees {
  grid-column: 8/span 5;
  display: grid;
  gap: clamp(1.4rem, 2.4vw, 2rem);
  align-content: start;
}
@media (max-width: 900px) {
  .mms-fx__donnees {
    grid-column: 1/-1;
  }
}
.mms-fx__soustitre {
  margin: 0 0 0.6rem;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.74rem;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: var(--color-primary-ink);
}
.mms-fx__liste {
  margin: 0;
}
.mms-fx {
  /* Une ligne de donnee : libelle a gauche, valeur a droite, relies par un
     filet. C'est le dessin de ses etiquettes de prix imprimees. */
}
.mms-fx__ligne {
  display: flex;
  align-items: baseline;
  gap: 0.75rem;
  padding-block: 0.5rem;
  border-bottom: 1px solid rgba(1, 51, 77, 0.14);
}
.mms-fx__ligne:last-child {
  border-bottom: 0;
}
.mms-fx__ligne dt {
  flex: 1 1 auto;
  font-size: 0.94rem;
  line-height: 1.5;
  color: var(--color-secondary);
}
.mms-fx__ligne dd {
  flex: 0 0 auto;
  margin: 0;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.94rem;
  color: var(--color-secondary);
  text-align: right;
}
.mms-fx {
  /* Les tarifs sont la donnee qu'on vient chercher : ils passent en
     terracotta, la seule couleur d'insistance de la page. */
}
.mms-fx__liste--prix .mms-fx__ligne dd {
  color: var(--color-primary-ink);
}
.mms-fx__inclus {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.5rem;
}
.mms-fx__inclus li {
  position: relative;
  padding-left: 1.2rem;
  font-size: 0.92rem;
  line-height: 1.6;
  color: #4A3F44;
  /* Un carre plein, pas une coche : la coche est le signe des
     tableaux comparatifs de logiciels, et le carre est SA forme --
     ses documents en sont pleins. */
}
.mms-fx__inclus li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.55em;
  width: 7px;
  height: 7px;
  background: var(--mms-cat);
}

/* --------------------------------------------------------------------------
   4. LES COLLAB'
   -------------------------------------------------------------------------- */
.mms-fx-collab {
  position: relative;
  background: var(--color-secondary);
  color: var(--color-surface);
  overflow: hidden;
}
.mms-fx-collab .mms-grille {
  align-items: center;
  row-gap: clamp(2rem, 4vw, 3rem);
}
.mms-fx-collab__propos {
  grid-column: 1/span 6;
  display: grid;
  gap: 1.1rem;
  justify-items: start;
}
.mms-fx-collab__propos p {
  margin: 0;
  max-width: 46ch;
  line-height: 1.72;
  color: rgba(253, 231, 232, 0.84);
}
@media (max-width: 900px) {
  .mms-fx-collab__propos {
    grid-column: 1/-1;
  }
}
.mms-fx-collab__titre {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.5rem, 2.6vw, 2.2rem);
  line-height: 1.15;
  color: var(--color-surface);
}
.mms-fx-collab {
  /* Sur le bleu petrole, les couples libelle/valeur de la section claire
     seraient illisibles : le filet et les deux teintes de texte sont
     repris ici dans les valeurs de la section peinte. */
}
.mms-fx-collab__prix {
  grid-column: 8/span 5;
}
.mms-fx-collab__prix .mms-fx__ligne {
  border-bottom-color: rgba(253, 231, 232, 0.22);
}
.mms-fx-collab__prix .mms-fx__ligne dt {
  color: rgba(253, 231, 232, 0.84);
}
.mms-fx-collab__prix .mms-fx__ligne dd {
  color: var(--color-highlight);
}
@media (max-width: 900px) {
  .mms-fx-collab__prix {
    grid-column: 1/-1;
  }
}

/* --------------------------------------------------------------------------
   5. LE PRATIQUE
   -------------------------------------------------------------------------- */
.mms-fx-pratique {
  background: var(--color-surface);
}
.mms-fx-pratique__titre {
  grid-column: 1/span 3;
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.3rem, 2vw, 1.7rem);
  line-height: 1.2;
  color: var(--color-secondary);
}
@media (max-width: 900px) {
  .mms-fx-pratique__titre {
    grid-column: 1/-1;
  }
}
.mms-fx-pratique__liste {
  grid-column: 5/span 8;
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 1.1rem;
}
.mms-fx-pratique__liste li {
  display: grid;
  gap: 0.2rem;
  padding-bottom: 1.1rem;
  border-bottom: 1px solid rgba(1, 51, 77, 0.14);
  font-size: 0.96rem;
  line-height: 1.68;
  color: #4A3F44;
}
.mms-fx-pratique__liste li:last-child {
  padding-bottom: 0;
  border-bottom: 0;
}
@media (max-width: 900px) {
  .mms-fx-pratique__liste {
    grid-column: 1/-1;
  }
}
.mms-fx-pratique__quoi {
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--color-primary-ink);
}

/* --------------------------------------------------------------------------
   5 bis. CE QUI REVIENT CHAQUE SEMAINE (2026-08-08)
   --------------------------------------------------------------------------
   La page de l'agenda ne montrait que le PONCTUEL. Cette bande porte le
   permanent, et elle le LIT sur `mms_formules_hebdo()` : aucune donnee n'est
   saisie ici.

   L'APLAT EST OPAQUE ET LE SCHEME VIENT DU SOCLE. La section porte
   `.pmb--scheme-dark`, qui pose d'un coup toutes les encres du bleu petrole --
   y compris l'abricot en etiquette, deja prevu par `$scheme-dark`. Repeindre
   ces sept valeurs a la main aurait fait une seconde palette a cote de la
   premiere, et c'est exactement ce qu'un fork ne doit pas faire.

   RAPPEL DE NOMMAGE, PAYE 9 FOIS SUR CE PROJET : les variables de scheme n'ont
   PAS le prefixe `--color-`. C'est `--text-prose`, `--surface-card`,
   `--text-heading`. `var(--color-text-prose)` compile sans erreur et ne colore
   rien.

   L'isolation n'est pas redeclaree : `_client-typography.scss` la pose deja sur
   toute `section:has(> .mms-deco)` de `.mms-page`. Sans elle, la forme en
   `z-index: -1` disparaitrait derriere le fond opaque.
   -------------------------------------------------------------------------- */
.mms-hebdo {
  background: var(--surface-section);
}
.mms-hebdo__tete {
  grid-column: 1/span 7;
  display: grid;
  gap: 1rem;
  justify-items: start;
  margin-bottom: clamp(2rem, 3.5vw, 3rem);
}
@media (max-width: 900px) {
  .mms-hebdo__tete {
    grid-column: 1/-1;
  }
}
.mms-hebdo__mot {
  margin: 0;
  max-width: 48ch;
  font-size: clamp(1rem, 1.15vw, 1.12rem);
  line-height: 1.72;
  color: var(--text-prose);
}
.mms-hebdo {
  /* LE MOT D'IMPACT REPREND UN APLAT QUI SE VOIT (2026-08-08).
     La deuxieme ligne d'un titre d'affiche recoit `--color-secondary` par
     defaut (`.mms-aff__l:nth-child(3n+2)`) -- soit EXACTEMENT le bleu de
     cette section. Son aplat existait, il etait simplement de la couleur du
     fond : le texte restait lisible a 11,23:1, et le geste d'aplats decales
     qui vient de ses affiches, lui, disparaissait.

     Aucune sonde de contraste ne pouvait le dire : elle compare l'encre au
     fond, pas l'aplat a la section qui le porte. C'est en LISANT la mesure
     qu'on le voit -- fond de l'aplat et fond de section a la meme valeur.

     On inverse donc la polarite, comme sur ses affiches : le mot d'impact
     ressort en aplat CLAIR sur le fond sombre, encre bleu petrole. Surcharge
     locale a `.mms-hebdo` (0,3,0 contre 0,2,0) : les titres du reste du site
     ne bougent pas d'un pixel. */
}
.mms-hebdo .mms-aff__l:nth-child(3n+2) {
  background: var(--color-surface);
  color: var(--color-secondary);
}
.mms-hebdo {
  /* `auto-fit` et non trois colonnes fixes : elle pourra ajouter un mardi ou
     un vendredi sans que personne ne retouche cette feuille. La bande compte
     trois creneaux aujourd'hui, elle en comptera peut-etre cinq. */
}
.mms-hebdo__liste {
  grid-column: 1/-1;
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: clamp(1rem, 1.6vw, 1.5rem);
  grid-template-columns: repeat(auto-fit, minmax(min(15rem, 100%), 1fr));
}
.mms-hebdo {
  /* L'aplat de la carte est OPAQUE (`--surface-card` vaut #073F5C dans le
     scheme sombre), jamais un blanc translucide : une encre posee sur une
     transparence depend du fond qu'elle a dessous, et c'est ainsi qu'une
     etiquette de ce site est deja ressortie a 1:1. Angles droits, comme les
     aplats de ses affiches -- le seul arrondi assume du site est la pilule
     des boutons. */
  /* FLEX COLONNE, ET NON GRILLE, DEPUIS QUE LA CARTE PORTE UN BOUTON.
     En grille avec `align-content: start`, une marge automatique n'aligne un
     item que dans SA zone : le bouton serait reste colle au texte. En flex
     colonne, `margin-top: auto` sur le dernier enfant le pousse reellement en
     bas. Rien d'autre ne change -- il n'y avait aucune colonne a tenir. */
}
.mms-hebdo__item {
  background: var(--surface-card);
  padding: clamp(1.3rem, 2vw, 1.75rem);
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}
.mms-hebdo {
  /* LE CONTRASTE D'ECHELLE, qui est SON geste typographique : le jour en
     petites capitales tres espacees, l'heure juste apres en grand. C'est la
     meme progression que « les Collab' » puis « MANGA » sur ses affiches. */
}
.mms-hebdo__jour {
  margin: 0;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.78rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-accent-label);
}
.mms-hebdo__heures {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-size: clamp(1.15rem, 1.5vw, 1.45rem);
  line-height: 1.25;
  color: var(--text-heading);
}
.mms-hebdo__quoi {
  margin: 0.45rem 0 0;
  font-size: 0.95rem;
  line-height: 1.5;
  /* La cible tactile tient les 44px demandes meme quand le libelle est
     court : un lien de deux mots dans une carte se rate au doigt.
     UN SEUL `display`, et c'est deliberement dit : la premiere ecriture
     en posait deux (inline-block puis flex), dont la premiere n'aurait
     jamais servi. C'est le defaut que ce projet documente sous le nom de
     declaration morte, et il naissait ici sous mes doigts. */
}
.mms-hebdo__quoi a {
  display: flex;
  align-items: center;
  min-height: 44px;
  color: var(--text-prose);
}
.mms-hebdo__prix {
  margin: 0;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.82rem;
  letter-spacing: 0.04em;
  color: var(--text-subtle);
}
.mms-hebdo {
  /* Le bouton se cale EN BAS de la carte quelle que soit la longueur du
     creneau au-dessus : trois cartes cote a cote dont les boutons ne
     s'alignent pas se lisent comme trois blocs sans rapport. */
}
.mms-hebdo__cta {
  margin: auto 0 0;
  padding-top: 0.9rem;
  /* `flex` et non `block` : `.mms-btn` est un `inline-block`, et un
     `width: 100%` seul le laisserait sans centrage vertical propre. */
}
.mms-hebdo__cta .mms-btn {
  display: flex;
  width: 100%;
  justify-content: center;
}

/* --------------------------------------------------------------------------
   6. L'AGENDA -- les dates a venir
   Meme grammaire que les formules : meme grille, meme code couleur par
   categorie, memes etiquettes. Le type d'evenement reprend les jetons
   `--mms-cat-*` poses dans `_client-accueil.scss`.
   -------------------------------------------------------------------------- */
.mms-ag {
  background: var(--color-white);
  padding-block: var(--space-xxl);
  /* --------------------------------------------------------------------
     LA FRISE (2026-08-07)
     --------------------------------------------------------------------
     L'agenda etait une grille de cartes. Une grille dit « voici des choses » ;
     une frise dit « voici l'ordre dans lequel elles arrivent » -- et c'est
     exactement ce qu'un agenda raconte. La grammaire vient du bloc
     `proto/pm-timeline` du socle, dont le SCSS est deja dans `app.css` : on ne
     redecrit ni la ligne, ni la pastille, ni l'alternance. On ne redefinit ici
     que ce qui est PROPRE a l'agenda -- le code couleur par categorie.
     -------------------------------------------------------------------- */
}
.mms-ag__frise {
  grid-column: 1/-1;
  position: relative;
  /* La ligne et les pastilles prennent l'encre de la marque plutot que le
     `--color-primary` par defaut du socle : ce jeton echoue AA en texte,
     mais ici ce sont des APLATS, et c'est son terracotta qu'on veut. */
  --pmb-timeline-line-color: var(--color-primary);
  --pmb-timeline-card-bg: var(--color-surface);
  --pmb-timeline-dot-size: 18px;
}
.mms-ag__liste {
  grid-column: 1/-1;
  list-style: none;
  margin: 0;
  padding: 0;
}
.mms-ag__item {
  --mms-cat: var(--mms-cat-stage);
}
.mms-ag__item--stage {
  --mms-cat: var(--mms-cat-stage);
}
.mms-ag__item--collab {
  --mms-cat: var(--mms-cat-collab);
}
.mms-ag__item--atelier {
  --mms-cat: var(--mms-cat-duo);
}
.mms-ag__item {
  /* LA PASTILLE PORTE LA CATEGORIE. C'est le meme code couleur que les
     cartes de formule, mais reporte sur le seul element que la frise
     ajoute -- sans quoi la couleur de categorie aurait disparu en passant
     de la grille a la frise. */
}
.mms-ag__item .pmb-timeline__dot {
  background: var(--mms-cat);
}
.mms-ag__item {
  /* Une date complete s'efface sans disparaitre : elle reste lisible,
     elle cesse seulement d'appeler. */
}
.mms-ag__item.is-complet {
  opacity: 0.72;
}
.mms-ag__carte {
  position: relative;
  display: grid;
  gap: 0.5rem;
  align-content: start;
  /* Le retrait devient une VARIABLE parce que l'image doit l'annuler pour
     aller d'un bord a l'autre. Recopier le `clamp` a deux endroits, c'est
     s'assurer qu'un jour l'un des deux bougera sans l'autre. */
  --mms-ag-pad: clamp(1.4rem, 2.2vw, 2rem);
  padding: var(--mms-ag-pad);
  overflow: hidden;
  /* L'IMAGE DE LA DATE, D'UN BORD A L'AUTRE.
     Elle annule le retrait de la carte sur ses trois cotes hauts : une
     photo qui garde une marge blanche autour se lit comme une vignette
     collee, pas comme la carte elle-meme. Le filet de categorie
     (`::before`) reste AU-DESSUS, il marque la carte et non l'image.

     Le format est impose (`aspect-ratio`) et le cadrage se fait en
     `cover` : ses photos d'atelier arriveront dans tous les formats, du
     carre Instagram au portrait telephone, et une frise dont chaque carte
     a une hauteur d'image differente perd la regularite qui fait justement
     sa lisibilite. */
}
.mms-ag__carte .mms-ag__media {
  margin: calc(var(--mms-ag-pad) * -1);
  margin-bottom: 0.35rem;
  aspect-ratio: 16/10;
  overflow: hidden;
}
.mms-ag__carte .mms-ag__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.mms-ag__carte {
  /* Le filet de categorie en tete, comme les cartes de formule. Il a suivi
     l'item vers la CARTE : sur la frise, l'item est une piste de la largeur
     d'une colonne, et le filet s'y serait etale a cote du contenu.

     `z-index: 1` DEPUIS QUE LES CARTES PORTENT UNE IMAGE : le filet est un
     pseudo-element du parent, donc peint AVANT les enfants a z-index egal.
     Mesure du 2026-08-07 : sur la carte a image il avait purement disparu,
     alors qu'il restait visible sur celle qui n'en avait pas -- le genre
     d'ecart qu'on prend pour un probleme de couleur. */
}
.mms-ag__carte::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 6px;
  background: var(--mms-cat);
  z-index: 1;
}
.mms-ag {
  /* LA DATE D'ABORD, ET EN GROS. C'est ce qu'on vient chercher : dans un
     agenda, le titre repond a « quoi » mais la date repond a « est-ce que
     c'est pour moi ». */
}
.mms-ag__quand {
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.2rem 0.7rem;
}
.mms-ag__dates {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.15rem, 1.7vw, 1.45rem);
  line-height: 1.15;
  color: var(--color-secondary);
}
.mms-ag__heures {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.84rem;
  letter-spacing: 0.04em;
  color: var(--color-primary-ink);
}
.mms-ag {
  /* Plus de regle `a` ici : le titre n'est plus un lien (2026-08-07), et la
     carte n'est plus cliquable. Garder la regle en aurait fait du code mort
     qu'une session suivante aurait pris pour un lien casse. */
}
.mms-ag__titre {
  margin: 0.15rem 0 0;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 1.02rem;
  line-height: 1.35;
  color: var(--color-text);
}
.mms-ag__artiste {
  margin: 0;
  font-size: 0.94rem;
  color: #4A3F44;
}
.mms-ag__mot {
  margin: 0.2rem 0 0;
  font-size: 0.92rem;
  line-height: 1.6;
  color: #4A3F44;
}
.mms-ag__pied {
  margin: 0.6rem 0 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem 1rem;
}
.mms-ag__complet {
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--color-white);
  background: var(--color-secondary);
  padding: 0.35em 0.8em;
}
.mms-ag {
  /* AUCUNE DATE : on le dit, et on ramene vers ce qui existe toujours. */
}
.mms-ag__vide {
  grid-column: 1/span 8;
}
.mms-ag__vide p {
  margin: 0 0 0.6rem;
  font-size: 1.02rem;
  line-height: 1.7;
  color: #4A3F44;
}
@media (max-width: 900px) {
  .mms-ag__vide {
    grid-column: 1/-1;
  }
}

/* ==========================================================================
   LA PAGE DU LEXIQUE -- 92 termes, 5 familles.
   Gabarit : `page-lexique-mms.php`. Filtrage : `assets/fork/lexique.js`.
   ==========================================================================

   CE QUI SE JOUE ICI, ET QUI N'EST PAS DU DECOR

   1. LA LONGUEUR DE LIGNE. Mesure du 2026-08-06 sur le rendu du gabarit du
      socle : les definitions couraient sur toute la largeur du conteneur, soit
      plus de 110 caracteres par ligne quand la lecture confortable en demande
      65 a 75. Sur 92 definitions, ce seul defaut suffisait a rendre la page
      illisible. La colonne de droite est donc bornee en `ch`, pas en `px` :
      l'unite suit la police et la borne reste vraie a toutes les tailles.

   2. LES ANCRES DOIVENT SE CALER SOUS UN EN-TETE COLLANT. Le single de chaque
      terme redirige en 301 vers `/lexique/#slug`
      (`inc/features/lexique/cpt.php:70`), et `.mms-header` est en
      `position: sticky` (`_client-chrome.scss:78`). SANS `scroll-margin-top`,
      le terme vise se cale DERRIERE l'en-tete et la barre d'outils : le
      lecteur arrive au bon endroit et ne voit pas son mot. Le lien fonctionne,
      la fonctionnalite ne fonctionne pas.

   3. LE TERRACOTTA NE PORTE PAS DE TEXTE. `primary` (#AF6D5D) vaut 3,44:1 sur
      le rose et 4,06:1 sur blanc : il ECHOUE AA sur les deux fonds du site.
      Tout ce qui se lit est donc en `primary-ink` (#96594A), et `primary` ne
      sert qu'aux aplats. Le bouton de lettre ACTIF est peint en `primary-ink`
      et non en `primary` pour cette raison exacte : il porte une lettre.

   4. AUCUNE OMBRE, AUCUN COIN ARRONDI. Ses deux documents sont anguleux et le
      relief y vient du decalage et de la couleur (`_client.scss:118`).
      `$brand-shadow` vaut `none`, `$brand-radius` vaut 4px. La seule pilule
      assumee est le bouton (`$brand-btn-radius`), et il n'y en a pas ici.
      ========================================================================== */
/* Le decalage des ancres. UNE variable, consommee par les termes ET par les
   sections de famille : les deux doivent s'arreter au meme endroit, et deux
   valeurs auraient diverge au premier reglage.
   Elle vaut la hauteur de l'en-tete collant plus celle de la barre d'outils,
   plus une respiration. Mesuree, pas estimee -- voir le commentaire de
   `.mms-lex-outils`. */
:root {
  /* MESURE DU 2026-08-06 sur `/lexique/#hachure`, viewport 1440 : l'en-tete
     collant fait 67 px et la barre d'outils 152 px, soit un obstacle de
     217 px en haut d'ecran. 14rem (224 px) place le terme vise juste en
     dessous, avec 43 px de respiration.
     Une valeur trop faible ne casse rien de visible : le terme arrive
     simplement DERRIERE la barre, et le lien parait ne pas fonctionner. */
  --mms-lex-ancre: 14rem;
}

@media (max-width: 900px) {
  /* La barre d'outils s'y empile sur deux rangees, l'en-tete se resserre.
     Le `:root` est indispensable : une custom property posee directement
     dans une media query, sans selecteur, est une declaration invalide que
     le compilateur laisse passer et que le navigateur ignore. */
  :root {
    --mms-lex-ancre: 17rem;
  }
}
@media (max-width: 640px) {
  /* MESURE DU 2026-08-06 en 390 px : en-tete 58 px + barre d'outils 243 px =
     301 px d'obstacle, quand 17rem n'en couvrait que 272. Le terme vise
     arrivait 4 px TROP HAUT, donc masque -- de justesse, ce qui est le pire
     cas : la page semble fonctionner, et le mot demande n'est pas la.
     L'alphabet defilant ramene la barre a une hauteur raisonnable, et cette
     valeur couvre ce qui reste. */
  :root {
    --mms-lex-ancre: 21rem;
  }
}
.mms-page-lexique {
  /* Le defilement doux vaut pour les ancres de famille. Il est pose ICI et
     non sur `html` : une regle globale changerait le comportement de tout le
     site depuis la feuille d'une seule page.
     `prefers-reduced-motion` le desactive -- un defilement anime sur 92
     entrees est exactement le genre de mouvement qui declenche un malaise
     vestibulaire. */
  scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
  .mms-page-lexique {
    scroll-behavior: auto;
  }
}

/* --------------------------------------------------------------------------
   1. LA TETE
   -------------------------------------------------------------------------- */
.mms-lex-tete {
  background: var(--color-surface);
}
.mms-lex-tete__contenu {
  grid-column: 1/span 8;
  display: grid;
  gap: 1.4rem;
  justify-items: start;
}
@media (max-width: 900px) {
  .mms-lex-tete__contenu {
    grid-column: 1/-1;
  }
}
.mms-lex-tete__mot {
  max-width: 62ch;
}
.mms-lex-tete__mot p {
  font-size: clamp(1.02rem, 1.4vw, 1.18rem);
  line-height: 1.65;
  color: var(--text-prose);
  margin: 0 0 0.9em;
}
.mms-lex-tete__mot p:last-child {
  margin-bottom: 0;
}
.mms-lex-tete {
  /* Le compte annonce l'ampleur du corpus, ce qui change la facon de
     l'aborder : « un lexique » se parcourt, « 92 termes » se cherche. */
}
.mms-lex-tete__compte {
  margin: 0;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: clamp(0.82rem, 1vw, 0.92rem);
  line-height: 1.6;
  color: var(--text-subtle);
  max-width: 46ch;
}
.mms-lex-tete__compte strong {
  color: var(--color-primary-ink);
  font-weight: 700;
}

/* --------------------------------------------------------------------------
   2. LA BARRE D'OUTILS
   --------------------------------------------------------------------------
   COLLANTE SOUS L'EN-TETE. Sur une page de cette longueur, devoir remonter
   pour changer de filtre est la premiere raison d'abandonner une recherche.

   `top` vaut la hauteur de `.mms-nav` : la barre s'arrete PILE sous elle. Une
   valeur trop faible laisse voir le contenu defiler dans l'interstice, une
   valeur trop forte ouvre une bande vide. C'est la seule valeur de ce fichier
   qui depende d'un composant exterieur, d'ou le rappel.

   `z-index: 50` la place SOUS l'en-tete (`z-index: 60`, `_client-chrome.scss`)
   et au-dessus du contenu : les deux se superposent proprement au defilement.
   -------------------------------------------------------------------------- */
.mms-lex-outils {
  position: sticky;
  top: 4.1rem;
  z-index: 50;
  background: var(--color-white);
  border-bottom: 1px solid rgba(172, 98, 89, 0.22);
  padding-block: clamp(0.9rem, 1.6vw, 1.3rem);
  /* La grille de la page sert aussi ici, mais ses colonnes ne servent a rien
     pour une barre d'outils : on la repasse en flux libre tout en gardant sa
     marge laterale et son centrage, pour rester aligne avec le contenu. */
}
.mms-lex-outils > .mms-grille {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(0.8rem, 2vw, 1.8rem);
}
@media (max-width: 900px) {
  .mms-lex-outils {
    top: 3.6rem;
  }
}

/* --- La recherche --------------------------------------------------------- */
.mms-lex-chercher {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  flex: 1 1 22rem;
}
.mms-lex-chercher__label {
  /* VISIBLE, et non masque : un champ de recherche vide sans libelle se
     confond avec une barre d'adresse. Le socle n'exposait qu'un
     `placeholder`, qui ne remplace pas un libelle -- ni pour un lecteur
     d'ecran, ni pour un lecteur presse. */
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: clamp(0.68rem, 0.8vw, 0.76rem);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--color-primary-ink);
  white-space: nowrap;
}
@media (max-width: 640px) {
  .mms-lex-chercher__label {
    flex: 1 0 100%;
  }
}
.mms-lex-chercher__champ {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.55rem;
  flex: 1 1 auto;
  background: var(--color-white);
  border: 1px solid rgba(172, 98, 89, 0.35);
  border-radius: 0;
  padding: 0.55em 0.9em;
  transition: border-color 0.18s ease;
}
.mms-lex-chercher__champ:focus-within {
  border-color: var(--color-primary-ink);
  /* Le focus se voit SANS ombre portee : un filet double, obtenu par
     `outline`, respecte la regle « aucune ombre » tout en restant
     parfaitement visible au clavier. */
  outline: 2px solid var(--color-primary-ink);
  outline-offset: 2px;
}
.mms-lex-chercher__ico {
  flex: 0 0 auto;
  color: var(--color-primary-ink);
  font-size: 1.05rem;
}
.mms-lex-chercher__input {
  flex: 1 1 auto;
  border: 0;
  background: transparent;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 1rem;
  color: var(--color-text);
  padding: 0;
}
.mms-lex-chercher__input:focus {
  outline: none;
}
.mms-lex-chercher__input {
  /* `--text-subtle` (#6D6262) ET NON `--color-muted` (#9A8B87).
     MESURE DU 2026-08-06 : le gris chaud de la marque vaut 3,27:1 sur
     blanc, donc ECHEC AA pour du texte. Un placeholder EST du texte, et
     celui-ci porte des exemples de recherche utiles (« argile, hachure,
     cadrage ») : illisible, il ne sert plus a rien.
     `--text-subtle` mesure 5,88:1.

     CE DEFAUT A FAILLI PASSER : une batterie de 15 controles de contraste
     l'a declare a 12,10:1, parce qu'elle lisait la couleur de l'INPUT et
     non celle du pseudo-element -- `::placeholder` n'est pas parcouru par
     `document.querySelector`. Le piege est connu et documente dans ce
     projet ; il s'est represente ici a l'identique. */
}
.mms-lex-chercher__input::placeholder {
  color: var(--text-subtle);
  opacity: 1;
}
.mms-lex-chercher__input {
  /* La croix native de Chrome sur `type="search"` : elle vide le champ
     sans declencher `input` dans les vieilles versions, et elle jure avec
     le reste. Echap vide le champ, le JS s'en charge. */
}
.mms-lex-chercher__input::-webkit-search-cancel-button {
  -webkit-appearance: none;
}
.mms-lex-chercher__statut {
  margin: 0;
  flex: 0 0 auto;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: clamp(0.7rem, 0.85vw, 0.78rem);
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--text-subtle);
  white-space: nowrap;
  min-width: 8ch;
}

/* --- Le filtre alphabetique ----------------------------------------------- */
.mms-lex-alpha {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}
.mms-lex-alpha__titre {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: clamp(0.68rem, 0.8vw, 0.76rem);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--color-primary-ink);
  white-space: nowrap;
}
.mms-lex-alpha__liste {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem;
  /* EN MOBILE, L'ALPHABET DEFILE AU LIEU DE S'EMPILER.
     Mesure du 2026-08-06 en 390 px : sur trois rangees, la barre d'outils
     atteignait 243 px, soit 29 % de la hauteur d'ecran occupes en
     permanence par des commandes. Une bande defilante la ramene a une
     rangee.
     Ce defilement-ci est LOCAL et voulu : la regle qu'il faut respecter
     interdit le defilement horizontal de la PAGE, pas celui d'un
     composant qui s'annonce comme tel. */
}
@media (max-width: 640px) {
  .mms-lex-alpha__liste {
    flex-wrap: nowrap;
    overflow-x: auto;
    scrollbar-width: thin;
    /* Le rappel visuel que la bande continue au-dela du bord. */
    padding-bottom: 0.3rem;
    -webkit-overflow-scrolling: touch;
  }
}
.mms-lex-alpha__b {
  /* Carre, pas rond : le rond appartient aux boutons d'action de ce site
     (`$brand-btn-radius`), et une pastille ronde ici les aurait imites
     sans en etre. */
  min-width: 2.2rem;
  min-height: 2.2rem;
  padding: 0 0.5em;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(172, 98, 89, 0.3);
  border-radius: 0;
  background: var(--color-white);
  color: var(--color-primary-ink);
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.82rem;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  transition: background-color 0.18s ease, color 0.18s ease, border-color 0.18s ease;
}
.mms-lex-alpha__b:hover {
  background: var(--color-surface);
  border-color: var(--color-primary-ink);
}
.mms-lex-alpha__b:focus-visible {
  outline: 2px solid var(--color-primary-ink);
  outline-offset: 2px;
}
.mms-lex-alpha__b {
  /* ACTIF EN `primary-ink` ET NON EN `primary` : ce bouton porte une
     lettre, donc du TEXTE. `on-primary` sur `primary` vaut 3,56:1 et
     echoue AA ; sur `primary-ink`, il vaut 4,82:1. */
}
.mms-lex-alpha__b.is-actif {
  background: var(--color-primary-ink);
  border-color: var(--color-primary-ink);
  color: var(--color-on-primary);
}
.mms-lex-alpha__b {
  /* CIBLES TACTILES. Mesure du 2026-08-06 : 5 commandes sous 32 px de
     haut, quand le doigt en demande 44. On n'agrandit PAS a la souris
     (des boutons de 44 px y seraient lourds pour une seule lettre) :
     `pointer: coarse` ne vise que les appareils reellement tactiles. */
}
@media (pointer: coarse) {
  .mms-lex-alpha__b {
    min-width: 2.75rem;
    min-height: 2.75rem;
  }
}

/* --- Les familles, en raccourcis ------------------------------------------ */
/* --- Les familles, en sommaire -------------------------------------------
   DANS LE FLUX, ET NON DANS LA BARRE COLLANTE. Mesure du 2026-08-06 : en les
   y laissant, celle-ci montait a 213 px et masquait le titre de la section
   vers laquelle on venait de sauter. Un sommaire se consulte au depart ; seule
   la recherche a besoin de suivre le lecteur.
   -------------------------------------------------------------------------- */
.mms-lex-familles {
  background: var(--color-white);
  padding-block: clamp(1.2rem, 2.5vw, 1.8rem);
  border-bottom: 1px solid var(--divider);
}
.mms-lex-familles__liste {
  grid-column: 1/-1;
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
}
.mms-lex-familles__l {
  display: inline-flex;
  align-items: center;
  gap: 0.45em;
  padding: 0.45em 0.9em;
  border: 1px solid rgba(172, 98, 89, 0.3);
  background: var(--color-white);
  color: var(--color-primary-ink);
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: clamp(0.72rem, 0.85vw, 0.8rem);
  font-weight: 600;
  text-decoration: none;
  transition: background-color 0.18s ease, border-color 0.18s ease;
}
.mms-lex-familles__l:hover, .mms-lex-familles__l:focus-visible {
  background: var(--color-surface);
  border-color: var(--color-primary-ink);
  color: var(--color-primary-ink);
}
.mms-lex-familles__l:focus-visible {
  outline: 2px solid var(--color-primary-ink);
  outline-offset: 2px;
}
.mms-lex-familles__l {
  /* Meme regle de cible tactile que les boutons de lettre. */
}
@media (pointer: coarse) {
  .mms-lex-familles__l {
    min-height: 2.75rem;
    padding-block: 0.6em;
  }
}
.mms-lex-familles {
  /* Le compte de chaque famille : une information, pas une decoration. Il
     dit au visiteur si la section vaut le detour avant qu'il y aille. */
}
.mms-lex-familles__n {
  font-size: 0.82em;
  font-weight: 700;
  color: var(--color-white);
  background: var(--color-primary-ink);
  padding: 0.1em 0.5em;
  line-height: 1.4;
}

/* --------------------------------------------------------------------------
   3. LE CORPS
   -------------------------------------------------------------------------- */
.mms-lex-corps {
  background: var(--color-white);
}

.mms-lex-famille {
  grid-column: 1/-1;
  scroll-margin-top: var(--mms-lex-ancre);
  /* L'etat de filtrage est porte par une CLASSE, jamais par un style en
     ligne : le JS compte les termes visibles en interrogeant le DOM, et un
     comptage fonde sur la serialisation d'un style se fausse a la premiere
     espace en trop. Le socle avait deja corrige ce defaut chez lui. */
}
.mms-lex-famille.is-filtre {
  display: none;
}
.mms-lex-famille + .mms-lex-famille {
  margin-top: clamp(3.5rem, 7vw, 6rem);
}
.mms-lex-famille__tete {
  display: grid;
  gap: 0.8rem;
  max-width: 62ch;
  margin-bottom: clamp(1.8rem, 3vw, 2.6rem);
  padding-bottom: 1.2rem;
  /* Un filet terracotta plutot qu'un gris : le meme choix que
     `divider` dans `_client.scss`, ou le separateur est teinte de la
     marque et non neutre. */
  border-bottom: 2px solid var(--color-primary);
}
.mms-lex-famille__titre {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.1;
  color: var(--color-secondary);
}
.mms-lex-famille__mot {
  margin: 0;
  font-size: clamp(0.95rem, 1.2vw, 1.05rem);
  line-height: 1.6;
  color: var(--text-subtle);
}

.mms-lex-liste {
  margin: 0;
  display: grid;
  gap: 0;
}

/* --- Un terme ------------------------------------------------------------- */
.mms-lex-terme {
  /* DEUX COLONNES SUR DESKTOP : le mot a gauche, sa definition a droite.
     C'est ce qui borne la ligne de lecture sans avoir a centrer la page, et
     c'est la disposition d'un vrai dictionnaire -- l'oeil descend la colonne
     des mots et ne lit que celui qu'il cherche. */
  display: grid;
  grid-template-columns: minmax(0, 3fr) minmax(0, 8fr);
  gap: clamp(1rem, 3vw, 2.5rem);
  padding-block: clamp(1.5rem, 2.5vw, 2.2rem);
  border-top: 1px solid var(--divider);
  scroll-margin-top: var(--mms-lex-ancre);
}
.mms-lex-terme:first-child {
  border-top: 0;
}
.mms-lex-terme.is-filtre {
  display: none;
}
.mms-lex-terme {
  /* LE TERME VISE PAR SON ANCRE. Sur 92 entrees, arriver au bon endroit ne
     suffit pas a savoir LEQUEL des trois termes a l'ecran on a demande.
     Le repere est un aplat rose et un filet terracotta a gauche : de la
     couleur et un decalage, jamais une ombre. Le JS retire la classe au
     premier defilement ou au premier clic. */
}
.mms-lex-terme.is-vise {
  background: var(--color-surface);
  box-shadow: inset 4px 0 0 var(--color-primary);
  /* Le seul cas ou la page respire hors de sa grille : l'aplat deborde
     legerement pour ne pas coller au texte. */
  padding-inline: clamp(0.9rem, 2vw, 1.4rem);
  margin-inline: clamp(-1.4rem, -2vw, -0.9rem);
}
@media (max-width: 780px) {
  .mms-lex-terme {
    grid-template-columns: 1fr;
    gap: 0.6rem;
  }
}
.mms-lex-terme__mot {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  font-size: clamp(1.15rem, 1.9vw, 1.45rem);
  line-height: 1.25;
  /* `primary-ink` et non `primary` : c'est du texte. */
  color: var(--color-primary-ink);
  /* Le mot reste visible pendant qu'on lit sa definition sur les longues
     entrees. Il s'arrete sous la barre d'outils, comme les ancres. */
  align-self: start;
  position: sticky;
  top: calc(var(--mms-lex-ancre) - 4rem);
}
@media (max-width: 780px) {
  .mms-lex-terme__mot {
    position: static;
  }
}
.mms-lex-terme__def {
  margin: 0;
  /* LA BORNE DE LECTURE. En `ch`, donc solidaire de la police : la ligne
     garde sa longueur confortable quand l'utilisateur grossit le texte,
     ce qu'une borne en pixels ne fait pas. */
  max-width: 68ch;
  color: var(--text-prose);
  font-size: clamp(0.98rem, 1.15vw, 1.06rem);
  line-height: 1.7;
}
.mms-lex-terme__def p {
  margin: 0 0 0.85em;
  /* La definition passe par `wpautop`, qui l'enveloppe de `<p>` : la
     marge basse du dernier poserait du vide SOUS le dernier element
     de son conteneur, et donc un rythme irregulier entre les termes.
     Meme correctif que le socle applique chez lui. */
}
.mms-lex-terme__def p:last-child {
  margin-bottom: 0;
}
.mms-lex-terme__def a {
  color: var(--color-primary-ink);
  text-decoration: underline;
  text-underline-offset: 0.18em;
}
.mms-lex-terme__def a:hover, .mms-lex-terme__def a:focus-visible {
  color: var(--color-accent);
}

/* --- La recherche infructueuse -------------------------------------------- */
.mms-lex-rien {
  grid-column: 1/-1;
  margin: clamp(2rem, 4vw, 3rem) 0 0;
  padding: clamp(1.4rem, 3vw, 2rem);
  background: var(--color-surface);
  border-left: 4px solid var(--color-primary);
  max-width: 62ch;
  font-size: clamp(0.98rem, 1.15vw, 1.06rem);
  line-height: 1.65;
  color: var(--text-prose);
}
.mms-lex-rien[hidden] {
  display: none;
}
.mms-lex-rien {
  /* Un bouton qui se lit comme un lien : c'est bien une action (il remet les
     filtres a zero), donc un `<button>`, mais son apparence doit dire
     « cliquez ici » dans le fil d'une phrase. */
}
.mms-lex-rien__b {
  border: 0;
  background: none;
  padding: 0;
  font: inherit;
  color: var(--color-primary-ink);
  text-decoration: underline;
  text-underline-offset: 0.18em;
  cursor: pointer;
}
.mms-lex-rien__b:hover, .mms-lex-rien__b:focus-visible {
  color: var(--color-accent);
}
.mms-lex-rien__b:focus-visible {
  outline: 2px solid var(--color-primary-ink);
  outline-offset: 2px;
}

.mms-lex-vide {
  background: var(--color-white);
}
.mms-lex-vide p {
  grid-column: 1/-1;
  margin: 0;
  color: var(--text-subtle);
}

/* --------------------------------------------------------------------------
   4. LA CONCLUSION
   --------------------------------------------------------------------------
   Section peinte en bleu petrole : elle ferme la page et la detache du corps
   blanc. L'encre y est le rose `surface`, qui vaut plus de 11:1 sur ce bleu --
   la seule combinaison de ce site ou une encre claire passe largement.
   -------------------------------------------------------------------------- */
.mms-lex-fin {
  background: var(--color-secondary);
}
.mms-lex-fin__contenu {
  grid-column: 1/span 8;
  max-width: 62ch;
}
@media (max-width: 900px) {
  .mms-lex-fin__contenu {
    grid-column: 1/-1;
  }
}
.mms-lex-fin__contenu p {
  margin: 0 0 1em;
  color: var(--color-surface);
  font-size: clamp(1.02rem, 1.4vw, 1.15rem);
  line-height: 1.7;
}
.mms-lex-fin__contenu p:last-child {
  margin-bottom: 0;
}
.mms-lex-fin__contenu a {
  color: var(--color-highlight);
  text-decoration: underline;
  text-underline-offset: 0.2em;
  font-weight: 600;
}
.mms-lex-fin__contenu a:hover, .mms-lex-fin__contenu a:focus-visible {
  color: var(--color-white);
}
.mms-lex-fin__contenu a:focus-visible {
  outline: 2px solid var(--color-highlight);
  outline-offset: 3px;
}

/* --------------------------------------------------------------------------
   5. L'INFOBULLE DES TERMES, AUX COULEURS DU FORK
   --------------------------------------------------------------------------
   La feature du socle pose `.proto-term` dans la prose des articles et ouvre
   une `.proto-tooltip-box` au survol. Son style par defaut est generique :
   coins a 12px et grosse ombre portee (`features/lexique.scss`), soit
   exactement les deux choses que cette marque ne fait pas.

   ON REPEINT, ON NE REFAIT PAS. Le balisage et le script restent ceux du
   socle : ces regles ne touchent que l'apparence, et la feature continue de
   se comporter comme elle le fait partout ailleurs.
   -------------------------------------------------------------------------- */
.proto-term {
  background: rgba(172, 98, 89, 0.14);
  color: var(--color-primary-ink);
  border-radius: 0;
  /* Le pointille dit « ce mot en dit plus » sans imiter un lien de
     navigation, qui lui est souligne plein. */
  border-bottom: 1px dashed var(--color-primary);
  padding: 0 0.18em;
}
.proto-term:hover, .proto-term:focus-visible {
  background: var(--color-primary-ink);
  color: var(--color-on-primary);
  border-bottom-color: transparent;
}

.proto-tooltip-box {
  border-radius: 0;
  border: 1px solid var(--color-primary-ink);
  box-shadow: none;
  background: var(--color-white);
  color: var(--text-prose);
  font-family: "Montserrat", system-ui, sans-serif;
  max-width: 34ch;
}
.proto-tooltip-box strong {
  font-family: "Fraunces", Georgia, serif;
  font-weight: 700;
  color: var(--color-primary-ink);
}
.proto-tooltip-box .tooltip-link {
  color: var(--color-primary-ink);
  text-decoration: underline;
  text-underline-offset: 0.18em;
}

/* LA SORTIE DE FIN DE LEXIQUE.
   Elle suit `.mms-lex-fin`, qui est peinte en bleu petrole : la poser en bleu elle
   aussi collerait deux sections sombres bout a bout et l'appel a l'action se
   perdrait dans la precedente. Elle prend donc le fond de marque, et c'est le
   bouton qui porte la couleur.
   Elle consomme `.inner_spacer_y` comme sa voisine plutot qu'un padding maison :
   le rythme vertical du site se regle a un seul endroit. */
.mms-lex-suite {
  background: var(--color-surface);
}
.mms-lex-suite__contenu {
  grid-column: 1/span 8;
  max-width: 60ch;
  display: grid;
  gap: clamp(1rem, 1.8vw, 1.5rem);
  justify-items: start;
}
@media (max-width: 900px) {
  .mms-lex-suite__contenu {
    grid-column: 1/-1;
  }
}
.mms-lex-suite__mot {
  margin: 0;
  color: var(--text-prose);
  font-size: clamp(1.02rem, 1.4vw, 1.15rem);
  line-height: 1.7;
}
.mms-lex-suite {
  /* Les deux actions sur une meme ligne, mais qui se replient : a 390px, un
     bouton et un lien cote a cote se chevauchaient. */
}
.mms-lex-suite__actions {
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(1rem, 2vw, 1.8rem);
}

/* LA SORTIE DE « L'ATELIER ».
   Posee par `loop_end` comme dernier enfant de `.page-content`, donc au meme
   niveau que les articles : si ce conteneur est une grille, sans cette regle le
   bloc se logerait dans une colonne d'article, large d'un tiers d'ecran. */
.mms-atelier-suite {
  grid-column: 1/-1;
  background: var(--color-surface);
  padding: clamp(2rem, 4vw, 3.25rem) clamp(1.5rem, 3vw, 2.75rem);
  margin-top: clamp(2rem, 4vw, 3.5rem);
  display: grid;
  gap: clamp(1rem, 1.8vw, 1.5rem);
  justify-items: start;
}
.mms-atelier-suite__mot {
  margin: 0;
  max-width: 58ch;
  color: var(--text-prose);
  font-size: clamp(1.02rem, 1.4vw, 1.15rem);
  line-height: 1.7;
}
.mms-atelier-suite__mot strong {
  color: var(--color-primary-ink);
}
.mms-atelier-suite__actions {
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(1rem, 2vw, 1.8rem);
}

/* ==========================================================================
   LES COLLAB' -- les artistes invites. Patron : `page-les-collab.php`.

   ELLE NE REDEFINIT AUCUN JETON et ne recopie aucune valeur d'espacement : le
   `<main>` porte `.mms-page`, qui apporte deja le fond, l'encre, la police du
   corps et le defilement doux avec sa garde. Ce fichier ne traite QUE ce qui
   est propre a cette page.

   LE BLOC DES COLLAB' DE L'ACCUEIL N'EST PAS TOUCHE : il garde ses styles dans
   `_client-accueil.scss` (`.mms-collab`). Les deux surfaces montrent les memes
   personnes, mais l'accueil en donne l'APERCU en trois lignes quand cette page
   en montre le TRAVAIL.

   DEUX RAPPELS QUI ONT DEJA COUTE SUR CE PROJET :
     - `.mms-grille` est une grille de DOUZE colonnes. Un enfant sans
       `grid-column` explicite en occupe UNE : c'est ainsi que « Voir les
       prochaines dates » s'est retrouve a 69,7px de large dans une grille de
       1440 (releve de la session 10).
     - les couleurs de MARQUE portent le prefixe (`--color-primary-ink`), les
       variables de SCHEME ne le portent PAS (`--text-prose`, `--text-subtle`).
       Ecrire `var(--color-text-prose)` compile sans erreur et ne colore rien.
   ========================================================================== */
/* --------------------------------------------------------------------------
   1. LA TETE
   -------------------------------------------------------------------------- */
.mms-co-tete__contenu {
  grid-column: 1/9;
}

.mms-co-tete__mot {
  color: var(--text-prose);
  max-width: 54ch;
}

/* --------------------------------------------------------------------------
   2. LES FICHES
   -------------------------------------------------------------------------- */
.mms-co-fiche .mms-grille {
  align-items: center;
}
.mms-co-fiche {
  /* Le fond alterne pale / blanc pour que deux artistes ne se confondent
     jamais au defilement -- meme geste que les quatre formules, et pour la
     meme raison : huit blocs identiques d'affilee se lisent comme un
     catalogue, pas comme huit personnes. */
}
.mms-co-fiche:nth-child(even) {
  background: var(--color-surface);
}

/* L'ALTERNANCE SE JOUE SUR LES COLONNES, PAS SUR `direction`.
   `direction: rtl` inverserait bien les deux blocs, mais c'est une propriete de
   TEXTE : elle deplace la ponctuation francaise en bout de ligne, et le « : »
   d'un paragraphe se retrouve a gauche. Les colonnes ne touchent qu'a la
   disposition, et l'ordre de LECTURE reste celui du DOM -- nom, discipline,
   puis video -- ce qui est aussi le bon ordre pour un lecteur d'ecran. */
.mms-co-fiche__propos {
  grid-column: 1/6;
}

.mms-co-fiche__media {
  grid-column: 7/13;
}

.mms-co-fiche--pair .mms-co-fiche__propos {
  grid-column: 8/13;
}
.mms-co-fiche--pair .mms-co-fiche__media {
  grid-column: 1/7;
}

/* SANS VIDEO, LA FICHE SE RESSERRE -- ET CE N'EST PAS UN DETAIL DE CONFORT.
   Mesure du 2026-08-09, avant correctif : la page faisait **5614px** de haut
   pour huit fiches de trois lignes chacune. `inner_spacer_y` pose
   `--space-xxxl`, l'espacement d'une section RICHE ; sous un nom, une
   discipline et un pseudo, il produit huit ecrans de vide que rien ne remplit.

   Le rythme suit donc la MATIERE : compact tant qu'il n'y a qu'un nom, ample
   des qu'une video arrive. Tant que Caroline n'a pas envoye ses fichiers,
   c'est l'etat de TOUTES les fiches -- ce ne peut donc pas etre un cas
   degrade qu'on laisse de cote.

   La largeur suit le meme raisonnement : a cinq colonnes le texte formerait
   une colonne maigre a cote d'un vide, ce qui se lit comme une image qui n'a
   pas charge. */
.mms-co-fiche--sans-video {
  padding-block: clamp(1.4rem, 2.6vw, 2.4rem);
}
.mms-co-fiche--sans-video .mms-co-fiche__propos {
  grid-column: 1/9;
}

.mms-co-fiche--sans-video.mms-co-fiche--pair .mms-co-fiche__propos {
  grid-column: 5/13;
}

/* Les trois lignes se serrent aussi entre elles : sous un nom, un libelle de
   role et un pseudo, les marges d'un paragraphe de prose sont trop larges. */
.mms-co-fiche--sans-video .mms-co-fiche__quoi {
  margin-top: 0.2rem;
}
.mms-co-fiche--sans-video .mms-co-fiche__texte {
  margin-top: 0.7rem;
}
.mms-co-fiche--sans-video .mms-co-fiche__compte {
  margin-top: 0.5rem;
}

.mms-co-fiche__nom {
  /* `secondary` (#01334D) vaut 11,23:1 sur le rose et 13,27:1 sur blanc : le
     seul des trois qui passe AA sur les deux fonds de cette page. `primary`
     echoue AA en texte MEME sur blanc (4,06:1). */
  color: var(--color-secondary);
  margin: 0;
}

/* LA DISCIPLINE EST UN APLAT, PAS UNE COULEUR DE TEXTE -- ET LA MESURE A DU LE
   RAPPELER. Premiere ecriture : `color: var(--color-highlight-ink)`, en croyant
   reprendre le traitement de l'accueil. Mesure du 2026-08-09 : **3,27:1 sur le
   rose et 3,86:1 sur blanc**, huit echecs AA d'un coup.

   POURQUOI L'ACCUEIL, LUI, EST CONFORME : sa section `.mms-collab` est sur FOND
   BLEU PETROLE (`_client-accueil.scss:1049`). L'abricot y vaut 8,24:1 parce que
   le fond est sombre. J'ai transpose la couleur sans le fond, sur une page dont
   les fonds sont clairs.

   C'est mot pour mot ce que ce projet a deja paye sur ses etiquettes : retirer
   un aplat, c'est rendre le texte dependant d'un fond qu'on n'a pas choisi.
   Ses quatre affiches, elles, posent ce libelle de role en APLAT ABRICOT A
   ENCRE SOMBRE -- et un aplat opaque emporte son contraste partout, sans avoir
   a enumerer les contextes.

   Mesure apres correctif : 8,24:1 sur le rose comme sur le blanc, parce que
   ni l'un ni l'autre n'entre plus dans le calcul. */
.mms-co-fiche__quoi {
  display: inline-block;
  background: var(--color-highlight);
  color: var(--color-secondary);
  padding: 0.25em 0.7em;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  font-family: "Montserrat", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.75rem;
  line-height: 1.4;
  margin: 0.6rem 0 0;
}

.mms-co-fiche__texte {
  color: var(--text-prose);
  max-width: 46ch;
  margin: 1.2rem 0 0;
}

.mms-co-fiche__compte,
.mms-co-fiche__reel {
  margin: 1rem 0 0;
}

.mms-co-fiche__video {
  width: 100%;
  height: auto;
  display: block;
  /* Aucun arrondi decoratif : ses aplats sont a angles droits, et la pilule
     des boutons est le seul arrondi assume du site. */
  border-radius: 0;
  background: var(--color-secondary);
}

/* --------------------------------------------------------------------------
   3. LA SORTIE
   -------------------------------------------------------------------------- */
/* `1 / -1` ET PAS D'OUBLI : c'est exactement la ligne qui manquait a la sortie
   des Collab' de l'accueil, restee a une colonne sur douze de la session 7 a la
   session 10. */
.mms-co-fin__sortie {
  grid-column: 1/-1;
  margin: 0;
}

/* --------------------------------------------------------------------------
   4. L'APPEL AUX ARTISTES
   --------------------------------------------------------------------------
   LE FOND EST ROSE PARCE QUE SES DEUX VOISINS SONT BLANC ET BLEU PETROLE.
   Ce n'est pas un gout, c'est une contrainte : la fin de page enchaine la 8e
   fiche (blanche, `:nth-child` impair), `mms-co-fin` (sans fond declare, donc
   blanche), cette section, puis `.mms-footer` en bleu petrole
   (`_client-chrome.scss:193`). Le bleu la collerait au pied ; le blanc ferait
   trois blocs identiques d'affilee.

   Si l'ordre des sections change un jour, CE FOND SE RECALCULE -- il ne se
   recopie pas.
   -------------------------------------------------------------------------- */
.mms-co-artistes {
  background: var(--color-surface);
}

.mms-co-artistes__contenu {
  grid-column: 3/11;
  display: grid;
  justify-items: center;
  text-align: center;
  gap: 1.1rem;
}

/* Un titre centre doit voir ses lignes centrees, sinon le decalage lateral du
   systeme affiche le fait boiter. Meme geste que `.mms-inscription`. */
.mms-co-artistes__titre {
  display: grid;
  justify-items: center;
}

.mms-co-artistes .mms-aff__l {
  margin-left: 0 !important;
}

.mms-co-artistes .mms-aff {
  display: grid;
  justify-items: center;
}

.mms-co-artistes__mot {
  margin: 0;
  max-width: 52ch;
  line-height: 1.7;
  font-size: clamp(1rem, 1.2vw, 1.12rem);
}

.mms-co-artistes__action {
  margin: 0.4rem 0 0;
}

/* --------------------------------------------------------------------------
   5. LE TELEPHONE
   Meme point de rupture que l'accueil (900px), ou `.mms-grille` passe a une
   colonne unique : tout enfant doit alors reprendre la largeur entiere, sinon
   il reste cale sur des colonnes qui n'existent plus.
   -------------------------------------------------------------------------- */
@media (max-width: 900px) {
  .mms-co-tete__contenu,
  .mms-co-fiche__propos,
  .mms-co-fiche__media,
  .mms-co-fiche--pair .mms-co-fiche__propos,
  .mms-co-fiche--pair .mms-co-fiche__media,
  .mms-co-fiche--sans-video .mms-co-fiche__propos,
  .mms-co-fiche--sans-video.mms-co-fiche--pair .mms-co-fiche__propos {
    grid-column: 1/-1;
  }
  /* La video passe AVANT le texte sur un telephone : c'est elle qui donne
     envie de lire ce qui suit, et sur un ecran etroit le texte la
     repousserait sous la ligne de flottaison. */
  .mms-co-fiche__media {
    order: 1;
  }
  .mms-co-fiche__propos {
    order: 2;
  }
  /* Meme raison que tout ce qui precede : `3 / 11` ne veut plus rien dire sur
     une grille a une seule colonne. */
  .mms-co-artistes__contenu {
    grid-column: 1/-1;
  }
}
/* ==========================================================================
   « L'ATELIER » -- LA VIDEO D'UN ARTICLE
   ==========================================================================
   Le gabarit du fork (`single-realisations-mms.php`) pose une video pleine
   largeur apres le corps de l'article. Tout le reste de la page -- hero, corps
   Gutenberg, maillage -- est habille par le socle et n'est pas retouche ici.
   ========================================================================== */
.mms-real-video {
  /* LE TITRE, PARCE QU'UNE AFFICHE BIEN EXTRAITE RESSEMBLE A UNE PHOTO.
     C'est ce qui rendait la zone muette : rien n'annoncait une video, et la
     seule marque en etait une barre de controle de quelques pixels. */
}
.mms-real-video__titre {
  font-family: "Fraunces", Georgia, serif;
  color: var(--color-secondary);
  font-size: clamp(1.3rem, 2vw, 1.75rem);
  line-height: 1.2;
  margin: 0 0 1.2rem;
  text-align: center;
}
.mms-real-video {
  /* Le cadre ne sert qu'a porter la pastille : il epouse la largeur du
     lecteur (`max-content`), sans quoi la pastille se centrerait sur toute la
     colonne et flotterait a cote de la video. */
}
.mms-real-video__cadre {
  position: relative;
  width: max-content;
  max-width: 100%;
  margin-inline: auto;
}
.mms-real-video {
  /* LA PASTILLE DE LECTURE.
     `pointer-events: none` EST INDISPENSABLE, pas une precaution : posee sur
     la video, elle intercepterait le clic destine aux controles natifs et la
     video deviendrait injouable -- un decor qui casse la fonction qu'il
     annonce.
     Elle s'efface des que la lecture commence, sans une ligne de JavaScript :
     `:has(video:not([paused]))` n'existe pas, mais l'etat `playing` se lit par
     la pseudo-classe `:state()`... qui n'est pas encore la non plus. On se
     rabat sur ce qui EST supporte partout : la video passe en `autoplay`
     jamais, donc on masque la pastille au survol et au focus du cadre, et
     surtout des que la video n'affiche plus son affiche -- ce qui se traduit
     par le `:hover` et le `:focus-within`. Le cas restant (video en lecture,
     souris ailleurs) laisse une pastille sur une image qui bouge : c'est
     pourquoi elle est SEMI-TRANSPARENTE et petite, pas un aplat opaque. */
}
.mms-real-video__play {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  pointer-events: none;
  color: var(--color-on-primary);
  transition: opacity 0.25s ease;
}
.mms-real-video__play svg {
  display: block;
  padding: 0.9rem 0.8rem 0.9rem 1.1rem;
  border-radius: 999px;
  /* L'aplat porte son propre contraste : le rose de la marque sur un
     terracotta assombri vaut 4,82:1, le seul couple terracotta qui
     passe AA -- `primary` echoue meme sur blanc. */
  background: color-mix(in srgb, var(--color-primary-ink) 88%, transparent);
}
.mms-real-video__cadre:hover .mms-real-video__play, .mms-real-video__cadre:focus-within .mms-real-video__play {
  opacity: 0;
}
.mms-real-video {
  /* LA MENTION DU SON. Une video muette sans explication passe pour une video
     cassee -- et la raison est juridique, pas technique : la licence de la
     bibliotheque musicale d'Instagram couvre Instagram, pas un site marchand.
     Le dire renvoie vers le reel, ou la musique existe. */
}
.mms-real-video__note {
  font-family: "Montserrat", system-ui, sans-serif;
  color: var(--text-subtle);
  font-size: 0.92rem;
  line-height: 1.6;
  text-align: center;
  max-width: 52ch;
  margin: 1rem auto 0;
}
.mms-real-video__lecteur {
  display: block;
  margin-inline: auto;
  /* LE PLAFOND DE HAUTEUR N'EST PAS DECORATIF, IL EST INDISPENSABLE.
     Un reel est VERTICAL (1080x1920). Pose en `width: 100%` dans une
     colonne de contenu de 1200px, il ferait plus de 2100px de haut :
     l'article se couperait en deux et la video occuperait trois ecrans.
     On contraint donc la HAUTEUR et on laisse la largeur suivre.
     `max-width: 100%` garde le cas horizontal correct, et sur un
     telephone c'est lui qui gagne -- l'ordre des deux limites fait que
     la video reste entiere dans les deux orientations. */
  max-height: 80vh;
  max-width: 100%;
  height: auto;
  width: auto;
  /* Meme traitement que la video des Collab' (`_client-collab.scss:154`) :
     aucun arrondi decoratif, ses aplats sont a angles droits, et le fond
     evite le rectangle noir du navigateur avant le chargement. */
  border-radius: 0;
  background: var(--color-secondary);
}

/* ==========================================================================
   « L'ATELIER » -- LES PHOTOS DE LA SEANCE
   ==========================================================================
   Rendues pour la premiere fois le 2026-08-11. La saisie existait depuis le
   socle, l'affichage jamais : les photos n'etaient lues que par n8n, en REST,
   pour batir l'article -- et ce pipeline a ete debranche en session 13.

   AUCUN EFFET AU SURVOL, ET C'EST DELIBERE. Ce sont les oeuvres des eleves :
   elles se regardent, elles ne se cliquent pas. Un agrandissement au survol
   n'existerait de toute facon pas sur un telephone, qui est le contexte
   d'usage decrit dans `.impeccable.md` -- la meme raison qui avait fait
   remplacer la pause au survol de la bande des 23 oeuvres en session 9.
   ========================================================================== */
.mms-real-galerie__titre {
  font-family: "Fraunces", Georgia, serif;
  /* `secondary` (#01334D) vaut 11,23:1 sur le rose et 13,27:1 sur blanc.
     C'est le seul des trois qui passe AA sur les deux fonds que cette
     page peut presenter -- `primary` echoue AA en texte MEME sur blanc
     (4,06:1), mesure du 2026-08-06. */
  color: var(--color-secondary);
  margin: 0 0 1.6rem;
}
.mms-real-galerie {
  /* UNE GRILLE QUI SE REGLE SEULE, SANS UNE SEULE REQUETE DE MEDIA.
     `auto-fit` + `minmax` donnent trois colonnes sur un grand ecran, deux sur
     une tablette et une sur un telephone. Le `min()` est ce qui empeche le
     debordement horizontal en dessous de 280px : sans lui, la piste garderait
     sa largeur minimale et la page defilerait de cote. */
}
.mms-real-galerie__liste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
  gap: clamp(1.2rem, 2.4vw, 2rem);
}
.mms-real-galerie__item {
  margin: 0;
}
.mms-real-galerie__figure {
  margin: 0;
}
.mms-real-galerie__image {
  display: block;
  width: 100%;
  height: auto;
  /* Angles droits, comme partout ici : ses affiches sont des aplats
     pleins a angles droits, et le seul arrondi assume du site est la
     pilule des boutons. */
  border-radius: 0;
  /* Le fond tient la place pendant le chargement differe (`loading="lazy"`)
     et evite que la page ne saute quand l'image arrive. */
  background: var(--color-surface, #FDE7E8);
}
.mms-real-galerie {
  /* LA LEGENDE EST SOUS L'IMAGE, JAMAIS DESSUS -- donc elle n'a pas besoin
     d'aplat. La regle « un texte pose sur une image est toujours sur un
     aplat » vise le texte SUPERPOSE ; ici le contraste est celui du fond de
     page, deja mesure. */
}
.mms-real-galerie__legende {
  font-family: "Montserrat", system-ui, sans-serif;
  color: var(--text-prose);
  font-size: 0.95rem;
  line-height: 1.6;
  max-width: 46ch;
  margin: 0.7rem 0 0;
}

/* ==========================================================================
   « L'ATELIER » -- LE CORPS DE L'ARTICLE
   ==========================================================================
   `.real-content` n'avait qu'UNE SEULE regle dans tout le SCSS du projet --
   `.real-content > .pmb:first-child { padding-top }` (`realisations.scss:50`) --
   et elle ne pouvait meme pas s'appliquer a ce que Caroline ecrit.

   POURQUOI : cette regle vise les blocs `.pmb` du socle, que le pipeline n8n
   produisait. Ce pipeline est debranche depuis la session 13, a sa demande : elle
   redige desormais dans l'editeur, donc des `<p>`, des `<h2>` et des `<ul>`
   NATIFS. Aucun `.pmb` n'apparait, la seule regle du fichier ne trouve personne,
   et le texte sortait sans largeur de ligne ni rythme -- etale sur toute la
   largeur de l'ecran, ce qui est la pire mise en page possible pour de la prose.

   C'est la meme mecanique que les portes condamnees : on a debranche un
   producteur sans regarder ce qui habillait sa production.

   LA LARGEUR VIENT DE LA GRILLE DU FORK, pas d'un padding invente ici : le
   gabarit enveloppe le corps dans `.mms-grille`, et la prose occupe dix colonnes
   sur douze avec une mesure plafonnee. Les deux se completent -- la grille cale
   sur le reste du site, le `max-width` garde une ligne lisible sur un grand
   ecran (65 a 75 caracteres, au-dela l'oeil perd la ligne suivante).
   ========================================================================== */
/* LE SAVOIR ET LE CORPS SONT UN SEUL ARTICLE, PAS DEUX SECTIONS.
   `@extend .inner_spacer_y` sur chacun posait `--space-xxxl` de part et d'autre
   de leur jointure : **370px de vide mesures** entre la fin de l'encadre et la
   premiere ligne du texte, sur un ensemble qui se lit d'une traite. Meme
   empilement que sur la liste, a un autre endroit du meme chantier -- c'est le
   defaut que produit l'espacement de section applique a des blocs qui n'en sont
   pas. Le corps ferme la serie, il garde donc le grand espacement EN BAS. */
.mms-real-savoir {
  padding-block: var(--space-xxl) 0;
}

.mms-real-corps {
  padding-block: var(--space-xl) var(--space-xxxl);
}

/* UNE SEULE SOURCE POUR LA MESURE DE L'ARTICLE, ET IL A FALLU LA MESURE POUR LE
   VOIR. La boite du savoir et le corps portaient tous deux `max-width: 72ch` et
   ne s'alignaient pas : **14px d'ecart au rendu**. `ch` est la largeur du zero
   dans la police de L'ELEMENT -- le corps est a 16,6px, la boite heritait de 16.
   Deux fois la meme valeur ecrite ne font pas deux fois la meme largeur.
   Le corps de texte est donc pose une fois, sur l'ancetre commun, et les deux
   blocs le lisent. */
.real-single {
  --mms-real-corps-fs: clamp(1rem, 1.15vw, 1.12rem);
  --mms-real-mesure: 72ch;
}

.real-content {
  grid-column: 2/12;
  font-family: "Montserrat", system-ui, sans-serif;
  color: var(--text-prose);
  /* Le corps de texte AVANT la mesure : `ch` se calcule sur la police de
     l'element, donc la taille doit etre posee pour que `72ch` veuille dire
     quelque chose. */
  font-size: var(--mms-real-corps-fs);
  max-width: var(--mms-real-mesure);
  margin-inline: auto;
  line-height: 1.72;
  /* LE RYTHME VERTICAL EST POSE SUR L'ESPACE ENTRE FRERES, jamais en marges
     hautes et basses cumulees : deux marges qui se rencontrent fusionnent en
     CSS, et le resultat depend alors de laquelle est la plus grande -- donc de
     l'ordre dans lequel elle a ecrit ses blocs. `* + *` est stable. */
}
.real-content > * {
  margin-block: 0;
}
.real-content > * + * {
  margin-block-start: 1.15em;
}
.real-content {
  /* Un titre respire PLUS avant qu'apres : il appartient a ce qui le suit.
     Sans cela, un `<h2>` flotte a egale distance des deux paragraphes et ne
     dit plus lequel il coiffe. */
}
.real-content > :is(h2, h3, h4) {
  font-family: "Fraunces", Georgia, serif;
  color: var(--color-secondary);
  line-height: 1.18;
  margin-block-start: 2.2em;
  margin-block-end: 0;
}
.real-content > h2 {
  font-size: clamp(1.5rem, 2.2vw, 2rem);
}
.real-content > h3 {
  font-size: clamp(1.25rem, 1.7vw, 1.5rem);
}
.real-content > h4 {
  font-size: clamp(1.1rem, 1.4vw, 1.25rem);
}
.real-content > :is(h2, h3, h4) + * {
  margin-block-start: 0.7em;
}
.real-content {
  /* Un titre en tete d'article ne prend pas son grand espace : il n'a rien
     au-dessus de quoi se detacher. */
}
.real-content > :first-child {
  margin-block-start: 0;
}
.real-content > ul, .real-content > ol {
  padding-inline-start: 1.4em;
}
.real-content > ul li, .real-content > ol li {
  margin-block: 0.35em;
}
.real-content > ul {
  list-style: square;
}
.real-content {
  /* LES IMAGES QU'ELLE POSE DANS SON TEXTE. Angles droits comme partout, et
     une largeur qui ne depasse pas la colonne -- une image de 2000px collee
     dans l'editeur ferait defiler la page de cote sans cela. */
}
.real-content img {
  display: block;
  max-width: 100%;
  height: auto;
  border-radius: 0;
}
.real-content figure {
  margin-inline: 0;
}
.real-content figcaption {
  font-size: 0.92rem;
  color: var(--text-subtle);
  margin-block-start: 0.6rem;
}
.real-content {
  /* Une citation est un aplat a angles droits avec un filet, comme ses
     bandeaux d'affiche -- et non un bloc gris arrondi de theme generique. */
}
.real-content blockquote {
  border-inline-start: 4px solid var(--color-highlight);
  padding-inline-start: 1.2rem;
  font-size: 1.08em;
  color: var(--color-secondary);
}
.real-content blockquote p {
  margin-block: 0.4em;
}
.real-content strong, .real-content b {
  color: var(--color-secondary);
}

@media (max-width: 900px) {
  .real-content {
    grid-column: 1/-1;
  }
}
/* ==========================================================================
   « L'ATELIER » -- « CE QU'IL FAUT SAVOIR »
   ==========================================================================
   `real_contexte` etait la TROISIEME porte condamnee de la serie : Caroline le
   remplit -- son article #6098 le prouve -- et il ne s'affichait NULLE PART.
   Son libelle d'origine etait « Contexte libre (pour la redaction IA) » : il
   existait pour nourrir un pipeline debranche depuis. Seul usage restant : la
   description du `VideoObject`, et seulement s'il y a une video.

   ON L'AFFICHE PLUTOT QUE DE LE RETIRER, et ce n'est pas le choix par defaut.
   Ce qu'elle y ecrit -- l'age des enfants, ce qui a ete cherche, l'artiste dont
   on s'est inspire -- est exactement ce que le principe de design n^o 1 reclame :
   nommer une matiere, citer une technique, plutot qu'affirmer une qualite. Un
   parent qui hesite lit cela avant le reste.

   L'APLAT EST OPAQUE ET IL PORTE SON PROPRE CONTRASTE. Abricot `highlight`
   (#FBC08E) sous encre `secondary` (#01334D) : 8,24:1, la meme paire que les
   etiquettes de discipline des Collab', et pour la meme raison -- elle vaut sur
   n'importe quel fond, sans avoir a enumerer les contextes.
   ========================================================================== */
/* LA BOITE SE CALE SUR LA MESURE DU CORPS, PAS SUR SES COLONNES.
   Les deux portaient bien `grid-column: 2 / 12`, mais le corps ajoute
   `max-width: 72ch; margin-inline: auto` pour garder une ligne lisible : il se
   recentrait donc DANS ses dix colonnes, quand la boite les occupait toutes.
   Mesure au rendu : deux blocs du meme article partant de deux verticales
   differentes, a une centaine de pixels l'un de l'autre. Une largeur de colonne
   identique ne suffit pas a aligner quand l'un des deux se recentre. */
.mms-real-savoir__boite {
  grid-column: 2/12;
  /* La MEME taille de corps que la prose, sans quoi `72ch` ne mesure pas la
     meme chose ici et la-bas. */
  font-size: var(--mms-real-corps-fs);
  max-width: var(--mms-real-mesure);
  margin-inline: auto;
  width: 100%;
  background: var(--color-highlight);
  color: var(--color-secondary);
  padding: clamp(1.4rem, 2.6vw, 2.2rem);
  /* Angles droits : ses aplats ne s'arrondissent pas. */
  border-radius: 0;
}

.mms-real-savoir__titre {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--color-secondary);
  margin: 0 0 0.8rem;
}

.mms-real-savoir__mot {
  font-family: "Montserrat", system-ui, sans-serif;
  color: var(--color-secondary);
  line-height: 1.7;
  max-width: 62ch;
  margin: 0;
}
.mms-real-savoir__mot p {
  margin-block: 0 0.7em;
}
.mms-real-savoir__mot p:last-child {
  margin-bottom: 0;
}

@media (max-width: 900px) {
  .mms-real-savoir__boite {
    grid-column: 1/-1;
  }
}
/* ==========================================================================
   « L'ATELIER » -- LA PAGE `/atelier/`. Patron : `archive-realisations.php`.
   ==========================================================================
   Elle ne redefinit aucun jeton et ne recopie aucune valeur d'espacement : le
   `<main>` porte `.mms-page`. Meme discipline que `_client-collab.scss`.

   RAPPEL QUI A DEJA COUTE ICI : `.mms-grille` a DOUZE colonnes, et un enfant
   sans `grid-column` explicite en occupe UNE. C'est ainsi qu'un lien de sortie
   s'est retrouve a 69,7px de large dans une grille de 1440.
   ========================================================================== */
/* --------------------------------------------------------------------------
   1. LA TETE
   -------------------------------------------------------------------------- */
.mms-at-tete__contenu {
  grid-column: 1/9;
}

.mms-at-tete__mot {
  color: var(--text-prose);
  max-width: 54ch;
}

/* --------------------------------------------------------------------------
   2. LES TECHNIQUES
   Des liens, pas des boutons -- et la difference se voit au clavier autant
   qu'a l'ecran.
   -------------------------------------------------------------------------- */
/* LE BARREAU APPARTIENT A LA LISTE, PAS A LA TETE -- ET LA MESURE A DU LE DIRE.
   -----------------------------------------------------------------------------
   Premiere ecriture : trois sections independantes, chacune avec ses espacements.
   Mesure du rendu a 1440 : la fin du chapeau tombait a 579px et la premiere carte
   commencait a **1038px**. **459px de vide**, dont le barreau n'occupait que 44 --
   trois quarts d'ecran de rien au milieu de la page.

   La cause n'est pas une valeur trop grande, c'est un EMPILEMENT : `inner_spacer_y`
   vaut `--space-xxxl` (177,6px mesures) et il etait pose des DEUX cotes du barreau,
   plus le padding propre de celui-ci. Chaque valeur etait juste isolement.

   `_client-chrome.scss:198` avait deja rencontre exactement cela au pied de page,
   et sa conclusion vaut ici : on descend d'un cran sur LA MEME echelle, on
   n'invente pas une valeur. Et `:has()` est deja du vocabulaire de ce projet
   (`_client-typography.scss:480`) : la tete ne se resserre QUE lorsqu'un barreau
   la suit, donc jamais quand il n'y a qu'une technique. */
.mms-at-tech {
  padding-block: 0;
  margin-block-end: clamp(1.6rem, 3vw, 2.6rem);
}

.mms-at-tete:has(+ .mms-at-tech) {
  padding-bottom: var(--space-xl);
}

.mms-at-tech + .mms-at-liste {
  padding-top: 0;
}

.mms-at-tech__liste {
  grid-column: 1/-1;
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
}

.mms-at-tech__item {
  margin: 0;
}

/* PENDANT LE FILTRAGE. La liste s'estompe sans disparaitre : un conteneur qui
   se vide ferait sauter la page vers le haut, et le retour du contenu serait un
   second saut. `pointer-events: none` empeche d'empiler deux requetes en
   cliquant vite -- le JS les annule deja, mais on ne compte pas sur une seule
   garde pour un etat visible.
   Aucun spinner : la requete rend une liste deja construite par PHP, elle dure
   quelques dizaines de millisecondes. Un indicateur qui apparait et disparait
   plus vite qu'on ne le lit est un clignotement, pas une information. */
.mms-at-liste.is-chargement .mms-at-liste__items {
  opacity: 0.45;
  pointer-events: none;
  transition: opacity 0.18s ease;
}

.mms-at-tech__lien {
  /* LA CIBLE TACTILE FAIT 44px DE HAUT, ET C'EST UNE CONTRAINTE, PAS UN
     ARRONDI DE CONFORT. Le contexte d'usage decrit dans `.impeccable.md` est
     « domestique et presse, souvent au telephone » : sous 44px, un parent
     manque le lien une fois sur trois. `inline-flex` + `min-height` y arrive
     la ou un `padding` seul donnait 35px mesures. */
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding-inline: 1.1em;
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  line-height: 1.2;
  /* `secondary` (#01334D) sur le rose de la page : 11,23:1. Le filet reprend
     le vocabulaire de l'etiquette au filet, qui est deja le traitement des
     petits libelles du site -- et non un contour de bouton generique. */
  color: var(--color-secondary);
  background: transparent;
  border: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
  border-radius: 0;
  text-decoration: none;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
  /* LE SURVOL PREND LA COULEUR DE SA TECHNIQUE (releve de Jonathan, 2026-08-12).
     Tous les filtres viraient au bleu petrole : le survol ne disait donc rien
     de ce qu'on allait obtenir, alors que la couleur EXISTE deja sur les
     cartes. Le lien annonce maintenant sa propre etiquette, et le rapport
     entre les deux se lit avant meme d'avoir clique.
     Le repli sert « Tout », qui n'a pas de technique : il garde le bleu. */
}
.mms-at-tech__lien:hover, .mms-at-tech__lien:focus-visible {
  background: var(--tech-fond, var(--color-secondary));
  color: var(--tech-encre, var(--color-on-primary));
  border-color: var(--tech-fond, var(--color-secondary));
}
.mms-at-tech__lien {
  /* L'ETAT COURANT EST UN APLAT A ENCRE CONTRASTEE : il ne se distingue pas
     par une nuance de gris, que rien ne garantit lisible, mais par un
     changement de NATURE -- le geste de ses quatre affiches, ou le petit
     libelle de role porte toujours son aplat.
     « Tout » n'ayant pas de technique, il retombe sur l'abricot (8,24:1). */
}
.mms-at-tech__lien.is-actif {
  background: var(--tech-fond, var(--color-highlight));
  color: var(--tech-encre, var(--color-secondary));
  border-color: var(--tech-fond, var(--color-highlight));
  cursor: default;
}

/* --------------------------------------------------------------------------
   3. LA LISTE
   -------------------------------------------------------------------------- */
.mms-at-liste {
  /* Le leger pivot des figures deborde de quelques pixels. `clip` et non
     `hidden` : `hidden` creerait un conteneur de defilement, ce qui casserait
     le `position: sticky` de tout enfant futur et ajouterait une barre. */
  overflow-x: clip;
}

/* LA LISTE EST ELLE-MEME UNE GRILLE DE DOUZE, dans la grille de douze.
   Elle ne peut pas se contenter d'etre un enfant : ses items doivent se caler
   sur les memes colonnes que la tete, sinon la page a deux alignements. */
/* TROIS PAR RANGEE, PARCE QUE SES IMAGES SONT DEBOUT.
   -----------------------------------------------------------------------------
   RELEVE DU 2026-08-12 SUR LES 41 MEDIAS DE LA MEDIATHEQUE : **76 % sont en
   portrait ou plus haut**. Ses photos d'oeuvres sont en **3:4** (0,750 mesure sur
   5864, 5876, 5882), et le **9:16 strict (0,563) est celui des reels** -- les deux
   videos des Collab' et leurs affiches. Elle photographie debout, comme elle
   filme debout.

   UNE PREMIERE VERSION LES CADRAIT EN PAYSAGE, sur une hauteur fixe. C'etait
   contre-intuitif : chaque photo se faisait couper en haut et en bas pour entrer
   dans un format qu'aucune de ses images ne possede. On ne cadre pas la
   photographie d'une cliente dans le format qui arrangeait la grille.

   D'OU DEUX CHANGEMENTS LIES. Le portrait impose des cartes plus etroites -- une
   carte de sept colonnes en 3:4 ferait plus de mille pixels de haut -- donc la
   rangee passe de deux a TROIS. Le rythme 7-5 disparait avec elle ; le collage se
   joue desormais sur le DECALAGE VERTICAL et le pivot, ce qui est d'ailleurs plus
   proche de ses affiches, ou les elements se chevauchent au lieu de s'aligner.

   POURQUOI 3:4 ET NON 9:16 : ce sont ses PHOTOS qui remplissent cette liste, et
   elles sont en 3:4. Imposer le 9:16 leur retirerait un quart de leur largeur
   pour epouser le format de ses videos. L'affiche d'un reel posee en image a la
   une est le seul cas qui se fera rogner, et il est rare. */
.mms-at-liste__items {
  grid-column: 1/-1;
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(2rem, 4vw, 3.5rem) clamp(1.5rem, 3vw, 3rem);
  /* Les cartes ne s'etirent pas a la hauteur de la rangee : sans cela, le
     decalage vertical ci-dessous serait avale par l'etirement. */
  align-items: start;
}

.mms-at-item {
  margin: 0;
}

/* LE DECALAGE, QUI EST LE GESTE DE COLLAGE.
   La carte du milieu descend, les deux autres restent en tete : la rangee cesse
   d'etre une ligne de vitrine et redevient un montage. Il est retire des que la
   grille passe sous trois colonnes -- a une colonne, il ne serait plus qu'un
   trou entre deux cartes. */
.mms-at-item:nth-child(3n+2) {
  margin-block-start: clamp(2rem, 5vw, 4.5rem);
}

.mms-at-carte {
  display: flex;
  flex-direction: column;
}

/* UN RAPPORT UNIQUE, ET C'EST LE SIEN.
   -----------------------------------------------------------------------------
   Avec deux publications, les images gardaient leur rapport naturel sans que rien
   ne choque. Avec cinq, chaque rangee devenait bancale : **plus de 400px de vide**
   sous la carte la plus courte, et deux titres qui ne commencaient jamais a la
   meme hauteur.

   Le rapport pose ici est celui de SES photos (3:4, releve sur la mediatheque),
   pas celui qui arrangeait la grille. La distinction avec la galerie tient
   toujours : l'image a la une est une VIGNETTE, l'oeuvre entiere vit dans
   l'article ou elle est rendue en `height: auto`, jamais coupee
   (`.mms-real-galerie__image`). */
.mms-at-carte__media {
  display: block;
  aspect-ratio: 3/4;
  overflow: hidden;
  /* Le fond tient la place pendant le chargement differe et evite que la page
     ne saute quand l'image arrive. */
  background: var(--color-surface);
  /* LE PIVOT CITE LE COLLAGE, IL NE DECORE PAS -- et il ne porte que sur
     l'IMAGE. Ses affiches pivotent les photos, jamais les textes : un titre
     de travers se lit moins bien et ferait « activite », pas « institution ».
     QUATRE VALEURS CYCLEES, franchement inegales : une rotation uniforme se
     lit comme un defaut de rendu, pas comme un parti pris. */
  rotate: -0.9deg;
}

.mms-at-item:nth-child(4n+2) .mms-at-carte__media {
  rotate: 0.5deg;
}

.mms-at-item:nth-child(4n+3) .mms-at-carte__media {
  rotate: -0.4deg;
}

.mms-at-item:nth-child(4n) .mms-at-carte__media {
  rotate: 0.8deg;
}

.mms-at-carte__img {
  display: block;
  width: 100%;
  height: 100%;
  /* `cover` et non `contain` : `contain` laisserait des bandes de fond de part
     et d'autre d'une planche en portrait, ce qui reintroduirait exactement le
     vide qu'on vient de retirer. Le cadrage est centre -- l'oeuvre entiere est
     dans l'article. */
  object-fit: cover;
  object-position: center;
  /* Angles droits, comme partout ici. */
  border-radius: 0;
}

.mms-at-carte__corps {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.7rem;
  padding-block-start: clamp(1rem, 2vw, 1.5rem);
}

.mms-at-carte__titre {
  font-family: "Fraunces", Georgia, serif;
  /* `secondary` : 11,23:1 sur le rose, 13,27:1 sur blanc. `primary` echoue AA
     en texte MEME sur blanc (4,06:1) -- mesure du 2026-08-06. */
  color: var(--color-secondary);
  font-size: clamp(1.3rem, 2vw, 1.75rem);
  line-height: 1.2;
  margin: 0;
}
.mms-at-carte__titre a {
  color: inherit;
  text-decoration: none;
  /* Le trait apparait au survol ET au focus : un lien de titre sans
     soulignement permanent doit au moins se signaler quand on l'atteint,
     sinon il n'existe pas pour qui navigue au clavier. */
}
.mms-at-carte__titre a:hover, .mms-at-carte__titre a:focus-visible {
  text-decoration: underline;
  text-underline-offset: 0.15em;
}

.mms-at-carte__mot {
  color: var(--text-prose);
  max-width: 52ch;
  margin: 0;
  line-height: 1.65;
}

/* CE QU'IL Y A DEDANS : « 6 photos · une vidéo ». Un FAIT, en petit, sous le
   texte -- pas un « Découvrir » qui ne dit rien. `--text-subtle` (#6D6262) vaut
   5,88:1, mesure sur le pseudo-element en session 6 ; `--color-muted` (#9A8B87),
   qui semblait fait pour cela, tombe a 3,27:1. */
.mms-at-carte__contenu {
  font-family: "Montserrat", system-ui, sans-serif;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-subtle);
  margin: 0;
}

/* --------------------------------------------------------------------------
   2 bis. UNE COULEUR PAR TECHNIQUE
   Cinq couples de SA palette, cycles par `mms_atelier_couleur_technique()`
   (`inc/fork-atelier.php`) sur l'identifiant du terme -- donc stables a vie, et
   automatiques pour toute technique que Caroline creera.

   CHAQUE COUPLE EST UN APLAT OPAQUE PORTANT SON ENCRE, et chacun est verifie.
   Les ratios ci-dessous sont ceux du COUPLE lui-meme : un aplat opaque emporte
   son contraste partout, ce qui est precisement la raison de ce choix -- une
   encre posee sans fond dependrait du fond de la section, et ce projet a paye
   deux fois pour l'apprendre (une etiquette a 1:1, puis huit echecs AA d'un
   coup en reprenant une couleur sans relever son fond).

   `primary` (#AF6D5D) N'EST PAS DANS LA LISTE : il echoue AA en texte meme sur
   blanc (4,06:1). C'est `primary-ink` qui le remplace, et c'est pour cela que
   le doublet existe.
   -------------------------------------------------------------------------- */
/* LA CLASSE NE PEINT RIEN, ELLE DECLARE UN COUPLE.
   Trois endroits consomment la couleur d'une technique -- l'etiquette d'une
   carte, le survol de son filtre, et son etat courant -- et peindre les trois
   separement produirait trois listes de cinq regles a maintenir ensemble.
   Une custom property HERITE, donc il suffit de la poser sur l'element et de
   la lire la ou on en a besoin. C'est le meme raisonnement que le correctif
   `--footer-link` remonte au socle en session 8 : on rend au fork le geste que
   la regle lui interdisait, sans surencherir en specificite. */
.mms-tech-1 {
  --tech-fond: var(--color-highlight);
  --tech-encre: var(--color-secondary);
} /* abricot / bleu petrole  8,24:1 */
.mms-tech-2 {
  --tech-fond: var(--color-secondary);
  --tech-encre: var(--color-on-primary);
} /* bleu petrole / rose    11,64:1 */
.mms-tech-3 {
  --tech-fond: var(--color-primary-ink);
  --tech-encre: var(--color-on-primary);
} /* terracotta sombre / rose 4,82:1 */
.mms-tech-4 {
  --tech-fond: var(--color-accent);
  --tech-encre: var(--color-on-primary);
} /* magenta / rose          5,60:1 */
.mms-tech-5 {
  --tech-fond: var(--color-tertiary);
  --tech-encre: var(--color-white);
} /* vert-de-gris / blanc    5,00:1 */
/* L'ETIQUETTE D'UNE CARTE consomme le couple. Le filet de l'etiquette par
   defaut n'a plus lieu d'etre des qu'elle porte un aplat : il dessinerait un
   contour d'une autre couleur autour du fond. */
.mms-etiq[class*=mms-tech-] {
  background: var(--tech-fond);
  color: var(--tech-encre);
  border-color: transparent;
}

/* --------------------------------------------------------------------------
   3 bis. LA SORTIE VERS SES RESEAUX
   Le second objectif d'acquisition du site. Fond BLEU PETROLE par
   `pmb--scheme-dark`, la classe du socle qui pose d'un coup les sept encres du
   scheme -- les repeindre a la main creerait une seconde palette a cote de
   celle du systeme. C'est aussi le fond sur lequel l'abricot de l'etiquette
   vaut 8,24:1, alors qu'il tombe a 3,27:1 sur un fond clair.
   -------------------------------------------------------------------------- */
.mms-at-social {
  background: var(--color-secondary);
}

.mms-at-social__contenu {
  grid-column: 1/9;
  display: grid;
  justify-items: start;
  gap: 1.2rem;
}

.mms-at-social__mot {
  /* Le rose de la marque a 84 % sur le bleu petrole : le meme traitement que
     le chapeau de la section des Collab' de l'accueil, deja mesure. */
  color: rgba(253, 231, 232, 0.84);
  max-width: 46ch;
  margin: 0;
}

.mms-at-social__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 1rem 1.6rem;
  margin: 0.4rem 0 0;
}

/* Sur fond peint, le lien secondaire ne peut pas garder l'encre de la prose :
   il porte le rose de la marque, qui vaut 11,23:1 sur ce bleu. */
.mms-at-social__fb {
  color: var(--color-on-primary);
  text-decoration-color: currentColor;
}

@media (max-width: 900px) {
  .mms-at-social__contenu {
    grid-column: 1/-1;
  }
}
/* --------------------------------------------------------------------------
   3 ter. LE BLOC DE L'ACCUEIL -- LES DERNIERS TRAVAUX, EN BANDE
   Meme mecanique que la bande des avis : c'est `galerie.js` qui la pilote, on
   ne fait ici que la mettre en forme. Le SCSS doit donc tenir DANS LES DEUX
   ETATS -- avec le script (`est-pilotee`) et sans lui.
   -------------------------------------------------------------------------- */
.mms-acc-atelier {
  /* La bande deborde volontairement jusqu'au bord de l'ecran : `clip` et non
     `hidden`, qui creerait un conteneur de defilement sur la SECTION et
     volerait le geste a la piste. */
  overflow-x: clip;
  /* LE FOND DEPEND DU VOISINAGE, ET LE VOISINAGE N'EST PAS LE MEME SUR LES
     DEUX PAGES. C'est pourquoi il est porte par la VARIANTE et non ici.
     -----------------------------------------------------------------------
     Premiere ecriture : `surface` pour les deux. Releve de Jonathan --
     « De la matière à la réalisation » et « Ce qui sort des séances » se
     suivent et ont la meme couleur de fond. Exact, et je ne l'avais pas
     verifie avant de choisir.

     MESURE DES 14 SECTIONS DE L'ACCUEIL, DANS L'ORDRE : elles alternent
     rose (#FDE7E8), bleu petrole (#01334D) et blanc, et **jamais deux fonds
     identiques ne se suivent**. C'est une regle du site, pas une preference.
     Ma section arrivait en 9e position, juste apres la bande des oeuvres
     (rose) et avant le portrait de Caroline (blanc) : ni le rose ni le blanc
     n'etaient disponibles. Le bleu petrole est le seul des trois qui separe
     des deux cotes.

     UN FOND NE SE CHOISIT PAS DANS L'ABSOLU, IL SE CHOISIT ENTRE SES DEUX
     VOISINS -- exactement comme un ratio de contraste vit dans un couple. */
}

/* SUR L'ACCUEIL : BLEU PETROLE, entre la bande des oeuvres et le portrait.
   `pmb--scheme-dark` n'est PAS pose ici : cette section ne contient aucun bloc
   du socle, et les encres de ses cartes sont reprises une par une ci-dessous --
   les poser par le scheme et les surcharger ensuite ferait deux sources pour
   une meme couleur. */
.mms-acc-atelier--accueil {
  background: var(--color-secondary);
}

/* SOUS UN ARTICLE : le rose. Elle y suit le CTA terracotta et precede le PIED,
   qui est lui-meme en bleu petrole (`#01334D`, mesure) : la peindre en bleu la
   ferait fondre dans le pied, c'est-a-dire refaire ailleurs le defaut qu'on
   vient de corriger ici. */
.mms-acc-atelier--suite {
  background: var(--color-surface);
}

/* LES ENCRES DES CARTES SUR LE FOND SOMBRE, ET ELLES NE SE DEDUISENT PAS.
   `.mms-at-carte__titre` porte `--color-secondary` : sur un fond `secondary`,
   c'est **1:1**, du texte invisible. C'est le defaut exact que ce projet a deja
   paye deux fois -- une etiquette a 1:1, puis huit echecs AA en reprenant une
   couleur sans relever son fond. On ne transpose jamais une couleur sans son
   fond ; on la repose.
   Les etiquettes de technique, elles, n'ont RIEN a changer : ce sont des aplats
   opaques, et un aplat emporte son contraste partout. C'est precisement ce
   qu'on attendait d'elles. */
.mms-acc-atelier--accueil .mms-at-carte__titre,
.mms-acc-atelier--accueil .mms-at-carte__titre a {
  color: var(--color-on-primary);
}
.mms-acc-atelier--accueil {
  /* Le meme rose attenue que les autres sections peintes de l'accueil
     (`.mms-collab__propos p`), pour ne pas inventer une seconde valeur. */
}
.mms-acc-atelier--accueil .mms-at-carte__mot {
  color: rgba(253, 231, 232, 0.84);
}
.mms-acc-atelier--accueil .mms-at-carte__contenu {
  color: rgba(253, 231, 232, 0.72);
}
.mms-acc-atelier--accueil {
  /* Le fond qui tient la place d'une image en cours de chargement doit etre
     celui de LA SECTION, sinon un rectangle rose clignote sur le bleu. */
}
.mms-acc-atelier--accueil .mms-at-carte__media {
  background: color-mix(in srgb, var(--color-on-primary) 12%, transparent);
}
.mms-acc-atelier--accueil .mms-acc-atelier__propos p {
  color: rgba(253, 231, 232, 0.84);
}
.mms-acc-atelier--accueil {
  /* L'ETIQUETTE QUI PORTE LE FOND DE LA SECTION REDEVIENT UN OBJET.
     -------------------------------------------------------------------
     `tech-2` est un aplat bleu petrole -- le fond meme de cette section.
     Son TEXTE reste parfaitement lisible (11,64:1, mesure), donc aucune
     sonde de contraste ne signale quoi que ce soit : c'est l'APLAT qui
     disparait, et l'etiquette se lit alors comme un mot nu a cote de
     quatre etiquettes qui, elles, ont un cadre. Un defaut de FORME que la
     mesure ne peut pas voir, trouve sur la capture.

     Un filet plutot qu'une couleur de rechange : lui donner un autre aplat
     ici la ferait changer de couleur d'une page a l'autre, alors que toute
     la mecanique existe pour qu'une technique garde la sienne a vie.

     `box-shadow` ET NON `border` : `.mms-etiq` n'a AUCUNE bordure -- mesure,
     `border-top-width: 0px` -- donc en poser une l'aurait elargie de deux
     pixels et desalignee des quatre autres etiquettes. Une ombre interne
     dessine le meme filet sans toucher a la boite.
     Premiere ecriture : `border-color` seul. Il a bien colore une bordure
     large de zero : la couleur etait juste, et rien ne s'affichait. */
}
.mms-acc-atelier--accueil .mms-etiq.mms-tech-2 {
  box-shadow: inset 0 0 0 1px rgba(253, 231, 232, 0.5);
}

.mms-acc-atelier__entete {
  margin-bottom: clamp(1.6rem, 3vw, 2.6rem);
}

.mms-acc-atelier__propos {
  grid-column: 1/9;
}
.mms-acc-atelier__propos p {
  color: var(--text-prose);
  max-width: 52ch;
  margin: 1rem 0 0;
}

/* LA PISTE VA JUSQU'AU BORD DE L'ECRAN, et ce n'est pas cosmetique : une bande
   qui s'arrete a la gouttiere se lit comme une liste finie, alors qu'elle se
   parcourt. Le retrait negatif la sort de la grille, et le remplissage rend au
   PREMIER item l'alignement qu'il aurait eu dedans -- sans lui, la bande
   commencerait collee au bord et le premier travail serait a moitie coupe. */
.mms-acc-atelier__piste {
  list-style: none;
  margin: 0;
  padding: 0 var(--mms-marge) 1rem;
  display: flex;
  gap: clamp(1.2rem, 2.4vw, 2rem);
  overflow-x: auto;
  overflow-y: hidden;
  /* AUCUN `scroll-snap`, ET C'EST UNE DECISION (releve de Jonathan, 2026-08-12).
     Il y en avait un, en `proximity`, pour qu'on ne s'immobilise jamais entre
     deux travaux. A l'usage, il impose des PALIERS : la bande se recale toute
     seule au relachement, on ne s'arrete pas ou l'on veut, et le geste cesse
     d'appartenir a celui qui le fait. Un carrousel de photos n'est pas un
     diaporama a pas comptes.
     `scroll-padding-inline-start` part avec lui : il ne servait qu'a corriger
     l'ancrage du snap, et une declaration qui a perdu son seul lecteur ne
     reste pas. La premiere carte est desormais calee par le simple padding,
     le defilement demarrant a zero. */
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.mms-acc-atelier__piste::-webkit-scrollbar {
  display: none;
}
.mms-acc-atelier__piste {
  /* Le curseur dit que ca se prend. `galerie.js` pose `est-pilotee` : sans le
     script, aucune promesse de glisser a la souris n'est faite. */
}
.mms-acc-atelier__piste.est-pilotee {
  cursor: grab;
}
.mms-acc-atelier__piste.est-pilotee:active {
  cursor: grabbing;
}
.mms-acc-atelier__piste {
  /* CE QUI RENDAIT LE GESTE SACCADE, ET CE N'ETAIT PAS LE JAVASCRIPT.
     En glissant sur une carte, le navigateur SELECTIONNE le titre et le texte
     qu'elle contient : le curseur passe en barre de selection, un surlignage
     bleu s'etend derriere le doigt, et le geste sautille. `user-select` ne
     vaut QUE pendant la saisie -- hors glisser, le texte reste selectionnable,
     et un titre qu'on ne peut pas copier serait un recul.

     `-webkit-user-drag` double la garde de `dragstart` cote JS : sur les
     navigateurs WebKit, l'image d'une carte se decolle encore du curseur avant
     meme que l'evenement ne parte. */
}
.mms-acc-atelier__piste img, .mms-acc-atelier__piste a {
  -webkit-user-drag: none;
  user-drag: none;
}
.mms-acc-atelier__piste {
  /* PAS DE `pointer-events: none` SUR LES LIENS ICI, ET C'EST UNE CORRECTION.
     Il y etait, pour que la piste suive la souris plutot que la carte
     survolee. Mais `est-saisie` est posee des le `pointerdown` -- donc AVANT
     qu'on sache s'il s'agit d'un clic ou d'un glisser. Le navigateur cherche
     alors la cible du clic sous le curseur, ne trouve plus le lien, et
     l'envoie a la PISTE : mesure du 2026-08-12, `e.target` vaut
     `UL.mms-acc-atelier__piste` et le clic simple ne navigue jamais.
     Il etait de toute facon inutile : le drag natif est bloque par
     `dragstart`, et le clic qui suit un vrai glisser est annule au seuil de
     six pixels. Deux gardes suffisaient, la troisieme cassait la fonction. */
}
.mms-acc-atelier__piste.est-saisie {
  cursor: grabbing;
  user-select: none;
  -webkit-user-select: none;
}

.mms-acc-atelier__item {
  margin: 0;
  flex: 0 0 auto;
  /* Une largeur FIXE, sinon les cartes se compriment pour tenir dans l'ecran
     et la bande cesse de deborder -- donc de se parcourir. */
  width: clamp(220px, 26vw, 320px);
}

/* LE DECALAGE UN ITEM SUR DEUX, repris de la liste de `/atelier/`.
   Il fait le meme travail ici que la-bas : une rangee d'images alignees au
   cordeau se lit comme une vitrine, un decalage la rend au collage de ses
   affiches. Sur une bande horizontale il gagne meme en evidence, puisque tout
   est sur une seule ligne. */
.mms-acc-atelier__item:nth-child(even) {
  margin-block-start: clamp(1.4rem, 3vw, 2.8rem);
}

/* La bande n'est pas une grille : la carte doit remplir la largeur de son item. */
.mms-acc-atelier__item .mms-at-carte {
  width: 100%;
}

@media (max-width: 900px) {
  .mms-acc-atelier__propos {
    grid-column: 1/-1;
  }
}
/* --------------------------------------------------------------------------
   4. LA PAGE VIDE
   -------------------------------------------------------------------------- */
.mms-at-vide {
  grid-column: 1/-1;
  color: var(--text-prose);
  max-width: 54ch;
}
.mms-at-vide p {
  margin-block: 0 0.8em;
}
.mms-at-vide p:last-child {
  margin-bottom: 0;
}

/* --------------------------------------------------------------------------
   5. LE TELEPHONE
   Meme point de rupture que l'accueil et les Collab' (900px), ou `.mms-grille`
   passe a une colonne unique.
   -------------------------------------------------------------------------- */
/* DEUX COLONNES DES QUE TROIS PORTRAITS NE TIENNENT PLUS.
   A trois colonnes sous 1100px, chaque carte tombe autour de 300px de large,
   donc 400px de haut en 3:4 : le titre et le texte se serrent sous une image
   qui prend toute la place. Le palier est celui de la MATIERE, pas un cran
   arbitraire d'echelle. */
@media (max-width: 1100px) {
  .mms-at-liste__items {
    grid-template-columns: repeat(2, 1fr);
  }
  /* Le decalage suit le nouveau compte de colonnes : sur deux, c'est la
     SECONDE de chaque rangee qui descend. Laisser `3n + 2` ferait descendre
     une carte sur trois, donc tantot a droite tantot a gauche -- un desordre
     reel, celui-la, et non un geste. */
  .mms-at-item:nth-child(3n+2) {
    margin-block-start: 0;
  }
  .mms-at-item:nth-child(2n) {
    margin-block-start: clamp(1.6rem, 4vw, 3rem);
  }
}
@media (max-width: 900px) {
  .mms-at-tete__contenu {
    grid-column: 1/-1;
  }
}
/* UNE SEULE COLONNE, ET LE PIVOT COMME LE DECALAGE DISPARAISSENT. Pleine
   largeur, le pivot ferait deborder l'image de plusieurs pixels de chaque cote
   -- c'est le seul endroit ou il se lirait comme un defaut plutot que comme un
   geste -- et le decalage ne serait plus qu'un trou entre deux cartes. */
@media (max-width: 700px) {
  .mms-at-liste__items {
    grid-template-columns: 1fr;
  }
  .mms-at-item,
  .mms-at-item:nth-child(2n),
  .mms-at-item:nth-child(3n+2) {
    grid-column: 1/-1;
    margin-block-start: 0;
  }
  .mms-at-carte__media,
  .mms-at-item:nth-child(4n+2) .mms-at-carte__media,
  .mms-at-item:nth-child(4n+3) .mms-at-carte__media,
  .mms-at-item:nth-child(4n) .mms-at-carte__media {
    rotate: 0deg;
  }
}
/* ==========================================================================
   LE CURSEUR PINCEAU -- un ORNEMENT, pas une fonctionnalite.

   Sur le site d'un atelier d'arts plastiques, la souris tient un pinceau. Mais
   un curseur personnalise touche le seul objet que l'utilisateur controle
   vraiment, et il casse vite des choses qu'on ne pense pas a tester. D'ou les
   quatre garde-fous ci-dessous, tous deliberes.

   1. LE REPLI SYSTEME EST OBLIGATOIRE. `cursor: url(...)` sans valeur de repli
      est une declaration INVALIDE, ignoree en bloc. La liste se lit de gauche
      a droite : le navigateur prend la premiere ressource qu'il sait charger,
      et retombe sur le mot-clef final sinon.

   2. LE POINT CHAUD EST DECLARE (`3 3`), et il est MESURE, pas estime : le
      premier pixel opaque du pinceau tombe en (0,1) et celui du crayon en
      (0,0). Sans point chaud il vaudrait (0,0) par defaut -- ici ce serait
      presque juste, mais sur un dessin centre on cliquerait a 16px de ce qu'on
      vise sans comprendre pourquoi. Il DOIT tomber dans l'image, sinon toute
      la declaration est rejetee.
      **Il a suivi la taille** : `2 2` a 32px devient `3 3` a 48px, pour rester
      au meme endroit du dessin. Un point chaud qui ne suit pas
      l'agrandissement decale le clic sans que rien ne le signale.

   3. JAMAIS SUR LA SAISIE. Remplacer le curseur en I par un pinceau empeche de
      voir ou l'on ecrit. Champs, zones de texte et contenu editable gardent
      donc le curseur du systeme.

   4. RIEN SUR LE TACTILE. `hover: hover` et `pointer: fine` : sur un telephone
      il n'y a pas de curseur. Mesure en emulation iPhone : `cursor` vaut
      `auto`, rien n'est pose.

   LES DESSINS SONT CEUX DE JONATHAN (`proto/design-refs/maison-maria-stella/
   cursor-normal.svg` et `cursor-link.svg`), RETOURNES. Les sources ont la
   touffe de poils en BAS a gauche ; un curseur la veut en HAUT a gauche, la ou
   se trouve le point chaud. La transformation est un miroir par rapport a
   l'axe X -- `scale(1,-1) translate(0,-512)` -- et non un miroir horizontal,
   qui aurait mis la pointe en bas a droite.

   TAILLE : 48x48 depuis le 2026-08-09 (demande de Jonathan : « un peu plus
   grand sur PC »). Elle etait de 32x32.

   LA NOTE PRECEDENTE ETAIT TROP PRUDENTE, ET ELLE AURAIT BLOQUE CE CHANGEMENT :
   elle annoncait qu'« au-dela de 32, plusieurs navigateurs ignorent le curseur
   sans erreur ». La limite reelle des moteurs de rendu est de **128x128**, au-
   dela de quoi la declaration est rejetee. 48 est donc tres en dessous du seuil,
   et le repli `auto` couvre de toute facon le cas ou un navigateur refuserait.

   **Le SVG n'est pas redessine** : seul l'attribut d'affichage change, le
   `viewBox` reste en 512. Un dessin vectoriel grandit sans perdre un pixel --
   c'est precisement pourquoi le curseur est en SVG et non en PNG.

   Les images sont INLINE en data URI, comme le fait deja `_products.scss` du
   socle : les `url()` ne sont pas reecrites par le build et resteraient
   relatives a `dist/app.css`. Un chemin faux ne donne aucune erreur -- juste un
   curseur normal, et on croit que la regle n'a pas pris.

   Chaque dessin n'est ecrit QU'UNE FOIS, dans une variable : il sert a trois
   endroits, et un data URI recopie trois fois, c'est trois fois son poids dans
   le CSS et trois endroits a corriger.
   ========================================================================== */
:root {
  --mms-curseur: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2248%22 height=%2248%22 viewBox=%220 0 512 512%22%3E%3Cg transform=%22scale%281%2C-1%29 translate%280%2C-512%29%22%3E%3Cpath style=%22fill:%23FFAA7C%3B%22 d=%22M497.694%2C39.266L497.694%2C39.266c5.252%2C5.252%2C5.524%2C13.68%2C0.621%2C19.259L230.533%2C363.271 l-56.843-56.843L478.435%2C38.645C484.014%2C33.742%2C492.442%2C34.014%2C497.694%2C39.266z%22/%3E%3Crect x=%22146.489%22 y=%22328.464%22 transform=%22matrix%280.7071 0.7071 -0.7071 0.7071 302.3651 -29.4067%29%22 style=%22fill:%238ECAC1%3B%22 width=%2280.382%22 height=%2243.639%22/%3E%3Cpath style=%22fill:%23F7E6C5%3B%22 d=%22M142.832%2C337.285l56.843%2C56.843l-16.241%2C16.241c-9.866%2C9.866-25.863%2C9.866-35.73%2C0l-21.113-21.113 c-9.866-9.866-9.866-25.863%2C0-35.73L142.832%2C337.285z%22/%3E%3Cpath style=%22fill:%23FF7124%3B%22 d=%22M150.304%2C432.054c0-24.735-20.052-44.787-44.787-44.787s-41.456%2C20.278-44.787%2C44.787 c-5.028%2C36.994-50.53%2C44.787-50.53%2C44.787s80.104%2C0%2C95.317%2C0C130.252%2C476.841%2C150.304%2C456.789%2C150.304%2C432.054z%22/%3E%3Cg%3E %3Cpath style=%22fill:%234D3D36%3B%22 d=%22M119.379%2C346.313c-6.698%2C6.699-10.388%2C15.604-10.388%2C25.078c0%2C1.975%2C0.169%2C3.923%2C0.484%2C5.833  c-1.309-0.094-2.625-0.158-3.958-0.158c-28.029%2C0-50.603%2C22.046-54.894%2C53.613C46.679%2C459.69%2C8.83%2C466.724%2C8.477%2C466.787  c-5.221%2C0.895-8.89%2C5.638-8.44%2C10.918c0.448%2C5.279%2C4.865%2C9.336%2C10.163%2C9.336h95.317c30.32%2C0%2C54.987-24.668%2C54.987-54.987  c0-1.515-0.079-3.011-0.199-4.495c1.744%2C0.26%2C3.504%2C0.393%2C5.264%2C0.393c9.082%2C0%2C18.164-3.457%2C25.078-10.37l47.099-47.098l0.449-0.48  L505.977%2C65.257c8.428-9.591%2C7.958-24.176-1.07-33.204c0%2C0%2C0%2C0-0.001%2C0c-9.029-9.029-23.612-9.498-33.204-1.07L166.958%2C298.766  l-0.48%2C0.449L119.379%2C346.313z M105.516%2C466.642H53.474c8.449-7.873%2C15.379-18.629%2C17.362-33.214  c2.434-17.9%2C14.1-35.962%2C34.681-35.962c19.071%2C0%2C34.588%2C15.516%2C34.588%2C34.588C140.104%2C451.126%2C124.589%2C466.642%2C105.516%2C466.642z   M176.222%2C403.156c-2.846%2C2.846-6.629%2C4.413-10.652%2C4.413s-7.807-1.568-10.652-4.412l-21.112-21.113  c-2.846-2.846-4.413-6.629-4.413-10.652s1.568-7.808%2C4.413-10.652l9.028-9.029l42.418%2C42.418L176.222%2C403.156z M216.107%2C363.271  l-16.433%2C16.433l-42.418-42.418l16.433-16.434L216.107%2C363.271z M490.653%2C51.793L230.052%2C348.366l-41.457-41.457L485.166%2C46.307  c1.537-1.349%2C3.871-1.274%2C5.315%2C0.171C491.927%2C47.923%2C492.001%2C50.258%2C490.653%2C51.793z%22/%3E %3Cpath style=%22fill:%234D3D36%3B%22 d=%22M275.485%2C241.467l-39.787%2C34.961c-4.232%2C3.719-4.648%2C10.163-0.929%2C14.395  c2.016%2C2.295%2C4.834%2C3.467%2C7.666%2C3.467c2.391%2C0%2C4.792-0.835%2C6.729-2.538l39.787-34.961c4.232-3.719%2C4.648-10.163%2C0.929-14.395  C286.161%2C238.165%2C279.715%2C237.749%2C275.485%2C241.467z%22/%3E %3Cpath style=%22fill:%234D3D36%3B%22 d=%22M213.111%2C296.029l-2.593%2C2.279c-4.231%2C3.719-4.647%2C10.163-0.928%2C14.395  c2.016%2C2.295%2C4.834%2C3.467%2C7.666%2C3.467c2.391%2C0%2C4.792-0.835%2C6.73-2.538l2.593-2.279c4.231-3.719%2C4.647-10.163%2C0.928-14.395  C223.788%2C292.726%2C217.342%2C292.309%2C213.111%2C296.029z%22/%3E%3C/g%3E%3C/g%3E%3C/svg%3E") 3 3;
  --mms-curseur-actif: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2248%22 height=%2248%22 viewBox=%220 0 512 512%22%3E%3Cg transform=%22scale%281%2C-1%29 translate%280%2C-512%29%22%3E%3Crect x=%2225.979%22 y=%22221.506%22 transform=%22matrix%28-0.7071 0.7071 -0.7071 -0.7071 605.6572 285.8653%29%22 style=%22fill:%23FFAA7C%3B%22 width=%22435.29%22 height=%2293.724%22/%3E%3Crect x=%22391.737%22 y=%2253.61%22 transform=%22matrix%280.7071 -0.7071 0.7071 0.7071 49.4873 320.4182%29%22 style=%22fill:%23F2D59F%3B%22 width=%2239.572%22 height=%2293.724%22/%3E%3Cg%3E %3Cpath style=%22fill:%238ECAC1%3B%22 d=%22M488.102%2C90.17l-29.455%2C29.455l-66.274-66.273l29.455-29.455c18.3-18.3%2C47.972-18.3%2C66.273%2C0l0%2C0  C506.402%2C42.199%2C506.402%2C71.87%2C488.102%2C90.17z%22/%3E %3Cpolygon style=%22fill:%238ECAC1%3B%22 points=%2210.199%2C501.799 57.143%2C482.469 29.529%2C454.856  %22/%3E%3C/g%3E%3Cpolygon style=%22fill:%23F2D59F%3B%22 points=%2256.591%2C389.136 29.529%2C454.856 57.143%2C482.469 122.864%2C455.408 %22/%3E%3Cg%3E %3Cpath style=%22fill:%234D3D36%3B%22 d=%22M49.378%2C381.922c-0.961%2C0.962-1.709%2C2.095-2.217%2C3.328h-0.001L0.769%2C497.916  c-1.568%2C3.808-0.693%2C8.184%2C2.218%2C11.096c1.951%2C1.951%2C4.56%2C2.987%2C7.215%2C2.987c1.307%2C0%2C2.625-0.252%2C3.881-0.769l112.664-46.39  l0.001-0.001c1.233-0.508%2C2.367-1.257%2C3.328-2.217L495.314%2C97.384l0%2C0c22.248-22.249%2C22.248-58.449-0.001-80.698  c-22.249-22.248-58.449-22.247-80.697%2C0L49.378%2C381.922z M430.665%2C133.183l-51.848-51.848l13.556-13.557l51.848%2C51.848  L430.665%2C133.183z M122.865%2C440.984l-51.848-51.848L364.391%2C95.759l51.848%2C51.848L122.865%2C440.984z M59.548%2C470.449L41.55%2C452.452  l18.646-45.286l44.636%2C44.636L59.548%2C470.449z M33.135%2C472.888l5.976%2C5.976l-10.16%2C4.184L33.135%2C472.888z M480.888%2C82.959  L480.888%2C82.959l-22.242%2C22.242l-51.848-51.848l22.242-22.242c14.295-14.295%2C37.554-14.294%2C51.848%2C0  C495.183%2C45.405%2C495.183%2C68.664%2C480.888%2C82.959z%22/%3E %3Cpath style=%22fill:%234D3D36%3B%22 d=%22M274.956%2C261.013c-3.983-3.983-10.441-3.983-14.425%2C0l-4.59%2C4.59  c-3.983%2C3.983-3.983%2C10.441%2C0%2C14.426c1.992%2C1.992%2C4.602%2C2.987%2C7.212%2C2.987s5.221-0.996%2C7.212-2.987l4.59-4.59  C278.938%2C271.454%2C278.938%2C264.996%2C274.956%2C261.013z%22/%3E %3Cpath style=%22fill:%234D3D36%3B%22 d=%22M230.441%2C291.102L117.224%2C404.319c-3.983%2C3.983-3.983%2C10.441%2C0%2C14.425  c1.992%2C1.992%2C4.602%2C2.987%2C7.212%2C2.987s5.221-0.996%2C7.212-2.987l113.217-113.217c3.983-3.983%2C3.983-10.441%2C0-14.426  C240.883%2C287.119%2C234.424%2C287.119%2C230.441%2C291.102z%22/%3E%3C/g%3E%3C/g%3E%3C/svg%3E") 3 3;
}

@media (hover: hover) and (pointer: fine) {
  /* SUR LE CORPS, PAS SUR LES RACINES DE PAGE. Premiere version ciblee sur
     `.mms-accueil, .mms-page` : mesure faite, le bouton « Inscrire mon
     enfant » du header rendait `pointer`, parce que le chrome vit HORS de
     ces racines. Le curseur changeait donc de forme en passant sur la barre,
     ce qui est exactement l'inverse de l'effet recherche. */
  body {
    cursor: var(--mms-curseur), default;
    /* Les cliquables prennent le CRAYON : le dessin change, la fonction
       aussi. C'est le meme couple que `default` / `pointer` du systeme. */
  }
  body :is(a, button, summary, [role=button], label) {
    cursor: var(--mms-curseur-actif), pointer;
  }
  body {
    /* La saisie garde le curseur du systeme. Voir le garde-fou 3. */
  }
  body :is(input, textarea, select, [contenteditable=true]) {
    cursor: auto;
  }
  body :is(input[type=submit], input[type=button], input[type=checkbox], input[type=radio]) {
    cursor: var(--mms-curseur-actif), pointer;
  }
  body {
    /* La barre d'admin de WordPress appartient a l'outil, pas au site :
       elle garde ses curseurs, sinon on emporte l'ornement dans une
       interface qui n'est pas la sienne. */
  }
  body #wpadminbar, body #wpadminbar * {
    cursor: auto;
  }
  body #wpadminbar :is(a, button) {
    cursor: pointer;
  }
  body {
    /* Un element desactive ne doit pas promettre une action. */
  }
  body :is(a, button, input, select, textarea)[disabled],
  body [aria-disabled=true] {
    cursor: not-allowed;
  }
}

/*# sourceMappingURL=app.css.map*/