/* ==========================================================================
   FEUILLE DE STYLE UNIQUE — fosse.fr
   ==========================================================================

   OBJECTIF DE CE FICHIER
   -----------------------
   Une seule feuille de style, volontairement figée, à ne plus retoucher.
   Elle sert deux usages avec le même code HTML5 :
     1. Lecture à l'écran (mobile-first, clair/sombre automatique)
     2. Génération de PDF via "Imprimer" du navigateur (remplace LaTeX)

   RÈGLES QUE CE FICHIER RESPECTE STRICTEMENT
   -------------------------------------------
   - Zéro classe CSS (aucun sélecteur ".xxx" nulle part). Tout le style
     s'accroche aux balises HTML5 standard elles-mêmes (h1, p, aside, nav...).
     Conséquence pratique : le HTML reste écrit "à la main", sans jamais se
     demander quelle classe ajouter — juste choisir la bonne balise sémantique.
   - Aucune police externe chargée (pas de Google Fonts, pas de @font-face).
     Uniquement des piles de polices système déjà installées sur l'appareil
     du lecteur. Raison : zéro requête réseau supplémentaire = site plus
     rapide, et zéro fuite de vie privée vers un CDN de polices tiers.
   - Le CSS n'a AUCUN effet sur la lisibilité du contenu par les IA/crawlers
     (LLMs, moteurs GEO) : ces derniers lisent le HTML sémantique, pas le
     rendu visuel. Ce fichier n'existe donc que pour les lecteurs humains
     (écran + papier). Le référencement IA se travaille ailleurs (structure
     HTML, Schema.org, maillage interne, llms.txt — voir skill seo-geo).

   STRUCTURE DU FICHIER (16 sections numérotées)
   -----------------------------------------------
   1. Jetons de couleur et de typographie (custom properties)
   2. Réinitialisation minimale
   3. Corps de page (layout mobile-first)
   4. Titres
   5. Texte courant (paragraphes, listes inline, petits éléments)
   6. Liens
   7. Listes (ul/ol/dl)
   8. Citations et sources
   9. Code
   10. Tableaux
   11. Figures et médias
   12. En-tête / navigation / pied de page / encadrés (aside)
   13. Détails-résumé (contenu repliable natif HTML5)
   14. Formulaires
   15. Accessibilité
   16. Impression / génération de PDF
   ========================================================================== */


/* ============================================================================
   1. JETONS (CUSTOM PROPERTIES)
   ============================================================================
   Toutes les couleurs et polices du fichier passent par ces variables.
   Pour changer une teinte ou une police plus tard : modifier UNIQUEMENT ici,
   jamais dans les règles plus bas (qui ne font que consommer var(--xxx)).
   ============================================================================ */
:root {
  /* color-scheme indique au navigateur que la page gère elle-même le clair
     ET le sombre. C'est ce qui active light-dark() ci-dessous, et ce qui
     permet aussi au navigateur de styler nativement en sombre les éléments
     qu'on ne stylise pas nous-mêmes (scrollbars, champs de formulaire, etc.) */
  color-scheme: light;

  /* ---- Couleurs -----------------------------------------------------------
     light-dark(valeur-claire, valeur-sombre) est une fonction CSS standard
     (CSS Color Module Level 5) : le navigateur choisit automatiquement la
     bonne valeur selon le thème clair/sombre choisi par le système
     d'exploitation du lecteur (prefers-color-scheme), SANS qu'on ait besoin
     d'écrire une media query @media (prefers-color-scheme: dark) séparée
     qui dupliquerait toutes les couleurs. Un seul endroit à maintenir.
     Support navigateur : large courant 2026 (Chrome, Edge, Firefox, Safari). */
  --fond:        light-dark(#fdfdfb, #16181c); /* blanc cassé / noir chaud, jamais de pur #fff ou #000 (moins agressif pour l'œil) */
  --texte:       light-dark(#1a1a1a, #e8e6e1); /* texte principal, contraste élevé mais pas absolu */
  --texte-att:   light-dark(#4a4a46, #a8a6a0); /* texte atténué : légendes, dates, méta-informations */
  --accent:      light-dark(#1f4b99, #7fb0ff); /* couleur de lien et d'accent — bleu encre, volontairement PAS le orange/terracotta
                                                    (#D97757) devenu un "tic" visuel reconnaissable des interfaces générées
                                                    par IA ; un bleu sobre reste neutre et intemporel */
  --accent-att:  light-dark(#dce6f5, #1c2b42); /* fond très clair/très sombre pour surlignage (mark) et citations */
  --bordure:     light-dark(#d8d5cd, #33363c); /* traits de séparation (hr, header, footer, tableaux) */
  --code-fond:   light-dark(#f1efe9, #1e2126); /* fond des blocs de code et encadrés aside */

  /* ---- Typographie ----------------------------------------------------------
     Trois rôles distincts, chacun avec sa propre pile de polices "système"
     (déjà présentes sur l'OS du lecteur, donc AUCUN téléchargement) :
       - police-corps : serif, pour le confort de lecture longue (articles,
         livres). Un serif classique (Georgia) reste très lisible à l'écran
         et donne un rendu "éditorial" proche d'un livre imprimé.
       - police-titre : sans-serif système, pour créer un contraste visuel
         net avec le corps du texte (convention éditoriale : titres en
         sans-serif, corps en serif, ou l'inverse — ici ce choix).
       - police-code : monospace système, pour le code et les données. */
  --police-corps: Georgia, "Times New Roman", "Liberation Serif", serif;
  --police-titre: -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --police-code:  ui-monospace, "SF Mono", Consolas, "Liberation Mono", monospace;

  /* Largeur de colonne optimale pour la lecture longue : la typographie
     recommande ~60-75 caractères par ligne (au-delà, l'œil "perd le fil"
     en revenant à la ligne). 68ch calibre cette largeur sur la largeur
     moyenne d'un caractère de LA POLICE ACTIVE — contrairement à une
     largeur fixe en px, elle s'adapte automatiquement si tu changes un
     jour la police du corps. Appliquée directement sur <body> (voir
     section 3) : pas besoin d'un <div class="container"> supplémentaire,
     cohérent avec la règle "zéro classe". */
  --largeur-texte: 68ch;

  font-size: 100%; /* respecte la taille de police par défaut réglée par le lecteur dans son navigateur/OS (accessibilité) */
}


/* ============================================================================
   2. RÉINITIALISATION MINIMALE
   ============================================================================
   Le strict nécessaire pour repartir d'une base prévisible, sans normaliser
   à outrance (on garde volontairement les comportements HTML5 par défaut
   qui sont déjà sains : listes à puces, tableaux avec bordures implicites
   annulées section par section, etc.)
   ============================================================================ */
*,
*::before,
*::after {
  /* box-sizing: border-box = les paddings/bordures ne s'ajoutent plus à la
     largeur déclarée d'un élément. Évite les débordements imprévus, en
     particulier utile en mobile-first où chaque pixel de largeur compte. */
  box-sizing: border-box;
}

* {
  margin: 0; /* chaque navigateur a ses propres marges par défaut (h1, p, ul...) ; on repart à zéro et on les redéfinit nous-mêmes plus bas, section par section */
}

html {
  -webkit-text-size-adjust: 100%; /* empêche Safari iOS de zoomer arbitrairement le texte lors d'un changement d'orientation d'écran */
}

img,
svg,
video,
canvas {
  /* Médias systématiquement responsives : jamais plus larges que leur
     conteneur, ratio conservé automatiquement (height: auto). display:
     block supprime l'espace fantôme sous les images (comportement inline
     par défaut d'HTML, hérité de l'époque où une image était traitée
     comme un caractère de texte). */
  display: block;
  max-width: 100%;
  height: auto;
}


/* ============================================================================
   3. CORPS DE PAGE — MISE EN PAGE MOBILE-FIRST
   ============================================================================
   Philosophie mobile-first : les règles de base (hors media query) ciblent
   le mobile. La media query plus bas AJOUTE du confort pour les écrans
   plus larges, elle ne "corrige" jamais un défaut du mobile — c'est
   l'inverse d'une approche desktop-first où on partirait d'un design large
   qu'on rétrécirait ensuite avec des media queries correctives.
   ============================================================================ */
body {
  background: var(--fond);
  color: var(--texte);
  font-family: var(--police-corps);
  font-size: 1.0625rem; /* 17px : légèrement au-dessus du 16px "défaut navigateur", pour une lecture longue plus confortable */
  line-height: 1.65;    /* interligne généreux : essentiel en lecture longue, encore plus sur petit écran où les lignes sont courtes */

  /* max-width + margin-inline: auto = la colonne de texte est centrée et
     ne dépasse jamais --largeur-texte (68ch), même sur un grand écran.
     C'est ce qui remplace un <div class="container"> : la contrainte de
     largeur est portée par la balise <body> elle-même. */
  max-width: var(--largeur-texte);
  margin-inline: auto;

  padding: 1.25rem 1rem 3rem; /* marges resserrées par défaut = optimisées pour le mobile (peu d'espace à gaspiller) */
}

@media (min-width: 60ch) {
  /* Seule media query de "confort" du fichier : sur un écran assez large
     pour dépasser la largeur de colonne, on peut se permettre plus d'air
     en haut et en bas de page sans nuire à la lecture mobile. */
  body {
    padding-top: 2.5rem;
    padding-bottom: 4rem;
  }
}


/* ============================================================================
   4. TITRES — ÉCHELLE FLUIDE, POLICE DISTINCTE DU CORPS
   ============================================================================ */
h1, h2, h3, h4, h5, h6 {
  font-family: var(--police-titre); /* contraste volontaire avec le corps en serif (voir section 1) */
  font-weight: 700;
  line-height: 1.25; /* interligne plus serré que le corps : un titre se lit "d'un bloc", pas ligne à ligne */
  color: var(--texte);
  margin-top: 2em;    /* espace généreux AVANT un titre : sépare clairement les sections du texte qui précède */
  margin-bottom: 0.6em;
}

/* clamp(min, préféré, max) = taille fluide qui s'adapte en continu à la
   largeur de l'écran, SANS media query supplémentaire : sur mobile étroit
   on obtient la valeur min, sur écran large la valeur max, et une
   interpolation basée sur le viewport (vw) entre les deux. C'est la
   version moderne du "responsive typography" qui, avant clamp(), demandait
   plusieurs media queries avec des tailles fixes différentes. */
h1 { font-size: clamp(1.75rem, 5vw, 2.4rem); margin-top: 0; } /* pas de marge au-dessus du tout premier titre de la page */
h2 { font-size: clamp(1.4rem, 4vw, 1.8rem); }
h3 { font-size: clamp(1.15rem, 3vw, 1.4rem); }
h4 { font-size: 1.1rem; }
h5, h6 {
  /* h5/h6 sont rares en usage réel (au-delà de 4 niveaux de hiérarchie, un
     article a probablement besoin d'être redécoupé) : traités ici comme
     de simples "petits titres" en majuscules espacées plutôt que comme un
     niveau hiérarchique visuellement distinct supplémentaire. */
  font-size: 1rem;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--texte-att);
}


/* ============================================================================
   5. TEXTE COURANT
   ============================================================================ */
p, ul, ol, dl, figure, table, pre, blockquote {
  margin-bottom: 1.3em; /* espacement vertical uniforme entre tous les blocs de contenu, quel que soit leur type */
}

p {
  /* text-wrap: pretty (standard CSS récent, Chromium/Safari) demande au
     navigateur d'éviter les "orphelines" : une ligne isolée et trop courte
     en fin de paragraphe. Le navigateur ajuste les retours à la ligne du
     dernier bloc de texte pour un résultat visuellement plus équilibré.
     Sans effet néfaste si le navigateur du lecteur ne le supporte pas
     encore (dégradation silencieuse vers le retour à la ligne standard). */
  text-wrap: pretty;
}

strong { font-weight: 700; }
em { font-style: italic; }

small {
  font-size: 0.85em;
  color: var(--texte-att);
}

mark {
  /* Surlignage : on garde la couleur de texte d'origine (color: inherit)
     plutôt que d'imposer une couleur de texte fixe, pour que <mark> reste
     lisible qu'il surligne du texte normal, un lien, ou du texte atténué. */
  background: var(--accent-att);
  color: inherit;
  padding: 0.05em 0.2em;
}

abbr[title] {
  /* Le sélecteur d'attribut [title] cible uniquement les <abbr> qui ONT
     effectivement un attribut title (l'explicitation de l'acronyme) —
     inutile de styliser un <abbr> qui n'aurait pas ce texte d'infobulle. */
  text-decoration: dotted underline;
  cursor: help;
}

sup, sub {
  font-size: 0.75em;
  line-height: 0; /* évite qu'un exposant/indice n'agrandisse l'interligne de toute la ligne qui le contient */
}

hr {
  border: none;
  border-top: 1px solid var(--bordure);
  margin: 2.5em 0; /* séparateur de section franc, avec un espace vertical généreux de part et d'autre */
}


/* ============================================================================
   6. LIENS
   ============================================================================ */
a {
  color: var(--accent);
  text-decoration-thickness: 1px;   /* trait de soulignement fin par défaut, discret mais présent (accessibilité : ne jamais retirer le soulignement d'un lien dans du texte courant) */
  text-underline-offset: 0.15em;    /* léger espace entre le texte et son soulignement, plus lisible qu'un trait collé aux jambages des lettres (g, j, p...) */
}

a:hover {
  text-decoration-thickness: 2px; /* renforcement visuel simple au survol, sans changement de couleur ni animation */
}

a:visited {
  opacity: 0.85; /* distinction discrète des liens déjà visités, utile sur un site à fort maillage interne (articles liés entre eux) */
}


/* ============================================================================
   7. LISTES (ul / ol / dl)
   ============================================================================ */
ul, ol {
  padding-left: 1.4em; /* indentation suffisante pour que les puces/numéros ne "collent" pas au bord de la colonne de texte */
}

li {
  margin-bottom: 0.4em; /* espacement discret entre items, pour ne pas donner une impression de bloc compact difficile à scanner visuellement */
}

dt {
  font-weight: 700; /* terme défini, mis en évidence */
}

dd {
  margin-bottom: 0.8em;
  color: var(--texte-att); /* la définition elle-même en texte atténué, pour bien distinguer visuellement terme (dt) et définition (dd) */
}


/* ============================================================================
   8. CITATIONS ET SOURCES — usage fréquent dans un contenu éditorial
      (extraits de sources dans les articles, citations dans EPOCH/Mouchards)
   ============================================================================ */
blockquote {
  border-left: 3px solid var(--accent);
  padding-left: 1.1em;
  color: var(--texte-att); /* citation visuellement "en retrait" par rapport au texte principal de l'auteur */
  font-style: italic;
}

blockquote p:last-child {
  margin-bottom: 0.4em; /* réduit l'espace superflu en bas d'une citation multi-paragraphes */
}

cite {
  font-style: normal; /* HTML applique l'italique par défaut à <cite> ; on l'annule car blockquote est déjà en italique globalement — évite un double italique peu lisible */
  font-size: 0.9em;
  color: var(--texte-att);
}

q::before { content: "« "; }
q::after  { content: " »"; }
/* Les guillemets français (chevrons) sont injectés automatiquement par
   défaut via ::before/::after sur <q> — pas besoin de les taper à la main
   dans chaque citation courte du texte, cohérence typographique garantie
   sur tout le site en une seule fois. */


/* ============================================================================
   9. CODE
   ============================================================================ */
code, kbd, samp {
  font-family: var(--police-code);
  font-size: 0.9em; /* une police monospace paraît visuellement plus grande qu'une proportionnelle à taille égale ; on la réduit légèrement pour équilibrer */
  background: var(--code-fond);
  padding: 0.15em 0.4em;
  border-radius: 3px;
}

pre {
  background: var(--code-fond);
  padding: 1em;
  overflow-x: auto; /* un bloc de code trop large défile horizontalement plutôt que de casser la mise en page mobile (pas de retour à la ligne forcé qui casserait l'indentation du code) */
  border-radius: 4px;
  line-height: 1.5;
}

pre code {
  /* Évite un double fond/double padding quand un <code> se trouve à
     l'intérieur d'un <pre> (cas standard HTML5 : <pre><code>...</code></pre>) */
  background: none;
  padding: 0;
}


/* ============================================================================
   10. TABLEAUX
   ============================================================================ */
table {
  /* display: block (plutôt que le display: table implicite d'un <table>)
     transforme le tableau en un conteneur qui peut défiler horizontalement
     tout seul via overflow-x, SANS faire déborder le reste de la page ni
     nécessiter de <div> supplémentaire autour du tableau. Les éléments
     internes (thead/tbody/tr/td) conservent leur rendu tabulaire normal :
     seul le conteneur englobant change de comportement.
     Nécessaire dès qu'un tableau a beaucoup de colonnes ou du contenu
     large (ex. tableau à 9 colonnes) : sans cette règle, un tel tableau
     déborde silencieusement de la colonne de texte --largeur-texte sur
     mobile, cassant la mise en page plutôt que de proposer un défilement
     dédié et contenu. */
  display: block;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch; /* défilement tactile fluide sur iOS, plutôt que saccadé */
  max-width: 100%;

  width: 100%;
  border-collapse: collapse; /* fusionne les bordures adjacentes de cellules plutôt que de doubler chaque trait */
  font-size: 0.95em;
}

th, td {
  text-align: left; /* le centrage par défaut des <th> dans les navigateurs ne convient pas à un tableau de données/texte éditorial */
  padding: 0.5em 0.7em;
  border-bottom: 1px solid var(--bordure); /* lignes horizontales seulement (style "tableau épuré"), pas de quadrillage complet */
}

th {
  font-family: var(--police-titre);
  font-weight: 700;
}

caption {
  text-align: left;
  color: var(--texte-att);
  font-size: 0.85em;
  margin-bottom: 0.5em;
}


/* ============================================================================
   11. FIGURES ET MÉDIAS
   ============================================================================ */
figure {
  margin-inline: 0; /* HTML applique par défaut une marge horizontale à <figure> (héritage historique) ; on l'annule pour qu'elle s'aligne avec le reste du texte */
}

figcaption {
  font-size: 0.85em;
  color: var(--texte-att);
  margin-top: 0.5em;
  font-style: italic;
}


/* ============================================================================
   12. EN-TÊTE, NAVIGATION, PIED DE PAGE, ENCADRÉS
       Structure du site portée uniquement par les balises sémantiques HTML5
       (header/nav/footer/aside) — jamais par des classes.
   ============================================================================ */
header {
  border-bottom: 1px solid var(--bordure);
  padding-bottom: 1em;
  margin-bottom: 2em;
}

nav ul {
  list-style: none; /* le menu de navigation n'a pas besoin visuellement d'être une liste à puces */
  padding-left: 0;
  display: flex;     /* liens de navigation en ligne plutôt qu'empilés verticalement */
  flex-wrap: wrap;    /* passe à la ligne proprement sur petit écran mobile si tous les liens ne tiennent pas sur une seule ligne */
  gap: 0.3em 1.2em;   /* espace horizontal entre liens, espace vertical si retour à la ligne */
}

nav a {
  text-decoration: none; /* dans un menu, le contexte (position, structure de liste) suffit à signaler que ce sont des liens ; le soulignement systématique alourdirait visuellement la navigation */
}

nav a:hover {
  text-decoration: underline; /* le soulignement réapparaît au survol, comme confirmation interactive */
}

footer {
  border-top: 1px solid var(--bordure);
  margin-top: 3em;
  padding-top: 1.5em;
  font-size: 0.9em;
  color: var(--texte-att);
}

/* <aside> sert ici pour les encadrés éditoriaux du template GEO : "En bref"
   en tête d'article, "Faits clés" structuré en liste, "Sur le même sujet"
   en fin d'article (voir skill seo-geo). Un seul style suffit pour ces
   trois usages, la balise HTML5 <aside> elle-même porte le sens. */
aside {
  background: var(--code-fond);
  border-left: 3px solid var(--accent);
  padding: 1em 1.2em;
  margin-bottom: 1.5em;
  font-size: 0.95em;
}

aside h3 {
  margin-top: 0; /* annule la marge généreuse habituelle des titres (section 4) : à l'intérieur d'un encadré compact, ce serait disproportionné */
  font-size: 1rem;
}


/* ============================================================================
   13. DÉTAILS / RÉSUMÉ — contenu repliable natif HTML5, sans JavaScript
   ============================================================================ */
details {
  border: 1px solid var(--bordure);
  border-radius: 4px;
  padding: 0.7em 1em;
  margin-bottom: 1.3em;
}

summary {
  cursor: pointer; /* indique visuellement que l'élément est cliquable (le navigateur le fait déjà nativement, on le renforce) */
  font-family: var(--police-titre);
  font-weight: 700;
}

details[open] summary {
  margin-bottom: 0.6em; /* espace ajouté sous le résumé UNIQUEMENT quand le détail est ouvert (sélecteur d'attribut [open]), pour séparer visuellement le titre du contenu déplié */
}


/* ============================================================================
   14. FORMULAIRES — minimal, pleine largeur mobile-first
   ============================================================================ */
/* :not([type="..."]) exclut volontairement les usages d'<input> qui ne
   sont PAS des champs de saisie de texte : type="image" (bouton-image, ex.
   les boutons de don PayPal), type="hidden" (invisible par définition),
   type="checkbox"/"radio" (cases à cocher, pas des rectangles de saisie),
   type="submit"/"button" (déjà couverts par la règle button ci-dessous).
   Sans cette exclusion, un simple <input type="image"> hérite du
   width:100% / bordure / padding pensés pour un champ de texte, et se
   retrouve étiré et encadré de façon disproportionnée — un bouton PayPal
   fourni tel quel par un tiers en est l'exemple concret. */
input:not([type="image"]):not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]),
textarea,
select {
  font: inherit;       /* les champs de formulaire n'héritent PAS de la police de la page par défaut dans les navigateurs (comportement historique) ; on force l'héritage explicitement */
  color: inherit;
  background: var(--fond);
  border: 1px solid var(--bordure);
  border-radius: 3px;
  padding: 0.5em 0.7em;
  width: 100%; /* pleine largeur par défaut = optimisé mobile ; sur desktop un champ de formulaire pleine largeur reste parfaitement utilisable */
}

/* input[type="image"] : un bouton-image doit garder sa taille et son
   apparence natives, fournies par l'image elle-même (ex. bouton PayPal
   officiel). On annule explicitement tout ce que la cascade pourrait lui
   appliquer par ailleurs. */
input[type="image"] {
  width: auto;
  border: none;
  padding: 0;
  background: none;
}

button {
  width: auto; /* un bouton, contrairement à un champ de saisie, n'a pas besoin d'occuper toute la largeur : sa taille doit rester proportionnée à son texte */
  background: var(--accent);
  color: var(--fond); /* inversion volontaire : texte clair sur fond accent (ou l'inverse en mode sombre, géré automatiquement par light-dark()) */
  border: none;
  cursor: pointer;
  padding: 0.6em 1.2em;
}

button:hover {
  opacity: 0.9; /* retour visuel discret au survol, sans changement de couleur ni animation (cohérent avec prefers-reduced-motion, section 15) */
}

label {
  display: block; /* un label au-dessus de son champ (plutôt qu'à côté) est plus lisible sur mobile où la largeur est contrainte */
  margin-bottom: 0.3em;
  font-family: var(--police-titre);
  font-size: 0.9em;
}


/* ============================================================================
   15. ACCESSIBILITÉ
   ============================================================================ */
:focus-visible {
  /* :focus-visible (plutôt que :focus tout court) n'affiche l'anneau de
     focus QUE lors d'une navigation au clavier (Tab), pas lors d'un simple
     clic à la souris — évite l'effet visuel "moche" au clic tout en
     préservant un repère de navigation clavier indispensable. */
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

::selection {
  background: var(--accent-att); /* couleur de sélection de texte (surlignage au clic-glisser) cohérente avec le reste de la palette, plutôt que le bleu par défaut du navigateur */
}

@media (prefers-reduced-motion: reduce) {
  /* Respecte le réglage système "réduire les animations" (accessibilité
     pour les lecteurs sensibles au mouvement, ex. troubles vestibulaires).
     Ce fichier n'a par ailleurs quasiment aucune animation ; cette règle
     est une garantie pour le futur si tu en ajoutes un jour. */
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}


/* ============================================================================
   16. IMPRESSION / GÉNÉRATION DE PDF
   ============================================================================
   Objectif : qu'un lecteur puisse faire "Fichier > Imprimer > Enregistrer en
   PDF" depuis son navigateur, sur n'importe quelle page HTML du site, et
   obtenir une pagination propre — sans avoir besoin d'une version LaTeX
   séparée à maintenir en parallèle du HTML.

   Deux mécanismes CSS distincts sont utilisés ici, à ne pas confondre :
     - @page et ses @marges (@bottom-center...) : contrôlent la page
       physique elle-même (format, marges, numérotation) — spécification
       CSS Paged Media Module Level 3.
     - @media print : contrôle le contenu HTML affiché à l'impression,
       comme n'importe quelle autre media query (@media screen, etc.)

   SUPPORT NAVIGATEUR (vérifié mi-2026) :
     - Chrome, Edge, Brave, Opera (moteur Blink commun) : support complet,
       y compris la numérotation de page dans les marges (@bottom-center).
     - Safari 18.2+ (déc. 2024) : support complet également.
     - Firefox : ne supporte PAS encore les marges de page @bottom-center /
       counter(page) (fonctionnalité suivie sous le ticket Mozilla
       Bug 1854974, toujours pas livrée à cette date). Le reste — format de
       page, marges principales, sauts de page, veuves/orphelines — reste
       cependant identique sur Firefox : un lecteur Firefox obtient un PDF
       propre, simplement SANS numéro de page. Dégradation silencieuse,
       rien n'est cassé ni moche.
   ============================================================================ */

/* --- Format et marges de la page physique --- */
@page {
  size: A4;
  margin: 2.2cm 2cm 2.4cm; /* marges classiques d'un document imprimé, proches de celles d'un PDF LaTeX par défaut */
}

@page :first {
  /* La toute première page (généralement le titre de l'article) mérite une
     marge supérieure un peu plus généreuse, comme une page de garde. */
  margin-top: 3cm;
}

@page {
  /* @bottom-center place du contenu généré par CSS dans la marge basse,
     centrée, de CHAQUE page imprimée — mécanisme "margin box" du Paged
     Media Module Level 3. counter(page) et counter(pages) sont deux
     compteurs automatiques fournis nativement par le moteur de pagination
     du navigateur (aucun JavaScript, aucune valeur à renseigner à la main). */
  @bottom-center {
    content: counter(page) " / " counter(pages); /* ex. "3 / 12" */
    font-family: Georgia, serif;
    font-size: 9pt;
    color: #555;
  }
}

@media print {
  body {
    /* À l'impression, la contrainte de largeur --largeur-texte (68ch,
       pensée pour l'écran) n'a plus lieu d'être : la largeur est désormais
       dictée par le format de page @page ci-dessus. */
    max-width: none;
    width: 100%;

    /* Taille de police en "pt" (unité typographique du papier) plutôt
       qu'en rem/px (unités écran) — 11pt est une taille de corps de texte
       standard en édition imprimée, proche des réglages par défaut LaTeX. */
    font-family: Georgia, "Times New Roman", serif;
    font-size: 11pt;
    line-height: 1.5;

    /* Sur papier, on n'utilise jamais light-dark() : on force du noir sur
       blanc pur, quel que soit le thème choisi à l'écran par le lecteur.
       Un PDF en mode sombre serait à la fois illisible imprimé et
       gaspillerait l'encre d'une imprimante à jet d'encre/laser couleur. */
    color: #000;
    background: #fff;
    padding: 0;
  }

  /* Éléments d'interface web qui n'ont aucun sens sur une page imprimée */
  nav, footer, button, form, input, textarea, select {
    display: none;
  }

  h1, h2, h3, h4, h5, h6 {
    color: #000;
    break-after: avoid;  /* interdit qu'un titre se retrouve tout seul en bas d'une page, séparé du texte qui le suit (règle typographique classique, gérée nativement par LaTeX) */
    break-inside: avoid; /* un titre qui s'étend sur 2 lignes ne doit jamais être coupé entre deux pages */
  }

  /* Ces éléments doivent toujours se lire "d'un bloc" : les couper entre
     deux pages romprait leur lisibilité (un tableau à moitié sur une page
     et à moitié sur la suivante, par exemple). break-inside: avoid demande
     au moteur de pagination de basculer l'élément entier sur la page
     suivante plutôt que de le fragmenter, s'il ne tient pas entièrement
     sur la page en cours. */
  figure, table, tr, pre, blockquote, details, img {
    break-inside: avoid;
  }

  /* orphans = nombre minimum de lignes d'un paragraphe qui doivent rester
     EN BAS d'une page avant un saut de page (évite qu'une seule ligne
     isolée ouvre la page suivante).
     widows = nombre minimum de lignes qui doivent apparaître EN HAUT
     d'une page après un saut (évite qu'une seule ligne isolée termine la
     page précédente).
     Ce sont exactement les réglages que LaTeX applique par défaut. */
  p, li, dd, blockquote {
    orphans: 3;
    widows: 3;
  }

  /* Sur papier, un lien coloré ne veut plus rien dire (pas de clic
     possible) : on repasse en noir souligné, et on affiche l'URL complète
     entre parenthèses juste après le texte du lien — équivalent d'une note
     de bas de page automatique, pratique pour un lecteur qui imprime une
     page pour en citer une source ailleurs. */
  a {
    color: #000;
    text-decoration: underline;
  }

  a[href^="http"]::after {
    content: " (" attr(href) ")"; /* attr(href) récupère la valeur de l'attribut href du lien directement en CSS généré, sans JavaScript */
    font-size: 0.8em;
    color: #444;
    word-break: break-all; /* une URL longue ne doit jamais déborder de la largeur de la page imprimée */
  }

  a[href^="#"]::after,
  nav a::after {
    /* On annule l'affichage d'URL pour les ancres internes (href="#xxx")
       et, par sécurité, pour tout lien qui serait resté dans une <nav> —
       une ancre de page ou un lien de menu n'a aucun sens à imprimer sous
       forme d'URL. */
    content: "";
  }

  /* Fonds colorés = gâchis d'encre à l'impression (et rendu parfois grisé/
     dégradé selon l'imprimante). On repasse tout en simples bordures
     noires, qui gardent le sens visuel (mise en évidence) sans consommer
     d'encre de fond. */
  mark {
    background: none;
    text-decoration: underline;
  }

  aside, code, pre {
    background: none;
    border: none;
    border-left: 2px solid #000;
    padding-left: 0.8em;
  }

  /* Un <details> fermé masque son contenu par défaut (comportement natif
     HTML5) : totalement inadapté à un PDF, où il n'y a plus d'interaction
     possible pour cliquer et déplier. On force donc l'affichage complet du
     contenu même si l'attribut "open" n'est pas présent dans le HTML. */
  details {
    border: none;
    padding: 0;
  }

  details:not([open]) > *:not(summary) {
    display: block !important; /* !important nécessaire ici : on doit explicitement l'emporter sur le display:none imposé par la feuille de style interne du navigateur pour <details> fermé */
  }

  summary::marker,
  summary::-webkit-details-marker {
    /* Masque le petit triangle/flèche de bascule de <summary> à
       l'impression : puisque le contenu est désormais toujours affiché
       (règle ci-dessus), ce triangle n'a plus de fonction interactive et
       n'est plus qu'un artefact visuel inutile sur papier. */
    display: none;
  }
}
