primocode 7.18.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/primocode.js +0 -0
- package/lib/catalogo.js +12 -0
- package/lib/studio.js +198 -0
- package/lib/tools.js +15 -0
- package/lib/ui.js +3 -1
- package/package.json +2 -1
- package/studio/PRIMOCODE.md +58 -0
- package/studio/README.md +154 -0
- package/studio/__pycache__/server.cpython-311.pyc +0 -0
- package/studio/ferramentas/00-protocolo.md +111 -0
- package/studio/ferramentas/01-modelos.md +202 -0
- package/studio/ferramentas/README.md +32 -0
- package/studio/ferramentas/corte.md +193 -0
- package/studio/ferramentas/grade.md +92 -0
- package/studio/ferramentas/prisma.md +99 -0
- package/studio/ferramentas/prosa.md +86 -0
- package/studio/ferramentas/tela.md +72 -0
- package/studio/ferramentas/traco.md +79 -0
- package/studio/server.py +792 -0
- package/studio/web/core.css +723 -0
- package/studio/web/home.html +149 -0
- package/studio/web/js/audio.js +262 -0
- package/studio/web/js/editor.js +1270 -0
- package/studio/web/js/exportar.js +135 -0
- package/studio/web/js/ferramentas.js +105 -0
- package/studio/web/js/icones.js +91 -0
- package/studio/web/js/midia.js +157 -0
- package/studio/web/js/narracao.js +254 -0
- package/studio/web/js/player.js +504 -0
- package/studio/web/js/render-grade.js +243 -0
- package/studio/web/js/render-prosa.js +104 -0
- package/studio/web/js/render.js +622 -0
- package/studio/web/render.css +565 -0
- package/studio/web/tool.html +70 -0
- package/studio/web/view.html +20 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# MODELOS — três formatos servem as seis ferramentas
|
|
2
|
+
|
|
3
|
+
Aprenda o modelo `cena` e você já opera Prisma, Tela, Corte e Traço.
|
|
4
|
+
Prosa usa `documento`. Grade usa `planilha`.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Modelo CENA — Prisma, Tela, Corte, Traço
|
|
9
|
+
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"tema": "meia-noite",
|
|
13
|
+
"largura": 1920,
|
|
14
|
+
"altura": 1080,
|
|
15
|
+
"cenas": [
|
|
16
|
+
{
|
|
17
|
+
"layout": "capa",
|
|
18
|
+
"fundo": "malha",
|
|
19
|
+
"duracao": 4,
|
|
20
|
+
"notas": "o que falar nesta cena",
|
|
21
|
+
"elementos": [
|
|
22
|
+
{ "tipo": "texto", "papel": "chapeu", "texto": "Panorama 2026" },
|
|
23
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "Energia solar no Brasil" },
|
|
24
|
+
{ "tipo": "texto", "papel": "apoio", "texto": "De nicho a segunda maior fonte." }
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Layouts — o estúdio posiciona sozinho
|
|
32
|
+
|
|
33
|
+
| `layout` | Para quê | Ordem esperada |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `capa` | abertura, tudo centralizado | chapéu, título, apoio |
|
|
36
|
+
| `titulo` | cena de conteúdo (padrão) | título e depois o corpo |
|
|
37
|
+
| `secao` | divisor entre partes | chapéu e título |
|
|
38
|
+
| `duas-colunas` | comparação, antes/depois | título e dois blocos |
|
|
39
|
+
| `tres-colunas` | três frentes, três pilares | título e três blocos |
|
|
40
|
+
| `numeros` | métricas em destaque | título e um `numeros` |
|
|
41
|
+
| `citacao` | uma frase que fica | um `citacao` |
|
|
42
|
+
| `imagem-direita` / `imagem-esquerda` | texto ao lado de imagem sangrada | texto e uma `imagem` |
|
|
43
|
+
| `centro` | qualquer coisa centralizada | |
|
|
44
|
+
| `livre` | você define `x`, `y`, `l`, `a` de cada elemento | canvas puro |
|
|
45
|
+
|
|
46
|
+
**Regra que economiza tempo:** com layout nomeado, **não mande coordenadas**.
|
|
47
|
+
Mande só o conteúdo na ordem certa. Coordenadas só em `livre` — ou quando quiser
|
|
48
|
+
um elemento flutuando por cima do layout.
|
|
49
|
+
|
|
50
|
+
### Fundos
|
|
51
|
+
|
|
52
|
+
`"fundo"` aceita:
|
|
53
|
+
- palavra: `malha` · `brilho` · `grade` · `pontos` · `suave` · `vinheta`
|
|
54
|
+
- cor: `"#0b0d10"` ou qualquer CSS válido
|
|
55
|
+
- gradiente: `{"tipo":"gradiente","de":"#1a1030","para":"#06070c","angulo":160}`
|
|
56
|
+
- foto: `{"imagem":"https://…","escurecer":0.6}`
|
|
57
|
+
|
|
58
|
+
### Elementos
|
|
59
|
+
|
|
60
|
+
```jsonc
|
|
61
|
+
// TEXTO — papel define o tamanho e o peso automaticamente
|
|
62
|
+
{ "tipo":"texto", "papel":"titulo", "texto":"Aceita **negrito** e *itálico*" }
|
|
63
|
+
// papel: chapeu | titulo | subtitulo | apoio | corpo | legenda
|
|
64
|
+
// opcionais: tamanho, peso, cor, alinhar ("center"), fonte:"mono", maiusculas
|
|
65
|
+
|
|
66
|
+
// LISTA
|
|
67
|
+
{ "tipo":"lista", "itens":["Primeiro","Segundo"], "numerada":false, "revelar":true }
|
|
68
|
+
|
|
69
|
+
// CARTÕES — 2 a 4 viram colunas sozinhos
|
|
70
|
+
{ "tipo":"cartoes", "itens":["Título | descrição","Título | descrição"] }
|
|
71
|
+
|
|
72
|
+
// NÚMEROS
|
|
73
|
+
{ "tipo":"numeros", "itens":["55 GW | capacidade instalada","2ª | maior fonte"] }
|
|
74
|
+
|
|
75
|
+
// TABELA — a primeira linha é o cabeçalho
|
|
76
|
+
{ "tipo":"tabela", "linhas":[["Etapa","Antes","Agora"],["Custo","alto","resolvido"]] }
|
|
77
|
+
|
|
78
|
+
// CITAÇÃO
|
|
79
|
+
{ "tipo":"citacao", "texto":"A frase.", "autor":"Quem disse" }
|
|
80
|
+
|
|
81
|
+
// GRÁFICO
|
|
82
|
+
{ "tipo":"grafico", "grafico":"barras", "dados":[["2024",30],["2025",55]] }
|
|
83
|
+
// grafico: barras | linha | area | pizza | rosca
|
|
84
|
+
|
|
85
|
+
// IMAGEM
|
|
86
|
+
{ "tipo":"imagem", "src":"https://…", "ajuste":"cobrir", "raio":18 }
|
|
87
|
+
|
|
88
|
+
// ÍCONE — nomes em /api/ferramentas/tela
|
|
89
|
+
{ "tipo":"icone", "nome":"raio", "tamanho":120, "cor":"#ffb03a" }
|
|
90
|
+
|
|
91
|
+
// FORMA
|
|
92
|
+
{ "tipo":"forma", "forma":"retangulo", "x":200,"y":200,"l":400,"a":220,
|
|
93
|
+
"preenchimento":"#ff5a36", "raio":24, "rotacao":-4, "opacidade":0.9 }
|
|
94
|
+
// forma: retangulo | circulo | triangulo | linha | seta
|
|
95
|
+
|
|
96
|
+
// CÓDIGO
|
|
97
|
+
{ "tipo":"codigo", "texto":"npm install primocode" }
|
|
98
|
+
|
|
99
|
+
// NÓ e CONECTOR — Traço
|
|
100
|
+
{ "id":"a", "tipo":"no", "texto":"Início", "x":300,"y":460,"l":340,"a":160 }
|
|
101
|
+
{ "tipo":"conector", "de":"a", "para":"b", "estilo":"curva", "texto":"aprovado" }
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Animação
|
|
105
|
+
|
|
106
|
+
`"anim"` em qualquer elemento: `subir` (padrão) · `surgir` · `esquerda` · `direita` ·
|
|
107
|
+
`zoom` · `desfoque` · `cair` · `girar` · `saltar` · `revelar` · `cortina` ·
|
|
108
|
+
`elastico` · `palavra` (palavra por palavra) · `nenhuma`.
|
|
109
|
+
Sem declarar nada, os elementos já entram em cascata na ordem em que aparecem.
|
|
110
|
+
|
|
111
|
+
### Estilo — o que tira a cara de template
|
|
112
|
+
|
|
113
|
+
```jsonc
|
|
114
|
+
// no elemento de texto
|
|
115
|
+
"estilo": "gradiente" | "contorno" | "contorno-tom" | "sombra" | "brilho" |
|
|
116
|
+
"relevo" | "marcador" | "fita" | "caixa"
|
|
117
|
+
|
|
118
|
+
// na cena (ou no documento inteiro): textura por cima
|
|
119
|
+
"acabamento": "grao" | "vinheta" | "scanlines" | "luz" | "brilho" | "moldura"
|
|
120
|
+
|
|
121
|
+
// na cena: troca a cor de destaque só ali
|
|
122
|
+
"tom": "#ff5a36", "tom2": "#ffb03a"
|
|
123
|
+
|
|
124
|
+
// na imagem
|
|
125
|
+
"movimento": "aproximar" | "afastar" | "esquerda" | "direita" | "cima"
|
|
126
|
+
"filtro": "cinza" | "sepia" | "contraste" | "desbotado"
|
|
127
|
+
|
|
128
|
+
// em numeros: o número sobe do zero
|
|
129
|
+
"contar": true
|
|
130
|
+
|
|
131
|
+
// em lista: itens aparecem um a um
|
|
132
|
+
"revelar": true, "intervalo": 0.9
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Temas
|
|
136
|
+
|
|
137
|
+
`meia-noite` `claro` `papel` `neon` `brasa` `floresta` `retro` `oceano` `doce` `mono`
|
|
138
|
+
|
|
139
|
+
Vale no documento ou por cena. Uma cena com tema diferente no meio cria respiro —
|
|
140
|
+
use uma vez, não cinco.
|
|
141
|
+
|
|
142
|
+
### Mídia do computador
|
|
143
|
+
|
|
144
|
+
Suba o arquivo e use a URL devolvida em `src`, `fundo.imagem` ou `trilha.src`:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
curl -s -X POST http://localhost:7777/api/midia \
|
|
148
|
+
-H 'Content-Type: application/json' \
|
|
149
|
+
-d '{"nome":"foto.jpg","dados":"data:image/jpeg;base64,..."}'
|
|
150
|
+
# → {"nome":"foto.jpg","url":"/midia/foto.jpg","tipo":"imagem","bytes":184223}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`GET /api/midia` lista o que já foi enviado — sempre confira antes de pedir um
|
|
154
|
+
arquivo novo ao usuário. Aceita imagem, áudio e vídeo até 60 MB.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Modelo DOCUMENTO — Prosa
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"tema": "papel",
|
|
163
|
+
"capa": { "chapeu":"Relatório", "titulo":"...", "apoio":"...", "autor":"...", "data":"2026" },
|
|
164
|
+
"blocos": [
|
|
165
|
+
{ "tipo":"secao", "texto":"Contexto" },
|
|
166
|
+
{ "tipo":"paragrafo", "texto":"Texto corrido com **negrito** e [link](url)." },
|
|
167
|
+
{ "tipo":"lista", "itens":["um","dois"] },
|
|
168
|
+
{ "tipo":"destaque", "titulo":"Atenção", "texto":"O ponto que não pode passar." }
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Blocos: `titulo` `chapeu` `apoio` `secao` `subsecao` `paragrafo` `lista` `numerada`
|
|
174
|
+
`citacao` `codigo` `tabela` `imagem` `destaque` `sumario` `divisor` `quebra`.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Modelo PLANILHA — Grade
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"tema": "claro",
|
|
183
|
+
"abas": [{
|
|
184
|
+
"nome": "Custos",
|
|
185
|
+
"colunas": ["Item", "Qtd", "Unitário", "Total"],
|
|
186
|
+
"linhas": [
|
|
187
|
+
["Servidor", 3, 240, "=B1*C1"],
|
|
188
|
+
["Licenças", 12, 89, "=B2*C2"],
|
|
189
|
+
["Total", "", "", "=SOMA(D1:D2)"]
|
|
190
|
+
],
|
|
191
|
+
"formatos": { "Unitário": "moeda", "Total": "moeda" },
|
|
192
|
+
"regras": [{ "coluna": "Total", "acima": 1000 }],
|
|
193
|
+
"grafico": { "tipo": "barras", "rotulo": "Item", "valor": "Total" }
|
|
194
|
+
}]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Fórmulas: `=SOMA(A1:A9)` `=MEDIA(B1:B4)` `=MIN(...)` `=MAX(...)` `=CONT(...)`
|
|
199
|
+
`=ARRED(...)` e aritmética com referências (`=B2*1.2`). Colunas são A, B, C…;
|
|
200
|
+
linhas começam em 1. Argumentos de função separados por `;`.
|
|
201
|
+
|
|
202
|
+
Formatos: `texto` `inteiro` `decimal` `moeda` `percentual`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# ferramentas/
|
|
2
|
+
|
|
3
|
+
Esta pasta é a fonte da verdade do estúdio. O servidor lê estes arquivos e os
|
|
4
|
+
entrega juntos em `GET /api/manual` — não existe spec duplicada em outro lugar.
|
|
5
|
+
Editar um `.md` aqui muda o que a IA sabe, na hora, sem reiniciar nada.
|
|
6
|
+
|
|
7
|
+
| Arquivo | Conteúdo |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `00-protocolo.md` | como o agente se comporta, a frase de abertura, a tabela de equivalência e a API |
|
|
10
|
+
| `01-modelos.md` | os três modelos de documento — `cena`, `documento`, `planilha` |
|
|
11
|
+
| `prisma.md` | apresentações |
|
|
12
|
+
| `tela.md` | design gráfico |
|
|
13
|
+
| `prosa.md` | documentos |
|
|
14
|
+
| `grade.md` | planilhas |
|
|
15
|
+
| `corte.md` | vídeo |
|
|
16
|
+
| `traco.md` | diagramas |
|
|
17
|
+
|
|
18
|
+
## Ordem de leitura para um agente
|
|
19
|
+
|
|
20
|
+
1. `00-protocolo.md` — decide **o quê** e **como responder**
|
|
21
|
+
2. `01-modelos.md` — aprende **o formato**
|
|
22
|
+
3. o `.md` da ferramenta escolhida — pega o **exemplo pronto** e adapta
|
|
23
|
+
|
|
24
|
+
Um agente com pressa pode buscar tudo de uma vez em `GET /api/manual`.
|
|
25
|
+
|
|
26
|
+
## Endpoints
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
GET /api/manual tudo isto, concatenado
|
|
30
|
+
GET /api/ferramentas as seis, em JSON
|
|
31
|
+
GET /api/ferramentas/<slug> um destes arquivos, em texto
|
|
32
|
+
```
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# CORTE — vídeo
|
|
2
|
+
|
|
3
|
+
No lugar de CapCut, Premiere e After Effects. Modelo `cena`, com `duracao` em cada
|
|
4
|
+
cena, trilha sonora, transições e gravação em `.webm`.
|
|
5
|
+
|
|
6
|
+
## Como pensar um vídeo curto
|
|
7
|
+
|
|
8
|
+
Um Reels de 30 s são 7 a 9 cenas de 3 a 5 segundos. A regra é dura:
|
|
9
|
+
**uma frase por cena**. Se não dá para ler em voz alta dentro da duração, corte texto.
|
|
10
|
+
|
|
11
|
+
| Cena | Papel | Duração |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| 1 | gancho — a frase que segura o dedo | 2–3 s |
|
|
14
|
+
| 2–3 | o problema, concreto | 3–4 s |
|
|
15
|
+
| 4–6 | a virada, um argumento por cena | 4 s |
|
|
16
|
+
| 7 | número ou prova | 4 s |
|
|
17
|
+
| 8 | chamada — o que fazer agora | 3 s |
|
|
18
|
+
|
|
19
|
+
Vertical é `1080 × 1920`. Horizontal (`1920 × 1080`) só quando o destino for YouTube
|
|
20
|
+
ou tela grande. Em vertical, os tamanhos padrão de texto já crescem sozinhos.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Trilha sonora
|
|
25
|
+
|
|
26
|
+
Vai no **documento**, não na cena:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
"trilha": { "tipo": "gerada", "estilo": "pulso", "volume": 0.7 }
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Geradas pelo estúdio
|
|
33
|
+
|
|
34
|
+
Música sintetizada na hora, sem arquivo e sem licença de terceiro.
|
|
35
|
+
|
|
36
|
+
| `estilo` | Cara | BPM |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `pulso` | eletrônico, batida marcada | 112 |
|
|
39
|
+
| `ambiente` | pads longos, sem bateria | 68 |
|
|
40
|
+
| `lofi` | levada atrasada, acordes soltos | 76 |
|
|
41
|
+
| `epico` | grave, crescendo | 88 |
|
|
42
|
+
| `alegre` | maior, arpejo rápido | 124 |
|
|
43
|
+
| `tenso` | menor, suspense | 100 |
|
|
44
|
+
|
|
45
|
+
A trilha gerada não acaba — acompanha o vídeo até a última cena.
|
|
46
|
+
|
|
47
|
+
### Arquivo do usuário
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
"trilha": { "tipo": "arquivo", "src": "/midia/minha-faixa.mp3",
|
|
51
|
+
"volume": 0.7, "inicio": 0, "repetir": true }
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`src` vem de `POST /api/midia` (upload) ou é uma URL direta de áudio.
|
|
55
|
+
`inicio` pula os primeiros segundos da faixa.
|
|
56
|
+
|
|
57
|
+
**Não baixe áudio de YouTube, Spotify ou similares** — quebra os termos dessas
|
|
58
|
+
plataformas e o direito autoral da faixa. Use música do próprio usuário, faixa
|
|
59
|
+
livre de direitos, ou uma das trilhas geradas acima.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Transições
|
|
64
|
+
|
|
65
|
+
Na cena, `transicao` define como ela **entra**:
|
|
66
|
+
|
|
67
|
+
`corte` (sem efeito) · `fade` · `deslizar` · `subir` · `zoom` · `limpar` ·
|
|
68
|
+
`persiana` · `flash`
|
|
69
|
+
|
|
70
|
+
Vale o mesmo conselho das animações: varie. Tudo em `fade` parece slide, não vídeo.
|
|
71
|
+
|
|
72
|
+
## Acabamento
|
|
73
|
+
|
|
74
|
+
Textura por cima da cena inteira — é o que tira a cara de template:
|
|
75
|
+
|
|
76
|
+
`grao` · `vinheta` · `scanlines` · `luz` · `brilho` · `moldura`
|
|
77
|
+
|
|
78
|
+
Pode ir no documento (vale para tudo) ou por cena. `grao` no documento inteiro
|
|
79
|
+
dá unidade de película ao vídeo.
|
|
80
|
+
|
|
81
|
+
## Fundos
|
|
82
|
+
|
|
83
|
+
`malha` `brilho` `grade` `pontos` `suave` `vinheta` `aurora` `raios` `ondas`
|
|
84
|
+
`nevoa` `xadrez`, ou cor, gradiente e foto:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
"fundo": { "imagem": "/midia/foto.jpg", "escurecer": 0.55 }
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Movimento de imagem (Ken Burns)
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{ "tipo": "imagem", "src": "/midia/foto.jpg", "x": 0, "y": 0, "l": 1080, "a": 1920,
|
|
94
|
+
"raio": 0, "movimento": "aproximar", "filtro": "contraste" }
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`movimento`: `aproximar` `afastar` `esquerda` `direita` `cima` ·
|
|
98
|
+
`filtro`: `cinza` `sepia` `contraste` `desbotado`
|
|
99
|
+
|
|
100
|
+
Imagem parada em vídeo denuncia preguiça. Sempre dê movimento.
|
|
101
|
+
|
|
102
|
+
## Texto com estilo
|
|
103
|
+
|
|
104
|
+
`estilo` no elemento de texto:
|
|
105
|
+
|
|
106
|
+
`gradiente` · `contorno` · `contorno-tom` · `sombra` · `brilho` · `relevo` ·
|
|
107
|
+
`marcador` (fundo tipo caneta) · `fita` (tarja cheia) · `caixa`
|
|
108
|
+
|
|
109
|
+
## Animações de entrada
|
|
110
|
+
|
|
111
|
+
`subir` `surgir` `esquerda` `direita` `zoom` `desfoque` `cair` `girar` `saltar`
|
|
112
|
+
`revelar` `cortina` `elastico` `palavra` (palavra por palavra) `nenhuma`
|
|
113
|
+
|
|
114
|
+
Em `numeros`, `"contar": true` faz o número subir do zero — funciona muito bem
|
|
115
|
+
combinado com `saltar`.
|
|
116
|
+
|
|
117
|
+
Em `lista`, `"revelar": true` distribui os itens dentro da duração da cena;
|
|
118
|
+
`intervalo` (segundos) controla o espaçamento entre eles.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Exemplo completo
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"ferramenta": "corte",
|
|
127
|
+
"titulo": "Reels — por que sua conta de luz subiu",
|
|
128
|
+
"doc": {
|
|
129
|
+
"tema": "brasa",
|
|
130
|
+
"largura": 1080, "altura": 1920,
|
|
131
|
+
"acabamento": "grao",
|
|
132
|
+
"trilha": { "tipo": "gerada", "estilo": "pulso", "volume": 0.7 },
|
|
133
|
+
"cenas": [
|
|
134
|
+
{ "layout": "centro", "duracao": 3, "fundo": "aurora", "transicao": "flash",
|
|
135
|
+
"elementos": [
|
|
136
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "Sua conta subiu\nde novo.",
|
|
137
|
+
"tamanho": 124, "estilo": "gradiente", "anim": "desfoque" }]},
|
|
138
|
+
|
|
139
|
+
{ "layout": "centro", "duracao": 3, "fundo": "vinheta", "transicao": "limpar",
|
|
140
|
+
"elementos": [
|
|
141
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "E não foi o seu chuveiro.",
|
|
142
|
+
"tamanho": 78, "estilo": "marcador", "anim": "palavra" }]},
|
|
143
|
+
|
|
144
|
+
{ "layout": "centro", "duracao": 4, "transicao": "zoom", "acabamento": "vinheta",
|
|
145
|
+
"fundo": { "imagem": "/midia/torre.jpg", "escurecer": 0.5 },
|
|
146
|
+
"elementos": [
|
|
147
|
+
{ "tipo": "numeros", "contar": true, "anim": "saltar", "tamanho": 180,
|
|
148
|
+
"itens": ["+38% | bandeira tarifária em 12 meses"] }]},
|
|
149
|
+
|
|
150
|
+
{ "layout": "livre", "duracao": 4, "transicao": "deslizar",
|
|
151
|
+
"elementos": [
|
|
152
|
+
{ "tipo": "imagem", "src": "/midia/campo.jpg", "x": 0, "y": 0,
|
|
153
|
+
"l": 1080, "a": 1920, "raio": 0, "movimento": "aproximar", "filtro": "contraste" },
|
|
154
|
+
{ "tipo": "forma", "forma": "retangulo", "x": 0, "y": 1180, "l": 1080, "a": 740,
|
|
155
|
+
"preenchimento": "rgba(10,5,6,.72)" },
|
|
156
|
+
{ "tipo": "texto", "x": 90, "y": 1320, "l": 900, "a": 420,
|
|
157
|
+
"texto": "O custo está\nna transmissão", "tamanho": 104, "peso": 750,
|
|
158
|
+
"estilo": "sombra", "anim": "cortina" }]},
|
|
159
|
+
|
|
160
|
+
{ "layout": "centro", "duracao": 5, "fundo": "raios", "transicao": "subir",
|
|
161
|
+
"elementos": [
|
|
162
|
+
{ "tipo": "lista", "revelar": true, "tamanho": 52, "intervalo": 0.9,
|
|
163
|
+
"itens": ["Linhas saturadas no Nordeste",
|
|
164
|
+
"Usina gerando sem escoar",
|
|
165
|
+
"A conta chega em quem consome"] }]},
|
|
166
|
+
|
|
167
|
+
{ "layout": "centro", "duracao": 3, "fundo": "brilho", "transicao": "fade",
|
|
168
|
+
"acabamento": "luz",
|
|
169
|
+
"elementos": [
|
|
170
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "Segue para\nentender a próxima.",
|
|
171
|
+
"tamanho": 96, "estilo": "contorno-tom", "anim": "elastico" }]}
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## No modo Abrir
|
|
180
|
+
|
|
181
|
+
Toca sozinho ao carregar, com barra de transporte embaixo:
|
|
182
|
+
play/pausa, linha do tempo clicável com marca por cena, tempo, volume e **Gravar**.
|
|
183
|
+
|
|
184
|
+
`K` toca e pausa · `M` corta o som · `→` `←` pulam cena · `F` tela cheia · `Escape` para.
|
|
185
|
+
|
|
186
|
+
## Virar arquivo de vídeo
|
|
187
|
+
|
|
188
|
+
O botão **Gravar** usa a captura de tela do navegador: escolha a aba, o vídeo toca do
|
|
189
|
+
começo, para sozinho no fim e baixa um `.webm` com a trilha junto. Para o melhor
|
|
190
|
+
resultado, entre em tela cheia (`F`) antes de gravar.
|
|
191
|
+
|
|
192
|
+
O export normal (`/api/arquivos/<id>/export`) devolve um `.html` autônomo com a
|
|
193
|
+
mídia embutida — abre offline em qualquer navegador e toca igual.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# GRADE — planilhas
|
|
2
|
+
|
|
3
|
+
No lugar de Excel e Google Sheets. Modelo `planilha`, com fórmulas de verdade
|
|
4
|
+
resolvidas no navegador.
|
|
5
|
+
|
|
6
|
+
## Exemplo
|
|
7
|
+
|
|
8
|
+
```json
|
|
9
|
+
{
|
|
10
|
+
"ferramenta": "grade",
|
|
11
|
+
"titulo": "Orçamento de infraestrutura 2026",
|
|
12
|
+
"doc": {
|
|
13
|
+
"tema": "claro",
|
|
14
|
+
"abas": [
|
|
15
|
+
{
|
|
16
|
+
"nome": "Custos",
|
|
17
|
+
"colunas": ["Item", "Qtd", "Unitário", "Total"],
|
|
18
|
+
"linhas": [
|
|
19
|
+
["Servidor de aplicação", 6, 18400, "=B1*C1"],
|
|
20
|
+
["Servidor de banco", 3, 26800, "=B2*C2"],
|
|
21
|
+
["Licenças anuais", 12, 4200, "=B3*C3"],
|
|
22
|
+
["Rede e cabeamento", 1, 38000, "=B4*C4"],
|
|
23
|
+
["Total", "", "", "=SOMA(D1:D4)"]
|
|
24
|
+
],
|
|
25
|
+
"formatos": { "Qtd": "inteiro", "Unitário": "moeda", "Total": "moeda" },
|
|
26
|
+
"regras": [{ "coluna": "Total", "acima": 100000 }],
|
|
27
|
+
"grafico": { "tipo": "barras", "rotulo": "Item", "valor": "Total" }
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"nome": "Projeção",
|
|
31
|
+
"colunas": ["Mês", "Receita", "Custo", "Margem", "Margem %"],
|
|
32
|
+
"linhas": [
|
|
33
|
+
["Jan", 320000, 214000, "=B1-C1", "=ARRED(D1/B1*100)"],
|
|
34
|
+
["Fev", 348000, 219000, "=B2-C2", "=ARRED(D2/B2*100)"],
|
|
35
|
+
["Mar", 391000, 226000, "=B3-C3", "=ARRED(D3/B3*100)"],
|
|
36
|
+
["Média", "=MEDIA(B1:B3)", "=MEDIA(C1:C3)", "=MEDIA(D1:D3)", ""]
|
|
37
|
+
],
|
|
38
|
+
"formatos": { "Receita": "moeda", "Custo": "moeda", "Margem": "moeda", "Margem %": "percentual" },
|
|
39
|
+
"grafico": { "tipo": "linha", "rotulo": "Mês", "valor": "Margem" }
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Fórmulas
|
|
47
|
+
|
|
48
|
+
Escreva na célula, começando com `=`.
|
|
49
|
+
|
|
50
|
+
| Função | Exemplo |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `SOMA` | `=SOMA(D1:D9)` |
|
|
53
|
+
| `MEDIA` | `=MEDIA(B1:B12)` |
|
|
54
|
+
| `MIN` / `MAX` | `=MAX(C1:C20)` |
|
|
55
|
+
| `CONT` | `=CONT(A1:A50)` |
|
|
56
|
+
| `ARRED` | `=ARRED(D1/B1*100)` |
|
|
57
|
+
| aritmética | `=B2*1.2` · `=(B3-C3)/B3` |
|
|
58
|
+
|
|
59
|
+
- Colunas são **A, B, C…** na ordem de `colunas`; linhas começam em **1** na
|
|
60
|
+
primeira entrada de `linhas` (o cabeçalho **não** conta como linha).
|
|
61
|
+
- Argumentos de função separados por `;` — `=SOMA(A1:A3;B5)`.
|
|
62
|
+
- Referência circular devolve `#ERRO` em vez de travar.
|
|
63
|
+
|
|
64
|
+
## Formatação
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
"formatos": { "Receita": "moeda", "Margem %": "percentual", "Qtd": "inteiro" }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`texto` · `inteiro` · `decimal` · `moeda` (R$, pt-BR) · `percentual`.
|
|
71
|
+
|
|
72
|
+
Cores condicionais:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
"regras": [ { "coluna": "Total", "acima": 100000 },
|
|
76
|
+
{ "coluna": "Margem %", "abaixo": 20 } ]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`acima` pinta de verde, `abaixo` de vermelho.
|
|
80
|
+
|
|
81
|
+
## Gráfico da aba
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
"grafico": { "tipo": "barras", "rotulo": "Item", "valor": "Total" }
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
`barras` · `linha` · `area` · `pizza` · `rosca`. Linhas de fórmula (totais e médias)
|
|
88
|
+
ficam fora do gráfico automaticamente.
|
|
89
|
+
|
|
90
|
+
## Export
|
|
91
|
+
|
|
92
|
+
`GET /api/arquivos/<id>/export` devolve **CSV** com os valores já calculados.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# PRISMA — apresentações
|
|
2
|
+
|
|
3
|
+
No lugar de PowerPoint, Keynote e Canva Apresentações. Modelo `cena`, 1920×1080.
|
|
4
|
+
|
|
5
|
+
## Receita de um deck que funciona
|
|
6
|
+
|
|
7
|
+
1. **capa** — chapéu, título, uma linha de apoio
|
|
8
|
+
2. **contexto** — por que isso importa agora (`titulo` + `lista`)
|
|
9
|
+
3. **secao** — divisor antes de cada parte
|
|
10
|
+
4. o miolo: `numeros`, `tabela`, `cartoes`, `grafico`, `citacao`
|
|
11
|
+
5. **o pedido** — o que você quer que a pessoa faça
|
|
12
|
+
6. **fecho** — `capa` de novo, com contato
|
|
13
|
+
|
|
14
|
+
Entre 8 e 14 cenas para 10 minutos. Uma ideia por cena.
|
|
15
|
+
|
|
16
|
+
## Exemplo completo
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"ferramenta": "prisma",
|
|
21
|
+
"titulo": "Energia solar no Brasil",
|
|
22
|
+
"doc": {
|
|
23
|
+
"tema": "meia-noite",
|
|
24
|
+
"cenas": [
|
|
25
|
+
{ "layout": "capa", "fundo": "malha", "elementos": [
|
|
26
|
+
{ "tipo": "texto", "papel": "chapeu", "texto": "Panorama 2026" },
|
|
27
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "Energia solar no Brasil" },
|
|
28
|
+
{ "tipo": "texto", "papel": "apoio", "texto": "De nicho a segunda maior fonte da matriz em uma década." }
|
|
29
|
+
]},
|
|
30
|
+
|
|
31
|
+
{ "layout": "secao", "fundo": "brilho", "elementos": [
|
|
32
|
+
{ "tipo": "texto", "papel": "chapeu", "texto": "Parte 01" },
|
|
33
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "O que aconteceu" }
|
|
34
|
+
]},
|
|
35
|
+
|
|
36
|
+
{ "layout": "titulo", "notas": "abrir pelo custo, é o argumento mais forte", "elementos": [
|
|
37
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "Três forças empurraram a curva" },
|
|
38
|
+
{ "tipo": "lista", "revelar": true, "itens": [
|
|
39
|
+
"Queda de 82% no custo do painel desde 2012",
|
|
40
|
+
"Marco legal da geração distribuída em 2022",
|
|
41
|
+
"Leilões que destravaram a geração centralizada"
|
|
42
|
+
]}
|
|
43
|
+
]},
|
|
44
|
+
|
|
45
|
+
{ "layout": "numeros", "elementos": [
|
|
46
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "Onde estamos" },
|
|
47
|
+
{ "tipo": "numeros", "itens": [
|
|
48
|
+
"55 GW | capacidade instalada",
|
|
49
|
+
"2ª | maior fonte da matriz",
|
|
50
|
+
"R$ 200 bi | investidos desde 2012"
|
|
51
|
+
]}
|
|
52
|
+
]},
|
|
53
|
+
|
|
54
|
+
{ "layout": "titulo", "elementos": [
|
|
55
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "O gargalo mudou de lugar" },
|
|
56
|
+
{ "tipo": "tabela", "linhas": [
|
|
57
|
+
["Etapa", "Antes", "Agora"],
|
|
58
|
+
["Custo do módulo", "proibitivo", "resolvido"],
|
|
59
|
+
["Licenciamento", "simples", "lento"],
|
|
60
|
+
["Transmissão", "ociosa", "saturada"]
|
|
61
|
+
]}
|
|
62
|
+
]},
|
|
63
|
+
|
|
64
|
+
{ "layout": "citacao", "tema": "papel", "elementos": [
|
|
65
|
+
{ "tipo": "citacao",
|
|
66
|
+
"texto": "O sol já é barato. O caro agora é o fio que leva a energia até quem consome.",
|
|
67
|
+
"autor": "Relatório do setor, 2026" }
|
|
68
|
+
]},
|
|
69
|
+
|
|
70
|
+
{ "layout": "tres-colunas", "elementos": [
|
|
71
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "O que fazer em 2026" },
|
|
72
|
+
{ "tipo": "cartoes", "itens": [
|
|
73
|
+
"Armazenamento | Baterias para segurar o excedente do meio-dia",
|
|
74
|
+
"Transmissão | Novos leilões de linha no Nordeste",
|
|
75
|
+
"Previsibilidade | Regras estáveis para o investidor longo"
|
|
76
|
+
]}
|
|
77
|
+
]},
|
|
78
|
+
|
|
79
|
+
{ "layout": "capa", "fundo": "malha", "elementos": [
|
|
80
|
+
{ "tipo": "texto", "papel": "titulo", "texto": "Obrigado" },
|
|
81
|
+
{ "tipo": "texto", "papel": "apoio", "texto": "perguntas?" }
|
|
82
|
+
]}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Detalhes que valem
|
|
89
|
+
|
|
90
|
+
- **`tema` por cena** sobrepõe o do deck. Uma citação em `papel` no meio de um deck
|
|
91
|
+
`meia-noite` cria respiro — use uma vez, não cinco.
|
|
92
|
+
- **`revelar: true`** na lista faz os itens aparecerem um a um.
|
|
93
|
+
- **`notas`** na cena aparecem só para quem apresenta.
|
|
94
|
+
- **Imagem de capa:** `"fundo": {"imagem":"url","escurecer":0.6}` com `layout: "capa"`.
|
|
95
|
+
- Conteúdo grande demais encolhe sozinho para caber — mas isso é remendo, não plano.
|
|
96
|
+
|
|
97
|
+
## Na hora de apresentar
|
|
98
|
+
|
|
99
|
+
`→` avança · `←` volta · `F` tela cheia · `P` salva em PDF (uma cena por página).
|