// Cursor: a mão que faz as coisas acontecerem. Anda entre `pontos` com curva suave (sem pular), // e em cada quadro de `cliques` afunda (escala 0.82) e solta um anel que se abre. Todo clique causa algo: // ponha o clique 2 quadros antes do efeito no elemento (chave, menu, botão). Coordenadas em px da tela. import React from 'react'; import {useCurrentFrame} from 'remotion'; import {COR, e3, seg} from '../base'; export type PontoCursor = {em: number; x: number; y: number}; export type CursorProps = {pontos: PontoCursor[]; cliques?: number[]; inicio?: number; fim?: number; mao?: boolean; tamanho?: number}; export const Cursor: React.FC = ({pontos, cliques = [], inicio, fim, mao = true, tamanho = 46}) => { const f = useCurrentFrame(); const ps = [...pontos].sort((a, b) => a.em - b.em); if (!ps.length) return null; const ini = inicio ?? ps[0].em - 6; let x = ps[0].x, y = ps[0].y; for (let i = 0; i < ps.length - 1; i++) if (f >= ps[i].em) { const t = e3(seg(f, ps[i].em, ps[i + 1].em)); x = ps[i].x + (ps[i + 1].x - ps[i].x) * t; y = ps[i].y + (ps[i + 1].y - ps[i].y) * t; } const op = seg(f, ini, ini + 6) * (fim !== undefined ? 1 - seg(f, fim, fim + 6) : 1); let aperto = 1; const aneis: React.ReactNode[] = []; cliques.forEach((c, i) => { aperto -= 0.18 * Math.sin(Math.PI * seg(f, c, c + 7)); const r = seg(f, c, c + 14); if (r > 0 && r < 1) aneis.push(
); }); if (op <= 0) return null; return
{aneis} {mao ? : }
; };