/* ==========================================================================
   Optivalue.ai — finitions
   --------------------------------------------------------------------------
   RÉÉCRIT le 27/07/2026, session « refonte du style global ».

   La version précédente portait vingt effets numérotés, annoncés en table des
   matières dans son propre en-tête. Le diagnostic signature-generative.md les
   a identifiés comme le marqueur le plus net du corpus (SG-01) : une liste
   d'effets appliquée à un site, plutôt que des choix nés du site.

   RETIRÉS — dix-sept effets :
     1  fond papier         → déplacé en token --ov-paper (conservé, tokenisé)
     2  grain feTurbulence  → retiré : texture générique, surimpression fixe
     3  filets teintés      → retiré : redéfinissait --ov-border hors charte
     4  ombres doubles      → retiré : le site est désormais sans ombre
     5  alternance 3n+2     → retiré : le rythme visuel était calculé sur la
                               position de la section, jamais sur son contenu
     6-7,9 titres allégés   → déplacé dans components.css, réservé aux titres
                               de plus de 44 px au lieu d'être imposé à tous
     8  chasse fixe         → devenu l'appareil de preuve (PP-1), assumé
     10 chiffres tabulaires → conservé et généralisé
     11 transitions de page → retiré : effet de série
     12 élément partagé     → retiré avec les transitions de page
     13 apparition au défil.→ retiré : 500 ms sur tout le contenu de la page
     14 compteurs animés    → retiré : animaient les chiffres non sourcés
     15 jauge animée        → animation retirée, la jauge reste
     17 barre compacte      → retiré : le verre dépoli n'était jamais visible
     18-19 filigranes       → retirés : le logo n'a pas à servir de motif

   CONSERVÉS — trois :
     16 soulignement de lien qui se trace, ramené à --ov-duration-base
     20 sélection, focus, défilement, impression
     et le fond papier, devenu token.

   Source de vérité : design-system/MASTER.md
   ========================================================================== */

/* --- Fond de page --------------------------------------------------------
   Seul rescapé du bloc « finitions ». Écart minime au blanc pur, désormais
   porté par un token et non par une valeur en dur. */
html { background: var(--ov-bg); }
main { background: var(--ov-bg); }

/* --- Titres --------------------------------------------------------------
   La version précédente forçait TOUS les h1 du site en graisse 300 avec
   !important. La graisse légère est conservée mais réservée aux très grands
   corps, où elle tient ; ailleurs elle affaiblissait la titraille. */
h1 { text-wrap: balance; letter-spacing: -.03em; }
h2, h3 { text-wrap: balance; }
h2 { letter-spacing: -.022em; }
p, li { text-wrap: pretty; }

/* --- Chiffres alignés ----------------------------------------------------
   Conservé et généralisé : tout chiffre du site est tabulaire. */
table td, table th, dl dd, .ov-figure, .ov-proof {
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
}

/* --- Soulignement de lien ------------------------------------------------
   Conservé. Le seul geste de la feuille précédente qui serve la lecture :
   il signale le lien sans le souligner en permanence. */
main a:not([style*="background:"]):not([style*="background-color"]):not(.ov-btn) {
  background-image: linear-gradient(currentColor, currentColor);
  background-size: 0% 1px;
  background-position: 0 100%;
  background-repeat: no-repeat;
  transition: background-size var(--ov-duration-base) var(--ov-ease);
  text-decoration: none;
}
main a:not([style*="background:"]):not([style*="background-color"]):not(.ov-btn):hover {
  background-size: 100% 1px;
}

/* --- Sélection, focus, défilement ---------------------------------------- */
::selection { background: var(--ov-selection-bg); color: var(--ov-selection-fg); }

:focus-visible {
  outline: 2px solid var(--ov-focus-ring);
  outline-offset: 3px;
  border-radius: var(--ov-radius-control);
}

* { scrollbar-width: thin; scrollbar-color: var(--ov-neutral-300) transparent; }
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-thumb {
  background: var(--ov-neutral-300);
  border-radius: var(--ov-radius-pill);
  border: 3px solid transparent;
  background-clip: content-box;
}
*::-webkit-scrollbar-track { background: transparent; }

/* --- Impression ----------------------------------------------------------- */
@media print {
  header, footer, .ov-noprint { display: none !important; }
  main { background: #fff !important; }
  a { background-image: none !important; }
  section { break-inside: avoid; }
}

/* --- Mouvement réduit -----------------------------------------------------
   Conservé et renforcé : s'applique désormais aussi aux pseudo-éléments. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

/* --- Jauge de score -------------------------------------------------------
   Le score sur 100 est un objet réel du produit : la jauge reste.
   Son décompte animé sur 1 100 ms ne l'était pas : il est retiré.
   La jauge s'affiche désormais à sa valeur, immédiatement. */
.ov-gauge {
  position: relative; display: inline-flex;
  align-items: center; justify-content: center;
  width: 76px; height: 76px; flex: 0 0 auto;
}
.ov-gauge svg { transform: rotate(-90deg); }
.ov-gauge circle { fill: none; stroke-width: 6; }
.ov-gauge .ov-g-bg { stroke: var(--ov-border); }
.ov-gauge .ov-g-fg {
  stroke: var(--ov-proof-mark); stroke-linecap: round;
  stroke-dasharray: 201; stroke-dashoffset: var(--ov-off, 60);
}
.ov-gauge b {
  position: absolute;
  font-family: var(--ov-font-proof);
  font-size: 19px; font-weight: var(--ov-proof-medium);
  font-variant-numeric: tabular-nums;
  color: var(--ov-text);
}
