Laboratório ao vivo "gravar-cena-video" do curso Frontends com Vibecoding (capítulo bônus). Código-fonte completo, copiado de src/components/course/blocks/live-labs/ por scripts/export-fvc-labs-txt.mjs. Licença de uso: a mesma do repositório do site. Cada arquivo abaixo começa com uma linha '==== nome ===='. ==== GravarCenaVideoLab.tsx ==== "use client"; import { useCallback, useEffect, useId, useRef, useState, useSyncExternalStore } from "react"; import type { LiveLabMeta, LiveLabProps } from "./registry"; import styles from "./GravarCenaVideo.module.css"; /** * Laboratório "gravar-cena-video": só APIs da plataforma, nenhum pacote. * * Painel 1, "A cena e o medidor de quadros": um canvas 2D com partículas * (tarefas) correndo entre três estações, Entrada, Máquinas e Saída. Ao lado, * o medidor lê o laço de requestAnimationFrame (quadros por segundo, tempo * médio e pior tempo de quadro no último segundo) e a API Long Animation * Frames (PerformanceObserver com type "long-animation-frame"), que conta os * quadros que passaram de 50 ms e informa o blockingDuration do último. O * botão "Sobrecarregar 300 ms" trava a thread de propósito, para o medidor * mostrar o quadro longo. O controle de partículas sobe até 5.000 para a * pessoa ver o quadro cair antes de perceber a olho. * * Painel 2, "Gravar a cena em vídeo": canvas.captureStream(30) entra num * MediaRecorder por 6 segundos; o mimeType é o primeiro que * MediaRecorder.isTypeSupported aceita, na ordem AV1, VP9 e VP8 em WebM e * depois H.264 em MP4. O resultado vira um Blob exibido num