/* ========================================================================== base.css — Reset moderne et styles des éléments HTML natifs -------------------------------------------------------------------------- Uniquement des sélecteurs d'éléments, aucune classe. Objectif : un HTML sémantique écrit sans classe doit déjà être présentable et accessible. ========================================================================== */ @layer base { /* ====================================================================== RESET Reset ciblé plutôt que « * { margin:0; padding:0 } » aveugle : on neutralise ce qui gêne, on garde ce qui est utile (styles de listes, comportements natifs des formulaires). ====================================================================== */ *, *::before, *::after { box-sizing: border-box; /* La largeur inclut padding et bordure */ } /* Suppression des marges par défaut : elles varient d'un navigateur à l'autre et provoquent des fusions de marges imprévisibles. Les espacements sont pilotés explicitement par les composants. */ body, h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd { margin-block: 0; } html { /* Empêche iOS d'agrandir le texte en paysage sans demande explicite */ -webkit-text-size-adjust: 100%; /* Défilement fluide pour les ancres — neutralisé plus bas si l'utilisateur a demandé la réduction des animations */ scroll-behavior: smooth; /* Décale la cible des ancres pour qu'elle ne passe pas sous l'en-tête collant. Indispensable dès qu'un header est sticky. */ scroll-padding-block-start: calc(var(--header-height) + var(--space-md)); } body { min-block-size: 100svh; /* svh : hauteur stable malgré la barre d'URL mobile */ background-color: var(--color-bg); color: var(--color-ink); font-family: var(--font-sans); font-size: var(--text-base); line-height: var(--leading-normal); /* Lissage : rend Inter plus fidèle sur écrans macOS */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* Ligatures et crénage activés pour le texte courant */ text-rendering: optimizeLegibility; font-kerning: normal; } /* ====================================================================== MÉDIAS ====================================================================== */ img, picture, svg, video, canvas { display: block; /* Supprime l'espace fantôme sous les images (dû à l'alignement sur la ligne de base) */ max-inline-size: 100%; /* Jamais de débordement horizontal */ block-size: auto; /* Préserve le rapport d'aspect */ } /* ====================================================================== TYPOGRAPHIE ====================================================================== */ h1, h2, h3, h4, h5, h6 { font-family: var(--font-mono); font-weight: var(--weight-bold); line-height: var(--leading-tight); letter-spacing: -0.02em; /* Compense l'aération naturelle du monospace aux grandes tailles */ text-wrap: balance; /* Répartit les mots sur des lignes de longueur comparable — évite le mot orphelin */ } p, li, dd, figcaption { text-wrap: pretty; /* Évite les orphelins en fin de paragraphe */ } /* Les listes porteuses de role="list" sont des listes sémantiques dont on ne veut pas la puce native. Le rôle explicite est nécessaire : Safari retire la sémantique de liste quand list-style vaut none. */ ul[role="list"], ol[role="list"] { list-style: none; padding-inline-start: 0; } /* Texte mis en avant */ strong, b { font-weight: var(--weight-semibold); } /* Abréviations : curseur d'aide + soulignement pointillé */ abbr[title] { text-decoration: underline dotted; cursor: help; } /* ====================================================================== LIENS ====================================================================== */ a { color: var(--color-accent-dark); text-decoration-thickness: 1px; text-underline-offset: 0.2em; /* Le soulignement ne coupe pas les jambages */ transition: color var(--transition-fast); } a:hover { color: var(--color-accent); } /* ====================================================================== ACCESSIBILITÉ ====================================================================== */ /* :focus-visible plutôt que :focus — l'anneau apparaît à la navigation clavier mais pas au clic souris. Ne jamais faire « outline: none » sans remplacement visible : c'est la faute d'accessibilité la plus répandue sur le web. */ :focus-visible { outline: 2px solid var(--color-focus); outline-offset: 3px; border-radius: var(--radius-sm); } /* Marge lors du saut vers une ancre (complément de scroll-padding) */ :target { scroll-margin-block-start: calc(var(--header-height) + var(--space-md)); } /* ====================================================================== FORMULAIRES ET BOUTONS ====================================================================== */ button, input, select, textarea { font: inherit; /* Les navigateurs n'héritent pas la police par défaut */ color: inherit; } button { background: none; border: none; cursor: pointer; } /* ====================================================================== PRÉFÉRENCES SYSTÈME Respecter les réglages d'accessibilité de l'utilisateur n'est pas optionnel : les animations peuvent déclencher nausées et migraines chez les personnes sensibles aux troubles vestibulaires. ====================================================================== */ @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } } /* Mode contraste élevé (Windows, préférence système) */ @media (prefers-contrast: more) { :root { --color-ink-faint: #4c5a56; --color-line: #9aa5a2; --color-line-strong: #6b7674; } } }