*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }
html { -webkit-text-size-adjust: 100%; }
body { min-height: 100svh; line-height: var(--altura-corpo); -webkit-font-smoothing: antialiased; }
img, picture, svg, video { display: block; max-width: 100%; }
input, button, textarea, select { font: inherit; color: inherit; }
p, h1, h2, h3, h4 { overflow-wrap: break-word; }
:where(h1, h2, h3, h4) { text-wrap: balance; }
:where(p) { text-wrap: pretty; }
ul[role="list"], ol[role="list"] { list-style: none; padding: 0; }

/* `hidden` vence qualquer `display` de componente.
 *
 * O `[hidden] { display: none }` do navegador tem especificidade de atributo e
 * perde para qualquer `.classe { display: flex }` — então um bloco escondido
 * por `hidden` continuava aparecendo na tela. Pego no checklist, onde o
 * contador e os filtros nascem escondidos e o script os revela: sem esta
 * regra, quem estava sem JavaScript via os dois controles mortos. */
[hidden] { display: none !important; }
:target { scroll-margin-block: 5ex; }

/* Quem pediu para reduzir movimento não pode ser sobreposto por nenhum
   componente. O idioma comum (animation-duration: 0.01ms) não REMOVE a
   animação — ela continua existindo e correndo rápido, e segue aparecendo
   em document.getAnimations(). Aqui a exigência é zerar, então `animation:
   none !important`, que também é imune a especificidade. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation: none !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
