/* ===========================================================================
   POLICES RAPATRIEES EN LOCAL — 30/07/2026 (conformite CNIL / RGPD)
   ---------------------------------------------------------------------------
   AVANT : 5 feuilles importaient les polices depuis fonts.googleapis.com.
   L'IP du visiteur partait donc chez Google AVANT tout consentement — c'est
   exactement le grief sanctionne par la CNIL et les tribunaux allemands.
   MAINTENANT : les .woff2 sont servis par bestforfait.com. Zero appel tiers.
   Sous-ensembles conserves : latin + latin-ext (site francophone).
   Licences : Inter et Space Grotesk sont sous SIL Open Font License 1.1 —
   l auto-hebergement est expressement autorise.
   =========================================================================== */

/* ===========================================================================
   POLICE DE REPLI AUX MEMES METRIQUES — 05/08/2026 (Core Web Vitals)
   ---------------------------------------------------------------------------
   LE PROBLEME MESURE. PageSpeed Insights du 05/08 sur l accueil :
   Cumulative Layout Shift = 0,685, pour un seuil « bon » de 0,1 — sept fois
   trop. Un seul element portait la totalite du score : <section id="texte">.

   LA CAUSE, MESUREE ET PAS DEDUITE. Les 20 @font-face de ce fichier sont en
   font-display:swap : le navigateur affiche d abord la police du systeme, puis
   bascule sur Inter quand elle arrive, et TOUT se recompose. Mesure faite dans
   le navigateur sur la page de production, en forcant la pile de repli :
     #texte  passait de y=2512 a y=2568  ->  56 px de deplacement
             et de h=6021 a h=6147       ->  126 px de hauteur en plus
   Sur une fenetre de 812 px de haut, un bloc de cette taille qui saute de
   56 px donne exactement l ordre de grandeur du 0,685 constate.
   ⚠ Ce n est PAS la banniere publicitaire, que le rapport designait aussi :
   verification faite, img.hea porte bien width=728 height=90 et le navigateur
   en calcule « aspect-ratio: auto 728 / 90 ». Sa place EST reservee.

   LE CORRECTIF. Une police de repli dont les metriques sont ajustees pour
   occuper la MEME place qu Inter. Quand la bascule arrive, rien ne bouge.
   Cout : zero octet telecharge — src:local() n utilise que des polices deja
   presentes sur la machine.

   ⚠⚠ D OU VIENT LE 105,46 %, ET UNE ERREUR DE METHODE PAYEE LE JOUR MEME.
   Premiere tentative : calibrer en comparant la HAUTEUR de #texte entre la
   police de repli et Inter. Sept valeurs essayees, l optimum semblait tomber a
   103,7 %. C ETAIT FAUX. La hauteur d un bloc melange DEUX effets qui ne se
   corrigent pas avec le meme reglage :
     - la largeur des glyphes, qui commande les RETOURS A LA LIGNE ;
     - les metriques verticales, qui commandent la hauteur des INTERLIGNES.
   Un size-adjust n agit que sur le premier. Le controle qui a revele l erreur :
   mesurer la largeur du MEME texte a 32 px au canvas, police par police —
        Inter                       1009,16 px
        Arial + size-adjust 103,7 %  ~983 px   (encore 2,7 % trop etroit)
        Arial nu                     956,95 px
   ➜ Le bon rapport est 1009,16 / 956,95 = 105,46 %. C est une MESURE, pas un
   ajustement empirique sur une grandeur composite.

   ⚠ LES DEUX SURCHARGES VERTICALES SONT MESUREES ELLES AUSSI, pas recopiees.
   Une police a deux dimensions et un size-adjust n en corrige qu une. La
   seconde se lit au canvas, via TextMetrics.fontBoundingBox*, a 1000 px pour
   la precision :
        Inter      ascendante 0,969   descendante 0,241
        Arial nu   ascendante 0,905   descendante 0,212
   Les surcharges s expriment dans l em DEJA mis a l echelle : on divise donc
   par le size-adjust — 0,969 / 1,0546 = 91,88 % et 0,241 / 1,0546 = 22,85 %.
   ➜ Sans elles, la largeur collait mais la hauteur des lignes non : les blocs
   au-dessus de #texte restaient plus courts et le poussaient de 23 px.

   RESULTAT MESURE EN LOCAL, LES TROIS METRIQUES SE SUPERPOSENT :
        largeur      1009,16 -> 1008,99   ecart -0,02 %  (etait -7,37 %)
        ascendante   0,969   -> 0,969     ecart  0 %
        descendante  0,241   -> 0,241     identique
   Il reste un ecart residuel sur la HAUTEUR TOTALE de #texte (~1,8 %) que
   AUCUN reglage global ne peut supprimer : deux polices differentes n ont pas
   les memes chasses lettre a lettre, seule la moyenne peut etre alignee. Le
   supprimer demanderait d embarquer une vraie police de repli, donc des octets.

   ⚠ LA VALIDATION FINALE NE PEUT PAS SE FAIRE EN LOCAL. Une page deja chargee
   ne rejoue pas la sequence que voit Lighthouse, et le controle ci-dessus force
   la police sur TOUS les elements, y compris ceux qui n utilisent pas Inter :
   il est donc PESSIMISTE. Le CLS reel se relit sur PageSpeed Insights APRES
   mise en ligne, sur l accueil, en mobile.
   ➜ REFERENCE A BATTRE : CLS 0,685 le 05/08/2026 a 05 h 04 (rapport
   pagespeed.web.dev/analysis/https-www-bestforfait-com/3u3rppsvxe). Seuil
   « bon » : 0,1. Tant que cette mesure n est pas refaite, ce correctif est une
   hypothese argumentee, pas un resultat.

   ⚠ AJOUTER CETTE FAMILLE A UNE PILE NE SUFFIT PAS SI ON OUBLIE UN FICHIER.
   Les piles du FRONT sont dans css/theme-moderne.css (l.69 et l.745) et
   css/tarteaucitron-theme.css. Le back-office n est pas concerne : il n est
   pas indexe. (ai/ia-theme.css et box/box-theme.css CITENT ces piles dans un
   commentaire, ils ne les redeclarent pas.)
   ⚠ src:local('Arial') se resout differemment selon le systeme : Arial sur
   Windows, Liberation Sans sous Linux (metriques identiques a Arial, c est ce
   que mesure Lighthouse), Roboto sur Android. Les metriques de Roboto sont
   proches sans etre identiques : le gain reel sur un telephone sera grand,
   mais pas parfait. On ne peut pas faire mieux sans embarquer une police.
   =========================================================================== */
@font-face {
  font-family: 'Inter repli';
  src: local('Arial'), local('Helvetica'), local('Roboto');
  size-adjust: 105.46%;      /* largeur des glyphes : 1009,16 / 956,95 */
  ascent-override: 91.88%;   /* 0,969 / 1,0546  (ascendante mesuree d Inter)  */
  descent-override: 22.85%;  /* 0,241 / 1,0546  (descendante mesuree d Inter) */
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('Inter-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: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('Inter-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;
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('Inter-500-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: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('Inter-500-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;
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('Inter-600-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: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('Inter-600-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;
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('Inter-700-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: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('Inter-700-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;
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url('Inter-800-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: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url('Inter-800-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;
}

@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('SpaceGrotesk-300-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: 'Space Grotesk';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('SpaceGrotesk-300-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;
}

@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('SpaceGrotesk-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: 'Space Grotesk';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('SpaceGrotesk-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;
}

@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('SpaceGrotesk-500-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: 'Space Grotesk';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('SpaceGrotesk-500-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;
}

@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('SpaceGrotesk-600-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: 'Space Grotesk';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('SpaceGrotesk-600-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;
}

@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('SpaceGrotesk-700-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: 'Space Grotesk';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('SpaceGrotesk-700-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;
}

