# Yapping Content (v3)

A pessoa falando para a câmera, editada com elementos que explicam o que ela está dizendo. O vídeo reveza cinco
modos: a pessoa em tela cheia sobre um cenário novo com cards em volta, a pessoa pequena no canto com um explainer
grande, o split 50/50, o explainer em tela cheia sem a pessoa e o mini zoom. Legenda bonita, curta, em minúsculas,
com a palavra dita acendendo em azul.

## Quando usar
- Gravação da pessoa falando da cabeça dela (opinião, explicação, caso, conselho), de 30 s a 2 min.
- Fala que tem coisas para MOSTRAR: um conceito, um número, um antes e depois, um caso real, uma foto que a pessoa
  mandou.
- Aula 5 do curso Vídeos a Jato ("gravei falando, edita com legenda e animações").
- Vídeo de cliente gravado no consultório, na loja ou no escritório.

## Quando não usar
- Vídeo sem a pessoa (explainer puro, motion design, vídeo a jato).
- Notícia com prova visual forte o tempo todo: pede outro formato, com a prova na tela quase o tempo inteiro.
- Corte de podcast com duas pessoas (board `cortes-podcast`).
- Fala muito pesada ou emotiva em que qualquer elemento atrapalha: aí fica só a pessoa, sem efeito, o trecho inteiro.

## Tokens

| Token | Valor |
| --- | --- |
| Cenário (ink) | #060A12 com halo azul atrás da cabeça, grão leve, pontinhos azuis desfocados derivando |
| Card | #F5F7FB, raio 36, sombra macia, texto ink #060A12 |
| Acento | #00B4FF no escuro, #0096E0 no claro |
| Negativo | #FF4D5E (só falha, erro, "não usa") |
| Positivo | #2BD47D (só ganho, resultado bom) |
| Fontes | Bebas Neue (título atrás da cabeça e números), Inter 800 (legenda), Inter 700/800 (cards) |
| Curva das transições | silk, cubic-bezier(.16,1,.3,1), 0,45 s |
| Mini zoom | 1,00 a 1,10 em 0,30 s (expo out), ancorado entre os olhos |
| Costura do split | #00B4FF, 4 px com brilho, em y 960 |
| Zona morta | topo 0 a 230 px e base 1660 a 1920 px: nada que precise ser lido |

```json
{
  "cores": {"ink": "#060A12", "card": "#F5F7FB", "azul": "#00B4FF", "azulNoClaro": "#0096E0",
            "negativo": "#FF4D5E", "positivo": "#2BD47D", "branco": "#FFFFFF"},
  "fontes": {"titulo_atras": "Bebas Neue ~230 px", "numero": "Bebas Neue 160-260 px",
             "legenda": "Inter 800 60 px, minúsculas", "card": "Inter 700/800 38-56 px"},
  "tela": {"largura": 1080, "altura": 1920, "fps": 30, "zona_morta_topo": 230, "zona_morta_base": 1660,
           "margem_lateral": 55, "costura_y": 960},
  "modos": {
    "cheia":     {"pessoa_escala": 0.74, "ancora": "base do quadro em y 1920, centro x 540", "titulo_baseline_y": 412},
    "canto":     {"pessoa_escala": 0.42, "ancora": "base do quadro em y 1920, centro x 843", "moldura": "nenhuma"},
    "split":     {"painel_cima": [0, 0, 1080, 960], "pessoa_escala": 0.72, "ancora": "base do quadro em y 2313 (passa da tela), centro x 540", "corta_acima_de_y": 960},
    "explainer": {"pessoa": "fora (pose do canto empurrada para y 2780)", "fundo": "pontos claros animados"}
  },
  "legenda_y": {"cheia": 1450, "split": 1010, "canto": 1600, "explainer": 1600},
  "legenda": {"palavras_por_grupo": [2, 3], "entrada_s": 0.18, "sobe_px": 14, "largura_max_canto": 540},
  "transicao": {"duracao_s": 0.45, "curva": "cubic-bezier(.16,1,.3,1)", "na_emenda": "corte seco"},
  "ritmo": {"troca_s": 5, "animacao_ate_s": 8, "sem_rosto_max_s": 8},
  "proporcao_pct": {"cheia": [40, 50], "canto": [20, 30], "split": [10, 20], "explainer": [10, 15]},
  "audio": {"lufs": -14, "true_peak": -1.3, "efeito_a_cada_s": 5, "efeito_volume": [0.11, 0.13]}
}
```

## Regras
1. **Revezar os modos.** Nenhum modo segura mais que ~8 s e o vídeo passa pelos quatro modos principais pelo menos
   uma vez a cada 30 s. Sequência típica: abre em `cheia` com elementos (ou no `split`, se a primeira frase tem uma
   foto), corta para o `canto` quando começa a explicação, volta para `cheia` com cards nas frases de opinião, vai
   para o `explainer` quando a ideia precisa de espaço, volta pela pessoa subindo no `canto`, usa o `split` quando
   existe foto ou print, e fecha em `cheia`.
2. **Todo elemento explica a fala.** Card, chip, número, ícone e explainer só entram se ilustram o que está sendo
   dito naquele segundo, na palavra em que é dito. Enfeite sem significado é proibido.
3. **Escolha do modo pela fala:**
   - conversa direta com quem assiste, opinião, frase de efeito: `cheia`, com no máximo 1 ou 2 cards em volta, ou
     sozinha com mini zoom. Card com texto ao lado da pessoa fica na FRENTE dela, na altura dos ombros (a faixa livre
     ao lado da cabeça é estreita e corta o texto); só número gigante, ícone e envelope ficam atrás;
   - explicação de um conceito ou de um processo: `canto` (card grande + pessoa no canto) ou `explainer`;
   - ideia que precisa de espaço (rede, fluxo, comparação): `explainer`, até ~8 s, e volta pela pessoa no `canto`;
   - foto, print ou vídeo que a pessoa mandou ou cita (empresa, lugar, pessoa real): `split`, foto real em cima com
     Ken Burns e crédito;
   - número forte: número gigante num card (`canto` ou `split`) ou ao lado da cabeça (`cheia`) com mini zoom.
4. **Pessoa no `cheia`:** recortada (alpha do RVM) sobre um cenário novo, nunca na escala 1 se a gravação for fechada:
   encolhe o necessário para caber o título atrás da cabeça (0,74 numa gravação de rosto bem perto da câmera). Alpha esfumado nos ~50 px perto da borda do quadro de
   origem e cenário escurecendo embaixo, para ombro e mão cortados pela borda nunca virarem uma linha reta.
5. **Pessoa no `canto`:** recorte sem moldura, do peito para cima, ~30 a 35% da largura, encostada embaixo à direita.
   O card ou explainer deixa esse canto livre. Variante: janela de cantos arredondados com borda fina na
   cor da marca, quando a gravação tem fundo bonito que vale mostrar.
6. **Título atrás da cabeça** (só no `cheia`): o tema em 1 ou 2 palavras, Bebas Neue gigante, já inteiro no 1º quadro
   (vira a capa). Nunca tapado pela cabeça, nunca na zona morta.
7. **Transições:** na emenda de dois takes, corte seco, e o modo troca no MESMO quadro da emenda. Dentro de um take
   contínuo, transição animada de 0,45 s (silk): a pessoa encolhe para o canto enquanto o card sobe; o painel do split
   desce do topo e a pessoa desce para a metade de baixo; a pessoa sobe de baixo para o canto ao sair do explainer.
8. **Legenda bonita:** 2 a 3 palavras por vez, minúsculas como se fala, Inter 800 60 px branca com sombra macia; a
   palavra dita acende em azul. Sobe 14 px e aparece em 0,18 s; troca seca. No fundo claro vira a escura (#060A12,
   palavra ativa #0096E0). Posição por modo (tokens): no `split` logo abaixo da costura, sobre o cabelo, nunca na cara;
   no `canto` alinhada à esquerda, sem encostar na pessoa.
9. **Nenhum painel vazio na troca:** card, explainer ou painel do split chega com conteúdo visível no 1º quadro, e a
   animação parte dali.
10. **Cards claros e limpos:** #F5F7FB, raio 36, ícone em traço que se desenha, texto com respiro de 8% da largura do
   card, nada vazando. Cor com significado: vermelho só para negativo, verde só para positivo, azul para todo o resto.
   Uma cor de significado por momento.
11. **Área segura:** nada que precise ser lido acima de y 230 nem abaixo de y 1660, margem lateral de 55 px. A conta
    vale no pior quadro do movimento.
12. **Corte antes de tudo:** o bruto passa pela skill `dg-editar-gravacao-bruta` (último take bom de cada
    regravação, nenhuma palavra comida). Os tempos de palavra vêm do ElevenLabs Scribe, nunca do Gemini.
13. **Nenhuma piscada:** em cada troca, layout, legenda, cards e fundo mudam no mesmo quadro. Conferir 3 quadros em
    volta de cada troca com ffmpeg antes de entregar.
14. **Render do vídeo inteiro no pod de CPU de 64 vCPU**, nunca na VPS (a VPS só faz prévia de poucos quadros). QA final
    com o Gemini.

## Proibições
- Pessoa em tela cheia o vídeo inteiro com legenda simples por cima (o Yapping antigo).
- Elemento decorativo que não explica a fala.
- Mesmo modo por mais de ~10 s.
- Corte reto de ombro ou de mão aparecendo no recorte.
- Legenda em caixa alta com contorno grosso, legenda sobre o rosto, legenda encostando na pessoa no canto.
- Texto lido na zona morta (topo 230 px, base 260 px).
- Vermelho ou verde como cor de enfeite.
- Placa estática atrás da pessoa no lugar do cenário animado.

## Som
- Música: trilha instrumental reta por baixo da voz, com sidechain pela voz (volume de partida 0,22). Sem refrão,
  sem vocal.
- Efeitos: whoosh curto ou médio nas transições animadas, pop suave em card entrando, carimbo no X vermelho, impacto
  seco no número gigante. Um a cada ~5 s, nunca dois a menos de 0,6 s, volume 0,11 a 0,13.
- Voz: highpass 70 Hz, redução de ruído leve, compressor 2,5:1. Final em -14 LUFS, pico -1,3 dBTP (loudnorm de duas
  passadas).
- Proibido: efeito em todo corte, som no corte seco da emenda, efeito mais alto que a voz.

## Prompts dos assets
Este estilo não depende de imagem gerada: a pessoa é a gravação real, os cards e explainers são desenhados em código,
e foto de empresa, lugar ou pessoa real vem de fonte real (Wikimedia Commons, site oficial, imprensa) com crédito.
Quando faltar um cenário diferente para trás da pessoa ("imagina que você está no deserto"), um prompt de partida:

```
Vertical 9:16 background plate, <lugar>, soft cinematic light, shallow depth of field, empty center area where a
person will be composited, no people, no text, no logos, subtle dark vignette at the bottom
```

## Componente de referência

A pose da pessoa por modo e a transição animada (o coração do estilo), do compositor de referência:

```python
silk = cubic_bezier(.16, 1, .3, 1)          # a curva das transições
POSE = {                                     # escala, centro x e y da BASE do quadro de origem, corte, opacidade
    "cheia":     dict(sc=0.74, px=540, py=1920, clipY=0,   op=1),
    "canto":     dict(sc=0.42, px=843, py=1920, clipY=0,   op=1),
    "split":     dict(sc=0.72, px=540, py=2313, clipY=960, op=1),   # só aparece abaixo da costura
    "explainer": dict(sc=0.42, px=843, py=2780, clipY=0,   op=1),   # fora da tela, embaixo do canto
}

def pose(t, plano):
    seg = plano.segmento(t)                  # modo atual, com t0 e transição de entrada
    if seg.entrada == "seco" or t >= seg.t0 + 0.45:
        return POSE[seg.modo]
    u = silk((t - seg.t0) / 0.45)            # animada: mistura a pose anterior com a nova
    a, b = POSE[seg.anterior], POSE[seg.modo]
    return {k: a[k] + (b[k] - a[k]) * u for k in b if k in a}

# por quadro: back (cenário/painel/explainer) + pessoa (cor tratada * alpha esfumado, na pose) + front (cards, legenda)
```

Os tempos dos modos, dos cards e dos efeitos ficam num `plano.json` só, lido pelo HTML das camadas e pelo
compositor (um lugar para cada tempo, ancorado nas palavras do Scribe).
