// RelogioFlip: relógio de cartões que viram. Cada cartão preto (270 × 380) mostra dois dígitos brancos em Big Shoulders 900, // com a linha do meio; quando o valor muda, a metade de cima cai e a nova sobe, como relógio de aeroporto. Herói. import React from 'react'; import {useCurrentFrame} from 'remotion'; import {COR, FONTE, MONO, e5, ov, seg} from '../base'; export type RelogioFlipProps = { cartoes: {rotulo: string; /** valor inicial */ de: number; /** quadros entre trocas; 0 = não troca */ intervalo?: number}[]; inicio?: number; /** quadro (na cena) da 1ª troca */ tick?: number; /** centro vertical, px */ y: number; fim?: number; }; const dois = (n: number) => String(Math.max(0, n)).padStart(2, '0'); const W = 270, H = 380, GAP = 35; const Metade: React.FC<{texto: string; topo: boolean; rot: number}> = ({texto, topo, rot}) =>
{texto}
; export const RelogioFlip: React.FC = ({cartoes, inicio = 0, tick = 14, y, fim = 1e9}) => { const f = useCurrentFrame(); if (f < inicio - 1 || f > fim + 12) return null; const sai = e5(seg(f, fim, fim + 10)), total = cartoes.length * W + (cartoes.length - 1) * GAP; return
{cartoes.map((c, i) => { const t = ov(seg(f, inicio + i * 4, inicio + i * 4 + 16)); const iv = c.intervalo ?? 0; const n = iv && f >= tick ? Math.floor((f - tick) / iv) + 1 : 0; const dentro = iv && f >= tick ? (f - tick) % iv : 99; const p = dentro < 8 ? dentro / 8 : 1; // progresso da virada atual const atual = c.de - n, antes = c.de - Math.max(0, n - 1); const velho = n > 0 && p < 1 ? antes : atual; return
{n > 0 && p < 1 && <> }
{c.rotulo}
; })}
; };