fix(navegacao): foco em âncora de outra página, vitrine acessível e 3D mais leve
Foco cai no destino ao chegar de outra página; âncoras ignoram ?tipo=; movimento reduzido salta em todos os cliques; cronômetro da janela ampliada; degradê no topo de Projetos e legendas do mergulho com intervalos testados; vitrine acima da barra de cookies e com 2 paradas por projeto; reel-list.css no global; 3D montado em tarefas curtas, limitado a ~30 qps e estático com WebGL por software; pôsteres da vitrine de 330 para 158 KB; SC Plus regravado; scripts sem funções acima de complexidade 10.
This commit is contained in:
1 parent
9e2d65a926
commit
204ebd5fa5
49 files changed
+2197
-606
No files matched your search
@@ -15,7 +15,8 @@ import { focusFragment, onFragmentClick } from "./fragment-nav";
|
||||
* 2. Este hook cuida só do que o CSS não faz: no mouse, o Lenis suaviza a roda (com o relógio ligado apenas
|
||||
* enquanto algo se move, nunca com a página parada), e os links internos (#id) "avançam o vídeo" até o
|
||||
* destino em vez de saltar (o clique vem de fragment-nav). No toque a rolagem nativa corre em outra thread:
|
||||
* nem o Lenis é baixado.
|
||||
* nem o Lenis é baixado. Com movimento reduzido não há Lenis nem animação, mas o clique segue tratado aqui: o
|
||||
* salto é instantâneo, em todos os cliques (o link do Next só rolava no primeiro, com a mesma âncora).
|
||||
*
|
||||
* As únicas rolagens "presas" são as do CSS: o hero (sticky) e a vitrine de projetos (sticky).
|
||||
*/
|
||||
@@ -119,17 +120,23 @@ export function useCinematicScroll(mainRef: RefObject<HTMLElement | null>) {
|
||||
useEffect(() => {
|
||||
const main = mainRef.current;
|
||||
if (!main) return;
|
||||
if (prefersReducedMotion()) return;
|
||||
const reducedMotion = prefersReducedMotion();
|
||||
let cancelled = false;
|
||||
let smooth: SmoothScroll | null = null;
|
||||
|
||||
// no toque a rolagem nativa corre em outra thread: sem Lenis (e sem baixar o pacote)
|
||||
if (!isCoarsePointer())
|
||||
// no toque a rolagem nativa corre em outra thread: sem Lenis (e sem baixar o pacote); com movimento reduzido,
|
||||
// também não há suavização
|
||||
if (!reducedMotion && !isCoarsePointer())
|
||||
startSmoothScroll(() => !cancelled).then((scroll) => {
|
||||
smooth = scroll;
|
||||
});
|
||||
|
||||
const scrollToTop = (top: number) => {
|
||||
if (reducedMotion) {
|
||||
// "instant" vale mesmo com `scroll-behavior: smooth` no CSS
|
||||
window.scrollTo({ top, behavior: "instant" });
|
||||
return;
|
||||
}
|
||||
const duration = anchorDuration(top - window.scrollY, vh());
|
||||
if (smooth) smooth.scrollTo(top, duration);
|
||||
else
|
||||
|
||||
Reference in new issue
Block a user