primocode 11.0.0 → 11.2.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/README.md +18 -4
- package/agentes/algoritmos.md +10 -0
- package/agentes/angular.md +10 -0
- package/agentes/animacao-web.md +10 -0
- package/agentes/anuncios.md +10 -0
- package/agentes/apresentacao.md +10 -0
- package/agentes/arquitetura.md +10 -0
- package/agentes/audio.md +10 -0
- package/agentes/auth.md +10 -0
- package/agentes/automacao.md +10 -0
- package/agentes/bash.md +10 -0
- package/agentes/blockchain.md +10 -0
- package/agentes/brand.md +10 -0
- package/agentes/canvas.md +10 -0
- package/agentes/ci-cd.md +10 -0
- package/agentes/cloud.md +10 -0
- package/agentes/cores.md +10 -0
- package/agentes/cpp.md +10 -0
- package/agentes/csharp.md +10 -0
- package/agentes/css-layout.md +1 -1
- package/agentes/dados-sql-analise.md +10 -0
- package/agentes/depuracao.md +1 -1
- package/agentes/design-system.md +10 -0
- package/agentes/docker.md +10 -0
- package/agentes/electron.md +10 -0
- package/agentes/email-mkt.md +10 -0
- package/agentes/extensao-chrome.md +10 -0
- package/agentes/filas.md +10 -0
- package/agentes/firebase.md +10 -0
- package/agentes/flutter.md +10 -0
- package/agentes/games.md +10 -0
- package/agentes/geral/capacidades/backend.json +246 -0
- package/agentes/geral/capacidades/banco.json +186 -0
- package/agentes/geral/capacidades/codigo.json +576 -0
- package/agentes/geral/capacidades/depuracao.json +570 -0
- package/agentes/geral/capacidades/design.json +246 -0
- package/agentes/geral/capacidades/devops.json +240 -0
- package/agentes/geral/capacidades/frontend.json +252 -0
- package/agentes/geral/capacidades/git.json +558 -0
- package/agentes/geral/capacidades/ia-llm.json +246 -0
- package/agentes/geral/capacidades/marketing.json +252 -0
- package/agentes/geral/capacidades/mobile.json +192 -0
- package/agentes/geral/capacidades/produto-negocio.json +186 -0
- package/agentes/geral/capacidades/shell.json +522 -0
- package/agentes/geral/capacidades/testes.json +186 -0
- package/agentes/geral/capacidades/video-motion.json +246 -0
- package/agentes/geral/capacidades/windows-linux.json +216 -0
- package/agentes/go.md +10 -0
- package/agentes/graphql.md +10 -0
- package/agentes/growth.md +10 -0
- package/agentes/ia-evals.md +10 -0
- package/agentes/ilustracao.md +10 -0
- package/agentes/indice.md +1 -86
- package/agentes/iot.md +10 -0
- package/agentes/java.md +10 -0
- package/agentes/javascript.md +10 -0
- package/agentes/juridico-basico.md +10 -0
- package/agentes/kotlin.md +10 -0
- package/agentes/kubernetes.md +10 -0
- package/agentes/landing.md +10 -0
- package/agentes/legado.md +10 -0
- package/agentes/linux.md +10 -0
- package/agentes/llm-prompts.md +10 -0
- package/agentes/mcp.md +10 -0
- package/agentes/ml.md +10 -0
- package/agentes/mongodb.md +10 -0
- package/agentes/motion.md +10 -0
- package/agentes/negocio.md +10 -0
- package/agentes/observabilidade.md +10 -0
- package/agentes/orm.md +10 -0
- package/agentes/pagamentos.md +10 -0
- package/agentes/pentest.md +10 -0
- package/agentes/performance.md +1 -1
- package/agentes/pesquisa-usuario.md +10 -0
- package/agentes/php.md +10 -0
- package/agentes/planilhas.md +10 -0
- package/agentes/privacidade.md +10 -0
- package/agentes/produto.md +10 -0
- package/agentes/pwa.md +10 -0
- package/agentes/qa-manual.md +10 -0
- package/agentes/raspagem.md +10 -0
- package/agentes/react-native.md +10 -0
- package/agentes/rede.md +10 -0
- package/agentes/redis.md +10 -0
- package/agentes/regex.md +10 -0
- package/agentes/revisao-texto.md +10 -0
- package/agentes/ruby.md +10 -0
- package/agentes/rust.md +10 -0
- package/agentes/seo.md +10 -0
- package/agentes/social.md +10 -0
- package/agentes/svelte.md +10 -0
- package/agentes/swift.md +10 -0
- package/agentes/tailwind.md +10 -0
- package/agentes/testes-carga.md +10 -0
- package/agentes/testes-e2e.md +10 -0
- package/agentes/testes-unit.md +10 -0
- package/agentes/thumbnails.md +10 -0
- package/agentes/tipografia.md +10 -0
- package/agentes/traducao.md +10 -0
- package/agentes/ui-mobile.md +10 -0
- package/agentes/video-edicao.md +10 -0
- package/agentes/video-roteiro.md +10 -0
- package/agentes/visualizacao.md +10 -0
- package/agentes/vue.md +10 -0
- package/agentes/web3d.md +10 -0
- package/agentes/websocket.md +10 -0
- package/bin/primocode-rpc.js +100 -0
- package/bin/primocode.js +3 -4209
- package/editor/modelo-projeto/build.py +12 -4
- package/kits/KITS.md +4 -0
- package/lib/agentes/index.js +47 -4
- package/lib/agentes/nucleo.js +1 -1
- package/lib/agentes-pessoais.js +117 -0
- package/lib/agents-md.js +1 -1
- package/lib/app-chat.js +1 -1
- package/lib/app-server/cli.js +61 -0
- package/lib/app-server/index.js +3 -0
- package/lib/app-server/pareamento.js +61 -0
- package/lib/app-server/protocolo.js +86 -0
- package/lib/app-server/servidor.js +685 -0
- package/lib/app-server/websocket.js +87 -0
- package/lib/avisos.js +64 -0
- package/lib/backup-banco.js +1 -1
- package/lib/browser.js +7 -3
- package/lib/cli/boas-vindas.js +153 -0
- package/lib/cli/comando-api.js +85 -0
- package/lib/cli/comandos-extra.js +553 -0
- package/lib/cli/comandos.js +104 -0
- package/lib/cli/headless.js +102 -0
- package/lib/cli/sessao.js +4179 -0
- package/lib/cli/statusline.js +52 -0
- package/lib/cli/util.js +2 -2
- package/lib/cli-nova.js +237 -0
- package/lib/conferir.js +4 -4
- package/lib/config/config.js +419 -0
- package/lib/config/limites.js +100 -0
- package/lib/cursor.js +3 -3
- package/lib/diff.js +1 -1
- package/lib/effort.js +1 -1
- package/lib/entrega.js +1 -1
- package/lib/escopo.js +1 -1
- package/lib/explicar.js +1 -1
- package/lib/fala.js +2 -2
- package/lib/guardar.js +2 -2
- package/lib/mcp/mcp.js +819 -0
- package/lib/memoria-usuario.js +1 -1
- package/lib/motor/aprovacao.js +114 -0
- package/lib/motor/eventos.js +77 -0
- package/lib/motor/index.js +8 -0
- package/lib/motor/tela-terminal.js +64 -0
- package/lib/motor/turno.js +43 -0
- package/lib/motor/voz.js +65 -0
- package/lib/mudou.js +1 -1
- package/lib/nome-projeto.js +1 -1
- package/lib/nuvem.js +2 -2
- package/lib/permission/perigo.js +401 -0
- package/lib/permission/permissao.js +137 -0
- package/lib/permission/sandbox.js +252 -0
- package/lib/piloto.js +39 -0
- package/lib/placar.js +1 -1
- package/lib/plano-previo.js +1 -1
- package/lib/plugin/auto-preview.js +71 -0
- package/lib/plugin/autoteste.js +1 -0
- package/lib/plugin/desktop.js +756 -0
- package/lib/plugin/editor-pro-maquina.js +355 -0
- package/lib/plugin/editor-pro.js +1022 -0
- package/lib/plugin/entregaveis/carrossel.js +93 -0
- package/lib/plugin/entregaveis/cartaz.js +112 -0
- package/lib/plugin/entregaveis/cli.js +36 -0
- package/lib/plugin/entregaveis/documento.js +169 -0
- package/lib/plugin/entregaveis/especialistas.js +72 -0
- package/lib/plugin/entregaveis/nucleo.js +243 -0
- package/lib/plugin/entregaveis/slides.js +232 -0
- package/lib/plugin/estudio/acervo.js +418 -0
- package/lib/plugin/estudio/assets.js +497 -0
- package/lib/plugin/estudio/assinatura.js +108 -0
- package/lib/plugin/estudio/conferencia-visual.js +76 -0
- package/lib/plugin/estudio/conferir-quadros.js +56 -0
- package/lib/plugin/estudio/cota.js +157 -0
- package/lib/plugin/estudio/criar.js +113 -0
- package/lib/plugin/estudio/diretor.js +392 -0
- package/lib/plugin/estudio/editor.js +290 -0
- package/lib/plugin/estudio/gosto-descrever.js +87 -0
- package/lib/plugin/estudio/gosto.js +608 -0
- package/lib/plugin/estudio/historico.js +60 -0
- package/lib/plugin/estudio/identidade.js +560 -0
- package/lib/plugin/estudio/index.js +2725 -0
- package/lib/plugin/estudio/kit.js +91 -0
- package/lib/plugin/estudio/kits-tela.js +199 -0
- package/lib/plugin/estudio/kokoro.js +127 -0
- package/lib/plugin/estudio/maquina-foto.js +177 -0
- package/lib/plugin/estudio/maquina-trilha.js +199 -0
- package/lib/plugin/estudio/maquina-voz.js +429 -0
- package/lib/plugin/estudio/marca.js +398 -0
- package/lib/plugin/estudio/materiais.js +218 -0
- package/lib/plugin/estudio/miniatura.js +56 -0
- package/lib/plugin/estudio/morfar.js +191 -0
- package/lib/plugin/estudio/print-site.js +341 -0
- package/lib/plugin/estudio/projeto.js +340 -0
- package/lib/plugin/estudio/projetos.js +72 -0
- package/lib/plugin/kits-parecidos.js +99 -0
- package/lib/plugin/kits.js +585 -0
- package/lib/plugin/marca-kit.js +312 -0
- package/lib/plugin/motioncraft.js +67 -0
- package/lib/plugin/pesquisar.js +7 -4
- package/lib/plugin/video/analise.js +89 -0
- package/lib/plugin/video/auto.js +344 -0
- package/lib/plugin/video/catalogo.js +20 -0
- package/lib/plugin/video/mutar.js +28 -0
- package/lib/plugin/video/ops-fx.js +453 -0
- package/lib/plugin/video/ops.js +373 -0
- package/lib/plugin/video/pedido.js +191 -0
- package/lib/plugin/video/projeto.js +133 -0
- package/lib/plugin/video/rastrear.js +95 -0
- package/lib/plugin/video/render.js +274 -0
- package/lib/plugin/video/transcript.js +124 -0
- package/lib/plugin/video/zoom.js +275 -0
- package/lib/plugin/voz-ponte.js +15 -0
- package/lib/plugin/voz.js +532 -0
- package/lib/porta.js +4 -4
- package/lib/pre-leitura.js +2 -2
- package/lib/preparar.js +11 -11
- package/lib/projetos-meta.js +90 -0
- package/lib/provider/api.js +310 -0
- package/lib/provider/claude-engine.js +673 -0
- package/lib/provider/codex-engine.js +225 -0
- package/lib/provider/local/motor-cli.js +93 -0
- package/lib/provider/local/motor.js +267 -0
- package/lib/provider/local/provedor.js +169 -0
- package/lib/publicar.js +2 -2
- package/lib/qr.js +209 -0
- package/lib/registro.js +2 -2
- package/lib/repeticao.js +2 -2
- package/lib/segredos.js +2 -2
- package/lib/session/checkpoint-git.js +221 -0
- package/lib/session/checkpoint.js +366 -0
- package/lib/session/compactacao.js +1 -1
- package/lib/session/exportar-conversa.js +49 -0
- package/lib/session/linha-do-tempo.js +130 -0
- package/lib/session/runner/act.js +2562 -0
- package/lib/skill/catalogo.js +369 -0
- package/lib/skill/marketplace.js +189 -0
- package/lib/skill/skills.js +468 -0
- package/lib/team.js +4 -4
- package/lib/tool/diagnostico.js +14 -3
- package/lib/tool/lsp.js +211 -0
- package/lib/tool/perguntar.js +55 -1
- package/lib/tool/tools.js +1101 -0
- package/lib/trava.js +1 -1
- package/lib/travado.js +1 -1
- package/lib/tui/entrada.js +1031 -0
- package/lib/tui/tela.js +245 -0
- package/lib/tui/ui.js +763 -0
- package/materiais/adesivos/base.ts +101 -0
- package/materiais/adesivos/camera/CameraDeriva.tsx +37 -0
- package/materiais/adesivos/cores/paleta.json +30 -0
- package/materiais/adesivos/cores/paleta.png +0 -0
- package/materiais/adesivos/formas/AdesivoForma.tsx +42 -0
- package/materiais/adesivos/formas/AdesivoFoto.tsx +36 -0
- package/materiais/adesivos/formas/SeloPreco.tsx +38 -0
- package/materiais/adesivos/pecas.json +496 -0
- package/materiais/adesivos/referencia/analise.md +85 -0
- package/materiais/adesivos/referencia/quadro-1.png +0 -0
- package/materiais/adesivos/referencia/quadro-2.png +0 -0
- package/materiais/adesivos/referencia/quadro-3.png +0 -0
- package/materiais/adesivos/referencia/quadro-4.png +0 -0
- package/materiais/adesivos/referencia/referencia.mp4 +0 -0
- package/materiais/adesivos/regras.md +138 -0
- package/materiais/adesivos/sons/Som.tsx +33 -0
- package/materiais/adesivos/texturas/ChuvaDeAdesivos.tsx +29 -0
- package/materiais/adesivos/texturas/Fundo.tsx +21 -0
- package/materiais/adesivos/texturas/Particulas.tsx +22 -0
- package/materiais/adesivos/tipografia/AdesivoTexto.tsx +35 -0
- package/materiais/adesivos/tipografia/AssinaturaMarca.tsx +36 -0
- package/materiais/adesivos/tipografia/TituloEtiquetas.tsx +33 -0
- package/materiais/adesivos/transicoes/Cena.tsx +48 -0
- package/materiais/adesivos/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/antes-depois/base.ts +82 -0
- package/materiais/antes-depois/camera/CameraDeriva.tsx +37 -0
- package/materiais/antes-depois/cores/paleta.json +28 -0
- package/materiais/antes-depois/cores/paleta.png +0 -0
- package/materiais/antes-depois/formas/BarraMedidor.tsx +43 -0
- package/materiais/antes-depois/formas/FaixaMarquee.tsx +35 -0
- package/materiais/antes-depois/formas/ListaMudancas.tsx +37 -0
- package/materiais/antes-depois/formas/RotuloAntesDepois.tsx +26 -0
- package/materiais/antes-depois/formas/TelaDividida.tsx +68 -0
- package/materiais/antes-depois/pecas.json +520 -0
- package/materiais/antes-depois/referencia/analise.md +85 -0
- package/materiais/antes-depois/referencia/quadro-1.png +0 -0
- package/materiais/antes-depois/referencia/quadro-2.png +0 -0
- package/materiais/antes-depois/referencia/quadro-3.png +0 -0
- package/materiais/antes-depois/referencia/quadro-4.png +0 -0
- package/materiais/antes-depois/referencia/referencia.mp4 +0 -0
- package/materiais/antes-depois/regras.md +141 -0
- package/materiais/antes-depois/sons/Som.tsx +40 -0
- package/materiais/antes-depois/texturas/Fundo.tsx +24 -0
- package/materiais/antes-depois/texturas/Particulas.tsx +22 -0
- package/materiais/antes-depois/tipografia/NumeroDelta.tsx +36 -0
- package/materiais/antes-depois/transicoes/Cena.tsx +41 -0
- package/materiais/antes-depois/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/apple-tipografico/base.ts +111 -0
- package/materiais/apple-tipografico/camera/Camera.tsx +23 -0
- package/materiais/apple-tipografico/camera/CameraDeriva.tsx +37 -0
- package/materiais/apple-tipografico/cores/paleta.json +21 -0
- package/materiais/apple-tipografico/cores/paleta.png +0 -0
- package/materiais/apple-tipografico/formas/CartaoRadial.tsx +41 -0
- package/materiais/apple-tipografico/formas/Produto3D.tsx +126 -0
- package/materiais/apple-tipografico/formas/ProdutoFoto.tsx +47 -0
- package/materiais/apple-tipografico/lib/produto3d-apoio.ts +22 -0
- package/materiais/apple-tipografico/pecas.json +491 -0
- package/materiais/apple-tipografico/referencia/analise.md +87 -0
- package/materiais/apple-tipografico/referencia/quadro-1.png +0 -0
- package/materiais/apple-tipografico/referencia/quadro-2.png +0 -0
- package/materiais/apple-tipografico/referencia/quadro-3.png +0 -0
- package/materiais/apple-tipografico/referencia/quadro-4.png +0 -0
- package/materiais/apple-tipografico/referencia/referencia.mp4 +0 -0
- package/materiais/apple-tipografico/regras.md +171 -0
- package/materiais/apple-tipografico/sons/Som.tsx +40 -0
- package/materiais/apple-tipografico/texturas/Fundo.tsx +21 -0
- package/materiais/apple-tipografico/texturas/Particulas.tsx +22 -0
- package/materiais/apple-tipografico/tipografia/AssinaturaPreta.tsx +33 -0
- package/materiais/apple-tipografico/tipografia/LegendaCurta.tsx +51 -0
- package/materiais/apple-tipografico/transicoes/Cena.tsx +55 -0
- package/materiais/apple-tipografico/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/aquarela/base.ts +97 -0
- package/materiais/aquarela/camera/CameraDeriva.tsx +37 -0
- package/materiais/aquarela/cores/paleta.json +30 -0
- package/materiais/aquarela/cores/paleta.png +0 -0
- package/materiais/aquarela/formas/AnotacaoManual.tsx +40 -0
- package/materiais/aquarela/formas/ManchaTinta.tsx +46 -0
- package/materiais/aquarela/formas/Pincelada.tsx +43 -0
- package/materiais/aquarela/formas/Pingos.tsx +31 -0
- package/materiais/aquarela/pecas.json +498 -0
- package/materiais/aquarela/referencia/analise.md +87 -0
- package/materiais/aquarela/referencia/quadro-1.png +0 -0
- package/materiais/aquarela/referencia/quadro-2.png +0 -0
- package/materiais/aquarela/referencia/quadro-3.png +0 -0
- package/materiais/aquarela/referencia/quadro-4.png +0 -0
- package/materiais/aquarela/referencia/referencia.mp4 +0 -0
- package/materiais/aquarela/regras.md +141 -0
- package/materiais/aquarela/sons/Som.tsx +33 -0
- package/materiais/aquarela/texturas/Fundo.tsx +24 -0
- package/materiais/aquarela/texturas/PapelRasgado.tsx +50 -0
- package/materiais/aquarela/texturas/Particulas.tsx +22 -0
- package/materiais/aquarela/tipografia/AssinaturaMarca.tsx +33 -0
- package/materiais/aquarela/tipografia/TituloPincel.tsx +51 -0
- package/materiais/aquarela/transicoes/Cena.tsx +48 -0
- package/materiais/aquarela/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/aurora/base.ts +93 -0
- package/materiais/aurora/camera/CameraDeriva.tsx +37 -0
- package/materiais/aurora/cores/paleta.json +30 -0
- package/materiais/aurora/cores/paleta.png +0 -0
- package/materiais/aurora/formas/CartaoVidro.tsx +29 -0
- package/materiais/aurora/formas/CeuEstrelado.tsx +22 -0
- package/materiais/aurora/formas/Montanhas.tsx +24 -0
- package/materiais/aurora/pecas.json +485 -0
- package/materiais/aurora/referencia/analise.md +84 -0
- package/materiais/aurora/referencia/quadro-1.png +0 -0
- package/materiais/aurora/referencia/quadro-2.png +0 -0
- package/materiais/aurora/referencia/quadro-3.png +0 -0
- package/materiais/aurora/referencia/quadro-4.png +0 -0
- package/materiais/aurora/referencia/referencia.mp4 +0 -0
- package/materiais/aurora/regras.md +140 -0
- package/materiais/aurora/sons/Som.tsx +33 -0
- package/materiais/aurora/texturas/Fundo.tsx +35 -0
- package/materiais/aurora/texturas/Particulas.tsx +22 -0
- package/materiais/aurora/tipografia/AssinaturaMarca.tsx +24 -0
- package/materiais/aurora/tipografia/Legenda.tsx +23 -0
- package/materiais/aurora/tipografia/TituloSerif.tsx +36 -0
- package/materiais/aurora/transicoes/Cena.tsx +48 -0
- package/materiais/aurora/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/aurora/transicoes/CortinaDeLuz.tsx +36 -0
- package/materiais/bauhaus/base.ts +74 -0
- package/materiais/bauhaus/camera/Camera.tsx +21 -0
- package/materiais/bauhaus/camera/CameraDeriva.tsx +37 -0
- package/materiais/bauhaus/cores/paleta.json +27 -0
- package/materiais/bauhaus/cores/paleta.png +0 -0
- package/materiais/bauhaus/formas/BarraDiagonal.tsx +20 -0
- package/materiais/bauhaus/formas/ComposicaoGeometrica.tsx +54 -0
- package/materiais/bauhaus/formas/ListaFaixas.tsx +27 -0
- package/materiais/bauhaus/formas/Overlay.tsx +18 -0
- package/materiais/bauhaus/pecas.json +520 -0
- package/materiais/bauhaus/referencia/analise.md +81 -0
- package/materiais/bauhaus/referencia/quadro-1.png +0 -0
- package/materiais/bauhaus/referencia/quadro-2.png +0 -0
- package/materiais/bauhaus/referencia/quadro-3.png +0 -0
- package/materiais/bauhaus/referencia/quadro-4.png +0 -0
- package/materiais/bauhaus/referencia/referencia.mp4 +0 -0
- package/materiais/bauhaus/regras.md +127 -0
- package/materiais/bauhaus/sons/Som.tsx +30 -0
- package/materiais/bauhaus/texturas/Fundo.tsx +13 -0
- package/materiais/bauhaus/texturas/Particulas.tsx +22 -0
- package/materiais/bauhaus/tipografia/AssinaturaMarca.tsx +26 -0
- package/materiais/bauhaus/tipografia/NumeroBauhaus.tsx +21 -0
- package/materiais/bauhaus/tipografia/TituloBauhaus.tsx +32 -0
- package/materiais/bauhaus/transicoes/Cena.tsx +36 -0
- package/materiais/bauhaus/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/brutalista/base.ts +71 -0
- package/materiais/brutalista/camera/CameraDeriva.tsx +37 -0
- package/materiais/brutalista/cores/paleta.json +25 -0
- package/materiais/brutalista/cores/paleta.png +0 -0
- package/materiais/brutalista/formas/BlocoSombra.tsx +18 -0
- package/materiais/brutalista/formas/CartaoFotoBruto.tsx +19 -0
- package/materiais/brutalista/formas/FitaAlerta.tsx +20 -0
- package/materiais/brutalista/formas/ListaBruta.tsx +23 -0
- package/materiais/brutalista/formas/MonoEnorme.tsx +43 -0
- package/materiais/brutalista/formas/QuadroCor.tsx +14 -0
- package/materiais/brutalista/formas/Terminal.tsx +25 -0
- package/materiais/brutalista/pecas.json +559 -0
- package/materiais/brutalista/referencia/analise.md +81 -0
- package/materiais/brutalista/referencia/quadro-1.png +0 -0
- package/materiais/brutalista/referencia/quadro-2.png +0 -0
- package/materiais/brutalista/referencia/quadro-3.png +0 -0
- package/materiais/brutalista/referencia/quadro-4.png +0 -0
- package/materiais/brutalista/referencia/referencia.mp4 +0 -0
- package/materiais/brutalista/regras.md +128 -0
- package/materiais/brutalista/sons/Som.tsx +38 -0
- package/materiais/brutalista/texturas/Fundo.tsx +9 -0
- package/materiais/brutalista/texturas/Particulas.tsx +22 -0
- package/materiais/brutalista/tipografia/AssinaturaMarca.tsx +21 -0
- package/materiais/brutalista/tipografia/ContadorGrande.tsx +21 -0
- package/materiais/brutalista/transicoes/Cena.tsx +41 -0
- package/materiais/brutalista/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/campos-de-cor/base.ts +87 -0
- package/materiais/campos-de-cor/camera/Camera.tsx +23 -0
- package/materiais/campos-de-cor/camera/CameraDeriva.tsx +37 -0
- package/materiais/campos-de-cor/cores/paleta.json +25 -0
- package/materiais/campos-de-cor/cores/paleta.png +0 -0
- package/materiais/campos-de-cor/formas/Asterisco.tsx +26 -0
- package/materiais/campos-de-cor/formas/CampoDeCor.tsx +39 -0
- package/materiais/campos-de-cor/formas/FormaGeometrica.tsx +37 -0
- package/materiais/campos-de-cor/formas/ListaRegua.tsx +30 -0
- package/materiais/campos-de-cor/pecas.json +534 -0
- package/materiais/campos-de-cor/referencia/analise.md +81 -0
- package/materiais/campos-de-cor/referencia/quadro-1.png +0 -0
- package/materiais/campos-de-cor/referencia/quadro-2.png +0 -0
- package/materiais/campos-de-cor/referencia/quadro-3.png +0 -0
- package/materiais/campos-de-cor/referencia/quadro-4.png +0 -0
- package/materiais/campos-de-cor/referencia/referencia.mp4 +0 -0
- package/materiais/campos-de-cor/regras.md +125 -0
- package/materiais/campos-de-cor/sons/Som.tsx +39 -0
- package/materiais/campos-de-cor/texturas/Fundo.tsx +11 -0
- package/materiais/campos-de-cor/texturas/Particulas.tsx +22 -0
- package/materiais/campos-de-cor/tipografia/AssinaturaMarca.tsx +18 -0
- package/materiais/campos-de-cor/tipografia/FitaDeTexto.tsx +24 -0
- package/materiais/campos-de-cor/tipografia/LegendaItalica.tsx +12 -0
- package/materiais/campos-de-cor/tipografia/PalavraGigante.tsx +44 -0
- package/materiais/campos-de-cor/transicoes/Cena.tsx +46 -0
- package/materiais/campos-de-cor/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/cartaz-cinetico/base.ts +72 -0
- package/materiais/cartaz-cinetico/camera/CameraDeriva.tsx +37 -0
- package/materiais/cartaz-cinetico/cores/paleta.json +26 -0
- package/materiais/cartaz-cinetico/cores/paleta.png +0 -0
- package/materiais/cartaz-cinetico/formas/CirculoPoster.tsx +22 -0
- package/materiais/cartaz-cinetico/formas/PilhaCartaz.tsx +40 -0
- package/materiais/cartaz-cinetico/formas/Selo.tsx +25 -0
- package/materiais/cartaz-cinetico/pecas.json +524 -0
- package/materiais/cartaz-cinetico/referencia/analise.md +83 -0
- package/materiais/cartaz-cinetico/referencia/quadro-1.png +0 -0
- package/materiais/cartaz-cinetico/referencia/quadro-2.png +0 -0
- package/materiais/cartaz-cinetico/referencia/quadro-3.png +0 -0
- package/materiais/cartaz-cinetico/referencia/quadro-4.png +0 -0
- package/materiais/cartaz-cinetico/referencia/referencia.mp4 +0 -0
- package/materiais/cartaz-cinetico/regras.md +131 -0
- package/materiais/cartaz-cinetico/sons/Som.tsx +38 -0
- package/materiais/cartaz-cinetico/texturas/Fundo.tsx +16 -0
- package/materiais/cartaz-cinetico/texturas/Particulas.tsx +22 -0
- package/materiais/cartaz-cinetico/tipografia/AssinaturaMarca.tsx +31 -0
- package/materiais/cartaz-cinetico/tipografia/CartazPalavra.tsx +40 -0
- package/materiais/cartaz-cinetico/tipografia/EcoPalavra.tsx +27 -0
- package/materiais/cartaz-cinetico/tipografia/RoletaPalavras.tsx +30 -0
- package/materiais/cartaz-cinetico/transicoes/Cena.tsx +41 -0
- package/materiais/cartaz-cinetico/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/colagem/base.ts +77 -0
- package/materiais/colagem/camera/Camera.tsx +21 -0
- package/materiais/colagem/camera/CameraDeriva.tsx +37 -0
- package/materiais/colagem/cores/paleta.json +30 -0
- package/materiais/colagem/cores/paleta.png +0 -0
- package/materiais/colagem/formas/FitaAdesiva.tsx +11 -0
- package/materiais/colagem/formas/FotoRasgada.tsx +26 -0
- package/materiais/colagem/formas/ListaRecortes.tsx +23 -0
- package/materiais/colagem/formas/NotaDatilografada.tsx +35 -0
- package/materiais/colagem/formas/RecorteForma.tsx +23 -0
- package/materiais/colagem/lib/rasgado.ts +16 -0
- package/materiais/colagem/pecas.json +547 -0
- package/materiais/colagem/referencia/analise.md +82 -0
- package/materiais/colagem/referencia/quadro-1.png +0 -0
- package/materiais/colagem/referencia/quadro-2.png +0 -0
- package/materiais/colagem/referencia/quadro-3.png +0 -0
- package/materiais/colagem/referencia/quadro-4.png +0 -0
- package/materiais/colagem/referencia/referencia.mp4 +0 -0
- package/materiais/colagem/regras.md +129 -0
- package/materiais/colagem/sons/Som.tsx +30 -0
- package/materiais/colagem/texturas/Fundo.tsx +16 -0
- package/materiais/colagem/texturas/Particulas.tsx +22 -0
- package/materiais/colagem/tipografia/AssinaturaMarca.tsx +17 -0
- package/materiais/colagem/tipografia/TituloRecorte.tsx +34 -0
- package/materiais/colagem/transicoes/Cena.tsx +36 -0
- package/materiais/colagem/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/contagem/base.ts +79 -0
- package/materiais/contagem/camera/CameraDeriva.tsx +37 -0
- package/materiais/contagem/cores/paleta.json +27 -0
- package/materiais/contagem/cores/paleta.png +0 -0
- package/materiais/contagem/formas/AnelTempo.tsx +36 -0
- package/materiais/contagem/formas/BarraDias.tsx +41 -0
- package/materiais/contagem/formas/CarimboData.tsx +37 -0
- package/materiais/contagem/formas/RelogioFlip.tsx +51 -0
- package/materiais/contagem/pecas.json +509 -0
- package/materiais/contagem/referencia/analise.md +85 -0
- package/materiais/contagem/referencia/quadro-1.png +0 -0
- package/materiais/contagem/referencia/quadro-2.png +0 -0
- package/materiais/contagem/referencia/quadro-3.png +0 -0
- package/materiais/contagem/referencia/quadro-4.png +0 -0
- package/materiais/contagem/referencia/referencia.mp4 +0 -0
- package/materiais/contagem/regras.md +134 -0
- package/materiais/contagem/sons/Som.tsx +41 -0
- package/materiais/contagem/texturas/Fundo.tsx +27 -0
- package/materiais/contagem/texturas/Particulas.tsx +22 -0
- package/materiais/contagem/tipografia/NumeroRolando.tsx +49 -0
- package/materiais/contagem/transicoes/Cena.tsx +39 -0
- package/materiais/contagem/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/convite-evento/base.ts +82 -0
- package/materiais/convite-evento/camera/CameraDeriva.tsx +37 -0
- package/materiais/convite-evento/cores/paleta.json +27 -0
- package/materiais/convite-evento/cores/paleta.png +0 -0
- package/materiais/convite-evento/formas/BotaoInscricao.tsx +36 -0
- package/materiais/convite-evento/formas/DataGigante.tsx +37 -0
- package/materiais/convite-evento/formas/IngressoBilhete.tsx +40 -0
- package/materiais/convite-evento/formas/LugarGigante.tsx +38 -0
- package/materiais/convite-evento/formas/SeloRotativo.tsx +32 -0
- package/materiais/convite-evento/pecas.json +511 -0
- package/materiais/convite-evento/referencia/analise.md +84 -0
- package/materiais/convite-evento/referencia/quadro-1.png +0 -0
- package/materiais/convite-evento/referencia/quadro-2.png +0 -0
- package/materiais/convite-evento/referencia/quadro-3.png +0 -0
- package/materiais/convite-evento/referencia/quadro-4.png +0 -0
- package/materiais/convite-evento/referencia/referencia.mp4 +0 -0
- package/materiais/convite-evento/regras.md +135 -0
- package/materiais/convite-evento/sons/Som.tsx +40 -0
- package/materiais/convite-evento/texturas/Fundo.tsx +30 -0
- package/materiais/convite-evento/texturas/Particulas.tsx +22 -0
- package/materiais/convite-evento/tipografia/TituloEvento.tsx +33 -0
- package/materiais/convite-evento/transicoes/Cena.tsx +39 -0
- package/materiais/convite-evento/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/corte-podcast/base.ts +82 -0
- package/materiais/corte-podcast/camera/CameraDeriva.tsx +37 -0
- package/materiais/corte-podcast/cores/paleta.json +28 -0
- package/materiais/corte-podcast/cores/paleta.png +0 -0
- package/materiais/corte-podcast/formas/BarraEpisodio.tsx +43 -0
- package/materiais/corte-podcast/formas/CartaoConvidado.tsx +32 -0
- package/materiais/corte-podcast/formas/OndaAudio.tsx +41 -0
- package/materiais/corte-podcast/formas/SeloEpisodio.tsx +33 -0
- package/materiais/corte-podcast/pecas.json +516 -0
- package/materiais/corte-podcast/referencia/analise.md +84 -0
- package/materiais/corte-podcast/referencia/quadro-1.png +0 -0
- package/materiais/corte-podcast/referencia/quadro-2.png +0 -0
- package/materiais/corte-podcast/referencia/quadro-3.png +0 -0
- package/materiais/corte-podcast/referencia/quadro-4.png +0 -0
- package/materiais/corte-podcast/referencia/referencia.mp4 +0 -0
- package/materiais/corte-podcast/regras.md +132 -0
- package/materiais/corte-podcast/sons/Som.tsx +40 -0
- package/materiais/corte-podcast/texturas/Fundo.tsx +27 -0
- package/materiais/corte-podcast/texturas/Particulas.tsx +22 -0
- package/materiais/corte-podcast/tipografia/CitacaoGrande.tsx +42 -0
- package/materiais/corte-podcast/tipografia/LegendaKaraoke.tsx +32 -0
- package/materiais/corte-podcast/transicoes/Cena.tsx +41 -0
- package/materiais/corte-podcast/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/cubos/base.ts +97 -0
- package/materiais/cubos/camera/CameraDeriva.tsx +37 -0
- package/materiais/cubos/cores/paleta.json +29 -0
- package/materiais/cubos/cores/paleta.png +0 -0
- package/materiais/cubos/formas/Cubo.tsx +40 -0
- package/materiais/cubos/formas/CuboGiratorio.tsx +37 -0
- package/materiais/cubos/formas/MontagemDeCubos.tsx +58 -0
- package/materiais/cubos/formas/PlacaBloco.tsx +29 -0
- package/materiais/cubos/formas/TorreDeCubos.tsx +39 -0
- package/materiais/cubos/pecas.json +477 -0
- package/materiais/cubos/referencia/analise.md +83 -0
- package/materiais/cubos/referencia/quadro-1.png +0 -0
- package/materiais/cubos/referencia/quadro-2.png +0 -0
- package/materiais/cubos/referencia/quadro-3.png +0 -0
- package/materiais/cubos/referencia/quadro-4.png +0 -0
- package/materiais/cubos/referencia/referencia.mp4 +0 -0
- package/materiais/cubos/regras.md +136 -0
- package/materiais/cubos/sons/Som.tsx +33 -0
- package/materiais/cubos/texturas/Fundo.tsx +15 -0
- package/materiais/cubos/texturas/Particulas.tsx +22 -0
- package/materiais/cubos/tipografia/AssinaturaMarca.tsx +29 -0
- package/materiais/cubos/transicoes/Cena.tsx +48 -0
- package/materiais/cubos/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/dashboard-dados/base.ts +87 -0
- package/materiais/dashboard-dados/camera/Camera.tsx +23 -0
- package/materiais/dashboard-dados/camera/CameraDeriva.tsx +37 -0
- package/materiais/dashboard-dados/cores/paleta.json +30 -0
- package/materiais/dashboard-dados/cores/paleta.png +0 -0
- package/materiais/dashboard-dados/formas/BarrasCrescendo.tsx +27 -0
- package/materiais/dashboard-dados/formas/LinhaTendencia.tsx +29 -0
- package/materiais/dashboard-dados/formas/RankingBarras.tsx +27 -0
- package/materiais/dashboard-dados/formas/RoscaDados.tsx +39 -0
- package/materiais/dashboard-dados/pecas.json +490 -0
- package/materiais/dashboard-dados/referencia/analise.md +84 -0
- package/materiais/dashboard-dados/referencia/quadro-1.png +0 -0
- package/materiais/dashboard-dados/referencia/quadro-2.png +0 -0
- package/materiais/dashboard-dados/referencia/quadro-3.png +0 -0
- package/materiais/dashboard-dados/referencia/quadro-4.png +0 -0
- package/materiais/dashboard-dados/referencia/referencia.mp4 +0 -0
- package/materiais/dashboard-dados/regras.md +130 -0
- package/materiais/dashboard-dados/sons/Som.tsx +39 -0
- package/materiais/dashboard-dados/texturas/Fundo.tsx +12 -0
- package/materiais/dashboard-dados/texturas/Particulas.tsx +22 -0
- package/materiais/dashboard-dados/tipografia/AssinaturaMarca.tsx +19 -0
- package/materiais/dashboard-dados/tipografia/NumeroGigante.tsx +21 -0
- package/materiais/dashboard-dados/transicoes/Cena.tsx +46 -0
- package/materiais/dashboard-dados/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/depoimento/base.ts +83 -0
- package/materiais/depoimento/camera/CameraDeriva.tsx +37 -0
- package/materiais/depoimento/cores/paleta.json +29 -0
- package/materiais/depoimento/cores/paleta.png +0 -0
- package/materiais/depoimento/formas/Avatar.tsx +37 -0
- package/materiais/depoimento/formas/CartaoDepoimento.tsx +69 -0
- package/materiais/depoimento/formas/FaixaAvatares.tsx +41 -0
- package/materiais/depoimento/formas/NotaGigante.tsx +38 -0
- package/materiais/depoimento/formas/PilhaCartoes.tsx +37 -0
- package/materiais/depoimento/formas/SeloVerificado.tsx +29 -0
- package/materiais/depoimento/pecas.json +548 -0
- package/materiais/depoimento/referencia/analise.md +84 -0
- package/materiais/depoimento/referencia/quadro-1.png +0 -0
- package/materiais/depoimento/referencia/quadro-2.png +0 -0
- package/materiais/depoimento/referencia/quadro-3.png +0 -0
- package/materiais/depoimento/referencia/quadro-4.png +0 -0
- package/materiais/depoimento/referencia/referencia.mp4 +0 -0
- package/materiais/depoimento/regras.md +135 -0
- package/materiais/depoimento/sons/Som.tsx +41 -0
- package/materiais/depoimento/texturas/Estrelas.tsx +34 -0
- package/materiais/depoimento/texturas/Fundo.tsx +23 -0
- package/materiais/depoimento/texturas/Particulas.tsx +22 -0
- package/materiais/depoimento/transicoes/Cena.tsx +39 -0
- package/materiais/depoimento/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/infografico/base.ts +80 -0
- package/materiais/infografico/camera/CameraDeriva.tsx +37 -0
- package/materiais/infografico/cores/paleta.json +28 -0
- package/materiais/infografico/cores/paleta.png +0 -0
- package/materiais/infografico/formas/Anotacao.tsx +34 -0
- package/materiais/infografico/formas/CadeiaPassos.tsx +49 -0
- package/materiais/infografico/formas/GraficoBarras.tsx +41 -0
- package/materiais/infografico/formas/Icone.tsx +35 -0
- package/materiais/infografico/formas/NoProcesso.tsx +33 -0
- package/materiais/infografico/formas/SetaCurva.tsx +33 -0
- package/materiais/infografico/pecas.json +540 -0
- package/materiais/infografico/referencia/analise.md +84 -0
- package/materiais/infografico/referencia/quadro-1.png +0 -0
- package/materiais/infografico/referencia/quadro-2.png +0 -0
- package/materiais/infografico/referencia/quadro-3.png +0 -0
- package/materiais/infografico/referencia/quadro-4.png +0 -0
- package/materiais/infografico/referencia/referencia.mp4 +0 -0
- package/materiais/infografico/regras.md +132 -0
- package/materiais/infografico/sons/Som.tsx +40 -0
- package/materiais/infografico/texturas/Fundo.tsx +23 -0
- package/materiais/infografico/texturas/Particulas.tsx +22 -0
- package/materiais/infografico/tipografia/NumeroDestaque.tsx +35 -0
- package/materiais/infografico/transicoes/Cena.tsx +39 -0
- package/materiais/infografico/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/isometrico/base.ts +86 -0
- package/materiais/isometrico/camera/Camera.tsx +23 -0
- package/materiais/isometrico/camera/CameraDeriva.tsx +37 -0
- package/materiais/isometrico/cores/paleta.json +29 -0
- package/materiais/isometrico/cores/paleta.png +0 -0
- package/materiais/isometrico/formas/BlocosMontando.tsx +36 -0
- package/materiais/isometrico/formas/CidadeDeDados.tsx +33 -0
- package/materiais/isometrico/formas/RedeDeBlocos.tsx +41 -0
- package/materiais/isometrico/pecas.json +503 -0
- package/materiais/isometrico/referencia/analise.md +83 -0
- package/materiais/isometrico/referencia/quadro-1.png +0 -0
- package/materiais/isometrico/referencia/quadro-2.png +0 -0
- package/materiais/isometrico/referencia/quadro-3.png +0 -0
- package/materiais/isometrico/referencia/quadro-4.png +0 -0
- package/materiais/isometrico/referencia/referencia.mp4 +0 -0
- package/materiais/isometrico/regras.md +125 -0
- package/materiais/isometrico/sons/Som.tsx +39 -0
- package/materiais/isometrico/texturas/Fundo.tsx +13 -0
- package/materiais/isometrico/texturas/Particulas.tsx +22 -0
- package/materiais/isometrico/tipografia/AssinaturaMarca.tsx +24 -0
- package/materiais/isometrico/tipografia/LegendaPlaca.tsx +18 -0
- package/materiais/isometrico/tipografia/TextoNoChao.tsx +28 -0
- package/materiais/isometrico/transicoes/Cena.tsx +46 -0
- package/materiais/isometrico/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/jornal/base.ts +76 -0
- package/materiais/jornal/camera/CameraDeriva.tsx +37 -0
- package/materiais/jornal/cores/paleta.json +27 -0
- package/materiais/jornal/cores/paleta.png +0 -0
- package/materiais/jornal/formas/Cabecalho.tsx +21 -0
- package/materiais/jornal/formas/Carimbo.tsx +18 -0
- package/materiais/jornal/formas/Colunas.tsx +24 -0
- package/materiais/jornal/formas/FotoMeiaTinta.tsx +20 -0
- package/materiais/jornal/formas/JornalGirando.tsx +27 -0
- package/materiais/jornal/formas/Ticker.tsx +19 -0
- package/materiais/jornal/pecas.json +535 -0
- package/materiais/jornal/referencia/analise.md +81 -0
- package/materiais/jornal/referencia/quadro-1.png +0 -0
- package/materiais/jornal/referencia/quadro-2.png +0 -0
- package/materiais/jornal/referencia/quadro-3.png +0 -0
- package/materiais/jornal/referencia/quadro-4.png +0 -0
- package/materiais/jornal/referencia/referencia.mp4 +0 -0
- package/materiais/jornal/regras.md +131 -0
- package/materiais/jornal/sons/Som.tsx +38 -0
- package/materiais/jornal/texturas/Fundo.tsx +18 -0
- package/materiais/jornal/texturas/Particulas.tsx +22 -0
- package/materiais/jornal/tipografia/AssinaturaMarca.tsx +25 -0
- package/materiais/jornal/tipografia/Manchete.tsx +30 -0
- package/materiais/jornal/transicoes/Cena.tsx +41 -0
- package/materiais/jornal/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/legenda-viva/base.ts +73 -0
- package/materiais/legenda-viva/camera/CameraDeriva.tsx +37 -0
- package/materiais/legenda-viva/cores/paleta.json +27 -0
- package/materiais/legenda-viva/cores/paleta.png +0 -0
- package/materiais/legenda-viva/formas/ChipTema.tsx +19 -0
- package/materiais/legenda-viva/formas/OndaVoz.tsx +23 -0
- package/materiais/legenda-viva/formas/QuadroFalante.tsx +17 -0
- package/materiais/legenda-viva/pecas.json +503 -0
- package/materiais/legenda-viva/referencia/analise.md +79 -0
- package/materiais/legenda-viva/referencia/quadro-1.png +0 -0
- package/materiais/legenda-viva/referencia/quadro-2.png +0 -0
- package/materiais/legenda-viva/referencia/quadro-3.png +0 -0
- package/materiais/legenda-viva/referencia/quadro-4.png +0 -0
- package/materiais/legenda-viva/referencia/referencia.mp4 +0 -0
- package/materiais/legenda-viva/regras.md +130 -0
- package/materiais/legenda-viva/sons/Som.tsx +38 -0
- package/materiais/legenda-viva/texturas/Fundo.tsx +6 -0
- package/materiais/legenda-viva/texturas/Particulas.tsx +22 -0
- package/materiais/legenda-viva/tipografia/AssinaturaMarca.tsx +29 -0
- package/materiais/legenda-viva/tipografia/LegendaCaixa.tsx +36 -0
- package/materiais/legenda-viva/tipografia/LegendaPalavra.tsx +32 -0
- package/materiais/legenda-viva/tipografia/PalavraGigante.tsx +18 -0
- package/materiais/legenda-viva/transicoes/Cena.tsx +41 -0
- package/materiais/legenda-viva/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/luxo/base.ts +85 -0
- package/materiais/luxo/camera/CameraDeriva.tsx +37 -0
- package/materiais/luxo/cores/paleta.json +28 -0
- package/materiais/luxo/cores/paleta.png +0 -0
- package/materiais/luxo/formas/ConviteOuro.tsx +34 -0
- package/materiais/luxo/formas/LinhaOuro.tsx +24 -0
- package/materiais/luxo/formas/MolduraArco.tsx +36 -0
- package/materiais/luxo/formas/Monograma.tsx +35 -0
- package/materiais/luxo/pecas.json +505 -0
- package/materiais/luxo/referencia/analise.md +82 -0
- package/materiais/luxo/referencia/quadro-1.png +0 -0
- package/materiais/luxo/referencia/quadro-2.png +0 -0
- package/materiais/luxo/referencia/quadro-3.png +0 -0
- package/materiais/luxo/referencia/quadro-4.png +0 -0
- package/materiais/luxo/referencia/referencia.mp4 +0 -0
- package/materiais/luxo/regras.md +132 -0
- package/materiais/luxo/sons/Som.tsx +40 -0
- package/materiais/luxo/texturas/Fundo.tsx +26 -0
- package/materiais/luxo/texturas/Particulas.tsx +22 -0
- package/materiais/luxo/tipografia/LegendaFina.tsx +25 -0
- package/materiais/luxo/tipografia/TituloSerifa.tsx +35 -0
- package/materiais/luxo/transicoes/Cena.tsx +36 -0
- package/materiais/luxo/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/mapa/base.ts +89 -0
- package/materiais/mapa/camera/CameraDeriva.tsx +37 -0
- package/materiais/mapa/cores/paleta.json +33 -0
- package/materiais/mapa/cores/paleta.png +0 -0
- package/materiais/mapa/formas/CartaoEndereco.tsx +40 -0
- package/materiais/mapa/formas/ChipTempo.tsx +29 -0
- package/materiais/mapa/formas/MapaBase.tsx +63 -0
- package/materiais/mapa/formas/Pino.tsx +38 -0
- package/materiais/mapa/formas/RotaAnimada.tsx +38 -0
- package/materiais/mapa/pecas.json +529 -0
- package/materiais/mapa/referencia/analise.md +85 -0
- package/materiais/mapa/referencia/quadro-1.png +0 -0
- package/materiais/mapa/referencia/quadro-2.png +0 -0
- package/materiais/mapa/referencia/quadro-3.png +0 -0
- package/materiais/mapa/referencia/quadro-4.png +0 -0
- package/materiais/mapa/referencia/referencia.mp4 +0 -0
- package/materiais/mapa/regras.md +135 -0
- package/materiais/mapa/sons/Som.tsx +41 -0
- package/materiais/mapa/texturas/Fundo.tsx +25 -0
- package/materiais/mapa/texturas/Particulas.tsx +22 -0
- package/materiais/mapa/tipografia/TituloLocal.tsx +38 -0
- package/materiais/mapa/transicoes/Cena.tsx +41 -0
- package/materiais/mapa/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/massinha/base.ts +79 -0
- package/materiais/massinha/camera/Camera.tsx +21 -0
- package/materiais/massinha/camera/CameraDeriva.tsx +37 -0
- package/materiais/massinha/cores/paleta.json +32 -0
- package/materiais/massinha/cores/paleta.png +0 -0
- package/materiais/massinha/formas/BichinhoMassa.tsx +30 -0
- package/materiais/massinha/formas/BolasMassa.tsx +25 -0
- package/materiais/massinha/formas/FormaMassa.tsx +23 -0
- package/materiais/massinha/formas/ListaMassa.tsx +19 -0
- package/materiais/massinha/formas/Overlay.tsx +11 -0
- package/materiais/massinha/formas/PlacaMassa.tsx +24 -0
- package/materiais/massinha/pecas.json +544 -0
- package/materiais/massinha/referencia/analise.md +81 -0
- package/materiais/massinha/referencia/quadro-1.png +0 -0
- package/materiais/massinha/referencia/quadro-2.png +0 -0
- package/materiais/massinha/referencia/quadro-3.png +0 -0
- package/materiais/massinha/referencia/quadro-4.png +0 -0
- package/materiais/massinha/referencia/referencia.mp4 +0 -0
- package/materiais/massinha/regras.md +129 -0
- package/materiais/massinha/sons/Som.tsx +30 -0
- package/materiais/massinha/texturas/Fundo.tsx +12 -0
- package/materiais/massinha/texturas/Particulas.tsx +22 -0
- package/materiais/massinha/tipografia/AssinaturaMarca.tsx +20 -0
- package/materiais/massinha/tipografia/TituloMassa.tsx +31 -0
- package/materiais/massinha/transicoes/Cena.tsx +36 -0
- package/materiais/massinha/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/memphis/base.ts +78 -0
- package/materiais/memphis/camera/Camera.tsx +21 -0
- package/materiais/memphis/camera/CameraDeriva.tsx +37 -0
- package/materiais/memphis/cores/paleta.json +31 -0
- package/materiais/memphis/cores/paleta.png +0 -0
- package/materiais/memphis/formas/CartaoMemphis.tsx +16 -0
- package/materiais/memphis/formas/FitaMarquee.tsx +21 -0
- package/materiais/memphis/formas/FormasMemphis.tsx +46 -0
- package/materiais/memphis/formas/ListaPilulas.tsx +17 -0
- package/materiais/memphis/formas/Overlay.tsx +23 -0
- package/materiais/memphis/pecas.json +544 -0
- package/materiais/memphis/referencia/analise.md +82 -0
- package/materiais/memphis/referencia/quadro-1.png +0 -0
- package/materiais/memphis/referencia/quadro-2.png +0 -0
- package/materiais/memphis/referencia/quadro-3.png +0 -0
- package/materiais/memphis/referencia/quadro-4.png +0 -0
- package/materiais/memphis/referencia/referencia.mp4 +0 -0
- package/materiais/memphis/regras.md +130 -0
- package/materiais/memphis/sons/Som.tsx +30 -0
- package/materiais/memphis/texturas/Fundo.tsx +15 -0
- package/materiais/memphis/texturas/Particulas.tsx +22 -0
- package/materiais/memphis/tipografia/AssinaturaMarca.tsx +20 -0
- package/materiais/memphis/tipografia/NumeroGigante.tsx +19 -0
- package/materiais/memphis/tipografia/TituloMemphis.tsx +28 -0
- package/materiais/memphis/transicoes/Cena.tsx +36 -0
- package/materiais/memphis/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/metal-liquido/base.ts +94 -0
- package/materiais/metal-liquido/camera/CameraDeriva.tsx +37 -0
- package/materiais/metal-liquido/cores/paleta.json +30 -0
- package/materiais/metal-liquido/cores/paleta.png +0 -0
- package/materiais/metal-liquido/formas/AnelCromo.tsx +28 -0
- package/materiais/metal-liquido/formas/BolhasCromadas.tsx +53 -0
- package/materiais/metal-liquido/formas/EsferaCromo.tsx +32 -0
- package/materiais/metal-liquido/formas/PilulaCromo.tsx +23 -0
- package/materiais/metal-liquido/pecas.json +469 -0
- package/materiais/metal-liquido/referencia/analise.md +84 -0
- package/materiais/metal-liquido/referencia/quadro-1.png +0 -0
- package/materiais/metal-liquido/referencia/quadro-2.png +0 -0
- package/materiais/metal-liquido/referencia/quadro-3.png +0 -0
- package/materiais/metal-liquido/referencia/quadro-4.png +0 -0
- package/materiais/metal-liquido/referencia/referencia.mp4 +0 -0
- package/materiais/metal-liquido/regras.md +135 -0
- package/materiais/metal-liquido/sons/Som.tsx +33 -0
- package/materiais/metal-liquido/texturas/Fundo.tsx +20 -0
- package/materiais/metal-liquido/texturas/Particulas.tsx +22 -0
- package/materiais/metal-liquido/tipografia/AssinaturaMarca.tsx +26 -0
- package/materiais/metal-liquido/tipografia/TituloCromo.tsx +32 -0
- package/materiais/metal-liquido/transicoes/Cena.tsx +48 -0
- package/materiais/metal-liquido/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/minimal/base.ts +80 -0
- package/materiais/minimal/camera/CameraDeriva.tsx +37 -0
- package/materiais/minimal/cores/paleta.json +26 -0
- package/materiais/minimal/cores/paleta.png +0 -0
- package/materiais/minimal/formas/FormaMorph.tsx +44 -0
- package/materiais/minimal/formas/LinhaFina.tsx +24 -0
- package/materiais/minimal/formas/PontoMovel.tsx +27 -0
- package/materiais/minimal/pecas.json +505 -0
- package/materiais/minimal/referencia/analise.md +84 -0
- package/materiais/minimal/referencia/quadro-1.png +0 -0
- package/materiais/minimal/referencia/quadro-2.png +0 -0
- package/materiais/minimal/referencia/quadro-3.png +0 -0
- package/materiais/minimal/referencia/quadro-4.png +0 -0
- package/materiais/minimal/referencia/referencia.mp4 +0 -0
- package/materiais/minimal/regras.md +127 -0
- package/materiais/minimal/sons/Som.tsx +40 -0
- package/materiais/minimal/texturas/Fundo.tsx +20 -0
- package/materiais/minimal/texturas/Particulas.tsx +22 -0
- package/materiais/minimal/tipografia/FraseUnica.tsx +33 -0
- package/materiais/minimal/tipografia/NumeroSolo.tsx +33 -0
- package/materiais/minimal/tipografia/RodapeMinimal.tsx +26 -0
- package/materiais/minimal/transicoes/Cena.tsx +39 -0
- package/materiais/minimal/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/neon-cidade/base.ts +100 -0
- package/materiais/neon-cidade/camera/CameraDeriva.tsx +37 -0
- package/materiais/neon-cidade/cores/paleta.json +29 -0
- package/materiais/neon-cidade/cores/paleta.png +0 -0
- package/materiais/neon-cidade/formas/CaixaLuminosa.tsx +40 -0
- package/materiais/neon-cidade/formas/FormaNeon.tsx +42 -0
- package/materiais/neon-cidade/formas/Horizonte.tsx +34 -0
- package/materiais/neon-cidade/formas/LetreiroNeon.tsx +46 -0
- package/materiais/neon-cidade/pecas.json +464 -0
- package/materiais/neon-cidade/referencia/analise.md +84 -0
- package/materiais/neon-cidade/referencia/quadro-1.png +0 -0
- package/materiais/neon-cidade/referencia/quadro-2.png +0 -0
- package/materiais/neon-cidade/referencia/quadro-3.png +0 -0
- package/materiais/neon-cidade/referencia/quadro-4.png +0 -0
- package/materiais/neon-cidade/referencia/referencia.mp4 +0 -0
- package/materiais/neon-cidade/regras.md +137 -0
- package/materiais/neon-cidade/sons/Som.tsx +33 -0
- package/materiais/neon-cidade/texturas/Chuva.tsx +23 -0
- package/materiais/neon-cidade/texturas/Fundo.tsx +18 -0
- package/materiais/neon-cidade/texturas/Particulas.tsx +22 -0
- package/materiais/neon-cidade/tipografia/AssinaturaMarca.tsx +24 -0
- package/materiais/neon-cidade/transicoes/Cena.tsx +48 -0
- package/materiais/neon-cidade/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/notion-editorial/base.ts +87 -0
- package/materiais/notion-editorial/camera/Camera.tsx +23 -0
- package/materiais/notion-editorial/camera/CameraDeriva.tsx +37 -0
- package/materiais/notion-editorial/cores/paleta.json +28 -0
- package/materiais/notion-editorial/cores/paleta.png +0 -0
- package/materiais/notion-editorial/formas/BlocoNota.tsx +38 -0
- package/materiais/notion-editorial/formas/Diagrama.tsx +29 -0
- package/materiais/notion-editorial/formas/PassosNumerados.tsx +23 -0
- package/materiais/notion-editorial/formas/RabiscoIcone.tsx +33 -0
- package/materiais/notion-editorial/pecas.json +496 -0
- package/materiais/notion-editorial/referencia/analise.md +83 -0
- package/materiais/notion-editorial/referencia/quadro-1.png +0 -0
- package/materiais/notion-editorial/referencia/quadro-2.png +0 -0
- package/materiais/notion-editorial/referencia/quadro-3.png +0 -0
- package/materiais/notion-editorial/referencia/quadro-4.png +0 -0
- package/materiais/notion-editorial/referencia/referencia.mp4 +0 -0
- package/materiais/notion-editorial/regras.md +126 -0
- package/materiais/notion-editorial/sons/Som.tsx +39 -0
- package/materiais/notion-editorial/texturas/Fundo.tsx +12 -0
- package/materiais/notion-editorial/texturas/Particulas.tsx +22 -0
- package/materiais/notion-editorial/tipografia/AssinaturaMarca.tsx +20 -0
- package/materiais/notion-editorial/tipografia/TextoSerifa.tsx +53 -0
- package/materiais/notion-editorial/transicoes/Cena.tsx +46 -0
- package/materiais/notion-editorial/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/papel-recortado/base.ts +51 -0
- package/materiais/papel-recortado/camera/Camera.tsx +28 -0
- package/materiais/papel-recortado/camera/CameraDeriva.tsx +37 -0
- package/materiais/papel-recortado/cores/paleta.json +28 -0
- package/materiais/papel-recortado/cores/paleta.png +0 -0
- package/materiais/papel-recortado/formas/CamadaPapel.tsx +81 -0
- package/materiais/papel-recortado/formas/CartaoCamadas.tsx +38 -0
- package/materiais/papel-recortado/formas/EtiquetaPapel.tsx +40 -0
- package/materiais/papel-recortado/formas/Fita.tsx +21 -0
- package/materiais/papel-recortado/formas/FolhaPopUp.tsx +49 -0
- package/materiais/papel-recortado/formas/MolduraPapel.tsx +12 -0
- package/materiais/papel-recortado/pecas.json +545 -0
- package/materiais/papel-recortado/referencia/analise.md +82 -0
- package/materiais/papel-recortado/referencia/quadro-1.png +0 -0
- package/materiais/papel-recortado/referencia/quadro-2.png +0 -0
- package/materiais/papel-recortado/referencia/quadro-3.png +0 -0
- package/materiais/papel-recortado/referencia/quadro-4.png +0 -0
- package/materiais/papel-recortado/referencia/referencia.mp4 +0 -0
- package/materiais/papel-recortado/regras.md +117 -0
- package/materiais/papel-recortado/sons/Som.tsx +30 -0
- package/materiais/papel-recortado/texturas/Fundo.tsx +10 -0
- package/materiais/papel-recortado/texturas/Particulas.tsx +22 -0
- package/materiais/papel-recortado/tipografia/LetrasRecortadas.tsx +48 -0
- package/materiais/papel-recortado/transicoes/Cena.tsx +29 -0
- package/materiais/papel-recortado/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/pixel/base.ts +79 -0
- package/materiais/pixel/camera/Camera.tsx +21 -0
- package/materiais/pixel/camera/CameraDeriva.tsx +37 -0
- package/materiais/pixel/cores/paleta.json +32 -0
- package/materiais/pixel/cores/paleta.png +0 -0
- package/materiais/pixel/formas/CaixaDialogo.tsx +22 -0
- package/materiais/pixel/formas/HudPlacar.tsx +19 -0
- package/materiais/pixel/formas/MenuPixel.tsx +19 -0
- package/materiais/pixel/formas/Overlay.tsx +14 -0
- package/materiais/pixel/formas/Sprite.tsx +33 -0
- package/materiais/pixel/pecas.json +543 -0
- package/materiais/pixel/referencia/analise.md +82 -0
- package/materiais/pixel/referencia/quadro-1.png +0 -0
- package/materiais/pixel/referencia/quadro-2.png +0 -0
- package/materiais/pixel/referencia/quadro-3.png +0 -0
- package/materiais/pixel/referencia/quadro-4.png +0 -0
- package/materiais/pixel/referencia/referencia.mp4 +0 -0
- package/materiais/pixel/regras.md +129 -0
- package/materiais/pixel/sons/Som.tsx +30 -0
- package/materiais/pixel/texturas/ChuvaDeSprites.tsx +15 -0
- package/materiais/pixel/texturas/Fundo.tsx +23 -0
- package/materiais/pixel/texturas/Particulas.tsx +22 -0
- package/materiais/pixel/tipografia/AssinaturaMarca.tsx +18 -0
- package/materiais/pixel/tipografia/TituloPixel.tsx +31 -0
- package/materiais/pixel/transicoes/Cena.tsx +36 -0
- package/materiais/pixel/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/pontos-3d/base.ts +92 -0
- package/materiais/pontos-3d/camera/CameraDeriva.tsx +37 -0
- package/materiais/pontos-3d/cores/paleta.json +28 -0
- package/materiais/pontos-3d/cores/paleta.png +0 -0
- package/materiais/pontos-3d/formas/NuvemDePontos.tsx +84 -0
- package/materiais/pontos-3d/formas/RotuloPonto.tsx +32 -0
- package/materiais/pontos-3d/pecas.json +481 -0
- package/materiais/pontos-3d/referencia/analise.md +85 -0
- package/materiais/pontos-3d/referencia/quadro-1.png +0 -0
- package/materiais/pontos-3d/referencia/quadro-2.png +0 -0
- package/materiais/pontos-3d/referencia/quadro-3.png +0 -0
- package/materiais/pontos-3d/referencia/quadro-4.png +0 -0
- package/materiais/pontos-3d/referencia/referencia.mp4 +0 -0
- package/materiais/pontos-3d/regras.md +136 -0
- package/materiais/pontos-3d/sons/Som.tsx +33 -0
- package/materiais/pontos-3d/texturas/Fundo.tsx +20 -0
- package/materiais/pontos-3d/texturas/Particulas.tsx +22 -0
- package/materiais/pontos-3d/tipografia/AssinaturaMarca.tsx +23 -0
- package/materiais/pontos-3d/tipografia/Contador.tsx +32 -0
- package/materiais/pontos-3d/tipografia/TextoDePontos.tsx +55 -0
- package/materiais/pontos-3d/tipografia/TituloSora.tsx +36 -0
- package/materiais/pontos-3d/transicoes/Cena.tsx +48 -0
- package/materiais/pontos-3d/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/produto-3d/base.ts +109 -0
- package/materiais/produto-3d/camera/Camera.tsx +23 -0
- package/materiais/produto-3d/camera/CameraDeriva.tsx +37 -0
- package/materiais/produto-3d/cores/paleta.json +31 -0
- package/materiais/produto-3d/cores/paleta.png +0 -0
- package/materiais/produto-3d/formas/Produto3D.tsx +131 -0
- package/materiais/produto-3d/lib/produto3d-apoio.ts +21 -0
- package/materiais/produto-3d/pecas.json +516 -0
- package/materiais/produto-3d/referencia/analise.md +83 -0
- package/materiais/produto-3d/referencia/quadro-1.png +0 -0
- package/materiais/produto-3d/referencia/quadro-2.png +0 -0
- package/materiais/produto-3d/referencia/quadro-3.png +0 -0
- package/materiais/produto-3d/referencia/quadro-4.png +0 -0
- package/materiais/produto-3d/referencia/referencia.mp4 +0 -0
- package/materiais/produto-3d/regras.md +128 -0
- package/materiais/produto-3d/sons/Som.tsx +39 -0
- package/materiais/produto-3d/texturas/Fundo.tsx +45 -0
- package/materiais/produto-3d/texturas/Particulas.tsx +22 -0
- package/materiais/produto-3d/tipografia/AssinaturaMarca.tsx +28 -0
- package/materiais/produto-3d/tipografia/NumeroDestaque.tsx +35 -0
- package/materiais/produto-3d/tipografia/RotuloChamada.tsx +43 -0
- package/materiais/produto-3d/tipografia/TituloMinimo.tsx +45 -0
- package/materiais/produto-3d/transicoes/Cena.tsx +55 -0
- package/materiais/produto-3d/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/produto-3d/transicoes/VarreduraLuz.tsx +22 -0
- package/materiais/quadro-giz/base.ts +78 -0
- package/materiais/quadro-giz/camera/Camera.tsx +21 -0
- package/materiais/quadro-giz/camera/CameraDeriva.tsx +37 -0
- package/materiais/quadro-giz/cores/paleta.json +31 -0
- package/materiais/quadro-giz/cores/paleta.png +0 -0
- package/materiais/quadro-giz/formas/ApagadorVarrendo.tsx +32 -0
- package/materiais/quadro-giz/formas/CartaoGiz.tsx +25 -0
- package/materiais/quadro-giz/formas/ContaNoQuadro.tsx +34 -0
- package/materiais/quadro-giz/formas/DesenhoGiz.tsx +29 -0
- package/materiais/quadro-giz/formas/ListaGiz.tsx +21 -0
- package/materiais/quadro-giz/formas/Overlay.tsx +12 -0
- package/materiais/quadro-giz/lib/traco.ts +9 -0
- package/materiais/quadro-giz/pecas.json +546 -0
- package/materiais/quadro-giz/referencia/analise.md +82 -0
- package/materiais/quadro-giz/referencia/quadro-1.png +0 -0
- package/materiais/quadro-giz/referencia/quadro-2.png +0 -0
- package/materiais/quadro-giz/referencia/quadro-3.png +0 -0
- package/materiais/quadro-giz/referencia/quadro-4.png +0 -0
- package/materiais/quadro-giz/referencia/referencia.mp4 +0 -0
- package/materiais/quadro-giz/regras.md +132 -0
- package/materiais/quadro-giz/sons/Som.tsx +30 -0
- package/materiais/quadro-giz/texturas/Fundo.tsx +21 -0
- package/materiais/quadro-giz/texturas/Particulas.tsx +22 -0
- package/materiais/quadro-giz/tipografia/AssinaturaMarca.tsx +20 -0
- package/materiais/quadro-giz/tipografia/TituloGiz.tsx +29 -0
- package/materiais/quadro-giz/transicoes/Cena.tsx +36 -0
- package/materiais/quadro-giz/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/rabisco/base.ts +76 -0
- package/materiais/rabisco/camera/Camera.tsx +21 -0
- package/materiais/rabisco/camera/CameraDeriva.tsx +37 -0
- package/materiais/rabisco/cores/paleta.json +29 -0
- package/materiais/rabisco/cores/paleta.png +0 -0
- package/materiais/rabisco/formas/Bonequinho.tsx +31 -0
- package/materiais/rabisco/formas/CartaoRabiscado.tsx +27 -0
- package/materiais/rabisco/formas/ListaRabiscada.tsx +23 -0
- package/materiais/rabisco/formas/TracoDesenhando.tsx +31 -0
- package/materiais/rabisco/lib/traco.ts +10 -0
- package/materiais/rabisco/pecas.json +520 -0
- package/materiais/rabisco/referencia/analise.md +82 -0
- package/materiais/rabisco/referencia/quadro-1.png +0 -0
- package/materiais/rabisco/referencia/quadro-2.png +0 -0
- package/materiais/rabisco/referencia/quadro-3.png +0 -0
- package/materiais/rabisco/referencia/quadro-4.png +0 -0
- package/materiais/rabisco/referencia/referencia.mp4 +0 -0
- package/materiais/rabisco/regras.md +126 -0
- package/materiais/rabisco/sons/Som.tsx +30 -0
- package/materiais/rabisco/texturas/Fundo.tsx +17 -0
- package/materiais/rabisco/texturas/Particulas.tsx +22 -0
- package/materiais/rabisco/tipografia/AssinaturaMarca.tsx +21 -0
- package/materiais/rabisco/tipografia/TituloRabisco.tsx +28 -0
- package/materiais/rabisco/transicoes/Cena.tsx +36 -0
- package/materiais/rabisco/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/retro-70/base.ts +73 -0
- package/materiais/retro-70/camera/CameraDeriva.tsx +37 -0
- package/materiais/retro-70/cores/paleta.json +27 -0
- package/materiais/retro-70/cores/paleta.png +0 -0
- package/materiais/retro-70/formas/ArcoListras.tsx +25 -0
- package/materiais/retro-70/formas/CartaoData.tsx +24 -0
- package/materiais/retro-70/formas/FaixaOnda.tsx +27 -0
- package/materiais/retro-70/formas/Flor70.tsx +25 -0
- package/materiais/retro-70/formas/FotoArredondada.tsx +19 -0
- package/materiais/retro-70/formas/RaiosDeSol.tsx +27 -0
- package/materiais/retro-70/pecas.json +533 -0
- package/materiais/retro-70/referencia/analise.md +81 -0
- package/materiais/retro-70/referencia/quadro-1.png +0 -0
- package/materiais/retro-70/referencia/quadro-2.png +0 -0
- package/materiais/retro-70/referencia/quadro-3.png +0 -0
- package/materiais/retro-70/referencia/quadro-4.png +0 -0
- package/materiais/retro-70/referencia/referencia.mp4 +0 -0
- package/materiais/retro-70/regras.md +132 -0
- package/materiais/retro-70/sons/Som.tsx +38 -0
- package/materiais/retro-70/texturas/Fundo.tsx +11 -0
- package/materiais/retro-70/texturas/Particulas.tsx +22 -0
- package/materiais/retro-70/tipografia/AssinaturaMarca.tsx +21 -0
- package/materiais/retro-70/tipografia/TituloGordo.tsx +28 -0
- package/materiais/retro-70/transicoes/Cena.tsx +41 -0
- package/materiais/retro-70/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/revista/base.ts +76 -0
- package/materiais/revista/camera/CameraDeriva.tsx +37 -0
- package/materiais/revista/cores/paleta.json +27 -0
- package/materiais/revista/cores/paleta.png +0 -0
- package/materiais/revista/formas/ColagemFotos.tsx +22 -0
- package/materiais/revista/formas/Folio.tsx +19 -0
- package/materiais/revista/formas/FotoSangrando.tsx +24 -0
- package/materiais/revista/formas/PaginaDupla.tsx +36 -0
- package/materiais/revista/pecas.json +506 -0
- package/materiais/revista/referencia/analise.md +80 -0
- package/materiais/revista/referencia/quadro-1.png +0 -0
- package/materiais/revista/referencia/quadro-2.png +0 -0
- package/materiais/revista/referencia/quadro-3.png +0 -0
- package/materiais/revista/referencia/quadro-4.png +0 -0
- package/materiais/revista/referencia/referencia.mp4 +0 -0
- package/materiais/revista/regras.md +130 -0
- package/materiais/revista/sons/Som.tsx +38 -0
- package/materiais/revista/texturas/Fundo.tsx +11 -0
- package/materiais/revista/texturas/Particulas.tsx +22 -0
- package/materiais/revista/tipografia/AssinaturaMarca.tsx +23 -0
- package/materiais/revista/tipografia/CitacaoGrande.tsx +27 -0
- package/materiais/revista/tipografia/TituloEditorial.tsx +31 -0
- package/materiais/revista/transicoes/Cena.tsx +41 -0
- package/materiais/revista/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/risografia/base.ts +73 -0
- package/materiais/risografia/camera/Camera.tsx +21 -0
- package/materiais/risografia/camera/CameraDeriva.tsx +37 -0
- package/materiais/risografia/cores/paleta.json +26 -0
- package/materiais/risografia/cores/paleta.png +0 -0
- package/materiais/risografia/formas/BolaReticula.tsx +26 -0
- package/materiais/risografia/formas/FormaRiso.tsx +24 -0
- package/materiais/risografia/formas/ListaRiso.tsx +22 -0
- package/materiais/risografia/formas/Overlay.tsx +18 -0
- package/materiais/risografia/formas/TarjaCarimbo.tsx +20 -0
- package/materiais/risografia/pecas.json +538 -0
- package/materiais/risografia/referencia/analise.md +82 -0
- package/materiais/risografia/referencia/quadro-1.png +0 -0
- package/materiais/risografia/referencia/quadro-2.png +0 -0
- package/materiais/risografia/referencia/quadro-3.png +0 -0
- package/materiais/risografia/referencia/quadro-4.png +0 -0
- package/materiais/risografia/referencia/referencia.mp4 +0 -0
- package/materiais/risografia/regras.md +123 -0
- package/materiais/risografia/sons/Som.tsx +30 -0
- package/materiais/risografia/texturas/Fundo.tsx +12 -0
- package/materiais/risografia/texturas/Particulas.tsx +22 -0
- package/materiais/risografia/tipografia/AssinaturaMarca.tsx +21 -0
- package/materiais/risografia/tipografia/NumeroRiso.tsx +21 -0
- package/materiais/risografia/tipografia/TituloRiso.tsx +26 -0
- package/materiais/risografia/transicoes/Cena.tsx +36 -0
- package/materiais/risografia/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/saas-linear/camera/CameraDeriva.tsx +37 -0
- package/materiais/saas-linear/cores/paleta.png +0 -0
- package/materiais/saas-linear/pecas.json +40 -34
- package/materiais/saas-linear/referencia/analise.md +87 -0
- package/materiais/saas-linear/referencia/quadro-1.png +0 -0
- package/materiais/saas-linear/referencia/quadro-2.png +0 -0
- package/materiais/saas-linear/referencia/quadro-3.png +0 -0
- package/materiais/saas-linear/referencia/quadro-4.png +0 -0
- package/materiais/saas-linear/referencia/referencia.mp4 +0 -0
- package/materiais/saas-linear/sons/Som.tsx +1 -1
- package/materiais/stripe-ondas/base.ts +85 -0
- package/materiais/stripe-ondas/camera/Camera.tsx +23 -0
- package/materiais/stripe-ondas/camera/CameraDeriva.tsx +37 -0
- package/materiais/stripe-ondas/cores/paleta.json +28 -0
- package/materiais/stripe-ondas/cores/paleta.png +0 -0
- package/materiais/stripe-ondas/formas/CartaoPagamento.tsx +35 -0
- package/materiais/stripe-ondas/formas/FaixaDeOndas.tsx +49 -0
- package/materiais/stripe-ondas/formas/GraficoOnda.tsx +34 -0
- package/materiais/stripe-ondas/formas/PainelCodigo.tsx +36 -0
- package/materiais/stripe-ondas/formas/SelosDeMetodo.tsx +27 -0
- package/materiais/stripe-ondas/pecas.json +510 -0
- package/materiais/stripe-ondas/referencia/analise.md +83 -0
- package/materiais/stripe-ondas/referencia/quadro-1.png +0 -0
- package/materiais/stripe-ondas/referencia/quadro-2.png +0 -0
- package/materiais/stripe-ondas/referencia/quadro-3.png +0 -0
- package/materiais/stripe-ondas/referencia/quadro-4.png +0 -0
- package/materiais/stripe-ondas/referencia/referencia.mp4 +0 -0
- package/materiais/stripe-ondas/regras.md +131 -0
- package/materiais/stripe-ondas/sons/Som.tsx +39 -0
- package/materiais/stripe-ondas/texturas/Fundo.tsx +11 -0
- package/materiais/stripe-ondas/texturas/Particulas.tsx +22 -0
- package/materiais/stripe-ondas/tipografia/AssinaturaMarca.tsx +18 -0
- package/materiais/stripe-ondas/tipografia/TituloLimpo.tsx +27 -0
- package/materiais/stripe-ondas/transicoes/Cena.tsx +46 -0
- package/materiais/stripe-ondas/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/suica/base.ts +76 -0
- package/materiais/suica/camera/CameraDeriva.tsx +37 -0
- package/materiais/suica/cores/paleta.json +27 -0
- package/materiais/suica/cores/paleta.png +0 -0
- package/materiais/suica/formas/DiscoFoto.tsx +20 -0
- package/materiais/suica/formas/Indice.tsx +17 -0
- package/materiais/suica/formas/ListaIndice.tsx +25 -0
- package/materiais/suica/formas/Regua.tsx +20 -0
- package/materiais/suica/pecas.json +528 -0
- package/materiais/suica/referencia/analise.md +80 -0
- package/materiais/suica/referencia/quadro-1.png +0 -0
- package/materiais/suica/referencia/quadro-2.png +0 -0
- package/materiais/suica/referencia/quadro-3.png +0 -0
- package/materiais/suica/referencia/quadro-4.png +0 -0
- package/materiais/suica/referencia/referencia.mp4 +0 -0
- package/materiais/suica/regras.md +129 -0
- package/materiais/suica/sons/Som.tsx +38 -0
- package/materiais/suica/texturas/Fundo.tsx +16 -0
- package/materiais/suica/texturas/GradeFotos.tsx +21 -0
- package/materiais/suica/texturas/Particulas.tsx +22 -0
- package/materiais/suica/tipografia/AssinaturaMarca.tsx +21 -0
- package/materiais/suica/tipografia/NumeroGigante.tsx +21 -0
- package/materiais/suica/tipografia/TituloGrade.tsx +38 -0
- package/materiais/suica/transicoes/Cena.tsx +41 -0
- package/materiais/suica/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/synthwave/base.ts +75 -0
- package/materiais/synthwave/camera/CameraDeriva.tsx +37 -0
- package/materiais/synthwave/cores/paleta.json +29 -0
- package/materiais/synthwave/cores/paleta.png +0 -0
- package/materiais/synthwave/formas/Montanhas.tsx +27 -0
- package/materiais/synthwave/formas/Palmeiras.tsx +30 -0
- package/materiais/synthwave/formas/QuadroHUD.tsx +33 -0
- package/materiais/synthwave/formas/SolListrado.tsx +29 -0
- package/materiais/synthwave/pecas.json +491 -0
- package/materiais/synthwave/referencia/analise.md +81 -0
- package/materiais/synthwave/referencia/quadro-1.png +0 -0
- package/materiais/synthwave/referencia/quadro-2.png +0 -0
- package/materiais/synthwave/referencia/quadro-3.png +0 -0
- package/materiais/synthwave/referencia/quadro-4.png +0 -0
- package/materiais/synthwave/referencia/referencia.mp4 +0 -0
- package/materiais/synthwave/regras.md +132 -0
- package/materiais/synthwave/sons/Som.tsx +38 -0
- package/materiais/synthwave/texturas/Estrelas.tsx +27 -0
- package/materiais/synthwave/texturas/Fundo.tsx +20 -0
- package/materiais/synthwave/texturas/Particulas.tsx +22 -0
- package/materiais/synthwave/tipografia/AssinaturaMarca.tsx +26 -0
- package/materiais/synthwave/tipografia/TituloNeon.tsx +30 -0
- package/materiais/synthwave/transicoes/Cena.tsx +41 -0
- package/materiais/synthwave/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/terminal/base.ts +67 -0
- package/materiais/terminal/camera/Camera.tsx +23 -0
- package/materiais/terminal/camera/CameraDeriva.tsx +37 -0
- package/materiais/terminal/cores/paleta.json +32 -0
- package/materiais/terminal/cores/paleta.png +0 -0
- package/materiais/terminal/formas/ArteAscii.tsx +61 -0
- package/materiais/terminal/formas/BarraProgresso.tsx +42 -0
- package/materiais/terminal/formas/BarraStatus.tsx +18 -0
- package/materiais/terminal/formas/BootBios.tsx +41 -0
- package/materiais/terminal/formas/LinhaComando.tsx +31 -0
- package/materiais/terminal/formas/Monitor.tsx +42 -0
- package/materiais/terminal/formas/PainelCaixa.tsx +35 -0
- package/materiais/terminal/formas/Tela.tsx +25 -0
- package/materiais/terminal/pecas.json +591 -0
- package/materiais/terminal/referencia/analise.md +84 -0
- package/materiais/terminal/referencia/quadro-1.png +0 -0
- package/materiais/terminal/referencia/quadro-2.png +0 -0
- package/materiais/terminal/referencia/quadro-3.png +0 -0
- package/materiais/terminal/referencia/quadro-4.png +0 -0
- package/materiais/terminal/referencia/referencia.mp4 +0 -0
- package/materiais/terminal/regras.md +124 -0
- package/materiais/terminal/sons/Som.tsx +32 -0
- package/materiais/terminal/texturas/Fundo.tsx +22 -0
- package/materiais/terminal/texturas/Particulas.tsx +22 -0
- package/materiais/terminal/tipografia/TextoGrande.tsx +35 -0
- package/materiais/terminal/transicoes/Cena.tsx +25 -0
- package/materiais/terminal/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/tiktok-energia/base.ts +92 -0
- package/materiais/tiktok-energia/camera/CameraDeriva.tsx +37 -0
- package/materiais/tiktok-energia/cores/paleta.json +27 -0
- package/materiais/tiktok-energia/cores/paleta.png +0 -0
- package/materiais/tiktok-energia/formas/EmojiSticker.tsx +21 -0
- package/materiais/tiktok-energia/formas/FotoSoco.tsx +27 -0
- package/materiais/tiktok-energia/pecas.json +470 -0
- package/materiais/tiktok-energia/referencia/analise.md +87 -0
- package/materiais/tiktok-energia/referencia/quadro-1.png +0 -0
- package/materiais/tiktok-energia/referencia/quadro-2.png +0 -0
- package/materiais/tiktok-energia/referencia/quadro-3.png +0 -0
- package/materiais/tiktok-energia/referencia/quadro-4.png +0 -0
- package/materiais/tiktok-energia/referencia/referencia.mp4 +0 -0
- package/materiais/tiktok-energia/regras.md +135 -0
- package/materiais/tiktok-energia/sons/Som.tsx +33 -0
- package/materiais/tiktok-energia/texturas/Fundo.tsx +8 -0
- package/materiais/tiktok-energia/texturas/Particulas.tsx +22 -0
- package/materiais/tiktok-energia/tipografia/AssinaturaMarca.tsx +25 -0
- package/materiais/tiktok-energia/tipografia/PalavraSoco.tsx +29 -0
- package/materiais/tiktok-energia/tipografia/TextoCaixa.tsx +25 -0
- package/materiais/tiktok-energia/transicoes/Cena.tsx +48 -0
- package/materiais/tiktok-energia/transicoes/CorteDeCor.tsx +22 -0
- package/materiais/tiktok-energia/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/tunel/base.ts +97 -0
- package/materiais/tunel/camera/CameraDeriva.tsx +37 -0
- package/materiais/tunel/cores/paleta.json +28 -0
- package/materiais/tunel/cores/paleta.png +0 -0
- package/materiais/tunel/formas/LinhasDeVelocidade.tsx +25 -0
- package/materiais/tunel/formas/PlacaVoadora.tsx +28 -0
- package/materiais/tunel/formas/TunelDeFormas.tsx +52 -0
- package/materiais/tunel/pecas.json +475 -0
- package/materiais/tunel/referencia/analise.md +83 -0
- package/materiais/tunel/referencia/quadro-1.png +0 -0
- package/materiais/tunel/referencia/quadro-2.png +0 -0
- package/materiais/tunel/referencia/quadro-3.png +0 -0
- package/materiais/tunel/referencia/quadro-4.png +0 -0
- package/materiais/tunel/referencia/referencia.mp4 +0 -0
- package/materiais/tunel/regras.md +134 -0
- package/materiais/tunel/sons/Som.tsx +33 -0
- package/materiais/tunel/texturas/Fundo.tsx +13 -0
- package/materiais/tunel/texturas/Particulas.tsx +22 -0
- package/materiais/tunel/tipografia/AssinaturaMarca.tsx +22 -0
- package/materiais/tunel/tipografia/NumeroGigante.tsx +28 -0
- package/materiais/tunel/tipografia/TituloTunel.tsx +32 -0
- package/materiais/tunel/transicoes/Cena.tsx +48 -0
- package/materiais/tunel/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/tutorial-tela/base.ts +65 -0
- package/materiais/tutorial-tela/camera/CameraDeriva.tsx +37 -0
- package/materiais/tutorial-tela/camera/CameraTela.tsx +29 -0
- package/materiais/tutorial-tela/cores/paleta.json +32 -0
- package/materiais/tutorial-tela/cores/paleta.png +0 -0
- package/materiais/tutorial-tela/formas/Cursor.tsx +36 -0
- package/materiais/tutorial-tela/formas/DestaqueCaixa.tsx +17 -0
- package/materiais/tutorial-tela/formas/JanelaApp.tsx +81 -0
- package/materiais/tutorial-tela/formas/TeclaAtalho.tsx +29 -0
- package/materiais/tutorial-tela/pecas.json +526 -0
- package/materiais/tutorial-tela/referencia/analise.md +86 -0
- package/materiais/tutorial-tela/referencia/quadro-1.png +0 -0
- package/materiais/tutorial-tela/referencia/quadro-2.png +0 -0
- package/materiais/tutorial-tela/referencia/quadro-3.png +0 -0
- package/materiais/tutorial-tela/referencia/quadro-4.png +0 -0
- package/materiais/tutorial-tela/referencia/referencia.mp4 +0 -0
- package/materiais/tutorial-tela/regras.md +139 -0
- package/materiais/tutorial-tela/sons/Som.tsx +41 -0
- package/materiais/tutorial-tela/texturas/Fundo.tsx +12 -0
- package/materiais/tutorial-tela/texturas/Particulas.tsx +22 -0
- package/materiais/tutorial-tela/tipografia/PassoChamada.tsx +22 -0
- package/materiais/tutorial-tela/tipografia/TituloTela.tsx +30 -0
- package/materiais/tutorial-tela/transicoes/Cena.tsx +33 -0
- package/materiais/tutorial-tela/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/ugc-reels/base.ts +92 -0
- package/materiais/ugc-reels/camera/CameraDeriva.tsx +37 -0
- package/materiais/ugc-reels/cores/paleta.json +28 -0
- package/materiais/ugc-reels/cores/paleta.png +0 -0
- package/materiais/ugc-reels/formas/BotaoLink.tsx +24 -0
- package/materiais/ugc-reels/formas/CabecalhoPerfil.tsx +38 -0
- package/materiais/ugc-reels/formas/Comentario.tsx +29 -0
- package/materiais/ugc-reels/formas/NotaDeMao.tsx +29 -0
- package/materiais/ugc-reels/formas/Reacoes.tsx +26 -0
- package/materiais/ugc-reels/formas/VideoCelular.tsx +37 -0
- package/materiais/ugc-reels/pecas.json +512 -0
- package/materiais/ugc-reels/referencia/analise.md +85 -0
- package/materiais/ugc-reels/referencia/quadro-1.png +0 -0
- package/materiais/ugc-reels/referencia/quadro-2.png +0 -0
- package/materiais/ugc-reels/referencia/quadro-3.png +0 -0
- package/materiais/ugc-reels/referencia/quadro-4.png +0 -0
- package/materiais/ugc-reels/referencia/referencia.mp4 +0 -0
- package/materiais/ugc-reels/regras.md +138 -0
- package/materiais/ugc-reels/sons/Som.tsx +33 -0
- package/materiais/ugc-reels/texturas/Fundo.tsx +8 -0
- package/materiais/ugc-reels/texturas/Particulas.tsx +22 -0
- package/materiais/ugc-reels/tipografia/AssinaturaMarca.tsx +28 -0
- package/materiais/ugc-reels/tipografia/LegendaEmoji.tsx +43 -0
- package/materiais/ugc-reels/transicoes/Cena.tsx +48 -0
- package/materiais/ugc-reels/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/vercel-mono/base.ts +82 -0
- package/materiais/vercel-mono/camera/Camera.tsx +23 -0
- package/materiais/vercel-mono/camera/CameraDeriva.tsx +37 -0
- package/materiais/vercel-mono/cores/paleta.json +25 -0
- package/materiais/vercel-mono/cores/paleta.png +0 -0
- package/materiais/vercel-mono/formas/FaixaOutline.tsx +25 -0
- package/materiais/vercel-mono/formas/Quadro.tsx +28 -0
- package/materiais/vercel-mono/formas/TerminalComando.tsx +33 -0
- package/materiais/vercel-mono/formas/TrianguloGigante.tsx +27 -0
- package/materiais/vercel-mono/pecas.json +504 -0
- package/materiais/vercel-mono/referencia/analise.md +82 -0
- package/materiais/vercel-mono/referencia/quadro-1.png +0 -0
- package/materiais/vercel-mono/referencia/quadro-2.png +0 -0
- package/materiais/vercel-mono/referencia/quadro-3.png +0 -0
- package/materiais/vercel-mono/referencia/quadro-4.png +0 -0
- package/materiais/vercel-mono/referencia/referencia.mp4 +0 -0
- package/materiais/vercel-mono/regras.md +120 -0
- package/materiais/vercel-mono/sons/Som.tsx +39 -0
- package/materiais/vercel-mono/texturas/Fundo.tsx +6 -0
- package/materiais/vercel-mono/texturas/GradeDeNumeros.tsx +27 -0
- package/materiais/vercel-mono/texturas/Particulas.tsx +22 -0
- package/materiais/vercel-mono/tipografia/AssinaturaMarca.tsx +18 -0
- package/materiais/vercel-mono/tipografia/PalavraMono.tsx +31 -0
- package/materiais/vercel-mono/transicoes/Cena.tsx +46 -0
- package/materiais/vercel-mono/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/vhs-90/base.ts +75 -0
- package/materiais/vhs-90/camera/CameraDeriva.tsx +37 -0
- package/materiais/vhs-90/cores/paleta.json +29 -0
- package/materiais/vhs-90/cores/paleta.png +0 -0
- package/materiais/vhs-90/formas/BarrasRastreio.tsx +21 -0
- package/materiais/vhs-90/formas/CapaVHS.tsx +28 -0
- package/materiais/vhs-90/formas/CarimboData.tsx +19 -0
- package/materiais/vhs-90/formas/MenuOSD.tsx +27 -0
- package/materiais/vhs-90/formas/TelaAzul.tsx +29 -0
- package/materiais/vhs-90/pecas.json +507 -0
- package/materiais/vhs-90/referencia/analise.md +81 -0
- package/materiais/vhs-90/referencia/quadro-1.png +0 -0
- package/materiais/vhs-90/referencia/quadro-2.png +0 -0
- package/materiais/vhs-90/referencia/quadro-3.png +0 -0
- package/materiais/vhs-90/referencia/quadro-4.png +0 -0
- package/materiais/vhs-90/referencia/referencia.mp4 +0 -0
- package/materiais/vhs-90/regras.md +133 -0
- package/materiais/vhs-90/sons/Som.tsx +38 -0
- package/materiais/vhs-90/texturas/Fundo.tsx +27 -0
- package/materiais/vhs-90/texturas/Particulas.tsx +22 -0
- package/materiais/vhs-90/tipografia/AssinaturaMarca.tsx +29 -0
- package/materiais/vhs-90/tipografia/TituloFita.tsx +40 -0
- package/materiais/vhs-90/transicoes/Cena.tsx +41 -0
- package/materiais/vhs-90/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/vidro-ios/base.ts +87 -0
- package/materiais/vidro-ios/camera/Camera.tsx +23 -0
- package/materiais/vidro-ios/camera/CameraDeriva.tsx +37 -0
- package/materiais/vidro-ios/cores/paleta.json +28 -0
- package/materiais/vidro-ios/cores/paleta.png +0 -0
- package/materiais/vidro-ios/formas/IlhaDinamica.tsx +24 -0
- package/materiais/vidro-ios/formas/PainelControle.tsx +33 -0
- package/materiais/vidro-ios/formas/PilhaNotificacoes.tsx +29 -0
- package/materiais/vidro-ios/formas/WidgetsGrade.tsx +34 -0
- package/materiais/vidro-ios/formas/vidro.tsx +20 -0
- package/materiais/vidro-ios/pecas.json +504 -0
- package/materiais/vidro-ios/referencia/analise.md +84 -0
- package/materiais/vidro-ios/referencia/quadro-1.png +0 -0
- package/materiais/vidro-ios/referencia/quadro-2.png +0 -0
- package/materiais/vidro-ios/referencia/quadro-3.png +0 -0
- package/materiais/vidro-ios/referencia/quadro-4.png +0 -0
- package/materiais/vidro-ios/referencia/referencia.mp4 +0 -0
- package/materiais/vidro-ios/regras.md +127 -0
- package/materiais/vidro-ios/sons/Som.tsx +39 -0
- package/materiais/vidro-ios/texturas/Fundo.tsx +17 -0
- package/materiais/vidro-ios/texturas/Particulas.tsx +22 -0
- package/materiais/vidro-ios/tipografia/AssinaturaMarca.tsx +21 -0
- package/materiais/vidro-ios/tipografia/TituloVidro.tsx +22 -0
- package/materiais/vidro-ios/transicoes/Cena.tsx +46 -0
- package/materiais/vidro-ios/transicoes/CorteImpacto.tsx +16 -0
- package/materiais/y2k-cromado/base.ts +75 -0
- package/materiais/y2k-cromado/camera/CameraDeriva.tsx +37 -0
- package/materiais/y2k-cromado/cores/paleta.json +29 -0
- package/materiais/y2k-cromado/cores/paleta.png +0 -0
- package/materiais/y2k-cromado/formas/Bolhas.tsx +30 -0
- package/materiais/y2k-cromado/formas/CartaoGloss.tsx +26 -0
- package/materiais/y2k-cromado/formas/FitaMarquee.tsx +20 -0
- package/materiais/y2k-cromado/formas/JanelaY2K.tsx +31 -0
- package/materiais/y2k-cromado/formas/OrbeCromo.tsx +20 -0
- package/materiais/y2k-cromado/pecas.json +527 -0
- package/materiais/y2k-cromado/referencia/analise.md +81 -0
- package/materiais/y2k-cromado/referencia/quadro-1.png +0 -0
- package/materiais/y2k-cromado/referencia/quadro-2.png +0 -0
- package/materiais/y2k-cromado/referencia/quadro-3.png +0 -0
- package/materiais/y2k-cromado/referencia/quadro-4.png +0 -0
- package/materiais/y2k-cromado/referencia/referencia.mp4 +0 -0
- package/materiais/y2k-cromado/regras.md +133 -0
- package/materiais/y2k-cromado/sons/Som.tsx +38 -0
- package/materiais/y2k-cromado/texturas/Brilhos.tsx +28 -0
- package/materiais/y2k-cromado/texturas/Fundo.tsx +18 -0
- package/materiais/y2k-cromado/texturas/Particulas.tsx +22 -0
- package/materiais/y2k-cromado/tipografia/AssinaturaMarca.tsx +25 -0
- package/materiais/y2k-cromado/tipografia/TextoCromo.tsx +34 -0
- package/materiais/y2k-cromado/transicoes/Cena.tsx +41 -0
- package/materiais/y2k-cromado/transicoes/CorteImpacto.tsx +16 -0
- package/package.json +6 -2
- package/skills/apresentacao-pptx/SKILL.md +1 -1
- package/skills/carrossel-conferido/SKILL.md +21 -0
- package/skills/cartaz-conferido/SKILL.md +28 -0
- package/skills/deck-conferido/SKILL.md +5 -4
- package/skills/documento-conferido/SKILL.md +23 -0
- package/vendor/fontes/anton.woff2 +0 -0
- package/vendor/fontes/caveat.woff2 +0 -0
- package/vendor/fontes/inter.woff2 +0 -0
- package/vendor/fontes/jetbrains-mono.woff2 +0 -0
- package/vendor/fontes/montserrat.woff2 +0 -0
- package/voz/primo_voz/__main__.py +1 -1
- package/voz/primo_voz/app.py +8 -8
- package/voz/primo_voz/transcrever.py +2 -2
- package/kits/adesivos/assets/ASSETS.md +0 -22
- package/kits/adesivos/elementos/AdesivoForma.tsx +0 -42
- package/kits/adesivos/elementos/AdesivoFoto.tsx +0 -36
- package/kits/adesivos/elementos/AdesivoTexto.tsx +0 -35
- package/kits/adesivos/elementos/AssinaturaMarca.tsx +0 -36
- package/kits/adesivos/elementos/Cena.tsx +0 -48
- package/kits/adesivos/elementos/ChuvaDeAdesivos.tsx +0 -29
- package/kits/adesivos/elementos/Fundo.tsx +0 -21
- package/kits/adesivos/elementos/Montagem.tsx +0 -68
- package/kits/adesivos/elementos/SeloPreco.tsx +0 -38
- package/kits/adesivos/elementos/Som.tsx +0 -33
- package/kits/adesivos/elementos/TituloEtiquetas.tsx +0 -33
- package/kits/adesivos/elementos/base.ts +0 -101
- package/kits/adesivos/elementos/index.ts +0 -16
- package/kits/adesivos/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/adesivos/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/adesivos/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/adesivos/exemplos/logo-grude.svg +0 -1
- package/kits/adesivos/exemplos/plano.json +0 -328
- package/kits/adesivos/exemplos/roteiro.md +0 -21
- package/kits/adesivos/preview.tsx +0 -15
- package/kits/adesivos/receita.json +0 -212
- package/kits/adesivos/regras/area-segura.md +0 -17
- package/kits/adesivos/regras/cor.md +0 -23
- package/kits/adesivos/regras/movimento.md +0 -17
- package/kits/adesivos/regras/ritmo.md +0 -16
- package/kits/adesivos/regras/som.md +0 -20
- package/kits/adesivos/regras/tipografia.md +0 -16
- package/kits/antes-depois/assets/ASSETS.md +0 -23
- package/kits/antes-depois/elementos/BarraMedidor.tsx +0 -43
- package/kits/antes-depois/elementos/Cena.tsx +0 -41
- package/kits/antes-depois/elementos/FaixaMarquee.tsx +0 -35
- package/kits/antes-depois/elementos/Fundo.tsx +0 -24
- package/kits/antes-depois/elementos/ListaMudancas.tsx +0 -37
- package/kits/antes-depois/elementos/Montagem.tsx +0 -59
- package/kits/antes-depois/elementos/NumeroDelta.tsx +0 -36
- package/kits/antes-depois/elementos/RotuloAntesDepois.tsx +0 -26
- package/kits/antes-depois/elementos/Som.tsx +0 -40
- package/kits/antes-depois/elementos/TelaDividida.tsx +0 -68
- package/kits/antes-depois/elementos/base.ts +0 -82
- package/kits/antes-depois/elementos/index.ts +0 -15
- package/kits/antes-depois/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/antes-depois/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/antes-depois/exemplos/plano.json +0 -276
- package/kits/antes-depois/exemplos/roteiro.md +0 -19
- package/kits/antes-depois/preview.tsx +0 -13
- package/kits/antes-depois/receita.json +0 -21
- package/kits/antes-depois/regras/area-segura.md +0 -21
- package/kits/antes-depois/regras/cor.md +0 -15
- package/kits/antes-depois/regras/movimento.md +0 -23
- package/kits/antes-depois/regras/ritmo.md +0 -15
- package/kits/antes-depois/regras/som.md +0 -20
- package/kits/antes-depois/regras/tipografia.md +0 -18
- package/kits/apple-tipografico/assets/ASSETS.md +0 -23
- package/kits/apple-tipografico/elementos/AssinaturaPreta.tsx +0 -33
- package/kits/apple-tipografico/elementos/Camera.tsx +0 -23
- package/kits/apple-tipografico/elementos/CartaoRadial.tsx +0 -41
- package/kits/apple-tipografico/elementos/Cena.tsx +0 -55
- package/kits/apple-tipografico/elementos/Fundo.tsx +0 -21
- package/kits/apple-tipografico/elementos/LegendaCurta.tsx +0 -51
- package/kits/apple-tipografico/elementos/Montagem.tsx +0 -55
- package/kits/apple-tipografico/elementos/Produto3D.tsx +0 -140
- package/kits/apple-tipografico/elementos/ProdutoFoto.tsx +0 -47
- package/kits/apple-tipografico/elementos/Som.tsx +0 -40
- package/kits/apple-tipografico/elementos/base.ts +0 -111
- package/kits/apple-tipografico/elementos/index.ts +0 -18
- package/kits/apple-tipografico/exemplos/logo-lume.svg +0 -1
- package/kits/apple-tipografico/exemplos/plano.json +0 -56
- package/kits/apple-tipografico/exemplos/roteiro.md +0 -19
- package/kits/apple-tipografico/preview.tsx +0 -12
- package/kits/apple-tipografico/receita.json +0 -22
- package/kits/apple-tipografico/regras/area-segura.md +0 -19
- package/kits/apple-tipografico/regras/cor.md +0 -24
- package/kits/apple-tipografico/regras/movimento.md +0 -29
- package/kits/apple-tipografico/regras/ritmo.md +0 -29
- package/kits/apple-tipografico/regras/som.md +0 -20
- package/kits/apple-tipografico/regras/tipografia.md +0 -21
- package/kits/aquarela/assets/ASSETS.md +0 -21
- package/kits/aquarela/elementos/AnotacaoManual.tsx +0 -40
- package/kits/aquarela/elementos/AssinaturaMarca.tsx +0 -33
- package/kits/aquarela/elementos/Cena.tsx +0 -48
- package/kits/aquarela/elementos/Fundo.tsx +0 -24
- package/kits/aquarela/elementos/ManchaTinta.tsx +0 -46
- package/kits/aquarela/elementos/Montagem.tsx +0 -60
- package/kits/aquarela/elementos/PapelRasgado.tsx +0 -50
- package/kits/aquarela/elementos/Pincelada.tsx +0 -43
- package/kits/aquarela/elementos/Pingos.tsx +0 -31
- package/kits/aquarela/elementos/Som.tsx +0 -33
- package/kits/aquarela/elementos/TituloPincel.tsx +0 -51
- package/kits/aquarela/elementos/base.ts +0 -97
- package/kits/aquarela/elementos/index.ts +0 -16
- package/kits/aquarela/exemplos/logo-mare.svg +0 -1
- package/kits/aquarela/exemplos/plano.json +0 -62
- package/kits/aquarela/exemplos/roteiro.md +0 -21
- package/kits/aquarela/preview.tsx +0 -12
- package/kits/aquarela/receita.json +0 -213
- package/kits/aquarela/regras/area-segura.md +0 -17
- package/kits/aquarela/regras/cor.md +0 -23
- package/kits/aquarela/regras/movimento.md +0 -19
- package/kits/aquarela/regras/ritmo.md +0 -17
- package/kits/aquarela/regras/som.md +0 -20
- package/kits/aquarela/regras/tipografia.md +0 -16
- package/kits/aurora/assets/ASSETS.md +0 -21
- package/kits/aurora/elementos/AssinaturaMarca.tsx +0 -24
- package/kits/aurora/elementos/CartaoVidro.tsx +0 -29
- package/kits/aurora/elementos/Cena.tsx +0 -48
- package/kits/aurora/elementos/CeuEstrelado.tsx +0 -22
- package/kits/aurora/elementos/CortinaDeLuz.tsx +0 -36
- package/kits/aurora/elementos/Fundo.tsx +0 -35
- package/kits/aurora/elementos/Legenda.tsx +0 -23
- package/kits/aurora/elementos/Montagem.tsx +0 -68
- package/kits/aurora/elementos/Montanhas.tsx +0 -24
- package/kits/aurora/elementos/Som.tsx +0 -33
- package/kits/aurora/elementos/TituloSerif.tsx +0 -36
- package/kits/aurora/elementos/base.ts +0 -93
- package/kits/aurora/elementos/index.ts +0 -16
- package/kits/aurora/exemplos/logo-boreal.svg +0 -1
- package/kits/aurora/exemplos/plano.json +0 -204
- package/kits/aurora/exemplos/roteiro.md +0 -19
- package/kits/aurora/preview.tsx +0 -12
- package/kits/aurora/receita.json +0 -146
- package/kits/aurora/regras/area-segura.md +0 -18
- package/kits/aurora/regras/cor.md +0 -24
- package/kits/aurora/regras/movimento.md +0 -20
- package/kits/aurora/regras/ritmo.md +0 -14
- package/kits/aurora/regras/som.md +0 -20
- package/kits/aurora/regras/tipografia.md +0 -15
- package/kits/bauhaus/assets/ASSETS.md +0 -18
- package/kits/bauhaus/elementos/AssinaturaMarca.tsx +0 -26
- package/kits/bauhaus/elementos/BarraDiagonal.tsx +0 -20
- package/kits/bauhaus/elementos/Camera.tsx +0 -21
- package/kits/bauhaus/elementos/Cena.tsx +0 -36
- package/kits/bauhaus/elementos/ComposicaoGeometrica.tsx +0 -54
- package/kits/bauhaus/elementos/Fundo.tsx +0 -13
- package/kits/bauhaus/elementos/ListaFaixas.tsx +0 -27
- package/kits/bauhaus/elementos/Montagem.tsx +0 -55
- package/kits/bauhaus/elementos/NumeroBauhaus.tsx +0 -21
- package/kits/bauhaus/elementos/Overlay.tsx +0 -18
- package/kits/bauhaus/elementos/Som.tsx +0 -30
- package/kits/bauhaus/elementos/TituloBauhaus.tsx +0 -32
- package/kits/bauhaus/elementos/base.ts +0 -74
- package/kits/bauhaus/elementos/index.ts +0 -16
- package/kits/bauhaus/exemplos/plano.json +0 -221
- package/kits/bauhaus/exemplos/roteiro.md +0 -20
- package/kits/bauhaus/preview.tsx +0 -12
- package/kits/bauhaus/receita.json +0 -174
- package/kits/bauhaus/regras/area-segura.md +0 -15
- package/kits/bauhaus/regras/cor.md +0 -13
- package/kits/bauhaus/regras/movimento.md +0 -17
- package/kits/bauhaus/regras/ritmo.md +0 -15
- package/kits/bauhaus/regras/som.md +0 -18
- package/kits/bauhaus/regras/tipografia.md +0 -20
- package/kits/brutalista/assets/ASSETS.md +0 -23
- package/kits/brutalista/elementos/AssinaturaMarca.tsx +0 -21
- package/kits/brutalista/elementos/BlocoSombra.tsx +0 -18
- package/kits/brutalista/elementos/CartaoFotoBruto.tsx +0 -19
- package/kits/brutalista/elementos/Cena.tsx +0 -41
- package/kits/brutalista/elementos/ContadorGrande.tsx +0 -21
- package/kits/brutalista/elementos/FitaAlerta.tsx +0 -20
- package/kits/brutalista/elementos/Fundo.tsx +0 -9
- package/kits/brutalista/elementos/ListaBruta.tsx +0 -23
- package/kits/brutalista/elementos/MonoEnorme.tsx +0 -43
- package/kits/brutalista/elementos/Montagem.tsx +0 -62
- package/kits/brutalista/elementos/QuadroCor.tsx +0 -14
- package/kits/brutalista/elementos/Som.tsx +0 -38
- package/kits/brutalista/elementos/Terminal.tsx +0 -25
- package/kits/brutalista/elementos/base.ts +0 -71
- package/kits/brutalista/elementos/index.ts +0 -18
- package/kits/brutalista/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/brutalista/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/brutalista/exemplos/logo-bloco.svg +0 -1
- package/kits/brutalista/exemplos/plano.json +0 -52
- package/kits/brutalista/exemplos/roteiro.md +0 -19
- package/kits/brutalista/preview.tsx +0 -20
- package/kits/brutalista/receita.json +0 -195
- package/kits/brutalista/regras/area-segura.md +0 -18
- package/kits/brutalista/regras/cor.md +0 -12
- package/kits/brutalista/regras/movimento.md +0 -16
- package/kits/brutalista/regras/ritmo.md +0 -16
- package/kits/brutalista/regras/som.md +0 -21
- package/kits/brutalista/regras/tipografia.md +0 -16
- package/kits/campos-de-cor/assets/ASSETS.md +0 -19
- package/kits/campos-de-cor/elementos/AssinaturaMarca.tsx +0 -18
- package/kits/campos-de-cor/elementos/Asterisco.tsx +0 -26
- package/kits/campos-de-cor/elementos/Camera.tsx +0 -23
- package/kits/campos-de-cor/elementos/CampoDeCor.tsx +0 -39
- package/kits/campos-de-cor/elementos/Cena.tsx +0 -46
- package/kits/campos-de-cor/elementos/FitaDeTexto.tsx +0 -24
- package/kits/campos-de-cor/elementos/FormaGeometrica.tsx +0 -37
- package/kits/campos-de-cor/elementos/Fundo.tsx +0 -11
- package/kits/campos-de-cor/elementos/LegendaItalica.tsx +0 -12
- package/kits/campos-de-cor/elementos/ListaRegua.tsx +0 -30
- package/kits/campos-de-cor/elementos/Montagem.tsx +0 -62
- package/kits/campos-de-cor/elementos/PalavraGigante.tsx +0 -44
- package/kits/campos-de-cor/elementos/Som.tsx +0 -39
- package/kits/campos-de-cor/elementos/base.ts +0 -87
- package/kits/campos-de-cor/elementos/index.ts +0 -17
- package/kits/campos-de-cor/exemplos/logo-pulso.svg +0 -1
- package/kits/campos-de-cor/exemplos/plano.json +0 -258
- package/kits/campos-de-cor/exemplos/roteiro.md +0 -19
- package/kits/campos-de-cor/preview.tsx +0 -12
- package/kits/campos-de-cor/receita.json +0 -174
- package/kits/campos-de-cor/regras/area-segura.md +0 -15
- package/kits/campos-de-cor/regras/cor.md +0 -14
- package/kits/campos-de-cor/regras/movimento.md +0 -15
- package/kits/campos-de-cor/regras/ritmo.md +0 -15
- package/kits/campos-de-cor/regras/som.md +0 -18
- package/kits/campos-de-cor/regras/tipografia.md +0 -13
- package/kits/cartaz-cinetico/assets/ASSETS.md +0 -22
- package/kits/cartaz-cinetico/elementos/AssinaturaMarca.tsx +0 -31
- package/kits/cartaz-cinetico/elementos/CartazPalavra.tsx +0 -40
- package/kits/cartaz-cinetico/elementos/Cena.tsx +0 -41
- package/kits/cartaz-cinetico/elementos/CirculoPoster.tsx +0 -22
- package/kits/cartaz-cinetico/elementos/EcoPalavra.tsx +0 -27
- package/kits/cartaz-cinetico/elementos/Fundo.tsx +0 -16
- package/kits/cartaz-cinetico/elementos/Montagem.tsx +0 -59
- package/kits/cartaz-cinetico/elementos/PilhaCartaz.tsx +0 -40
- package/kits/cartaz-cinetico/elementos/RoletaPalavras.tsx +0 -30
- package/kits/cartaz-cinetico/elementos/Selo.tsx +0 -25
- package/kits/cartaz-cinetico/elementos/Som.tsx +0 -38
- package/kits/cartaz-cinetico/elementos/base.ts +0 -72
- package/kits/cartaz-cinetico/elementos/index.ts +0 -16
- package/kits/cartaz-cinetico/exemplos/logo-feira.svg +0 -1
- package/kits/cartaz-cinetico/exemplos/plano.json +0 -55
- package/kits/cartaz-cinetico/exemplos/roteiro.md +0 -20
- package/kits/cartaz-cinetico/preview.tsx +0 -16
- package/kits/cartaz-cinetico/receita.json +0 -209
- package/kits/cartaz-cinetico/regras/area-segura.md +0 -19
- package/kits/cartaz-cinetico/regras/cor.md +0 -13
- package/kits/cartaz-cinetico/regras/movimento.md +0 -16
- package/kits/cartaz-cinetico/regras/ritmo.md +0 -17
- package/kits/cartaz-cinetico/regras/som.md +0 -21
- package/kits/cartaz-cinetico/regras/tipografia.md +0 -16
- package/kits/colagem/assets/ASSETS.md +0 -25
- package/kits/colagem/elementos/AssinaturaMarca.tsx +0 -17
- package/kits/colagem/elementos/Camera.tsx +0 -21
- package/kits/colagem/elementos/Cena.tsx +0 -36
- package/kits/colagem/elementos/FitaAdesiva.tsx +0 -11
- package/kits/colagem/elementos/FotoRasgada.tsx +0 -26
- package/kits/colagem/elementos/Fundo.tsx +0 -16
- package/kits/colagem/elementos/ListaRecortes.tsx +0 -23
- package/kits/colagem/elementos/Montagem.tsx +0 -56
- package/kits/colagem/elementos/NotaDatilografada.tsx +0 -35
- package/kits/colagem/elementos/RecorteForma.tsx +0 -23
- package/kits/colagem/elementos/Som.tsx +0 -30
- package/kits/colagem/elementos/TituloRecorte.tsx +0 -34
- package/kits/colagem/elementos/base.ts +0 -77
- package/kits/colagem/elementos/index.ts +0 -17
- package/kits/colagem/elementos/rasgado.ts +0 -16
- package/kits/colagem/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/colagem/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/colagem/exemplos/plano.json +0 -228
- package/kits/colagem/exemplos/roteiro.md +0 -20
- package/kits/colagem/preview.tsx +0 -13
- package/kits/colagem/receita.json +0 -171
- package/kits/colagem/regras/area-segura.md +0 -15
- package/kits/colagem/regras/cor.md +0 -16
- package/kits/colagem/regras/movimento.md +0 -18
- package/kits/colagem/regras/ritmo.md +0 -15
- package/kits/colagem/regras/som.md +0 -18
- package/kits/colagem/regras/tipografia.md +0 -18
- package/kits/contagem/assets/ASSETS.md +0 -20
- package/kits/contagem/elementos/AnelTempo.tsx +0 -36
- package/kits/contagem/elementos/BarraDias.tsx +0 -41
- package/kits/contagem/elementos/CarimboData.tsx +0 -37
- package/kits/contagem/elementos/Cena.tsx +0 -39
- package/kits/contagem/elementos/Fundo.tsx +0 -27
- package/kits/contagem/elementos/Montagem.tsx +0 -58
- package/kits/contagem/elementos/NumeroRolando.tsx +0 -49
- package/kits/contagem/elementos/RelogioFlip.tsx +0 -51
- package/kits/contagem/elementos/Som.tsx +0 -41
- package/kits/contagem/elementos/base.ts +0 -79
- package/kits/contagem/elementos/index.ts +0 -14
- package/kits/contagem/exemplos/plano.json +0 -48
- package/kits/contagem/exemplos/roteiro.md +0 -19
- package/kits/contagem/preview.tsx +0 -9
- package/kits/contagem/receita.json +0 -21
- package/kits/contagem/regras/area-segura.md +0 -16
- package/kits/contagem/regras/cor.md +0 -14
- package/kits/contagem/regras/movimento.md +0 -23
- package/kits/contagem/regras/ritmo.md +0 -15
- package/kits/contagem/regras/som.md +0 -21
- package/kits/contagem/regras/tipografia.md +0 -16
- package/kits/convite-evento/assets/ASSETS.md +0 -19
- package/kits/convite-evento/elementos/BotaoInscricao.tsx +0 -36
- package/kits/convite-evento/elementos/Cena.tsx +0 -39
- package/kits/convite-evento/elementos/DataGigante.tsx +0 -37
- package/kits/convite-evento/elementos/Fundo.tsx +0 -30
- package/kits/convite-evento/elementos/IngressoBilhete.tsx +0 -40
- package/kits/convite-evento/elementos/LugarGigante.tsx +0 -38
- package/kits/convite-evento/elementos/Montagem.tsx +0 -59
- package/kits/convite-evento/elementos/SeloRotativo.tsx +0 -32
- package/kits/convite-evento/elementos/Som.tsx +0 -40
- package/kits/convite-evento/elementos/TituloEvento.tsx +0 -33
- package/kits/convite-evento/elementos/base.ts +0 -82
- package/kits/convite-evento/elementos/index.ts +0 -15
- package/kits/convite-evento/exemplos/plano.json +0 -49
- package/kits/convite-evento/exemplos/roteiro.md +0 -19
- package/kits/convite-evento/preview.tsx +0 -9
- package/kits/convite-evento/receita.json +0 -21
- package/kits/convite-evento/regras/area-segura.md +0 -20
- package/kits/convite-evento/regras/cor.md +0 -13
- package/kits/convite-evento/regras/movimento.md +0 -20
- package/kits/convite-evento/regras/ritmo.md +0 -15
- package/kits/convite-evento/regras/som.md +0 -20
- package/kits/convite-evento/regras/tipografia.md +0 -18
- package/kits/corte-podcast/assets/ASSETS.md +0 -19
- package/kits/corte-podcast/elementos/BarraEpisodio.tsx +0 -43
- package/kits/corte-podcast/elementos/CartaoConvidado.tsx +0 -32
- package/kits/corte-podcast/elementos/Cena.tsx +0 -41
- package/kits/corte-podcast/elementos/CitacaoGrande.tsx +0 -42
- package/kits/corte-podcast/elementos/Fundo.tsx +0 -27
- package/kits/corte-podcast/elementos/LegendaKaraoke.tsx +0 -32
- package/kits/corte-podcast/elementos/Montagem.tsx +0 -59
- package/kits/corte-podcast/elementos/OndaAudio.tsx +0 -41
- package/kits/corte-podcast/elementos/SeloEpisodio.tsx +0 -33
- package/kits/corte-podcast/elementos/Som.tsx +0 -40
- package/kits/corte-podcast/elementos/base.ts +0 -82
- package/kits/corte-podcast/elementos/index.ts +0 -15
- package/kits/corte-podcast/exemplos/plano.json +0 -62
- package/kits/corte-podcast/exemplos/roteiro.md +0 -20
- package/kits/corte-podcast/preview.tsx +0 -9
- package/kits/corte-podcast/receita.json +0 -21
- package/kits/corte-podcast/regras/area-segura.md +0 -18
- package/kits/corte-podcast/regras/cor.md +0 -15
- package/kits/corte-podcast/regras/movimento.md +0 -18
- package/kits/corte-podcast/regras/ritmo.md +0 -16
- package/kits/corte-podcast/regras/som.md +0 -20
- package/kits/corte-podcast/regras/tipografia.md +0 -16
- package/kits/cubos/assets/ASSETS.md +0 -21
- package/kits/cubos/elementos/AssinaturaMarca.tsx +0 -29
- package/kits/cubos/elementos/Cena.tsx +0 -48
- package/kits/cubos/elementos/Cubo.tsx +0 -40
- package/kits/cubos/elementos/CuboGiratorio.tsx +0 -37
- package/kits/cubos/elementos/Fundo.tsx +0 -15
- package/kits/cubos/elementos/Montagem.tsx +0 -67
- package/kits/cubos/elementos/MontagemDeCubos.tsx +0 -58
- package/kits/cubos/elementos/PlacaBloco.tsx +0 -29
- package/kits/cubos/elementos/Som.tsx +0 -33
- package/kits/cubos/elementos/TorreDeCubos.tsx +0 -39
- package/kits/cubos/elementos/base.ts +0 -97
- package/kits/cubos/elementos/index.ts +0 -15
- package/kits/cubos/exemplos/logo-encaixa.svg +0 -1
- package/kits/cubos/exemplos/plano.json +0 -45
- package/kits/cubos/exemplos/roteiro.md +0 -20
- package/kits/cubos/preview.tsx +0 -12
- package/kits/cubos/receita.json +0 -151
- package/kits/cubos/regras/area-segura.md +0 -18
- package/kits/cubos/regras/cor.md +0 -23
- package/kits/cubos/regras/movimento.md +0 -17
- package/kits/cubos/regras/ritmo.md +0 -14
- package/kits/cubos/regras/som.md +0 -20
- package/kits/cubos/regras/tipografia.md +0 -15
- package/kits/dashboard-dados/assets/ASSETS.md +0 -18
- package/kits/dashboard-dados/elementos/AssinaturaMarca.tsx +0 -19
- package/kits/dashboard-dados/elementos/BarrasCrescendo.tsx +0 -27
- package/kits/dashboard-dados/elementos/Camera.tsx +0 -23
- package/kits/dashboard-dados/elementos/Cena.tsx +0 -46
- package/kits/dashboard-dados/elementos/Fundo.tsx +0 -12
- package/kits/dashboard-dados/elementos/LinhaTendencia.tsx +0 -29
- package/kits/dashboard-dados/elementos/Montagem.tsx +0 -60
- package/kits/dashboard-dados/elementos/NumeroGigante.tsx +0 -21
- package/kits/dashboard-dados/elementos/RankingBarras.tsx +0 -27
- package/kits/dashboard-dados/elementos/RoscaDados.tsx +0 -39
- package/kits/dashboard-dados/elementos/Som.tsx +0 -39
- package/kits/dashboard-dados/elementos/base.ts +0 -87
- package/kits/dashboard-dados/elementos/index.ts +0 -16
- package/kits/dashboard-dados/exemplos/logo-radar.svg +0 -1
- package/kits/dashboard-dados/exemplos/plano.json +0 -325
- package/kits/dashboard-dados/exemplos/roteiro.md +0 -20
- package/kits/dashboard-dados/preview.tsx +0 -12
- package/kits/dashboard-dados/receita.json +0 -173
- package/kits/dashboard-dados/regras/area-segura.md +0 -13
- package/kits/dashboard-dados/regras/cor.md +0 -17
- package/kits/dashboard-dados/regras/movimento.md +0 -17
- package/kits/dashboard-dados/regras/ritmo.md +0 -14
- package/kits/dashboard-dados/regras/som.md +0 -18
- package/kits/dashboard-dados/regras/tipografia.md +0 -16
- package/kits/depoimento/assets/ASSETS.md +0 -20
- package/kits/depoimento/elementos/Avatar.tsx +0 -37
- package/kits/depoimento/elementos/CartaoDepoimento.tsx +0 -69
- package/kits/depoimento/elementos/Cena.tsx +0 -39
- package/kits/depoimento/elementos/Estrelas.tsx +0 -34
- package/kits/depoimento/elementos/FaixaAvatares.tsx +0 -41
- package/kits/depoimento/elementos/Fundo.tsx +0 -23
- package/kits/depoimento/elementos/Montagem.tsx +0 -60
- package/kits/depoimento/elementos/NotaGigante.tsx +0 -38
- package/kits/depoimento/elementos/PilhaCartoes.tsx +0 -37
- package/kits/depoimento/elementos/SeloVerificado.tsx +0 -29
- package/kits/depoimento/elementos/Som.tsx +0 -41
- package/kits/depoimento/elementos/base.ts +0 -83
- package/kits/depoimento/elementos/index.ts +0 -16
- package/kits/depoimento/exemplos/plano.json +0 -57
- package/kits/depoimento/exemplos/roteiro.md +0 -19
- package/kits/depoimento/preview.tsx +0 -9
- package/kits/depoimento/receita.json +0 -21
- package/kits/depoimento/regras/area-segura.md +0 -17
- package/kits/depoimento/regras/cor.md +0 -16
- package/kits/depoimento/regras/movimento.md +0 -20
- package/kits/depoimento/regras/ritmo.md +0 -15
- package/kits/depoimento/regras/som.md +0 -21
- package/kits/depoimento/regras/tipografia.md +0 -17
- package/kits/infografico/assets/ASSETS.md +0 -19
- package/kits/infografico/elementos/Anotacao.tsx +0 -34
- package/kits/infografico/elementos/CadeiaPassos.tsx +0 -49
- package/kits/infografico/elementos/Cena.tsx +0 -39
- package/kits/infografico/elementos/Fundo.tsx +0 -23
- package/kits/infografico/elementos/GraficoBarras.tsx +0 -41
- package/kits/infografico/elementos/Icone.tsx +0 -35
- package/kits/infografico/elementos/Montagem.tsx +0 -60
- package/kits/infografico/elementos/NoProcesso.tsx +0 -33
- package/kits/infografico/elementos/NumeroDestaque.tsx +0 -35
- package/kits/infografico/elementos/SetaCurva.tsx +0 -33
- package/kits/infografico/elementos/Som.tsx +0 -40
- package/kits/infografico/elementos/base.ts +0 -80
- package/kits/infografico/elementos/index.ts +0 -16
- package/kits/infografico/exemplos/plano.json +0 -49
- package/kits/infografico/exemplos/roteiro.md +0 -19
- package/kits/infografico/preview.tsx +0 -9
- package/kits/infografico/receita.json +0 -21
- package/kits/infografico/regras/area-segura.md +0 -17
- package/kits/infografico/regras/cor.md +0 -15
- package/kits/infografico/regras/movimento.md +0 -20
- package/kits/infografico/regras/ritmo.md +0 -15
- package/kits/infografico/regras/som.md +0 -20
- package/kits/infografico/regras/tipografia.md +0 -16
- package/kits/isometrico/assets/ASSETS.md +0 -18
- package/kits/isometrico/elementos/AssinaturaMarca.tsx +0 -24
- package/kits/isometrico/elementos/BlocosMontando.tsx +0 -36
- package/kits/isometrico/elementos/Camera.tsx +0 -23
- package/kits/isometrico/elementos/Cena.tsx +0 -46
- package/kits/isometrico/elementos/CidadeDeDados.tsx +0 -33
- package/kits/isometrico/elementos/Fundo.tsx +0 -13
- package/kits/isometrico/elementos/LegendaPlaca.tsx +0 -18
- package/kits/isometrico/elementos/Montagem.tsx +0 -60
- package/kits/isometrico/elementos/RedeDeBlocos.tsx +0 -41
- package/kits/isometrico/elementos/Som.tsx +0 -39
- package/kits/isometrico/elementos/TextoNoChao.tsx +0 -28
- package/kits/isometrico/elementos/base.ts +0 -86
- package/kits/isometrico/elementos/index.ts +0 -16
- package/kits/isometrico/exemplos/logo-nodo.svg +0 -1
- package/kits/isometrico/exemplos/plano.json +0 -433
- package/kits/isometrico/exemplos/roteiro.md +0 -20
- package/kits/isometrico/preview.tsx +0 -12
- package/kits/isometrico/receita.json +0 -155
- package/kits/isometrico/regras/area-segura.md +0 -13
- package/kits/isometrico/regras/cor.md +0 -18
- package/kits/isometrico/regras/movimento.md +0 -16
- package/kits/isometrico/regras/ritmo.md +0 -13
- package/kits/isometrico/regras/som.md +0 -18
- package/kits/isometrico/regras/tipografia.md +0 -12
- package/kits/jornal/assets/ASSETS.md +0 -24
- package/kits/jornal/elementos/AssinaturaMarca.tsx +0 -25
- package/kits/jornal/elementos/Cabecalho.tsx +0 -21
- package/kits/jornal/elementos/Carimbo.tsx +0 -18
- package/kits/jornal/elementos/Cena.tsx +0 -41
- package/kits/jornal/elementos/Colunas.tsx +0 -24
- package/kits/jornal/elementos/FotoMeiaTinta.tsx +0 -20
- package/kits/jornal/elementos/Fundo.tsx +0 -18
- package/kits/jornal/elementos/JornalGirando.tsx +0 -27
- package/kits/jornal/elementos/Manchete.tsx +0 -30
- package/kits/jornal/elementos/Montagem.tsx +0 -61
- package/kits/jornal/elementos/Som.tsx +0 -38
- package/kits/jornal/elementos/Ticker.tsx +0 -19
- package/kits/jornal/elementos/base.ts +0 -76
- package/kits/jornal/elementos/index.ts +0 -17
- package/kits/jornal/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/jornal/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/jornal/exemplos/logo-esquina.svg +0 -1
- package/kits/jornal/exemplos/plano.json +0 -48
- package/kits/jornal/exemplos/roteiro.md +0 -19
- package/kits/jornal/preview.tsx +0 -17
- package/kits/jornal/receita.json +0 -170
- package/kits/jornal/regras/area-segura.md +0 -19
- package/kits/jornal/regras/cor.md +0 -14
- package/kits/jornal/regras/movimento.md +0 -16
- package/kits/jornal/regras/ritmo.md +0 -15
- package/kits/jornal/regras/som.md +0 -21
- package/kits/jornal/regras/tipografia.md +0 -17
- package/kits/legenda-viva/assets/ASSETS.md +0 -23
- package/kits/legenda-viva/elementos/AssinaturaMarca.tsx +0 -29
- package/kits/legenda-viva/elementos/Cena.tsx +0 -41
- package/kits/legenda-viva/elementos/ChipTema.tsx +0 -19
- package/kits/legenda-viva/elementos/Fundo.tsx +0 -6
- package/kits/legenda-viva/elementos/LegendaCaixa.tsx +0 -36
- package/kits/legenda-viva/elementos/LegendaPalavra.tsx +0 -32
- package/kits/legenda-viva/elementos/Montagem.tsx +0 -59
- package/kits/legenda-viva/elementos/OndaVoz.tsx +0 -23
- package/kits/legenda-viva/elementos/PalavraGigante.tsx +0 -18
- package/kits/legenda-viva/elementos/QuadroFalante.tsx +0 -17
- package/kits/legenda-viva/elementos/Som.tsx +0 -38
- package/kits/legenda-viva/elementos/base.ts +0 -73
- package/kits/legenda-viva/elementos/index.ts +0 -16
- package/kits/legenda-viva/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/legenda-viva/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/legenda-viva/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/legenda-viva/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/legenda-viva/exemplos/logo-dica.svg +0 -1
- package/kits/legenda-viva/exemplos/plano.json +0 -45
- package/kits/legenda-viva/exemplos/roteiro.md +0 -18
- package/kits/legenda-viva/preview.tsx +0 -19
- package/kits/legenda-viva/receita.json +0 -171
- package/kits/legenda-viva/regras/area-segura.md +0 -19
- package/kits/legenda-viva/regras/cor.md +0 -14
- package/kits/legenda-viva/regras/movimento.md +0 -16
- package/kits/legenda-viva/regras/ritmo.md +0 -15
- package/kits/legenda-viva/regras/som.md +0 -21
- package/kits/legenda-viva/regras/tipografia.md +0 -16
- package/kits/luxo/assets/ASSETS.md +0 -20
- package/kits/luxo/elementos/Cena.tsx +0 -36
- package/kits/luxo/elementos/ConviteOuro.tsx +0 -34
- package/kits/luxo/elementos/Fundo.tsx +0 -26
- package/kits/luxo/elementos/LegendaFina.tsx +0 -25
- package/kits/luxo/elementos/LinhaOuro.tsx +0 -24
- package/kits/luxo/elementos/MolduraArco.tsx +0 -36
- package/kits/luxo/elementos/Monograma.tsx +0 -35
- package/kits/luxo/elementos/Montagem.tsx +0 -59
- package/kits/luxo/elementos/Som.tsx +0 -40
- package/kits/luxo/elementos/TituloSerifa.tsx +0 -35
- package/kits/luxo/elementos/base.ts +0 -85
- package/kits/luxo/elementos/index.ts +0 -15
- package/kits/luxo/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/luxo/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/luxo/exemplos/plano.json +0 -145
- package/kits/luxo/exemplos/roteiro.md +0 -18
- package/kits/luxo/preview.tsx +0 -13
- package/kits/luxo/receita.json +0 -18
- package/kits/luxo/regras/area-segura.md +0 -16
- package/kits/luxo/regras/cor.md +0 -16
- package/kits/luxo/regras/movimento.md +0 -19
- package/kits/luxo/regras/ritmo.md +0 -14
- package/kits/luxo/regras/som.md +0 -21
- package/kits/luxo/regras/tipografia.md +0 -17
- package/kits/mapa/assets/ASSETS.md +0 -20
- package/kits/mapa/elementos/CartaoEndereco.tsx +0 -40
- package/kits/mapa/elementos/Cena.tsx +0 -41
- package/kits/mapa/elementos/ChipTempo.tsx +0 -29
- package/kits/mapa/elementos/Fundo.tsx +0 -25
- package/kits/mapa/elementos/MapaBase.tsx +0 -63
- package/kits/mapa/elementos/Montagem.tsx +0 -59
- package/kits/mapa/elementos/Pino.tsx +0 -38
- package/kits/mapa/elementos/RotaAnimada.tsx +0 -38
- package/kits/mapa/elementos/Som.tsx +0 -41
- package/kits/mapa/elementos/TituloLocal.tsx +0 -38
- package/kits/mapa/elementos/base.ts +0 -89
- package/kits/mapa/elementos/index.ts +0 -15
- package/kits/mapa/exemplos/plano.json +0 -48
- package/kits/mapa/exemplos/roteiro.md +0 -19
- package/kits/mapa/preview.tsx +0 -9
- package/kits/mapa/receita.json +0 -21
- package/kits/mapa/regras/area-segura.md +0 -15
- package/kits/mapa/regras/cor.md +0 -18
- package/kits/mapa/regras/movimento.md +0 -21
- package/kits/mapa/regras/ritmo.md +0 -15
- package/kits/mapa/regras/som.md +0 -21
- package/kits/mapa/regras/tipografia.md +0 -16
- package/kits/massinha/assets/ASSETS.md +0 -18
- package/kits/massinha/elementos/AssinaturaMarca.tsx +0 -20
- package/kits/massinha/elementos/BichinhoMassa.tsx +0 -30
- package/kits/massinha/elementos/BolasMassa.tsx +0 -25
- package/kits/massinha/elementos/Camera.tsx +0 -21
- package/kits/massinha/elementos/Cena.tsx +0 -36
- package/kits/massinha/elementos/FormaMassa.tsx +0 -23
- package/kits/massinha/elementos/Fundo.tsx +0 -12
- package/kits/massinha/elementos/ListaMassa.tsx +0 -19
- package/kits/massinha/elementos/Montagem.tsx +0 -56
- package/kits/massinha/elementos/Overlay.tsx +0 -11
- package/kits/massinha/elementos/PlacaMassa.tsx +0 -24
- package/kits/massinha/elementos/Som.tsx +0 -30
- package/kits/massinha/elementos/TituloMassa.tsx +0 -31
- package/kits/massinha/elementos/base.ts +0 -79
- package/kits/massinha/elementos/index.ts +0 -17
- package/kits/massinha/exemplos/plano.json +0 -220
- package/kits/massinha/exemplos/roteiro.md +0 -20
- package/kits/massinha/preview.tsx +0 -12
- package/kits/massinha/receita.json +0 -170
- package/kits/massinha/regras/area-segura.md +0 -15
- package/kits/massinha/regras/cor.md +0 -18
- package/kits/massinha/regras/movimento.md +0 -17
- package/kits/massinha/regras/ritmo.md +0 -15
- package/kits/massinha/regras/som.md +0 -17
- package/kits/massinha/regras/tipografia.md +0 -18
- package/kits/memphis/assets/ASSETS.md +0 -18
- package/kits/memphis/elementos/AssinaturaMarca.tsx +0 -20
- package/kits/memphis/elementos/Camera.tsx +0 -21
- package/kits/memphis/elementos/CartaoMemphis.tsx +0 -16
- package/kits/memphis/elementos/Cena.tsx +0 -36
- package/kits/memphis/elementos/FitaMarquee.tsx +0 -21
- package/kits/memphis/elementos/FormasMemphis.tsx +0 -46
- package/kits/memphis/elementos/Fundo.tsx +0 -15
- package/kits/memphis/elementos/ListaPilulas.tsx +0 -17
- package/kits/memphis/elementos/Montagem.tsx +0 -56
- package/kits/memphis/elementos/NumeroGigante.tsx +0 -19
- package/kits/memphis/elementos/Overlay.tsx +0 -23
- package/kits/memphis/elementos/Som.tsx +0 -30
- package/kits/memphis/elementos/TituloMemphis.tsx +0 -28
- package/kits/memphis/elementos/base.ts +0 -78
- package/kits/memphis/elementos/index.ts +0 -17
- package/kits/memphis/exemplos/plano.json +0 -314
- package/kits/memphis/exemplos/roteiro.md +0 -20
- package/kits/memphis/preview.tsx +0 -12
- package/kits/memphis/receita.json +0 -174
- package/kits/memphis/regras/area-segura.md +0 -14
- package/kits/memphis/regras/cor.md +0 -17
- package/kits/memphis/regras/movimento.md +0 -18
- package/kits/memphis/regras/ritmo.md +0 -15
- package/kits/memphis/regras/som.md +0 -18
- package/kits/memphis/regras/tipografia.md +0 -19
- package/kits/metal-liquido/assets/ASSETS.md +0 -21
- package/kits/metal-liquido/elementos/AnelCromo.tsx +0 -28
- package/kits/metal-liquido/elementos/AssinaturaMarca.tsx +0 -26
- package/kits/metal-liquido/elementos/BolhasCromadas.tsx +0 -53
- package/kits/metal-liquido/elementos/Cena.tsx +0 -48
- package/kits/metal-liquido/elementos/EsferaCromo.tsx +0 -32
- package/kits/metal-liquido/elementos/Fundo.tsx +0 -20
- package/kits/metal-liquido/elementos/Montagem.tsx +0 -67
- package/kits/metal-liquido/elementos/PilulaCromo.tsx +0 -23
- package/kits/metal-liquido/elementos/Som.tsx +0 -33
- package/kits/metal-liquido/elementos/TituloCromo.tsx +0 -32
- package/kits/metal-liquido/elementos/base.ts +0 -94
- package/kits/metal-liquido/elementos/index.ts +0 -15
- package/kits/metal-liquido/exemplos/logo-mercurio.svg +0 -1
- package/kits/metal-liquido/exemplos/plano.json +0 -48
- package/kits/metal-liquido/exemplos/roteiro.md +0 -20
- package/kits/metal-liquido/preview.tsx +0 -12
- package/kits/metal-liquido/receita.json +0 -173
- package/kits/metal-liquido/regras/area-segura.md +0 -16
- package/kits/metal-liquido/regras/cor.md +0 -23
- package/kits/metal-liquido/regras/movimento.md +0 -18
- package/kits/metal-liquido/regras/ritmo.md +0 -14
- package/kits/metal-liquido/regras/som.md +0 -20
- package/kits/metal-liquido/regras/tipografia.md +0 -15
- package/kits/minimal/assets/ASSETS.md +0 -19
- package/kits/minimal/elementos/Cena.tsx +0 -39
- package/kits/minimal/elementos/FormaMorph.tsx +0 -44
- package/kits/minimal/elementos/FraseUnica.tsx +0 -33
- package/kits/minimal/elementos/Fundo.tsx +0 -20
- package/kits/minimal/elementos/LinhaFina.tsx +0 -24
- package/kits/minimal/elementos/Montagem.tsx +0 -59
- package/kits/minimal/elementos/NumeroSolo.tsx +0 -33
- package/kits/minimal/elementos/PontoMovel.tsx +0 -27
- package/kits/minimal/elementos/RodapeMinimal.tsx +0 -26
- package/kits/minimal/elementos/Som.tsx +0 -40
- package/kits/minimal/elementos/base.ts +0 -80
- package/kits/minimal/elementos/index.ts +0 -15
- package/kits/minimal/exemplos/plano.json +0 -48
- package/kits/minimal/exemplos/roteiro.md +0 -19
- package/kits/minimal/preview.tsx +0 -9
- package/kits/minimal/receita.json +0 -21
- package/kits/minimal/regras/area-segura.md +0 -15
- package/kits/minimal/regras/cor.md +0 -12
- package/kits/minimal/regras/movimento.md +0 -20
- package/kits/minimal/regras/ritmo.md +0 -15
- package/kits/minimal/regras/som.md +0 -21
- package/kits/minimal/regras/tipografia.md +0 -15
- package/kits/neon-cidade/assets/ASSETS.md +0 -21
- package/kits/neon-cidade/elementos/AssinaturaMarca.tsx +0 -24
- package/kits/neon-cidade/elementos/CaixaLuminosa.tsx +0 -40
- package/kits/neon-cidade/elementos/Cena.tsx +0 -48
- package/kits/neon-cidade/elementos/Chuva.tsx +0 -23
- package/kits/neon-cidade/elementos/FormaNeon.tsx +0 -42
- package/kits/neon-cidade/elementos/Fundo.tsx +0 -18
- package/kits/neon-cidade/elementos/Horizonte.tsx +0 -34
- package/kits/neon-cidade/elementos/LetreiroNeon.tsx +0 -46
- package/kits/neon-cidade/elementos/Montagem.tsx +0 -67
- package/kits/neon-cidade/elementos/Som.tsx +0 -33
- package/kits/neon-cidade/elementos/base.ts +0 -100
- package/kits/neon-cidade/elementos/index.ts +0 -15
- package/kits/neon-cidade/exemplos/logo-fenix.svg +0 -1
- package/kits/neon-cidade/exemplos/plano.json +0 -50
- package/kits/neon-cidade/exemplos/roteiro.md +0 -20
- package/kits/neon-cidade/preview.tsx +0 -12
- package/kits/neon-cidade/receita.json +0 -151
- package/kits/neon-cidade/regras/area-segura.md +0 -18
- package/kits/neon-cidade/regras/cor.md +0 -23
- package/kits/neon-cidade/regras/movimento.md +0 -18
- package/kits/neon-cidade/regras/ritmo.md +0 -14
- package/kits/neon-cidade/regras/som.md +0 -20
- package/kits/neon-cidade/regras/tipografia.md +0 -15
- package/kits/notion-editorial/assets/ASSETS.md +0 -19
- package/kits/notion-editorial/elementos/AssinaturaMarca.tsx +0 -20
- package/kits/notion-editorial/elementos/BlocoNota.tsx +0 -38
- package/kits/notion-editorial/elementos/Camera.tsx +0 -23
- package/kits/notion-editorial/elementos/Cena.tsx +0 -46
- package/kits/notion-editorial/elementos/Diagrama.tsx +0 -29
- package/kits/notion-editorial/elementos/Fundo.tsx +0 -12
- package/kits/notion-editorial/elementos/Montagem.tsx +0 -60
- package/kits/notion-editorial/elementos/PassosNumerados.tsx +0 -23
- package/kits/notion-editorial/elementos/RabiscoIcone.tsx +0 -33
- package/kits/notion-editorial/elementos/Som.tsx +0 -39
- package/kits/notion-editorial/elementos/TextoSerifa.tsx +0 -53
- package/kits/notion-editorial/elementos/base.ts +0 -87
- package/kits/notion-editorial/elementos/index.ts +0 -16
- package/kits/notion-editorial/exemplos/logo-pauta.svg +0 -1
- package/kits/notion-editorial/exemplos/plano.json +0 -254
- package/kits/notion-editorial/exemplos/roteiro.md +0 -20
- package/kits/notion-editorial/preview.tsx +0 -12
- package/kits/notion-editorial/receita.json +0 -165
- package/kits/notion-editorial/regras/area-segura.md +0 -13
- package/kits/notion-editorial/regras/cor.md +0 -15
- package/kits/notion-editorial/regras/movimento.md +0 -16
- package/kits/notion-editorial/regras/ritmo.md +0 -14
- package/kits/notion-editorial/regras/som.md +0 -18
- package/kits/notion-editorial/regras/tipografia.md +0 -15
- package/kits/papel-recortado/assets/ASSETS.md +0 -18
- package/kits/papel-recortado/elementos/CamadaPapel.tsx +0 -81
- package/kits/papel-recortado/elementos/Camera.tsx +0 -28
- package/kits/papel-recortado/elementos/CartaoCamadas.tsx +0 -38
- package/kits/papel-recortado/elementos/Cena.tsx +0 -29
- package/kits/papel-recortado/elementos/EtiquetaPapel.tsx +0 -40
- package/kits/papel-recortado/elementos/Fita.tsx +0 -21
- package/kits/papel-recortado/elementos/FolhaPopUp.tsx +0 -49
- package/kits/papel-recortado/elementos/Fundo.tsx +0 -10
- package/kits/papel-recortado/elementos/LetrasRecortadas.tsx +0 -48
- package/kits/papel-recortado/elementos/MolduraPapel.tsx +0 -12
- package/kits/papel-recortado/elementos/Montagem.tsx +0 -42
- package/kits/papel-recortado/elementos/Som.tsx +0 -30
- package/kits/papel-recortado/elementos/base.ts +0 -51
- package/kits/papel-recortado/elementos/index.ts +0 -15
- package/kits/papel-recortado/exemplos/plano.json +0 -410
- package/kits/papel-recortado/exemplos/roteiro.md +0 -13
- package/kits/papel-recortado/preview.tsx +0 -9
- package/kits/papel-recortado/receita.json +0 -14
- package/kits/papel-recortado/regras/area-segura.md +0 -13
- package/kits/papel-recortado/regras/cor.md +0 -16
- package/kits/papel-recortado/regras/movimento.md +0 -17
- package/kits/papel-recortado/regras/ritmo.md +0 -13
- package/kits/papel-recortado/regras/som.md +0 -17
- package/kits/papel-recortado/regras/tipografia.md +0 -12
- package/kits/pixel/assets/ASSETS.md +0 -18
- package/kits/pixel/elementos/AssinaturaMarca.tsx +0 -18
- package/kits/pixel/elementos/CaixaDialogo.tsx +0 -22
- package/kits/pixel/elementos/Camera.tsx +0 -21
- package/kits/pixel/elementos/Cena.tsx +0 -36
- package/kits/pixel/elementos/ChuvaDeSprites.tsx +0 -15
- package/kits/pixel/elementos/Fundo.tsx +0 -23
- package/kits/pixel/elementos/HudPlacar.tsx +0 -19
- package/kits/pixel/elementos/MenuPixel.tsx +0 -19
- package/kits/pixel/elementos/Montagem.tsx +0 -56
- package/kits/pixel/elementos/Overlay.tsx +0 -14
- package/kits/pixel/elementos/Som.tsx +0 -30
- package/kits/pixel/elementos/Sprite.tsx +0 -33
- package/kits/pixel/elementos/TituloPixel.tsx +0 -31
- package/kits/pixel/elementos/base.ts +0 -79
- package/kits/pixel/elementos/index.ts +0 -17
- package/kits/pixel/exemplos/plano.json +0 -309
- package/kits/pixel/exemplos/roteiro.md +0 -20
- package/kits/pixel/preview.tsx +0 -12
- package/kits/pixel/receita.json +0 -175
- package/kits/pixel/regras/area-segura.md +0 -14
- package/kits/pixel/regras/cor.md +0 -17
- package/kits/pixel/regras/movimento.md +0 -18
- package/kits/pixel/regras/ritmo.md +0 -15
- package/kits/pixel/regras/som.md +0 -18
- package/kits/pixel/regras/tipografia.md +0 -18
- package/kits/pontos-3d/assets/ASSETS.md +0 -21
- package/kits/pontos-3d/elementos/AssinaturaMarca.tsx +0 -23
- package/kits/pontos-3d/elementos/Cena.tsx +0 -48
- package/kits/pontos-3d/elementos/Contador.tsx +0 -32
- package/kits/pontos-3d/elementos/Fundo.tsx +0 -20
- package/kits/pontos-3d/elementos/Montagem.tsx +0 -67
- package/kits/pontos-3d/elementos/NuvemDePontos.tsx +0 -84
- package/kits/pontos-3d/elementos/RotuloPonto.tsx +0 -32
- package/kits/pontos-3d/elementos/Som.tsx +0 -33
- package/kits/pontos-3d/elementos/TextoDePontos.tsx +0 -55
- package/kits/pontos-3d/elementos/TituloSora.tsx +0 -36
- package/kits/pontos-3d/elementos/base.ts +0 -92
- package/kits/pontos-3d/elementos/index.ts +0 -15
- package/kits/pontos-3d/exemplos/logo-malha.svg +0 -1
- package/kits/pontos-3d/exemplos/plano.json +0 -46
- package/kits/pontos-3d/exemplos/roteiro.md +0 -20
- package/kits/pontos-3d/preview.tsx +0 -12
- package/kits/pontos-3d/receita.json +0 -153
- package/kits/pontos-3d/regras/area-segura.md +0 -17
- package/kits/pontos-3d/regras/cor.md +0 -21
- package/kits/pontos-3d/regras/movimento.md +0 -19
- package/kits/pontos-3d/regras/ritmo.md +0 -14
- package/kits/pontos-3d/regras/som.md +0 -20
- package/kits/pontos-3d/regras/tipografia.md +0 -16
- package/kits/produto-3d/assets/ASSETS.md +0 -18
- package/kits/produto-3d/elementos/AssinaturaMarca.tsx +0 -28
- package/kits/produto-3d/elementos/Camera.tsx +0 -23
- package/kits/produto-3d/elementos/Cena.tsx +0 -55
- package/kits/produto-3d/elementos/Fundo.tsx +0 -45
- package/kits/produto-3d/elementos/Montagem.tsx +0 -53
- package/kits/produto-3d/elementos/NumeroDestaque.tsx +0 -35
- package/kits/produto-3d/elementos/Produto3D.tsx +0 -144
- package/kits/produto-3d/elementos/RotuloChamada.tsx +0 -43
- package/kits/produto-3d/elementos/Som.tsx +0 -39
- package/kits/produto-3d/elementos/TituloMinimo.tsx +0 -45
- package/kits/produto-3d/elementos/VarreduraLuz.tsx +0 -22
- package/kits/produto-3d/elementos/base.ts +0 -109
- package/kits/produto-3d/elementos/index.ts +0 -13
- package/kits/produto-3d/exemplos/plano.json +0 -53
- package/kits/produto-3d/exemplos/roteiro.md +0 -15
- package/kits/produto-3d/preview.tsx +0 -9
- package/kits/produto-3d/receita.json +0 -16
- package/kits/produto-3d/regras/area-segura.md +0 -14
- package/kits/produto-3d/regras/cor.md +0 -20
- package/kits/produto-3d/regras/movimento.md +0 -19
- package/kits/produto-3d/regras/ritmo.md +0 -15
- package/kits/produto-3d/regras/som.md +0 -18
- package/kits/produto-3d/regras/tipografia.md +0 -13
- package/kits/quadro-giz/assets/ASSETS.md +0 -18
- package/kits/quadro-giz/elementos/ApagadorVarrendo.tsx +0 -32
- package/kits/quadro-giz/elementos/AssinaturaMarca.tsx +0 -20
- package/kits/quadro-giz/elementos/Camera.tsx +0 -21
- package/kits/quadro-giz/elementos/CartaoGiz.tsx +0 -25
- package/kits/quadro-giz/elementos/Cena.tsx +0 -36
- package/kits/quadro-giz/elementos/ContaNoQuadro.tsx +0 -34
- package/kits/quadro-giz/elementos/DesenhoGiz.tsx +0 -29
- package/kits/quadro-giz/elementos/Fundo.tsx +0 -21
- package/kits/quadro-giz/elementos/ListaGiz.tsx +0 -21
- package/kits/quadro-giz/elementos/Montagem.tsx +0 -56
- package/kits/quadro-giz/elementos/Overlay.tsx +0 -12
- package/kits/quadro-giz/elementos/Som.tsx +0 -30
- package/kits/quadro-giz/elementos/TituloGiz.tsx +0 -29
- package/kits/quadro-giz/elementos/base.ts +0 -78
- package/kits/quadro-giz/elementos/index.ts +0 -17
- package/kits/quadro-giz/elementos/traco.ts +0 -9
- package/kits/quadro-giz/exemplos/plano.json +0 -237
- package/kits/quadro-giz/exemplos/roteiro.md +0 -20
- package/kits/quadro-giz/preview.tsx +0 -12
- package/kits/quadro-giz/receita.json +0 -193
- package/kits/quadro-giz/regras/area-segura.md +0 -15
- package/kits/quadro-giz/regras/cor.md +0 -17
- package/kits/quadro-giz/regras/movimento.md +0 -18
- package/kits/quadro-giz/regras/ritmo.md +0 -16
- package/kits/quadro-giz/regras/som.md +0 -18
- package/kits/quadro-giz/regras/tipografia.md +0 -19
- package/kits/rabisco/assets/ASSETS.md +0 -18
- package/kits/rabisco/elementos/AssinaturaMarca.tsx +0 -21
- package/kits/rabisco/elementos/Bonequinho.tsx +0 -31
- package/kits/rabisco/elementos/Camera.tsx +0 -21
- package/kits/rabisco/elementos/CartaoRabiscado.tsx +0 -27
- package/kits/rabisco/elementos/Cena.tsx +0 -36
- package/kits/rabisco/elementos/Fundo.tsx +0 -17
- package/kits/rabisco/elementos/ListaRabiscada.tsx +0 -23
- package/kits/rabisco/elementos/Montagem.tsx +0 -55
- package/kits/rabisco/elementos/Som.tsx +0 -30
- package/kits/rabisco/elementos/TituloRabisco.tsx +0 -28
- package/kits/rabisco/elementos/TracoDesenhando.tsx +0 -31
- package/kits/rabisco/elementos/base.ts +0 -76
- package/kits/rabisco/elementos/index.ts +0 -16
- package/kits/rabisco/elementos/traco.ts +0 -10
- package/kits/rabisco/exemplos/plano.json +0 -238
- package/kits/rabisco/exemplos/roteiro.md +0 -20
- package/kits/rabisco/preview.tsx +0 -12
- package/kits/rabisco/receita.json +0 -171
- package/kits/rabisco/regras/area-segura.md +0 -14
- package/kits/rabisco/regras/cor.md +0 -15
- package/kits/rabisco/regras/movimento.md +0 -18
- package/kits/rabisco/regras/ritmo.md +0 -15
- package/kits/rabisco/regras/som.md +0 -17
- package/kits/rabisco/regras/tipografia.md +0 -18
- package/kits/retro-70/assets/ASSETS.md +0 -23
- package/kits/retro-70/elementos/ArcoListras.tsx +0 -25
- package/kits/retro-70/elementos/AssinaturaMarca.tsx +0 -21
- package/kits/retro-70/elementos/CartaoData.tsx +0 -24
- package/kits/retro-70/elementos/Cena.tsx +0 -41
- package/kits/retro-70/elementos/FaixaOnda.tsx +0 -27
- package/kits/retro-70/elementos/Flor70.tsx +0 -25
- package/kits/retro-70/elementos/FotoArredondada.tsx +0 -19
- package/kits/retro-70/elementos/Fundo.tsx +0 -11
- package/kits/retro-70/elementos/Montagem.tsx +0 -60
- package/kits/retro-70/elementos/RaiosDeSol.tsx +0 -27
- package/kits/retro-70/elementos/Som.tsx +0 -38
- package/kits/retro-70/elementos/TituloGordo.tsx +0 -28
- package/kits/retro-70/elementos/base.ts +0 -73
- package/kits/retro-70/elementos/index.ts +0 -17
- package/kits/retro-70/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/retro-70/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/retro-70/exemplos/logo-girassol.svg +0 -1
- package/kits/retro-70/exemplos/plano.json +0 -50
- package/kits/retro-70/exemplos/roteiro.md +0 -19
- package/kits/retro-70/preview.tsx +0 -17
- package/kits/retro-70/receita.json +0 -172
- package/kits/retro-70/regras/area-segura.md +0 -20
- package/kits/retro-70/regras/cor.md +0 -14
- package/kits/retro-70/regras/movimento.md +0 -16
- package/kits/retro-70/regras/ritmo.md +0 -15
- package/kits/retro-70/regras/som.md +0 -21
- package/kits/retro-70/regras/tipografia.md +0 -17
- package/kits/revista/assets/ASSETS.md +0 -24
- package/kits/revista/elementos/AssinaturaMarca.tsx +0 -23
- package/kits/revista/elementos/Cena.tsx +0 -41
- package/kits/revista/elementos/CitacaoGrande.tsx +0 -27
- package/kits/revista/elementos/ColagemFotos.tsx +0 -22
- package/kits/revista/elementos/Folio.tsx +0 -19
- package/kits/revista/elementos/FotoSangrando.tsx +0 -24
- package/kits/revista/elementos/Fundo.tsx +0 -11
- package/kits/revista/elementos/Montagem.tsx +0 -59
- package/kits/revista/elementos/PaginaDupla.tsx +0 -36
- package/kits/revista/elementos/Som.tsx +0 -38
- package/kits/revista/elementos/TituloEditorial.tsx +0 -31
- package/kits/revista/elementos/base.ts +0 -76
- package/kits/revista/elementos/index.ts +0 -16
- package/kits/revista/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-06.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/revista/exemplos/fotos/foto-08.jpg +0 -0
- package/kits/revista/exemplos/logo-linho.svg +0 -1
- package/kits/revista/exemplos/plano.json +0 -44
- package/kits/revista/exemplos/roteiro.md +0 -19
- package/kits/revista/preview.tsx +0 -21
- package/kits/revista/receita.json +0 -168
- package/kits/revista/regras/area-segura.md +0 -19
- package/kits/revista/regras/cor.md +0 -14
- package/kits/revista/regras/movimento.md +0 -15
- package/kits/revista/regras/ritmo.md +0 -15
- package/kits/revista/regras/som.md +0 -21
- package/kits/revista/regras/tipografia.md +0 -17
- package/kits/risografia/assets/ASSETS.md +0 -18
- package/kits/risografia/elementos/AssinaturaMarca.tsx +0 -21
- package/kits/risografia/elementos/BolaReticula.tsx +0 -26
- package/kits/risografia/elementos/Camera.tsx +0 -21
- package/kits/risografia/elementos/Cena.tsx +0 -36
- package/kits/risografia/elementos/FormaRiso.tsx +0 -24
- package/kits/risografia/elementos/Fundo.tsx +0 -12
- package/kits/risografia/elementos/ListaRiso.tsx +0 -22
- package/kits/risografia/elementos/Montagem.tsx +0 -56
- package/kits/risografia/elementos/NumeroRiso.tsx +0 -21
- package/kits/risografia/elementos/Overlay.tsx +0 -18
- package/kits/risografia/elementos/Som.tsx +0 -30
- package/kits/risografia/elementos/TarjaCarimbo.tsx +0 -20
- package/kits/risografia/elementos/TituloRiso.tsx +0 -26
- package/kits/risografia/elementos/base.ts +0 -73
- package/kits/risografia/elementos/index.ts +0 -17
- package/kits/risografia/exemplos/plano.json +0 -209
- package/kits/risografia/exemplos/roteiro.md +0 -20
- package/kits/risografia/preview.tsx +0 -12
- package/kits/risografia/receita.json +0 -169
- package/kits/risografia/regras/area-segura.md +0 -14
- package/kits/risografia/regras/cor.md +0 -12
- package/kits/risografia/regras/movimento.md +0 -18
- package/kits/risografia/regras/ritmo.md +0 -15
- package/kits/risografia/regras/som.md +0 -17
- package/kits/risografia/regras/tipografia.md +0 -18
- package/kits/saas-linear/assets/ASSETS.md +0 -19
- package/kits/saas-linear/assets/fontes/OFL-Inter.txt +0 -93
- package/kits/saas-linear/assets/fontes/OFL-Newsreader.txt +0 -93
- package/kits/saas-linear/assets/fontes/inter-400.woff2 +0 -0
- package/kits/saas-linear/assets/fontes/inter-600.woff2 +0 -0
- package/kits/saas-linear/assets/fontes/newsreader-400.woff2 +0 -0
- package/kits/saas-linear/elementos/Agenda.tsx +0 -46
- package/kits/saas-linear/elementos/CaixaPrompt.tsx +0 -41
- package/kits/saas-linear/elementos/Camera.tsx +0 -38
- package/kits/saas-linear/elementos/CartoesIntegracao.tsx +0 -57
- package/kits/saas-linear/elementos/Cena.tsx +0 -38
- package/kits/saas-linear/elementos/Cursor.tsx +0 -40
- package/kits/saas-linear/elementos/FraseSerifa.tsx +0 -25
- package/kits/saas-linear/elementos/Fundo.tsx +0 -18
- package/kits/saas-linear/elementos/Marca.tsx +0 -20
- package/kits/saas-linear/elementos/MarcaFinal.tsx +0 -22
- package/kits/saas-linear/elementos/Menu.tsx +0 -46
- package/kits/saas-linear/elementos/Monitor.tsx +0 -28
- package/kits/saas-linear/elementos/Montagem.tsx +0 -67
- package/kits/saas-linear/elementos/Saudacao.tsx +0 -27
- package/kits/saas-linear/elementos/Som.tsx +0 -39
- package/kits/saas-linear/elementos/base.ts +0 -84
- package/kits/saas-linear/elementos/index.ts +0 -21
- package/kits/saas-linear/exemplos/plano.json +0 -459
- package/kits/saas-linear/exemplos/roteiro.md +0 -15
- package/kits/saas-linear/preview.tsx +0 -9
- package/kits/saas-linear/receita.json +0 -32
- package/kits/saas-linear/regras/area-segura.md +0 -17
- package/kits/saas-linear/regras/cor.md +0 -19
- package/kits/saas-linear/regras/movimento.md +0 -20
- package/kits/saas-linear/regras/ritmo.md +0 -14
- package/kits/saas-linear/regras/som.md +0 -16
- package/kits/saas-linear/regras/tipografia.md +0 -17
- package/kits/stripe-ondas/assets/ASSETS.md +0 -18
- package/kits/stripe-ondas/elementos/AssinaturaMarca.tsx +0 -18
- package/kits/stripe-ondas/elementos/Camera.tsx +0 -23
- package/kits/stripe-ondas/elementos/CartaoPagamento.tsx +0 -35
- package/kits/stripe-ondas/elementos/Cena.tsx +0 -46
- package/kits/stripe-ondas/elementos/FaixaDeOndas.tsx +0 -49
- package/kits/stripe-ondas/elementos/Fundo.tsx +0 -11
- package/kits/stripe-ondas/elementos/GraficoOnda.tsx +0 -34
- package/kits/stripe-ondas/elementos/Montagem.tsx +0 -61
- package/kits/stripe-ondas/elementos/PainelCodigo.tsx +0 -36
- package/kits/stripe-ondas/elementos/SelosDeMetodo.tsx +0 -27
- package/kits/stripe-ondas/elementos/Som.tsx +0 -39
- package/kits/stripe-ondas/elementos/TituloLimpo.tsx +0 -27
- package/kits/stripe-ondas/elementos/base.ts +0 -85
- package/kits/stripe-ondas/elementos/index.ts +0 -16
- package/kits/stripe-ondas/exemplos/logo-cais.svg +0 -1
- package/kits/stripe-ondas/exemplos/plano.json +0 -366
- package/kits/stripe-ondas/exemplos/roteiro.md +0 -20
- package/kits/stripe-ondas/preview.tsx +0 -12
- package/kits/stripe-ondas/receita.json +0 -177
- package/kits/stripe-ondas/regras/area-segura.md +0 -16
- package/kits/stripe-ondas/regras/cor.md +0 -17
- package/kits/stripe-ondas/regras/movimento.md +0 -16
- package/kits/stripe-ondas/regras/ritmo.md +0 -14
- package/kits/stripe-ondas/regras/som.md +0 -18
- package/kits/stripe-ondas/regras/tipografia.md +0 -15
- package/kits/suica/assets/ASSETS.md +0 -23
- package/kits/suica/elementos/AssinaturaMarca.tsx +0 -21
- package/kits/suica/elementos/Cena.tsx +0 -41
- package/kits/suica/elementos/DiscoFoto.tsx +0 -20
- package/kits/suica/elementos/Fundo.tsx +0 -16
- package/kits/suica/elementos/GradeFotos.tsx +0 -21
- package/kits/suica/elementos/Indice.tsx +0 -17
- package/kits/suica/elementos/ListaIndice.tsx +0 -25
- package/kits/suica/elementos/Montagem.tsx +0 -60
- package/kits/suica/elementos/NumeroGigante.tsx +0 -21
- package/kits/suica/elementos/Regua.tsx +0 -20
- package/kits/suica/elementos/Som.tsx +0 -38
- package/kits/suica/elementos/TituloGrade.tsx +0 -38
- package/kits/suica/elementos/base.ts +0 -76
- package/kits/suica/elementos/index.ts +0 -17
- package/kits/suica/exemplos/fotos/foto-01.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-06.jpg +0 -0
- package/kits/suica/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/suica/exemplos/logo-ponto.svg +0 -1
- package/kits/suica/exemplos/plano.json +0 -268
- package/kits/suica/exemplos/roteiro.md +0 -19
- package/kits/suica/preview.tsx +0 -21
- package/kits/suica/receita.json +0 -197
- package/kits/suica/regras/area-segura.md +0 -18
- package/kits/suica/regras/cor.md +0 -13
- package/kits/suica/regras/movimento.md +0 -15
- package/kits/suica/regras/ritmo.md +0 -17
- package/kits/suica/regras/som.md +0 -21
- package/kits/suica/regras/tipografia.md +0 -16
- package/kits/synthwave/assets/ASSETS.md +0 -22
- package/kits/synthwave/elementos/AssinaturaMarca.tsx +0 -26
- package/kits/synthwave/elementos/Cena.tsx +0 -41
- package/kits/synthwave/elementos/Estrelas.tsx +0 -27
- package/kits/synthwave/elementos/Fundo.tsx +0 -20
- package/kits/synthwave/elementos/Montagem.tsx +0 -59
- package/kits/synthwave/elementos/Montanhas.tsx +0 -27
- package/kits/synthwave/elementos/Palmeiras.tsx +0 -30
- package/kits/synthwave/elementos/QuadroHUD.tsx +0 -33
- package/kits/synthwave/elementos/SolListrado.tsx +0 -29
- package/kits/synthwave/elementos/Som.tsx +0 -38
- package/kits/synthwave/elementos/TituloNeon.tsx +0 -30
- package/kits/synthwave/elementos/base.ts +0 -75
- package/kits/synthwave/elementos/index.ts +0 -16
- package/kits/synthwave/exemplos/logo-arcade.svg +0 -1
- package/kits/synthwave/exemplos/plano.json +0 -50
- package/kits/synthwave/exemplos/roteiro.md +0 -19
- package/kits/synthwave/preview.tsx +0 -16
- package/kits/synthwave/receita.json +0 -170
- package/kits/synthwave/regras/area-segura.md +0 -19
- package/kits/synthwave/regras/cor.md +0 -16
- package/kits/synthwave/regras/movimento.md +0 -16
- package/kits/synthwave/regras/ritmo.md +0 -15
- package/kits/synthwave/regras/som.md +0 -21
- package/kits/synthwave/regras/tipografia.md +0 -16
- package/kits/terminal/assets/ASSETS.md +0 -20
- package/kits/terminal/elementos/ArteAscii.tsx +0 -61
- package/kits/terminal/elementos/BarraProgresso.tsx +0 -42
- package/kits/terminal/elementos/BarraStatus.tsx +0 -18
- package/kits/terminal/elementos/BootBios.tsx +0 -41
- package/kits/terminal/elementos/Camera.tsx +0 -23
- package/kits/terminal/elementos/Cena.tsx +0 -25
- package/kits/terminal/elementos/Fundo.tsx +0 -22
- package/kits/terminal/elementos/LinhaComando.tsx +0 -31
- package/kits/terminal/elementos/Monitor.tsx +0 -42
- package/kits/terminal/elementos/Montagem.tsx +0 -52
- package/kits/terminal/elementos/PainelCaixa.tsx +0 -35
- package/kits/terminal/elementos/Som.tsx +0 -32
- package/kits/terminal/elementos/Tela.tsx +0 -25
- package/kits/terminal/elementos/TextoGrande.tsx +0 -35
- package/kits/terminal/elementos/base.ts +0 -67
- package/kits/terminal/elementos/index.ts +0 -16
- package/kits/terminal/exemplos/plano.json +0 -330
- package/kits/terminal/exemplos/roteiro.md +0 -14
- package/kits/terminal/preview.tsx +0 -9
- package/kits/terminal/receita.json +0 -14
- package/kits/terminal/regras/area-segura.md +0 -18
- package/kits/terminal/regras/cor.md +0 -16
- package/kits/terminal/regras/movimento.md +0 -15
- package/kits/terminal/regras/ritmo.md +0 -14
- package/kits/terminal/regras/som.md +0 -17
- package/kits/terminal/regras/tipografia.md +0 -15
- package/kits/tiktok-energia/assets/ASSETS.md +0 -22
- package/kits/tiktok-energia/elementos/AssinaturaMarca.tsx +0 -25
- package/kits/tiktok-energia/elementos/Cena.tsx +0 -48
- package/kits/tiktok-energia/elementos/CorteDeCor.tsx +0 -22
- package/kits/tiktok-energia/elementos/EmojiSticker.tsx +0 -21
- package/kits/tiktok-energia/elementos/FotoSoco.tsx +0 -27
- package/kits/tiktok-energia/elementos/Fundo.tsx +0 -8
- package/kits/tiktok-energia/elementos/Montagem.tsx +0 -67
- package/kits/tiktok-energia/elementos/PalavraSoco.tsx +0 -29
- package/kits/tiktok-energia/elementos/Som.tsx +0 -33
- package/kits/tiktok-energia/elementos/TextoCaixa.tsx +0 -25
- package/kits/tiktok-energia/elementos/base.ts +0 -92
- package/kits/tiktok-energia/elementos/index.ts +0 -15
- package/kits/tiktok-energia/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/tiktok-energia/exemplos/logo-pulo.svg +0 -1
- package/kits/tiktok-energia/exemplos/plano.json +0 -66
- package/kits/tiktok-energia/exemplos/roteiro.md +0 -22
- package/kits/tiktok-energia/preview.tsx +0 -13
- package/kits/tiktok-energia/receita.json +0 -166
- package/kits/tiktok-energia/regras/area-segura.md +0 -19
- package/kits/tiktok-energia/regras/cor.md +0 -20
- package/kits/tiktok-energia/regras/movimento.md +0 -17
- package/kits/tiktok-energia/regras/ritmo.md +0 -15
- package/kits/tiktok-energia/regras/som.md +0 -20
- package/kits/tiktok-energia/regras/tipografia.md +0 -15
- package/kits/tunel/assets/ASSETS.md +0 -21
- package/kits/tunel/elementos/AssinaturaMarca.tsx +0 -22
- package/kits/tunel/elementos/Cena.tsx +0 -48
- package/kits/tunel/elementos/Fundo.tsx +0 -13
- package/kits/tunel/elementos/LinhasDeVelocidade.tsx +0 -25
- package/kits/tunel/elementos/Montagem.tsx +0 -67
- package/kits/tunel/elementos/NumeroGigante.tsx +0 -28
- package/kits/tunel/elementos/PlacaVoadora.tsx +0 -28
- package/kits/tunel/elementos/Som.tsx +0 -33
- package/kits/tunel/elementos/TituloTunel.tsx +0 -32
- package/kits/tunel/elementos/TunelDeFormas.tsx +0 -52
- package/kits/tunel/elementos/base.ts +0 -97
- package/kits/tunel/elementos/index.ts +0 -15
- package/kits/tunel/exemplos/logo-rota21.svg +0 -1
- package/kits/tunel/exemplos/plano.json +0 -51
- package/kits/tunel/exemplos/roteiro.md +0 -20
- package/kits/tunel/preview.tsx +0 -12
- package/kits/tunel/receita.json +0 -153
- package/kits/tunel/regras/area-segura.md +0 -18
- package/kits/tunel/regras/cor.md +0 -21
- package/kits/tunel/regras/movimento.md +0 -17
- package/kits/tunel/regras/ritmo.md +0 -14
- package/kits/tunel/regras/som.md +0 -20
- package/kits/tunel/regras/tipografia.md +0 -15
- package/kits/tutorial-tela/assets/ASSETS.md +0 -20
- package/kits/tutorial-tela/elementos/CameraTela.tsx +0 -29
- package/kits/tutorial-tela/elementos/Cursor.tsx +0 -36
- package/kits/tutorial-tela/elementos/DestaqueCaixa.tsx +0 -17
- package/kits/tutorial-tela/elementos/Fundo.tsx +0 -12
- package/kits/tutorial-tela/elementos/JanelaApp.tsx +0 -81
- package/kits/tutorial-tela/elementos/Montagem.tsx +0 -49
- package/kits/tutorial-tela/elementos/PassoChamada.tsx +0 -22
- package/kits/tutorial-tela/elementos/Som.tsx +0 -41
- package/kits/tutorial-tela/elementos/TeclaAtalho.tsx +0 -29
- package/kits/tutorial-tela/elementos/TituloTela.tsx +0 -30
- package/kits/tutorial-tela/elementos/base.ts +0 -65
- package/kits/tutorial-tela/elementos/index.ts +0 -12
- package/kits/tutorial-tela/exemplos/plano.json +0 -41
- package/kits/tutorial-tela/exemplos/roteiro.md +0 -14
- package/kits/tutorial-tela/preview.tsx +0 -9
- package/kits/tutorial-tela/receita.json +0 -15
- package/kits/tutorial-tela/regras/area-segura.md +0 -13
- package/kits/tutorial-tela/regras/cor.md +0 -17
- package/kits/tutorial-tela/regras/movimento.md +0 -20
- package/kits/tutorial-tela/regras/ritmo.md +0 -24
- package/kits/tutorial-tela/regras/som.md +0 -21
- package/kits/tutorial-tela/regras/tipografia.md +0 -15
- package/kits/ugc-reels/assets/ASSETS.md +0 -22
- package/kits/ugc-reels/elementos/AssinaturaMarca.tsx +0 -28
- package/kits/ugc-reels/elementos/BotaoLink.tsx +0 -24
- package/kits/ugc-reels/elementos/CabecalhoPerfil.tsx +0 -38
- package/kits/ugc-reels/elementos/Cena.tsx +0 -48
- package/kits/ugc-reels/elementos/Comentario.tsx +0 -29
- package/kits/ugc-reels/elementos/Fundo.tsx +0 -8
- package/kits/ugc-reels/elementos/LegendaEmoji.tsx +0 -43
- package/kits/ugc-reels/elementos/Montagem.tsx +0 -69
- package/kits/ugc-reels/elementos/NotaDeMao.tsx +0 -29
- package/kits/ugc-reels/elementos/Reacoes.tsx +0 -26
- package/kits/ugc-reels/elementos/Som.tsx +0 -33
- package/kits/ugc-reels/elementos/VideoCelular.tsx +0 -37
- package/kits/ugc-reels/elementos/base.ts +0 -92
- package/kits/ugc-reels/elementos/index.ts +0 -17
- package/kits/ugc-reels/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/ugc-reels/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/ugc-reels/exemplos/fotos/foto-04.jpg +0 -0
- package/kits/ugc-reels/exemplos/fotos/foto-06.jpg +0 -0
- package/kits/ugc-reels/exemplos/logo-rotina.svg +0 -1
- package/kits/ugc-reels/exemplos/plano.json +0 -54
- package/kits/ugc-reels/exemplos/roteiro.md +0 -20
- package/kits/ugc-reels/preview.tsx +0 -16
- package/kits/ugc-reels/receita.json +0 -147
- package/kits/ugc-reels/regras/area-segura.md +0 -18
- package/kits/ugc-reels/regras/cor.md +0 -22
- package/kits/ugc-reels/regras/movimento.md +0 -19
- package/kits/ugc-reels/regras/ritmo.md +0 -14
- package/kits/ugc-reels/regras/som.md +0 -20
- package/kits/ugc-reels/regras/tipografia.md +0 -16
- package/kits/vercel-mono/assets/ASSETS.md +0 -18
- package/kits/vercel-mono/assets/sons/assinatura.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/clique.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/impacto.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/pop-cartao.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/pop-palavra.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/subida.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/swoosh.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/whoosh-entra.mp3 +0 -0
- package/kits/vercel-mono/assets/sons/whoosh-sai.mp3 +0 -0
- package/kits/vercel-mono/elementos/AssinaturaMarca.tsx +0 -18
- package/kits/vercel-mono/elementos/Camera.tsx +0 -23
- package/kits/vercel-mono/elementos/Cena.tsx +0 -46
- package/kits/vercel-mono/elementos/FaixaOutline.tsx +0 -25
- package/kits/vercel-mono/elementos/Fundo.tsx +0 -6
- package/kits/vercel-mono/elementos/GradeDeNumeros.tsx +0 -27
- package/kits/vercel-mono/elementos/Montagem.tsx +0 -61
- package/kits/vercel-mono/elementos/PalavraMono.tsx +0 -31
- package/kits/vercel-mono/elementos/Quadro.tsx +0 -28
- package/kits/vercel-mono/elementos/Som.tsx +0 -39
- package/kits/vercel-mono/elementos/TerminalComando.tsx +0 -33
- package/kits/vercel-mono/elementos/TrianguloGigante.tsx +0 -27
- package/kits/vercel-mono/elementos/base.ts +0 -82
- package/kits/vercel-mono/elementos/index.ts +0 -16
- package/kits/vercel-mono/exemplos/logo-vetor.svg +0 -1
- package/kits/vercel-mono/exemplos/plano.json +0 -318
- package/kits/vercel-mono/exemplos/roteiro.md +0 -20
- package/kits/vercel-mono/preview.tsx +0 -12
- package/kits/vercel-mono/receita.json +0 -156
- package/kits/vercel-mono/regras/area-segura.md +0 -13
- package/kits/vercel-mono/regras/cor.md +0 -12
- package/kits/vercel-mono/regras/movimento.md +0 -15
- package/kits/vercel-mono/regras/ritmo.md +0 -13
- package/kits/vercel-mono/regras/som.md +0 -18
- package/kits/vercel-mono/regras/tipografia.md +0 -14
- package/kits/vhs-90/assets/ASSETS.md +0 -23
- package/kits/vhs-90/elementos/AssinaturaMarca.tsx +0 -29
- package/kits/vhs-90/elementos/BarrasRastreio.tsx +0 -21
- package/kits/vhs-90/elementos/CapaVHS.tsx +0 -28
- package/kits/vhs-90/elementos/CarimboData.tsx +0 -19
- package/kits/vhs-90/elementos/Cena.tsx +0 -41
- package/kits/vhs-90/elementos/Fundo.tsx +0 -27
- package/kits/vhs-90/elementos/MenuOSD.tsx +0 -27
- package/kits/vhs-90/elementos/Montagem.tsx +0 -60
- package/kits/vhs-90/elementos/Som.tsx +0 -38
- package/kits/vhs-90/elementos/TelaAzul.tsx +0 -29
- package/kits/vhs-90/elementos/TituloFita.tsx +0 -40
- package/kits/vhs-90/elementos/base.ts +0 -75
- package/kits/vhs-90/elementos/index.ts +0 -16
- package/kits/vhs-90/exemplos/fotos/foto-05.jpg +0 -0
- package/kits/vhs-90/exemplos/fotos/foto-07.jpg +0 -0
- package/kits/vhs-90/exemplos/logo-rewind.svg +0 -1
- package/kits/vhs-90/exemplos/plano.json +0 -47
- package/kits/vhs-90/exemplos/roteiro.md +0 -19
- package/kits/vhs-90/preview.tsx +0 -17
- package/kits/vhs-90/receita.json +0 -189
- package/kits/vhs-90/regras/area-segura.md +0 -18
- package/kits/vhs-90/regras/cor.md +0 -16
- package/kits/vhs-90/regras/movimento.md +0 -16
- package/kits/vhs-90/regras/ritmo.md +0 -16
- package/kits/vhs-90/regras/som.md +0 -21
- package/kits/vhs-90/regras/tipografia.md +0 -17
- package/kits/vidro-ios/assets/ASSETS.md +0 -18
- package/kits/vidro-ios/elementos/AssinaturaMarca.tsx +0 -21
- package/kits/vidro-ios/elementos/Camera.tsx +0 -23
- package/kits/vidro-ios/elementos/Cena.tsx +0 -46
- package/kits/vidro-ios/elementos/Fundo.tsx +0 -17
- package/kits/vidro-ios/elementos/IlhaDinamica.tsx +0 -24
- package/kits/vidro-ios/elementos/Montagem.tsx +0 -60
- package/kits/vidro-ios/elementos/PainelControle.tsx +0 -33
- package/kits/vidro-ios/elementos/PilhaNotificacoes.tsx +0 -29
- package/kits/vidro-ios/elementos/Som.tsx +0 -39
- package/kits/vidro-ios/elementos/TituloVidro.tsx +0 -22
- package/kits/vidro-ios/elementos/WidgetsGrade.tsx +0 -34
- package/kits/vidro-ios/elementos/base.ts +0 -87
- package/kits/vidro-ios/elementos/index.ts +0 -16
- package/kits/vidro-ios/elementos/vidro.tsx +0 -20
- package/kits/vidro-ios/exemplos/logo-vento.svg +0 -1
- package/kits/vidro-ios/exemplos/plano.json +0 -288
- package/kits/vidro-ios/exemplos/roteiro.md +0 -20
- package/kits/vidro-ios/preview.tsx +0 -12
- package/kits/vidro-ios/receita.json +0 -170
- package/kits/vidro-ios/regras/area-segura.md +0 -13
- package/kits/vidro-ios/regras/cor.md +0 -16
- package/kits/vidro-ios/regras/movimento.md +0 -16
- package/kits/vidro-ios/regras/ritmo.md +0 -14
- package/kits/vidro-ios/regras/som.md +0 -18
- package/kits/vidro-ios/regras/tipografia.md +0 -15
- package/kits/y2k-cromado/assets/ASSETS.md +0 -23
- package/kits/y2k-cromado/elementos/AssinaturaMarca.tsx +0 -25
- package/kits/y2k-cromado/elementos/Bolhas.tsx +0 -30
- package/kits/y2k-cromado/elementos/Brilhos.tsx +0 -28
- package/kits/y2k-cromado/elementos/CartaoGloss.tsx +0 -26
- package/kits/y2k-cromado/elementos/Cena.tsx +0 -41
- package/kits/y2k-cromado/elementos/FitaMarquee.tsx +0 -20
- package/kits/y2k-cromado/elementos/Fundo.tsx +0 -18
- package/kits/y2k-cromado/elementos/JanelaY2K.tsx +0 -31
- package/kits/y2k-cromado/elementos/Montagem.tsx +0 -60
- package/kits/y2k-cromado/elementos/OrbeCromo.tsx +0 -20
- package/kits/y2k-cromado/elementos/Som.tsx +0 -38
- package/kits/y2k-cromado/elementos/TextoCromo.tsx +0 -34
- package/kits/y2k-cromado/elementos/base.ts +0 -75
- package/kits/y2k-cromado/elementos/index.ts +0 -17
- package/kits/y2k-cromado/exemplos/fotos/foto-02.jpg +0 -0
- package/kits/y2k-cromado/exemplos/fotos/foto-03.jpg +0 -0
- package/kits/y2k-cromado/exemplos/logo-bolha.svg +0 -1
- package/kits/y2k-cromado/exemplos/plano.json +0 -47
- package/kits/y2k-cromado/exemplos/roteiro.md +0 -19
- package/kits/y2k-cromado/preview.tsx +0 -17
- package/kits/y2k-cromado/receita.json +0 -174
- package/kits/y2k-cromado/regras/area-segura.md +0 -19
- package/kits/y2k-cromado/regras/cor.md +0 -16
- package/kits/y2k-cromado/regras/movimento.md +0 -16
- package/kits/y2k-cromado/regras/ritmo.md +0 -15
- package/kits/y2k-cromado/regras/som.md +0 -21
- package/kits/y2k-cromado/regras/tipografia.md +0 -17
- package/lib/act.js +0 -2512
- package/lib/api.js +0 -310
- package/lib/boas-vindas.js +0 -153
- package/lib/catalogo.js +0 -367
- package/lib/checkpoint-git.js +0 -221
- package/lib/checkpoint.js +0 -366
- package/lib/claude-engine.js +0 -673
- package/lib/codex-engine.js +0 -225
- package/lib/comandos-extra.js +0 -553
- package/lib/comandos.js +0 -104
- package/lib/config.js +0 -414
- package/lib/desktop.js +0 -756
- package/lib/editor-pro-maquina.js +0 -165
- package/lib/editor-pro.js +0 -930
- package/lib/entrada.js +0 -1031
- package/lib/entregaveis/cli.js +0 -26
- package/lib/entregaveis/especialistas.js +0 -50
- package/lib/entregaveis/nucleo.js +0 -111
- package/lib/entregaveis/slides.js +0 -221
- package/lib/estudio/acervo.js +0 -418
- package/lib/estudio/assets.js +0 -497
- package/lib/estudio/assinatura.js +0 -108
- package/lib/estudio/conferencia-visual.js +0 -76
- package/lib/estudio/cota.js +0 -157
- package/lib/estudio/diretor.js +0 -392
- package/lib/estudio/editor.js +0 -290
- package/lib/estudio/gosto-descrever.js +0 -87
- package/lib/estudio/gosto.js +0 -608
- package/lib/estudio/identidade.js +0 -560
- package/lib/estudio/index.js +0 -2712
- package/lib/estudio/kit.js +0 -91
- package/lib/estudio/kits-tela.js +0 -199
- package/lib/estudio/kokoro.js +0 -127
- package/lib/estudio/maquina-foto.js +0 -177
- package/lib/estudio/maquina-trilha.js +0 -160
- package/lib/estudio/maquina-voz.js +0 -429
- package/lib/estudio/marca.js +0 -398
- package/lib/estudio/materiais.js +0 -172
- package/lib/estudio/morfar.js +0 -191
- package/lib/estudio/print-site.js +0 -341
- package/lib/estudio/projeto.js +0 -340
- package/lib/estudio/projetos.js +0 -72
- package/lib/exportar-conversa.js +0 -49
- package/lib/headless.js +0 -102
- package/lib/kits-parecidos.js +0 -99
- package/lib/kits-plano.js +0 -557
- package/lib/kits.js +0 -1084
- package/lib/limites.js +0 -100
- package/lib/linha-do-tempo.js +0 -130
- package/lib/local/motor-cli.js +0 -93
- package/lib/local/motor.js +0 -267
- package/lib/local/provedor.js +0 -169
- package/lib/marca-kit.js +0 -312
- package/lib/marketplace.js +0 -189
- package/lib/mcp.js +0 -819
- package/lib/motioncraft.js +0 -67
- package/lib/perigo.js +0 -401
- package/lib/permissao.js +0 -137
- package/lib/sandbox.js +0 -252
- package/lib/skills.js +0 -468
- package/lib/statusline.js +0 -52
- package/lib/tela.js +0 -245
- package/lib/tools.js +0 -1086
- package/lib/ui.js +0 -763
- package/lib/video/analise.js +0 -89
- package/lib/video/auto.js +0 -344
- package/lib/video/ops-fx.js +0 -453
- package/lib/video/ops.js +0 -384
- package/lib/video/pedido.js +0 -191
- package/lib/video/projeto.js +0 -133
- package/lib/video/rastrear.js +0 -95
- package/lib/video/render.js +0 -274
- package/lib/video/transcript.js +0 -124
- package/lib/video/zoom.js +0 -275
- package/lib/voz-ponte.js +0 -15
- package/lib/voz.js +0 -532
- package/materiais/saas-linear/sons/trilha.mp3 +0 -0
- /package/lib/{comecar.js → cli/comecar.js} +0 -0
- /package/lib/{conta.js → config/conta.js} +0 -0
- /package/lib/{limite.js → config/limite.js} +0 -0
- /package/lib/{protecao.js → permission/protecao.js} +0 -0
- /package/lib/{entregaveis.js → plugin/entregaveis.js} +0 -0
- /package/lib/{estudio → plugin/estudio}/acervo-site.js +0 -0
- /package/lib/{estudio → plugin/estudio}/assinaturas/fluido.json +0 -0
- /package/lib/{estudio → plugin/estudio}/assinaturas/gerativo.json +0 -0
- /package/lib/{estudio → plugin/estudio}/batida.js +0 -0
- /package/lib/{estudio → plugin/estudio}/biblioteca.js +0 -0
- /package/lib/{estudio → plugin/estudio}/camadas.js +0 -0
- /package/lib/{estudio → plugin/estudio}/cena.js +0 -0
- /package/lib/{estudio → plugin/estudio}/cenarios.js +0 -0
- /package/lib/{estudio → plugin/estudio}/cinema.js +0 -0
- /package/lib/{estudio → plugin/estudio}/colecao.js +0 -0
- /package/lib/{estudio → plugin/estudio}/composicao.js +0 -0
- /package/lib/{estudio → plugin/estudio}/conferencia.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/fluent-3d.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/noto-animado.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-ad5.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-ae-sem-memoria.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-agent.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-antes-e-agora.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-apresentando-clube.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-bluevisa.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-caught-in-the-fire.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-chat-cliente-satisfeito.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-chatgpt-anuncios.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-claude-dj.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-claude-mcp.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-cleanui.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clinica-take-unico.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clinica.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clube-opener.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clube.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-codigo.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-distilbook.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-drive-upload.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-dub.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-enxovaly.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-fecha7.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-filatov.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-frame.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-glass.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-em-apps.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-globo-3d.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-nos-apps.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-seis-mundos.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-lula-3.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-morph.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-motion-designer.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-motion-pacote.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-movimento.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-not-like-us.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-pinterest-inspiracao.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-pixel-e-tinta.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-ponte.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-processo-edit-tonal.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-processo-motion-100-ia.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-promo.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-proposito.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-rankhog.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-recursao.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-revelar.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-robo.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-shelby-ep2.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-shelby.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-solar-eclipse.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-soldier.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-som-de-cena.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-spotify-candidatura.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tda-app.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tda-ia.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-telegram-chat.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-telegram-ilha.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tennessee-nike.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tudo-se-move.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-uiad.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-viralgrow.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-whose-side.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-youtube-inscrever.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/elementos-do-site-em-movimento.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/explainer-narrado.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/lancamento-de-produto.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/motion-so-com-sons.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/titulo-em-after-effects.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos/tour-de-saas.json +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/antes-e-agora/ae/cenas.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/antes-e-agora/assets/fazer_assets.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-em-apps/ae/cenas.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-em-apps/assets/preparar_assets.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-em-apps/assets/svg_para_ae.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/BRIEF-AGENTES.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/README.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ROTEIRO-CENAS.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/A-agenda.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/B-docs.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/C-alttab.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/D-spotify.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/E-notas.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/F-jornal1.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/G-google.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/H-mapa.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/I-imagens.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/J-jornal2.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/K-maps.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/camera-movimentos.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/camera.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/card-spotify.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/digitar.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/jornal-comum.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/letra.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/letra_automatica.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/montagem.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/w-agenda/render_html.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/w-agenda/util.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/w-midia-comum.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/wg-util.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/F-jornal1/render_html.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/render_w-midia.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/inclin.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_d.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_e.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/ajustar_movimentos.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/ancorar.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/assar.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/camera3d_jornal.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/comparar.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/dados_ae_jornal.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/folha_contato.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/homografia_jornal.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/integrar.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/medir_quadro_a_quadro.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/mesa_2d.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/plot_cenas.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/retificar_quadros.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/w-agenda/assar_ab.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/w-agenda/medir_ab.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_ajustar_h.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_corrige_cam.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_ecc_cadeia.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_finalizar_cam.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_mosaico.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/01-gramatica-e-roteiro.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/02-camera.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/03-montagem-no-ae.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/04-render-e-conferencia.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/05-abertura-celular-mergulho.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/atraso_imagem.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/fundo.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/juntar.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/montar.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/rastreio.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/sincronia.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/pinterest-inspiracao/ae/cenas.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/pinterest-inspiracao/assets/fazer_assets.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/assets/pessoas/figurinha.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/BRIEF-A.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/audio.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/confere.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte1.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte2.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/gerar_emojis.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/img/filmes/_indice.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/base.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/main.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1a.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1b.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1c.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p2.js +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/video.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/README.md +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/oraculo_take.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/render_take.py +0 -0
- /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/take.js +0 -0
- /package/lib/{estudio → plugin/estudio}/decisao.js +0 -0
- /package/lib/{estudio → plugin/estudio}/edicao.js +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/brilho-varredura.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/camadas-empilhadas.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/cor-inunda.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/mola-com-peso.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/peca-impacto-3d.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/raios-de-luz.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/risco-multilinha.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/terminal-digitando.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/efeitos.js +0 -0
- /package/lib/{estudio → plugin/estudio}/effectcraft.js +0 -0
- /package/lib/{estudio → plugin/estudio}/ende.js +0 -0
- /package/lib/{estudio → plugin/estudio}/estilo.js +0 -0
- /package/lib/{estudio → plugin/estudio}/estilos.js +0 -0
- /package/lib/{estudio → plugin/estudio}/exportar.js +0 -0
- /package/lib/{estudio → plugin/estudio}/falantes.js +0 -0
- /package/lib/{estudio → plugin/estudio}/fluido.js +0 -0
- /package/lib/{estudio → plugin/estudio}/gerativo.js +0 -0
- /package/lib/{estudio → plugin/estudio}/glifos.js +0 -0
- /package/lib/{estudio → plugin/estudio}/gosto/tela.html +0 -0
- /package/lib/{estudio → plugin/estudio}/gosto-medir.js +0 -0
- /package/lib/{estudio → plugin/estudio}/gosto-prova.js +0 -0
- /package/lib/{estudio → plugin/estudio}/hibrido.js +0 -0
- /package/lib/{estudio → plugin/estudio}/impacto.js +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/animacao.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/base.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/fluido.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/gerativo.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/index.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/marca.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/mundo.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/natural.js +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/personagem.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/rosto.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/tres.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/vox.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit/voxel.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit-ae/base.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit-ae/cenas.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit-ae/guarda.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kit-ae/primitivas.jsx +0 -0
- /package/lib/{estudio → plugin/estudio}/kits/tela.html +0 -0
- /package/lib/{estudio → plugin/estudio}/lancamento.js +0 -0
- /package/lib/{estudio → plugin/estudio}/legibilidade.js +0 -0
- /package/lib/{estudio → plugin/estudio}/maquina-diretor.js +0 -0
- /package/lib/{estudio → plugin/estudio}/maquina-elementos.js +0 -0
- /package/lib/{estudio → plugin/estudio}/maquina-guarda.js +0 -0
- /package/lib/{estudio → plugin/estudio}/maquina-layout.js +0 -0
- /package/lib/{estudio → plugin/estudio}/maquina-som.js +0 -0
- /package/lib/{estudio → plugin/estudio}/maquina.js +0 -0
- /package/lib/{estudio → plugin/estudio}/margem.js +0 -0
- /package/lib/{estudio → plugin/estudio}/motion.js +0 -0
- /package/lib/{estudio → plugin/estudio}/movimentos.js +0 -0
- /package/lib/{estudio → plugin/estudio}/mundo.js +0 -0
- /package/lib/{estudio → plugin/estudio}/personagem.js +0 -0
- /package/lib/{estudio → plugin/estudio}/plano.js +0 -0
- /package/lib/{estudio → plugin/estudio}/producao.js +0 -0
- /package/lib/{estudio → plugin/estudio}/referencias.js +0 -0
- /package/lib/{estudio → plugin/estudio}/regras-motion.js +0 -0
- /package/lib/{estudio → plugin/estudio}/remotion.js +0 -0
- /package/lib/{estudio → plugin/estudio}/revisor.js +0 -0
- /package/lib/{estudio → plugin/estudio}/ritmo.js +0 -0
- /package/lib/{estudio → plugin/estudio}/sem-narracao.js +0 -0
- /package/lib/{estudio → plugin/estudio}/slides.js +0 -0
- /package/lib/{estudio → plugin/estudio}/sons-leves.js +0 -0
- /package/lib/{estudio → plugin/estudio}/variacao3d.js +0 -0
- /package/lib/{estudio → plugin/estudio}/variedade.js +0 -0
- /package/lib/{estudio → plugin/estudio}/video.js +0 -0
- /package/lib/{estudio → plugin/estudio}/visao/visao.swift +0 -0
- /package/lib/{estudio → plugin/estudio}/visao.js +0 -0
- /package/lib/{estudio → plugin/estudio}/voicestudio.js +0 -0
- /package/lib/{estudio → plugin/estudio}/vox.js +0 -0
- /package/lib/{video → plugin/video}/camadas.js +0 -0
- /package/lib/{video → plugin/video}/cli.js +0 -0
- /package/lib/{video → plugin/video}/conferir-legenda.js +0 -0
- /package/lib/{video → plugin/video}/cor.js +0 -0
- /package/lib/{video → plugin/video}/delta.js +0 -0
- /package/lib/{video → plugin/video}/edits.js +0 -0
- /package/lib/{video → plugin/video}/filters.js +0 -0
- /package/lib/{video → plugin/video}/fx3d/Camadas.jsx +0 -0
- /package/lib/{video → plugin/video}/fx3d/Objetos.jsx +0 -0
- /package/lib/{video → plugin/video}/fx3d/Root.jsx +0 -0
- /package/lib/{video → plugin/video}/fx3d/modelos.jsx +0 -0
- /package/lib/{video → plugin/video}/fx3d.js +0 -0
- /package/lib/{video → plugin/video}/gerados.js +0 -0
- /package/lib/{video → plugin/video}/objetos.js +0 -0
- /package/lib/{video → plugin/video}/paralelo.js +0 -0
- /package/lib/{video → plugin/video}/rastro.js +0 -0
- /package/lib/{video → plugin/video}/texto.js +0 -0
- /package/lib/{video → plugin/video}/timeline.js +0 -0
- /package/lib/{local → provider/local}/cerebro.json +0 -0
- /package/lib/{local → provider/local}/entrada.js +0 -0
- /package/lib/{encolheu.js → session/encolheu.js} +0 -0
- /package/lib/{memoria-conversa.js → session/memoria-conversa.js} +0 -0
- /package/lib/{retomar.js → session/retomar.js} +0 -0
- /package/lib/{snapshot.js → session/snapshot.js} +0 -0
- /package/lib/{titulo-conversa.js → session/titulo-conversa.js} +0 -0
- /package/lib/{especialistas.js → skill/especialistas.js} +0 -0
- /package/lib/{personas.js → skill/personas.js} +0 -0
- /package/lib/{portao-skill.js → skill/portao-skill.js} +0 -0
- /package/lib/{casar.js → tool/casar.js} +0 -0
- /package/lib/{markdown.js → tui/markdown.js} +0 -0
- /package/{kits/adesivos/elementos → materiais/adesivos/camera}/Camera.tsx +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/fontes/OFL-BowlbyOne.txt +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/fontes/OFL-Nunito.txt +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/fontes/bowlby-latin.woff2 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/fontes/nunito-latin.woff2 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/assinatura.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/cola.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/confete.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/impacto.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/palavra.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/pop.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/swipe.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/sons/whoosh.mp3 +0 -0
- /package/{kits/adesivos/assets → materiais/adesivos}/trilha/pop-colorido-112bpm.mp3 +0 -0
- /package/{kits/antes-depois/elementos → materiais/antes-depois/camera}/Camera.tsx +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/OFL-ArchivoBlack.txt +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/OFL-Manrope.txt +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/archivoblack.woff2 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/manrope.woff2 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/assinatura.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/clique.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/impacto.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/subida.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/swoosh.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/tick.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/antes-depois/assets → materiais/antes-depois}/trilha/corte-118bpm.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/fontes/OFL-Inter.txt +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/fontes/inter-latin-500-800.woff2 +0 -0
- /package/{kits/apple-tipografico/elementos → materiais/apple-tipografico/lib}/modelos.ts +0 -0
- /package/{kits/apple-tipografico/elementos → materiais/apple-tipografico/lib}/raymarch.ts +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/assinatura.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/clique.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/impacto.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/subida.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/swoosh.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/trilha/tech-claro-125bpm.mp3 +0 -0
- /package/{kits/aquarela/elementos → materiais/aquarela/camera}/Camera.tsx +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/fontes/OFL-Caveat.txt +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/fontes/OFL-Fraunces.txt +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/fontes/caveat-latin.woff2 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/fontes/fraunces-latin.woff2 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/assinatura.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/gota.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/impacto.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/palavra.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/papel-cai.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/pop-mancha.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/risco.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/sons/whoosh-pincel.mp3 +0 -0
- /package/{kits/aquarela/assets → materiais/aquarela}/trilha/calma-com-punch-108bpm.mp3 +0 -0
- /package/{kits/aurora/elementos → materiais/aurora/camera}/Camera.tsx +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/fontes/OFL-InstrumentSerif.txt +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/fontes/OFL-Manrope.txt +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/fontes/instrument-latin.woff2 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/fontes/manrope-latin.woff2 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/assinatura.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/brilho.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/meteoro.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/onda.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/sino.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/sopro.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/subida.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/sons/toque.mp3 +0 -0
- /package/{kits/aurora/assets → materiais/aurora}/trilha/suave-88bpm.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/OFL-bebas-neue.txt +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/OFL-jost-900.txt +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/bebas-neue.woff2 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/jost-900.woff2 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/assinatura.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/clique.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/impacto.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/subida.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/swoosh.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/tick.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/bauhaus/assets → materiais/bauhaus}/trilha/trilha.mp3 +0 -0
- /package/{kits/brutalista/elementos → materiais/brutalista/camera}/Camera.tsx +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/fontes/OFL-ArchivoBlack.txt +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/fontes/OFL-JetBrainsMono.txt +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/fontes/archivo-black.woff2 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/fontes/jetbrains-mono.woff2 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/assinatura.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/clique.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/impacto.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/subida.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/swoosh.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/brutalista/assets → materiais/brutalista}/trilha/bruta-108bpm.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/OFL-Archivo-Black.txt +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/OFL-DM-Mono.txt +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/OFL-Playfair-Italic.txt +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/archivo-black.woff2 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/dm-mono.woff2 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/playfair-italic.woff2 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/assinatura.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/clique.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/impacto.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/subida.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/swoosh.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/trilha/trilha.mp3 +0 -0
- /package/{kits/cartaz-cinetico/elementos → materiais/cartaz-cinetico/camera}/Camera.tsx +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/OFL-Anton.txt +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/OFL-Archivo.txt +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/anton.woff2 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/archivo.woff2 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/assinatura.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/clique.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/impacto.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/subida.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/swoosh.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/trilha/cartaz-124bpm.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/fontes/OFL-abril-fatface.txt +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/fontes/OFL-special-elite.txt +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/fontes/abril-fatface.woff2 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/fontes/special-elite.woff2 +0 -0
- /package/{kits/colagem/elementos → materiais/colagem/formas}/Overlay.tsx +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/assinatura.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/clique.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/impacto.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/subida.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/swoosh.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/tick.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/colagem/assets → materiais/colagem}/trilha/trilha.mp3 +0 -0
- /package/{kits/contagem/elementos → materiais/contagem/camera}/Camera.tsx +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/fontes/OFL-BigShouldersDisplay.txt +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/fontes/OFL-SpaceMono.txt +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/fontes/bigshoulders.woff2 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/fontes/spacemono.woff2 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/assinatura.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/clique.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/confete.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/impacto.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/subida.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/swoosh.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/tick.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/contagem/assets → materiais/contagem}/trilha/pulso-128bpm.mp3 +0 -0
- /package/{kits/convite-evento/elementos → materiais/convite-evento/camera}/Camera.tsx +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/OFL-InstrumentSerif.txt +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/OFL-Unbounded.txt +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/instrumentserif-i.woff2 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/unbounded.woff2 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/assinatura.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/clique.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/confete.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/impacto.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/subida.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/swoosh.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/convite-evento/assets → materiais/convite-evento}/trilha/festa-112bpm.mp3 +0 -0
- /package/{kits/corte-podcast/elementos → materiais/corte-podcast/camera}/Camera.tsx +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/OFL-Anton.txt +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/OFL-IBMPlexMono.txt +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/anton.woff2 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/plexmono.woff2 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/assinatura.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/clique.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/impacto.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/subida.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/swoosh.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/tick.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/corte-podcast/assets → materiais/corte-podcast}/trilha/lofi-pulso-100bpm.mp3 +0 -0
- /package/{kits/cubos/elementos → materiais/cubos/camera}/Camera.tsx +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/fontes/OFL-ArchivoBlack.txt +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/fontes/OFL-DMSans.txt +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/fontes/archivoblack-latin.woff2 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/fontes/dmsans-latin.woff2 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/assinatura.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/bloco.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/desmonta.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/encaixa.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/estala.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/gira.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/queda.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/sons/whoosh.mp3 +0 -0
- /package/{kits/cubos/assets → materiais/cubos}/trilha/calma-com-punch-108bpm.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/OFL-IBM-Plex-Mono.txt +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/OFL-Montserrat.txt +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/montserrat.woff2 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/plex-mono.woff2 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/assinatura.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/clique.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/impacto.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/subida.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/swoosh.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/trilha/trilha.mp3 +0 -0
- /package/{kits/depoimento/elementos → materiais/depoimento/camera}/Camera.tsx +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/fontes/OFL-Newsreader.txt +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/fontes/OFL-SpaceGrotesk.txt +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/fontes/newsreader-i.woff2 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/fontes/spacegrotesk.woff2 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/assinatura.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/clique.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/estrela.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/impacto.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/subida.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/swoosh.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/verificado.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/depoimento/assets → materiais/depoimento}/trilha/calor-104bpm.mp3 +0 -0
- /package/{kits/infografico/elementos → materiais/infografico/camera}/Camera.tsx +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/fontes/OFL-Caveat.txt +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/fontes/OFL-Outfit.txt +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/fontes/caveat.woff2 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/fontes/outfit.woff2 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/assinatura.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/clique.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/impacto.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/subida.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/swoosh.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/traco.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/infografico/assets → materiais/infografico}/trilha/explica-100bpm.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/fontes/OFL-Archivo.txt +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/fontes/OFL-Jost.txt +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/fontes/archivo.woff2 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/fontes/jost.woff2 +0 -0
- /package/{kits/isometrico/elementos → materiais/isometrico/formas}/iso.tsx +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/assinatura.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/clique.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/impacto.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/subida.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/swoosh.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/isometrico/assets → materiais/isometrico}/trilha/trilha.mp3 +0 -0
- /package/{kits/jornal/elementos → materiais/jornal/camera}/Camera.tsx +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/fontes/OFL-PlayfairDisplay.txt +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/fontes/OFL-UnifrakturMaguntia.txt +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/fontes/playfair-italic.woff2 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/fontes/playfair.woff2 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/fontes/unifraktur.woff2 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/assinatura.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/clique.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/impacto.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/subida.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/swoosh.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/jornal/assets → materiais/jornal}/trilha/redacao-96bpm.mp3 +0 -0
- /package/{kits/legenda-viva/elementos → materiais/legenda-viva/camera}/Camera.tsx +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/OFL-Inter.txt +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/OFL-Montserrat.txt +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/inter.woff2 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/montserrat.woff2 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/assinatura.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/clique.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/impacto.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/subida.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/swoosh.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/legenda-viva/assets → materiais/legenda-viva}/trilha/voz-118bpm.mp3 +0 -0
- /package/{kits/luxo/elementos → materiais/luxo/camera}/Camera.tsx +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/fontes/OFL-CormorantGaramond.txt +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/fontes/OFL-Jost.txt +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/fontes/cormorant-i.woff2 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/fontes/cormorant.woff2 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/fontes/jost.woff2 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/assinatura.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/clique.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/impacto.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/sino.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/subida.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/swoosh.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/luxo/assets → materiais/luxo}/trilha/ambar-78bpm.mp3 +0 -0
- /package/{kits/mapa/elementos → materiais/mapa/camera}/Camera.tsx +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/fontes/OFL-DMMono.txt +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/fontes/OFL-DMSans.txt +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/fontes/dmmono.woff2 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/fontes/dmsans.woff2 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/assinatura.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/clique.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/impacto.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/quique.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/subida.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/swoosh.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/traco.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/mapa/assets → materiais/mapa}/trilha/rota-100bpm.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/fontes/OFL-chewy.txt +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/fontes/OFL-nunito-800.txt +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/fontes/chewy.woff2 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/fontes/nunito-800.woff2 +0 -0
- /package/{kits/massinha/elementos → materiais/massinha/lib}/argila.ts +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/assinatura.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/clique.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/impacto.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/subida.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/swoosh.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/tick.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/massinha/assets → materiais/massinha}/trilha/trilha.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/fontes/OFL-bowlby-one.txt +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/fontes/OFL-dm-sans-800.txt +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/fontes/bowlby-one.woff2 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/fontes/dm-sans-800.woff2 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/assinatura.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/clique.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/impacto.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/subida.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/swoosh.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/tick.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/memphis/assets → materiais/memphis}/trilha/trilha.mp3 +0 -0
- /package/{kits/metal-liquido/elementos → materiais/metal-liquido/camera}/Camera.tsx +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/OFL-SpaceGrotesk.txt +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/OFL-Unbounded.txt +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/grotesk-latin.woff2 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/unbounded-latin.woff2 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/assinatura.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/clique.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/cromo.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/liquido.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/quique.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/subida.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/varre.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/whoosh.mp3 +0 -0
- /package/{kits/metal-liquido/assets → materiais/metal-liquido}/trilha/sombrio-114bpm.mp3 +0 -0
- /package/{kits/minimal/elementos → materiais/minimal/camera}/Camera.tsx +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/fontes/OFL-HankenGrotesk.txt +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/fontes/OFL-SplineSansMono.txt +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/fontes/hanken.woff2 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/fontes/splinemono.woff2 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/assinatura.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/clique.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/impacto.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/subida.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/swoosh.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/toque.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/minimal/assets → materiais/minimal}/trilha/vazio-90bpm.mp3 +0 -0
- /package/{kits/neon-cidade/elementos → materiais/neon-cidade/camera}/Camera.tsx +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/OFL-BarlowCondensed.txt +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/OFL-TiltNeon.txt +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/barlow-latin.woff2 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/tiltneon-latin.woff2 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/assinatura.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/balanca.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/clique.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/impacto.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/liga.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/tick.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/whoosh.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/zumbido.mp3 +0 -0
- /package/{kits/neon-cidade/assets → materiais/neon-cidade}/trilha/noite-100bpm.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/OFL-Cormorant-Italic.txt +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/OFL-Cormorant.txt +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/OFL-Jost.txt +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/cormorant-italic.woff2 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/cormorant.woff2 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/jost.woff2 +0 -0
- /package/{kits/notion-editorial/elementos → materiais/notion-editorial/formas}/desenho.tsx +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/assinatura.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/clique.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/impacto.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/subida.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/swoosh.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/notion-editorial/assets → materiais/notion-editorial}/trilha/trilha.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/OFL-fredoka-700.txt +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/OFL-nunito-700.txt +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/fredoka-700.woff2 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/nunito-700.woff2 +0 -0
- /package/{kits/papel-recortado/elementos → materiais/papel-recortado/formas}/Filtros.tsx +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/assinatura.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/clique.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/impacto.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/subida.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/swoosh.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/tick.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/papel-recortado/assets → materiais/papel-recortado}/trilha/trilha.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/fontes/OFL-pressstart2p.txt +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/fontes/OFL-vt323.txt +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/fontes/pressstart2p.woff2 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/fontes/vt323.woff2 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/assinatura.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/clique.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/impacto.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/subida.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/swoosh.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/tick.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/pixel/assets → materiais/pixel}/trilha/trilha.mp3 +0 -0
- /package/{kits/pontos-3d/elementos → materiais/pontos-3d/camera}/Camera.tsx +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/OFL-JetBrainsMono.txt +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/OFL-Sora.txt +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/jetbrains-latin.woff2 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/sora-latin.woff2 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/assinatura.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/clique.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/impacto.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/pop.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/subida.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/tick.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/varre.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/whoosh.mp3 +0 -0
- /package/{kits/pontos-3d/assets → materiais/pontos-3d}/trilha/tech-120bpm.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/OFL-IBMPlexMono.txt +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/OFL-Syncopate.txt +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/plex-mono.woff2 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/syncopate-latin.woff2 +0 -0
- /package/{kits/produto-3d/elementos → materiais/produto-3d/lib}/modelos.ts +0 -0
- /package/{kits/produto-3d/elementos → materiais/produto-3d/lib}/raymarch.ts +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/assinatura.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/clique.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/impacto.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/subida.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/swoosh.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/produto-3d/assets → materiais/produto-3d}/trilha/trilha.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/OFL-patrick-hand.txt +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/OFL-schoolbell.txt +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/patrick-hand.woff2 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/schoolbell.woff2 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/assinatura.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/clique.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/impacto.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/subida.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/swoosh.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/tick.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/quadro-giz/assets → materiais/quadro-giz}/trilha/trilha.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/fontes/OFL-caveat-700.txt +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/fontes/OFL-permanent-marker.txt +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/fontes/caveat-700.woff2 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/fontes/permanent-marker.woff2 +0 -0
- /package/{kits/rabisco/elementos → materiais/rabisco/formas}/Overlay.tsx +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/assinatura.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/clique.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/impacto.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/subida.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/swoosh.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/tick.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/rabisco/assets → materiais/rabisco}/trilha/trilha.mp3 +0 -0
- /package/{kits/retro-70/elementos → materiais/retro-70/camera}/Camera.tsx +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/fontes/OFL-Fredoka.txt +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/fontes/OFL-Shrikhand.txt +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/fontes/fredoka.woff2 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/fontes/shrikhand.woff2 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/assinatura.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/clique.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/impacto.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/subida.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/swoosh.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/retro-70/assets → materiais/retro-70}/trilha/solar-104bpm.mp3 +0 -0
- /package/{kits/revista/elementos → materiais/revista/camera}/Camera.tsx +0 -0
- /package/{kits/revista/assets → materiais/revista}/fontes/OFL-CormorantGaramond.txt +0 -0
- /package/{kits/revista/assets → materiais/revista}/fontes/OFL-Jost.txt +0 -0
- /package/{kits/revista/assets → materiais/revista}/fontes/cormorant-italic.woff2 +0 -0
- /package/{kits/revista/assets → materiais/revista}/fontes/cormorant.woff2 +0 -0
- /package/{kits/revista/assets → materiais/revista}/fontes/jost.woff2 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/assinatura.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/clique.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/impacto.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/subida.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/swoosh.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/revista/assets → materiais/revista}/trilha/editorial-100bpm.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/fontes/OFL-bricolage-800.txt +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/fontes/OFL-space-mono-700.txt +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/fontes/bricolage-800.woff2 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/fontes/space-mono-700.woff2 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/assinatura.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/clique.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/impacto.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/subida.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/swoosh.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/tick.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/risografia/assets → materiais/risografia}/trilha/trilha.mp3 +0 -0
- /package/materiais/saas-linear/{paleta.json → cores/paleta.json} +0 -0
- /package/{kits/saas-linear/assets → materiais/saas-linear}/trilha/trilha.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/OFL-DM-Mono.txt +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/OFL-Inter.txt +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/dm-mono.woff2 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/inter.woff2 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/assinatura.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/clique.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/impacto.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/subida.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/swoosh.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/trilha/trilha.mp3 +0 -0
- /package/{kits/suica/elementos → materiais/suica/camera}/Camera.tsx +0 -0
- /package/{kits/suica/assets → materiais/suica}/fontes/OFL-IBMPlexMono.txt +0 -0
- /package/{kits/suica/assets → materiais/suica}/fontes/OFL-InterTight.txt +0 -0
- /package/{kits/suica/assets → materiais/suica}/fontes/inter-tight.woff2 +0 -0
- /package/{kits/suica/assets → materiais/suica}/fontes/plex-mono.woff2 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/assinatura.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/clique.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/impacto.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/subida.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/swoosh.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/saas-linear/assets → materiais/suica}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/suica/assets → materiais/suica}/trilha/frio-120bpm.mp3 +0 -0
- /package/{kits/synthwave/elementos → materiais/synthwave/camera}/Camera.tsx +0 -0
- /package/{kits/synthwave/assets → materiais/synthwave}/fontes/OFL-Orbitron.txt +0 -0
- /package/{kits/synthwave/assets → materiais/synthwave}/fontes/OFL-Rajdhani.txt +0 -0
- /package/{kits/synthwave/assets → materiais/synthwave}/fontes/orbitron.woff2 +0 -0
- /package/{kits/synthwave/assets → materiais/synthwave}/fontes/rajdhani.woff2 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/assinatura.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/clique.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/impacto.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/subida.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/swoosh.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/suica/assets → materiais/synthwave}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/synthwave}/trilha/noite-110bpm.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/fontes/OFL-jetbrains-mono-700.txt +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/fontes/OFL-vt323.txt +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/fontes/jetbrains-mono-700.woff2 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/fontes/vt323.woff2 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/assinatura.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/clique.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/digitar.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/impacto.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/liga-crt.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/subida.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/swoosh.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/tick.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/terminal/assets → materiais/terminal}/trilha/trilha.mp3 +0 -0
- /package/{kits/tiktok-energia/elementos → materiais/tiktok-energia/camera}/Camera.tsx +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/OFL-Anton.txt +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/OFL-Rubik.txt +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/anton-latin.woff2 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/rubik-latin.woff2 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/assinatura.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/corte.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/palavra.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/pop.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/soco.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/subida.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/whoosh.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/zap.mp3 +0 -0
- /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/trilha/tech-128bpm.mp3 +0 -0
- /package/{kits/tunel/elementos → materiais/tunel/camera}/Camera.tsx +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/fontes/OFL-ChakraPetch.txt +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/fontes/OFL-Syncopate.txt +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/fontes/chakra-latin.woff2 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/fontes/syncopate-latin.woff2 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/assinatura.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/clique.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/impacto.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/passa.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/subida.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/tick.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/varre.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/sons/whoosh.mp3 +0 -0
- /package/{kits/tunel/assets → materiais/tunel}/trilha/tech-128bpm.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/OFL-JetBrainsMono.txt +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/OFL-PlusJakartaSans.txt +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/jakarta.woff2 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/jbmono.woff2 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/assinatura.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/clique.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/digitar.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/impacto.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/subida.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/sucesso.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/swoosh.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/trilha/passo-108bpm.mp3 +0 -0
- /package/{kits/ugc-reels/elementos → materiais/ugc-reels/camera}/Camera.tsx +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/OFL-Caveat.txt +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/OFL-Montserrat.txt +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/caveat-latin.woff2 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/montserrat-latin.woff2 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/assinatura.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/corte.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/impacto.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/notificacao.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/palavra.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/pop.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/toque.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/whoosh.mp3 +0 -0
- /package/{kits/ugc-reels/assets → materiais/ugc-reels}/trilha/pop-120bpm.mp3 +0 -0
- /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/OFL-Inter.txt +0 -0
- /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/OFL-JetBrains-Mono.txt +0 -0
- /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/inter.woff2 +0 -0
- /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/jetbrains-mono.woff2 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/assinatura.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/clique.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/impacto.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/subida.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/swoosh.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/vercel-mono/assets → materiais/vercel-mono}/trilha/trilha.mp3 +0 -0
- /package/{kits/vhs-90/elementos → materiais/vhs-90/camera}/Camera.tsx +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/OFL-BebasNeue.txt +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/OFL-VT323.txt +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/bebas.woff2 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/vt323.woff2 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/assinatura.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/clique.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/impacto.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/subida.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/swoosh.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/vhs-90/assets → materiais/vhs-90}/trilha/fita-88bpm.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/OFL-DM-Mono.txt +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/OFL-Inter.txt +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/dm-mono.woff2 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/inter.woff2 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/assinatura.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/clique.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/impacto.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/subida.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/swoosh.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/vidro-ios/assets → materiais/vidro-ios}/trilha/trilha.mp3 +0 -0
- /package/{kits/y2k-cromado/elementos → materiais/y2k-cromado/camera}/Camera.tsx +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/OFL-DMMono.txt +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/OFL-Unbounded.txt +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/dm-mono.woff2 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/unbounded.woff2 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/assinatura.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/clique.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/impacto.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/pop-cartao.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/pop-palavra.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/subida.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/swoosh.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/whoosh-entra.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/whoosh-sai.mp3 +0 -0
- /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/trilha/y2k-128bpm.mp3 +0 -0
|
@@ -0,0 +1,2725 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* estudio/index.js — as ferramentas do Studio, do jeito que o agente as vê.
|
|
3
|
+
*
|
|
4
|
+
* ── O QUE ESTE ARQUIVO SUBSTITUI ─────────────────────────────────────────
|
|
5
|
+
* `lib/studio.js`, 887 linhas cuja maior parte era ligar, manter de pé e
|
|
6
|
+
* conversar por HTTP com um servidor Python que desenhava páginas — e mais o
|
|
7
|
+
* cuidado de abrir uma aba no navegador da pessoa no momento certo, e de não
|
|
8
|
+
* abrir três.
|
|
9
|
+
*
|
|
10
|
+
* Nada disso existe mais. Cada peça é uma PASTA, cada render é o Remotion, e
|
|
11
|
+
* a única coisa que abre no fim é o vídeo pronto.
|
|
12
|
+
*
|
|
13
|
+
* ── AS SETE FERRAMENTAS, E POR QUE SÃO SETE ──────────────────────────────
|
|
14
|
+
* estudio_projeto abrir, achar, listar, lembrar
|
|
15
|
+
* estudio_plano escrever ou ajustar o que o vídeo é
|
|
16
|
+
* estudio_midia procurar e baixar imagem, som, ícone, fonte
|
|
17
|
+
* estudio_narrar a voz, com os tempos medidos
|
|
18
|
+
* estudio_video o que se faz com a gravação: medir, cortar, legendar
|
|
19
|
+
* estudio_render virar arquivo
|
|
20
|
+
* estudio_site ler a identidade de uma marca a partir do link
|
|
21
|
+
*
|
|
22
|
+
* A tentação era uma ferramenta por verbo (criar cena, mover elemento, trocar
|
|
23
|
+
* cor). Isso multiplicaria o catálogo por dez e, pior, faria o modelo montar
|
|
24
|
+
* o vídeo por ajustes — que é exatamente como se produz vídeo genérico. O
|
|
25
|
+
* plano inteiro de uma vez obriga a decidir o vídeo inteiro de uma vez.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
'use strict';
|
|
29
|
+
|
|
30
|
+
const fs = require('fs');
|
|
31
|
+
const os = require('os');
|
|
32
|
+
const path = require('path');
|
|
33
|
+
const { spawn } = require('child_process');
|
|
34
|
+
|
|
35
|
+
const projeto = require('./projeto.js');
|
|
36
|
+
const acervo = require('./acervo.js');
|
|
37
|
+
const hibrido = require('./hibrido.js');
|
|
38
|
+
const biblioteca = require('./biblioteca.js');
|
|
39
|
+
const referencias = require('./referencias.js');
|
|
40
|
+
const variedade = require('./variedade.js');
|
|
41
|
+
const diretor = require('./diretor.js');
|
|
42
|
+
const falantes = require('./falantes.js');
|
|
43
|
+
const variacao3d = require('./variacao3d.js');
|
|
44
|
+
const plano = require('./plano.js');
|
|
45
|
+
const remotion = require('./remotion.js');
|
|
46
|
+
const assets = require('./assets.js');
|
|
47
|
+
const video = require('./video.js');
|
|
48
|
+
const batida = require('./batida.js');
|
|
49
|
+
const revisor = require('./revisor.js');
|
|
50
|
+
const marcaLib = require('./marca.js');
|
|
51
|
+
const marcaKit = require('../marca-kit.js');
|
|
52
|
+
const conferencia = require('./conferencia.js');
|
|
53
|
+
const margem = require('./margem.js');
|
|
54
|
+
const assinatura = require('./assinatura.js');
|
|
55
|
+
const identidade = require('./identidade.js');
|
|
56
|
+
const slides = require('./slides.js');
|
|
57
|
+
const edicao = require('./edicao.js');
|
|
58
|
+
const composicao = require('./composicao.js');
|
|
59
|
+
const acervoSite = require('./acervo-site.js');
|
|
60
|
+
const printSite = require('./print-site.js');
|
|
61
|
+
const efeitos = require('./efeitos.js');
|
|
62
|
+
const impacto = require('./impacto.js');
|
|
63
|
+
const cinema = require('./cinema.js');
|
|
64
|
+
const motion = require('./motion.js');
|
|
65
|
+
const gerativo = require('./gerativo.js');
|
|
66
|
+
const fluido = require('./fluido.js');
|
|
67
|
+
const vox = require('./vox.js');
|
|
68
|
+
const kokoro = require('./kokoro.js');
|
|
69
|
+
const voicestudio = require('./voicestudio.js');
|
|
70
|
+
const lancamento = require('./lancamento.js');
|
|
71
|
+
const glifos = require('./glifos.js');
|
|
72
|
+
const personagem = require('./personagem.js');
|
|
73
|
+
const mundo = require('./mundo.js');
|
|
74
|
+
const cenarios = require('./cenarios.js');
|
|
75
|
+
const estilos = require('./estilos.js');
|
|
76
|
+
const { conferirCena } = require('./cena.js');
|
|
77
|
+
const movimentos = require('./movimentos.js');
|
|
78
|
+
const colecao = require('./colecao.js');
|
|
79
|
+
const { escolherEstilo, LEVES } = require('./estilo.js');
|
|
80
|
+
const sonsLeves = require('./sons-leves.js');
|
|
81
|
+
const semNarracao = require('./sem-narracao.js');
|
|
82
|
+
const camadas = require('./camadas.js');
|
|
83
|
+
const ende = require('./ende.js');
|
|
84
|
+
const producao = require('./producao.js');
|
|
85
|
+
|
|
86
|
+
const PY = path.join(__dirname, '..', '..', '..', 'studio');
|
|
87
|
+
|
|
88
|
+
/** Qual python desta máquina. O mesmo problema do Studio antigo, mesma cura. */
|
|
89
|
+
function python() {
|
|
90
|
+
const { execSync } = require('child_process');
|
|
91
|
+
const nomes = process.platform === 'win32'
|
|
92
|
+
? ['python', 'py', 'python3']
|
|
93
|
+
: ['python3', 'python', '/opt/homebrew/bin/python3', '/usr/local/bin/python3', '/usr/bin/python3'];
|
|
94
|
+
for (const n of nomes) {
|
|
95
|
+
try {
|
|
96
|
+
const v = execSync(`${n} --version`, { stdio: ['ignore', 'pipe', 'pipe'], timeout: 5000 }).toString();
|
|
97
|
+
if (/Python 3/.test(v)) return n;
|
|
98
|
+
} catch { /* próximo */ }
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function rodarPython(script, args, { timeout = 20 * 60000 } = {}) {
|
|
104
|
+
return new Promise((resolve) => {
|
|
105
|
+
const py = python();
|
|
106
|
+
if (!py) {
|
|
107
|
+
return resolve({ ok: false, error: 'não achei o Python 3 nesta máquina.',
|
|
108
|
+
comoResolver: 'instale o Python 3 (python.org) e tente de novo' });
|
|
109
|
+
}
|
|
110
|
+
const p = spawn(py, [path.join(PY, script), ...args]);
|
|
111
|
+
let saida = '', erro = '';
|
|
112
|
+
p.stdout.on('data', (d) => { saida += d.toString(); });
|
|
113
|
+
p.stderr.on('data', (d) => { erro += d.toString(); });
|
|
114
|
+
const relogio = setTimeout(() => { try { p.kill(); } catch {} }, timeout);
|
|
115
|
+
p.on('close', () => {
|
|
116
|
+
clearTimeout(relogio);
|
|
117
|
+
try { resolve(JSON.parse(saida.trim().split('\n').pop())); }
|
|
118
|
+
catch { resolve({ ok: false, error: (erro || saida).slice(-400).trim() || 'o script não respondeu' }); }
|
|
119
|
+
});
|
|
120
|
+
p.on('error', (e) => { clearTimeout(relogio); resolve({ ok: false, error: e.message }); });
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* O RECORTE DA PESSOA precisa do MediaPipe, e o MediaPipe só existe até o
|
|
125
|
+
Python 3.12 — no Python 3.14 do Homebrew ele nem instala (medido em
|
|
126
|
+
25/09: o recorte nunca tinha rodado nesta máquina). Com o `uv`, o script
|
|
127
|
+
roda num Python 3.12 isolado, baixado uma vez; sem ele, tenta o Python da
|
|
128
|
+
máquina, como antes. */
|
|
129
|
+
function acharUv() {
|
|
130
|
+
const { execFileSync } = require('child_process');
|
|
131
|
+
for (const c of ['uv', path.join(os.homedir(), '.local', 'bin', 'uv'), '/opt/homebrew/bin/uv', '/usr/local/bin/uv']) {
|
|
132
|
+
try { execFileSync(c, ['--version'], { stdio: 'ignore', timeout: 5000 }); return c; } catch { /* próximo */ }
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
function rodarPessoa(args, { timeout = 40 * 60000 } = {}) {
|
|
137
|
+
const uv = acharUv();
|
|
138
|
+
if (!uv) return rodarPython('pessoa.py', args, { timeout });
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
const p = spawn(uv, ['run', '--quiet', '--python', '3.12', '--with', 'mediapipe<0.10.22',
|
|
141
|
+
'--with', 'opencv-python', '--with', 'numpy', 'python', path.join(PY, 'pessoa.py'), ...args]);
|
|
142
|
+
let saida = '', erro = '';
|
|
143
|
+
p.stdout.on('data', (d) => { saida += d.toString(); });
|
|
144
|
+
p.stderr.on('data', (d) => { erro += d.toString(); });
|
|
145
|
+
const relogio = setTimeout(() => { try { p.kill(); } catch {} }, timeout);
|
|
146
|
+
p.on('close', () => {
|
|
147
|
+
clearTimeout(relogio);
|
|
148
|
+
try { resolve(JSON.parse(saida.trim().split('\n').pop())); }
|
|
149
|
+
catch { resolve({ ok: false, error: (erro || saida).slice(-400).trim() || 'o recorte não respondeu' }); }
|
|
150
|
+
});
|
|
151
|
+
p.on('error', (e) => { clearTimeout(relogio); resolve({ ok: false, error: e.message }); });
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ── estudio_projeto ──────────────────────────────────────────────────────
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* A queixa quando o projeto não aparece — e ela muda conforme o motivo.
|
|
159
|
+
*
|
|
160
|
+
* "não achei o projeto 'undefined'" é o que o agente recebia ao chamar a
|
|
161
|
+
* ferramenta SEM id, e não ensina nada: ele não sabe se inventou o id, se o
|
|
162
|
+
* projeto sumiu, ou se esqueceu o argumento. Visto em produção — o modelo
|
|
163
|
+
* chamou `estudio_plano` sem id e ficou repetindo a chamada.
|
|
164
|
+
*/
|
|
165
|
+
function semProjeto(id) {
|
|
166
|
+
if (id == null || String(id).trim() === '') {
|
|
167
|
+
return {
|
|
168
|
+
ok: false,
|
|
169
|
+
error: 'faltou dizer em qual projeto (id).',
|
|
170
|
+
comoResolver: 'crie um com estudio_projeto acao:"criar" e use o id que ele devolve, '
|
|
171
|
+
+ 'ou ache o existente com acao:"listar" / acao:"procurar".',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
ok: false,
|
|
176
|
+
error: `não achei o projeto "${id}".`,
|
|
177
|
+
comoResolver: 'liste com estudio_projeto acao:"listar" e use um id de lá — '
|
|
178
|
+
+ 'o id é o nome da pasta (ex: "anuncio-picpay"), não o título.',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async function ferramentaProjeto(args, ctx = {}) {
|
|
183
|
+
const acao = String(args.acao || 'listar').toLowerCase();
|
|
184
|
+
|
|
185
|
+
if (acao === 'editar' || acao === 'editor' || acao === 'studio') return editarNoStudio(args, ctx);
|
|
186
|
+
|
|
187
|
+
if (acao === 'criar' || acao === 'novo') {
|
|
188
|
+
const r = projeto.criar({
|
|
189
|
+
titulo: args.titulo, pedido: args.pedido || args.titulo, formato: args.formato || 'video',
|
|
190
|
+
});
|
|
191
|
+
return { ...r, comoUsar: 'agora escreva o plano com estudio_plano, usando este id.' };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (acao === 'abrir' || acao === 'ler') {
|
|
195
|
+
const p = projeto.ler(args.id);
|
|
196
|
+
if (!p) return semProjeto(args.id);
|
|
197
|
+
const pl = projeto.lerPlano(args.id);
|
|
198
|
+
return {
|
|
199
|
+
ok: true, projeto: p,
|
|
200
|
+
// O caderno é o que faz "mexe naquela parte" funcionar semanas
|
|
201
|
+
// depois: sem ele, reabrir diz o que existe e nunca por quê.
|
|
202
|
+
caderno: projeto.caderno(args.id, { ultimas: 25 }),
|
|
203
|
+
// A conversa das sessões em que se mexeu neste projeto (AGENTS.md
|
|
204
|
+
// da pasta dele, lib/agents-md.js): o que foi pedido e decidido.
|
|
205
|
+
memoria: require('../../agents-md.js').ler(p.pasta) || undefined,
|
|
206
|
+
plano: pl ? plano.resumo(pl) : 'ainda não há plano',
|
|
207
|
+
versoes: projeto.versoes(args.id),
|
|
208
|
+
arquivos: listarArquivos(p.pasta),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (acao === 'procurar' || acao === 'achar') {
|
|
213
|
+
const achados = projeto.procurar(args.texto || args.titulo || '');
|
|
214
|
+
if (!achados.length) return { ok: true, achados: [], aviso: 'nenhum projeto parecido.' };
|
|
215
|
+
return {
|
|
216
|
+
ok: true,
|
|
217
|
+
achados: achados.map((p) => ({ id: p.id, titulo: p.titulo, criado: p.criado.slice(0, 10), pedido: p.pedido.slice(0, 120) })),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (acao === 'anotar') {
|
|
222
|
+
projeto.anotar(args.id, args.tipo || 'nota', args.texto || '');
|
|
223
|
+
return { ok: true };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* O FEEDBACK que vira estilo: "adorei a virada", "texto demais" fica na
|
|
227
|
+
assinatura da pessoa (assinatura.js), e o próximo vídeo já parte dele.
|
|
228
|
+
Sem texto, devolve a assinatura (as faixas e as notas). */
|
|
229
|
+
if (acao === 'assinatura' || acao === 'feedback' || acao === 'gostei') {
|
|
230
|
+
const nome = args.nome || args.assinatura || 'fluido';
|
|
231
|
+
if (!args.texto) { const a = assinatura.ler(nome); return a ? { ok: true, assinatura: a } : { ok: false, error: `a assinatura "${nome}" não existe.` }; }
|
|
232
|
+
const r = assinatura.anotar(nome, args.texto);
|
|
233
|
+
if (r.ok && args.id) projeto.anotar(args.id, 'assinatura', `feedback gravado na assinatura ${nome}: ${args.texto}`);
|
|
234
|
+
return r;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const todos = projeto.listar({ limite: Number(args.limite) || 20 });
|
|
238
|
+
return {
|
|
239
|
+
ok: true,
|
|
240
|
+
projetos: todos.map((p) => ({ id: p.id, titulo: p.titulo, criado: p.criado.slice(0, 10), renders: (p.renders || []).length })),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* EDITAR um vídeo que o Estúdio fez: abre o projeto Remotion dele no
|
|
245
|
+
Remotion Studio. Sem id, é o projeto mais novo. */
|
|
246
|
+
async function editarNoStudio(args, ctx = {}) {
|
|
247
|
+
const p = args.id ? projeto.ler(args.id) : projeto.listar({ limite: 1 })[0];
|
|
248
|
+
if (!p) return semProjeto(args.id);
|
|
249
|
+
const raiz = path.join(p.pasta, 'remotion');
|
|
250
|
+
if (!fs.existsSync(path.join(raiz, 'package.json'))) {
|
|
251
|
+
// Projeto que ainda não virou Remotion: escreve agora, sem renderizar.
|
|
252
|
+
const m = await ferramentaRender({ id: p.id, somenteProjeto: true }, ctx);
|
|
253
|
+
if (!m.ok) return m;
|
|
254
|
+
}
|
|
255
|
+
const r = remotion.abrirStudio({ raiz, spawnar: ctx.spawnar });
|
|
256
|
+
if (!r.ok) return { ...r, pasta: raiz };
|
|
257
|
+
projeto.anotar(p.id, 'editor', 'abriu no Remotion Studio');
|
|
258
|
+
return {
|
|
259
|
+
ok: true, id: p.id, pasta: raiz, comando: r.comando,
|
|
260
|
+
aviso: 'O Remotion Studio está ABRINDO no navegador (geralmente http://localhost:3000). '
|
|
261
|
+
+ `Diga ao usuário onde está o projeto: ${raiz}. Lá ele mexe e renderiza pelo botão Render do Studio. `
|
|
262
|
+
+ 'Cuidado: estudio_render reescreve a pasta src/ a partir do plano e apaga o que ele mudou à mão.',
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function listarArquivos(pasta) {
|
|
267
|
+
const saida = {};
|
|
268
|
+
for (const sub of ['entrada', 'midia', 'saida']) {
|
|
269
|
+
try {
|
|
270
|
+
saida[sub] = fs.readdirSync(path.join(pasta, sub))
|
|
271
|
+
.filter((f) => !f.endsWith('.licenca.json')).slice(0, 40);
|
|
272
|
+
} catch { saida[sub] = []; }
|
|
273
|
+
}
|
|
274
|
+
return saida;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// ── estudio_plano ────────────────────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
/* O projeto de AGORA, quando o modelo esquece o id: o criado há menos de
|
|
280
|
+
30 minutos. Medido com o modelo grátis em 25/09: ele chamou estudio_plano
|
|
281
|
+
sem id logo depois de criar o projeto, e a tarefa morreu ali. */
|
|
282
|
+
function projetoRecente() {
|
|
283
|
+
const agora = Date.now();
|
|
284
|
+
const lista = projeto.listar({ limite: 8 })
|
|
285
|
+
.filter((x) => x.criado && agora - new Date(x.criado).getTime() < 30 * 60000)
|
|
286
|
+
.sort((a, b) => new Date(b.criado) - new Date(a.criado));
|
|
287
|
+
return lista[0] || null;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Sem id, o projeto é o que acabou de ser criado. Visto em 12/10: o agente
|
|
291
|
+
criou o projeto, chamou estudio_narrar sem id e o vídeo morreu ali. Só vale
|
|
292
|
+
para chamada SEM id (id errado continua sendo erro) e para projeto de até
|
|
293
|
+
30 minutos, como no estudio_plano. */
|
|
294
|
+
function projetoOuRecente(id) {
|
|
295
|
+
if (id != null && String(id).trim() !== '') return projeto.ler(id);
|
|
296
|
+
return projetoRecente();
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/* roteiro.objetos: [{nome, src}] com o PNG DENTRO da pasta do projeto (o que
|
|
300
|
+
o estudio_midia baixou ou recortou). Caminho de fora some: o render só
|
|
301
|
+
enxerga a pasta do projeto, e a IA não escolhe arquivo da máquina. */
|
|
302
|
+
function objetosDoRoteiro(objetos, pasta) {
|
|
303
|
+
const raiz = path.resolve(pasta);
|
|
304
|
+
return (Array.isArray(objetos) ? objetos : []).map((o) => {
|
|
305
|
+
if (!o || typeof o.src !== 'string') return null;
|
|
306
|
+
const abs = path.resolve(raiz, o.src);
|
|
307
|
+
if (!abs.startsWith(raiz + path.sep) || !/\.png$/i.test(abs) || !fs.existsSync(abs)) return null;
|
|
308
|
+
return { nome: o.nome, src: path.relative(raiz, abs).replace(/\\/g, '/') };
|
|
309
|
+
}).filter(Boolean);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** O roteiro é utilizável como veio? (objeto ou JSON, com partes de tipo conhecido) */
|
|
313
|
+
function roteiroValido(r) {
|
|
314
|
+
let x = r;
|
|
315
|
+
if (typeof x === 'string') { try { x = JSON.parse(x); } catch { return null; } }
|
|
316
|
+
const partes = Array.isArray(x) ? x : x && x.partes;
|
|
317
|
+
if (!Array.isArray(partes) || partes.length < 2) return null;
|
|
318
|
+
const CINEMA = ['frase', 'montagem', 'numeros', 'escada', 'dia', 'depoimento', 'climax', 'final'];
|
|
319
|
+
const NOVOS = ['logo', 'cores', 'produto']; // vox.js e lancamento.js
|
|
320
|
+
/* A FALA do personagem (personagem.js) não tem tipo: é {falante, texto}. Sem
|
|
321
|
+
isto, o roteiro de diálogo caía no roteirista do servidor, que reescrevia
|
|
322
|
+
tudo com um apresentador só — e as duas vozes sumiam (10/10). */
|
|
323
|
+
const conversa = (x && !Array.isArray(x) && String(x.estilo || '').toLowerCase() === 'personagem') || partes.some((pt) => pt && typeof pt.falante === 'string' && pt.falante.trim());
|
|
324
|
+
const fala = (pt) => conversa && !pt.tipo && typeof (pt.texto || pt.fala) === 'string' && String(pt.texto || pt.fala).trim();
|
|
325
|
+
if (!partes.every((pt) => pt && (composicao.TIPOS.includes(pt.tipo) || CINEMA.includes(pt.tipo) || NOVOS.includes(pt.tipo) || fala(pt)))) return null;
|
|
326
|
+
// Duas vozes: roteiro.vozes e parte.falante, limpos (falantes.js). Sem eles, nada muda.
|
|
327
|
+
const obj = falantes.normalizar(Array.isArray(x) ? { partes } : x);
|
|
328
|
+
return partes.some((pt) => CINEMA.includes(pt.tipo)) && !obj.estilo ? { ...obj, estilo: 'cinema' } : obj;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// O último site lido, para o projeto que nasceu DEPOIS da leitura.
|
|
332
|
+
let ultimoSite = null;
|
|
333
|
+
|
|
334
|
+
async function garantirAcervo(p) {
|
|
335
|
+
if (p.acervo && (p.acervo.fotos || []).length) return p;
|
|
336
|
+
if (!ultimoSite || Date.now() - ultimoSite.quando > 60 * 60000) return p;
|
|
337
|
+
try {
|
|
338
|
+
const a = await acervoSite.colher({ url: ultimoSite.url, pedido: p.pedido || '', pasta: p.pasta, htmlInicial: ultimoSite.html,
|
|
339
|
+
buscar: identidade.buscar, baixar: assets.baixar });
|
|
340
|
+
projeto.salvar(p.id, { acervo: { fotos: a.fotos, videos: a.videos, fatos: a.fatos, site: ultimoSite.url }, ...(p.marca ? {} : { marca: ultimoSite.marca }) });
|
|
341
|
+
projeto.anotar(p.id, 'midia', `acervo do site: ${a.fotos.length} fotos, ${a.videos.length} vídeos`);
|
|
342
|
+
} catch { /* segue sem acervo */ }
|
|
343
|
+
return projeto.ler(p.id);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/* O ROTEIRISTA do servidor: quando o modelo não manda um roteiro que preste
|
|
347
|
+
(nenhum, ou texto corrido), o pedido e os fatos da marca viram o roteiro
|
|
348
|
+
numa chamada só, com uma tarefa só. */
|
|
349
|
+
|
|
350
|
+
async function roteiroDoServidor(p, args) {
|
|
351
|
+
const cfg = require('../../config/config').loadConfig();
|
|
352
|
+
const api = require('../../provider/api');
|
|
353
|
+
const pedido = [p.pedido, args.pedido].filter(Boolean).join(' — ');
|
|
354
|
+
const seg = Number(args.segundos) || Number((pedido.match(/(\d{2,3})\s*(s\b|seg)/i) || [])[1]) || 30;
|
|
355
|
+
const acervo = p.acervo || {};
|
|
356
|
+
const r = await api.request(cfg.server, '/api/roteiro', {
|
|
357
|
+
pedido, segundos: seg,
|
|
358
|
+
fatos: (acervo.fatos || []).map((f) => f.texto).join('\n\n').slice(0, 5000),
|
|
359
|
+
fotos: (acervo.fotos || []).length ? `${acervo.fotos.length} fotos reais` : '',
|
|
360
|
+
site: acervo.site ? new URL(acervo.site).hostname.replace(/^www\./, '') : '',
|
|
361
|
+
rascunho: typeof args.roteiro === 'string' ? args.roteiro : '',
|
|
362
|
+
// Pedido de motion nunca vira impacto, nem sendo anúncio.
|
|
363
|
+
estilo: args.estilo || (escolherEstilo({ pedido }) === 'impacto' ? 'impacto' : undefined),
|
|
364
|
+
}, cfg.token);
|
|
365
|
+
if (!r || !r.ok) return { ok: false, error: (r && r.erro) || 'o roteirista não respondeu.' };
|
|
366
|
+
return { ok: true, roteiro: { ...r.roteiro, marca: marcaKit.preencher((args.roteiro && args.roteiro.marca) || p.marca || undefined, { pastas: [p.pasta, process.cwd()] }) } };
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
async function ferramentaPlano(args) {
|
|
370
|
+
let p = projeto.ler(args.id);
|
|
371
|
+
// Só quando o id FALTOU: id errado continua sendo erro, para não escrever no projeto errado.
|
|
372
|
+
if (!p && (args.id == null || String(args.id).trim() === '') && (args.roteiro || args.plano || args.cenas)) {
|
|
373
|
+
const recente = projetoRecente();
|
|
374
|
+
if (recente) { args = { ...args, id: recente.id }; p = recente; }
|
|
375
|
+
}
|
|
376
|
+
if (!p) return semProjeto(args.id);
|
|
377
|
+
|
|
378
|
+
/* Roteiro que não serve (texto corrido, JSON quebrado, tipo inventado) ou
|
|
379
|
+
nenhum, num projeto ainda sem plano: o roteirista escreve. */
|
|
380
|
+
const valido = args.roteiro ? roteiroValido(args.roteiro) : null;
|
|
381
|
+
if (!args.plano && !args.cenas && !args.voltarPara && !valido && (args.roteiro || !projeto.lerPlano(args.id))) {
|
|
382
|
+
p = await garantirAcervo(p);
|
|
383
|
+
const escrito = await roteiroDoServidor(p, args);
|
|
384
|
+
if (!escrito.ok) return escrito;
|
|
385
|
+
args = { ...args, roteiro: escrito.roteiro };
|
|
386
|
+
projeto.anotar(p.id, 'plano', `roteiro escrito pelo roteirista: ${escrito.roteiro.partes.length} partes`);
|
|
387
|
+
} else if (valido) {
|
|
388
|
+
args = { ...args, roteiro: valido };
|
|
389
|
+
p = await garantirAcervo(p);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
if (args.voltarPara) return projeto.voltarPara(args.id, args.voltarPara);
|
|
393
|
+
|
|
394
|
+
if (!args.plano && !args.cenas && !args.roteiro) {
|
|
395
|
+
const atual = projeto.lerPlano(args.id);
|
|
396
|
+
if (!atual) return { ok: false, error: 'este projeto ainda não tem plano — mande um.' };
|
|
397
|
+
return { ok: true, plano: atual, resumo: plano.resumo(atual) };
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/* O ROTEIRO: o modelo diz o que cada parte é e o que ela diz, e o código
|
|
401
|
+
faz o resto — layout, voz com entonação, ícones, imagens, música e
|
|
402
|
+
sons (lib/plugin/estudio/composicao.js). É o caminho para qualquer modelo
|
|
403
|
+
entregar motion e slides que prestam. */
|
|
404
|
+
if (args.roteiro) {
|
|
405
|
+
/* O roteiro como a pessoa (ou o modelo) mandou: o híbrido traduz as
|
|
406
|
+
partes para o cinema no caminho, e o que fica guardado tem de ser o
|
|
407
|
+
original — senão o próximo ajuste parte do traduzido. */
|
|
408
|
+
let original = null;
|
|
409
|
+
try { original = JSON.parse(typeof args.roteiro === 'string' ? args.roteiro : JSON.stringify(args.roteiro)); } catch { original = args.roteiro; }
|
|
410
|
+
const r = await prepararRoteiro(p, args);
|
|
411
|
+
if (!r.ok) return r;
|
|
412
|
+
/* SEM NARRAÇÃO: o som sobe de papel — um efeito leve em cada corte e em
|
|
413
|
+
cada entrada marcante, variando (sem-narracao.js, sons-leves.js). */
|
|
414
|
+
if (args.__semNarracao) {
|
|
415
|
+
const n = semNarracao.sonorizarPlano(r, { tempos: args.__semNarracao.tempos, cues: args.__semNarracao.cues, sons: sonsLeves.preparar(p.pasta) });
|
|
416
|
+
if (r.resumo) r.resumo.semNarracao = true;
|
|
417
|
+
projeto.anotar(p.id, 'plano', `sem narração: ${n} efeitos leves nos cortes, entradas e micros`);
|
|
418
|
+
} else if (args.__barulhinhos && r.plano) {
|
|
419
|
+
// Com voz: os micros e os sons pedidos pela cena, baixinho por baixo da fala.
|
|
420
|
+
const n = semNarracao.sonorizarPlano(r, { tempos: args.__barulhinhos.tempos, cues: args.__barulhinhos.cues, sons: sonsLeves.preparar(p.pasta), comVoz: true });
|
|
421
|
+
if (n) projeto.anotar(p.id, 'plano', `barulhinhos: ${n} micros por baixo da fala`);
|
|
422
|
+
}
|
|
423
|
+
const ic = await variarIcones(r.plano, original);
|
|
424
|
+
if (ic.trocados) projeto.anotar(p.id, 'icones', `coleção ${ic.colecao}: ${ic.trocados} ícones`);
|
|
425
|
+
let conferida = plano.conferir(r.plano, { pasta: p.pasta });
|
|
426
|
+
/* A rede de segurança: o elemento que não passa sai, e o vídeo segue.
|
|
427
|
+
Um defeito num ícone não pode custar o vídeo inteiro. */
|
|
428
|
+
if (!conferida.ok) {
|
|
429
|
+
projeto.anotar(p.id, 'defeito', `plano do roteiro reprovou: ${conferida.problemas.slice(0, 4).map((x) => x.onde + ' ' + x.oque).join(' | ')}`);
|
|
430
|
+
const ruins = new Set(conferida.problemas.map((x) => (String(x.onde).match(/^cenas\[(\d+)\]\.elementos\[(\d+)\]/) || []).slice(1, 3).join(':')).filter((k) => k.includes(':')));
|
|
431
|
+
r.plano.cenas.forEach((c, i) => { c.elementos = c.elementos.filter((_, j) => !ruins.has(`${i}:${j}`)); });
|
|
432
|
+
conferida = plano.conferir(r.plano, { pasta: p.pasta });
|
|
433
|
+
}
|
|
434
|
+
if (!conferida.ok) {
|
|
435
|
+
return { ok: false, error: 'o roteiro virou um plano com problemas (defeito do PrimoCode, não seu).', problemas: conferida.problemas.slice(0, 12) };
|
|
436
|
+
}
|
|
437
|
+
projeto.salvarPlano(args.id, r.plano, args.motivo || 'montado do roteiro');
|
|
438
|
+
// O roteiro fica guardado: ajustar uma frase é mandar o roteiro de novo, não reescrever tudo.
|
|
439
|
+
try { fs.writeFileSync(path.join(p.pasta, 'roteiro.json'), JSON.stringify(original || args.roteiro, null, 2)); } catch { /* segue */ }
|
|
440
|
+
projeto.salvar(args.id, { duracao: conferida.duracao });
|
|
441
|
+
/* A memória da estrutura (diretor.cardapioEstruturas): o próximo roteiro
|
|
442
|
+
vê o que este usou. Uma vez por projeto — mandar o roteiro de novo
|
|
443
|
+
para ajustar uma frase não é um vídeo novo. */
|
|
444
|
+
if (!p.estrutura) {
|
|
445
|
+
const usada = diretor.registrarEstrutura(original || args.roteiro);
|
|
446
|
+
projeto.salvar(args.id, { estrutura: usada.estrutura || '-' });
|
|
447
|
+
}
|
|
448
|
+
const quebradas = args.__cenasQuebradas || [];
|
|
449
|
+
/* NENHUMA CENA ESCRITA (14/10, a padaria da 10.11.0 saiu toda no
|
|
450
|
+
gerativo): a regra morava só na skill, e regra escrita não é regra
|
|
451
|
+
obedecida. O plano volta com o cardápio na mão — a IA ainda decide. */
|
|
452
|
+
const pts = Array.isArray(original) ? original : (original && original.partes) || [];
|
|
453
|
+
const nenhuma = pts.length > 1 && !pts.some((pt) => pt && pt.componente) && !quebradas.length;
|
|
454
|
+
return {
|
|
455
|
+
ok: true, duracao: conferida.duracao, ...r.resumo, resumo: plano.resumo(r.plano),
|
|
456
|
+
...(quebradas.length ? { cenasQuebradas: quebradas } : {}),
|
|
457
|
+
...(nenhuma ? { nenhumaCenaEscrita: {
|
|
458
|
+
aviso: 'Todas as partes caíram no gerativo automático. Para motion de verdade, escreva ao menos uma cena (componente), partindo de um destes efeitos (estudio_midia usar-efeito) se servir, e mande o roteiro de novo. Cada parte pode pedir som: sons:[{t, som}] (pop, mouse, tique, digital, swoosh, sub, ponto1..ponto5). Se o automático é o que você quer, siga para o render.',
|
|
459
|
+
efeitos: efeitos.cardapio().slice(0, 6),
|
|
460
|
+
} } : {}),
|
|
461
|
+
proximo: quebradas.length
|
|
462
|
+
? `${quebradas.length} cena(s) sua(s) não compilaram e ficaram no gerativo: conserte o arquivo (o erro está em cenasQuebradas) e mande o roteiro de novo antes do render.`
|
|
463
|
+
: 'estudio_render com este id. Para ajustar, mande o roteiro de novo (é rápido) — não edite as cenas à mão.',
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Um plano inteiro, ou só as cenas (que é o caso comum).
|
|
468
|
+
let novo = args.plano || { formato: args.formato, cenas: args.cenas, audio: args.audio };
|
|
469
|
+
|
|
470
|
+
/* Ajuste de UMA cena, sem reescrever o resto.
|
|
471
|
+
*
|
|
472
|
+
* É o caminho de "não gostei da parte do cartão": reescrever o plano
|
|
473
|
+
* inteiro para mexer numa cena é como o vídeo antigo mudava de cara
|
|
474
|
+
* sozinho a cada correção. */
|
|
475
|
+
if (args.cena != null) {
|
|
476
|
+
const atual = projeto.lerPlano(args.id);
|
|
477
|
+
if (!atual) return { ok: false, error: 'não há plano para ajustar.' };
|
|
478
|
+
const i = Number(args.cena) - 1;
|
|
479
|
+
if (!(i >= 0 && i < atual.cenas.length)) {
|
|
480
|
+
return { ok: false, error: `a cena ${args.cena} não existe (são ${atual.cenas.length}).` };
|
|
481
|
+
}
|
|
482
|
+
atual.cenas[i] = args.plano || args.novaCena || atual.cenas[i];
|
|
483
|
+
novo = atual;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const conferida = plano.conferir(novo, { pasta: p.pasta });
|
|
487
|
+
if (!conferida.ok) {
|
|
488
|
+
return {
|
|
489
|
+
ok: false,
|
|
490
|
+
error: 'o plano tem problemas que quebrariam o render — conserte e mande de novo.',
|
|
491
|
+
problemas: conferida.problemas.slice(0, 12),
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
projeto.salvarPlano(args.id, novo, args.motivo || '');
|
|
496
|
+
projeto.salvar(args.id, { duracao: conferida.duracao });
|
|
497
|
+
return {
|
|
498
|
+
ok: true, duracao: conferida.duracao, resumo: plano.resumo(novo),
|
|
499
|
+
proximo: 'estudio_render quando estiver pronto.',
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// ── estudio_midia ────────────────────────────────────────────────────────
|
|
504
|
+
|
|
505
|
+
async function ferramentaMidia(args) {
|
|
506
|
+
const acao = String(args.acao || 'imagem').toLowerCase();
|
|
507
|
+
const p = args.id ? projeto.ler(args.id) : null;
|
|
508
|
+
if (args.id && !p) return semProjeto(args.id);
|
|
509
|
+
|
|
510
|
+
if (acao === 'projetos') return require('./projetos.js').procurar({ termo: args.termo, categoria: args.categoria, limite: args.limite });
|
|
511
|
+
if (acao === 'projeto') return require('./projetos.js').ver(args.nome || args.id_item || args.termo, { c: await require('../../config/limites.js').situacao() });
|
|
512
|
+
|
|
513
|
+
if (acao === 'fontes') {
|
|
514
|
+
if (args.conferir) return assets.conferirFonte(args.conferir);
|
|
515
|
+
return { ok: true, fontes: assets.FONTES, biblioteca: biblioteca.cardapio(),
|
|
516
|
+
nota: 'qualquer família do Google Fonts funciona — esta lista é para não repetir sempre as mesmas.' };
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/* Recortar o fundo. O pedido pede "buscar PNGs na internet, remover fundo
|
|
520
|
+
e inserir" — e sem isto o agente colava a foto com o retângulo branco
|
|
521
|
+
dela por cima do fundo da cena, que é o cara-de-recorte que denuncia
|
|
522
|
+
vídeo feito às pressas. O recorte real é modelo de segmentação (rembg);
|
|
523
|
+
sem ele na máquina, sobra o corte por cor, que só serve em fundo
|
|
524
|
+
chapado — e a resposta diz qual dos dois foi usado. */
|
|
525
|
+
if (acao === 'semfundo' || acao === 'sem-fundo' || acao === 'recortar') {
|
|
526
|
+
const alvo = args.arquivo || args.src;
|
|
527
|
+
if (!alvo) return { ok: false, error: 'diga o arquivo (arquivo) da imagem a recortar.' };
|
|
528
|
+
const cheio = p ? path.resolve(p.pasta, alvo) : path.resolve(alvo);
|
|
529
|
+
const r = await acervo.tirarFundo(cheio, { cor: args.cor, tolerancia: args.tolerancia });
|
|
530
|
+
if (!r.ok) return r;
|
|
531
|
+
const relativo = p ? path.relative(p.pasta, r.arquivo).replace(/\\/g, '/') : r.arquivo;
|
|
532
|
+
if (p) projeto.anotar(p.id, 'midia', `recortou o fundo de ${alvo} (${r.metodo})`);
|
|
533
|
+
return { ok: true, src: relativo, metodo: r.metodo, aviso: r.aviso || undefined };
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/* O print de verdade do site (print-site.js), para a peça 3D `printsite`.
|
|
537
|
+
Só roda quando o modelo pede: o cardápio diz quando vale. */
|
|
538
|
+
if (acao === 'print') {
|
|
539
|
+
if (!p) return { ok: false, error: 'para tirar o print é preciso dizer em qual projeto (id).' };
|
|
540
|
+
const r = await printSite.capturarSite(args.url || args.site || args.termo, { pasta: p.pasta, celular: !!args.celular, inteira: args.inteira !== false });
|
|
541
|
+
if (r.ok) projeto.anotar(p.id, 'midia', `print de ${r.url} (${r.tela}): ${r.src}`);
|
|
542
|
+
return r;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/* O ELEMENTO do site, tirado pelo código (print-site.js): a lista das peças
|
|
546
|
+
(logo, botão, cartão, título…) e uma peça sozinha, com o fundo transparente. */
|
|
547
|
+
/* A REFERÊNCIA VISUAL que a pessoa manda (13/10: "não usa as referências
|
|
548
|
+
que mandei" — era o print da landing, arrastado no pedido). O agente não
|
|
549
|
+
enxerga imagem; aqui ela entra no projeto, as cores saem pelo ffmpeg e,
|
|
550
|
+
se o projeto ainda não tem marca, viram a marca. Com site, o site manda. */
|
|
551
|
+
if (acao === 'referencia' || acao === 'referência') {
|
|
552
|
+
if (!p) return semProjeto(args.id);
|
|
553
|
+
return importarReferencia(p, String(args.arquivo || args.caminho || args.src || ''));
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
if (acao === 'elementos') return printSite.elementosDoSite(args.url || args.site || args.termo, { celular: !!args.celular });
|
|
557
|
+
if (acao === 'elemento') {
|
|
558
|
+
if (!p) return { ok: false, error: 'para tirar o elemento é preciso dizer em qual projeto (id).' };
|
|
559
|
+
const r = await printSite.capturarElemento(args.url || args.site, { pasta: p.pasta, seletor: args.seletor, texto: args.texto || args.termo,
|
|
560
|
+
celular: !!args.celular, transparente: args.transparente !== false, margem: args.margem });
|
|
561
|
+
if (r.ok) projeto.anotar(p.id, 'midia', `elemento de ${r.url} (${args.seletor || args.texto || args.termo}): ${r.src}`);
|
|
562
|
+
return r;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// O catálogo de efeitos que a IA escreveu (efeitos.js): guardar, listar, reusar.
|
|
566
|
+
if (acao === 'efeitos') return { ok: true, efeitos: efeitos.cardapio(),
|
|
567
|
+
// A lista de técnicas mora aqui, e não na skill: a skill vai em todo pedido de vídeo e o teto é curto.
|
|
568
|
+
tecnicas: 'cor (ondas que inundam, paleta que vira na batida) · luz (faixa no título, bloom que respira, feixes, partículas) · física (antecipa, cai com peso, amassa no pouso, rebote; spring com massa, nunca linear) · 3D (perspective + rotateX: entra deitado e levanta, sombra no chão, câmera que orbita) · tipografia (letras que se montam, peso que pulsa, máscara que revela). Vídeo sobre site: tire a peça que conta a história com estudio_site elemento (PNG sem fundo) e anime ELA — peca-impacto-3d é ponto de partida, não molde.' };
|
|
569
|
+
if (acao === 'guardar-efeito' || acao === 'usar-efeito') {
|
|
570
|
+
if (!p) return { ok: false, error: 'diga em qual projeto (id).' };
|
|
571
|
+
const r = acao === 'guardar-efeito'
|
|
572
|
+
? efeitos.guardar({ pasta: p.pasta, arquivo: args.arquivo || args.src, nome: args.nome, descricao: args.descricao, tags: args.tags })
|
|
573
|
+
: efeitos.reusar({ pasta: p.pasta, nome: args.nome });
|
|
574
|
+
if (r.ok) projeto.anotar(p.id, 'midia', `${acao === 'guardar-efeito' ? 'guardou' : 'reusou'} o efeito ${r.nome || args.nome}`);
|
|
575
|
+
return r;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
if (acao === 'logo') {
|
|
579
|
+
if (!p) return { ok: false, error: 'para baixar a logo é preciso dizer em qual projeto (id).' };
|
|
580
|
+
const nome = String(args.marca || args.nome || args.termo || '').trim();
|
|
581
|
+
if (!nome) return { ok: false, error: 'diga a marca (marca).' };
|
|
582
|
+
let html = '';
|
|
583
|
+
let site = String(args.site || args.url || '').trim();
|
|
584
|
+
if (!site) {
|
|
585
|
+
const achado = await identidade.acharSite(nome);
|
|
586
|
+
if (achado.ok) site = achado.url;
|
|
587
|
+
}
|
|
588
|
+
if (site) {
|
|
589
|
+
if (!/^https?:\/\//i.test(site)) site = 'https://' + site;
|
|
590
|
+
html = (await require('../../referencia.js').pegar(site, { timeout: 15000 })) || '';
|
|
591
|
+
}
|
|
592
|
+
const r = await identidade.pegarLogo(html, site || 'https://exemplo.invalido', { pasta: p.pasta, nome });
|
|
593
|
+
if (r.ok) projeto.anotar(p.id, 'midia', `logo de ${nome}: ${r.src} (${r.achadaEm})`);
|
|
594
|
+
return r;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/* A BIBLIOTECA (colecao.js, 11/10): o cardápio inteiro, o ícone 3D e a
|
|
598
|
+
animação pronta. Procurar não usa rede (o índice mora no pacote); com
|
|
599
|
+
id, baixa para o projeto e devolve o elemento pronto. */
|
|
600
|
+
/* OS MOVIMENTOS (movimentos.js, 12/10): 100+ entradas, saídas, ênfases e loops com nome. */
|
|
601
|
+
if (acao === 'movimentos' || acao === 'movimento') {
|
|
602
|
+
return movimentos.procurar({ termo: args.termo, categoria: args.categoria, limite: Number(args.limite) || 30 });
|
|
603
|
+
}
|
|
604
|
+
/* OS CENÁRIOS (cenarios.js, 12/10): os lugares prontos + os que a IA criou
|
|
605
|
+
e a pessoa deixou guardar. Salvar só com o sim dela (autorizado:true). */
|
|
606
|
+
if (acao === 'cenarios' || acao === 'cenários') {
|
|
607
|
+
return { ok: true, prontos: Object.keys(mundo.LUGARES), salvos: cenarios.listar(),
|
|
608
|
+
comoCriar: 'na cena do estilo personagem: lugar (um pronto como base), ceu [cor de cima, cor do horizonte], chao {tipo, cor, cor2}, parede, luz, acento, hora e elementos. Ficou bom? Pergunte se pode salvar e use acao:"salvar_cenario".' };
|
|
609
|
+
}
|
|
610
|
+
if (acao === 'salvar_cenario' || acao === 'salvar_cenário') {
|
|
611
|
+
return cenarios.salvar({ nome: args.nome, cenario: args.cenario, autorizado: args.autorizado, bases: Object.keys(mundo.LUGARES) });
|
|
612
|
+
}
|
|
613
|
+
/* OS ESTILOS (estilos.js, 14/10): as peças do gerativo como cardápio — a IA
|
|
614
|
+
monta, mistura e cria; guardar só com o sim da pessoa. */
|
|
615
|
+
if (acao === 'estilos' || acao === 'estilo') return estilos.cardapio();
|
|
616
|
+
if (acao === 'salvar_estilo') return estilos.salvar({ nome: args.nome, pecas: args.pecas || args.estilo, descricao: args.descricao, autorizado: args.autorizado });
|
|
617
|
+
if (acao === 'biblioteca' || acao === 'cardapio' || acao === 'cardápio') return colecao.cardapio();
|
|
618
|
+
if (acao === 'icones3d' || acao === 'icone3d' || acao === 'animacoes' || acao === 'animacao' || acao === 'animação' || acao === 'animações') {
|
|
619
|
+
const ehAnim = /^anima/.test(acao);
|
|
620
|
+
if (args.id_item || /^(fluent3d|noto):/.test(String(args.item || args.baixar || ''))) {
|
|
621
|
+
const pj = p ? projeto.ler(p.id) : null;
|
|
622
|
+
const fmt = (pj && pj.formato) || {};
|
|
623
|
+
const r = await colecao.baixar(args.id_item || args.item || args.baixar, { pasta: p ? p.pasta : null, largura: fmt.largura || 1920, altura: fmt.altura || 1080 });
|
|
624
|
+
if (r.ok && p) projeto.anotar(p.id, 'midia', `biblioteca: ${r.src} (${r.licenca})`);
|
|
625
|
+
return r;
|
|
626
|
+
}
|
|
627
|
+
return ehAnim ? colecao.procurarAnimacoes(args.termo || args.busca || '', { quantas: Number(args.quantas) || 10 })
|
|
628
|
+
: colecao.procurarIcones3d(args.termo || args.busca || '', { quantas: Number(args.quantas) || 10 });
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
if (acao === 'icones' || acao === 'icone') {
|
|
632
|
+
if (args.nome) {
|
|
633
|
+
const r = await assets.icone(args.nome, { pasta: p ? p.pasta : null });
|
|
634
|
+
return r.ok ? { ok: true, nome: args.nome, baixado: true } : r;
|
|
635
|
+
}
|
|
636
|
+
return assets.procurarIcones(args.termo || args.busca || '');
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
if (acao === 'som' || acao === 'audio' || acao === 'trilha' || acao === 'efeito') {
|
|
640
|
+
const busca = await assets.procurarSom(args.termo || '', {
|
|
641
|
+
quantas: Number(args.quantas) || 8,
|
|
642
|
+
duracaoMin: acao === 'trilha' ? 30 : 0,
|
|
643
|
+
duracaoMax: acao === 'efeito' ? 6 : 0,
|
|
644
|
+
});
|
|
645
|
+
if (!busca.ok || !args.baixar) return busca;
|
|
646
|
+
return baixarEscolhido(busca.sons, args, p);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
const busca = await assets.procurarImagens(args.termo || '', {
|
|
650
|
+
quantas: Number(args.quantas) || 8,
|
|
651
|
+
transparente: !!args.transparente,
|
|
652
|
+
});
|
|
653
|
+
if (!busca.ok || !args.baixar) return busca;
|
|
654
|
+
return baixarEscolhido(busca.imagens, args, p);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
async function baixarEscolhido(lista, args, p) {
|
|
658
|
+
if (!p) return { ok: false, error: 'para baixar é preciso dizer em qual projeto (id).' };
|
|
659
|
+
const i = Number(args.baixar) === true ? 0 : Math.max(0, Number(args.baixar) - 1 || 0);
|
|
660
|
+
const item = lista[i];
|
|
661
|
+
if (!item) return { ok: false, error: `não há o item ${args.baixar} nessa busca.` };
|
|
662
|
+
const r = await assets.baixar(item, { pasta: p.pasta, nome: args.nome });
|
|
663
|
+
if (r.ok) {
|
|
664
|
+
projeto.anotar(p.id, 'midia', `baixou "${item.titulo}" (${item.licenca || 'sem licença declarada'})`);
|
|
665
|
+
}
|
|
666
|
+
return { ...r, creditos: item.creditos || null,
|
|
667
|
+
comoUsar: r.ok ? `no plano: "src": "${r.relativo}"` : undefined };
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// ── estudio_ae ───────────────────────────────────────────────────────────
|
|
671
|
+
|
|
672
|
+
/** O motor After Effects: roda o JSX do agente na pasta do projeto e devolve o mp4 e os quadros. */
|
|
673
|
+
async function ferramentaAE(args) {
|
|
674
|
+
const p = args.id ? projeto.ler(args.id) : null;
|
|
675
|
+
if (!args.id || !p) return semProjeto(args.id);
|
|
676
|
+
if (!args.script || !args.comp) return { ok: false, error: 'estudio_ae pede script (o JSX) e comp (o nome da composição).' };
|
|
677
|
+
return require('./cota.js').comCota(() => renderAE(args, p));
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
async function renderAE(args, p) {
|
|
681
|
+
const kitM = marcaKit.preencher(null, { pastas: [p.pasta, process.cwd()] });
|
|
682
|
+
const fontesKit = kitM && kitM.kit ? [kitM.fontes && kitM.fontes.titulo, kitM.fontes && kitM.fontes.texto].filter(Boolean) : [];
|
|
683
|
+
const r = await require('./effectcraft.js').renderizar({
|
|
684
|
+
pasta: p.pasta, script: String(args.script), comp: String(args.comp),
|
|
685
|
+
fontes: [...new Set([...(Array.isArray(args.fontes) ? args.fontes : []), ...fontesKit])], audio: args.audio || undefined,
|
|
686
|
+
conferir: Array.isArray(args.conferir) ? args.conferir : [],
|
|
687
|
+
});
|
|
688
|
+
if (!r.ok) return r;
|
|
689
|
+
const daMarca = kitM && kitM.kit ? { marca: { nome: kitM.nome, cores: kitM.cores, fontes: kitM.fontes, logo: kitM.logo } } : {};
|
|
690
|
+
return { ...r, ...daMarca, nota: 'Olhe os quadros (arquivos em ae/) antes de dar por pronto; ajuste o JSX e rode de novo se algo estiver torto.' };
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
// ── estudio_motion ───────────────────────────────────────────────────────
|
|
694
|
+
|
|
695
|
+
/** O pacote pra postar (exportar.js) + a galeria; nunca derruba o vídeo. `entrega:false` desliga. */
|
|
696
|
+
function entregar(args, p, r) {
|
|
697
|
+
const x = r._exportar || {}; delete r._exportar;
|
|
698
|
+
if (args.entrega === false) return;
|
|
699
|
+
try {
|
|
700
|
+
const E = require('./exportar.js');
|
|
701
|
+
const e = E.exportar({ video: r.video, pasta: p.pasta, assunto: args.assunto, formatos: args.formatos, cenas: x.cenas, palavras: x.palavras, trilha: r.trilha && { ...r.trilha, arquivo: x.trilhaArquivo }, sfx: x.sfx });
|
|
702
|
+
if (e.ok) {
|
|
703
|
+
r.entrega = { pasta: e.dir, arquivos: e.arquivos.map((f) => path.basename(f)), creditos: e.creditos, ...(e.avisos ? { avisos: e.avisos } : {}) };
|
|
704
|
+
E.registrar({ id: p.id, assunto: args.assunto, caminho: r.video, formato: r.formato, duracao: r.duracao, assinatura: r.assinatura, entrega: e.dir });
|
|
705
|
+
} else r.entrega = { erro: e.error };
|
|
706
|
+
} catch (err) { r.entrega = { erro: err.message }; }
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/** A máquina de motion: assunto + cenas em JSON viram o mp4 (maquina.js), com sons, trilha e voz opcionais. */
|
|
710
|
+
async function ferramentaMotion(args) {
|
|
711
|
+
const p = args.id ? projeto.ler(args.id) : null;
|
|
712
|
+
if (!args.id || !p) return semProjeto(args.id);
|
|
713
|
+
let receita = null;
|
|
714
|
+
if (args.receita) {
|
|
715
|
+
const r = require('./projetos.js').ver(args.receita, { c: await require('../../config/limites.js').situacao() });
|
|
716
|
+
if (!r.ok) return r;
|
|
717
|
+
// Grátis vê o resumo da receita, não monta a partir dela: diz o porquê em vez de renderizar pela metade.
|
|
718
|
+
if (r.bloqueado) return { ok: false, error: r.aviso, projeto: r.projeto };
|
|
719
|
+
receita = r.projeto;
|
|
720
|
+
}
|
|
721
|
+
// primeiro motion: aprende o gosto antes de renderizar (a pessoa pode fechar ou pular; o render segue de qualquer jeito)
|
|
722
|
+
// no terminal abre o navegador; no app (desktop ou Primo.app, -p com PRIMOCODE_APP=1) o app abre a tela pela linha de protocolo
|
|
723
|
+
try { await require('./gosto.js').antesDoMotion(args); } catch { /* sem tela, segue */ }
|
|
724
|
+
return require('./cota.js').comCota(() => renderMotion(args, p, receita));
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
async function renderMotion(args, p, receita) {
|
|
728
|
+
const narrar = async (texto, mp3, voz) => rodarPython('narrar.py', ['falar', '--texto', texto, '--saida', mp3, '--voz', String(voz || 'francisca')], { timeout: 5 * 60000 });
|
|
729
|
+
// Kit de marca ativo: cores, fontes e logo entram onde o JSON não disse; o logo vai no CTA (última cena).
|
|
730
|
+
const kitM = marcaKit.preencher(args.marca, { pastas: [p.pasta, process.cwd()] });
|
|
731
|
+
if (kitM && kitM.kit) {
|
|
732
|
+
args = { ...args, marca: kitM };
|
|
733
|
+
if (kitM.logo && Array.isArray(args.cenas) && args.cenas.length) {
|
|
734
|
+
args.cenas = args.cenas.map((c, i) => (i === args.cenas.length - 1 && c && !c.logo ? { ...c, logo: kitM.logo } : c));
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
// As fotos do pedido: as que a IA passou em `fotos` e as que o terminal achou no texto do pedido (referencias.imagens()).
|
|
738
|
+
// Antes só o prepararRoteiro (Remotion) as lia: no motion elas viravam "referência" e nenhuma peça aceitava foto.
|
|
739
|
+
const doPedido = referencias.imagens();
|
|
740
|
+
const dadas = Array.isArray(args.fotos) ? args.fotos : (args.fotos ? [args.fotos] : []);
|
|
741
|
+
const todas = [...new Set([...dadas, ...doPedido])];
|
|
742
|
+
if (todas.length) args = { ...args, fotos: todas, ...(dadas.length ? {} : { fotosImplicitas: true }) };
|
|
743
|
+
const r = await require('./maquina.js').motion(args, { pasta: p.pasta, receita, deps: { narrar } });
|
|
744
|
+
if (r.ok) projeto.anotar(p.id, 'motion', `${r.duracao}s, ${r.cenas.length} cenas, ${r.lufs} LUFS`);
|
|
745
|
+
if (r.ok) entregar(args, p, r);
|
|
746
|
+
if (!r.ok) return r;
|
|
747
|
+
const gostoResumo = (() => { try { const G = require('./gosto.js'); return G.resumo(G.ler()); } catch { return ''; } })();
|
|
748
|
+
return { ...r, ...(gostoResumo ? { gosto: gostoResumo } : {}), nota: 'Abra os quadros (png em ae/) para conferir. Se algo ficou torto, mude o JSON e rode de novo.' };
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
// ── estudio_criar ────────────────────────────────────────────────────────
|
|
752
|
+
|
|
753
|
+
/** A porta simples (criar.js): escolhe a receita e chama as ferramentas de cima. `ctx.progresso(pct, etapa)` alimenta o item da tela. */
|
|
754
|
+
async function ferramentaCriar(args, ctx = {}) {
|
|
755
|
+
return require('./criar.js').criar(args, {
|
|
756
|
+
projeto,
|
|
757
|
+
plano: (a) => ferramentaPlano({ ...a, __pasta: ctx.projectDir }),
|
|
758
|
+
motion: (a) => ferramentaMotion(a),
|
|
759
|
+
render: (a) => ferramentaRender({ ...a, __pasta: ctx.projectDir }, ctx),
|
|
760
|
+
progresso: ctx.progresso,
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
// ── estudio_editar ───────────────────────────────────────────────────────
|
|
765
|
+
|
|
766
|
+
/** O editor por comando: reabre o plano da máquina de motion, aplica as mudanças e guarda a versão (editor.js). */
|
|
767
|
+
async function ferramentaEditar(args) {
|
|
768
|
+
const id = args.id_video || args.id;
|
|
769
|
+
const p = id ? projeto.ler(id) : null;
|
|
770
|
+
if (!p) return semProjeto(id);
|
|
771
|
+
const r = await require('./editor.js').editar(args, { pasta: p.pasta });
|
|
772
|
+
if (r.ok && r.versao && !args.listar) projeto.anotar(p.id, 'editar', `v${r.versao}: ${(r.feitas || [r.nota || '']).join('; ').slice(0, 120)}`);
|
|
773
|
+
return r.ok && r.video ? { ...r, nota: r.nota || 'Mostre o vídeo. Se não era isso, mude de novo ou use voltar_para.' } : r;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
// ── estudio_narrar ───────────────────────────────────────────────────────
|
|
777
|
+
|
|
778
|
+
async function ferramentaNarrar(args) {
|
|
779
|
+
if (args.vozes) return rodarPython('narrar.py', ['vozes'], { timeout: 30000 });
|
|
780
|
+
|
|
781
|
+
const p = projetoOuRecente(args.id);
|
|
782
|
+
if (!p) return semProjeto(args.id);
|
|
783
|
+
if (args.id == null || String(args.id).trim() === '') args = { ...args, id: p.id };
|
|
784
|
+
const texto = String(args.texto || '').trim();
|
|
785
|
+
if (!texto) return { ok: false, error: 'não há texto para narrar.' };
|
|
786
|
+
|
|
787
|
+
const saida = path.join(p.pasta, 'midia', `narracao-${Date.now().toString(36)}.mp3`);
|
|
788
|
+
fs.mkdirSync(path.dirname(saida), { recursive: true });
|
|
789
|
+
|
|
790
|
+
const r = await rodarPython('narrar.py', [
|
|
791
|
+
'falar', '--texto', texto, '--saida', saida,
|
|
792
|
+
'--voz', String(args.voz || 'antonio'),
|
|
793
|
+
'--estilo', String(args.estilo || 'normal'),
|
|
794
|
+
...(args.ritmo ? ['--ritmo', String(args.ritmo)] : []),
|
|
795
|
+
...(args.tom ? ['--tom', String(args.tom)] : []),
|
|
796
|
+
], { timeout: 5 * 60000 });
|
|
797
|
+
|
|
798
|
+
if (!r.ok) return r;
|
|
799
|
+
const relativo = path.relative(p.pasta, saida).replace(/\\/g, '/');
|
|
800
|
+
projeto.anotar(p.id, 'narracao', `${r.segundos}s na voz ${args.voz || 'antonio'}`);
|
|
801
|
+
return {
|
|
802
|
+
...r, relativo,
|
|
803
|
+
comoUsar: `no plano: "audio": {"narracao": "${relativo}"}. `
|
|
804
|
+
+ 'Os tempos de "falas" são MEDIDOS — use-os para a duração de cada cena e para as legendas, '
|
|
805
|
+
+ 'em vez de estimar por número de palavras.',
|
|
806
|
+
};
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
// ── estudio_video ────────────────────────────────────────────────────────
|
|
810
|
+
|
|
811
|
+
async function ferramentaVideo(args, ctx = {}) {
|
|
812
|
+
const acao = String(args.acao || 'medir').toLowerCase();
|
|
813
|
+
const p = projetoOuRecente(args.id);
|
|
814
|
+
if (!p) return semProjeto(args.id);
|
|
815
|
+
if (args.id == null || String(args.id).trim() === '') args = { ...args, id: p.id };
|
|
816
|
+
|
|
817
|
+
const pronto = video.conferir();
|
|
818
|
+
if (!pronto.ok) return pronto;
|
|
819
|
+
|
|
820
|
+
const dentro = (rel) => {
|
|
821
|
+
const cheio = path.resolve(p.pasta, String(rel || ''));
|
|
822
|
+
return cheio.startsWith(path.resolve(p.pasta)) ? cheio : null;
|
|
823
|
+
};
|
|
824
|
+
|
|
825
|
+
if (acao === 'importar') {
|
|
826
|
+
// O vídeo da pessoa entra na pasta do projeto. Trabalhar a partir de
|
|
827
|
+
// onde ele está é o caminho para o agente escrever em cima do
|
|
828
|
+
// original — e o original dela não tem cópia.
|
|
829
|
+
const de = path.resolve(String(args.arquivo || '').replace(/^~(?=$|[/\\])/, os.homedir()));
|
|
830
|
+
if (!fs.existsSync(de)) return { ok: false, error: `não achei "${args.arquivo}".` };
|
|
831
|
+
const para = path.join(p.pasta, 'entrada', path.basename(de));
|
|
832
|
+
fs.copyFileSync(de, para);
|
|
833
|
+
const m = await video.medir(para);
|
|
834
|
+
projeto.anotar(p.id, 'entrada', `importou ${path.basename(de)} (${m.ok ? m.segundos + 's' : '?'})`);
|
|
835
|
+
return { ok: true, arquivo: path.relative(p.pasta, para).replace(/\\/g, '/'), medida: m };
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
const alvo = dentro(args.arquivo);
|
|
839
|
+
if (!alvo || !fs.existsSync(alvo)) {
|
|
840
|
+
return { ok: false, error: `"${args.arquivo}" não está na pasta do projeto. Use acao:"importar" antes.` };
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
if (acao === 'medir') return video.medir(alvo);
|
|
844
|
+
|
|
845
|
+
if (acao === 'silencio' || acao === 'pausas') {
|
|
846
|
+
const s = await video.silencios(alvo, { limiarDb: Number(args.limiarDb) || -40 });
|
|
847
|
+
if (!s.ok) return s;
|
|
848
|
+
const m = await video.medir(alvo);
|
|
849
|
+
return {
|
|
850
|
+
ok: true, silencios: s.silencios,
|
|
851
|
+
ficariam: video.trechosQueFicam(m.segundos, s.silencios, args),
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
if (acao === 'cortar-silencio' || acao === 'cortar') {
|
|
856
|
+
const saida = path.join(p.pasta, 'midia', `cortado-${Date.now().toString(36)}.mp4`);
|
|
857
|
+
const r = await video.cortarSilencio(alvo, saida, args);
|
|
858
|
+
if (r.ok && !r.semCorte) {
|
|
859
|
+
projeto.anotar(p.id, 'corte', `${r.antes}s → ${r.depois}s, ${r.cortes} cortes`);
|
|
860
|
+
r.relativo = path.relative(p.pasta, saida).replace(/\\/g, '/');
|
|
861
|
+
}
|
|
862
|
+
return r;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
if (acao === 'quadro') {
|
|
866
|
+
const saida = path.join(p.pasta, 'midia', `quadro-${Math.round(Number(args.segundo) || 0)}s.png`);
|
|
867
|
+
const r = await video.quadro(alvo, saida, Number(args.segundo) || 0);
|
|
868
|
+
if (r.ok) r.relativo = path.relative(p.pasta, saida).replace(/\\/g, '/');
|
|
869
|
+
return r;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
if (acao === 'legendas' || acao === 'transcrever') {
|
|
873
|
+
return transcrever(p, alvo, ctx);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/* A EDIÇÃO INTEIRA, em código (lib/plugin/estudio/edicao.js): corta o silêncio,
|
|
877
|
+
transcreve palavra por palavra e monta o plano — legenda animada,
|
|
878
|
+
ícones na hora da palavra, zoom de corte, pop e whoosh. É o caminho
|
|
879
|
+
para qualquer modelo entregar vídeo de videomaker: ele só chama isto e
|
|
880
|
+
renderiza. "Até uma batata faz vídeos assim." (25/09/2026) */
|
|
881
|
+
if (acao === 'editar' || acao === 'edicao' || acao === 'auto') {
|
|
882
|
+
let fonte = alvo;
|
|
883
|
+
let cortes = 0;
|
|
884
|
+
if (args.cortarSilencio !== false) {
|
|
885
|
+
const saida = path.join(p.pasta, 'midia', `cortado-${Date.now().toString(36)}.mp4`);
|
|
886
|
+
const c = await video.cortarSilencio(alvo, saida, args);
|
|
887
|
+
if (c.ok && !c.semCorte) { fonte = saida; cortes = c.cortes || 0; }
|
|
888
|
+
}
|
|
889
|
+
/* A VOZ NO VOLUME CERTO. A gravação de celular sai baixa (medido em
|
|
890
|
+
25/09: -37,6 dB de média no vídeo pronto, e "está sem som"). O
|
|
891
|
+
loudnorm leva a fala a -15 LUFS, o volume de vídeo de internet; o
|
|
892
|
+
vídeo em si não é recodificado. */
|
|
893
|
+
const normal = path.join(p.pasta, 'midia', `voz-normal-${Date.now().toString(36)}.mp4`);
|
|
894
|
+
const ln = await video.rodar(video.ffmpeg(), ['-y', '-i', fonte, '-c:v', 'copy',
|
|
895
|
+
'-af', 'loudnorm=I=-15:TP=-1.5:LRA=11', '-c:a', 'aac', '-b:a', '192k', normal], { timeout: 10 * 60000 });
|
|
896
|
+
if (ln.ok) fonte = normal;
|
|
897
|
+
|
|
898
|
+
const m = await video.medir(fonte);
|
|
899
|
+
if (!m.ok) return m;
|
|
900
|
+
|
|
901
|
+
const tr = await transcrever(p, fonte, ctx);
|
|
902
|
+
if (!tr.ok) return tr;
|
|
903
|
+
let palavras = tr.palavras || [];
|
|
904
|
+
// Servidor sem o tempo por palavra: reparte cada trecho pelas palavras
|
|
905
|
+
// dele. Sai menos preciso, mas a legenda continua animada.
|
|
906
|
+
if (!palavras.length) palavras = repartirTrechos(tr.trechos || []);
|
|
907
|
+
|
|
908
|
+
const candidatos = [...new Set(palavras.map((w) => edicao.iconeDe(w.texto)).filter(Boolean))];
|
|
909
|
+
const iconesOk = new Set();
|
|
910
|
+
for (const nome of candidatos) {
|
|
911
|
+
try { const r = await assets.icone(nome); if (r && (r.ok !== false)) iconesOk.add(nome); } catch { /* fica sem */ }
|
|
912
|
+
}
|
|
913
|
+
const sons = await edicao.prepararSons(p.pasta, video);
|
|
914
|
+
|
|
915
|
+
// As imagens de apoio: uma por termo, a primeira que baixar.
|
|
916
|
+
const imagens = {};
|
|
917
|
+
if ((args.estilo || 'viral') !== 'sem-apoio') {
|
|
918
|
+
const orientacao = m.largura >= m.altura ? 'landscape' : 'portrait';
|
|
919
|
+
for (const termo of edicao.termosDeApoio(palavras).slice(0, 8)) {
|
|
920
|
+
imagens[termo] = await baixarApoio(p, termo, { orientacao, video: true });
|
|
921
|
+
if (!imagens[termo]) delete imagens[termo];
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
// A música de fundo: uma trilha longa, de licença aberta.
|
|
926
|
+
let trilha = null;
|
|
927
|
+
if (args.musica !== false) {
|
|
928
|
+
try {
|
|
929
|
+
const b = await assets.procurarMusica(args.trilha || 'upbeat corporate', { quantas: 6, duracaoMin: 45 });
|
|
930
|
+
for (const item of (b.ok ? b.sons : [])) {
|
|
931
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'trilha' });
|
|
932
|
+
if (d.ok) { trilha = d.relativo; break; }
|
|
933
|
+
}
|
|
934
|
+
} catch { /* segue sem música */ }
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
const base = {
|
|
938
|
+
src: path.relative(p.pasta, fonte).replace(/\\/g, '/'),
|
|
939
|
+
duracao: m.segundos, palavras, largura: m.largura, altura: m.altura,
|
|
940
|
+
estilo: args.estilo || 'viral', sons, iconesOk, imagens, trilha,
|
|
941
|
+
};
|
|
942
|
+
let montado = edicao.montarEdicao(base);
|
|
943
|
+
if (!montado.ok) return montado;
|
|
944
|
+
|
|
945
|
+
/* A segunda passada: nas frases escolhidas, a pessoa recortada na
|
|
946
|
+
frente da palavra gigante. Só os trechos que entram são recortados
|
|
947
|
+
(2 s cada), não o vídeo inteiro — recortar 52 s levaria minutos. */
|
|
948
|
+
if ((args.estilo || 'viral') === 'viral' && args.recorte !== false) {
|
|
949
|
+
const recortes = {};
|
|
950
|
+
for (const [i, info] of montado.infos.entries()) {
|
|
951
|
+
if (!info.recorte || !info.forte || info.forte.peso < 9 || Object.keys(recortes).length >= 3) continue;
|
|
952
|
+
const de = Math.max(0, info.forte.de - 0.15);
|
|
953
|
+
const ate = Math.min(info.dur, de + 2.2);
|
|
954
|
+
if (ate - de < 1) continue;
|
|
955
|
+
const seg = path.join(p.pasta, 'midia', `seg-${i + 1}-${Date.now().toString(36)}.mp4`);
|
|
956
|
+
const corte = await video.rodar(video.ffmpeg(), ['-y', '-ss', String(info.ini + de), '-t', String(ate - de), '-i', fonte,
|
|
957
|
+
'-vf', `scale=${Math.min(1280, m.largura)}:-2`, '-an', '-c:v', 'libx264', '-preset', 'veryfast', seg], { timeout: 120000 });
|
|
958
|
+
if (!corte.ok) continue;
|
|
959
|
+
const saida = path.join(p.pasta, 'midia', `pessoa-${i + 1}-${Date.now().toString(36)}.webm`);
|
|
960
|
+
const r = await rodarPessoa(['recortar', '--entrada', seg, '--saida', saida], { timeout: 10 * 60000 });
|
|
961
|
+
try { fs.unlinkSync(seg); } catch { /* fica */ }
|
|
962
|
+
if (!r.ok) break; // sem MediaPipe, nenhum recorte vai dar: não tenta os outros
|
|
963
|
+
recortes[i] = { src: path.relative(p.pasta, saida).replace(/\\/g, '/'), de: Math.round(de * 100) / 100, ate: Math.round(ate * 100) / 100 };
|
|
964
|
+
}
|
|
965
|
+
if (Object.keys(recortes).length) montado = edicao.montarEdicao({ ...base, recortes });
|
|
966
|
+
}
|
|
967
|
+
const salvo = await ferramentaPlano({ id: args.id, plano: montado.plano, motivo: `edição automática (${args.estilo || 'viral'})` });
|
|
968
|
+
if (!salvo.ok) return salvo;
|
|
969
|
+
projeto.anotar(p.id, 'edicao', `${montado.resumo.cenas} cenas, ${montado.resumo.icones} ícones, ${cortes} cortes de silêncio`);
|
|
970
|
+
return {
|
|
971
|
+
ok: true, ...montado.resumo, cortesDeSilencio: cortes, duracao: salvo.duracao,
|
|
972
|
+
proximo: 'estudio_render com este id. Antes, se quiser, ajuste uma cena com estudio_plano cena:N '
|
|
973
|
+
+ '(ex.: trocar um ícone, pôr uma imagem de apoio atrás).',
|
|
974
|
+
};
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
/* O VÍDEO EM CAMADAS (camadas.js, 14/10: "quero uma edição nesse nível"):
|
|
978
|
+
a pessoa só gravou a fala; a IA passa as batidas (forma do rosto, cena
|
|
979
|
+
de motion, destaque) e o Estúdio monta o bolo por cima. Sem batidas,
|
|
980
|
+
devolve uma proposta pela transcrição — a IA aceita ou muda. */
|
|
981
|
+
if (acao === 'camadas') {
|
|
982
|
+
const m = await video.medir(alvo);
|
|
983
|
+
if (!m.ok) return m;
|
|
984
|
+
// A transcrição fica guardada: a proposta e a montagem não pagam duas vezes.
|
|
985
|
+
const guardada = path.join(p.pasta, 'midia', `transcricao-${path.basename(alvo).replace(/\.[^.]+$/, '')}.json`);
|
|
986
|
+
let palavras = Array.isArray(args.palavras) && args.palavras.length ? args.palavras : null;
|
|
987
|
+
if (palavras) { try { fs.writeFileSync(guardada, JSON.stringify(palavras)); } catch { /* segue sem guardar */ } }
|
|
988
|
+
if (!palavras && fs.existsSync(guardada)) { try { palavras = JSON.parse(fs.readFileSync(guardada, 'utf8')); } catch { palavras = null; } }
|
|
989
|
+
if (!palavras) {
|
|
990
|
+
const tr = await transcrever(p, alvo, ctx);
|
|
991
|
+
if (!tr.ok) return tr;
|
|
992
|
+
palavras = (tr.palavras && tr.palavras.length) ? tr.palavras : repartirTrechos(tr.trechos || []);
|
|
993
|
+
try { fs.writeFileSync(guardada, JSON.stringify(palavras)); } catch { /* segue sem guardar */ }
|
|
994
|
+
}
|
|
995
|
+
const batidas = Array.isArray(args.batidas) && args.batidas.length ? args.batidas : null;
|
|
996
|
+
if (!batidas) {
|
|
997
|
+
return {
|
|
998
|
+
ok: true, proposta: camadas.propor(palavras, m.segundos), duracao: m.segundos,
|
|
999
|
+
comoUsar: 'é uma SUGESTÃO pela transcrição. Decida você: mude as formas, junte ou separe batidas, '
|
|
1000
|
+
+ 'escreva a cena de motion de cada ideia (componentes/x.jsx, recebe {el, t, fps}; el.dados traz largura/altura do espaço livre, '
|
|
1001
|
+
+ 'palavras com t, destaque, cores e fontes; a LEGENDA da fala já está no quadro, então a cena NÃO escreve a fala: desenha a ideia) ou use um efeito de fábrica pelo nome (estudio_midia acao:"efeitos"), '
|
|
1002
|
+
+ 'e chame de novo com batidas:[{de, ate, rosto, cena?, destaque?, canto?, dados?}].',
|
|
1003
|
+
};
|
|
1004
|
+
}
|
|
1005
|
+
// A cena: arquivo da pasta (conferido antes do render) ou efeito de fábrica pelo nome.
|
|
1006
|
+
const problemas = [];
|
|
1007
|
+
const prontas = batidas.map((b, i) => {
|
|
1008
|
+
if (!b || !b.cena) return b;
|
|
1009
|
+
const cena = String(b.cena).trim();
|
|
1010
|
+
if (/[\\/]|\.(jsx|tsx|js)$/i.test(cena)) {
|
|
1011
|
+
const cheio = dentro(cena);
|
|
1012
|
+
if (!cheio || !fs.existsSync(cheio)) { problemas.push(`batidas[${i}]: a cena "${cena}" não está na pasta do projeto.`); return { ...b, cena: null }; }
|
|
1013
|
+
const conf = conferirCena(cheio);
|
|
1014
|
+
if (!conf.ok) { problemas.push(`batidas[${i}]: ${cena} — ${conf.erro}`); return { ...b, cena: null }; }
|
|
1015
|
+
return { ...b, cena };
|
|
1016
|
+
}
|
|
1017
|
+
const r = efeitos.reusar({ pasta: p.pasta, nome: cena });
|
|
1018
|
+
if (!r.ok) { problemas.push(`batidas[${i}]: ${r.error}`); return { ...b, cena: null }; }
|
|
1019
|
+
return { ...b, cena: r.src };
|
|
1020
|
+
});
|
|
1021
|
+
if (problemas.length) return { ok: false, error: 'as cenas têm problema — conserte e mande de novo.', problemas };
|
|
1022
|
+
|
|
1023
|
+
/* A voz no volume de vídeo de internet (-15 LUFS), como na edição
|
|
1024
|
+
automática; o vídeo em si não é recodificado. */
|
|
1025
|
+
let fonte = alvo;
|
|
1026
|
+
if (args.normalizar !== false) {
|
|
1027
|
+
const normal = path.join(p.pasta, 'midia', `voz-normal-${path.basename(alvo).replace(/\.[^.]+$/, '')}.mp4`);
|
|
1028
|
+
if (!fs.existsSync(normal)) {
|
|
1029
|
+
await video.rodar(video.ffmpeg(), ['-y', '-i', alvo, '-c:v', 'copy',
|
|
1030
|
+
'-af', 'loudnorm=I=-15:TP=-1.5:LRA=11', '-c:a', 'aac', '-b:a', '192k', normal], { timeout: 10 * 60000 });
|
|
1031
|
+
}
|
|
1032
|
+
if (fs.existsSync(normal)) fonte = normal;
|
|
1033
|
+
}
|
|
1034
|
+
const deitado = m.largura > m.altura;
|
|
1035
|
+
const montado = camadas.montar({
|
|
1036
|
+
src: path.relative(p.pasta, fonte).replace(/\\/g, '/'), duracao: m.segundos, palavras, batidas: prontas,
|
|
1037
|
+
largura: deitado ? 1920 : 1080, altura: deitado ? 1080 : 1920, fps: 30,
|
|
1038
|
+
origem: { largura: m.largura, altura: m.altura }, rosto: args.rosto || {}, acento: args.acento,
|
|
1039
|
+
sons: sonsLeves.preparar(p.pasta),
|
|
1040
|
+
});
|
|
1041
|
+
if (!montado.ok) return montado;
|
|
1042
|
+
const salvo = await ferramentaPlano({ id: args.id, plano: montado.plano, motivo: `vídeo em camadas (${montado.resumo.batidas} batidas)` });
|
|
1043
|
+
if (!salvo.ok) return salvo;
|
|
1044
|
+
projeto.anotar(p.id, 'edicao', `camadas: ${montado.resumo.batidas} batidas, ${montado.resumo.cenas} cenas de motion, ${montado.resumo.trocasDeForma} trocas de forma`);
|
|
1045
|
+
return {
|
|
1046
|
+
ok: true, ...montado.resumo, batidas: montado.batidas, duracao: salvo.duracao,
|
|
1047
|
+
proximo: 'estudio_render com este id. Para mudar uma batida, chame camadas de novo com a lista inteira.',
|
|
1048
|
+
};
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
if (acao === 'recortar-pessoa' || acao === 'pessoa') {
|
|
1052
|
+
const saida = path.join(p.pasta, 'midia', `pessoa-${Date.now().toString(36)}.webm`);
|
|
1053
|
+
const r = await rodarPessoa([
|
|
1054
|
+
'recortar', '--entrada', alvo, '--saida', saida,
|
|
1055
|
+
...(args.suavizar != null ? ['--suavizar', String(args.suavizar)] : []),
|
|
1056
|
+
...(args.encolher != null ? ['--encolher', String(args.encolher)] : []),
|
|
1057
|
+
], { timeout: 40 * 60000 });
|
|
1058
|
+
if (r.ok) {
|
|
1059
|
+
r.relativo = path.relative(p.pasta, saida).replace(/\\/g, '/');
|
|
1060
|
+
r.comoUsar = 'é um vídeo com fundo TRANSPARENTE. Ponha-o como elemento de vídeo numa cena '
|
|
1061
|
+
+ 'que tenha a imagem de fundo atrás — não precisa juntar os dois num arquivo.';
|
|
1062
|
+
projeto.anotar(p.id, 'pessoa', `recortou ${r.quadros} quadros`);
|
|
1063
|
+
}
|
|
1064
|
+
return r;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
return { ok: false, error: `não conheço a ação "${acao}".` };
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
/* A mídia de apoio de um termo: vídeo do Pexels quando pedido e houver,
|
|
1071
|
+
senão uma foto. Devolve {src, tipo} ou null. O clipe sai sorteado entre
|
|
1072
|
+
os que os últimos vídeos não usaram (variedade.js), não o primeiro da
|
|
1073
|
+
busca — "o b-roll veio igual nos dois vídeos" (Joel, 05/10). */
|
|
1074
|
+
/** A foto editorial (Wikimedia, museu) que os últimos vídeos não usaram; o crédito fica no caderno. */
|
|
1075
|
+
async function baixarEditorial(p, termo) {
|
|
1076
|
+
try {
|
|
1077
|
+
const b = await assets.procurarEditorial(termo, { quantas: 8 });
|
|
1078
|
+
for (const item of variedade.ordenar(b.imagens, 'broll').slice(0, 4)) {
|
|
1079
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'foto-' + termo });
|
|
1080
|
+
if (d.ok) { variedade.marcar('broll', item.url); projeto.anotar(p.id, 'creditos', item.creditos); return { src: d.relativo, tipo: 'imagem' }; }
|
|
1081
|
+
}
|
|
1082
|
+
} catch { /* sem foto */ }
|
|
1083
|
+
return null;
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
async function baixarApoio(p, termo, { orientacao = null, video: querVideo = false } = {}) {
|
|
1087
|
+
if (querVideo) {
|
|
1088
|
+
try {
|
|
1089
|
+
const itens = await variedade.buscarSemRepetir(async (t) => {
|
|
1090
|
+
const b = await assets.procurarVideos(t, { quantas: 8, orientacao });
|
|
1091
|
+
return (b.ok ? b.videos : []).filter((v) => !v.duracao || v.duracao >= 3);
|
|
1092
|
+
}, termo);
|
|
1093
|
+
for (const item of itens.slice(0, 4)) {
|
|
1094
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'apoio-' + termo });
|
|
1095
|
+
if (d.ok) { variedade.marcar('broll', item.url); return { src: d.relativo, tipo: 'video' }; }
|
|
1096
|
+
}
|
|
1097
|
+
} catch { /* cai para a foto */ }
|
|
1098
|
+
}
|
|
1099
|
+
try {
|
|
1100
|
+
const itens = await variedade.buscarSemRepetir(async (t) => {
|
|
1101
|
+
const b = await assets.procurarImagens(t, { quantas: 8, orientacao });
|
|
1102
|
+
return b.ok ? b.imagens : [];
|
|
1103
|
+
}, termo);
|
|
1104
|
+
for (const item of itens.slice(0, 4)) {
|
|
1105
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'apoio-' + termo });
|
|
1106
|
+
if (d.ok) { variedade.marcar('broll', item.url); return { src: d.relativo, tipo: 'imagem' }; }
|
|
1107
|
+
}
|
|
1108
|
+
} catch { /* sem apoio */ }
|
|
1109
|
+
return null;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
/* Os ícones automáticos trocam de coleção a cada vídeo (Joel, 05/10: "várias
|
|
1113
|
+
opções de ícones... que não sejam padrão da IA"). O ícone que o roteiro
|
|
1114
|
+
pediu pelo nome fica; o que não existe na coleção sorteada fica no 3D. */
|
|
1115
|
+
async function variarIcones(plano, roteiro) {
|
|
1116
|
+
const colecao = variedade.colecaoIcones();
|
|
1117
|
+
const explicitos = [];
|
|
1118
|
+
try { JSON.stringify(roteiro || {}, (k, v) => { if (k === 'icone' && typeof v === 'string') explicitos.push(v); return v; }); } catch { /* sem */ }
|
|
1119
|
+
const troca = {};
|
|
1120
|
+
/* VÁRIAS BIBLIOTECAS NO MESMO VÍDEO (13/10: "não uma biblioteca de ícone,
|
|
1121
|
+
mas várias, que vai misturar tudo"). Antes o vídeo sorteava UMA coleção
|
|
1122
|
+
e trocava todos os ícones para ela. Agora cada ícone tenta uma coleção,
|
|
1123
|
+
em rodízio a partir da sorteada; sem o desenho nela, a próxima. */
|
|
1124
|
+
const colecoes = [colecao, ...assets.COLECOES.map((c) => c[0]).filter((c) => c !== colecao)];
|
|
1125
|
+
let vez = 0;
|
|
1126
|
+
for (const nome of variedade.iconesTrocaveis(plano, explicitos)) {
|
|
1127
|
+
/* Primeiro O ÍCONE: o conceito escolhe entre as formas dele
|
|
1128
|
+
(edicao.ALTERNATIVAS) pelos pontos da variedade — o que os últimos
|
|
1129
|
+
vídeos menos usaram. Depois A COLEÇÃO. */
|
|
1130
|
+
const base = nome.split(':')[1];
|
|
1131
|
+
let escolhido = base;
|
|
1132
|
+
const alts = edicao.ALTERNATIVAS[base];
|
|
1133
|
+
if (alts) {
|
|
1134
|
+
const ordem = variedade.ordenar([base, ...alts].map((url) => ({ url })), 'icone-nome').map((x) => x.url);
|
|
1135
|
+
for (const n of ordem) {
|
|
1136
|
+
if (n === base) { escolhido = base; break; }
|
|
1137
|
+
try { const r = await assets.icone('fluent-3d:' + n); if (r && r.ok) { escolhido = n; break; } } catch { /* tenta o próximo */ }
|
|
1138
|
+
}
|
|
1139
|
+
variedade.marcar('icone-nome', escolhido);
|
|
1140
|
+
}
|
|
1141
|
+
let novo = 'fluent-3d:' + escolhido;
|
|
1142
|
+
for (let k = 0; k < colecoes.length; k++) {
|
|
1143
|
+
const c = colecoes[(vez + k) % colecoes.length];
|
|
1144
|
+
if (c === 'fluent-3d') break;
|
|
1145
|
+
try { const r = await assets.icone(c + ':' + escolhido); if (r && r.ok) { novo = c + ':' + escolhido; break; } } catch { /* a próxima */ }
|
|
1146
|
+
}
|
|
1147
|
+
vez++;
|
|
1148
|
+
if (novo !== nome) troca[nome] = novo;
|
|
1149
|
+
}
|
|
1150
|
+
const n = variedade.trocarIcones(plano, troca);
|
|
1151
|
+
if (n || colecao === 'fluent-3d') variedade.marcar('icones', colecao);
|
|
1152
|
+
return { colecao, trocados: n };
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
/* ── A VOZ DO GEMINI ─────────────────────────────────────────────────────
|
|
1156
|
+
* O roteiro inteiro numa chamada só (o plano grátis tem poucos pedidos por
|
|
1157
|
+
* minuto), e as partes achadas depois na transcrição do próprio áudio: a
|
|
1158
|
+
* primeira palavra de cada parte, procurada em ordem. Sem achar, o tempo é
|
|
1159
|
+
* repartido pelo tamanho do texto de cada parte. */
|
|
1160
|
+
const VOZ_GEMINI = { thalita: 'Kore', francisca: 'Aoede', antonio: 'Charon', feminina: 'Kore', masculina: 'Charon' };
|
|
1161
|
+
const tokens = (t) => String(t || '').normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);
|
|
1162
|
+
|
|
1163
|
+
function alinharPartes(lista, palavras, total) {
|
|
1164
|
+
const ws = palavras.map((w) => ({ ...w, k: tokens(w.texto)[0] || '' }));
|
|
1165
|
+
const chars = lista.map((x) => x.texto.length);
|
|
1166
|
+
const soma = chars.reduce((a, b) => a + b, 0) || 1;
|
|
1167
|
+
const inicios = [0];
|
|
1168
|
+
let cursor = 0, acum = 0;
|
|
1169
|
+
for (let i = 1; i < lista.length; i++) {
|
|
1170
|
+
acum += chars[i - 1];
|
|
1171
|
+
const esperado = Math.round(ws.length * acum / soma);
|
|
1172
|
+
/* As DUAS primeiras palavras da parte, seguidas: achar só pela primeira
|
|
1173
|
+
palavra longa deixava o "E" de "E sair com algo" no fim da fala
|
|
1174
|
+
anterior, e ele soava duas vezes (medido em 25/09, aos 38 s). */
|
|
1175
|
+
const tk = tokens(lista[i].texto);
|
|
1176
|
+
let achado = -1;
|
|
1177
|
+
for (let j = Math.max(cursor + 1, esperado - 14); j < Math.min(ws.length, esperado + 14); j++) {
|
|
1178
|
+
if (ws[j].k === tk[0] && (!tk[1] || (ws[j + 1] && ws[j + 1].k === tk[1]))) { achado = j; break; }
|
|
1179
|
+
}
|
|
1180
|
+
if (achado < 0) {
|
|
1181
|
+
const alvo = tk.find((w) => w.length >= 3) || tk[0];
|
|
1182
|
+
for (let j = Math.max(cursor + 1, esperado - 12); j < Math.min(ws.length, esperado + 12); j++) {
|
|
1183
|
+
if (ws[j].k === alvo) { achado = j; break; }
|
|
1184
|
+
}
|
|
1185
|
+
// A palavra curta que vem antes da achada ("e", "a", "o") é desta parte, não da anterior.
|
|
1186
|
+
while (achado > cursor + 1 && ws[achado - 1].k.length <= 2 && tk.slice(0, 3).includes(ws[achado - 1].k)) achado--;
|
|
1187
|
+
}
|
|
1188
|
+
const idx = achado > cursor ? achado : Math.max(cursor + 1, Math.min(ws.length - 1, esperado));
|
|
1189
|
+
inicios.push(idx);
|
|
1190
|
+
cursor = idx;
|
|
1191
|
+
}
|
|
1192
|
+
return lista.map((_, i) => {
|
|
1193
|
+
const a = ws[inicios[i]], b = ws[(inicios[i + 1] || ws.length) - 1];
|
|
1194
|
+
// As palavras da parte vão junto: o estilo impacto corta no tempo delas.
|
|
1195
|
+
const palavras = ws.slice(inicios[i], inicios[i + 1] || ws.length).map(({ de, ate, texto }) => ({ de, ate, texto }));
|
|
1196
|
+
return { de: i === 0 ? 0 : (a ? a.de : 0), ate: b ? b.ate : total, palavras };
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/**
|
|
1201
|
+
* Onde o roteiro COMEÇA na fala transcrita, em segundos — 0 se começa logo.
|
|
1202
|
+
*
|
|
1203
|
+
* Dois jeitos de o Gemini vazar a direção, os dois vistos no vídeo do Joel
|
|
1204
|
+
* (10/10): falar "Rápido e contínuo." ANTES do roteiro, e falar NO LUGAR da
|
|
1205
|
+
* primeira frase ("Rápido e contínuo. Você pergunta…", sem o "IA é pra tirar
|
|
1206
|
+
* dúvida"). Então: acha o primeiro par de palavras seguidas que existe no
|
|
1207
|
+
* roteiro (não só o par do começo), e corta o que veio antes — mas só se o que
|
|
1208
|
+
* veio antes for, na maior parte, palavra da DIREÇÃO. Fala do roteiro que o
|
|
1209
|
+
* transcritor errou não é vazamento e não sai.
|
|
1210
|
+
*/
|
|
1211
|
+
function vazamentoNoComeco(lista, palavras, direcao = '') {
|
|
1212
|
+
const norm = (t) => String(t || '').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^a-z0-9]+/g, ' ').trim();
|
|
1213
|
+
const roteiro = norm(lista.slice(0, 2).map((x) => x.texto).join(' ')).split(' ').filter(Boolean);
|
|
1214
|
+
if (roteiro.length < 2 || !palavras.length) return 0;
|
|
1215
|
+
const pares = new Set(roteiro.slice(0, -1).map((w, i) => w + ' ' + roteiro[i + 1]));
|
|
1216
|
+
/* 40 palavras, não 14 (13/10): a direção do personagem tem ~20 palavras, e
|
|
1217
|
+
o roteiro só começava depois da janela — o corte desistia e o vídeo saía
|
|
1218
|
+
com "Natural and close. Never like an announcer." na legenda. */
|
|
1219
|
+
const ditas = palavras.slice(0, 40).map((w) => norm(w.texto));
|
|
1220
|
+
let i = 0;
|
|
1221
|
+
while (i < ditas.length - 1 && !pares.has(ditas[i] + ' ' + ditas[i + 1])) i++;
|
|
1222
|
+
if (i === 0 || i >= ditas.length - 1) return 0;
|
|
1223
|
+
const daDirecao = new Set(norm(direcao).split(' ').filter(Boolean));
|
|
1224
|
+
const antes = ditas.slice(0, i).join(' ').split(' ').filter(Boolean);
|
|
1225
|
+
/* A transcrição entorta a direção ("Read aloud in Brazilian Portuguese" vira
|
|
1226
|
+
"Lê a alta em Brasília e Português"): basta 35% das palavras, ou 3, serem dela. */
|
|
1227
|
+
const daDir = antes.filter((w) => daDirecao.has(w)).length;
|
|
1228
|
+
const vazou = !direcao || daDir / antes.length >= 0.35 || daDir >= 3;
|
|
1229
|
+
return vazou ? Math.max(0, palavras[i].de - 0.08) : 0;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
async function narrarComGemini(lista, mp3, { voz, direcao } = {}) {
|
|
1233
|
+
/* A narração premium é do Pro em diante (lib/config/limites.js). Sem ela a corrente
|
|
1234
|
+
segue para a voz local (Kokoro/Edge) e o aviso explica o porquê. */
|
|
1235
|
+
const lim = require('../../config/limites.js');
|
|
1236
|
+
const prem = await lim.exigir('narracaoPremium');
|
|
1237
|
+
if (!prem.ok) { lim.avisar(prem.error + ' A narração saiu com a voz local.'); return { ok: false, error: prem.error }; }
|
|
1238
|
+
try {
|
|
1239
|
+
const cfg = require('../../config/config').loadConfig();
|
|
1240
|
+
const api = require('../../provider/api');
|
|
1241
|
+
/* A cota grátis da voz é por MINUTO e pequena: "quota" é esperar e
|
|
1242
|
+
tentar de novo, não desistir para a voz de reserva (medido em 25/09:
|
|
1243
|
+
a mesma chamada passava meio minuto depois). */
|
|
1244
|
+
let r = null;
|
|
1245
|
+
for (let tentativa = 0; tentativa < 4; tentativa++) {
|
|
1246
|
+
try {
|
|
1247
|
+
r = await api.request(cfg.server, '/api/voz', {
|
|
1248
|
+
texto: lista.map((x) => x.texto).join('\n\n'),
|
|
1249
|
+
voz: VOZ_GEMINI[String(voz || '').toLowerCase()] || voz || 'Charon',
|
|
1250
|
+
...(direcao ? { direcao } : {}),
|
|
1251
|
+
}, cfg.token);
|
|
1252
|
+
} catch (e) { r = { ok: false, erro: e.message }; }
|
|
1253
|
+
if (r && r.ok) break;
|
|
1254
|
+
if (!/quota|rate|429|exhaust/i.test(String(r && r.erro))) break;
|
|
1255
|
+
await new Promise((ok) => setTimeout(ok, 30000));
|
|
1256
|
+
}
|
|
1257
|
+
if (!r || !r.ok) return { ok: false, error: (r && r.erro) || 'sem voz no servidor' };
|
|
1258
|
+
const pcm = mp3.replace(/\.mp3$/, '.pcm');
|
|
1259
|
+
fs.writeFileSync(pcm, Buffer.from(r.audio, 'base64'));
|
|
1260
|
+
const taxa = (String(r.formato).match(/rate=(\d+)/) || [])[1] || '24000';
|
|
1261
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-f', 's16le', '-ar', taxa, '-ac', '1', '-i', pcm,
|
|
1262
|
+
'-af', 'loudnorm=I=-14:TP=-1.5:LRA=9', '-c:a', 'libmp3lame', '-q:a', '3', mp3], { timeout: 120000 });
|
|
1263
|
+
try { fs.unlinkSync(pcm); } catch { /* fica */ }
|
|
1264
|
+
if (!c.ok) return { ok: false, error: 'não consegui converter a voz' };
|
|
1265
|
+
const med = await video.medir(mp3);
|
|
1266
|
+
/* A voz CORTADA: o Gemini às vezes devolve metade do roteiro, sem erro
|
|
1267
|
+
(medido em 25/09: 27,5 s de áudio para um texto de ~55 s). Fala
|
|
1268
|
+
normal passa de 11 caracteres por segundo; menos que isso é corte. */
|
|
1269
|
+
const chars = lista.reduce((n, x) => n + x.texto.length, 0);
|
|
1270
|
+
if (med.segundos < chars / 22) return { ok: false, error: `a voz veio cortada (${med.segundos.toFixed(1)} s para ${chars} caracteres)` };
|
|
1271
|
+
const tr = await api.requestTranscricao(cfg.server, { token: cfg.token, audio: fs.readFileSync(mp3).toString('base64'), nome: 'voz.mp3', idioma: 'pt' });
|
|
1272
|
+
let palavras = (tr && tr.palavras) || [];
|
|
1273
|
+
if (!palavras.length) return { ok: false, error: 'sem a transcrição da voz para achar as partes' };
|
|
1274
|
+
let segundos = med.segundos;
|
|
1275
|
+
/* A DIREÇÃO LIDA EM VOZ ALTA. O servidor manda a direção ("leia RÁPIDO e
|
|
1276
|
+
contínuo…") e o texto no mesmo pedido, e o Gemini às vezes fala o
|
|
1277
|
+
começo dela: o vídeo do Joel abria com "Rápido e contínuo." antes do
|
|
1278
|
+
roteiro (10/10). Se o roteiro só começa depois de algumas palavras,
|
|
1279
|
+
o que vem antes é vazamento — e sai do áudio. */
|
|
1280
|
+
const corte = vazamentoNoComeco(lista, palavras, direcao);
|
|
1281
|
+
if (corte > 0.15) {
|
|
1282
|
+
const cortado = mp3.replace(/\.mp3$/, '-c.mp3');
|
|
1283
|
+
const k = await video.rodar(video.ffmpeg(), ['-y', '-ss', corte.toFixed(3), '-i', mp3, '-c:a', 'libmp3lame', '-q:a', '3', cortado], { timeout: 120000 });
|
|
1284
|
+
if (k.ok && fs.existsSync(cortado)) {
|
|
1285
|
+
fs.renameSync(cortado, mp3);
|
|
1286
|
+
palavras = palavras.filter((w) => w.de >= corte - 0.02).map((w) => ({ ...w, de: Math.max(0, w.de - corte), ate: Math.max(0, w.ate - corte) }));
|
|
1287
|
+
segundos = Math.max(0, segundos - corte);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
return { ok: true, voz: `gemini ${r.voz}`, segundos, partes: alinharPartes(lista, palavras, segundos), ...(corte > 0.15 ? { cortouDirecao: corte } : {}) };
|
|
1291
|
+
} catch (e) {
|
|
1292
|
+
return { ok: false, error: e.message };
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
/* A VOZ DO VOICESTUDIO (15/10): o app local fala o roteiro inteiro, e o resto
|
|
1297
|
+
é o caminho do Gemini — volume de Reels, a transcrição para achar as partes.
|
|
1298
|
+
Fechado ou falhando, devolve ok:false e a cadeia segue para o Gemini. */
|
|
1299
|
+
async function narrarComVoiceStudio(lista, mp3, { voz } = {}) {
|
|
1300
|
+
if (process.env.PRIMOCODE_SEM_VOICESTUDIO) return { ok: false, indisponivel: true, error: 'voicestudio desligado' };
|
|
1301
|
+
try {
|
|
1302
|
+
const texto = lista.map((x) => x.texto).join('\n\n');
|
|
1303
|
+
// A voz do Gemini ("Kore", "Charon") não existe lá: só um perfil do próprio app.
|
|
1304
|
+
const perfil = /^vs:/i.test(String(voz || '')) ? String(voz).slice(3) : undefined;
|
|
1305
|
+
const r = await voicestudio.falar(texto, { voz: perfil });
|
|
1306
|
+
if (!r.ok) return r;
|
|
1307
|
+
const bruto = mp3.replace(/\.mp3$/, '-vs.mp3');
|
|
1308
|
+
fs.writeFileSync(bruto, r.audio);
|
|
1309
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-i', bruto, '-af', 'loudnorm=I=-14:TP=-1.5:LRA=9', '-c:a', 'libmp3lame', '-q:a', '3', mp3], { timeout: 120000 });
|
|
1310
|
+
try { fs.unlinkSync(bruto); } catch { /* fica */ }
|
|
1311
|
+
if (!c.ok) return { ok: false, error: 'voicestudio: não consegui converter a voz' };
|
|
1312
|
+
const med = await video.medir(mp3);
|
|
1313
|
+
const chars = lista.reduce((n, x) => n + x.texto.length, 0);
|
|
1314
|
+
if (med.segundos < chars / 22) return { ok: false, error: `voicestudio: a voz veio cortada (${med.segundos.toFixed(1)} s para ${chars} caracteres)` };
|
|
1315
|
+
const cfg = require('../../config/config').loadConfig();
|
|
1316
|
+
const tr = await require('../../provider/api').requestTranscricao(cfg.server, { token: cfg.token, audio: fs.readFileSync(mp3).toString('base64'), nome: 'voz.mp3', idioma: 'pt' });
|
|
1317
|
+
const palavras = (tr && tr.palavras) || [];
|
|
1318
|
+
if (!palavras.length) return { ok: false, error: 'voicestudio: sem a transcrição da voz para achar as partes' };
|
|
1319
|
+
return { ok: true, voz: `voicestudio ${perfil || 'default'}`, segundos: med.segundos, partes: alinharPartes(lista, palavras, med.segundos) };
|
|
1320
|
+
} catch (e) {
|
|
1321
|
+
return { ok: false, error: 'voicestudio: ' + e.message };
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
/* Onde estão os rostos em cada foto (studio/rostos.py, pelo uv). Guardado no
|
|
1326
|
+
projeto: a mesma foto não é analisada duas vezes. */
|
|
1327
|
+
async function acharRostos(p, srcs) {
|
|
1328
|
+
const guardado = (p.acervo && p.acervo.rostos) || {};
|
|
1329
|
+
const falta = srcs.filter((s0) => !(s0 in guardado));
|
|
1330
|
+
if (falta.length) {
|
|
1331
|
+
const uv = acharUv();
|
|
1332
|
+
const r = await new Promise((resolve) => {
|
|
1333
|
+
const args = ['run', '--quiet', '--python', '3.12', '--with', 'mediapipe<0.10.22', '--with', 'opencv-python', '--with', 'numpy', 'python', path.join(PY, 'rostos.py'), ...falta.map((x) => path.join(p.pasta, x))];
|
|
1334
|
+
const pr = uv ? spawn(uv, args) : spawn(python() || 'python3', [path.join(PY, 'rostos.py'), ...falta.map((x) => path.join(p.pasta, x))]);
|
|
1335
|
+
let out = '';
|
|
1336
|
+
pr.stdout.on('data', (d) => { out += d; });
|
|
1337
|
+
pr.on('close', () => { try { resolve(JSON.parse(out.trim().split('\n').pop())); } catch { resolve({ ok: false }); } });
|
|
1338
|
+
pr.on('error', () => resolve({ ok: false }));
|
|
1339
|
+
});
|
|
1340
|
+
if (r && r.ok) {
|
|
1341
|
+
for (const [cheio, info] of Object.entries(r.fotos || {})) guardado[path.relative(p.pasta, cheio).replace(/\\/g, '/')] = info;
|
|
1342
|
+
for (const x of falta) if (!(x in guardado)) guardado[x] = null;
|
|
1343
|
+
projeto.salvar(p.id, { acervo: { ...(projeto.ler(p.id).acervo || {}), rostos: guardado } });
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
return guardado;
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
/* O DEPOIMENTO cortado na PALAVRA, não no trecho: começa na primeira palavra
|
|
1350
|
+
da frase e termina logo depois da última, com fade, a voz normalizada e um
|
|
1351
|
+
respiro no fim. "Fica sempre um 'é', um 'e' das pessoas… a música muito
|
|
1352
|
+
alta e não dá pra ouvir as pessoas" (25/09). */
|
|
1353
|
+
async function prepararDepoimento(p, c) {
|
|
1354
|
+
const origem = path.join(p.pasta, c.src);
|
|
1355
|
+
if (!fs.existsSync(origem) || c.pronto) return {};
|
|
1356
|
+
let de = c.de, ate = c.ate;
|
|
1357
|
+
try {
|
|
1358
|
+
const cfg = require('../../config/config').loadConfig();
|
|
1359
|
+
const amostra = path.join(p.pasta, 'midia', `depo-amostra-${Date.now().toString(36)}.mp3`);
|
|
1360
|
+
await video.rodar(video.ffmpeg(), ['-y', '-ss', String(Math.max(0, c.de - 1.5)), '-t', String(c.ate - c.de + 3), '-i', origem, '-ac', '1', '-ar', '16000', '-b:a', '32k', amostra], { timeout: 60000 });
|
|
1361
|
+
const tr = await require('../../provider/api').requestTranscricao(cfg.server, { token: cfg.token, audio: fs.readFileSync(amostra).toString('base64'), nome: 'd.mp3', idioma: 'pt' });
|
|
1362
|
+
try { fs.unlinkSync(amostra); } catch { /* fica */ }
|
|
1363
|
+
const base0 = Math.max(0, c.de - 1.5);
|
|
1364
|
+
const ws = ((tr && tr.palavras) || []).map((w) => ({ ...w, de: w.de + base0, ate: w.ate + base0 }));
|
|
1365
|
+
/* Só a FRASE de efeito: começa na primeira palavra dela e termina na
|
|
1366
|
+
última. "Fala a frase que tem que falar e continua antes de trocar"
|
|
1367
|
+
(25/09): o resto da conversa não tem nada a ver com o vídeo. */
|
|
1368
|
+
const alvo = tokens(c.frase || '');
|
|
1369
|
+
const k0 = (w) => tokens(w.texto)[0] || '';
|
|
1370
|
+
const iniW = ws.find((w) => w.de >= c.de - 1.2 && alvo.length && k0(w) === alvo[0])
|
|
1371
|
+
|| ws.find((w) => w.de >= c.de - 0.6 && alvo.includes(k0(w)));
|
|
1372
|
+
const ultimo = alvo[alvo.length - 1];
|
|
1373
|
+
const fimW = [...ws].reverse().find((w) => w.ate <= c.ate + 1.5 && (!iniW || w.de > iniW.de) && k0(w) === ultimo);
|
|
1374
|
+
if (iniW) de = Math.max(0, iniW.de - 0.08);
|
|
1375
|
+
if (fimW) ate = fimW.ate;
|
|
1376
|
+
else { const fimWs = ws.filter((w) => w.ate <= c.ate + 0.3); if (fimWs.length) ate = fimWs[fimWs.length - 1].ate; }
|
|
1377
|
+
// A frase na tela é o que a pessoa FALA no trecho — palavra por palavra.
|
|
1378
|
+
const ditas = ws.filter((w) => w.de >= de - 0.05 && w.ate <= ate + 0.05).map((w) => w.texto).join(' ').trim();
|
|
1379
|
+
/* Se a frase do roteiro bate com o que foi dito (a transcrição erra
|
|
1380
|
+
detalhe: "eu conseguir" no lugar de "eu consegui"), fica a do roteiro. */
|
|
1381
|
+
const tA = tokens(c.frase || ''), tD = tokens(ditas);
|
|
1382
|
+
const bate = tA.length && tA.filter((w) => tD.includes(w)).length / tA.length >= 0.7;
|
|
1383
|
+
if (!bate && ditas.split(/\s+/).length >= 3) c.fraseDita = ditas.replace(/^./, (x) => x.toUpperCase()).replace(/[,;]$/, '.');
|
|
1384
|
+
} catch { /* fica o trecho pedido */ }
|
|
1385
|
+
const dur = ate - de + 0.45; // um respiro curto depois da última palavra
|
|
1386
|
+
const saida = path.join(p.pasta, 'midia', `depo-${path.basename(c.src, path.extname(c.src))}-${Math.round(de)}.mp4`);
|
|
1387
|
+
const r = await video.rodar(video.ffmpeg(), ['-y', '-ss', String(de), '-t', String(dur), '-i', origem,
|
|
1388
|
+
'-af', `loudnorm=I=-14:TP=-1.5:LRA=9,afade=t=in:d=0.1,afade=t=out:st=${Math.max(0, dur - 0.4).toFixed(2)}:d=0.4`,
|
|
1389
|
+
'-c:v', 'libx264', '-preset', 'veryfast', '-crf', '18', '-c:a', 'aac', '-b:a', '192k', saida], { timeout: 5 * 60000 });
|
|
1390
|
+
if (!r.ok) return {};
|
|
1391
|
+
return { src: path.relative(p.pasta, saida).replace(/\\/g, '/'), de: 0, ate: Math.round((dur - 0.3) * 100) / 100, pronto: true,
|
|
1392
|
+
origem: { src: c.src, de: c.de, ate: c.ate, frase: c.frase }, ...(c.fraseDita ? { frase: c.fraseDita } : {}) };
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
/* O tom de cada estilo, em UMA frase de instrução, em inglês e terminando em
|
|
1396
|
+
dois-pontos, que é a forma que o Gemini TTS entende como instrução e não
|
|
1397
|
+
como fala. Se ainda vazar, o corte de vazamentoNoComeco tira (as palavras
|
|
1398
|
+
ditas antes do roteiro são quase todas daqui). */
|
|
1399
|
+
const DIRECAO_DA_VOZ = {
|
|
1400
|
+
gerativo: 'Read aloud in Brazilian Portuguese as a tech reels narrator: full, warm voice close to the mic, energetic and smiling, no long pauses:',
|
|
1401
|
+
fluido: 'Read aloud in Brazilian Portuguese as a premium product video narrator: confident and close, clean sentences that flow into each other, no ad tone:',
|
|
1402
|
+
personagem: 'Read aloud in Brazilian Portuguese as someone really talking on a podcast: natural and close, never like an announcer:',
|
|
1403
|
+
impacto: 'Read aloud in Brazilian Portuguese as an energetic ad announcer: full voice, strong emphasis on the impact words:',
|
|
1404
|
+
padrao: 'Read aloud in Brazilian Portuguese as a lively tech reels narrator: confident, smiling, emphasis on the words that matter:',
|
|
1405
|
+
};
|
|
1406
|
+
|
|
1407
|
+
/* A narração com cache (a mesma fala, na mesma direção, não é gerada duas vezes). */
|
|
1408
|
+
async function narrarComCache(lista, mp3, { voz, direcao } = {}) {
|
|
1409
|
+
/* 'v3' (11/10): as narrações guardadas com a direção antiga (a que tinha
|
|
1410
|
+
"RÁPIDO" e "contínuas") ficam para trás — reaproveitar uma delas trazia o
|
|
1411
|
+
"Rápido e contínuo." de volta mesmo com a direção nova. */
|
|
1412
|
+
const chave = require('crypto').createHash('sha1').update(JSON.stringify(['v4', lista.map((x) => x.texto), voz || '', direcao || ''])).digest('hex').slice(0, 16);
|
|
1413
|
+
const dir = path.join(os.homedir(), '.primocode', 'studio', 'cache-voz');
|
|
1414
|
+
const cm = path.join(dir, chave + '.mp3'), cj = path.join(dir, chave + '.json');
|
|
1415
|
+
if (fs.existsSync(cm) && fs.existsSync(cj)) { fs.copyFileSync(cm, mp3); return { ok: true, ...JSON.parse(fs.readFileSync(cj, 'utf8')) }; }
|
|
1416
|
+
// A voz local pedida (voz: 'kokoro'): direto nela, sem gastar a cota do Gemini.
|
|
1417
|
+
if (kokoro.querKokoro(voz)) return kokoro.narrar(lista, mp3, { voz, uv: acharUv() });
|
|
1418
|
+
// O VoiceStudio local primeiro (15/10); fechado ou falhando, o Gemini.
|
|
1419
|
+
let v = await narrarComVoiceStudio(lista, mp3, { voz });
|
|
1420
|
+
if (!v.ok) v = await narrarComGemini(lista, mp3, { voz, direcao });
|
|
1421
|
+
if (v.ok) { try { fs.mkdirSync(dir, { recursive: true }); fs.copyFileSync(mp3, cm); fs.writeFileSync(cj, JSON.stringify({ voz: v.voz, segundos: v.segundos, partes: v.partes })); } catch { /* sem cache */ } }
|
|
1422
|
+
return v;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
/* A PRODUÇÃO (producao.js): cada necessidade — voz, trilha, efeitos — pela
|
|
1426
|
+
corrente de provedores dela, com o cache do projeto. `roteiro.provedores`
|
|
1427
|
+
({ voz: 'kokoro' }) passa um provedor para a frente, e o caderno guarda
|
|
1428
|
+
quem produziu cada coisa. */
|
|
1429
|
+
async function produzirNecessidade(p, roteiro, pedido, provedores) {
|
|
1430
|
+
const r = await producao.produzirUma(pedido, provedores, { escolha: ((roteiro && roteiro.provedores) || {})[pedido.tipo], cache: producao.cacheDe(p.pasta) });
|
|
1431
|
+
projeto.anotar(p.id, 'producao', producao.linhaCaderno(r), { necessidade: pedido.tipo, provedor: r.quem || null, cache: !!r.doCache });
|
|
1432
|
+
return r;
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
/* A voz como provedores, na ordem do kokoro.ordem: o Gemini (com o cache e a
|
|
1436
|
+
direção dele), o Kokoro local e o Edge. A falha de uma passa para a próxima. */
|
|
1437
|
+
function provedoresDeVoz(lista, mp3, arq, voz, vozEdge, { soEdge = false, gemini, escolha } = {}) {
|
|
1438
|
+
const todos = {
|
|
1439
|
+
voicestudio: () => narrarComVoiceStudio(lista, mp3, { voz }),
|
|
1440
|
+
gemini: () => gemini(),
|
|
1441
|
+
kokoro: () => kokoro.narrar(lista, mp3, { voz, uv: acharUv() }),
|
|
1442
|
+
edge: () => {
|
|
1443
|
+
// Ritmo NORMAL: o "citação" (-10%, respiro longo) esticou o vídeo para 125 s.
|
|
1444
|
+
if (!fs.existsSync(arq)) fs.writeFileSync(arq, JSON.stringify(lista.map((x) => ({ ...x, registro: 'normal' }))));
|
|
1445
|
+
return narrarReserva(lista, mp3, arq, voz, vozEdge, { soEdge: true });
|
|
1446
|
+
},
|
|
1447
|
+
};
|
|
1448
|
+
const comResultado = (f) => async () => { const v = await f(); return v && v.ok ? { ...v, arquivo: mp3 } : v; };
|
|
1449
|
+
const ordem = kokoro.ordem(voz, process.env, { soEdge });
|
|
1450
|
+
// A escolhida no roteiro entra mesmo fora da ordem (o produzirUma a põe na frente).
|
|
1451
|
+
if (escolha && todos[escolha] && !ordem.includes(escolha)) ordem.push(escolha);
|
|
1452
|
+
return ordem.map((nome) => ({ nome, gerar: comResultado(todos[nome]) }));
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
/* A VOZ DE RESERVA, quando o Gemini falha: o Kokoro (local, sem cota) e
|
|
1456
|
+
depois o Edge. A falha de uma passa para a próxima, nunca derruba. */
|
|
1457
|
+
function narrarReserva(lista, mp3, arq, voz, vozEdge, { soEdge = false, semKokoro = false } = {}) {
|
|
1458
|
+
const passos = kokoro.ordem(voz, process.env, { soEdge }).filter((n) => n !== 'gemini' && n !== 'voicestudio' && !(semKokoro && n === 'kokoro'));
|
|
1459
|
+
return kokoro.corrente(passos, {
|
|
1460
|
+
kokoro: () => kokoro.narrar(lista, mp3, { voz, uv: acharUv() }),
|
|
1461
|
+
edge: () => rodarPython('narrar.py', ['roteiro', '--arquivo', arq, '--saida', mp3, '--voz', kokoro.vozNoEdge(voz, vozEdge)], { timeout: 10 * 60000 }),
|
|
1462
|
+
});
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
/* DUAS VOZES (falantes.js): os mp3 de cada falante, um depois do outro, num
|
|
1466
|
+
arquivo só — reamostrados, porque o Gemini sai a 24 kHz e o Edge não. A
|
|
1467
|
+
duração de cada um é MEDIDA: é ela que empurra os tempos do grupo seguinte. */
|
|
1468
|
+
async function juntarVozes(arquivos, mp3) {
|
|
1469
|
+
const fil = arquivos.map((_, i) => `[${i}:a]aresample=44100,aformat=channel_layouts=mono[a${i}]`).join(';')
|
|
1470
|
+
+ ';' + arquivos.map((_, i) => `[a${i}]`).join('') + `concat=n=${arquivos.length}:v=0:a=1[s]`;
|
|
1471
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', ...arquivos.flatMap((a) => ['-i', a]), '-filter_complex', fil, '-map', '[s]',
|
|
1472
|
+
'-c:a', 'libmp3lame', '-q:a', '3', mp3], { timeout: 120000 });
|
|
1473
|
+
if (!c.ok) return { ok: false, error: 'não consegui juntar as vozes' };
|
|
1474
|
+
const duracoes = [];
|
|
1475
|
+
for (const a of arquivos) duracoes.push((await video.medir(a)).segundos);
|
|
1476
|
+
return { ok: true, duracoes };
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
/* A MÚSICA TEM LETRA? O acervo não diz se a faixa é instrumental, então ela
|
|
1480
|
+
é ouvida: 25 s do meio vão para a transcrição, e mais de 6 palavras é voz
|
|
1481
|
+
cantada. Sem servidor para ouvir, a faixa passa (melhor música que nenhuma). */
|
|
1482
|
+
async function temLetra(arquivo) {
|
|
1483
|
+
try {
|
|
1484
|
+
const m = await video.medir(arquivo);
|
|
1485
|
+
const ini = Math.max(0, (m.segundos || 60) * 0.35);
|
|
1486
|
+
const amostra = arquivo.replace(/\.[a-z0-9]+$/i, '') + '.amostra.mp3';
|
|
1487
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-ss', String(ini), '-t', '25', '-i', arquivo, '-ac', '1', '-ar', '16000', '-b:a', '32k', amostra], { timeout: 60000 });
|
|
1488
|
+
if (!c.ok) return false;
|
|
1489
|
+
const cfg = require('../../config/config').loadConfig();
|
|
1490
|
+
const r = await require('../../provider/api').requestTranscricao(cfg.server, { token: cfg.token, audio: fs.readFileSync(amostra).toString('base64'), nome: 'musica.mp3', idioma: 'en' });
|
|
1491
|
+
try { fs.unlinkSync(amostra); } catch { /* fica */ }
|
|
1492
|
+
const palavras = (r && r.palavras ? r.palavras.length : String((r && r.texto) || '').split(/\s+/).filter(Boolean).length);
|
|
1493
|
+
return palavras > 6;
|
|
1494
|
+
} catch { return false; }
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
/* OS SONS DE VERDADE: gravação real de acervo aberto (teclado, whoosh
|
|
1498
|
+
cinematográfico, impacto grave, som de sala), e o sintetizado só quando a
|
|
1499
|
+
busca falha. "Esses efeitos sonoros estão genéricos e sem impacto."
|
|
1500
|
+
(25/09/2026) */
|
|
1501
|
+
async function sonsReais(p, video) {
|
|
1502
|
+
const sint = await edicao.prepararSons(p.pasta, video);
|
|
1503
|
+
/* Termo sorteado e resultado sorteado, sem repetir os últimos: o primeiro
|
|
1504
|
+
resultado do termo fixo era o mesmo whoosh em todo vídeo (02/10). */
|
|
1505
|
+
const sons = { ...sint };
|
|
1506
|
+
for (const nome of ['teclado', 'whoosh', 'impacto', 'sala']) {
|
|
1507
|
+
for (const termo of variedade.termosSfx(nome)) {
|
|
1508
|
+
if (sons[nome] !== sint[nome]) break;
|
|
1509
|
+
try {
|
|
1510
|
+
const b = await assets.procurarSom(termo, { quantas: 10, livre: true });
|
|
1511
|
+
for (const item of variedade.ordenar(b.ok ? b.sons : [], 'sfx').slice(0, 3)) {
|
|
1512
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'sfx-real-' + nome });
|
|
1513
|
+
if (d.ok) { sons[nome] = d.relativo; variedade.marcar('sfx', item.url); break; }
|
|
1514
|
+
}
|
|
1515
|
+
} catch { /* o próximo termo */ }
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
return sons;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
const PROPORCOES = { '16:9': [1920, 1080], '9:16': [1080, 1920], '1:1': [1080, 1080], '4:5': [1080, 1350] };
|
|
1522
|
+
/* A proporção que o PEDIDO disse (14/10: "vertical 9:16" saiu deitado, porque
|
|
1523
|
+
só valia a proporção que o modelo passasse). A do modelo ainda manda. */
|
|
1524
|
+
function proporcaoDoPedido(pedido) {
|
|
1525
|
+
const t = String(pedido || '');
|
|
1526
|
+
if (/\b9\s*[:x×]\s*16\b|\bvertical\b|\breels?\b|\bstor(y|ies)\b|\btik\s?tok\b|\bshorts\b/i.test(t)) return '9:16';
|
|
1527
|
+
if (/\b4\s*[:x×]\s*5\b/.test(t)) return '4:5';
|
|
1528
|
+
if (/\b1\s*[:x×]\s*1\b|\bquadrad[oa]\b/i.test(t)) return '1:1';
|
|
1529
|
+
return null;
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
/** O roteiro vira plano: baixa o que falta, narra, e chama o compositor. */
|
|
1533
|
+
/* A ASSINATURA (assinatura.js): o vídeo é medido e conferido contra as
|
|
1534
|
+
faixas do estilo; o que saiu volta para o agente e fica no caderno. */
|
|
1535
|
+
function conferirAssinatura(p, r, nome) {
|
|
1536
|
+
const fora = assinatura.descrever(assinatura.conferir(nome, assinatura.medir(r.partitura, r.plano)).fora);
|
|
1537
|
+
r.resumo.assinatura = { nome, seguiu: !fora.length, fora: fora.length ? fora : undefined };
|
|
1538
|
+
projeto.anotar(p.id, 'assinatura', fora.length ? `fora da assinatura ${nome}: ${fora.join('; ')}` : `seguiu a assinatura ${nome}`);
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
/* A REFERÊNCIA VISUAL que a pessoa manda (13/10: "não usa as referências
|
|
1542
|
+
que mandei" — era o print da landing, arrastado no pedido). O agente não
|
|
1543
|
+
enxerga imagem; aqui ela entra no projeto, as cores saem pelo ffmpeg e, se o
|
|
1544
|
+
projeto ainda não tem marca, viram a marca. Com site, o site manda. */
|
|
1545
|
+
function importarReferencia(p, arquivo) {
|
|
1546
|
+
const orig = String(arquivo || '').trim().replace(/^file:\/\//, '');
|
|
1547
|
+
if (!orig || !fs.existsSync(orig)) return { ok: false, error: 'mande em "arquivo" o caminho da imagem de referência.' };
|
|
1548
|
+
const nome = path.basename(orig).normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^\w.-]+/g, '-');
|
|
1549
|
+
const destino = path.join(p.pasta, 'midia', 'referencias', nome);
|
|
1550
|
+
fs.mkdirSync(path.dirname(destino), { recursive: true });
|
|
1551
|
+
fs.copyFileSync(orig, destino);
|
|
1552
|
+
const rel = path.relative(p.pasta, destino).replace(/\\/g, '/');
|
|
1553
|
+
const cores = marcaLib.coresDaImagem(destino);
|
|
1554
|
+
const temMarca = !!(p.marca && Object.keys(marcaLib.marcaEmObjeto(p.marca).cores || {}).length);
|
|
1555
|
+
const salvar = { referencias: [...(p.referencias || []).filter((x) => x.src !== rel), { src: rel, cores, de: orig }] };
|
|
1556
|
+
if (!temMarca && cores.length) salvar.marca = { ...(p.marca || {}), ...marcaLib.marcaEmObjeto({ cores }) };
|
|
1557
|
+
projeto.salvar(p.id, salvar);
|
|
1558
|
+
projeto.anotar(p.id, 'referencia', `imagem ${rel}: ${cores.join(' ') || 'sem cor'}${temMarca ? '' : ' (virou a marca)'}`);
|
|
1559
|
+
return {
|
|
1560
|
+
ok: true, src: rel, cores, viraMarca: !temMarca && cores.length > 0,
|
|
1561
|
+
comoUsar: (temMarca ? 'O projeto já tem a marca do site: ela manda nas cores; a referência guia o JEITO (composição, peso, o que aparece). '
|
|
1562
|
+
: 'Estas cores viraram a marca do projeto. ')
|
|
1563
|
+
+ 'Se a imagem é print do site ou do produto, o vídeo mostra a tela de verdade (estudio_midia acao:"print" e a peça printsite).',
|
|
1564
|
+
};
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
async function prepararRoteiro(p, args) {
|
|
1568
|
+
const roteiro = typeof args.roteiro === 'string' ? JSON.parse(args.roteiro) : args.roteiro;
|
|
1569
|
+
// O mesmo args (não uma cópia): o __semNarracao e o __cenasQuebradas voltam para quem chamou.
|
|
1570
|
+
if (Array.isArray(roteiro)) { args.roteiro = { partes: roteiro }; return prepararRoteiro(p, args); }
|
|
1571
|
+
/* O que o modelo manda e o disco não tem vira problema de render: um
|
|
1572
|
+
"src" que é endereço da internet vira busca, e um arquivo que não
|
|
1573
|
+
existe na pasta sai. A logo da marca vale só se estiver lá. */
|
|
1574
|
+
const existe = (rel) => rel && !/^https?:/i.test(rel) && fs.existsSync(path.resolve(p.pasta, rel));
|
|
1575
|
+
for (const pt of roteiro.partes || []) {
|
|
1576
|
+
if (pt.src && !existe(pt.src)) { if (!pt.busca && /^https?:/i.test(pt.src)) pt.busca = pt.titulo || ''; delete pt.src; }
|
|
1577
|
+
}
|
|
1578
|
+
/* A CENA QUE A IA ESCREVEU (parte.componente): ela escreve na pasta de
|
|
1579
|
+
trabalho, e o Remotion só lê o que está no projeto. O arquivo é copiado
|
|
1580
|
+
para componentes/ do projeto; se não existe, a parte fica no estilo da
|
|
1581
|
+
casa (e o caderno diz por quê), em vez de o render quebrar. */
|
|
1582
|
+
for (const pt of roteiro.partes || []) {
|
|
1583
|
+
if (!pt || typeof pt.componente !== 'string' || !pt.componente.trim()) continue;
|
|
1584
|
+
const pedido = pt.componente.trim();
|
|
1585
|
+
const achado = [path.resolve(p.pasta, pedido), args.__pasta && path.resolve(args.__pasta, pedido), path.isAbsolute(pedido) && pedido]
|
|
1586
|
+
.find((f) => f && fs.existsSync(f) && /\.(jsx|tsx|js)$/i.test(f));
|
|
1587
|
+
if (!achado) { projeto.anotar(p.id, 'plano', `componente ${pedido} não existe: a parte ficou no estilo da casa`); delete pt.componente; continue; }
|
|
1588
|
+
const dentro = path.resolve(p.pasta) + path.sep;
|
|
1589
|
+
if (!achado.startsWith(dentro)) {
|
|
1590
|
+
const destino = path.join(p.pasta, 'componentes', path.basename(achado));
|
|
1591
|
+
fs.mkdirSync(path.dirname(destino), { recursive: true });
|
|
1592
|
+
fs.copyFileSync(achado, destino);
|
|
1593
|
+
pt.componente = path.relative(p.pasta, destino).replace(/\\/g, '/');
|
|
1594
|
+
} else pt.componente = path.relative(p.pasta, achado).replace(/\\/g, '/');
|
|
1595
|
+
// A cena quebrada não derruba o vídeo: sai, a parte fica no gerativo, e o erro volta para a IA (cena.js).
|
|
1596
|
+
const conf = conferirCena(path.join(p.pasta, pt.componente));
|
|
1597
|
+
if (!conf.ok) {
|
|
1598
|
+
(args.__cenasQuebradas = args.__cenasQuebradas || []).push({ componente: pt.componente, erro: conf.erro });
|
|
1599
|
+
projeto.anotar(p.id, 'plano', `componente ${pt.componente} quebrado (${conf.erro}): a parte ficou no gerativo`);
|
|
1600
|
+
delete pt.componente;
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
// As imagens do pedido (o terminal guardou em referencias.imagens) entram sozinhas, uma vez por projeto.
|
|
1604
|
+
const jaTem = new Set((p.referencias || []).map((x) => x.de));
|
|
1605
|
+
const novas = referencias.imagens().filter((f) => !jaTem.has(f));
|
|
1606
|
+
for (const f of novas) { try { importarReferencia(p, f); } catch (e) { projeto.anotar(p.id, 'referencia', `não importou ${path.basename(f)}: ${e.message}`); } }
|
|
1607
|
+
if (novas.length) p = projeto.ler(p.id) || p;
|
|
1608
|
+
/* O KIT DE MARCA ativo (lib/plugin/marca-kit.js) vale mais que a marca lida do
|
|
1609
|
+
site: a pessoa criou uma vez e quer em todo vídeo. O roteiro ainda ganha. */
|
|
1610
|
+
const kitM = marcaKit.preencher({}, { pastas: [p.pasta, process.cwd()] });
|
|
1611
|
+
if (kitM.kit) { p = { ...p, marca: kitM }; }
|
|
1612
|
+
if (roteiro.marca) {
|
|
1613
|
+
/* A do roteiro por cima da do site, CAMPO A CAMPO: antes o "cores" em
|
|
1614
|
+
lista do agente apagava o {fundo, destaque} lido do site (13/10). */
|
|
1615
|
+
const site = marcaLib.marcaEmObjeto(p.marca), dele = marcaLib.marcaEmObjeto(roteiro.marca);
|
|
1616
|
+
roteiro.marca = { ...site, ...dele, cores: { ...(site.cores || {}), ...(dele.cores || {}) }, fontes: { ...(site.fontes || {}), ...(dele.fontes || {}) } };
|
|
1617
|
+
if (roteiro.marca.logo && !existe(roteiro.marca.logo)) roteiro.marca.logo = (p.marca && existe(p.marca.logo)) ? p.marca.logo : undefined;
|
|
1618
|
+
} else if (p.marca) roteiro.marca = p.marca;
|
|
1619
|
+
const partes = roteiro.partes || [];
|
|
1620
|
+
/* O ESTILO (estilo.js). O padrão é MOTION (motion.js): um plano contínuo
|
|
1621
|
+
em 3D — "isso sim é motion" (Joel, 28/09). Explicação vira VOX
|
|
1622
|
+
(editorial, tinta sobre papel), marca vira MARCA (brand reveal),
|
|
1623
|
+
lançamento de produto vira LANCAMENTO, anúncio e reels vão para o
|
|
1624
|
+
IMPACTO. O que o agente pediu vale mais que tudo. */
|
|
1625
|
+
const pedidoTxt = `${p.pedido || ''} ${args.pedido || ''}`;
|
|
1626
|
+
const ref = referencias.atual();
|
|
1627
|
+
/* Sem imagem é o padrão (07/10): sem o pedido dizer, nada de foto nem
|
|
1628
|
+
vídeo de fora. Ninguém escolheu o estilo? Ele gira (estilo.js) — sem
|
|
1629
|
+
imagem, só entre os que não vivem de foto. O híbrido e o cinema, pedidos
|
|
1630
|
+
pelo nome sem imagem, caem para o gerativo (sem nada baixado). */
|
|
1631
|
+
const semImagem = referencias.semImagem(ref);
|
|
1632
|
+
let estilo = escolherEstilo({ pedido: pedidoTxt, agente: args.estilo, roteiro: roteiro.estilo, girar: true, semImagem });
|
|
1633
|
+
if (semImagem && (estilo === 'hibrido' || estilo === 'cinema')) estilo = 'gerativo';
|
|
1634
|
+
/* SEM NARRAÇÃO (14/10, "só o motion e os efeitos sonoros, os barulhinhos"):
|
|
1635
|
+
roteiro.semNarracao ou o pedido. O cinema e o híbrido vivem da voz: caem no gerativo. */
|
|
1636
|
+
const semVoz = semNarracao.ativo(roteiro, pedidoTxt);
|
|
1637
|
+
if (semVoz && (estilo === 'hibrido' || estilo === 'cinema')) estilo = 'gerativo';
|
|
1638
|
+
/* "O vídeo deve ter um 3D do fone" (30/09): pedido de 3D vira o gerativo
|
|
1639
|
+
com o produto modelado girando numa batida (kit/tres.jsx) — a menos que
|
|
1640
|
+
o agente tenha escolhido outro estilo pelo nome. */
|
|
1641
|
+
if (/\b3\s?d\b|tridimensional/i.test(pedidoTxt) && estilo !== 'personagem' && (!args.estilo || estilo === 'gerativo' || estilo === 'lancamento')) {
|
|
1642
|
+
// O 3D mora numa batida do gerativo; o lançamento antigo, só pelo nome.
|
|
1643
|
+
if (!args.estilo && estilo !== 'lancamento') estilo = 'gerativo';
|
|
1644
|
+
if (!roteiro.modelo3d) roteiro.modelo3d = variacao3d.modeloDoPedido(pedidoTxt);
|
|
1645
|
+
}
|
|
1646
|
+
// O bicho do vídeo 3D não fala com voz de gente (a menos que o pedido peça): sai da narração e fica na cena.
|
|
1647
|
+
if (estilo === 'personagem') {
|
|
1648
|
+
const calados = personagem.calarBichos(roteiro, pedidoTxt);
|
|
1649
|
+
if (calados.length) projeto.anotar(p.id, 'plano', `sem fala (bicho): ${calados.map((c) => `${c.nome} (${c.especie})`).join(', ')} — fica na cena; para falar, peça "${calados[0].especie} falante"`);
|
|
1650
|
+
}
|
|
1651
|
+
// O 3D de cada vídeo: acabamento, câmera, luz e ritmo sorteados sem repetir os últimos.
|
|
1652
|
+
/* Por PROJETO, não por chamada: mandar o roteiro de novo para ajustar uma
|
|
1653
|
+
frase não pode sortear outro 3D nem outro vídeo. Projeto novo, sorteio novo. */
|
|
1654
|
+
if (roteiro.modelo3d && !roteiro.variacao3d) {
|
|
1655
|
+
roteiro.variacao3d = p.variacao3d || variacao3d.escolherVariacao3d();
|
|
1656
|
+
if (!p.variacao3d) projeto.salvar(p.id, { variacao3d: roteiro.variacao3d });
|
|
1657
|
+
}
|
|
1658
|
+
/* A SEMENTE do gerativo saía do texto do roteiro: o mesmo roteiro dava o
|
|
1659
|
+
mesmo vídeo, batida por batida (05/10). Sem semente do roteiro, cada
|
|
1660
|
+
projeto sorteia a sua. */
|
|
1661
|
+
if (estilo === 'gerativo' && roteiro.semente == null) {
|
|
1662
|
+
roteiro.semente = p.semente != null ? p.semente : Math.floor(Math.random() * 1e9);
|
|
1663
|
+
if (p.semente == null) projeto.salvar(p.id, { semente: roteiro.semente });
|
|
1664
|
+
}
|
|
1665
|
+
/* O humor, a paleta, as fontes e o gênero do gerativo, com memória entre
|
|
1666
|
+
vídeos (09/10, "vício em cores, músicas, fontes"): por PROJETO, como a semente. */
|
|
1667
|
+
// O assunto do vídeo é o rótulo da moldura (quando ela sai): o título do projeto.
|
|
1668
|
+
if (estilo === 'gerativo' && !roteiro.titulo && p.titulo) roteiro.titulo = p.titulo;
|
|
1669
|
+
// O estilo que a IA montou (estilos.js) vence o sorteio e o que o projeto tinha guardado.
|
|
1670
|
+
if (estilo === 'gerativo' && roteiro.estiloVisual && !roteiro.escolhasGerativo) {
|
|
1671
|
+
const r = estilos.montar(roteiro.estiloVisual, roteiro);
|
|
1672
|
+
roteiro.escolhasGerativo = r.escolhas;
|
|
1673
|
+
projeto.salvar(p.id, { escolhasGerativo: r.escolhas });
|
|
1674
|
+
if (r.avisos.length) projeto.anotar(p.id, 'estilo', r.avisos.join(' · '));
|
|
1675
|
+
}
|
|
1676
|
+
if (estilo === 'gerativo' && !roteiro.escolhasGerativo) {
|
|
1677
|
+
roteiro.escolhasGerativo = p.escolhasGerativo || gerativo.escolherVisual(roteiro);
|
|
1678
|
+
if (!p.escolhasGerativo) projeto.salvar(p.id, { escolhasGerativo: roteiro.escolhasGerativo });
|
|
1679
|
+
}
|
|
1680
|
+
/* O ESTILO DA CASA (13/10, o primocode-ele-constroi.mp4 que o Joel aprovou):
|
|
1681
|
+
chão escuro com brilho, frase média, palavra que entra desfocando, Inter
|
|
1682
|
+
e JetBrains Mono. Vale para o vídeo de TECNOLOGIA (o do PrimoCode) quando
|
|
1683
|
+
a IA não montou estilo: em todo vídeo, a padaria saía igual — "animações
|
|
1684
|
+
tudo igual, cores sempre as mesmas, sem ícones" (14/10). */
|
|
1685
|
+
const casa = estilo === 'gerativo' && !roteiro.estiloVisual && (roteiro.escolhasGerativo || {}).humor === 'tecnologia';
|
|
1686
|
+
if (casa && !/\bfontes?\b|tipografia|\bserifa/i.test(pedidoTxt)) {
|
|
1687
|
+
roteiro.marca = { ...(roteiro.marca || {}), fontes: { titulo: 'Inter', texto: 'JetBrains Mono' } };
|
|
1688
|
+
}
|
|
1689
|
+
if (casa) roteiro.casa = true;
|
|
1690
|
+
if (ref.modo === 'fechado' && !roteiro.busca && referencias.termos().length) roteiro.busca = referencias.termos();
|
|
1691
|
+
/* A BIBLIOTECA (biblioteca.js): sem fonte e cor da marca, o híbrido, o
|
|
1692
|
+
cinema e o impacto caíam sempre no Inter e no azul e roxo — "os vídeos
|
|
1693
|
+
todos iguais" (02/10). A marca manda; depois o roteiro.visual da IA;
|
|
1694
|
+
sem nada, o sorteio que pula o que os últimos vídeos usaram. */
|
|
1695
|
+
if (['hibrido', 'cinema', 'impacto'].includes(estilo)) {
|
|
1696
|
+
const v = biblioteca.vestir(roteiro, { estilo });
|
|
1697
|
+
if (v.mudou) projeto.anotar(p.id, 'visual', [v.titulo && `fonte ${v.titulo} + ${v.texto} (tom ${v.tom})`, v.paleta && `paleta ${v.paleta}`].filter(Boolean).join(', '));
|
|
1698
|
+
}
|
|
1699
|
+
// Os estilos de motion usam os efeitos leves e a trilha do ende.app; os de corte, os cheios.
|
|
1700
|
+
const ehMotion = LEVES.has(estilo);
|
|
1701
|
+
const modo = (args.modo || roteiro.modo || (p.formato === 'slides' || p.formato === 'arte' ? 'slides' : 'video'));
|
|
1702
|
+
const [largura, altura] = PROPORCOES[roteiro.proporcao || args.proporcao] || (modo === 'video' && PROPORCOES[proporcaoDoPedido(p.pedido)]) || PROPORCOES['16:9'];
|
|
1703
|
+
|
|
1704
|
+
const iconesOk = new Set();
|
|
1705
|
+
for (const nome of composicao.iconesDoRoteiro(roteiro)) {
|
|
1706
|
+
try { const r = await assets.icone(nome); if (r && r.ok) iconesOk.add(nome); } catch { /* sem */ }
|
|
1707
|
+
}
|
|
1708
|
+
/* O ACERVO DA MARCA (guardado pelo estudio_site): as fotos reais entram
|
|
1709
|
+
nas partes de imagem e de FUNDO nas cenas de texto; os vídeos, nas
|
|
1710
|
+
partes de imagem do vídeo. A foto escolhida é a que mais combina, pela
|
|
1711
|
+
descrição, com o que a parte diz. Sem acervo, vale a busca (Pexels). */
|
|
1712
|
+
const acervo = (p.acervo && (p.acervo.fotos || []).length) ? p.acervo : { fotos: [], videos: [] };
|
|
1713
|
+
const usadas = new Set();
|
|
1714
|
+
const palavrasDe = (t) => new Set(String(t || '').normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase().split(/[^a-z0-9]+/).filter((w) => w.length >= 4));
|
|
1715
|
+
const melhorFoto = (texto) => {
|
|
1716
|
+
const quer = palavrasDe(texto);
|
|
1717
|
+
let melhor = null, pontos = -1;
|
|
1718
|
+
for (const f of acervo.fotos) {
|
|
1719
|
+
if (usadas.has(f.src)) continue;
|
|
1720
|
+
const n = [...palavrasDe(f.alt)].filter((w) => quer.has(w)).length;
|
|
1721
|
+
if (n > pontos) { melhor = f; pontos = n; }
|
|
1722
|
+
}
|
|
1723
|
+
if (melhor) usadas.add(melhor.src);
|
|
1724
|
+
return melhor ? { src: melhor.src, tipo: 'imagem' } : null;
|
|
1725
|
+
};
|
|
1726
|
+
const videosMarca = [...(acervo.videos || [])];
|
|
1727
|
+
const imagens = {}, fundos = {};
|
|
1728
|
+
for (const [i, parte] of partes.entries()) {
|
|
1729
|
+
if (semImagem || parte.tipo !== 'imagem' || parte.src) continue;
|
|
1730
|
+
const texto = `${parte.titulo || ''} ${parte.sub || ''} ${parte.fala || ''} ${parte.busca || ''}`;
|
|
1731
|
+
if (modo === 'video' && videosMarca.length && i % 2 === 1) { imagens[i] = { src: videosMarca.shift().src, tipo: 'video' }; continue; }
|
|
1732
|
+
const m = melhorFoto(texto) || (parte.busca ? await baixarApoio(p, parte.busca, { orientacao: largura >= altura ? 'landscape' : 'portrait', video: modo === 'video' }) : null);
|
|
1733
|
+
if (m) imagens[i] = m;
|
|
1734
|
+
}
|
|
1735
|
+
if (acervo.fotos.length && !semImagem) {
|
|
1736
|
+
const comFundo = ['abertura', 'titulo', 'contraste', 'citacao', 'cta', 'passos'];
|
|
1737
|
+
let alterna = 0;
|
|
1738
|
+
for (const [i, parte] of partes.entries()) {
|
|
1739
|
+
if (!comFundo.includes(parte.tipo)) continue;
|
|
1740
|
+
if (i !== 0 && alterna++ % 2 === 1) continue; // uma sim, uma não: o respiro também é ritmo
|
|
1741
|
+
const m = melhorFoto(`${parte.titulo || ''} ${parte.sim || ''} ${parte.fala || ''}`);
|
|
1742
|
+
if (m) fundos[i] = m;
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1746
|
+
let tempos = [], narracao = null, sons = {}, trilha = null;
|
|
1747
|
+
/* O HÍBRIDO (hibrido.js) é o cinema com o kit por cima: o roteiro de
|
|
1748
|
+
qualquer estilo vira os tipos do cinema aqui, antes da voz — a voz lê
|
|
1749
|
+
o que o cinema vai mostrar. */
|
|
1750
|
+
let hib = null;
|
|
1751
|
+
if (modo === 'video' && estilo === 'hibrido') {
|
|
1752
|
+
hib = hibrido.traduzir(roteiro);
|
|
1753
|
+
partes.splice(0, partes.length, ...hib.roteiro.partes);
|
|
1754
|
+
}
|
|
1755
|
+
if (modo === 'video' && (estilo === 'cinema' || estilo === 'hibrido')) {
|
|
1756
|
+
// Só as partes com voz vão para a narração; o depoimento tem a voz do aluno.
|
|
1757
|
+
// Só as partes com voz: o depoimento tem a voz do aluno, e a parte muda não tem voz.
|
|
1758
|
+
// A parte com voz forte é narrada à parte: se entrasse aqui também, seria falada duas vezes (e muda uma delas).
|
|
1759
|
+
const comVoz = partes.filter((pt) => pt.tipo !== 'depoimento' && cinema.falaDe(pt) !== '' && !pt.falaForte);
|
|
1760
|
+
const lista = comVoz.map((pt) => ({ texto: cinema.falaDe(pt), registro: 'normal' }));
|
|
1761
|
+
// Duas vozes: a voz de cada parte pelo falante dela (roteiro.vozes).
|
|
1762
|
+
const vozesL = falantes.vozesDasPartes(comVoz, roteiro, args.voz || roteiro.voz);
|
|
1763
|
+
const variasVozes = new Set(vozesL).size > 1;
|
|
1764
|
+
const DIRECAO_CINEMA = 'Leia em português do Brasil como narrador de trailer de marca premium: voz grave, confiante e humana, '
|
|
1765
|
+
+ 'ritmo firme, pausas curtas entre as frases, sem arrastar.';
|
|
1766
|
+
const mp3 = path.join(p.pasta, 'midia', `narracao-${Date.now().toString(36)}.mp3`);
|
|
1767
|
+
/* O CACHE DA VOZ: a mesma fala, na mesma voz, não é gerada duas vezes.
|
|
1768
|
+
Refazer o roteiro em outro formato, ou mexer numa cena, não gasta a
|
|
1769
|
+
cota do Gemini — que acaba no meio do dia (medido em 25/09). */
|
|
1770
|
+
const chaveVoz = require('crypto').createHash('sha1').update(JSON.stringify([lista.map((x) => x.texto), args.voz || roteiro.voz || '', 'cinema-v1'])).digest('hex').slice(0, 16);
|
|
1771
|
+
const cacheDir = path.join(os.homedir(), '.primocode', 'studio', 'cache-voz');
|
|
1772
|
+
const cacheMp3 = path.join(cacheDir, chaveVoz + '.mp3'), cacheJson = path.join(cacheDir, chaveVoz + '.json');
|
|
1773
|
+
let v = null;
|
|
1774
|
+
// motorVoz "edge": a voz do Edge direto, sem esperar a cota do Gemini ("a narração pode manter a do Edge", 25/09).
|
|
1775
|
+
const soEdge = String(roteiro.motorVoz || args.motorVoz || '').toLowerCase() === 'edge';
|
|
1776
|
+
if (variasVozes) {
|
|
1777
|
+
/* Um grupo por falante, cada um com a sua voz e o seu cache (a chave
|
|
1778
|
+
do narrarComCache leva a voz). Falhou? Fica anotado, e a reserva
|
|
1779
|
+
de baixo narra numa voz só — melhor o vídeo do que nada. */
|
|
1780
|
+
v = await falantes.narrarPorFalante(lista.map((x, i) => ({ ...x, voz: vozesL[i] })), mp3, { juntar: juntarVozes,
|
|
1781
|
+
narrarUm: async (l, m, voz) => {
|
|
1782
|
+
const g = soEdge ? { ok: false } : await narrarComCache(l, m, { voz, direcao: DIRECAO_CINEMA });
|
|
1783
|
+
if (g.ok) return g;
|
|
1784
|
+
const a = m.replace(/\.mp3$/, '.json');
|
|
1785
|
+
fs.writeFileSync(a, JSON.stringify(l));
|
|
1786
|
+
return narrarReserva(l, m, a, voz, 'antonio', { soEdge });
|
|
1787
|
+
} });
|
|
1788
|
+
if (!v.ok) projeto.anotar(p.id, 'narracao', `as duas vozes falharam (${v.error}); saiu numa voz só`);
|
|
1789
|
+
if (!v.ok) {
|
|
1790
|
+
const arq = path.join(p.pasta, 'midia', `roteiro-${Date.now().toString(36)}.json`);
|
|
1791
|
+
fs.writeFileSync(arq, JSON.stringify(lista.map((x) => ({ ...x, registro: 'normal' }))));
|
|
1792
|
+
v = await narrarReserva(lista, mp3, arq, args.voz || roteiro.voz, 'antonio', { soEdge });
|
|
1793
|
+
}
|
|
1794
|
+
} else {
|
|
1795
|
+
const arq = path.join(p.pasta, 'midia', `roteiro-${Date.now().toString(36)}.json`);
|
|
1796
|
+
const gemini = async () => {
|
|
1797
|
+
if (fs.existsSync(cacheMp3) && fs.existsSync(cacheJson)) {
|
|
1798
|
+
fs.copyFileSync(cacheMp3, mp3);
|
|
1799
|
+
const g = { ok: true, ...JSON.parse(fs.readFileSync(cacheJson, 'utf8')), doCache: true };
|
|
1800
|
+
// Cache sem as palavras (vindo de um plano antigo): transcreve de novo e realinha — sem gastar voz.
|
|
1801
|
+
if (!(g.partes || []).some((pt) => (pt.palavras || []).length)) {
|
|
1802
|
+
try {
|
|
1803
|
+
const cfg = require('../../config/config').loadConfig();
|
|
1804
|
+
const tr = await require('../../provider/api').requestTranscricao(cfg.server, { token: cfg.token, audio: fs.readFileSync(mp3).toString('base64'), nome: 'voz.mp3', idioma: 'pt' });
|
|
1805
|
+
if (tr && (tr.palavras || []).length) {
|
|
1806
|
+
g.partes = alinharPartes(lista, tr.palavras, g.segundos);
|
|
1807
|
+
fs.writeFileSync(cacheJson, JSON.stringify({ voz: g.voz, segundos: g.segundos, partes: g.partes }));
|
|
1808
|
+
}
|
|
1809
|
+
} catch { /* fica o alinhamento guardado */ }
|
|
1810
|
+
}
|
|
1811
|
+
return g;
|
|
1812
|
+
}
|
|
1813
|
+
const g = await narrarComGemini(lista, mp3, { voz: args.voz || roteiro.voz, direcao: DIRECAO_CINEMA });
|
|
1814
|
+
if (g.ok) {
|
|
1815
|
+
try { fs.mkdirSync(cacheDir, { recursive: true }); fs.copyFileSync(mp3, cacheMp3); fs.writeFileSync(cacheJson, JSON.stringify({ voz: g.voz, segundos: g.segundos, partes: g.partes })); } catch { /* sem cache */ }
|
|
1816
|
+
}
|
|
1817
|
+
return g;
|
|
1818
|
+
};
|
|
1819
|
+
v = await produzirNecessidade(p, roteiro, { tipo: 'voz', chave: [lista.map((x) => x.texto), args.voz || roteiro.voz || '', 'cinema-v1', soEdge], destino: mp3 },
|
|
1820
|
+
provedoresDeVoz(lista, mp3, arq, args.voz || roteiro.voz, 'antonio', { soEdge, gemini, escolha: (roteiro.provedores || {}).voz }));
|
|
1821
|
+
}
|
|
1822
|
+
if (!v.ok) return v;
|
|
1823
|
+
/* A DURAÇÃO que o roteiro pede ("60–75 s"): se a voz passa do que cabe,
|
|
1824
|
+
ela acelera de leve — até 25%, sem mudar o tom (atempo) — e os tempos
|
|
1825
|
+
de cada parte acompanham. Medido em 25/09: 98 s de voz num vídeo de 70. */
|
|
1826
|
+
const alvo = Number(roteiro.duracao || args.segundos) || 0;
|
|
1827
|
+
let ritmoVoz = 1;
|
|
1828
|
+
if (alvo) {
|
|
1829
|
+
const depo = partes.filter((pt) => pt.tipo === 'depoimento').reduce((n, pt) => n + (pt.clipes || []).reduce((m, c) => m + (c.ate - c.de + 0.3), 0), 0);
|
|
1830
|
+
// A voz forte (narrada à parte) e as partes mudas também ocupam o tempo.
|
|
1831
|
+
const forteEst = partes.filter((pt) => pt.falaForte).reduce((n, pt) => n + cinema.falaDe({ ...pt, fala: undefined }).length / 13 + 1.9, 0);
|
|
1832
|
+
const mudas = partes.filter((pt) => pt.tipo !== 'depoimento' && cinema.falaDe(pt) === '').length * 4;
|
|
1833
|
+
const cabe = Math.max(15, alvo - depo - forteEst - mudas - 0.45 * lista.length);
|
|
1834
|
+
if (v.segundos > cabe * 1.05) {
|
|
1835
|
+
const k = Math.min(1.25, v.segundos / cabe);
|
|
1836
|
+
ritmoVoz = k;
|
|
1837
|
+
const rapido = mp3.replace(/\.mp3$/, '-r.mp3');
|
|
1838
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-i', mp3, '-filter:a', `atempo=${k.toFixed(3)}`, rapido], { timeout: 120000 });
|
|
1839
|
+
if (c.ok) {
|
|
1840
|
+
fs.renameSync(rapido, mp3);
|
|
1841
|
+
const div = (x) => Math.round((x / k) * 1000) / 1000;
|
|
1842
|
+
v.partes = v.partes.map((pt) => ({ de: div(pt.de), ate: div(pt.ate), palavras: (pt.palavras || []).map((w) => ({ ...w, de: div(w.de), ate: div(w.ate) })) }));
|
|
1843
|
+
v.segundos = div(v.segundos);
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
}
|
|
1847
|
+
/* No HÍBRIDO a voz anda um pouco mais rápido por padrão (1,12×, como no
|
|
1848
|
+
vox): o trailer premium do cinema lido pelo Gemini sai no passo de
|
|
1849
|
+
leitura, e o vídeo segue a voz. `roteiro.ritmoVoz` ajusta. */
|
|
1850
|
+
if (hib && ritmoVoz <= 1.01) {
|
|
1851
|
+
const kh = Math.max(1, Math.min(1.5, Number(roteiro.ritmoVoz) || 1.12));
|
|
1852
|
+
const rapido = mp3.replace(/\.mp3$/, '-h.mp3');
|
|
1853
|
+
const c = kh > 1.01 ? await video.rodar(video.ffmpeg(), ['-y', '-i', mp3, '-filter:a', `atempo=${kh.toFixed(3)}`, rapido], { timeout: 120000 }) : { ok: false };
|
|
1854
|
+
if (process.env.PRIMOCODE_TRACO === '1') process.stderr.write(`[traço] voz do híbrido ${kh}× ok=${c.ok} existe=${fs.existsSync(rapido)} ${String(c.erro || '').slice(-120)}\n`);
|
|
1855
|
+
if (c.ok && fs.existsSync(rapido)) {
|
|
1856
|
+
fs.renameSync(rapido, mp3);
|
|
1857
|
+
ritmoVoz = kh;
|
|
1858
|
+
const div = (x) => Math.round((x / kh) * 1000) / 1000;
|
|
1859
|
+
v.partes = v.partes.map((pt) => ({ de: div(pt.de), ate: div(pt.ate), palavras: (pt.palavras || []).map((w) => ({ ...w, de: div(w.de), ate: div(w.ate) })) }));
|
|
1860
|
+
v.segundos = div(v.segundos);
|
|
1861
|
+
}
|
|
1862
|
+
}
|
|
1863
|
+
projeto.anotar(p.id, 'narracao', `${v.segundos}s em ${lista.length} partes, voz ${v.voz}`);
|
|
1864
|
+
/* A chave leva o id do projeto e o hash das falas. Só `cinema` fazia um
|
|
1865
|
+
roteiro novo, no mesmo projeto, reaproveitar os efeitos do anterior. */
|
|
1866
|
+
const marcaSfx = require('crypto').createHash('sha1').update(JSON.stringify({ id: p.id || '', falas: partes.map((pt) => cinema.falaDe(pt)) })).digest('hex').slice(0, 16);
|
|
1867
|
+
const sonsC = (await produzirNecessidade(p, roteiro, { tipo: 'sfx', chave: [p.id || '', marcaSfx] },
|
|
1868
|
+
[{ nome: 'openverse', gerar: async () => ({ sons: await sonsReais(p, video) }) }])).sons || {};
|
|
1869
|
+
// Vários termos e durações: vídeo sem música foi o que saiu na primeira vez (25/09).
|
|
1870
|
+
// E só instrumental: "essa música daria pra deixar só o instrumental?" — a faixa é OUVIDA.
|
|
1871
|
+
// O termo sai do clima do roteiro (variedade.js), não de uma lista fixa de "cinematic inspiring".
|
|
1872
|
+
let trilhaC = (await produzirNecessidade(p, roteiro, { tipo: 'trilha', chave: ['cinema', roteiro.clima || '', roteiro.genero || ''] },
|
|
1873
|
+
[{ nome: 'jamendo', gerar: async () => {
|
|
1874
|
+
for (const termo of [...variedade.termosTrilha(roteiro, 'cinema'), 'instrumental']) {
|
|
1875
|
+
try {
|
|
1876
|
+
const b = await assets.procurarMusica(termo, { quantas: 10, duracaoMin: 45 });
|
|
1877
|
+
for (const item of variedade.ordenar(b.ok ? b.sons : [], 'trilha').filter((x) => !/vocal|voice|feat|ft\.|remix/i.test(x.titulo || '')).slice(0, 4)) {
|
|
1878
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'trilha' });
|
|
1879
|
+
if (!d.ok) continue;
|
|
1880
|
+
if (await temLetra(path.join(p.pasta, d.relativo))) { projeto.anotar(p.id, 'midia', `trilha com voz descartada: ${item.titulo}`); continue; }
|
|
1881
|
+
variedade.marcar('trilha', item.url);
|
|
1882
|
+
const credito = `"${termo}": ${item.titulo} — ${item.autor || 'Jamendo'} (${item.licenca || 'CC'})`;
|
|
1883
|
+
projeto.anotar(p.id, 'trilha', credito);
|
|
1884
|
+
return { src: d.relativo, credito };
|
|
1885
|
+
}
|
|
1886
|
+
} catch { /* o próximo termo */ }
|
|
1887
|
+
}
|
|
1888
|
+
return null;
|
|
1889
|
+
} }])).src || null;
|
|
1890
|
+
/* A MÚSICA mais baixa na origem: a faixa vem masterizada alta e comprimida,
|
|
1891
|
+
e mesmo a 30% ela cobria a voz e o depoimento ("a música tá muito
|
|
1892
|
+
alta, não dá pra ouvir as pessoas", 25/09). Ela vai a -28 LUFS antes
|
|
1893
|
+
da mistura; os volumes do plano partem daí. */
|
|
1894
|
+
if (trilhaC) {
|
|
1895
|
+
const norm = path.join(p.pasta, 'midia', 'trilha-baixa-' + path.basename(trilhaC).replace(/\.[a-z0-9]+$/i, '.mp3'));
|
|
1896
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-i', path.join(p.pasta, trilhaC), '-af', 'loudnorm=I=-28:TP=-6:LRA=11', '-ar', '44100', norm], { timeout: 5 * 60000 });
|
|
1897
|
+
if (c.ok) trilhaC = path.relative(p.pasta, norm).replace(/\\/g, '/');
|
|
1898
|
+
}
|
|
1899
|
+
/* AS FOTOS, separadas e enquadradas. "Uma sala, 20 cadeiras" com foto de
|
|
1900
|
+
dashboard "não tem nada a ver" (25/09): foto de gente e print de tela
|
|
1901
|
+
são coisas diferentes, e a miniatura de depoimento fica de fora. E
|
|
1902
|
+
onde estão os rostos, para o recorte vertical não cortar ninguém. */
|
|
1903
|
+
const TELA = /dashboard|pauta|kpi|tend[eê]ncias|landing|review|tela|screen|painel|relat[oó]rio/i;
|
|
1904
|
+
const MINI = /poster|face \d+|\bthumb/i;
|
|
1905
|
+
const fotosC = acervo.fotos.filter((f) => !MINI.test(f.alt || ''))
|
|
1906
|
+
.map((f) => ({ src: f.src, tipo: 'imagem', cat: TELA.test(f.alt || '') ? 'tela' : 'pessoas', alt: f.alt }));
|
|
1907
|
+
/* O B-ROLL do híbrido: o cinema vive de foto que troca por baixo do
|
|
1908
|
+
texto, e o acervo da marca raramente passa de meia dúzia. Vídeo de
|
|
1909
|
+
banco primeiro (o fundo que se move sozinho), foto como reserva —
|
|
1910
|
+
em paralelo, porque são oito buscas. */
|
|
1911
|
+
/* Foto de compartilhamento (og:image) e logo trazem o NOME da marca em
|
|
1912
|
+
letra gigante: como fundo, viravam um "THRO" cortado atrás do texto. */
|
|
1913
|
+
/* E arte de banner (2400×1260 e afins): é o logo da marca desenhado, não
|
|
1914
|
+
uma cena — cortada no vídeo em pé, vira um "✳ Cl" gigante. */
|
|
1915
|
+
const banner = (alt) => { const m = /(\d{3,4})x(\d{3,4})/.exec(alt || ''); return m && Number(m[1]) / Number(m[2]) > 1.7 && altura > largura; };
|
|
1916
|
+
if (hib) for (let q = fotosC.length - 1; q >= 0; q--) if (/open graph|og[:_ -]?image|\blogo|banner|wordmark/i.test(fotosC[q].alt || '') || banner(fotosC[q].alt)) fotosC.splice(q, 1);
|
|
1917
|
+
if (hib && fotosC.length < 14) {
|
|
1918
|
+
const orientacao = largura >= altura ? 'landscape' : 'portrait';
|
|
1919
|
+
const pastaMidia = path.join(p.pasta, 'midia');
|
|
1920
|
+
const jaTem = (() => { try { return fs.readdirSync(pastaMidia); } catch { return []; } })();
|
|
1921
|
+
const cat = (termo) => (/screen|code|data|server|dashboard/i.test(termo) ? 'tela' : 'pessoas');
|
|
1922
|
+
/* A versão LEVE do b-roll: o Pexels entrega 1080×1920 inteiro (até 30
|
|
1923
|
+
MB e 20 s), e o render parava num quadro esperando vários vídeos
|
|
1924
|
+
assim ao mesmo tempo (medido: timeout de 120 s no quadro 184). Cada
|
|
1925
|
+
um vira 8 s, 720 de largura, sem áudio — e fica guardado, para o
|
|
1926
|
+
próximo render não baixar de novo. */
|
|
1927
|
+
const leve = async (rel, destino) => {
|
|
1928
|
+
const alvo = path.join(pastaMidia, destino);
|
|
1929
|
+
const escala = largura >= altura ? 'scale=1280:-2' : 'scale=720:-2';
|
|
1930
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-i', path.join(p.pasta, rel), '-t', '8', '-vf', escala + ',fps=30', '-an',
|
|
1931
|
+
'-c:v', 'libx264', '-preset', 'veryfast', '-crf', '24', '-pix_fmt', 'yuv420p', '-movflags', '+faststart', alvo], { timeout: 180000 });
|
|
1932
|
+
if (!c.ok || !fs.existsSync(alvo)) return null;
|
|
1933
|
+
try { fs.unlinkSync(path.join(p.pasta, rel)); } catch { /* fica o original */ }
|
|
1934
|
+
return 'midia/' + destino;
|
|
1935
|
+
};
|
|
1936
|
+
// banco: true marca o que veio do banco (Pexels): a rota produto prefere a tela da marca (hibrido.ancorar).
|
|
1937
|
+
const achados = await Promise.all(hibrido.termosDeBusca(roteiro, hib.extras).map(async (termo) => {
|
|
1938
|
+
const out = [];
|
|
1939
|
+
const slug = 'broll-' + String(termo).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
1940
|
+
const proxy = `${slug}.leve.mp4`;
|
|
1941
|
+
if (jaTem.includes(proxy)) out.push({ src: 'midia/' + proxy, tipo: 'video', cat: cat(termo), alt: termo, banco: true });
|
|
1942
|
+
else try {
|
|
1943
|
+
// Sorteado entre os não usados, com o termo variado (variedade.js, 05/10).
|
|
1944
|
+
const itens = await variedade.buscarSemRepetir(async (t) => {
|
|
1945
|
+
const b = await assets.procurarVideos(t, { quantas: 8, orientacao });
|
|
1946
|
+
return (b.ok ? b.videos : []).filter((v) => !v.duracao || v.duracao >= 4);
|
|
1947
|
+
}, termo);
|
|
1948
|
+
for (const item of itens.slice(0, 1)) {
|
|
1949
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: slug });
|
|
1950
|
+
const l = d.ok ? await leve(d.relativo, proxy) : null;
|
|
1951
|
+
if (l) { out.push({ src: l, tipo: 'video', cat: cat(termo), alt: termo, banco: true }); variedade.marcar('broll', item.url); }
|
|
1952
|
+
}
|
|
1953
|
+
} catch { /* segue com a foto */ }
|
|
1954
|
+
const foto = jaTem.find((f) => f.startsWith(slug + '-') && /\.(jpe?g|png|webp)$/i.test(f));
|
|
1955
|
+
if (foto) out.push({ src: 'midia/' + foto, tipo: 'imagem', cat: cat(termo), alt: termo, banco: true });
|
|
1956
|
+
else try {
|
|
1957
|
+
const itens = await variedade.buscarSemRepetir(async (t) => {
|
|
1958
|
+
const b = await assets.procurarImagens(t, { quantas: 8, orientacao });
|
|
1959
|
+
return b.ok ? b.imagens : [];
|
|
1960
|
+
}, termo);
|
|
1961
|
+
for (const item of itens.slice(0, 1)) {
|
|
1962
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: slug });
|
|
1963
|
+
if (d.ok) { out.push({ src: d.relativo, tipo: 'imagem', cat: cat(termo), alt: termo, banco: true }); variedade.marcar('broll', item.url); }
|
|
1964
|
+
}
|
|
1965
|
+
} catch { /* sem */ }
|
|
1966
|
+
return out;
|
|
1967
|
+
}));
|
|
1968
|
+
const novos = achados.flat();
|
|
1969
|
+
// Intercalados com as da marca: a foto da marca não pode ficar toda no começo.
|
|
1970
|
+
const marcaF = fotosC.splice(0);
|
|
1971
|
+
for (let q = 0; q < Math.max(marcaF.length, novos.length); q++) {
|
|
1972
|
+
if (novos[q]) fotosC.push(novos[q]);
|
|
1973
|
+
if (marcaF[q]) fotosC.push(marcaF[q]);
|
|
1974
|
+
}
|
|
1975
|
+
projeto.anotar(p.id, 'midia', `b-roll do híbrido: ${novos.filter((f) => f.tipo === 'video').length} vídeos e ${novos.filter((f) => f.tipo === 'imagem').length} fotos`);
|
|
1976
|
+
}
|
|
1977
|
+
const rostos = await acharRostos(p, fotosC.filter((f) => f.tipo !== 'video').map((f) => f.src));
|
|
1978
|
+
for (const f of fotosC) if (rostos[f.src]) f.rosto = rostos[f.src];
|
|
1979
|
+
// Os depoimentos: cortados na palavra, com a voz no volume certo e fade.
|
|
1980
|
+
for (const pt of partes) {
|
|
1981
|
+
if (pt.tipo !== 'depoimento') continue;
|
|
1982
|
+
for (const c of pt.clipes || []) Object.assign(c, await prepararDepoimento(p, c));
|
|
1983
|
+
}
|
|
1984
|
+
// A voz FORTE: a parte com "falaForte" é narrada à parte, com a direção dela.
|
|
1985
|
+
const fortes = {};
|
|
1986
|
+
let iNarr = 0;
|
|
1987
|
+
for (const [i, pt] of partes.entries()) {
|
|
1988
|
+
if (pt.tipo === 'depoimento' || cinema.falaDe(pt) === '') continue;
|
|
1989
|
+
if (pt.falaForte) {
|
|
1990
|
+
const arqF = path.join(p.pasta, 'midia', `voz-forte-${i + 1}-${Date.now().toString(36)}.mp3`);
|
|
1991
|
+
// falaForte: true → a voz forte lê o texto da tela.
|
|
1992
|
+
const textoForte = pt.falaForte === true ? cinema.falaDe({ ...pt, fala: undefined }) : pt.falaForte;
|
|
1993
|
+
const soEdgeF = String(roteiro.motorVoz || args.motorVoz || '').toLowerCase() === 'edge';
|
|
1994
|
+
// A voz forte é a de quem fala a parte (duas vozes), não sempre a do narrador.
|
|
1995
|
+
const vozForte = falantes.vozesDasPartes([pt], roteiro, args.voz || roteiro.voz)[0];
|
|
1996
|
+
const vf = soEdgeF ? await (async () => {
|
|
1997
|
+
// No Edge, a ênfase é o registro "contraste": a mesma voz, um pouco mais firme.
|
|
1998
|
+
const arqJ = arqF.replace(/\.mp3$/, '.json');
|
|
1999
|
+
fs.writeFileSync(arqJ, JSON.stringify([{ texto: textoForte, registro: 'contraste' }]));
|
|
2000
|
+
return rodarPython('narrar.py', ['roteiro', '--arquivo', arqJ, '--saida', arqF, '--voz', String(vozForte || 'antonio')], { timeout: 5 * 60000 });
|
|
2001
|
+
})() : await narrarComCache([{ texto: textoForte }], arqF, { voz: vozForte,
|
|
2002
|
+
// A MESMA voz do narrador, só com um pouco mais de ênfase: "não é mudar a voz, é só um pouco a entonação" (25/09).
|
|
2003
|
+
direcao: pt.entonacao || 'Leia em português do Brasil com a mesma voz e o mesmo ritmo de um narrador de trailer de marca: '
|
|
2004
|
+
+ 'confiante e natural, só um pouco mais de ênfase nas palavras principais. Sem dramatizar.' });
|
|
2005
|
+
// A voz forte no mesmo ritmo da narração (se ela foi acelerada, esta também).
|
|
2006
|
+
if (vf.ok && ritmoVoz > 1.01) {
|
|
2007
|
+
const rap = arqF.replace(/\.mp3$/, '-r.mp3');
|
|
2008
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-i', arqF, '-filter:a', `atempo=${ritmoVoz.toFixed(3)}`, rap], { timeout: 120000 });
|
|
2009
|
+
if (c.ok) {
|
|
2010
|
+
fs.renameSync(rap, arqF);
|
|
2011
|
+
vf.segundos = vf.segundos / ritmoVoz;
|
|
2012
|
+
if (vf.partes && vf.partes[0]) vf.partes[0].palavras = (vf.partes[0].palavras || []).map((w) => ({ ...w, de: w.de / ritmoVoz, ate: w.ate / ritmoVoz }));
|
|
2013
|
+
}
|
|
2014
|
+
}
|
|
2015
|
+
if (vf.ok) fortes[i] = { src: path.relative(p.pasta, arqF).replace(/\\/g, '/'), segundos: vf.segundos, palavras: (vf.partes[0] || {}).palavras || [] };
|
|
2016
|
+
}
|
|
2017
|
+
iNarr++;
|
|
2018
|
+
}
|
|
2019
|
+
const r = cinema.montarCinema({ roteiro, largura, altura, tempos: v.partes, narracao: path.relative(p.pasta, mp3).replace(/\\/g, '/'),
|
|
2020
|
+
sons: sonsC, trilha: trilhaC, fotos: fotosC, fortes, ritmoLeitura: hib ? 0.55 : 1 });
|
|
2021
|
+
if (r.ok && hib) {
|
|
2022
|
+
hibrido.enfeitar(r.plano, { extras: hib.extras, partes, marca: roteiro.marca || {}, largura, altura, hud: roteiro.hud === true, particulas: roteiro.particulas === true,
|
|
2023
|
+
// O b-roll de cada frase troca 0,2 s depois da palavra-âncora (hibrido.ancorar).
|
|
2024
|
+
tempos: v.partes, fortes, fotos: fotosC });
|
|
2025
|
+
r.resumo.estilo = 'hibrido';
|
|
2026
|
+
}
|
|
2027
|
+
if (r.ok) projeto.anotar(p.id, 'plano', `estilo ${hib ? 'hibrido' : 'cinema'}: ${r.resumo.cenas} cenas, ${r.resumo.segundos}s`);
|
|
2028
|
+
return r;
|
|
2029
|
+
}
|
|
2030
|
+
if (modo === 'video' && semVoz) {
|
|
2031
|
+
/* Sem voz, sem tempo medido: cada parte dura o `duracao` dela (ou o que o
|
|
2032
|
+
texto da tela pede), e as palavras são repartidas na parte. Os sons
|
|
2033
|
+
leves entram depois do plano, em cada corte e entrada (sem-narracao.js). */
|
|
2034
|
+
tempos = semNarracao.tempos(partes, { falaDe: composicao.falaDe });
|
|
2035
|
+
args.__semNarracao = { tempos, cues: semNarracao.cuesDe(partes, tempos) };
|
|
2036
|
+
const total = tempos.length ? tempos[tempos.length - 1].ate : 0;
|
|
2037
|
+
projeto.anotar(p.id, 'narracao', `sem narração: ${Math.round(total * 10) / 10}s em ${partes.length} partes, só motion e efeitos sonoros`);
|
|
2038
|
+
sons = estilo === 'gerativo' ? {} : ehMotion ? sonsLeves.preparar(p.pasta) : await edicao.prepararSons(p.pasta, video);
|
|
2039
|
+
}
|
|
2040
|
+
if (modo === 'video' && !semVoz) {
|
|
2041
|
+
const lista = partes.map((pt, i) => ({ texto: composicao.falaDe(pt), registro: composicao.registroDe(pt, i, partes.length) }));
|
|
2042
|
+
const arq = path.join(p.pasta, 'midia', `roteiro-${Date.now().toString(36)}.json`);
|
|
2043
|
+
fs.mkdirSync(path.dirname(arq), { recursive: true });
|
|
2044
|
+
fs.writeFileSync(arq, JSON.stringify(lista));
|
|
2045
|
+
const mp3 = path.join(p.pasta, 'midia', `narracao-${Date.now().toString(36)}.mp3`);
|
|
2046
|
+
// A voz de gente primeiro (Gemini, pelo servidor); o Edge é a reserva.
|
|
2047
|
+
// Com cache: refazer o vídeo (outro estilo, outra proporção) não gasta a cota da voz.
|
|
2048
|
+
/* A DIREÇÃO DA VOZ. O servidor manda a direção e o texto no MESMO pedido,
|
|
2049
|
+
e o Gemini às vezes lê o começo dela em voz alta: todo vídeo do fluido
|
|
2050
|
+
abria com "Rápido e contínuo." (11/10, "em tudo ela coloca isso, pode
|
|
2051
|
+
ser um negócio de padaria"). Então a direção é curta, descreve só o
|
|
2052
|
+
TOM, e não tem palavra solta que soe como a primeira frase de um
|
|
2053
|
+
roteiro ("rápido", "contínuo", caixa alta). A velocidade não vem
|
|
2054
|
+
daqui: vem do atempo (ritmoVoz) depois da voz pronta. */
|
|
2055
|
+
const direcao = DIRECAO_DA_VOZ[estilo] || DIRECAO_DA_VOZ.padrao;
|
|
2056
|
+
/* Uma voz por falante (falantes.js). Com uma voz só, um grupo só: é a
|
|
2057
|
+
narração de sempre, com o mesmo cache. */
|
|
2058
|
+
const vozesL = falantes.vozesDasPartes(partes, roteiro, args.voz || roteiro.voz);
|
|
2059
|
+
let v = await produzirNecessidade(p, roteiro, { tipo: 'voz', chave: [lista.map((x) => x.texto), vozesL, direcao], destino: mp3 }, [{
|
|
2060
|
+
nome: ((roteiro.provedores || {}).voz) || 'estudio',
|
|
2061
|
+
gerar: async () => {
|
|
2062
|
+
let reserva = false, gemini = false;
|
|
2063
|
+
const comLista = lista.map((x, i) => ({ ...x, voz: vozesL[i] }));
|
|
2064
|
+
const pelaReserva = async (l, m, voz) => {
|
|
2065
|
+
// O Kokoro pedido já foi tentado no narrarComCache: a reserva não repete.
|
|
2066
|
+
const a = m === mp3 ? arq : m.replace(/\.mp3$/, '.json');
|
|
2067
|
+
if (a !== arq) fs.writeFileSync(a, JSON.stringify(l));
|
|
2068
|
+
const rr = await narrarReserva(l, m, a, voz, 'thalita', { semKokoro: kokoro.querKokoro(voz) });
|
|
2069
|
+
if (rr && rr.ok) reserva = true;
|
|
2070
|
+
return rr;
|
|
2071
|
+
};
|
|
2072
|
+
let r = await falantes.narrarPorFalante(comLista, mp3, { juntar: juntarVozes,
|
|
2073
|
+
narrarUm: async (l, m, voz) => {
|
|
2074
|
+
const g = await narrarComCache(l, m, { voz, direcao });
|
|
2075
|
+
if (g.ok) { gemini = true; return g; }
|
|
2076
|
+
return pelaReserva(l, m, voz);
|
|
2077
|
+
} });
|
|
2078
|
+
/* UMA VOZ SÓ POR VÍDEO (11/10, "os personagens falam com vozes
|
|
2079
|
+
diferentes em cada cena"): a cota do Gemini acabava no meio, e o
|
|
2080
|
+
mesmo personagem saía Gemini numa fala e reserva na outra. Se
|
|
2081
|
+
misturou, o vídeo inteiro é refeito na reserva — pior que o
|
|
2082
|
+
Gemini, mas cada um com a mesma voz do começo ao fim. */
|
|
2083
|
+
if (r && r.ok && reserva && gemini) {
|
|
2084
|
+
gemini = false;
|
|
2085
|
+
r = await falantes.narrarPorFalante(comLista, mp3, { juntar: juntarVozes, narrarUm: pelaReserva });
|
|
2086
|
+
}
|
|
2087
|
+
/* A voz de RESERVA (Kokoro/Edge, quando o Gemini falhou) não vai para o
|
|
2088
|
+
cache do projeto: guardada, ela voltava em todo refazer do mesmo
|
|
2089
|
+
texto, mesmo com o Gemini de pé — era a "voz robótica que não sai"
|
|
2090
|
+
(11/10). Na próxima vez o Gemini é tentado de novo. */
|
|
2091
|
+
return r && r.ok ? { ...r, arquivo: mp3, ...(reserva ? { naoGuardar: true } : {}) } : r;
|
|
2092
|
+
},
|
|
2093
|
+
}]);
|
|
2094
|
+
if (!v.ok) return v;
|
|
2095
|
+
/* O RITMO DA VOZ. Mesmo com a direção, a voz sai no passo de leitura, e
|
|
2096
|
+
o vídeo — que segue a voz palavra por palavra — sai lento junto. O
|
|
2097
|
+
áudio acelera 1,12× (1,3× ficou corrido demais, 29/09; atempo não muda o tom) e cada tempo de palavra
|
|
2098
|
+
acompanha; `roteiro.ritmoVoz` ajusta (1 desliga). */
|
|
2099
|
+
// O fluido corre mais ("mais rápido", 06/10): 1,22× por padrão.
|
|
2100
|
+
const ritmo = Math.max(1, Math.min(1.5, Number(roteiro.ritmoVoz || args.ritmoVoz) || (estilo === 'fluido' ? 1.22 : estilo === 'personagem' ? 1.06 : 1.12)));
|
|
2101
|
+
if (ritmo > 1.01) {
|
|
2102
|
+
const rap = mp3.replace(/\.mp3$/, '-r.mp3');
|
|
2103
|
+
const c = await video.rodar(video.ffmpeg(), ['-y', '-i', mp3, '-filter:a', `atempo=${ritmo.toFixed(3)}`, rap], { timeout: 120000 });
|
|
2104
|
+
if (c.ok && fs.existsSync(rap)) {
|
|
2105
|
+
fs.renameSync(rap, mp3);
|
|
2106
|
+
const esc = (x) => (typeof x === 'number' ? Math.round((x / ritmo) * 1000) / 1000 : x);
|
|
2107
|
+
v.segundos = esc(v.segundos);
|
|
2108
|
+
v.partes = (v.partes || []).map((pt) => ({ ...pt, de: esc(pt.de), ate: esc(pt.ate),
|
|
2109
|
+
palavras: (pt.palavras || []).map((w) => ({ ...w, de: esc(w.de), ate: esc(w.ate) })) }));
|
|
2110
|
+
}
|
|
2111
|
+
}
|
|
2112
|
+
tempos = v.partes;
|
|
2113
|
+
args.__barulhinhos = { tempos, cues: semNarracao.cuesDe(partes, tempos) };
|
|
2114
|
+
narracao = path.relative(p.pasta, mp3).replace(/\\/g, '/');
|
|
2115
|
+
projeto.anotar(p.id, 'narracao', `${v.segundos}s em ${partes.length} partes, voz ${v.voz}`);
|
|
2116
|
+
// O motion usa os efeitos leves; os estilos de corte, os cheios.
|
|
2117
|
+
// O gerativo tem a família de sons DELE (sintetizada da semente); os outros motion, os leves.
|
|
2118
|
+
// O gerativo desenha os sons DEPOIS da partitura (um arquivo por evento, da própria trilha).
|
|
2119
|
+
sons = estilo === 'gerativo' ? {}
|
|
2120
|
+
: ehMotion ? sonsLeves.preparar(p.pasta) : await edicao.prepararSons(p.pasta, video);
|
|
2121
|
+
}
|
|
2122
|
+
// A trilha vale com e sem voz: o vídeo sem narração ainda tem música.
|
|
2123
|
+
if (modo === 'video') {
|
|
2124
|
+
// A trilha do motion: ende.app (CC BY 4.0, sem Content ID), clima tecnologia.
|
|
2125
|
+
if (ehMotion) {
|
|
2126
|
+
try {
|
|
2127
|
+
const segundos = tempos.length ? tempos[tempos.length - 1].ate + 2 : 20;
|
|
2128
|
+
/* O gerativo escolhe o GÊNERO pelo assunto (jazz para o explainer,
|
|
2129
|
+
funk para o fone, eletrônica para IA…), sorteia a faixa e não
|
|
2130
|
+
repete as últimas usadas — nada de "inspiring corporate". */
|
|
2131
|
+
let m = null;
|
|
2132
|
+
// A memória da trilha é a da variedade ('trilha'): antes era um arquivo à parte (trilhas-usadas.json).
|
|
2133
|
+
const usadas = variedade.usadas('trilha');
|
|
2134
|
+
const mus = estilo === 'gerativo' ? gerativo.musicaDe(roteiro) : null;
|
|
2135
|
+
/* A trilha do gerativo vem do Jamendo (Openverse), pelo GÊNERO do
|
|
2136
|
+
assunto, instrumental, sorteada e sem repetir as últimas — a
|
|
2137
|
+
ende.app fica de reserva ("parar de cair sempre na ende", 30/09). */
|
|
2138
|
+
if (mus) {
|
|
2139
|
+
const BUSCA = { jazz: 'jazz instrumental', 'lofi-chill-beats': 'lofi hip hop instrumental', electronica: 'electronic instrumental', funk: 'funk instrumental',
|
|
2140
|
+
'dance-club': 'house instrumental', ambient: 'ambient instrumental', acoustic: 'acoustic guitar instrumental', cinematic: 'cinematic instrumental',
|
|
2141
|
+
classical: 'piano classical instrumental', 'soul-rnb': 'soul instrumental' };
|
|
2142
|
+
try {
|
|
2143
|
+
const b = await assets.procurarMusica(BUSCA[roteiro.genero || mus.genero] || ((roteiro.genero || mus.genero) + ' instrumental'), { quantas: 8, duracaoMin: Math.max(45, segundos + 10) });
|
|
2144
|
+
// Pelos pontos da variedade: a recente e a muito usada vão para o fim, não somem.
|
|
2145
|
+
const opcoes = variedade.ordenar((b.ok ? b.sons : []).filter((x) => !/vocal|voice|feat|ft\.|remix/i.test(x.titulo || '')), 'trilha');
|
|
2146
|
+
for (let k = 0; k < opcoes.length && !m; k++) {
|
|
2147
|
+
const item = opcoes[k];
|
|
2148
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'trilha-' + (roteiro.genero || mus.genero) });
|
|
2149
|
+
if (!d.ok) continue;
|
|
2150
|
+
if (await temLetra(path.join(p.pasta, d.relativo))) { projeto.anotar(p.id, 'midia', `trilha com voz descartada: ${item.titulo}`); continue; }
|
|
2151
|
+
m = { src: path.join(p.pasta, d.relativo), credito: `Música: ${item.titulo} — ${item.autor || 'Jamendo'} (${item.licenca || 'CC'}, Jamendo)`, id: item.url, segundos: item.segundos };
|
|
2152
|
+
}
|
|
2153
|
+
} catch { /* cai na ende.app */ }
|
|
2154
|
+
}
|
|
2155
|
+
if (mus && m) {
|
|
2156
|
+
variedade.marcar('trilha', m.id);
|
|
2157
|
+
projeto.anotar(p.id, 'trilha', `gênero ${roteiro.genero || mus.genero} (Jamendo)`);
|
|
2158
|
+
} else if (mus) {
|
|
2159
|
+
m = await ende.provedor({ pasta: path.join(p.pasta, 'midia') }).gerar({ clima: roteiro.clima || 'energetico', segundos, genero: roteiro.genero || mus.genero, semente: mus.semente, evitar: usadas });
|
|
2160
|
+
const id = m && Number((/ende-(\d+)\.mp3$/.exec(m.src) || [])[1]);
|
|
2161
|
+
if (id) variedade.marcar('trilha', id);
|
|
2162
|
+
if (m) projeto.anotar(p.id, 'trilha', `gênero ${roteiro.genero || mus.genero}`);
|
|
2163
|
+
} else m = await ende.provedor({ pasta: path.join(p.pasta, 'midia') }).gerar({ clima: roteiro.clima || 'tecnologia', segundos });
|
|
2164
|
+
if (m) { trilha = path.relative(p.pasta, m.src).replace(/\\/g, '/'); projeto.anotar(p.id, 'trilha', m.credito); }
|
|
2165
|
+
} catch { /* cai na busca de sempre */ }
|
|
2166
|
+
}
|
|
2167
|
+
// Termo pelo clima e faixa sorteada sem repetir — o "inspiring corporate" fixo era a mesma música em todo vídeo.
|
|
2168
|
+
for (const termo of [args.trilha, ...variedade.termosTrilha(roteiro, estilo)].filter(Boolean)) {
|
|
2169
|
+
if (trilha) break;
|
|
2170
|
+
try {
|
|
2171
|
+
const b = await assets.procurarMusica(termo, { quantas: 10, duracaoMin: 45 });
|
|
2172
|
+
for (const item of variedade.ordenar(b.ok ? b.sons : [], 'trilha').slice(0, 3)) {
|
|
2173
|
+
const d = await assets.baixar(item, { pasta: p.pasta, nome: 'trilha' });
|
|
2174
|
+
if (d.ok) { trilha = d.relativo; variedade.marcar('trilha', item.url); projeto.anotar(p.id, 'trilha', `"${termo}": ${item.titulo}`); break; }
|
|
2175
|
+
}
|
|
2176
|
+
} catch { /* o próximo termo */ }
|
|
2177
|
+
}
|
|
2178
|
+
}
|
|
2179
|
+
if (estilo === 'impacto' && modo === 'video') {
|
|
2180
|
+
// Os emojis das palavras FALADAS também (a batida mostra a fala).
|
|
2181
|
+
const faladas = tempos.flatMap((t) => (t.palavras || []).map((w) => w.texto));
|
|
2182
|
+
for (const nome of new Set(faladas.map((w) => edicao.iconeDe(w)).filter(Boolean))) {
|
|
2183
|
+
if (iconesOk.has(nome)) continue;
|
|
2184
|
+
try { const r = await assets.icone(nome); if (r && r.ok) iconesOk.add(nome); } catch { /* sem */ }
|
|
2185
|
+
}
|
|
2186
|
+
const fotos = [
|
|
2187
|
+
...acervo.fotos.map((f) => ({ src: f.src, tipo: 'imagem' })),
|
|
2188
|
+
...(acervo.videos || []).map((v) => ({ src: v.src, tipo: 'video' })),
|
|
2189
|
+
...Object.values(imagens),
|
|
2190
|
+
];
|
|
2191
|
+
const r = impacto.montarImpacto({ roteiro, largura, altura, tempos, narracao, sons, trilha, fotos, iconesOk });
|
|
2192
|
+
if (r.ok) projeto.anotar(p.id, 'plano', `estilo impacto: ${r.resumo.cenas} batidas`);
|
|
2193
|
+
return r;
|
|
2194
|
+
}
|
|
2195
|
+
if (estilo === 'vox' && modo === 'video') {
|
|
2196
|
+
const r = vox.montarVox({ roteiro, largura, altura, tempos, narracao, sons, trilha, imagens });
|
|
2197
|
+
if (r.ok) projeto.anotar(p.id, 'plano', `estilo vox: ${r.resumo.cenas} cenas, ${r.resumo.segundos}s`);
|
|
2198
|
+
return r;
|
|
2199
|
+
}
|
|
2200
|
+
if ((estilo === 'marca' || estilo === 'lancamento') && modo === 'video') {
|
|
2201
|
+
/* As letras em vetor (a peça "vetor") pedem os pontos de verdade da
|
|
2202
|
+
fonte: glifos.js lê o .ttf. Sem rede, o vetor desenha o contorno do
|
|
2203
|
+
próprio texto, sem as alças. */
|
|
2204
|
+
const m = roteiro.marca || {};
|
|
2205
|
+
const nome = m.nome || (partes.find((pt) => pt.tipo === 'logo' || pt.tipo === 'abertura') || {}).titulo || '';
|
|
2206
|
+
const precisa = partes.some((pt) => pt.tipo === 'logo' || pt.visual === 'vetor');
|
|
2207
|
+
const g = precisa ? await glifos.palavra((partes.find((pt) => pt.tipo === 'logo') || {}).titulo || nome,
|
|
2208
|
+
{ fonte: (m.fontes && m.fontes.titulo) || (estilo === 'marca' ? 'Plus Jakarta Sans' : 'Inter Tight') }) : null;
|
|
2209
|
+
const r = lancamento.montarLancamento({ roteiro, variante: estilo, largura, altura, tempos, narracao, sons, trilha, imagens, glifos: g });
|
|
2210
|
+
if (r.ok) projeto.anotar(p.id, 'plano', `estilo ${estilo}: ${r.resumo.cenas} cenas, ${r.resumo.segundos}s${precisa ? (g ? ', vetor com os pontos da fonte' : ', vetor sem os pontos (sem a fonte)') : ''}`);
|
|
2211
|
+
return r;
|
|
2212
|
+
}
|
|
2213
|
+
if (estilo === 'gerativo' && modo === 'video') {
|
|
2214
|
+
/* A música a -18 LUFS (a voz sai a -14): os volumes do plano partem
|
|
2215
|
+
daí — cheia no respiro, uns 9 dB abaixo quando a voz fala. */
|
|
2216
|
+
if (trilha && !/-n18\.mp3$/.test(trilha)) {
|
|
2217
|
+
const norm = path.join(p.pasta, 'midia', path.basename(trilha).replace(/\.[a-z0-9]+$/i, '') + '-n18.mp3');
|
|
2218
|
+
/* A introdução da faixa fica de fora (ela começa morna): corta de 12% em
|
|
2219
|
+
diante, com 0,4 s de entrada, no tamanho do vídeo. */
|
|
2220
|
+
let ini = 0;
|
|
2221
|
+
try { const md = await video.medir(path.join(p.pasta, trilha)); const tot = md.segundos || 0; const quer = (tempos.length ? tempos[tempos.length - 1].ate : 30) + 6; if (tot > quer + 8) ini = Math.min(tot * 0.12, tot - quer - 2); } catch { /* do começo */ }
|
|
2222
|
+
const c = fs.existsSync(norm) ? { ok: true } : await video.rodar(video.ffmpeg(), ['-y', ...(ini > 1 ? ['-ss', ini.toFixed(2)] : []), '-i', path.join(p.pasta, trilha),
|
|
2223
|
+
'-af', 'afade=t=in:st=0:d=0.4,loudnorm=I=-18:TP=-2:LRA=11', '-ar', '44100', norm], { timeout: 5 * 60000 });
|
|
2224
|
+
if (c.ok && fs.existsSync(norm)) trilha = path.relative(p.pasta, norm).replace(/\\/g, '/');
|
|
2225
|
+
}
|
|
2226
|
+
/* SEM ÍCONE NENHUM (14/10, a padaria: "sem ícones"): o modelo grátis não
|
|
2227
|
+
dá herói, e o gerativo de comida não tem forma abstrata — o vídeo
|
|
2228
|
+
saía só com texto. Na parte em que o modelo não disse nada (nem
|
|
2229
|
+
"nenhum"), o ícone 3D que É a coisa que a fala nomeia ("pão" → bread). */
|
|
2230
|
+
const autoHerois = [];
|
|
2231
|
+
for (const pt of partes) {
|
|
2232
|
+
if (!pt || pt.heroi != null || pt.icone != null) continue;
|
|
2233
|
+
const id = colecao.melhorIcone3d([pt.titulo, pt.destaque, pt.fala, pt.texto].filter(Boolean).join(' '), 80);
|
|
2234
|
+
if (id && !autoHerois.includes(id)) { pt.heroi = id; autoHerois.push(id); }
|
|
2235
|
+
}
|
|
2236
|
+
if (autoHerois.length) projeto.anotar(p.id, 'icones', `sem herói do modelo, a biblioteca achou: ${autoHerois.join(', ')}`);
|
|
2237
|
+
/* O herói que o roteiro pediu do Iconify ("mdi:bread-slice"): o desenho é
|
|
2238
|
+
baixado aqui (fica em midia/icones); o que não baixar, a batida fica sem. */
|
|
2239
|
+
const icones = {};
|
|
2240
|
+
for (const pt of partes) {
|
|
2241
|
+
const h = typeof (pt.heroi != null ? pt.heroi : pt.icone) === 'string' ? String(pt.heroi != null ? pt.heroi : pt.icone).trim() : '';
|
|
2242
|
+
if (/^(fluent3d|noto):/i.test(h) && !icones[h]) {
|
|
2243
|
+
// O herói da biblioteca: o PNG 3D ou o Lottie, baixado para o projeto.
|
|
2244
|
+
try {
|
|
2245
|
+
const r = await colecao.baixar(h, { pasta: p.pasta, largura, altura });
|
|
2246
|
+
if (r.ok) icones[h] = /^noto:/i.test(h) ? { lottie: r.src } : { png: r.src };
|
|
2247
|
+
else projeto.anotar(p.id, 'icones', `herói ${h} não baixou: ${r.error || '?'}`);
|
|
2248
|
+
} catch { /* fica sem */ }
|
|
2249
|
+
continue;
|
|
2250
|
+
}
|
|
2251
|
+
// O ícone do próprio site (estudio_site guardou os <svg> na marca).
|
|
2252
|
+
const doSite = h.match(/^site:(\d+)$/i);
|
|
2253
|
+
if (doSite) { const x = ((roteiro.marca || {}).iconesSite || [])[Number(doSite[1]) - 1]; if (x && x.svg) icones[h] = x.svg; continue; }
|
|
2254
|
+
if (!/^[a-z0-9-]+:[a-z0-9-]+$/i.test(h) || icones[h]) continue;
|
|
2255
|
+
try { const ic = await assets.icone(h, { pasta: p.pasta }); if (ic && ic.ok) icones[h] = ic.svg; else projeto.anotar(p.id, 'icones', `herói ${h} não baixou: ${(ic && ic.error) || '?'}`); } catch { /* fica sem */ }
|
|
2256
|
+
}
|
|
2257
|
+
const r = gerativo.montarGerativo({ roteiro, largura, altura, tempos, narracao, sons, trilha, icones });
|
|
2258
|
+
if (r.ok) {
|
|
2259
|
+
const feitos = sonsLeves.prepararReceitas(p.pasta, r.somReceitas);
|
|
2260
|
+
// Som que o ffmpeg não conseguiu fazer sai do plano (o vídeo não espera um arquivo que não existe).
|
|
2261
|
+
r.plano.audio.efeitos = r.plano.audio.efeitos.filter((e) => Object.values(feitos).includes(e.src));
|
|
2262
|
+
}
|
|
2263
|
+
if (r.ok) projeto.anotar(p.id, 'plano', `estilo gerativo: ${r.resumo.batidas} batidas (${r.resumo.composicoes.join(' → ')}), ${r.resumo.segundos}s, semente ${r.resumo.semente}`);
|
|
2264
|
+
if (r.ok) conferirAssinatura(p, r, roteiro.assinatura || 'gerativo');
|
|
2265
|
+
return r;
|
|
2266
|
+
}
|
|
2267
|
+
if (estilo === 'fluido' && modo === 'video') {
|
|
2268
|
+
/* A CARA de cada vídeo do fluido, por PROJETO (ajustar uma frase não
|
|
2269
|
+
troca): a semente (marcador, jeito das imagens) e a paleta, que a
|
|
2270
|
+
memória de variedade não repete do vídeo anterior (08/10: "sempre o
|
|
2271
|
+
mesmo azul"). A paleta ou o tema pedidos mandam. */
|
|
2272
|
+
if (roteiro.semente == null) {
|
|
2273
|
+
roteiro.semente = p.semente != null ? p.semente : Math.floor(Math.random() * 1e9);
|
|
2274
|
+
if (p.semente == null) projeto.salvar(p.id, { semente: roteiro.semente });
|
|
2275
|
+
}
|
|
2276
|
+
/* O modelo também vicia: pedia "noite" em todo vídeo (era a primeira da
|
|
2277
|
+
lista). A paleta dele vale, menos quando é uma das 2 últimas usadas —
|
|
2278
|
+
aí vem a menos usada do mesmo tema (escura ou clara). */
|
|
2279
|
+
if (!p.paletaFluido) {
|
|
2280
|
+
const P = fluido.PALETAS, nomes = Object.keys(P);
|
|
2281
|
+
const pedida = P[String(roteiro.paleta || '').toLowerCase()] ? String(roteiro.paleta).toLowerCase() : null;
|
|
2282
|
+
const recentes = variedade.usadas('paleta-fluido').slice(0, 2);
|
|
2283
|
+
const escuro = pedida ? P[pedida].escuro : /escuro|dark/i.test(roteiro.tema || '') ? true : /claro|light/i.test(roteiro.tema || '') ? false : null;
|
|
2284
|
+
let escolha = pedida && !recentes.includes(pedida) ? pedida : null;
|
|
2285
|
+
if (!escolha) escolha = variedade.sortear(nomes.filter((n) => escuro == null || P[n].escuro === escuro), 'paleta-fluido');
|
|
2286
|
+
else variedade.marcar('paleta-fluido', escolha);
|
|
2287
|
+
if (pedida && escolha !== pedida) projeto.anotar(p.id, 'visual', `paleta ${pedida} pedida, mas foi a de um dos últimos vídeos: ${escolha}`);
|
|
2288
|
+
projeto.salvar(p.id, { paletaFluido: escolha });
|
|
2289
|
+
p.paletaFluido = escolha;
|
|
2290
|
+
}
|
|
2291
|
+
roteiro.paleta = p.paletaFluido;
|
|
2292
|
+
// O trio de fontes, também por projeto e sem repetir os últimos vídeos (09/10, "vício em fontes").
|
|
2293
|
+
if (!p.fontesFluido) { p.fontesFluido = fluido.escolherFontes(roteiro.fontesFluido); projeto.salvar(p.id, { fontesFluido: p.fontesFluido }); }
|
|
2294
|
+
roteiro.fontesFluido = p.fontesFluido;
|
|
2295
|
+
/* As IMAGENS do fluido misto, só com imagem pedida: as partes com
|
|
2296
|
+
"busca", no máximo 1 em 3 e espalhadas (fluido.js decide o jeito). */
|
|
2297
|
+
const fotosFluido = {};
|
|
2298
|
+
if (!semImagem) {
|
|
2299
|
+
const comBusca = partes.map((pt, k) => (pt.busca || pt.src ? k : -1)).filter((k) => k >= 0 && (partes[k].tipo !== 'cta'));
|
|
2300
|
+
const teto = Math.max(1, Math.floor(partes.length / 3));
|
|
2301
|
+
const escolhidas = [];
|
|
2302
|
+
for (const k of comBusca) if (escolhidas.length < teto && !escolhidas.some((j) => Math.abs(j - k) < 2)) escolhidas.push(k);
|
|
2303
|
+
for (const k of escolhidas) {
|
|
2304
|
+
const pt = partes[k];
|
|
2305
|
+
// O acervo EDITORIAL (assets.procurarEditorial), não o banco de stock: sem foto que sirva, a parte fica sem imagem.
|
|
2306
|
+
const m = pt.src ? { src: pt.src } : await baixarEditorial(p, pt.busca);
|
|
2307
|
+
if (m && m.src) fotosFluido[k] = { src: m.src };
|
|
2308
|
+
}
|
|
2309
|
+
if (Object.keys(fotosFluido).length) projeto.anotar(p.id, 'midia', `fluido misto: imagem nas partes ${Object.keys(fotosFluido).map((k) => Number(k) + 1).join(', ')}`);
|
|
2310
|
+
}
|
|
2311
|
+
const r = fluido.montarFluido({ imagens: fotosFluido, roteiro: { ...roteiro, pedido: roteiro.pedido || pedidoTxt }, largura, altura, tempos, narracao, sons, trilha });
|
|
2312
|
+
if (r.ok) projeto.anotar(p.id, 'plano', `estilo fluido: ${r.resumo.batidas} batidas${r.resumo.imagens.length ? ` (imagens: ${r.resumo.imagens.join(', ')})` : ''}, paleta ${r.resumo.paleta}, ${r.resumo.segundos}s, batida atrasada no máximo ${r.resumo.atraso}s, palavra atrás da voz no máximo ${r.resumo.sincronia}s`);
|
|
2313
|
+
if (r.ok) conferirAssinatura(p, r, roteiro.assinatura || 'fluido');
|
|
2314
|
+
return r;
|
|
2315
|
+
}
|
|
2316
|
+
if (estilo === 'personagem' && modo === 'video') {
|
|
2317
|
+
const r = personagem.montarPersonagem({ roteiro: { ...roteiro, pedido: roteiro.pedido || pedidoTxt, voz: args.voz || roteiro.voz }, largura, altura, tempos, narracao, sons, trilha });
|
|
2318
|
+
if (r.ok) {
|
|
2319
|
+
/* O que não é peça do catálogo vira ícone 3D da biblioteca, em blocos
|
|
2320
|
+
(kit/mundo.jsx): "uma pizza que fala", "um violão na praia". Sem
|
|
2321
|
+
ícone, a peça sai da cena (e a coisa que fala vira o mascote). */
|
|
2322
|
+
const achados = {};
|
|
2323
|
+
for (const nome of mundo.iconesPendentes(r.partitura)) {
|
|
2324
|
+
const id = colecao.melhorIcone3d(nome, 40);
|
|
2325
|
+
if (!id) continue;
|
|
2326
|
+
const b = await colecao.baixar(id, { pasta: p.pasta, largura, altura }).catch(() => null);
|
|
2327
|
+
if (b && b.ok) achados[nome] = b.src;
|
|
2328
|
+
}
|
|
2329
|
+
mundo.aplicarIcones(r.partitura, achados);
|
|
2330
|
+
mundo.adicionarObjetos(r.partitura, objetosDoRoteiro(roteiro.objetos, p.pasta));
|
|
2331
|
+
const icones = Object.keys(achados);
|
|
2332
|
+
projeto.anotar(p.id, 'plano', `estilo personagem: ${r.resumo.elenco.join(' e ')}${r.resumo.figurantes.length ? ` (+ ${r.resumo.figurantes.join(', ')})` : ''} em ${r.resumo.lugares.join(' → ')}, ${r.resumo.planos} planos, ${r.resumo.segundos}s${icones.length ? `; em blocos: ${icones.join(', ')}` : ''}`);
|
|
2333
|
+
}
|
|
2334
|
+
return r;
|
|
2335
|
+
}
|
|
2336
|
+
if (estilo === 'motion' && modo === 'video') {
|
|
2337
|
+
const r = motion.montarMotion({ roteiro, largura, altura, tempos, narracao, sons, trilha, imagens });
|
|
2338
|
+
if (r.ok) projeto.anotar(p.id, 'plano', `estilo motion: ${r.resumo.segundos}s contínuos, ${r.resumo.partes} partes, ${r.resumo.fps} fps`);
|
|
2339
|
+
return r;
|
|
2340
|
+
}
|
|
2341
|
+
/* A composição (e os slides) só conhece os tipos antigos: as partes novas
|
|
2342
|
+
viram a mais parecida delas, e o roteiro do vídeo serve à página. */
|
|
2343
|
+
const PARECIDA = { logo: 'abertura', cores: 'lista', produto: 'titulo' };
|
|
2344
|
+
const paraComposicao = { ...roteiro, partes: partes.map((pt) => (PARECIDA[pt.tipo]
|
|
2345
|
+
? { ...pt, tipo: PARECIDA[pt.tipo], itens: pt.itens || (pt.cores || []).map((c) => (typeof c === 'string' ? c : c.nome)) }
|
|
2346
|
+
: pt)) };
|
|
2347
|
+
return composicao.comporRoteiro({ roteiro: paraComposicao, modo, largura, altura, tempos, narracao, sons, trilha, imagens, iconesOk, fundos });
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
/* Sem o tempo de cada palavra, cada trecho é repartido pelas palavras dele,
|
|
2351
|
+
proporcional ao tamanho de cada uma. */
|
|
2352
|
+
function repartirTrechos(trechos) {
|
|
2353
|
+
const out = [];
|
|
2354
|
+
for (const t of trechos) {
|
|
2355
|
+
const ws = String(t.texto || '').split(/\s+/).filter(Boolean);
|
|
2356
|
+
const letras = ws.reduce((n, w) => n + w.length, 0) || 1;
|
|
2357
|
+
let cur = t.de;
|
|
2358
|
+
for (const w of ws) {
|
|
2359
|
+
const d = (t.ate - t.de) * (w.length / letras);
|
|
2360
|
+
out.push({ de: cur, ate: cur + d, texto: w });
|
|
2361
|
+
cur += d;
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
return out;
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
/**
|
|
2368
|
+
* A transcrição com tempo — é ela que dá legenda sincronizada.
|
|
2369
|
+
*
|
|
2370
|
+
* Quem tem a chave é o servidor, e é assim de propósito (a API vem com o
|
|
2371
|
+
* produto). O áudio vai pequeno: mono, 16 kHz, 32 kbps.
|
|
2372
|
+
*/
|
|
2373
|
+
async function transcrever(p, alvo, ctx) {
|
|
2374
|
+
const mp3 = path.join(p.pasta, 'midia', `audio-${Date.now().toString(36)}.mp3`);
|
|
2375
|
+
const ex = await video.extrairAudio(alvo, mp3);
|
|
2376
|
+
if (!ex.ok) return ex;
|
|
2377
|
+
|
|
2378
|
+
if (!ctx.api || !ctx.server) {
|
|
2379
|
+
return { ok: false, error: 'a transcrição precisa do servidor, e ele não foi passado para a ferramenta.' };
|
|
2380
|
+
}
|
|
2381
|
+
if (ex.bytes > 20 * 1024 * 1024) {
|
|
2382
|
+
return { ok: false, error: `o áudio ficou com ${(ex.bytes / 1048576).toFixed(1)} MB, acima do teto de 20 MB. `
|
|
2383
|
+
+ 'Transcreva em pedaços: recorte o vídeo antes.' };
|
|
2384
|
+
}
|
|
2385
|
+
|
|
2386
|
+
try {
|
|
2387
|
+
const r = await ctx.api.requestTranscricao(ctx.server, {
|
|
2388
|
+
token: ctx.token,
|
|
2389
|
+
audio: fs.readFileSync(mp3).toString('base64'),
|
|
2390
|
+
nome: path.basename(mp3),
|
|
2391
|
+
idioma: 'pt',
|
|
2392
|
+
});
|
|
2393
|
+
try { fs.unlinkSync(mp3); } catch { /* fica, não faz mal */ }
|
|
2394
|
+
if (!r || r.ok === false) return { ok: false, error: (r && r.erro) || 'a transcrição falhou.' };
|
|
2395
|
+
projeto.anotar(p.id, 'transcricao', `${(r.trechos || []).length} trechos`);
|
|
2396
|
+
return {
|
|
2397
|
+
ok: true, texto: r.texto, trechos: r.trechos, palavras: r.palavras || [],
|
|
2398
|
+
comoUsar: 'cada trecho vira uma fala da legenda: {"de":…, "ate":…, "texto":…}. '
|
|
2399
|
+
+ 'O estilo da legenda (fonte, cor, peso, posição, animação) é escolha sua — não há padrão.',
|
|
2400
|
+
};
|
|
2401
|
+
} catch (e) {
|
|
2402
|
+
return { ok: false, error: `a transcrição falhou: ${e.message}` };
|
|
2403
|
+
}
|
|
2404
|
+
}
|
|
2405
|
+
|
|
2406
|
+
// ── estudio_render ───────────────────────────────────────────────────────
|
|
2407
|
+
|
|
2408
|
+
/* O SEGUNDO MOTOR: HYPERFRAMES (heygen-com/hyperframes, Apache-2.0, 13/10:
|
|
2409
|
+
"trabalhar com o Remotion, mas também com o Hyperframes"). A IA escreve a
|
|
2410
|
+
composição em HTML (index.html com data-start/data-duration e GSAP, CSS ou
|
|
2411
|
+
three.js) numa pasta dela; aqui a pasta vai para o projeto, ganha a midia/
|
|
2412
|
+
do projeto (voz, trilha, sons do Estúdio), e o CLI renderiza num Chrome
|
|
2413
|
+
escondido — sem telemetria (HYPERFRAMES_NO_TELEMETRY). Depois, o mesmo do
|
|
2414
|
+
Remotion: volume de Reels, a conferência e o vídeo aberto. */
|
|
2415
|
+
const HYPERFRAMES = 'hyperframes@0.8.154';
|
|
2416
|
+
async function renderHyperframes(p, args, ctx = {}) {
|
|
2417
|
+
const pedido = String(args.html || args.composicao || 'hyperframes').trim();
|
|
2418
|
+
const origem = [path.resolve(p.pasta, pedido), args.__pasta && path.resolve(args.__pasta, pedido), path.isAbsolute(pedido) && pedido]
|
|
2419
|
+
.find((d) => d && fs.existsSync(path.join(d, 'index.html')));
|
|
2420
|
+
if (!origem) return { ok: false, error: `não achei ${pedido}/index.html — escreva a composição do Hyperframes numa pasta com index.html e passe html:"<pasta>".` };
|
|
2421
|
+
const destino = path.join(p.pasta, 'hyperframes');
|
|
2422
|
+
if (path.resolve(origem) !== path.resolve(destino)) {
|
|
2423
|
+
fs.rmSync(destino, { recursive: true, force: true });
|
|
2424
|
+
fs.cpSync(origem, destino, { recursive: true });
|
|
2425
|
+
}
|
|
2426
|
+
const midia = path.join(destino, 'midia');
|
|
2427
|
+
if (!fs.existsSync(midia) && fs.existsSync(path.join(p.pasta, 'midia'))) fs.symlinkSync(path.join(p.pasta, 'midia'), midia);
|
|
2428
|
+
const saida = path.join(p.pasta, 'saida', `${projeto.apelidar(p.titulo)}.mp4`);
|
|
2429
|
+
fs.mkdirSync(path.dirname(saida), { recursive: true });
|
|
2430
|
+
(ctx.aoFalar || (() => {}))('renderizando no Hyperframes');
|
|
2431
|
+
const npx = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
2432
|
+
const r = await new Promise((resolve) => {
|
|
2433
|
+
const { spawn } = require('child_process');
|
|
2434
|
+
const proc = spawn(npx, ['--yes', HYPERFRAMES, 'render', destino, '-o', saida, '--quiet'], { env: { ...process.env, HYPERFRAMES_NO_TELEMETRY: '1', DO_NOT_TRACK: '1' } });
|
|
2435
|
+
let erro = '';
|
|
2436
|
+
proc.stderr.on('data', (d) => { erro += d; });
|
|
2437
|
+
proc.stdout.on('data', (d) => { erro += d; });
|
|
2438
|
+
const relogio = setTimeout(() => { try { proc.kill(); } catch { /* já saiu */ } }, (Number(args.minutos) || 20) * 60000);
|
|
2439
|
+
proc.on('close', (code) => { clearTimeout(relogio); resolve({ ok: code === 0 && fs.existsSync(saida), erro }); });
|
|
2440
|
+
proc.on('error', (e) => { clearTimeout(relogio); resolve({ ok: false, erro: e.message }); });
|
|
2441
|
+
});
|
|
2442
|
+
if (!r.ok) return { ok: false, error: `o Hyperframes não renderizou: ${r.erro.slice(-400)}`, comoResolver: 'precisa de Node 22+ e do ffmpeg; rode `npx hyperframes doctor` na pasta.' };
|
|
2443
|
+
const med = await video.medir(saida);
|
|
2444
|
+
if (med.ok && med.temAudio) {
|
|
2445
|
+
const tmp = saida.replace(/\.mp4$/, '.norm.mp4');
|
|
2446
|
+
const ln = await video.rodar(video.ffmpeg(), ['-y', '-i', saida, '-c:v', 'copy', '-af', 'loudnorm=I=-14:TP=-1.2:LRA=10', '-c:a', 'aac', '-b:a', '256k', tmp], { timeout: 15 * 60000 });
|
|
2447
|
+
if (ln.ok && fs.existsSync(tmp)) fs.renameSync(tmp, saida); else { try { fs.unlinkSync(tmp); } catch { /* não havia */ } }
|
|
2448
|
+
}
|
|
2449
|
+
const bytes = fs.statSync(saida).size;
|
|
2450
|
+
projeto.salvar(p.id, { renders: [...(p.renders || []), { quando: new Date().toISOString(), arquivo: saida, bytes, motor: 'hyperframes' }] });
|
|
2451
|
+
projeto.anotar(p.id, 'render', `hyperframes: ${(bytes / 1048576).toFixed(1)} MB, ${(med.segundos || 0).toFixed(1)}s`);
|
|
2452
|
+
const conf = await conferencia.conferir(saida, { duracao: med.segundos || 0 });
|
|
2453
|
+
if (conf.ok && conf.avisos.length) projeto.anotar(p.id, 'conferencia', conf.avisos.join('; '));
|
|
2454
|
+
if (ctx.abrir) { try { ctx.abrir(saida); } catch { /* o caminho está na resposta */ } }
|
|
2455
|
+
return { ok: true, motor: 'hyperframes', arquivo: saida, bytes, segundos: med.segundos,
|
|
2456
|
+
conferencia: conf.ok ? { som: conf.som, parados: conf.parados, avisos: conf.avisos, olho: conf.olho } : undefined,
|
|
2457
|
+
aviso: 'ABERTO para o usuário assistir. Chame finish dizendo o que foi feito' + (conf.ok && conf.avisos.length ? ' — e cite os avisos da conferência.' : '.') };
|
|
2458
|
+
}
|
|
2459
|
+
|
|
2460
|
+
async function ferramentaRender(args, ctx = {}) {
|
|
2461
|
+
const p = projetoOuRecente(args.id);
|
|
2462
|
+
if (!p) return semProjeto(args.id);
|
|
2463
|
+
if (args.id == null || String(args.id).trim() === '') args = { ...args, id: p.id };
|
|
2464
|
+
if (String(args.motor || '').toLowerCase() === 'hyperframes' || args.html) return renderHyperframes(p, args, ctx);
|
|
2465
|
+
const pl = projeto.lerPlano(args.id);
|
|
2466
|
+
if (!pl) return { ok: false, error: 'não há plano neste projeto.' };
|
|
2467
|
+
|
|
2468
|
+
const conferida = plano.conferir(pl, { pasta: p.pasta });
|
|
2469
|
+
if (!conferida.ok) {
|
|
2470
|
+
return { ok: false, error: 'o plano tem problemas — conserte antes de renderizar.',
|
|
2471
|
+
problemas: conferida.problemas.slice(0, 12) };
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
/* A REVISÃO (revisor.js): o plano roda; agora, ele está bom? Conserta a
|
|
2475
|
+
receita (transição repetida, câmera sem respiro, som duplicado) e
|
|
2476
|
+
devolve o resto como aviso para quem fez o plano. */
|
|
2477
|
+
const revisao = revisor.revisar(pl, { semImagem: referencias.semImagem() });
|
|
2478
|
+
if (revisao.consertos.length) projeto.anotar(args.id, 'revisao', revisao.consertos.join('; '));
|
|
2479
|
+
if (revisao.avisos.length) projeto.anotar(args.id, 'revisao', 'avisos: ' + revisao.avisos.join('; '));
|
|
2480
|
+
|
|
2481
|
+
/* A ÁREA SEGURA E O RESPIRO (margem.js): nada a menos de 6%/7% da borda,
|
|
2482
|
+
nada colado em nada. É conta, não pedido: o elemento que o modelo pôs
|
|
2483
|
+
encostado entra, o texto largo encolhe, o colado se afasta. */
|
|
2484
|
+
const guarda = margem.guardarPlano(pl);
|
|
2485
|
+
if (guarda.consertos.length) projeto.anotar(args.id, 'margem', guarda.consertos.slice(0, 12).join('; '));
|
|
2486
|
+
|
|
2487
|
+
// Os ícones vêm ANTES do render: um render que busca ícone na internet
|
|
2488
|
+
// falha no meio, depois de vinte minutos.
|
|
2489
|
+
const { mapa, faltaram } = await assets.iconesDoPlano(pl, p.pasta);
|
|
2490
|
+
|
|
2491
|
+
/* A MÚSICA NO CORTE (batida.js): a faixa começa no ponto em que as
|
|
2492
|
+
batidas caem nos cortes do plano, e o corte de impacto num acento. Só
|
|
2493
|
+
quando ninguém disse o início (audio.trilha.inicio). */
|
|
2494
|
+
const tr = pl.audio && pl.audio.trilha;
|
|
2495
|
+
if (tr && !(typeof tr === 'object' && tr.inicio != null) && !(p.formato === 'slides' || p.formato === 'arte' || args.paginas)) {
|
|
2496
|
+
try {
|
|
2497
|
+
const src = path.join(p.pasta, tr.src || tr);
|
|
2498
|
+
const analise = await batida.analisar(src, { ffmpeg: video.ffmpeg() || 'ffmpeg' });
|
|
2499
|
+
if (analise && analise.batidas.length) {
|
|
2500
|
+
const duracao = (pl.cenas || []).reduce((n, c) => n + (Number(c.duracao) || 0), 0);
|
|
2501
|
+
const r = batida.melhorInicio(batida.cortesDoPlano(pl), analise, { maximo: Math.min(20, analise.segundos - duracao - 0.5) });
|
|
2502
|
+
pl.audio.trilha = { ...(typeof tr === 'object' ? tr : { src: tr }), inicio: r.inicio };
|
|
2503
|
+
projeto.anotar(args.id, 'trilha', `${analise.bpm} BPM; a faixa entra em ${r.inicio}s e ${r.alinhados} de ${r.total} cortes caem na batida`);
|
|
2504
|
+
}
|
|
2505
|
+
} catch { /* sem análise, a faixa entra do começo */ }
|
|
2506
|
+
}
|
|
2507
|
+
|
|
2508
|
+
const montado = remotion.montar({ pasta: p.pasta, titulo: p.titulo, plano: pl, icones: mapa });
|
|
2509
|
+
|
|
2510
|
+
if (args.somenteProjeto) {
|
|
2511
|
+
return { ok: true, projeto: montado.raiz, faltaram,
|
|
2512
|
+
aviso: 'o projeto Remotion está escrito, mas nada foi renderizado.' };
|
|
2513
|
+
}
|
|
2514
|
+
|
|
2515
|
+
/* SLIDES E ARTE são o mesmo plano, parados no tempo: cada cena vira uma
|
|
2516
|
+
página. O Studio antigo tinha seis ferramentas com seis formatos de
|
|
2517
|
+
documento; cinco delas eram "coisas posicionadas num retângulo", que é
|
|
2518
|
+
o que uma cena já é. */
|
|
2519
|
+
const parado = p.formato === 'slides' || p.formato === 'arte' || args.paginas;
|
|
2520
|
+
if (parado) {
|
|
2521
|
+
const pasta = path.join(p.pasta, 'saida', 'paginas');
|
|
2522
|
+
const r = await slides.renderizarPaginas({
|
|
2523
|
+
raiz: montado.raiz, destino: pasta, plano: pl, aoFalar: ctx.aoFalar || (() => {}),
|
|
2524
|
+
});
|
|
2525
|
+
if (!r.ok) return { ...r, faltaram };
|
|
2526
|
+
|
|
2527
|
+
const pdf = path.join(p.pasta, 'saida', `${projeto.apelidar(p.titulo)}.pdf`);
|
|
2528
|
+
const junto = slides.montarPDF(r.paginas, pdf);
|
|
2529
|
+
if (!junto.ok) return { ...junto, imagens: r.paginas };
|
|
2530
|
+
|
|
2531
|
+
projeto.salvar(args.id, { renders: [...(p.renders || []), { quando: new Date().toISOString(), arquivo: pdf, bytes: junto.bytes }] });
|
|
2532
|
+
projeto.anotar(args.id, 'render', `${junto.paginas} páginas em PDF`);
|
|
2533
|
+
if (ctx.abrir) { try { ctx.abrir(pdf); } catch { /* o caminho está na resposta */ } }
|
|
2534
|
+
return {
|
|
2535
|
+
ok: true, arquivo: pdf, paginas: junto.paginas, bytes: junto.bytes,
|
|
2536
|
+
imagens: r.paginas,
|
|
2537
|
+
faltaram: faltaram.length ? faltaram : undefined,
|
|
2538
|
+
aviso: 'ABERTO para o usuário ver. Chame finish dizendo o que foi feito.',
|
|
2539
|
+
};
|
|
2540
|
+
}
|
|
2541
|
+
|
|
2542
|
+
const saida = path.join(p.pasta, 'saida', `${projeto.apelidar(p.titulo)}.mp4`);
|
|
2543
|
+
const falar = ctx.aoFalar || (() => {});
|
|
2544
|
+
const r = await remotion.renderizar({
|
|
2545
|
+
raiz: montado.raiz, saida,
|
|
2546
|
+
minutos: Number(args.minutos) || 30,
|
|
2547
|
+
aoFalar: falar,
|
|
2548
|
+
});
|
|
2549
|
+
if (!r.ok) return { ...r, faltaram };
|
|
2550
|
+
|
|
2551
|
+
/* O VOLUME FINAL: a mistura (voz, música, efeitos, depoimento) sai no
|
|
2552
|
+
padrão de Reels e YouTube, -14 LUFS. Medido em 25/09: o vídeo pronto
|
|
2553
|
+
saía com -23,6 dB de média. A imagem não é recodificada. */
|
|
2554
|
+
if (pl.audio && fs.existsSync(saida)) {
|
|
2555
|
+
const tmp = saida.replace(/\.mp4$/, '.norm.mp4');
|
|
2556
|
+
const ln = await video.rodar(video.ffmpeg(), ['-y', '-i', saida, '-c:v', 'copy', '-af', 'loudnorm=I=-14:TP=-1.2:LRA=10',
|
|
2557
|
+
'-c:a', 'aac', '-b:a', '256k', tmp], { timeout: 15 * 60000 });
|
|
2558
|
+
if (ln.ok && fs.existsSync(tmp)) fs.renameSync(tmp, saida);
|
|
2559
|
+
else { try { fs.unlinkSync(tmp); } catch { /* não havia */ } }
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2562
|
+
const bytes = fs.existsSync(saida) ? fs.statSync(saida).size : 0;
|
|
2563
|
+
projeto.salvar(args.id, { renders: [...(p.renders || []), { quando: new Date().toISOString(), arquivo: saida, bytes }] });
|
|
2564
|
+
projeto.anotar(args.id, 'render', `${(bytes / 1048576).toFixed(1)} MB, ${conferida.duracao}s`);
|
|
2565
|
+
|
|
2566
|
+
/* A CONFERÊNCIA (conferencia.js): o arquivo que saiu, medido. Som fora do
|
|
2567
|
+
alvo e imagem parada viram aviso; quem decide se refaz é o agente. */
|
|
2568
|
+
const conf = fs.existsSync(saida) ? await conferencia.conferir(saida, { duracao: conferida.duracao }) : { ok: false };
|
|
2569
|
+
const avisosDoArquivo = conf.ok ? conf.avisos : [];
|
|
2570
|
+
if (avisosDoArquivo.length) projeto.anotar(args.id, 'conferencia', avisosDoArquivo.join('; '));
|
|
2571
|
+
|
|
2572
|
+
// O vídeo pronto abre. É a única coisa que abre — a interface morreu, e
|
|
2573
|
+
// o que a pessoa pediu foi o vídeo.
|
|
2574
|
+
if (ctx.abrir) { try { ctx.abrir(saida); } catch { /* o caminho está na resposta */ } }
|
|
2575
|
+
|
|
2576
|
+
return {
|
|
2577
|
+
ok: true, arquivo: saida, bytes, segundos: conferida.duracao,
|
|
2578
|
+
faltaram: faltaram.length ? faltaram : undefined,
|
|
2579
|
+
revisao: revisao.consertos.length || revisao.avisos.length ? { consertado: revisao.consertos, avisos: revisao.avisos } : undefined,
|
|
2580
|
+
conferencia: conf.ok ? { som: conf.som, parados: conf.parados, avisos: conf.avisos, olho: conf.olho } : undefined,
|
|
2581
|
+
aviso: 'ABERTO para o usuário assistir. Chame finish dizendo o que foi feito'
|
|
2582
|
+
+ (revisao.avisos.length || avisosDoArquivo.length ? ' — e cite os avisos da revisão e da conferência que valem um novo plano.' : '.'),
|
|
2583
|
+
};
|
|
2584
|
+
}
|
|
2585
|
+
|
|
2586
|
+
// ── estudio_site ─────────────────────────────────────────────────────────
|
|
2587
|
+
|
|
2588
|
+
/* A PALETA INTEIRA do site, não só a primeira cor. O fundo é o neutro
|
|
2589
|
+
escuro que o site mais usa (#121218 na Paris Group); o destaque é a cor da
|
|
2590
|
+
marca que mais aparece sobre ele (o laranja, não o azul escuro que some); o
|
|
2591
|
+
apoio é a seguinte. A fonte serifada, quando existe, vai para citação. */
|
|
2592
|
+
function paletaDoSite(r) {
|
|
2593
|
+
const hexRgb = (h) => { const n = parseInt(String(h).slice(1).padEnd(6, '0').slice(0, 6), 16); return [n >> 16, (n >> 8) & 255, n & 255]; };
|
|
2594
|
+
const luz = (h) => { const [a, b, c] = hexRgb(h); return (0.299 * a + 0.587 * b + 0.114 * c) / 255; };
|
|
2595
|
+
const sat = (h) => { const v = hexRgb(h); return (Math.max(...v) - Math.min(...v)) / 255; };
|
|
2596
|
+
const neutras = ((r.cores && (r.cores.neutras || r.cores.fundo)) || []).map((x) => x.cor || x).filter((c) => /^#/.test(c));
|
|
2597
|
+
const fundo = neutras.find((c) => luz(c) < 0.15 && luz(c) > 0.02) || neutras.find((c) => luz(c) < 0.2) || undefined;
|
|
2598
|
+
const base = fundo || '#121218';
|
|
2599
|
+
const marca = ((r.cores && r.cores.marca) || []).map((x) => x.cor).filter(Boolean);
|
|
2600
|
+
const nota = (c) => sat(c) * 1.2 + Math.abs(luz(c) - luz(base));
|
|
2601
|
+
const ordenadas = [...marca].sort((a, b) => nota(b) - nota(a));
|
|
2602
|
+
const destaque = ordenadas[0];
|
|
2603
|
+
// O apoio é OUTRA cor, de outro matiz: dois laranjas não fazem paleta.
|
|
2604
|
+
const matiz = (h) => { const [a, b, c] = hexRgb(h).map((v) => v / 255); const mx = Math.max(a, b, c), mn = Math.min(a, b, c), d = mx - mn;
|
|
2605
|
+
if (!d) return 0; const x = mx === a ? ((b - c) / d) % 6 : mx === b ? (c - a) / d + 2 : (a - b) / d + 4; return (x * 60 + 360) % 360; };
|
|
2606
|
+
const longe = (a, b) => { const d = Math.abs(matiz(a) - matiz(b)); return Math.min(d, 360 - d) > 60; };
|
|
2607
|
+
const apoio = ordenadas.find((c) => c !== destaque && longe(c, destaque) && sat(c) > 0.3) || ordenadas[1];
|
|
2608
|
+
const fontes = ((r.fontes && r.fontes.declaradas) || []).map((x) => x.fonte).filter((f) => !/mono|menlo|courier|system|arial|helvetica/i.test(f));
|
|
2609
|
+
return {
|
|
2610
|
+
cores: { ...(fundo ? { fundo } : {}), ...(destaque ? { destaque } : {}), ...(apoio ? { apoio } : {}) },
|
|
2611
|
+
fontes: {
|
|
2612
|
+
...(fontes[0] ? { titulo: fontes.find((f) => !/serif/i.test(f) || /sans/i.test(f)) || fontes[0], texto: fontes.find((f) => !/serif/i.test(f) || /sans/i.test(f)) || fontes[0] } : {}),
|
|
2613
|
+
...(fontes.find((f) => /serif/i.test(f) && !/sans/i.test(f)) ? { serifa: fontes.find((f) => /serif/i.test(f) && !/sans/i.test(f)) } : {}),
|
|
2614
|
+
},
|
|
2615
|
+
};
|
|
2616
|
+
}
|
|
2617
|
+
|
|
2618
|
+
async function ferramentaSite(args) {
|
|
2619
|
+
let alvo = String(args.url || args.site || '').trim();
|
|
2620
|
+
|
|
2621
|
+
/* Só o NOME da empresa também serve: "faz um vídeo para a Paris Group"
|
|
2622
|
+
não traz link nenhum, e sem este caminho o agente inventaria as cores
|
|
2623
|
+
da marca — erro que aparece pronto no vídeo entregue. */
|
|
2624
|
+
if (!alvo && (args.marca || args.nome || args.empresa)) {
|
|
2625
|
+
const achado = await identidade.acharSite(args.marca || args.nome || args.empresa);
|
|
2626
|
+
if (!achado.ok) return achado;
|
|
2627
|
+
alvo = achado.url;
|
|
2628
|
+
}
|
|
2629
|
+
if (!alvo) return { ok: false, error: 'mande a url do site, ou o nome da empresa em "marca".' };
|
|
2630
|
+
// "tailwindcss.com" é endereço para gente e não é URL para o `new URL`.
|
|
2631
|
+
// Sem isto, o domínio sem esquema voltava "não é um endereço" — e quem
|
|
2632
|
+
// digita o domínio pelado é justamente quem já sabe qual é o site.
|
|
2633
|
+
if (!/^https?:\/\//i.test(alvo)) alvo = 'https://' + alvo;
|
|
2634
|
+
|
|
2635
|
+
const r = await identidade.analisar(alvo);
|
|
2636
|
+
if (r.ok) r.achadoPor = args.url || args.site ? 'url dada' : 'nome da empresa';
|
|
2637
|
+
|
|
2638
|
+
/* A LOGO. Cor e fonte saem do CSS; a logo não — ela mora num <img> do
|
|
2639
|
+
cabeçalho, num apple-touch-icon ou no og:image. Sem baixar aqui, o
|
|
2640
|
+
agente montava a peça de marca com o nome em texto e o usuário
|
|
2641
|
+
perguntava por que a logo dele não apareceu.
|
|
2642
|
+
|
|
2643
|
+
Só baixa quando há projeto: arquivo de mídia solto no disco, fora de
|
|
2644
|
+
uma pasta de projeto, é lixo que ninguém recolhe. */
|
|
2645
|
+
const html = r.html;
|
|
2646
|
+
delete r.html; // o HTML cru não vai para o modelo
|
|
2647
|
+
if (r.ok) {
|
|
2648
|
+
const marcaLida = paletaDoSite(r);
|
|
2649
|
+
ultimoSite = { url: r.url, html, quando: Date.now(), marca: marcaLida };
|
|
2650
|
+
}
|
|
2651
|
+
if (r.ok && args.id && args.logo !== false) {
|
|
2652
|
+
const p = projeto.ler(args.id);
|
|
2653
|
+
if (p) {
|
|
2654
|
+
/* O nome que o USUÁRIO disse vem primeiro. `r.marca` sai do
|
|
2655
|
+
<title>, e título de página é frase: o nubank.com.br devolve
|
|
2656
|
+
"Nu | About us", de onde sobra "about" — que não identifica
|
|
2657
|
+
marca nenhuma e faz o desempate premiar a imagem errada. */
|
|
2658
|
+
const daMarca = args.marca || args.nome || args.empresa || r.marca || r.titulo || 'marca';
|
|
2659
|
+
r.logo = await identidade.pegarLogo(html, r.url, { pasta: p.pasta, nome: daMarca });
|
|
2660
|
+
if (r.logo.ok) projeto.anotar(args.id, 'midia', `logo de ${r.marca || r.url}: ${r.logo.src} (${r.logo.achadaEm})`);
|
|
2661
|
+
}
|
|
2662
|
+
}
|
|
2663
|
+
|
|
2664
|
+
if (r.ok && args.id) {
|
|
2665
|
+
projeto.anotar(args.id, 'referencia', `leu ${r.url}: ${(r.cores.marca[0] || {}).cor || 'sem cor'} · ${(r.fontes.declaradas[0] || {}).fonte || 'sem fonte'}`);
|
|
2666
|
+
}
|
|
2667
|
+
|
|
2668
|
+
/* O ACERVO DA MARCA: as fotos e os vídeos reais do site, e o texto das
|
|
2669
|
+
páginas que combinam com o pedido (lib/plugin/estudio/acervo-site.js). As
|
|
2670
|
+
fotos ficam guardadas no projeto e o roteiro as usa sozinho; os fatos
|
|
2671
|
+
voltam para o modelo escrever o roteiro com dado de verdade. */
|
|
2672
|
+
if (r.ok && args.id && args.acervo !== false) {
|
|
2673
|
+
const p = projeto.ler(args.id);
|
|
2674
|
+
if (p) {
|
|
2675
|
+
try {
|
|
2676
|
+
const a = await acervoSite.colher({
|
|
2677
|
+
url: r.url, pedido: args.pedido || p.pedido || '', pasta: p.pasta, htmlInicial: html,
|
|
2678
|
+
buscar: identidade.buscar, baixar: assets.baixar,
|
|
2679
|
+
});
|
|
2680
|
+
const marca = { ...ultimoSite.marca, ...(r.logo && r.logo.ok ? { logo: r.logo.src } : {}) };
|
|
2681
|
+
/* O GRADIENTE da marca sai da própria logo, quando ela é SVG com
|
|
2682
|
+
gradiente (a da Paris Group vai de #2E81ED a #9567DB). */
|
|
2683
|
+
try {
|
|
2684
|
+
if (marca.logo && /\.svg$/i.test(marca.logo)) {
|
|
2685
|
+
const svg = fs.readFileSync(path.join(p.pasta, marca.logo), 'utf8');
|
|
2686
|
+
const stops = [...new Set((svg.match(/stop-color=["'](#[0-9a-f]{3,6})["']/gi) || []).map((x) => x.match(/#[0-9a-f]{3,6}/i)[0].toUpperCase()))];
|
|
2687
|
+
if (stops.length >= 2) {
|
|
2688
|
+
marca.gradiente = stops.slice(0, 2);
|
|
2689
|
+
// A logo manda na identidade: o destaque é a cor dela, não a do CSS.
|
|
2690
|
+
marca.cores = { ...(marca.cores || {}), destaque: stops[1], apoio: stops[0] };
|
|
2691
|
+
}
|
|
2692
|
+
}
|
|
2693
|
+
} catch { /* sem gradiente */ }
|
|
2694
|
+
/* Os ícones do próprio site (os <svg> dos cartões): viram "site:N" no roteiro. */
|
|
2695
|
+
const icSite = marcaLib.iconesDoSite(html);
|
|
2696
|
+
if (icSite.length) { marca.iconesSite = icSite; r.icones = icSite.map((x, i) => `site:${i + 1}${x.nome ? ' (' + x.nome + ')' : ''}`); }
|
|
2697
|
+
projeto.salvar(args.id, { acervo: { fotos: a.fotos, videos: a.videos, fatos: a.fatos, site: r.url }, marca });
|
|
2698
|
+
projeto.anotar(args.id, 'midia', `acervo do site: ${a.fotos.length} fotos, ${a.videos.length} vídeos, ${a.paginas.length} páginas lidas`);
|
|
2699
|
+
let orcamento = 4200;
|
|
2700
|
+
r.fatos = a.fatos.map((f) => {
|
|
2701
|
+
const texto = f.texto.slice(0, Math.max(0, Math.min(1400, orcamento)));
|
|
2702
|
+
orcamento -= texto.length;
|
|
2703
|
+
return { pagina: f.pagina, texto };
|
|
2704
|
+
}).filter((f) => f.texto);
|
|
2705
|
+
r.acervo = { fotos: a.fotos.length, videos: a.videos.length,
|
|
2706
|
+
exemplos: a.fotos.slice(0, 6).map((f) => f.alt).filter(Boolean) };
|
|
2707
|
+
r.comoUsar = 'Escreva o roteiro com os FATOS acima (datas, local, números, frases da marca) — nada '
|
|
2708
|
+
+ 'inventado. As fotos e os vídeos reais da marca entram SOZINHOS no vídeo: não precisa pôr '
|
|
2709
|
+
+ '"busca" nas partes de imagem (use tipo "imagem" com só o título). Use as cores, a fonte e '
|
|
2710
|
+
+ 'a logo em roteiro.marca (objeto: {cores: {fundo, destaque, tinta}, fontes: {titulo, texto}}).'
|
|
2711
|
+
+ (r.icones ? ' Os ícones do site estão em "icones": ponha icone:"site:N" na parte em que o assunto dele aparece.' : '');
|
|
2712
|
+
} catch (e) {
|
|
2713
|
+
r.acervo = { erro: e.message };
|
|
2714
|
+
}
|
|
2715
|
+
}
|
|
2716
|
+
}
|
|
2717
|
+
return r;
|
|
2718
|
+
}
|
|
2719
|
+
|
|
2720
|
+
module.exports = { proporcaoDoPedido,
|
|
2721
|
+
vazamentoNoComeco, variarIcones, objetosDoRoteiro,
|
|
2722
|
+
ferramentaProjeto, ferramentaPlano, ferramentaMidia, ferramentaAE, ferramentaMotion, ferramentaEditar, ferramentaNarrar, ferramentaCriar,
|
|
2723
|
+
ferramentaVideo, ferramentaRender, ferramentaSite,
|
|
2724
|
+
projeto, plano, remotion, assets, video, identidade, slides, python, rodarPython, alinharPartes, prepararRoteiro, roteiroValido, juntarVozes,
|
|
2725
|
+
};
|