Skip to content

fix(theme): elimina o flash de tela cheia no reveal de tema no mobile#68

Merged
johnlaff merged 1 commit into
mainfrom
fix/theme-reveal-flash-mobile
Jul 22, 2026
Merged

fix(theme): elimina o flash de tela cheia no reveal de tema no mobile#68
johnlaff merged 1 commit into
mainfrom
fix/theme-reveal-flash-mobile

Conversation

@johnlaff

Copy link
Copy Markdown
Owner

O que e por quê

No celular, alternar o tema piscava o novo tema em tela cheia por 1-2 frames antes do círculo (reveal) começar — o que parecia o reveal "bugado". Diagnóstico a partir de uma gravação de tela, extraída a 60fps: a sequência real era claro → 2 frames PRETOS de tela cheia → claro → círculo cresce.

Causa raiz

A animação do reveal era criada com root.animate(...) dentro de transition.ready.then() — um callback agendado. No desktop ele resolve em menos de um frame; no Chrome do celular (mais lento) demora 1-2 frames, e nesse intervalo o snapshot ::view-transition-new(root) é exibido sem o clip-path (tela cheia). Por isso só quebrava no mobile.

Correção

Mover o reveal do WAAPI agendado para uma animação CSS (@keyframes theme-reveal em ::view-transition-new(root)): ela já está ativa no primeiro frame em que o pseudo-elemento nasce — sem gap, sem flash.

  • Geometria (origem/raio) continua vindo das custom properties --theme-reveal-*.
  • Duração (320ms) e curva (emphasized decelerate do Material 3) passam a viver no CSS, onde a animação roda.
  • O hook fica bem mais simples: sem WAAPI, sem ref de animação; cleanup direto no transition.finished.

Como verificar

  • theme-transition-css.test.ts: garante que o reveal é um @keyframes CSS partindo do raio 0 (não um WAAPI agendado).
  • review-feedback-source.test.ts: garante fill-mode: both (o círculo final fica cheio até o snapshot ser removido).
  • No device: alternar o tema não deve mais piscar o tema inteiro antes do círculo.

Gates locais verdes: lint, tsc, 310 testes unit, react-doctor (changed) sem issues, build.

No celular, trocar o tema piscava o novo tema em tela cheia por 1-2 frames antes
do círculo começar. A animação do reveal era criada com root.animate() dentro de
transition.ready.then() — um callback agendado. No desktop ele resolve em menos de
um frame; no Chrome do celular demora 1-2 frames, e nesse intervalo o snapshot do
novo tema é exibido sem o clip-path (tela cheia) — o flash.

Move o reveal do WAAPI agendado para uma animação CSS (@Keyframes theme-reveal no
::view-transition-new(root)): ela já está ativa no primeiro frame em que o pseudo-
elemento nasce, sem gap, então não há flash. A geometria (origem/raio) continua
vindo das custom properties; a duração e a curva (emphasized decelerate do M3)
passam a viver no CSS. O hook fica bem mais simples: sem WAAPI, sem ref de animação,
cleanup direto no transition.finished.
@johnlaff
johnlaff merged commit 6f2b22e into main Jul 22, 2026
1 check passed
@johnlaff
johnlaff deleted the fix/theme-reveal-flash-mobile branch July 22, 2026 18:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant