/* ========================================================================== @transformer/ui — reset.css Reset moderne minimal. À importer APRÈS tokens.css. Vit dans @layer tf-reset : le CSS d'un site (non-layeré) gagne toujours. ========================================================================== */ @layer tf-reset { *, *::before, *::after { box-sizing: border-box; } * { margin: 0; } html { -webkit-text-size-adjust: 100%; hanging-punctuation: first last; } body { min-height: 100svh; background: var(--bg); color: var(--text); font-family: var(--font-body); font-size: var(--fs-base); line-height: var(--lh-base); -webkit-font-smoothing: antialiased; } h1, h2, h3, h4, h5, h6 { font-family: var(--font-heading); line-height: var(--lh-tight); text-wrap: balance; overflow-wrap: break-word; } p, li, blockquote { overflow-wrap: break-word; } img, picture, video, canvas, svg { display: block; max-width: 100%; height: auto; } input, button, textarea, select { font: inherit; color: inherit; } a { color: var(--link); } a:hover { color: var(--link-hover); } code, pre, kbd, samp { font-family: var(--font-mono); } /* Focus visible partout, jamais supprimé sans remplacement */ :focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; border-radius: var(--radius-sm); } :focus:not(:focus-visible) { outline: none; } /* Défilement doux uniquement si l'utilisateur accepte le mouvement */ @media (prefers-reduced-motion: no-preference) { html { scroll-behavior: smooth; } } /* Reduced motion : coupe tout mouvement non essentiel, globalement */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } } } /* @layer tf-reset */