# MODELOS — três formatos servem as seis ferramentas

Aprenda o modelo `cena` e você já opera Prisma, Tela, Corte e Traço.
Prosa usa `documento`. Grade usa `planilha`.

---

## Modelo CENA — Prisma, Tela, Corte, Traço

```json
{
  "tema": "meia-noite",
  "largura": 1920,
  "altura": 1080,
  "cenas": [
    {
      "layout": "capa",
      "fundo": "malha",
      "duracao": 4,
      "notas": "o que falar nesta cena",
      "elementos": [
        { "tipo": "texto", "papel": "chapeu", "texto": "Panorama 2026" },
        { "tipo": "texto", "papel": "titulo", "texto": "Energia solar no Brasil" },
        { "tipo": "texto", "papel": "apoio",  "texto": "De nicho a segunda maior fonte." }
      ]
    }
  ]
}
```

### Layouts — o estúdio posiciona sozinho

| `layout` | Para quê | Ordem esperada |
|---|---|---|
| `capa` | abertura, tudo centralizado | chapéu, título, apoio |
| `titulo` | cena de conteúdo (padrão) | título e depois o corpo |
| `secao` | divisor entre partes | chapéu e título |
| `duas-colunas` | comparação, antes/depois | título e dois blocos |
| `tres-colunas` | três frentes, três pilares | título e três blocos |
| `numeros` | métricas em destaque | título e um `numeros` |
| `citacao` | uma frase que fica | um `citacao` |
| `imagem-direita` / `imagem-esquerda` | texto ao lado de imagem sangrada | texto e uma `imagem` |
| `centro` | qualquer coisa centralizada |  |
| `livre` | você define `x`, `y`, `l`, `a` de cada elemento | canvas puro |

**Regra que economiza tempo:** com layout nomeado, **não mande coordenadas**.
Mande só o conteúdo na ordem certa. Coordenadas só em `livre` — ou quando quiser
um elemento flutuando por cima do layout.

### Fundos

`"fundo"` aceita:
- palavra: `malha` · `brilho` · `grade` · `pontos` · `suave` · `vinheta`
- cor: `"#0b0d10"` ou qualquer CSS válido
- gradiente: `{"tipo":"gradiente","de":"#1a1030","para":"#06070c","angulo":160}`
- foto: `{"imagem":"https://…","escurecer":0.6}`

### Elementos

```jsonc
// TEXTO — papel define o tamanho e o peso automaticamente
{ "tipo":"texto", "papel":"titulo", "texto":"Aceita **negrito** e *itálico*" }
// papel: chapeu | titulo | subtitulo | apoio | corpo | legenda
// opcionais: tamanho, peso, cor, alinhar ("center"), fonte:"mono", maiusculas

// LISTA
{ "tipo":"lista", "itens":["Primeiro","Segundo"], "numerada":false, "revelar":true }

// CARTÕES — 2 a 4 viram colunas sozinhos
{ "tipo":"cartoes", "itens":["Título | descrição","Título | descrição"] }

// NÚMEROS
{ "tipo":"numeros", "itens":["55 GW | capacidade instalada","2ª | maior fonte"] }

// TABELA — a primeira linha é o cabeçalho
{ "tipo":"tabela", "linhas":[["Etapa","Antes","Agora"],["Custo","alto","resolvido"]] }

// CITAÇÃO
{ "tipo":"citacao", "texto":"A frase.", "autor":"Quem disse" }

// GRÁFICO
{ "tipo":"grafico", "grafico":"barras", "dados":[["2024",30],["2025",55]] }
// grafico: barras | linha | area | pizza | rosca

// IMAGEM
{ "tipo":"imagem", "src":"https://…", "ajuste":"cobrir", "raio":18 }

// ÍCONE — nomes em /api/ferramentas/tela; ou DESENHE o seu: "caminho" é o
// path SVG numa caixa 24×24 (string ou lista de strings), no traço da casa
{ "tipo":"icone", "nome":"raio", "tamanho":120, "cor":"#ffb03a" }
{ "tipo":"icone", "caminho":"M3 6h18l-2 10H5zM8 20h.01M16 20h.01", "tamanho":96 }
// como OBJETO: estilo "app" (azulejo de aplicativo) ou "vidro" (liquid glass)
{ "tipo":"icone", "nome":"foguete", "estilo":"app", "tamanho":200, "fundo":"#8b5cf6" }

// FORMA
{ "tipo":"forma", "forma":"retangulo", "x":200,"y":200,"l":400,"a":220,
  "preenchimento":"#ff5a36", "raio":24, "rotacao":-4, "opacidade":0.9 }
// forma: retangulo | circulo | triangulo | linha | seta

// MATERIAL — em qualquer elemento: "vidro" é o liquid glass (desfoca o que
// está atrás, bisel de luz, reflexo). Na forma, preenchimento vira a tinta.
{ "tipo":"forma", "forma":"retangulo", "material":"vidro", "raio":32, "x":100,"y":100,"l":800,"a":400 }

// SOM — no elemento, toca quando ele entra: whoosh | impacto | click | pop |
// ding | subida | tique | brilho, ou {"arquivo":"/midia/x.mp3","volume":0.8}
{ "tipo":"numeros", "itens":["+38% | em 12 meses"], "contar":true, "som":"ding" }

// CÓDIGO
{ "tipo":"codigo", "texto":"npm install primocode" }

// NÓ e CONECTOR — Traço
{ "id":"a", "tipo":"no", "texto":"Início", "x":300,"y":460,"l":340,"a":160 }
{ "tipo":"conector", "de":"a", "para":"b", "estilo":"curva", "texto":"aprovado" }
```

### Animação

`"anim"` em qualquer elemento: `subir` (padrão) · `surgir` · `esquerda` · `direita` ·
`zoom` · `desfoque` · `cair` · `girar` · `saltar` · `revelar` · `cortina` ·
`elastico` · `palavra` (palavra por palavra) · `nenhuma`.
Sem declarar nada, os elementos já entram em cascata na ordem em que aparecem.

### Estilo — o que tira a cara de template

```jsonc
// no elemento de texto
"estilo": "gradiente" | "contorno" | "contorno-tom" | "sombra" | "brilho" |
          "relevo" | "marcador" | "fita" | "caixa"

// na cena (ou no documento inteiro): textura por cima
"acabamento": "grao" | "vinheta" | "scanlines" | "luz" | "brilho" | "moldura"

// na cena: troca a cor de destaque só ali
"tom": "#ff5a36", "tom2": "#ffb03a"

// na imagem
"movimento": "aproximar" | "afastar" | "esquerda" | "direita" | "cima"
"filtro": "cinza" | "sepia" | "contraste" | "desbotado"

// em numeros: o número sobe do zero
"contar": true

// em lista: itens aparecem um a um
"revelar": true, "intervalo": 0.9
```

### Temas

`meia-noite` `claro` `papel` `neon` `brasa` `floresta` `retro` `oceano` `doce`
`mono` `ambar` `grafite`

São esses doze, e só. Nome fora da lista é recusado: escuro é `meia-noite`, não
`noite`. Vale no documento ou por cena.

### Identidade — o que separa um vídeo genérico de um da marca

Uma peça sem identidade sai igual a todas as outras. Três coisas resolvem, e
custam uma linha cada:

```json
"marca": { "logo": "/midia/logo.png", "cor": "#ff5a36", "canto": "inferior-direita" }
```

`marca` vale no **documento**: o logo aparece em todas as cenas, no canto, e
`cor` vira a cor de destaque de números, gráficos e detalhes. Ponha
`"semMarca": true` na capa se ela já tiver o logo grande no meio.

Se o usuário citar a empresa dele e não houver logo na galeria, **peça o
arquivo** — `studio_midia` sem `arquivo` lista o que já existe. Não invente
logo, e não deixe o vídeo sem nenhum quando ele é institucional.

E varie de cena para cena:

- **`fundo` diferente** ao longo do vídeo. Onze existem: `malha` `brilho`
  `grade` `pontos` `suave` `vinheta` `aurora` `nevoa` `ondas` `raios`
  `xadrez`. Dez cenas com o mesmo fundo é o que faz parecer template.
- **`tom`** por cena muda a cor do destaque só ali — bom para separar
  capítulos.
- **`cor`** no elemento de texto, quando uma palavra precisa saltar.
- **`tema` por cena**: uma citação em `papel` no meio de um deck escuro é
  respiro. Uma vez, não cinco.

### Objetos 3D

Volume de verdade, com perspectiva — serve para produto, capa e abertura.

```json
{ "tipo": "objeto3d", "forma": "cubo", "tamanho": 320, "girar": 14,
  "faces": ["Produto", "Dados", "IA", "Automação", "Nuvem", "Escala"] }
```

`forma`: `cubo` · `caixa` (achatada) · `cartao` (com espessura) · `prisma` ·
`painel` (superfície flutuando). `faces` aceita texto **ou** URL de imagem —
o logo nas seis faces de um cubo girando é abertura pronta. `girar` é a volta
completa em segundos (`0` deixa parado no `angulo` dado), `inclinar` levanta
ou baixa a câmera, `cores` pinta face a face.

Aceita `chaves` como qualquer elemento: dá para o cubo atravessar a cena
girando. Use **um** por cena — dois objetos girando disputam o olho.

### Chaves de animação (motion)

`chaves` em qualquer elemento: instantes de `t` 0 a 1 com `x`, `y`
(deslocamento), `escala`, `escalaX`, `escalaY`, `giro`, **`giroX`, `giroY`,
`prof`** (3D: vira em profundidade, aproxima da câmera), `opacidade`,
`desfoque`. No elemento: `suavizar` (`suave` · `linear` · `entrada` · `saida`
· `elastico` · `salto` · `degrau`), `repetir`, `vaiEVolta`. A spec do Corte
tem os exemplos.

### Mídia do computador

Suba o arquivo e use a URL devolvida em `src`, `fundo.imagem` ou `trilha.src`:

```bash
curl -s -X POST http://localhost:7777/api/midia \
  -H 'Content-Type: application/json' \
  -d '{"nome":"foto.jpg","dados":"data:image/jpeg;base64,..."}'
# → {"nome":"foto.jpg","url":"/midia/foto.jpg","tipo":"imagem","bytes":184223}
```

`GET /api/midia` lista o que já foi enviado — sempre confira antes de pedir um
arquivo novo ao usuário. Aceita imagem, áudio e vídeo até 60 MB.

---

## Modelo DOCUMENTO — Prosa

```json
{
  "tema": "papel",
  "capa": { "chapeu":"Relatório", "titulo":"...", "apoio":"...", "autor":"...", "data":"2026" },
  "blocos": [
    { "tipo":"secao", "texto":"Contexto" },
    { "tipo":"paragrafo", "texto":"Texto corrido com **negrito** e [link](url)." },
    { "tipo":"lista", "itens":["um","dois"] },
    { "tipo":"destaque", "titulo":"Atenção", "texto":"O ponto que não pode passar." }
  ]
}
```

Blocos: `titulo` `chapeu` `apoio` `secao` `subsecao` `paragrafo` `lista` `numerada`
`citacao` `codigo` `tabela` `imagem` `destaque` `sumario` `divisor` `quebra`.

---

## Modelo PLANILHA — Grade

```json
{
  "tema": "claro",
  "abas": [{
    "nome": "Custos",
    "colunas": ["Item", "Qtd", "Unitário", "Total"],
    "linhas": [
      ["Servidor", 3, 240, "=B1*C1"],
      ["Licenças", 12, 89, "=B2*C2"],
      ["Total", "", "", "=SOMA(D1:D2)"]
    ],
    "formatos": { "Unitário": "moeda", "Total": "moeda" },
    "regras": [{ "coluna": "Total", "acima": 1000 }],
    "grafico": { "tipo": "barras", "rotulo": "Item", "valor": "Total" }
  }]
}
```

Fórmulas: `=SOMA(A1:A9)` `=MEDIA(B1:B4)` `=MIN(...)` `=MAX(...)` `=CONT(...)`
`=ARRED(...)` e aritmética com referências (`=B2*1.2`). Colunas são A, B, C…;
linhas começam em 1. Argumentos de função separados por `;`.

Formatos: `texto` `inteiro` `decimal` `moeda` `percentual`.
