# Rolagem amaciada por captura da roda — sem biblioteca, com teclado e saída

Mesma sessão. É a variante sem GSAP da entrada *Smoothed virtual scroll* acima,
e vale registrar porque a mecânica é outra: lá um valor interno é lido por
todos os scrubs; aqui a própria rolagem da janela é reescrita a cada quadro.

- **A captura**: `wheel` com `passive: false` e `preventDefault()`, acumulando
  um alvo; a cada quadro `L.current += (L.target − L.current) * 0.085`, trava
  em `|alvo − atual| < 0.08` e chama `scrollTo(0, L.current)`. O
  `deltaMode` é normalizado (linha × 16, página × altura da tela).
- **O teclado entra junto ou a página fica inacessível**: ↓ 90 px, ↑ −90,
  PageDown/espaço 0,9 × tela, Home/End aos extremos — e um guarda que devolve
  a tecla quando o foco está em `input`, `textarea`, `select` ou conteúdo
  editável.
- **A saída é dupla e obrigatória**: `prefers-reduced-motion: reduce` e
  `pointer: coarse` desligam a captura, e aí a rolagem nativa assume. Sem
  isso, o toque no celular briga com a roda sintética.
- **O escape que evita o travamento**: um ouvinte de `scroll` que, quando a
  posição real se afasta mais de 2 px da última posição escrita pela própria
  página, reassume alvo e atual — é o que devolve o controle quando algo
  externo rola (âncora, busca no navegador, restauração de sessão).
