primocode 8.39.0 → 8.41.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.
Files changed (40) hide show
  1. package/README.md +28 -5
  2. package/bin/primocode.js +90 -0
  3. package/lib/acervo.js +391 -0
  4. package/lib/act.js +71 -0
  5. package/lib/audio-livre.js +6 -1
  6. package/lib/boas-vindas.js +80 -21
  7. package/lib/catalogo.js +24 -0
  8. package/lib/conta.js +24 -3
  9. package/lib/diretor.js +306 -0
  10. package/lib/remotion.js +245 -45
  11. package/lib/studio.js +54 -2
  12. package/lib/tools.js +46 -0
  13. package/lib/ui.js +3 -2
  14. package/package.json +2 -2
  15. package/studio/__pycache__/voz.cpython-311.pyc +0 -0
  16. package/studio/ferramentas/corte.md +23 -28
  17. package/studio/web/js/render.js +32 -13
  18. package/studio/__pycache__/edge.cpython-311.pyc +0 -0
  19. package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
  20. package/studio/arquivos/corte-estatico-corte-a5bab.json +0 -150
  21. package/studio/arquivos/corte-founders-ai-teste-do-player-2de1d.json +0 -65
  22. package/studio/arquivos/corte-legado-teste.json +0 -1
  23. package/studio/arquivos/corte-legado2.json +0 -1
  24. package/studio/arquivos/corte-minimo-2a829.json +0 -24
  25. package/studio/arquivos/corte-ok-00a3b.json +0 -18
  26. package/studio/arquivos/corte-ok-1270e.json +0 -22
  27. package/studio/arquivos/corte-sweep-corte-cfb29.json +0 -147
  28. package/studio/arquivos/corte-visual-completo-78f50.json +0 -35
  29. package/studio/arquivos/grade-sweep-grade-0c2f1.json +0 -119
  30. package/studio/arquivos/prisma-estatico-prisma-d8740.json +0 -182
  31. package/studio/arquivos/prisma-sweep-prisma-4c58c.json +0 -166
  32. package/studio/arquivos/prisma-y-b0785.json +0 -52
  33. package/studio/arquivos/prosa-sweep-prosa-f29cf.json +0 -80
  34. package/studio/arquivos/tela-estatico-tela-c7daf.json +0 -90
  35. package/studio/arquivos/tela-motion-3ecaa.json +0 -135
  36. package/studio/arquivos/tela-motion-d6150.json +0 -135
  37. package/studio/arquivos/tela-sweep-tela-0d2bf.json +0 -84
  38. package/studio/arquivos/traco-estatico-traco-25872.json +0 -113
  39. package/studio/arquivos/traco-sweep-traco-0bcf4.json +0 -102
  40. package/studio/studio.log +0 -28
@@ -296,6 +296,23 @@ function aplicarChaves(no, e, ctx) {
296
296
  herdado[c] = NEUTRO[c];
297
297
  });
298
298
 
299
+ // Quais campos esta animação USA. Decidido UMA vez, ANTES das chaves, e é
300
+ // o que faz o navegador interpolar: a lista de `transform` precisa ter as
301
+ // MESMAS funções, na mesma ordem, em toda chave. Emitir só o que é
302
+ // diferente de zero deixava a chave do meio de `giroY: -90 → 0 → 12` sem
303
+ // perspective/rotateY — listas incompatíveis, o navegador desiste da
304
+ // interpolação por função e cai na matriz, e a perspectiva se perde no meio
305
+ // do giro. Vale igual para `rotate(0deg)` e para o blur.
306
+ var usado = {};
307
+ CAMPOS.forEach(function (c) {
308
+ usado[c] = herdado[c] !== NEUTRO[c] || chaves.some(function (k) {
309
+ return typeof k[c] === "number" && isFinite(k[c]) && k[c] !== NEUTRO[c];
310
+ });
311
+ });
312
+ // O MESMO juiz que decide o preserve-3d (linha do `transformStyle`): se os
313
+ // dois discordarem, sobra elemento achatado com perspectiva ou o contrário.
314
+ var tem3d = tem3dEm(chaves);
315
+
299
316
  var nome = "ch" + (++_nChave);
300
317
  var passos = chaves.map(function (k) {
301
318
  CAMPOS.forEach(function (c) {
@@ -307,23 +324,21 @@ function aplicarChaves(no, e, ctx) {
307
324
  // Assim a chave continua valendo se a pessoa arrastar o elemento no
308
325
  // palco depois — o contrário obrigaria a refazer todas as chaves.
309
326
  var dx = herdado.x, dy = herdado.y;
310
- var tem3d = herdado.giroX || herdado.giroY || herdado.prof;
311
327
  // A perspectiva vai NA transformação, não no pai: o pai é a cena, e uma
312
- // perspectiva lá mudaria todos os elementos. Constante em todas as
313
- // chaves, para o navegador interpolar só o que muda.
328
+ // perspectiva lá mudaria todos os elementos.
314
329
  if (tem3d) mov.push("perspective(1200px)");
315
- if (dx || dy) mov.push("translate(" + dx + "px," + dy + "px)");
316
- if (herdado.prof) mov.push("translateZ(" + herdado.prof + "px)");
317
- if (herdado.escala !== 1) mov.push("scale(" + herdado.escala + ")");
318
- if (herdado.escalaX !== 1 || herdado.escalaY !== 1) mov.push("scale(" + herdado.escalaX + "," + herdado.escalaY + ")");
319
- if (herdado.giroX) mov.push("rotateX(" + herdado.giroX + "deg)");
320
- if (herdado.giroY) mov.push("rotateY(" + herdado.giroY + "deg)");
321
- if (herdado.giro) mov.push("rotate(" + herdado.giro + "deg)");
330
+ if (usado.x || usado.y) mov.push("translate(" + dx + "px," + dy + "px)");
331
+ if (usado.prof) mov.push("translateZ(" + herdado.prof + "px)");
332
+ if (usado.escala) mov.push("scale(" + herdado.escala + ")");
333
+ if (usado.escalaX || usado.escalaY) mov.push("scale(" + herdado.escalaX + "," + herdado.escalaY + ")");
334
+ if (usado.giroX) mov.push("rotateX(" + herdado.giroX + "deg)");
335
+ if (usado.giroY) mov.push("rotateY(" + herdado.giroY + "deg)");
336
+ if (usado.giro) mov.push("rotate(" + herdado.giro + "deg)");
322
337
 
323
338
  var linhas = ["transform:" + (mov.length ? mov.join(" ") : "none")];
324
339
  linhas.push("opacity:" + herdado.opacidade);
325
- if (herdado.desfoque > 0) {
326
- linhas.push("filter:blur(" + herdado.desfoque + "px)");
340
+ if (usado.desfoque) {
341
+ linhas.push("filter:blur(" + Math.max(0, herdado.desfoque) + "px)");
327
342
  }
328
343
  return pct.toFixed(3) + "%{" + linhas.join(";") + "}";
329
344
  }).join("");
@@ -944,7 +959,11 @@ function renderElemento(e, ctx) {
944
959
  }
945
960
  if (e.borda) no.style.border = (e.borda.largura || 2) + "px solid " + (e.borda.cor || "var(--c-linha)");
946
961
  if (f === "circulo") no.style.borderRadius = "999px";
947
- else no.style.borderRadius = _px(e.raio != null ? e.raio : 0);
962
+ // Sem `raio`, o vidro fica com o 28px da folha — escrever 0px inline
963
+ // aqui vencia o CSS e o painel de vidro saía de canto reto, contra o
964
+ // "padrão 28" que a spec promete. Forma comum segue quadrada.
965
+ else if (e.raio != null) no.style.borderRadius = _px(e.raio);
966
+ else if (e.material !== "vidro") no.style.borderRadius = "0px";
948
967
  if (f === "triangulo") { no.style.clipPath = "polygon(50% 0,100% 100%,0 100%)"; }
949
968
  if (f === "linha") { no.style.height = _px(e.espessura || 3); no.style.borderRadius = "999px"; }
950
969
  if (f === "seta") {
@@ -1,150 +0,0 @@
1
- {
2
- "id": "corte-estatico-corte-a5bab",
3
- "ferramenta": "corte",
4
- "titulo": "estatico-corte",
5
- "doc": {
6
- "tema": "brasa",
7
- "largura": 1080,
8
- "altura": 1920,
9
- "acabamento": "grao",
10
- "trilha": {
11
- "tipo": "gerada",
12
- "estilo": "pulso",
13
- "volume": 0.7
14
- },
15
- "cenas": [
16
- {
17
- "layout": "centro",
18
- "duracao": 3,
19
- "fundo": "aurora",
20
- "transicao": "flash",
21
- "elementos": [
22
- {
23
- "tipo": "texto",
24
- "papel": "titulo",
25
- "texto": "Sua conta subiu\nde novo.",
26
- "tamanho": 124,
27
- "estilo": "gradiente",
28
- "anim": "nenhuma"
29
- }
30
- ]
31
- },
32
- {
33
- "layout": "centro",
34
- "duracao": 3,
35
- "fundo": "vinheta",
36
- "transicao": "limpar",
37
- "elementos": [
38
- {
39
- "tipo": "texto",
40
- "papel": "titulo",
41
- "texto": "E não foi o seu chuveiro.",
42
- "tamanho": 78,
43
- "estilo": "marcador",
44
- "anim": "nenhuma"
45
- }
46
- ]
47
- },
48
- {
49
- "layout": "centro",
50
- "duracao": 4,
51
- "transicao": "zoom",
52
- "acabamento": "vinheta",
53
- "fundo": {
54
- "imagem": "/midia/torre.jpg",
55
- "escurecer": 0.5
56
- },
57
- "elementos": [
58
- {
59
- "tipo": "numeros",
60
- "contar": true,
61
- "anim": "nenhuma",
62
- "tamanho": 180,
63
- "itens": [
64
- "+38% | bandeira tarifária em 12 meses"
65
- ]
66
- }
67
- ]
68
- },
69
- {
70
- "layout": "livre",
71
- "duracao": 4,
72
- "transicao": "deslizar",
73
- "elementos": [
74
- {
75
- "tipo": "imagem",
76
- "src": "/midia/campo.jpg",
77
- "x": 0,
78
- "y": 0,
79
- "l": 1080,
80
- "a": 1920,
81
- "raio": 0,
82
- "movimento": "aproximar",
83
- "filtro": "contraste",
84
- "anim": "nenhuma"
85
- },
86
- {
87
- "tipo": "forma",
88
- "forma": "retangulo",
89
- "x": 0,
90
- "y": 1180,
91
- "l": 1080,
92
- "a": 740,
93
- "preenchimento": "rgba(10,5,6,.72)",
94
- "anim": "nenhuma"
95
- },
96
- {
97
- "tipo": "texto",
98
- "x": 90,
99
- "y": 1320,
100
- "l": 900,
101
- "a": 420,
102
- "texto": "O custo está\nna transmissão",
103
- "tamanho": 104,
104
- "peso": 750,
105
- "estilo": "sombra",
106
- "anim": "nenhuma"
107
- }
108
- ]
109
- },
110
- {
111
- "layout": "centro",
112
- "duracao": 5,
113
- "fundo": "raios",
114
- "transicao": "subir",
115
- "elementos": [
116
- {
117
- "tipo": "lista",
118
- "revelar": true,
119
- "tamanho": 52,
120
- "intervalo": 0.9,
121
- "itens": [
122
- "Linhas saturadas no Nordeste",
123
- "Usina gerando sem escoar",
124
- "A conta chega em quem consome"
125
- ],
126
- "anim": "nenhuma"
127
- }
128
- ]
129
- },
130
- {
131
- "layout": "centro",
132
- "duracao": 3,
133
- "fundo": "brilho",
134
- "transicao": "fade",
135
- "acabamento": "luz",
136
- "elementos": [
137
- {
138
- "tipo": "texto",
139
- "papel": "titulo",
140
- "texto": "Segue para\nentender a próxima.",
141
- "tamanho": 96,
142
- "estilo": "contorno-tom",
143
- "anim": "nenhuma"
144
- }
145
- ]
146
- }
147
- ]
148
- },
149
- "atualizado": "2026-08-16T15:08:28+00:00"
150
- }
@@ -1,65 +0,0 @@
1
- {
2
- "id": "corte-founders-ai-teste-do-player-2de1d",
3
- "ferramenta": "corte",
4
- "titulo": "Founders AI — teste do player",
5
- "doc": {
6
- "tema": "brasa",
7
- "largura": 1080,
8
- "altura": 1920,
9
- "acabamento": "grao",
10
- "trilha": {
11
- "tipo": "gerada",
12
- "estilo": "pulso",
13
- "volume": 0.7
14
- },
15
- "cenas": [
16
- {
17
- "layout": "centro",
18
- "duracao": 3,
19
- "fundo": "aurora",
20
- "transicao": "flash",
21
- "elementos": [
22
- {
23
- "tipo": "texto",
24
- "papel": "titulo",
25
- "texto": "Imersão\nFounders AI",
26
- "tamanho": 124,
27
- "estilo": "gradiente",
28
- "anim": "desfoque"
29
- }
30
- ]
31
- },
32
- {
33
- "layout": "centro",
34
- "duracao": 3,
35
- "fundo": "vinheta",
36
- "elementos": [
37
- {
38
- "tipo": "texto",
39
- "papel": "titulo",
40
- "texto": "Paris Group · Chapecó",
41
- "tamanho": 78,
42
- "estilo": "marcador",
43
- "anim": "palavra"
44
- }
45
- ]
46
- },
47
- {
48
- "layout": "centro",
49
- "duracao": 4,
50
- "fundo": "raios",
51
- "elementos": [
52
- {
53
- "tipo": "numeros",
54
- "contar": true,
55
- "tamanho": 180,
56
- "itens": [
57
- "20 | empresários por turma"
58
- ]
59
- }
60
- ]
61
- }
62
- ]
63
- },
64
- "atualizado": "2026-08-16T14:55:24+00:00"
65
- }
@@ -1 +0,0 @@
1
- {"id": "corte-legado-teste", "ferramenta": "corte", "titulo": "legado", "doc": {"tema": "meia-noite", "largura": 1080, "altura": 1920, "cenas": [{"duracao": "4s", "fundo": "aurora", "elementos": [{"tipo": "titulo", "texto": "Imersão Founders AI"}, {"tipo": "subtitulo", "conteudo": "Paris Group · Chapecó"}]}]}}
@@ -1 +0,0 @@
1
- {"id": "corte-legado2", "ferramenta": "corte", "titulo": "legado2", "doc": {"tema": "meia-noite", "largura": 1080, "altura": 1920, "cenas": [{"duracao": "4s", "fundo": "aurora", "elementos": [{"tipo": "titulo", "texto": "Imersão Founders AI", "anim": "nenhuma"}, {"tipo": "subtitulo", "conteudo": "Paris Group · Chapecó", "anim": "nenhuma"}]}]}}
@@ -1,24 +0,0 @@
1
- {
2
- "id": "corte-minimo-2a829",
3
- "ferramenta": "corte",
4
- "titulo": "minimo",
5
- "doc": {
6
- "tema": "claro",
7
- "largura": 1080,
8
- "altura": 1920,
9
- "cenas": [
10
- {
11
- "layout": "centro",
12
- "duracao": 5,
13
- "elementos": [
14
- {
15
- "tipo": "texto",
16
- "texto": "TESTE VISIVEL",
17
- "tamanho": 120
18
- }
19
- ]
20
- }
21
- ]
22
- },
23
- "atualizado": "2026-08-16T14:57:24+00:00"
24
- }
@@ -1,18 +0,0 @@
1
- {
2
- "id": "corte-ok-00a3b",
3
- "ferramenta": "corte",
4
- "titulo": "ok",
5
- "doc": {
6
- "cenas": [
7
- {
8
- "elementos": [
9
- {
10
- "tipo": "texto",
11
- "texto": "oi"
12
- }
13
- ]
14
- }
15
- ]
16
- },
17
- "atualizado": "2026-08-16T15:05:32+00:00"
18
- }
@@ -1,22 +0,0 @@
1
- {
2
- "id": "corte-ok-1270e",
3
- "ferramenta": "corte",
4
- "titulo": "ok",
5
- "doc": {
6
- "tema": "brasa",
7
- "cenas": [
8
- {
9
- "duracao": 3,
10
- "elementos": [
11
- {
12
- "tipo": "texto",
13
- "papel": "titulo",
14
- "texto": "Founders AI",
15
- "anim": "nenhuma"
16
- }
17
- ]
18
- }
19
- ]
20
- },
21
- "atualizado": "2026-08-16T17:50:21+00:00"
22
- }
@@ -1,147 +0,0 @@
1
- {
2
- "id": "corte-sweep-corte-cfb29",
3
- "ferramenta": "corte",
4
- "titulo": "sweep-corte",
5
- "doc": {
6
- "tema": "brasa",
7
- "largura": 1080,
8
- "altura": 1920,
9
- "acabamento": "grao",
10
- "trilha": {
11
- "tipo": "gerada",
12
- "estilo": "pulso",
13
- "volume": 0.7
14
- },
15
- "cenas": [
16
- {
17
- "layout": "centro",
18
- "duracao": 3,
19
- "fundo": "aurora",
20
- "transicao": "flash",
21
- "elementos": [
22
- {
23
- "tipo": "texto",
24
- "papel": "titulo",
25
- "texto": "Sua conta subiu\nde novo.",
26
- "tamanho": 124,
27
- "estilo": "gradiente",
28
- "anim": "desfoque"
29
- }
30
- ]
31
- },
32
- {
33
- "layout": "centro",
34
- "duracao": 3,
35
- "fundo": "vinheta",
36
- "transicao": "limpar",
37
- "elementos": [
38
- {
39
- "tipo": "texto",
40
- "papel": "titulo",
41
- "texto": "E não foi o seu chuveiro.",
42
- "tamanho": 78,
43
- "estilo": "marcador",
44
- "anim": "palavra"
45
- }
46
- ]
47
- },
48
- {
49
- "layout": "centro",
50
- "duracao": 4,
51
- "transicao": "zoom",
52
- "acabamento": "vinheta",
53
- "fundo": {
54
- "imagem": "/midia/torre.jpg",
55
- "escurecer": 0.5
56
- },
57
- "elementos": [
58
- {
59
- "tipo": "numeros",
60
- "contar": true,
61
- "anim": "saltar",
62
- "tamanho": 180,
63
- "itens": [
64
- "+38% | bandeira tarifária em 12 meses"
65
- ]
66
- }
67
- ]
68
- },
69
- {
70
- "layout": "livre",
71
- "duracao": 4,
72
- "transicao": "deslizar",
73
- "elementos": [
74
- {
75
- "tipo": "imagem",
76
- "src": "/midia/campo.jpg",
77
- "x": 0,
78
- "y": 0,
79
- "l": 1080,
80
- "a": 1920,
81
- "raio": 0,
82
- "movimento": "aproximar",
83
- "filtro": "contraste"
84
- },
85
- {
86
- "tipo": "forma",
87
- "forma": "retangulo",
88
- "x": 0,
89
- "y": 1180,
90
- "l": 1080,
91
- "a": 740,
92
- "preenchimento": "rgba(10,5,6,.72)"
93
- },
94
- {
95
- "tipo": "texto",
96
- "x": 90,
97
- "y": 1320,
98
- "l": 900,
99
- "a": 420,
100
- "texto": "O custo está\nna transmissão",
101
- "tamanho": 104,
102
- "peso": 750,
103
- "estilo": "sombra",
104
- "anim": "cortina"
105
- }
106
- ]
107
- },
108
- {
109
- "layout": "centro",
110
- "duracao": 5,
111
- "fundo": "raios",
112
- "transicao": "subir",
113
- "elementos": [
114
- {
115
- "tipo": "lista",
116
- "revelar": true,
117
- "tamanho": 52,
118
- "intervalo": 0.9,
119
- "itens": [
120
- "Linhas saturadas no Nordeste",
121
- "Usina gerando sem escoar",
122
- "A conta chega em quem consome"
123
- ]
124
- }
125
- ]
126
- },
127
- {
128
- "layout": "centro",
129
- "duracao": 3,
130
- "fundo": "brilho",
131
- "transicao": "fade",
132
- "acabamento": "luz",
133
- "elementos": [
134
- {
135
- "tipo": "texto",
136
- "papel": "titulo",
137
- "texto": "Segue para\nentender a próxima.",
138
- "tamanho": 96,
139
- "estilo": "contorno-tom",
140
- "anim": "elastico"
141
- }
142
- ]
143
- }
144
- ]
145
- },
146
- "atualizado": "2026-08-16T15:07:33+00:00"
147
- }
@@ -1,35 +0,0 @@
1
- {
2
- "id": "corte-visual-completo-78f50",
3
- "ferramenta": "corte",
4
- "titulo": "visual completo",
5
- "doc": {
6
- "tema": "brasa",
7
- "largura": 1080,
8
- "altura": 1920,
9
- "acabamento": "grao",
10
- "cenas": [
11
- {
12
- "layout": "centro",
13
- "duracao": 4,
14
- "fundo": "aurora",
15
- "elementos": [
16
- {
17
- "tipo": "texto",
18
- "papel": "titulo",
19
- "texto": "Imersão\nFounders AI",
20
- "tamanho": 124,
21
- "estilo": "gradiente",
22
- "anim": "nenhuma"
23
- },
24
- {
25
- "tipo": "texto",
26
- "texto": "Paris Group · Chapecó",
27
- "tamanho": 48,
28
- "anim": "nenhuma"
29
- }
30
- ]
31
- }
32
- ]
33
- },
34
- "atualizado": "2026-08-16T15:02:56+00:00"
35
- }
@@ -1,119 +0,0 @@
1
- {
2
- "id": "grade-sweep-grade-0c2f1",
3
- "ferramenta": "grade",
4
- "titulo": "sweep-grade",
5
- "doc": {
6
- "tema": "claro",
7
- "abas": [
8
- {
9
- "nome": "Custos",
10
- "colunas": [
11
- "Item",
12
- "Qtd",
13
- "Unitário",
14
- "Total"
15
- ],
16
- "linhas": [
17
- [
18
- "Servidor de aplicação",
19
- 6,
20
- 18400,
21
- "=B1*C1"
22
- ],
23
- [
24
- "Servidor de banco",
25
- 3,
26
- 26800,
27
- "=B2*C2"
28
- ],
29
- [
30
- "Licenças anuais",
31
- 12,
32
- 4200,
33
- "=B3*C3"
34
- ],
35
- [
36
- "Rede e cabeamento",
37
- 1,
38
- 38000,
39
- "=B4*C4"
40
- ],
41
- [
42
- "Total",
43
- "",
44
- "",
45
- "=SOMA(D1:D4)"
46
- ]
47
- ],
48
- "formatos": {
49
- "Qtd": "inteiro",
50
- "Unitário": "moeda",
51
- "Total": "moeda"
52
- },
53
- "regras": [
54
- {
55
- "coluna": "Total",
56
- "acima": 100000
57
- }
58
- ],
59
- "grafico": {
60
- "tipo": "barras",
61
- "rotulo": "Item",
62
- "valor": "Total"
63
- }
64
- },
65
- {
66
- "nome": "Projeção",
67
- "colunas": [
68
- "Mês",
69
- "Receita",
70
- "Custo",
71
- "Margem",
72
- "Margem %"
73
- ],
74
- "linhas": [
75
- [
76
- "Jan",
77
- 320000,
78
- 214000,
79
- "=B1-C1",
80
- "=ARRED(D1/B1*100)"
81
- ],
82
- [
83
- "Fev",
84
- 348000,
85
- 219000,
86
- "=B2-C2",
87
- "=ARRED(D2/B2*100)"
88
- ],
89
- [
90
- "Mar",
91
- 391000,
92
- 226000,
93
- "=B3-C3",
94
- "=ARRED(D3/B3*100)"
95
- ],
96
- [
97
- "Média",
98
- "=MEDIA(B1:B3)",
99
- "=MEDIA(C1:C3)",
100
- "=MEDIA(D1:D3)",
101
- ""
102
- ]
103
- ],
104
- "formatos": {
105
- "Receita": "moeda",
106
- "Custo": "moeda",
107
- "Margem": "moeda",
108
- "Margem %": "percentual"
109
- },
110
- "grafico": {
111
- "tipo": "linha",
112
- "rotulo": "Mês",
113
- "valor": "Margem"
114
- }
115
- }
116
- ]
117
- },
118
- "atualizado": "2026-08-16T15:07:33+00:00"
119
- }