primocode 10.19.0 → 11.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.
Files changed (116) hide show
  1. package/LICENSES/opencode-MIT.txt +24 -0
  2. package/LICENSES/pptxgenjs-MIT.txt +31 -0
  3. package/README.md +16 -3
  4. package/agentes/acessibilidade.md +10 -0
  5. package/agentes/ambiente.md +10 -0
  6. package/agentes/api.md +10 -0
  7. package/agentes/backend.md +10 -0
  8. package/agentes/copy.md +10 -0
  9. package/agentes/css-layout.md +10 -0
  10. package/agentes/dados.md +10 -0
  11. package/agentes/depuracao.md +10 -0
  12. package/agentes/design.md +10 -0
  13. package/agentes/docs.md +10 -0
  14. package/agentes/frontend.md +10 -0
  15. package/agentes/geral/capacidades/arquivos.json +132 -0
  16. package/agentes/geral/capacidades/codigo.json +132 -0
  17. package/agentes/geral/capacidades/dados.json +126 -0
  18. package/agentes/geral/capacidades/depuracao.json +126 -0
  19. package/agentes/geral/capacidades/escrita.json +126 -0
  20. package/agentes/geral/capacidades/git.json +126 -0
  21. package/agentes/geral/capacidades/pesquisa.json +126 -0
  22. package/agentes/geral/capacidades/seguranca.json +132 -0
  23. package/agentes/geral/capacidades/shell.json +132 -0
  24. package/agentes/geral/capacidades/web.json +126 -0
  25. package/agentes/git-pr.md +10 -0
  26. package/agentes/indice.md +86 -0
  27. package/agentes/nextjs.md +10 -0
  28. package/agentes/node.md +10 -0
  29. package/agentes/performance.md +10 -0
  30. package/agentes/pesquisa.md +10 -0
  31. package/agentes/python.md +10 -0
  32. package/agentes/react.md +10 -0
  33. package/agentes/refatoracao.md +10 -0
  34. package/agentes/revisor.md +10 -0
  35. package/agentes/seguranca.md +10 -0
  36. package/agentes/sql.md +10 -0
  37. package/agentes/testes.md +10 -0
  38. package/agentes/typescript.md +10 -0
  39. package/agentes/ux.md +10 -0
  40. package/bin/primocode.js +65 -8
  41. package/editor/helpers/camera_viva.py +28 -2
  42. package/lib/act.js +79 -10
  43. package/lib/agentes/index.js +146 -0
  44. package/lib/agentes/nucleo.js +18 -0
  45. package/lib/catalogo.js +12 -2
  46. package/lib/cli/review.js +64 -0
  47. package/lib/cli/subcomandos.js +34 -0
  48. package/lib/cli/tentativas.js +107 -0
  49. package/lib/cli/util.js +51 -0
  50. package/lib/comandos-extra.js +4 -2
  51. package/lib/editor-pro-maquina.js +165 -0
  52. package/lib/editor-pro.js +10 -7
  53. package/lib/entregaveis/cli.js +26 -0
  54. package/lib/entregaveis/especialistas.js +50 -0
  55. package/lib/entregaveis/nucleo.js +111 -0
  56. package/lib/entregaveis/slides.js +221 -0
  57. package/lib/estudio/materiais.js +172 -0
  58. package/lib/fundo.js +34 -1
  59. package/lib/kits.js +41 -2
  60. package/lib/nomes.js +6 -0
  61. package/lib/placar.js +173 -0
  62. package/lib/plugin/autoteste.js +99 -0
  63. package/lib/plugin/edicao-visual.js +133 -0
  64. package/lib/plugin/pesquisar.js +92 -0
  65. package/lib/plugin/preview-cli.js +38 -0
  66. package/lib/plugin/preview.js +89 -0
  67. package/lib/plugin/tunel.js +27 -0
  68. package/lib/review.js +134 -0
  69. package/lib/session/compactacao.js +124 -0
  70. package/lib/statusline.js +52 -0
  71. package/lib/tool/diagnostico.js +100 -0
  72. package/lib/tool/perguntar.js +60 -0
  73. package/lib/tool/reparar-entrada.js +66 -0
  74. package/lib/tool/web.js +102 -0
  75. package/lib/tools.js +20 -1
  76. package/lib/ui.js +1 -1
  77. package/materiais/saas-linear/base.ts +84 -0
  78. package/materiais/saas-linear/camera/Camera.tsx +38 -0
  79. package/materiais/saas-linear/fontes/OFL-Inter.txt +93 -0
  80. package/materiais/saas-linear/fontes/OFL-Newsreader.txt +93 -0
  81. package/materiais/saas-linear/fontes/inter-400.woff2 +0 -0
  82. package/materiais/saas-linear/fontes/inter-600.woff2 +0 -0
  83. package/materiais/saas-linear/fontes/newsreader-400.woff2 +0 -0
  84. package/materiais/saas-linear/formas/Agenda.tsx +46 -0
  85. package/materiais/saas-linear/formas/CaixaPrompt.tsx +41 -0
  86. package/materiais/saas-linear/formas/CartoesIntegracao.tsx +57 -0
  87. package/materiais/saas-linear/formas/Cursor.tsx +40 -0
  88. package/materiais/saas-linear/formas/Menu.tsx +46 -0
  89. package/materiais/saas-linear/formas/Monitor.tsx +28 -0
  90. package/materiais/saas-linear/paleta.json +18 -0
  91. package/materiais/saas-linear/pecas.json +590 -0
  92. package/materiais/saas-linear/regras.md +40 -0
  93. package/materiais/saas-linear/sons/Som.tsx +39 -0
  94. package/materiais/saas-linear/sons/assinatura.mp3 +0 -0
  95. package/materiais/saas-linear/sons/clique.mp3 +0 -0
  96. package/materiais/saas-linear/sons/impacto.mp3 +0 -0
  97. package/materiais/saas-linear/sons/pop-cartao.mp3 +0 -0
  98. package/materiais/saas-linear/sons/pop-palavra.mp3 +0 -0
  99. package/materiais/saas-linear/sons/subida.mp3 +0 -0
  100. package/materiais/saas-linear/sons/swoosh.mp3 +0 -0
  101. package/materiais/saas-linear/sons/trilha.mp3 +0 -0
  102. package/materiais/saas-linear/sons/whoosh-entra.mp3 +0 -0
  103. package/materiais/saas-linear/sons/whoosh-sai.mp3 +0 -0
  104. package/materiais/saas-linear/texturas/Fundo.tsx +18 -0
  105. package/materiais/saas-linear/texturas/Particulas.tsx +22 -0
  106. package/materiais/saas-linear/tipografia/FraseSerifa.tsx +25 -0
  107. package/materiais/saas-linear/tipografia/Marca.tsx +20 -0
  108. package/materiais/saas-linear/tipografia/MarcaFinal.tsx +22 -0
  109. package/materiais/saas-linear/tipografia/Saudacao.tsx +27 -0
  110. package/materiais/saas-linear/transicoes/Cena.tsx +38 -0
  111. package/materiais/saas-linear/transicoes/CorteImpacto.tsx +16 -0
  112. package/package.json +3 -1
  113. package/skills/deck-conferido/SKILL.md +29 -0
  114. package/vendor/pptxgenjs/carregar.js +12 -0
  115. package/vendor/pptxgenjs/jszip.min.js +13 -0
  116. package/vendor/pptxgenjs/pptxgen.cjs.js +7370 -0
@@ -0,0 +1,590 @@
1
+ {
2
+ "estilo": "saas-linear",
3
+ "nome": "SaaS · produto em acao",
4
+ "versao": 1,
5
+ "fps": 30,
6
+ "pecas": [
7
+ {
8
+ "nome": "Monitor",
9
+ "categoria": "formas",
10
+ "tipo": "componente",
11
+ "arquivo": "formas/Monitor.tsx",
12
+ "descricao": "Aparelho com borda fina e pé que segura as camadas dentro da tela 1500x940 (envolve as camadas de UI).",
13
+ "params": [
14
+ "semAparelho?",
15
+ "borda?",
16
+ "children"
17
+ ],
18
+ "duracao": null,
19
+ "tags": [
20
+ "moldura",
21
+ "3d",
22
+ "produto"
23
+ ]
24
+ },
25
+ {
26
+ "nome": "Agenda",
27
+ "categoria": "formas",
28
+ "tipo": "componente",
29
+ "arquivo": "formas/Agenda.tsx",
30
+ "descricao": "Painel de semana cujos blocos coloridos crescem um a um, com check opcional.",
31
+ "params": [
32
+ "titulo",
33
+ "dias",
34
+ "blocos",
35
+ "inicio?",
36
+ "intervalo?",
37
+ "marcar?",
38
+ "marcarEm?",
39
+ "x?",
40
+ "y?",
41
+ "largura?",
42
+ "altura?"
43
+ ],
44
+ "duracao": [
45
+ 30,
46
+ 90
47
+ ],
48
+ "tags": [
49
+ "ui",
50
+ "lista",
51
+ "dados"
52
+ ]
53
+ },
54
+ {
55
+ "nome": "CaixaPrompt",
56
+ "categoria": "formas",
57
+ "tipo": "componente",
58
+ "arquivo": "formas/CaixaPrompt.tsx",
59
+ "descricao": "Caixa de pedido branca com texto digitado letra a letra, botao + e botao de enviar.",
60
+ "params": [
61
+ "placeholder",
62
+ "digitar?",
63
+ "digitarEm?",
64
+ "atalhos?",
65
+ "inicio?",
66
+ "apertarMais?",
67
+ "x?",
68
+ "y?",
69
+ "largura?"
70
+ ],
71
+ "duracao": [
72
+ 40,
73
+ 120
74
+ ],
75
+ "tags": [
76
+ "ui",
77
+ "texto",
78
+ "ia"
79
+ ]
80
+ },
81
+ {
82
+ "nome": "CartoesIntegracao",
83
+ "categoria": "formas",
84
+ "tipo": "componente",
85
+ "arquivo": "formas/CartoesIntegracao.tsx",
86
+ "descricao": "Fileira de cartoes de conector que sobem em sequencia e ligam a chave (desconectado para conectado).",
87
+ "params": [
88
+ "cartoes",
89
+ "inicio?",
90
+ "intervalo?",
91
+ "foco?",
92
+ "x?",
93
+ "y?",
94
+ "largura?"
95
+ ],
96
+ "duracao": [
97
+ 36,
98
+ 90
99
+ ],
100
+ "tags": [
101
+ "ui",
102
+ "lista",
103
+ "integracao"
104
+ ]
105
+ },
106
+ {
107
+ "nome": "Menu",
108
+ "categoria": "formas",
109
+ "tipo": "componente",
110
+ "arquivo": "formas/Menu.tsx",
111
+ "descricao": "Popover de menu com icones e faixa de selecao que desce pelos itens.",
112
+ "params": [
113
+ "itens",
114
+ "inicio?",
115
+ "passar?",
116
+ "fechar?",
117
+ "x?",
118
+ "y?",
119
+ "largura?"
120
+ ],
121
+ "duracao": [
122
+ 30,
123
+ 80
124
+ ],
125
+ "tags": [
126
+ "ui",
127
+ "lista",
128
+ "interacao"
129
+ ]
130
+ },
131
+ {
132
+ "nome": "Cursor",
133
+ "categoria": "formas",
134
+ "tipo": "componente",
135
+ "arquivo": "formas/Cursor.tsx",
136
+ "descricao": "Mao/cursor que viaja entre pontos e clica soltando um anel; todo clique deve causar algo.",
137
+ "params": [
138
+ "pontos",
139
+ "cliques?",
140
+ "inicio?",
141
+ "fim?",
142
+ "mao?",
143
+ "tamanho?"
144
+ ],
145
+ "duracao": [
146
+ 20,
147
+ 150
148
+ ],
149
+ "tags": [
150
+ "interacao",
151
+ "guia"
152
+ ]
153
+ },
154
+ {
155
+ "nome": "Fundo",
156
+ "categoria": "texturas",
157
+ "tipo": "componente",
158
+ "arquivo": "texturas/Fundo.tsx",
159
+ "descricao": "Parede quente com luz lateral que respira e mesa; com claro vira o creme da interface.",
160
+ "params": [
161
+ "claro?"
162
+ ],
163
+ "duracao": null,
164
+ "tags": [
165
+ "fundo",
166
+ "luz"
167
+ ]
168
+ },
169
+ {
170
+ "nome": "Particulas",
171
+ "categoria": "texturas",
172
+ "tipo": "componente",
173
+ "arquivo": "texturas/Particulas.tsx",
174
+ "descricao": "Camada de pontos e tracos flutuando em 3 profundidades (movimento de fundo constante).",
175
+ "params": [
176
+ "quantidade?",
177
+ "cor?",
178
+ "semente?",
179
+ "velocidade?",
180
+ "opacidade?"
181
+ ],
182
+ "duracao": null,
183
+ "tags": [
184
+ "fundo",
185
+ "movimento",
186
+ "densidade"
187
+ ]
188
+ },
189
+ {
190
+ "nome": "Cena",
191
+ "categoria": "transicoes",
192
+ "tipo": "componente",
193
+ "arquivo": "transicoes/Cena.tsx",
194
+ "descricao": "Janela de tempo com entrada suave/subir/corte e saida com desfoque que cruza 10 quadros com a proxima.",
195
+ "params": [
196
+ "de",
197
+ "ate",
198
+ "entrada?",
199
+ "ultima?",
200
+ "children"
201
+ ],
202
+ "duracao": [
203
+ 24,
204
+ 150
205
+ ],
206
+ "tags": [
207
+ "corte",
208
+ "troca",
209
+ "tempo"
210
+ ]
211
+ },
212
+ {
213
+ "nome": "CorteImpacto",
214
+ "categoria": "transicoes",
215
+ "tipo": "componente",
216
+ "arquivo": "transicoes/CorteImpacto.tsx",
217
+ "descricao": "Soco de corte: clarao, tremida e zoom-pop que decaem em ~10 quadros.",
218
+ "params": [
219
+ "em",
220
+ "forca?",
221
+ "clarao?",
222
+ "children"
223
+ ],
224
+ "duracao": [
225
+ 10,
226
+ 14
227
+ ],
228
+ "tags": [
229
+ "corte",
230
+ "impacto",
231
+ "energia"
232
+ ]
233
+ },
234
+ {
235
+ "nome": "FraseSerifa",
236
+ "categoria": "tipografia",
237
+ "tipo": "componente",
238
+ "arquivo": "tipografia/FraseSerifa.tsx",
239
+ "descricao": "Frase em serifa que nasce palavra a palavra (desfoque para nitido), *palavra* em acento.",
240
+ "params": [
241
+ "texto",
242
+ "x?",
243
+ "y?",
244
+ "tamanho?",
245
+ "largura?",
246
+ "inicio?",
247
+ "intervalo?",
248
+ "sair?"
249
+ ],
250
+ "duracao": [
251
+ 30,
252
+ 90
253
+ ],
254
+ "tags": [
255
+ "texto",
256
+ "serifa"
257
+ ]
258
+ },
259
+ {
260
+ "nome": "Saudacao",
261
+ "categoria": "tipografia",
262
+ "tipo": "componente",
263
+ "arquivo": "tipografia/Saudacao.tsx",
264
+ "descricao": "Saudacao em serifa grande com a flor que abre antes das palavras.",
265
+ "params": [
266
+ "texto",
267
+ "x?",
268
+ "y?",
269
+ "tamanho?",
270
+ "inicio?",
271
+ "intervalo?",
272
+ "marca?",
273
+ "marcaSrc?"
274
+ ],
275
+ "duracao": [
276
+ 40,
277
+ 100
278
+ ],
279
+ "tags": [
280
+ "texto",
281
+ "abertura"
282
+ ]
283
+ },
284
+ {
285
+ "nome": "Marca",
286
+ "categoria": "tipografia",
287
+ "tipo": "componente",
288
+ "arquivo": "tipografia/Marca.tsx",
289
+ "descricao": "Flor de quatro petalas que gira e abre em 16 quadros; aceita logo do cliente.",
290
+ "params": [
291
+ "tamanho?",
292
+ "cor?",
293
+ "inicio?",
294
+ "src?",
295
+ "girar?"
296
+ ],
297
+ "duracao": [
298
+ 16,
299
+ 60
300
+ ],
301
+ "tags": [
302
+ "logo",
303
+ "sinal"
304
+ ]
305
+ },
306
+ {
307
+ "nome": "MarcaFinal",
308
+ "categoria": "tipografia",
309
+ "tipo": "componente",
310
+ "arquivo": "tipografia/MarcaFinal.tsx",
311
+ "descricao": "Fecho: flor + nome revelado por mascara, com linha de apoio.",
312
+ "params": [
313
+ "nome",
314
+ "apoio?",
315
+ "x?",
316
+ "y?",
317
+ "tamanho?",
318
+ "inicio?",
319
+ "marcaSrc?"
320
+ ],
321
+ "duracao": [
322
+ 36,
323
+ 90
324
+ ],
325
+ "tags": [
326
+ "logo",
327
+ "fecho"
328
+ ]
329
+ },
330
+ {
331
+ "nome": "Camera",
332
+ "categoria": "camera",
333
+ "tipo": "componente",
334
+ "arquivo": "camera/Camera.tsx",
335
+ "descricao": "Camera 3D com perspectiva: chaves {em,z,x,y} levam do plano aberto (z0) ao fechado (z1) e alem; deriva constante.",
336
+ "params": [
337
+ "chaves?",
338
+ "children"
339
+ ],
340
+ "duracao": null,
341
+ "tags": [
342
+ "3d",
343
+ "camera",
344
+ "movimento"
345
+ ]
346
+ },
347
+ {
348
+ "nome": "whoosh-entra",
349
+ "categoria": "sons",
350
+ "tipo": "audio",
351
+ "arquivo": "sons/whoosh-entra.mp3",
352
+ "descricao": "Passagem de ar que entra (camera aproximando, cena nascendo).",
353
+ "params": [
354
+ "em",
355
+ "volume?"
356
+ ],
357
+ "duracao": [
358
+ 30,
359
+ 30
360
+ ],
361
+ "volumeSugerido": 0.9,
362
+ "tags": [
363
+ "sfx",
364
+ "entrada"
365
+ ]
366
+ },
367
+ {
368
+ "nome": "whoosh-sai",
369
+ "categoria": "sons",
370
+ "tipo": "audio",
371
+ "arquivo": "sons/whoosh-sai.mp3",
372
+ "descricao": "Passagem de ar que sai (troca de tela).",
373
+ "params": [
374
+ "em",
375
+ "volume?"
376
+ ],
377
+ "duracao": [
378
+ 30,
379
+ 30
380
+ ],
381
+ "volumeSugerido": 0.8,
382
+ "tags": [
383
+ "sfx",
384
+ "saida"
385
+ ]
386
+ },
387
+ {
388
+ "nome": "swoosh",
389
+ "categoria": "sons",
390
+ "tipo": "audio",
391
+ "arquivo": "sons/swoosh.mp3",
392
+ "descricao": "Varrida curta para menu abrindo ou painel entrando.",
393
+ "params": [
394
+ "em",
395
+ "volume?"
396
+ ],
397
+ "duracao": [
398
+ 30,
399
+ 30
400
+ ],
401
+ "volumeSugerido": 1,
402
+ "tags": [
403
+ "sfx",
404
+ "entrada"
405
+ ]
406
+ },
407
+ {
408
+ "nome": "pop-palavra",
409
+ "categoria": "sons",
410
+ "tipo": "audio",
411
+ "arquivo": "sons/pop-palavra.mp3",
412
+ "descricao": "Estalo leve para palavra ou frase comecando, check.",
413
+ "params": [
414
+ "em",
415
+ "volume?"
416
+ ],
417
+ "duracao": [
418
+ 18,
419
+ 18
420
+ ],
421
+ "volumeSugerido": 1,
422
+ "tags": [
423
+ "sfx",
424
+ "texto"
425
+ ]
426
+ },
427
+ {
428
+ "nome": "pop-cartao",
429
+ "categoria": "sons",
430
+ "tipo": "audio",
431
+ "arquivo": "sons/pop-cartao.mp3",
432
+ "descricao": "Estalo de cartao, chave ligando, bloco enchendo.",
433
+ "params": [
434
+ "em",
435
+ "volume?"
436
+ ],
437
+ "duracao": [
438
+ 21,
439
+ 21
440
+ ],
441
+ "volumeSugerido": 0.9,
442
+ "tags": [
443
+ "sfx",
444
+ "ui"
445
+ ]
446
+ },
447
+ {
448
+ "nome": "clique",
449
+ "categoria": "sons",
450
+ "tipo": "audio",
451
+ "arquivo": "sons/clique.mp3",
452
+ "descricao": "Clique seco de botao, 1 quadro antes do aperto do cursor.",
453
+ "params": [
454
+ "em",
455
+ "volume?"
456
+ ],
457
+ "duracao": [
458
+ 15,
459
+ 15
460
+ ],
461
+ "volumeSugerido": 0.8,
462
+ "tags": [
463
+ "sfx",
464
+ "interacao"
465
+ ]
466
+ },
467
+ {
468
+ "nome": "impacto",
469
+ "categoria": "sons",
470
+ "tipo": "audio",
471
+ "arquivo": "sons/impacto.mp3",
472
+ "descricao": "Batida grave de climax; casar com CorteImpacto.",
473
+ "params": [
474
+ "em",
475
+ "volume?"
476
+ ],
477
+ "duracao": [
478
+ 42,
479
+ 42
480
+ ],
481
+ "volumeSugerido": 0.85,
482
+ "tags": [
483
+ "sfx",
484
+ "impacto"
485
+ ]
486
+ },
487
+ {
488
+ "nome": "subida",
489
+ "categoria": "sons",
490
+ "tipo": "audio",
491
+ "arquivo": "sons/subida.mp3",
492
+ "descricao": "Riser que cresce ate o fecho.",
493
+ "params": [
494
+ "em",
495
+ "volume?"
496
+ ],
497
+ "duracao": [
498
+ 45,
499
+ 45
500
+ ],
501
+ "volumeSugerido": 0.7,
502
+ "tags": [
503
+ "sfx",
504
+ "tensao"
505
+ ]
506
+ },
507
+ {
508
+ "nome": "assinatura",
509
+ "categoria": "sons",
510
+ "tipo": "audio",
511
+ "arquivo": "sons/assinatura.mp3",
512
+ "descricao": "Sting de logo para o nome da marca revelando.",
513
+ "params": [
514
+ "em",
515
+ "volume?"
516
+ ],
517
+ "duracao": [
518
+ 66,
519
+ 66
520
+ ],
521
+ "volumeSugerido": 0.9,
522
+ "tags": [
523
+ "sfx",
524
+ "marca"
525
+ ]
526
+ },
527
+ {
528
+ "nome": "trilha",
529
+ "categoria": "sons",
530
+ "tipo": "audio",
531
+ "arquivo": "sons/trilha.mp3",
532
+ "descricao": "Trilha de 9 s a 100 bpm (1 batida = 18 quadros), quente; repetir em laco para videos longos.",
533
+ "params": [
534
+ "volume?",
535
+ "saida?"
536
+ ],
537
+ "duracao": [
538
+ 270,
539
+ 270
540
+ ],
541
+ "bpm": 100,
542
+ "tags": [
543
+ "trilha",
544
+ "musica"
545
+ ]
546
+ },
547
+ {
548
+ "nome": "Som",
549
+ "categoria": "sons",
550
+ "tipo": "componente",
551
+ "arquivo": "sons/Som.tsx",
552
+ "descricao": "Componentes Efeito (um som no quadro em) e Trilha (musica com fade de saida) que tocam os audios acima.",
553
+ "params": [
554
+ "som",
555
+ "em",
556
+ "volume?"
557
+ ],
558
+ "duracao": null,
559
+ "tags": [
560
+ "audio",
561
+ "codigo"
562
+ ]
563
+ },
564
+ {
565
+ "nome": "paleta",
566
+ "categoria": "paleta",
567
+ "tipo": "dados",
568
+ "arquivo": "paleta.json",
569
+ "descricao": "Cores, sombras, area segura, curvas e medidas do estilo.",
570
+ "params": [],
571
+ "duracao": null,
572
+ "tags": [
573
+ "cor"
574
+ ]
575
+ },
576
+ {
577
+ "nome": "base",
578
+ "categoria": "paleta",
579
+ "tipo": "componente",
580
+ "arquivo": "base.ts",
581
+ "descricao": "Constantes e curvas de easing (e3, e4, eb, seg, lerp), fontes e medidas da tela; todas as pecas importam daqui.",
582
+ "params": [],
583
+ "duracao": null,
584
+ "tags": [
585
+ "easing",
586
+ "tokens"
587
+ ]
588
+ }
589
+ ]
590
+ }
@@ -0,0 +1,40 @@
1
+ # Regras do estilo saas-linear (produto em ação)
2
+
3
+ Estas regras valem para QUEM MONTA. Não existe vídeo pronto aqui: só peças (`pecas.json`). Cada cena é escrita do zero.
4
+
5
+ ## Identidade (não negociável)
6
+ - Fundo: parede quente `#3B1E19` + luz `#6A3426`; tela do produto creme `#F4F1EA`; acento coral `#D46F4D` só na flor e no botão enviar; azul `#3D7BF0` só em "ligado"/clique.
7
+ - Serifa Newsreader só em saudação, frase e nome; Inter em toda a interface. Frase em minúscula normal, nunca caixa alta.
8
+ - Área segura: texto entre y 168-1330 e x 80-1000 do vídeo. Na tela do monitor: x 290-1210. Câmera com zoom pode cortar borda, mas alvo do clique e palavra lida ficam inteiros.
9
+ - Conteúdo: nunca logo de marca real; o cliente troca acento, nome e logo (`marcaSrc`).
10
+
11
+ ## Movimento (régua: extravagante; liso e calmo é reprovado)
12
+ - Easing: `e4` (saída rápida, pouso longo) como padrão; `e3` em câmera e cursor; `eb` (overshoot ~4%) em cartão e bloco.
13
+ - A câmera nunca para: sempre ao menos 2 chaves com mudança de `z` e de `x/y`, e uma chave a cada cena. Em cada corte, um `CorteImpacto`.
14
+ - Toda cena tem fundo vivo (`Particulas` + `Fundo`), pelo menos 1 herói e 2 apoios em movimento.
15
+ - Entrada de elemento: 12-18 quadros. Saída: metade da entrada. Stagger entre itens: 2-5 quadros.
16
+ - Pausa de leitura: frase assentada >= 8 quadros antes de sair; saudação >= 12.
17
+ - Cursor: >= 12 quadros de viagem entre alvos; >= 6 parado antes do clique; clique 2 quadros antes do efeito.
18
+
19
+ ## Ritmo
20
+ - Trilha 100 bpm: 1 batida = 18 quadros. Cortes nas batidas (múltiplos de 18) ou na voz.
21
+ - Cena curta: 36-90 quadros. Vídeo de 15 s tem 6-9 cenas.
22
+
23
+ ## Som (camadas)
24
+ - Trilha sempre, volume 0,45, fade de saída 20 quadros.
25
+ - SFX em TODO corte (1-2 quadros antes do visual) e em todo clique, pop de cartão e entrada de texto.
26
+ - No mínimo 2 camadas de SFX por corte (ex.: `whoosh-sai` + `impacto`, ou `swoosh` + `pop-cartao`). Máx. 6 efeitos por segundo. Nunca o mesmo arquivo duas vezes seguidas no mesmo quadro.
27
+
28
+ ## Densidade mínima (o auto-conferir cobra isto)
29
+ | medida | mínimo |
30
+ |---|---|
31
+ | camadas visuais simultâneas por cena | 4 (fundo, partículas, herói, apoio) |
32
+ | elementos em movimento por segundo | 5 |
33
+ | chaves de câmera por vídeo | 4 |
34
+ | SFX por corte | 1 (alvo 2) |
35
+ | peças diferentes usadas no vídeo | 6 |
36
+
37
+ ## Proibido
38
+ - Copiar uma cena pronta: cada cena é composta peça a peça, com props novas.
39
+ - Cena parada: nenhum quadro em que nada se mexe.
40
+ - Elemento sem som quando entra com movimento grande.
@@ -0,0 +1,39 @@
1
+ // Som: efeitos e trilha do kit, sintetizados no MotionCraft (ver assets/ASSETS.md).
2
+ // Regra: um som por movimento que importa, 1 a 2 quadros ANTES do visual.
3
+ import React from 'react';
4
+ import {Audio, Sequence, interpolate, useVideoConfig} from 'remotion';
5
+ import whooshEntra from './whoosh-entra.mp3';
6
+ import whooshSai from './whoosh-sai.mp3';
7
+ import swoosh from './swoosh.mp3';
8
+ import popPalavra from './pop-palavra.mp3';
9
+ import popCartao from './pop-cartao.mp3';
10
+ import clique from './clique.mp3';
11
+ import impacto from './impacto.mp3';
12
+ import subida from './subida.mp3';
13
+ import assinatura from './assinatura.mp3';
14
+ import trilha from './trilha.mp3';
15
+
16
+ export const SONS = {
17
+ 'whoosh-entra': whooshEntra, 'whoosh-sai': whooshSai, swoosh, 'pop-palavra': popPalavra, 'pop-cartao': popCartao,
18
+ clique, impacto, subida, assinatura,
19
+ } as const;
20
+ export type NomeSom = keyof typeof SONS;
21
+
22
+ // volume de cada efeito (0..1) já calibrado contra a trilha a 0,5
23
+ const VOLUME: Record<NomeSom, number> = {
24
+ 'whoosh-entra': 0.9, 'whoosh-sai': 0.8, swoosh: 1, 'pop-palavra': 1, 'pop-cartao': 0.9, clique: 0.8, impacto: 0.85, subida: 0.7, assinatura: 0.9,
25
+ };
26
+
27
+ export type EfeitoProps = {som: NomeSom; em: number; volume?: number};
28
+ /** um efeito no quadro `em` (absoluto, ou relativo à Cena se estiver dentro de uma) */
29
+ export const Efeito: React.FC<EfeitoProps> = ({som, em, volume}) =>
30
+ <Sequence from={Math.max(0, Math.round(em))} durationInFrames={90} layout="none">
31
+ <Audio src={SONS[som]} volume={volume ?? VOLUME[som]} />
32
+ </Sequence>;
33
+
34
+ export type TrilhaProps = {volume?: number; /** quadros de fade no fim */ saida?: number};
35
+ /** a trilha do kit, do quadro 0 ao fim, com fade de saída */
36
+ export const Trilha: React.FC<TrilhaProps> = ({volume = 0.5, saida = 20}) => {
37
+ const {durationInFrames} = useVideoConfig();
38
+ return <Audio src={trilha} volume={(f) => volume * interpolate(f, [durationInFrames - saida, durationInFrames], [1, 0], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'})} />;
39
+ };