primocode 8.40.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 (37) 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/tools.js +43 -0
  11. package/lib/ui.js +3 -2
  12. package/package.json +2 -2
  13. package/studio/__pycache__/voz.cpython-311.pyc +0 -0
  14. package/studio/web/js/render.js +32 -13
  15. package/studio/__pycache__/edge.cpython-311.pyc +0 -0
  16. package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
  17. package/studio/arquivos/corte-estatico-corte-a5bab.json +0 -150
  18. package/studio/arquivos/corte-founders-ai-teste-do-player-2de1d.json +0 -65
  19. package/studio/arquivos/corte-legado-teste.json +0 -1
  20. package/studio/arquivos/corte-legado2.json +0 -1
  21. package/studio/arquivos/corte-minimo-2a829.json +0 -24
  22. package/studio/arquivos/corte-ok-00a3b.json +0 -18
  23. package/studio/arquivos/corte-ok-1270e.json +0 -22
  24. package/studio/arquivos/corte-sweep-corte-cfb29.json +0 -147
  25. package/studio/arquivos/corte-visual-completo-78f50.json +0 -35
  26. package/studio/arquivos/grade-sweep-grade-0c2f1.json +0 -119
  27. package/studio/arquivos/prisma-estatico-prisma-d8740.json +0 -182
  28. package/studio/arquivos/prisma-sweep-prisma-4c58c.json +0 -166
  29. package/studio/arquivos/prisma-y-b0785.json +0 -52
  30. package/studio/arquivos/prosa-sweep-prosa-f29cf.json +0 -80
  31. package/studio/arquivos/tela-estatico-tela-c7daf.json +0 -90
  32. package/studio/arquivos/tela-motion-3ecaa.json +0 -135
  33. package/studio/arquivos/tela-motion-d6150.json +0 -135
  34. package/studio/arquivos/tela-sweep-tela-0d2bf.json +0 -84
  35. package/studio/arquivos/traco-estatico-traco-25872.json +0 -113
  36. package/studio/arquivos/traco-sweep-traco-0bcf4.json +0 -102
  37. package/studio/studio.log +0 -28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primocode",
3
- "version": "8.40.0",
3
+ "version": "8.41.0",
4
4
  "description": "PrimoCode — agente de engenharia com IA e cursor próprio. Requer conta Conecta Primo AI (Premium ou Super). Cria arquivos, roda comandos, controla navegador e desktop: abre apps, clica em botões e ícones pelo nome, digita e usa atalhos.",
5
5
  "main": "bin/primocode.js",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "scripts": {
10
10
  "start": "node bin/primocode.js",
11
- "test": "node test/tools.test.js && node test/ui.test.js && node test/modo.test.js && node test/pasta.test.js && node test/catalogo.test.js && node test/desktop.test.js && node test/effort.test.js && node test/claude-engine.test.js && node test/regressao.test.js && node test/memoria-conversa.test.js && node test/repeticao.test.js && node test/referencia.test.js && node test/parar.test.js && node test/continuar.test.js && node test/studio-spec.test.js && node test/studio-versoes.test.js && node test/voz.test.js && node test/editor.test.js && node test/estudio-projeto.test.js && node test/vocabulario.test.js && node test/video-export.test.js && node test/monotonia.test.js && node test/clipe.test.js && node test/midia-envio.test.js && node test/pausas.test.js && node test/fala-repetida.test.js && node test/trilha.test.js && node test/anuncio.test.js && node test/pipeline.test.js && node test/app.test.js && node test/elementos.test.js && node test/remotion.test.js && node test/aplicativo.test.js && node test/conta.test.mjs && node test/nuvem.test.js && node test/codex.test.js && node test/chaves.test.js && node test/prazo.test.js && node test/primeira-vez.test.js && node test/janela.test.js && node test/pareamento.test.js && node test/fala.test.js && node test/especialistas.test.js && node test/icone.test.js && node test/exportar.test.js && node test/ate-o-fim.test.js && node test/motion.test.js && node test/audio-marca.test.js"
11
+ "test": "node test/tools.test.js && node test/ui.test.js && node test/modo.test.js && node test/pasta.test.js && node test/catalogo.test.js && node test/desktop.test.js && node test/effort.test.js && node test/claude-engine.test.js && node test/regressao.test.js && node test/memoria-conversa.test.js && node test/repeticao.test.js && node test/referencia.test.js && node test/parar.test.js && node test/continuar.test.js && node test/studio-spec.test.js && node test/studio-versoes.test.js && node test/voz.test.js && node test/editor.test.js && node test/estudio-projeto.test.js && node test/vocabulario.test.js && node test/video-export.test.js && node test/monotonia.test.js && node test/clipe.test.js && node test/midia-envio.test.js && node test/pausas.test.js && node test/fala-repetida.test.js && node test/trilha.test.js && node test/anuncio.test.js && node test/pipeline.test.js && node test/app.test.js && node test/elementos.test.js && node test/remotion.test.js && node test/aplicativo.test.js && node test/conta.test.mjs && node test/nuvem.test.js && node test/codex.test.js && node test/chaves.test.js && node test/prazo.test.js && node test/primeira-vez.test.js && node test/janela.test.js && node test/pareamento.test.js && node test/fala.test.js && node test/especialistas.test.js && node test/icone.test.js && node test/exportar.test.js && node test/ate-o-fim.test.js && node test/motion.test.js && node test/audio-marca.test.js && node test/diretor.test.js"
12
12
  },
13
13
  "engines": {
14
14
  "node": ">=18.17.0"
@@ -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
- }