// Cursor: o ponteiro GRANDE (seta de 34 × 50 na janela; com zoom 2 vira ~70 px), contorno branco e // sombra. Anda entre chaves {em, x, y} em ARCO (desvio de 12% da distância) com rampa de velocidade. // Em cada `cliques`: afunda pra 82% por 4 quadros e solta uma ONDA laranja (r 0 → 54, 14 quadros). import React from 'react'; import {useCurrentFrame} from 'remotion'; import {COR, rampa, seg} from '../base'; export type CursorProps = {chaves: {em: number; x: number; y: number}[]; cliques?: number[]; aparece?: number; some?: number}; const pos = (f: number, ks: CursorProps['chaves']): [number, number] => { if (f <= ks[0].em) return [ks[0].x, ks[0].y]; for (let i = 1; i < ks.length; i++) if (f <= ks[i].em) { const a = ks[i - 1], b = ks[i], t = rampa(seg(f, a.em, b.em)); const dx = b.x - a.x, dy = b.y - a.y, arco = Math.sin(Math.PI * t) * 0.12; return [a.x + dx * t - dy * arco, a.y + dy * t + dx * arco]; } const u = ks[ks.length - 1]; return [u.x, u.y]; }; export const Cursor: React.FC = ({chaves, cliques = [], aparece = 0, some = 1e9}) => { const f = useCurrentFrame(); if (f < aparece || f > some) return null; const [x, y] = pos(f, chaves); const ultimo = cliques.filter((c) => c <= f).pop(); const aperta = ultimo !== undefined && f - ultimo < 4 ? 0.82 : 1; return <> {cliques.map((c, i) => { const t = seg(f, c, c + 14); if (t <= 0 || t >= 1) return null; const [cx, cy] = pos(c, chaves); return
; })} ; };