📍 Coordenadas viewport-relative
As bboxes vêm relativas ao viewport. No vídeo, viram coordenadas do canvas somando o offset da janela.
A captura roda num viewport fixo (ex.: 1280×800). Toda bbox vem nesse espaço. No canvas 1920×1080, o screenshot é desenhado dentro da janela e cada ponto é mapeado.
📐 Capturar a bbox de cada alvo
Para cada passo com target, o capture.mjs lê o rect e arredonda para {x,y,w,h}.
Se o seletor não bate, o capture grava target: null e imprime ! alvo não encontrado no passo X. É o sinal claro de seletor errado — corrija antes de renderizar.
🧷 Seletores robustos
data-testid, role e texto visível sobrevivem à mudança de estado. Os refs @eN não.
- ✓
[data-testid="gerar"] - ✓
role+ nome acessível - ✓ Texto visível:
{tag:"button",text:"Gerar"} - ✓ Atributos:
input[name=height]
- ✗ Refs
@eNem telas que mudam - ✗ Classes geradas (CSS-in-JS) que mudam no build
- ✗ nth-child posicional num layout dinâmico
- ✗ Texto com acento/espaço que não bate exato
No POC, ao surgir o link "baixar PNG", todos os refs deslocaram. Por isso, em estado mutável, use CSS selectors ou {tag,text} — e re-snapshot quando o DOM muda muito.
🎯 O cursor mira o centro da box
O cursor é um SVG global com o hotspot na ponta. O tween compensa o offset para a ponta cair no centro.
Um único #cursor animado na timeline principal — desliza continuamente enquanto os screenshots trocam.
A ponta fica em ~(6,3) dentro do SVG de 42px. O tween usa x = alvoX - 6, y = alvoY - 3.
scale:.82 yoyo + um #ripple âmbar que expande no alvo no instante do clique.
O movimento usa duration:.7, ease:"power3.inOut", começando ~0,35s após a cena aparecer. O cursor chega ao alvo antes da explicação principal.
🔍 Região de zoom / destaque
A mesma bbox posiciona o anel de destaque e o push-in do zoom. Uma coordenada certa serve aos três efeitos.
transformOrigin no centro do alvo.O .hlbox é só box-shadow (anel + glow): entra com back.out e pulsa, focando o olhar no controle ativo sem tapar nada.
📜 Lidar com alvo fora da tela
Se o alvo está abaixo da dobra, role até ele antes de capturar e medir — e faça as duas coisas após o mesmo scroll.
O capture.mjs hoje não rola a página. Em telas longas, dirija o agent-browser na mão (scrollIntoView) antes do screenshot. Adicionar scroll/scrollTo é o item nº 1 do backlog.
Como a bbox é medida no viewport atual, ela bate com o screenshot daquele scroll — desde que o shot e a medição saiam depois do mesmo scrollIntoView.
✅ Conferir que pegou o elemento certo
Compare a bbox com o screenshot antes de renderizar. O capture imprime cada bbox no log para conferência rápida.
- ✓ Bbox cai sobre o controle visível no shot
- ✓ Nenhum aviso de "alvo não encontrado"
- ✓ w/h plausíveis (não 0×0 nem a tela inteira)
- ✗ target=— onde devia haver bbox
- ✗ Bbox sobre o elemento errado
- ✗ Coordenadas fora dos limites do shot
🎯 Resumo do módulo
- ✓ bbox viewport-relative → canvasX = WIN_L + sx, canvasY = SHOT_T + sy
- ✓ capture lê getBoundingClientRect; alvo sem match = bbox null + aviso
- ✓ prefira data-testid / role / texto visível a refs @eN
- ✓ cursor global com hotspot na ponta; clique = pulse + ripple
- ✓ a mesma bbox serve cursor, destaque e zoom; confira no log antes de renderizar