primocode 10.13.0 → 10.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +66 -12
  2. package/bin/primocode.js +148 -8
  3. package/lib/act.js +48 -1
  4. package/lib/catalogo.js +12 -1
  5. package/lib/config.js +1 -0
  6. package/lib/estudio/cota.js +150 -0
  7. package/lib/estudio/dados/projetos/clube-ad5.json +105 -0
  8. package/lib/estudio/dados/projetos/clube-ae-sem-memoria.json +107 -0
  9. package/lib/estudio/dados/projetos/clube-agent.json +120 -0
  10. package/lib/estudio/dados/projetos/clube-antes-e-agora.json +86 -0
  11. package/lib/estudio/dados/projetos/clube-apresentando-clube.json +110 -0
  12. package/lib/estudio/dados/projetos/clube-bluevisa.json +106 -0
  13. package/lib/estudio/dados/projetos/clube-caught-in-the-fire.json +127 -0
  14. package/lib/estudio/dados/projetos/clube-chat-cliente-satisfeito.json +98 -0
  15. package/lib/estudio/dados/projetos/clube-chatgpt-anuncios.json +120 -0
  16. package/lib/estudio/dados/projetos/clube-claude-dj.json +140 -0
  17. package/lib/estudio/dados/projetos/clube-claude-mcp.json +142 -0
  18. package/lib/estudio/dados/projetos/clube-cleanui.json +106 -0
  19. package/lib/estudio/dados/projetos/clube-clinica-take-unico.json +128 -0
  20. package/lib/estudio/dados/projetos/clube-clinica.json +104 -0
  21. package/lib/estudio/dados/projetos/clube-clube-opener.json +125 -0
  22. package/lib/estudio/dados/projetos/clube-clube.json +108 -0
  23. package/lib/estudio/dados/projetos/clube-codigo.json +101 -0
  24. package/lib/estudio/dados/projetos/clube-distilbook.json +104 -0
  25. package/lib/estudio/dados/projetos/clube-drive-upload.json +115 -0
  26. package/lib/estudio/dados/projetos/clube-dub.json +119 -0
  27. package/lib/estudio/dados/projetos/clube-enxovaly.json +105 -0
  28. package/lib/estudio/dados/projetos/clube-fecha7.json +118 -0
  29. package/lib/estudio/dados/projetos/clube-filatov.json +128 -0
  30. package/lib/estudio/dados/projetos/clube-frame.json +108 -0
  31. package/lib/estudio/dados/projetos/clube-glass.json +118 -0
  32. package/lib/estudio/dados/projetos/clube-letra-em-apps.json +84 -0
  33. package/lib/estudio/dados/projetos/clube-letra-globo-3d.json +111 -0
  34. package/lib/estudio/dados/projetos/clube-letra-nos-apps.json +146 -0
  35. package/lib/estudio/dados/projetos/clube-letra-seis-mundos.json +100 -0
  36. package/lib/estudio/dados/projetos/clube-lula-3.json +146 -0
  37. package/lib/estudio/dados/projetos/clube-morph.json +119 -0
  38. package/lib/estudio/dados/projetos/clube-motion-designer.json +115 -0
  39. package/lib/estudio/dados/projetos/clube-motion-pacote.json +112 -0
  40. package/lib/estudio/dados/projetos/clube-movimento.json +103 -0
  41. package/lib/estudio/dados/projetos/clube-not-like-us.json +117 -0
  42. package/lib/estudio/dados/projetos/clube-pinterest-inspiracao.json +86 -0
  43. package/lib/estudio/dados/projetos/clube-pixel-e-tinta.json +108 -0
  44. package/lib/estudio/dados/projetos/clube-ponte.json +118 -0
  45. package/lib/estudio/dados/projetos/clube-processo-edit-tonal.json +126 -0
  46. package/lib/estudio/dados/projetos/clube-processo-motion-100-ia.json +109 -0
  47. package/lib/estudio/dados/projetos/clube-promo.json +114 -0
  48. package/lib/estudio/dados/projetos/clube-proposito.json +115 -0
  49. package/lib/estudio/dados/projetos/clube-rankhog.json +128 -0
  50. package/lib/estudio/dados/projetos/clube-recursao.json +116 -0
  51. package/lib/estudio/dados/projetos/clube-revelar.json +118 -0
  52. package/lib/estudio/dados/projetos/clube-robo.json +125 -0
  53. package/lib/estudio/dados/projetos/clube-shelby-ep2.json +144 -0
  54. package/lib/estudio/dados/projetos/clube-shelby.json +97 -0
  55. package/lib/estudio/dados/projetos/clube-solar-eclipse.json +96 -0
  56. package/lib/estudio/dados/projetos/clube-soldier.json +128 -0
  57. package/lib/estudio/dados/projetos/clube-som-de-cena.json +108 -0
  58. package/lib/estudio/dados/projetos/clube-spotify-candidatura.json +112 -0
  59. package/lib/estudio/dados/projetos/clube-tda-app.json +118 -0
  60. package/lib/estudio/dados/projetos/clube-tda-ia.json +75 -0
  61. package/lib/estudio/dados/projetos/clube-telegram-chat.json +118 -0
  62. package/lib/estudio/dados/projetos/clube-telegram-ilha.json +106 -0
  63. package/lib/estudio/dados/projetos/clube-tennessee-nike.json +132 -0
  64. package/lib/estudio/dados/projetos/clube-tudo-se-move.json +112 -0
  65. package/lib/estudio/dados/projetos/clube-uiad.json +107 -0
  66. package/lib/estudio/dados/projetos/clube-viralgrow.json +108 -0
  67. package/lib/estudio/dados/projetos/clube-whose-side.json +140 -0
  68. package/lib/estudio/dados/projetos/clube-youtube-inscrever.json +108 -0
  69. package/lib/estudio/dados/projetos/elementos-do-site-em-movimento.json +49 -0
  70. package/lib/estudio/dados/projetos/explainer-narrado.json +51 -0
  71. package/lib/estudio/dados/projetos/lancamento-de-produto.json +51 -0
  72. package/lib/estudio/dados/projetos/motion-so-com-sons.json +50 -0
  73. package/lib/estudio/dados/projetos/titulo-em-after-effects.json +51 -0
  74. package/lib/estudio/dados/projetos/tour-de-saas.json +50 -0
  75. package/lib/estudio/dados/projetos-ae/antes-e-agora/ae/cenas.jsx +733 -0
  76. package/lib/estudio/dados/projetos-ae/antes-e-agora/assets/fazer_assets.py +88 -0
  77. package/lib/estudio/dados/projetos-ae/letra-em-apps/ae/cenas.jsx +402 -0
  78. package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/preparar_assets.py +17 -0
  79. package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/svg_para_ae.py +25 -0
  80. package/lib/estudio/dados/projetos-ae/letra-nos-apps/BRIEF-AGENTES.md +31 -0
  81. package/lib/estudio/dados/projetos-ae/letra-nos-apps/README.md +53 -0
  82. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ROTEIRO-CENAS.md +69 -0
  83. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/A-agenda.jsx +148 -0
  84. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/B-docs.jsx +174 -0
  85. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/C-alttab.jsx +113 -0
  86. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/D-spotify.jsx +118 -0
  87. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/E-notas.jsx +146 -0
  88. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/F-jornal1.jsx +144 -0
  89. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/G-google.jsx +153 -0
  90. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/H-mapa.jsx +176 -0
  91. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/I-imagens.jsx +132 -0
  92. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/J-jornal2.jsx +191 -0
  93. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/K-maps.jsx +184 -0
  94. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera-movimentos.jsx +48 -0
  95. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera.jsx +57 -0
  96. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/card-spotify.jsx +98 -0
  97. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/digitar.jsx +38 -0
  98. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/jornal-comum.jsx +196 -0
  99. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra.jsx +23 -0
  100. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra_automatica.py +83 -0
  101. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/montagem.jsx +74 -0
  102. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/render_html.py +13 -0
  103. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/util.jsx +162 -0
  104. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-midia-comum.jsx +114 -0
  105. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/wg-util.jsx +360 -0
  106. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/F-jornal1/render_html.py +13 -0
  107. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/render_w-midia.py +26 -0
  108. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/inclin.py +30 -0
  109. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_d.py +36 -0
  110. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_e.py +27 -0
  111. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ajustar_movimentos.py +61 -0
  112. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ancorar.py +74 -0
  113. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/assar.py +47 -0
  114. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/camera3d_jornal.py +172 -0
  115. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/comparar.py +32 -0
  116. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/dados_ae_jornal.py +46 -0
  117. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/folha_contato.py +28 -0
  118. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/homografia_jornal.py +74 -0
  119. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/integrar.py +44 -0
  120. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/medir_quadro_a_quadro.py +32 -0
  121. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/mesa_2d.py +64 -0
  122. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/plot_cenas.py +11 -0
  123. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/retificar_quadros.py +38 -0
  124. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/assar_ab.py +52 -0
  125. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/medir_ab.py +59 -0
  126. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ajustar_h.py +111 -0
  127. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_corrige_cam.py +17 -0
  128. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ecc_cadeia.py +80 -0
  129. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_finalizar_cam.py +65 -0
  130. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_mosaico.py +61 -0
  131. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/01-gramatica-e-roteiro.md +55 -0
  132. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/02-camera.md +66 -0
  133. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/03-montagem-no-ae.md +50 -0
  134. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/04-render-e-conferencia.md +43 -0
  135. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/05-abertura-celular-mergulho.md +43 -0
  136. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces.md +42 -0
  137. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/atraso_imagem.py +31 -0
  138. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/fundo.py +56 -0
  139. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/juntar.py +45 -0
  140. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/montar.py +177 -0
  141. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/rastreio.py +74 -0
  142. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/sincronia.py +18 -0
  143. package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/ae/cenas.jsx +530 -0
  144. package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/assets/fazer_assets.py +107 -0
  145. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/assets/pessoas/figurinha.py +46 -0
  146. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/BRIEF-A.md +83 -0
  147. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/audio.py +179 -0
  148. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/confere.py +20 -0
  149. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte1.js +1 -0
  150. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte2.js +1 -0
  151. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/gerar_emojis.py +11 -0
  152. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/img/filmes/_indice.js +122 -0
  153. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/base.js +380 -0
  154. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/main.js +86 -0
  155. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1a.js +169 -0
  156. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1b.js +455 -0
  157. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1c.js +389 -0
  158. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p2.js +379 -0
  159. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/video.py +62 -0
  160. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/README.md +65 -0
  161. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/oraculo_take.py +137 -0
  162. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/render_take.py +388 -0
  163. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/take.js +235 -0
  164. package/lib/estudio/editor.js +285 -0
  165. package/lib/estudio/effectcraft.js +152 -0
  166. package/lib/estudio/exportar.js +181 -0
  167. package/lib/estudio/index.js +90 -2
  168. package/lib/estudio/kit-ae/base.jsx +1146 -0
  169. package/lib/estudio/kit-ae/cenas.jsx +395 -0
  170. package/lib/estudio/kit-ae/primitivas.jsx +911 -0
  171. package/lib/estudio/maquina-diretor.js +393 -0
  172. package/lib/estudio/maquina-elementos.js +134 -0
  173. package/lib/estudio/maquina-layout.js +198 -0
  174. package/lib/estudio/maquina-som.js +478 -0
  175. package/lib/estudio/maquina-trilha.js +160 -0
  176. package/lib/estudio/maquina-voz.js +429 -0
  177. package/lib/estudio/maquina.js +516 -0
  178. package/lib/estudio/projetos.js +60 -0
  179. package/lib/headless.js +71 -0
  180. package/lib/hooks.js +72 -0
  181. package/lib/local/cerebro.json +398 -12
  182. package/lib/local/entrada.js +46 -2
  183. package/lib/marca-kit.js +309 -0
  184. package/lib/mcp.js +286 -6
  185. package/lib/perigo.js +31 -3
  186. package/lib/planos.js +47 -19
  187. package/lib/preparar.js +111 -0
  188. package/lib/retomar.js +55 -0
  189. package/lib/sandbox.js +197 -0
  190. package/lib/skills.js +3 -1
  191. package/lib/tools.js +13 -4
  192. package/lib/ui.js +1 -1
  193. package/package.json +4 -2
  194. package/skills/after-effects/SKILL.md +52 -0
  195. package/skills/maquina-de-motion/SKILL.md +84 -0
@@ -0,0 +1,169 @@
1
+ /* p1a.js — Parte 1, falas 01–05 + vitrine. Porte da Variação A aprovada (variacoes/A/previa-30s.mp4).
2
+ * 17/10 rodada C: as falas 01–02 viram uma APRESENTAÇÃO à parte (gancho): impacto de abertura com o rap (Still D.R.E.),
3
+ * 🤔 com "?" animados, opener premium do YouMotion com o som dele, figurinha Mega Brain ("ative a força total") e fim de
4
+ * trailer (golpe + cauda longa). Respiro de 1,8 s, flash de câmera e o tutorial começa só com o texto (fala 03).
5
+ * Tempos depois de 11,8 s sempre por F0/PF/CN (o respiro mudou em 17/10 e tudo andou +1 s). Som: comp-a/audio.py (gancho). */
6
+
7
+ const T_DROP = 0.30; // impacto de abertura (golpe + entrada da bateria do rap)
8
+ const T_HIT = PF('02', 'artificial', true) + 0.03; // fim de trailer: golpe + cauda longa; o rap corta aqui
9
+ const T_SOME = F0('03') - 0.55; // a apresentação sai de cena (desfoque)
10
+ const T_FLASH = F0('03') - 0.22; // flash de câmera: o clarão abre o mundo claro do tutorial
11
+ // socos de câmera: impacto, tempos fortes do rap (92 BPM, compasso 2,61 s; a faixa volta em 4,03 s) e o fim de trailer
12
+ golpe(T_DROP, 1.0); golpe(5.47, 0.45); golpe(8.08, 0.55); golpe(T_HIT, 1.4); flash(T_FLASH);
13
+ VIDEOS.push({ nome: 'ask-ai-gemini', t0: 1.42, t1: 4.08, trilha: 'para', alvo: -18 }); // opener com o som dele (o rap pausa)
14
+
15
+ // ═══ GANCHO (falas 01–02): uma apresentação à parte, num mundo ESCURO; tipografia cinética grande (1–3 palavras por vez,
16
+ // centrada) e elementos grandes. O flash branco em T_FLASH abre o mundo claro do tutorial (clarão → claro). ═══
17
+ (function () {
18
+ const ESC = '#0B0B0F', AZ = '#6F8BFF', OR = '#F0946F';
19
+ const F = 'img/filmes/';
20
+ const box = (pai, x, y, w, h, css = {}, html) => $('div', null, pai, Object.assign({ position: 'absolute', left: x + 'px', top: y + 'px', width: w + 'px', height: h + 'px' }, css), html);
21
+ // grupos de texto: [fala, 'palavras com marcas', {y, tam}] — cada grupo substitui o anterior; y = centro do bloco
22
+ const G = [
23
+ ['01', 'Como faço', { y: 1430, tam: 200 }], ['01', 'esse a|estilo', { y: 1430, tam: 190 }], ['01', 'de a|vídeo', { y: 1330, tam: 190 }], ['01', 'usando', { y: 1330, tam: 170 }],
24
+ ['01', [pula(3)], null], ['01', 'of|IA', { y: 1340, tam: 200 }], ['01', 'no meu f|processo?', { y: 960, tam: 190 }],
25
+ ['02', 'Nesse a|vídeo,', { y: 960, tam: 210 }], ['02', 'eu vou tentar', { y: 960, tam: 190 }], ['02', 'f|explicar', { y: 960, tam: 220 }], ['02', 'o meu processo', { y: 1330, tam: 160 }],
26
+ ['02', 'f|criativo', { y: 1330, tam: 200 }], ['02', 'para produzir', { y: 960, tam: 190 }], ['02', 'esse a|tipo', { y: 1340, tam: 190 }], ['02', 'de a|vídeo', { y: 1340, tam: 190 }],
27
+ ['02', 'usando 100%#3 da', { y: 960, tam: 180 }], ['02', 'of|inteligência of|artificial.', { y: 1400, tam: 150 }],
28
+ ];
29
+ const grupos = [];
30
+ G.forEach(([f, txt, o]) => {
31
+ const raw = [].concat(txt).flatMap(x => (typeof x === 'string' ? x.split(/\s+/) : [x]));
32
+ if (!o) { raw.forEach(x => filaDe(f).splice(0, x.pula)); return; }
33
+ grupos.push(Object.assign({ w: raw.map(x => tokPalavra(f, x)) }, o));
34
+ });
35
+ grupos[0].w[0].s = T_DROP - 0.02; // "Como" chega junto do impacto
36
+ grupos.forEach((g, i) => { g.t0 = g.w[0].s - 0.06; });
37
+ grupos.forEach((g, i) => { g.t1 = grupos[i + 1] ? grupos[i + 1].t0 + 0.02 : T_SOME; });
38
+
39
+ cena('gancho', -1, T_FLASH + 0.1, (r, c) => {
40
+ c.fundo = box(r, 0, 0, W, H, { background: `radial-gradient(900px 700px at 20% 12%, rgba(64,96,255,.20), transparent 70%), radial-gradient(900px 800px at 85% 92%, rgba(240,120,80,.16), transparent 70%), ${ESC}` });
41
+ c.gr = box(r, 0, 0, W, H, { opacity: '.10', mixBlendMode: 'screen', backgroundImage: getComputedStyle(document.getElementById('grao')).backgroundImage });
42
+ // 🤔 enorme com "?" pulando em volta (Como faço…)
43
+ c.pen = box(r, 540 - 260, 660 - 260, 520, 520); c.penL = emojiLot(c.pen, 'u1f914', 520);
44
+ c.q = [[170, 420, AZ, -16], [860, 380, OR, 14], [880, 760, '#fff', 22], [160, 820, OR, -10]].map(([x, y, cor, r0]) => Object.assign(box(r, x - 70, y - 90, 140, 180, { font: '700 180px/1 GS', color: cor, textAlign: 'center' }, '?'), { r0 }));
45
+ // opener do YouMotion (Ask AI Workflow) quase em tela cheia, com o som dele
46
+ c.op = box(r, 40, 760 - 281, 1000, 563, { borderRadius: '40px', overflow: 'hidden', background: '#000', boxShadow: '0 0 0 1.5px rgba(255,255,255,.10), 0 60px 140px -30px rgba(64,96,255,.45)' }); c.opF = filme(c.op, 'ask-ai-gemini');
47
+ // 100% gigante contando + logo do Claude
48
+ c.cem = box(r, 0, 610, W, 340, { textAlign: 'center', font: '700 320px/1 GS', letterSpacing: '-0.06em', color: '#fff' });
49
+ c.cl = box(r, 540 - 110, 1000 - 30, 220, 220, {}, `<img src="${LOGO('claude-symbol.svg')}" style="width:220px;height:220px">`);
50
+ // os 4 passos passando rápido (processo criativo)
51
+ const ics = [['emoji', 'u1f50d', '#EEF1FE'], ['emoji', 'u1f3a8', '#FFF6DC'], ['emoji', 'u1f3b5', '#E8F8EE'], ['emoji', 'u2728', '#FBEDE7']];
52
+ c.ics = ics.map(([_, id, fundo], i) => { const q = box(r, 0, 0, 230, 230, { borderRadius: '64px', background: fundo, boxShadow: '0 30px 60px -20px rgba(0,0,0,.6)' }); q.l = emojiLot(q, id, 180); q.l.style.left = '25px'; q.l.style.top = '25px'; return q; });
53
+ // 2º corte de opener (AI Opener: o prompt neon digitando), sem som
54
+ c.op2 = box(r, 40, 760 - 281, 1000, 563, { borderRadius: '40px', overflow: 'hidden', background: '#000', boxShadow: '0 60px 140px -30px rgba(240,120,80,.35)' }); c.op2F = filme(c.op2, 'ai-neon-prompt');
55
+ // Mega Brain: o meme inteiro, com o texto "megabrain, ative a força total" (17/10: sem o antes × depois); brilho azul; clarão no golpe do fim de trailer
56
+ c.mb = box(r, 540 - 410, 700 - 402, 820, 804);
57
+ c.hud = box(c.mb, -60, -60, 940, 924, { borderRadius: '50%', background: 'radial-gradient(closest-side, rgba(64,190,255,.55), rgba(64,190,255,0))' });
58
+ c.mbB = $('img', null, c.mb, { position: 'absolute', left: '0', top: '0', width: '820px' }); c.mbB.src = '../assets/pessoas/megabrain-meme-figurinha.png';
59
+ // texto cinético
60
+ grupos.forEach(g => { g.el = box(r, 40, 0, 1000, 10, { height: 'auto', textAlign: 'center', font: `600 ${g.tam}px/${(g.tam * 1.02).toFixed(0)}px GS`, letterSpacing: '-0.045em', color: '#F7F6F2' });
61
+ g.w.forEach(w => { w.el = $('span', null, g.el, { display: 'inline-block', marginRight: '0.22em', color: w.c === 'az' ? AZ : w.c === 'or' ? OR : '' }, w.txt); }); });
62
+ c.tPen = T_DROP; c.tOp = 1.38; c.tCem = PF('01', 'cem') - 0.05; c.tIA = PF('01', 'ia'); c.tProc = PF('01', 'no') + 0.05; // opener e 100% saem antes de "no meu processo?"
63
+ c.tIcs = PF('02', 'processo'); c.tOp2 = PF('02', 'tipo') - 0.12; c.tMB = PF('02', 'inteligencia') - 0.1; c.tVira = PF('02', 'artificial') + 0.08;
64
+ ev(c.tPen + 0.05, 'pop', 0, 0.35); ev(c.tOp, 'abre', 0, 0.3); ev(c.tCem, 'contador', 0, 0.35); ev(c.tIA, 'pop', 0.2, 0.3);
65
+ c.ics.forEach((_, i) => ev(c.tIcs + i * 0.2, 'pop', -0.4 + i * 0.27, 0.25)); ev(c.tOp2, 'troca', 0, 0.3); ev(c.tMB, 'pop', 0, 0.35); ev(c.tVira, 'flip', 0, 0.35);
66
+ }, (t, c) => {
67
+ c.fundo.style.opacity = c.gr.style.opacity = t < T_FLASH ? '1' : '0'; c.gr.style.opacity = t < T_FLASH ? '.10' : '0';
68
+ const fora = ILL(seg(t, T_SOME - 0.5, T_SOME)); // tudo sai no respiro (sobe e desfoca), o fundo escuro fica até o flash
69
+ // 🤔
70
+ { const n = nasce(t, c.tPen, 0.45), s = sai(t, c.tOp + 0.05, 0.3, { dy: -60, blur1: 30 }); c.penL.toca(t, c.tPen);
71
+ tf(c.pen, { op: n.op * s.op, s: n.s * (1 + 0.03 * Math.sin((t - c.tPen) * 4)), y: n.y + s.y, r: 5 * Math.sin((t - c.tPen) * 2.6), blur: n.blur + s.blur });
72
+ c.q.forEach((q, i) => { const m = nasce(t, c.tPen + 0.12 + i * 0.1, 0.35), u = t - c.tPen; tf(q, { op: m.op * s.op, s: m.s * (1 + 0.08 * Math.sin(u * 6 + i)), r: q.r0 + 10 * Math.sin(u * 3 + i * 2), y: m.y + 14 * Math.sin(u * 4 + i) + s.y, blur: m.blur + s.blur }); }); }
73
+ // opener: entra grande, em "100%" sobe e encolhe para o número ocupar o centro, sai em "processo?"
74
+ { const k = abreJanela(t, c.op, c.tOp, { d: 0.5, lado: 8 }), kc = ILL(seg(t, c.tCem - 0.1, c.tCem + 0.4)), s = sai(t, c.tProc - 0.1, 0.3, { dy: -60, blur1: 26 });
75
+ c.op.style.transform += ` translateY(${(-300 * kc + s.y).toFixed(1)}px) scale(${lerp(1, 0.62, kc).toFixed(3)})`; c.op.style.opacity = (parseFloat(c.op.style.opacity) * s.op).toFixed(3);
76
+ if (s.blur > 0.1) c.op.style.filter = `blur(${s.blur.toFixed(1)}px)`; c.opF.toca(Math.min(t, 4.08), c.tOp, false); }
77
+ // 100% contando + Claude
78
+ { const n = nasce(t, c.tCem, 0.35), s = sai(t, c.tProc - 0.1, 0.3, { dy: -50, blur1: 26 }), v = Math.round(100 * IO(seg(t, c.tCem, c.tCem + 0.55)));
79
+ c.cem.textContent = v + '%'; const bate = Math.exp(-Math.max(0, t - c.tCem - 0.55) * 8) * (t > c.tCem + 0.55 ? 1 : 0);
80
+ tf(c.cem, { op: n.op * s.op, s: lerp(0.7, 1, n.k) * (1 + 0.08 * bate), y: 60 + n.y + s.y, blur: n.blur + s.blur });
81
+ const nl = nasce(t, c.tIA - 0.05, 0.45); tf(c.cl, { op: nl.op * s.op, s: nl.s, r: lerp(-140, 0, nl.k) + (t - c.tIA) * 30, y: 60 + nl.y + s.y, blur: nl.blur + s.blur }); }
82
+ // os 4 passos: entram pela direita, um atrás do outro, ficam em fila e saem pela esquerda
83
+ c.ics.forEach((q, i) => { const ti = c.tIcs + i * 0.2, u = seg(t, ti - 0.05, ti + 0.4), k = ILL(u), ks = ILLIN(seg(t, PF('02', 'para') - 0.1, PF('02', 'para') + 0.3));
84
+ const x = lerp(1180, 30 + i * 260, k) - 1300 * ks; tf(q, { x, y: 640 + 18 * Math.sin((t - ti) * 3 + i), op: clamp(u * 3) * (1 - ks * ks), s: lerp(0.7, 1, k), r: lerp(12, 0, k) + 3 * Math.sin((t + i) * 2), blur: Math.pow(1 - k, 2) * 18 + ks * 20 }); q.l.toca(t, ti); });
85
+ // 2º opener curto
86
+ { abreJanela(t, c.op2, c.tOp2, { d: 0.4, lado: 8 }); const s = sai(t, PF('02', 'usando') + 0.05, 0.3, { dy: -60, blur1: 26 }); c.op2.style.opacity = (parseFloat(c.op2.style.opacity) * s.op).toFixed(3);
87
+ c.op2.style.transform += ` translateY(${s.y.toFixed(1)}px)`; if (s.blur > 0.1) c.op2.style.filter = `blur(${s.blur.toFixed(1)}px)`; c.op2F.toca(t, c.tOp2, false); }
88
+ // Mega Brain
89
+ { const n = nasce(t, c.tMB, 0.5), kv = IO(seg(t, c.tVira, c.tVira + 0.45)), kh = t >= T_HIT ? Math.exp(-(t - T_HIT) * 2.0) : 0;
90
+ const treme = t > c.tMB + 0.25 ? Math.exp(-(t - c.tMB - 0.25) * 7) * Math.sin((t - c.tMB - 0.25) * 55) * 4 : 0;
91
+ tf(c.mb, { op: n.op * (1 - fora), s: n.s * (1 + 0.12 * kh) * (1 + 0.15 * fora), r: -5 + treme + 1.5 * Math.sin(t * 2), y: n.y - 40 * fora, blur: n.blur + fora * 30 });
92
+ const pul = kv * (0.55 + 0.45 * Math.sin((t - c.tVira) * 9)) + 1.2 * kh;
93
+ c.hud.style.opacity = clamp(0.35 * n.op + 0.65 * pul).toFixed(3); c.hud.style.transform = `scale(${(0.9 + 0.15 * clamp(pul)).toFixed(3)})`;
94
+ c.mbB.style.filter = `brightness(${(1 + 0.35 * kh).toFixed(3)})`; }
95
+ // texto cinético: palavra nasce do desfoque; o grupo sai inteiro quando o próximo chega
96
+ grupos.forEach(g => { const vis = t >= g.t0 - 0.1 && t < g.t1 + 0.4; g.el.style.display = vis ? '' : 'none'; if (!vis) return;
97
+ if (!g.h) { g.h = g.el.offsetHeight; g.el.style.top = (g.y - g.h / 2).toFixed(0) + 'px'; }
98
+ const s = sai(t, g.t1, 0.26, { dy: -50, blur1: 26 }); tf(g.el, { op: s.op * (1 - fora), y: s.y, blur: s.blur + fora * 20 });
99
+ g.w.forEach(w => { const p = palavraVida(t, w.s, true); tf(w.el, { op: p.op, y: p.y * 2, s: p.s, blur: p.blur * 1.2 }); }); });
100
+ });
101
+ })();
102
+
103
+ // ═══ PIADA DO GANCHO (17/10): o autor fala "vídeo" 3 vezes seguidas. Um contadorzinho "vídeo ×1/×2/×3" no topo
104
+ // conta cada um e, no 3º, entra a desculpa "dscp por falar “vídeo” dnv 😬". Sem caixa em volta do texto. ═══
105
+ (function () {
106
+ const ts = [PF('01', 'video'), PF('02', 'video'), PF('02', 'video', 1)].map(x => x + 0.08);
107
+ const tDesc = ts[2] + 0.18, tFim = PF('02', 'inteligencia') - 0.15;
108
+ ts.forEach(t => ev(t, 'pop', 0.4, 0.18)); ev(tDesc, 'pop', -0.2, 0.22);
109
+ cena('piada-video', ts[0] - 0.3, tFim + 0.6, (r, c) => {
110
+ c.cont = $('div', null, r, { position: 'absolute', right: '70px', top: '150px', font: '600 46px/1 GS', letterSpacing: '-0.02em', color: 'rgba(255,255,255,.62)', textAlign: 'right', whiteSpace: 'nowrap' });
111
+ c.cont.innerHTML = 'vídeo <span class="n" style="color:#F0946F;display:inline-block">×1</span>';
112
+ c.n = c.cont.querySelector('.n');
113
+ c.desc = $('div', null, r, { position: 'absolute', left: '0', width: W + 'px', top: '250px', textAlign: 'center', font: '600 66px/1.05 GS', letterSpacing: '-0.03em', color: '#F7F6F2', whiteSpace: 'nowrap' });
114
+ c.desc.innerHTML = 'dscp por falar “vídeo” dnv <span class="em" style="display:inline-block;position:relative;width:84px;height:70px;vertical-align:-14px"></span>';
115
+ c.em = emojiLot(c.desc.querySelector('.em'), 'u1f62c', 84);
116
+ }, (t, c) => {
117
+ const k = ts.filter(x => t >= x).length, sai1 = sai(t, tFim, 0.35, { dy: -40, blur1: 22 });
118
+ const n = nasce(t, ts[0], 0.35); tf(c.cont, { op: n.op * sai1.op, y: n.y + sai1.y, blur: n.blur + sai1.blur, r: -2 });
119
+ if (k) c.n.textContent = '×' + k;
120
+ const pk = k ? Math.exp(-(t - ts[k - 1]) * 9) : 0; c.n.style.transform = `scale(${(1 + 0.6 * pk).toFixed(3)}) rotate(${(-12 * pk).toFixed(1)}deg)`;
121
+ const d = nasce(t, tDesc, 0.4), bal = Math.sin((t - tDesc) * 5) * 2.5 * Math.exp(-(t - tDesc) * 1.5);
122
+ tf(c.desc, { op: d.op * sai1.op, y: d.y + sai1.y, s: d.s, r: -3 + bal, blur: d.blur + sai1.blur }); c.em.toca(t, tDesc);
123
+ });
124
+ })();
125
+
126
+ // 03 · "A ferramenta que eu mais uso aqui é o Claude Code, para fazer esse estilo de vídeo de uma maneira bem rápida."
127
+ // o tutorial (mundo claro, letra rolando) começa depois do flash: só o texto aparecendo
128
+ linhas('03', [
129
+ 'A ferramenta',
130
+ 'que eu mais uso',
131
+ 'aqui é o',
132
+ [logo('claude-symbol.svg', { t: PF('03', 'claude') - 0.14 }), 'of|Claude', 'of|Code,'],
133
+ cardClaude({ t: PF('03', 'claude') + 0.02 }),
134
+ 'para fazer esse',
135
+ 'a|estilo a|de a|vídeo',
136
+ 'de uma maneira',
137
+ ['bem', 'rápida.', emoji('u26a1', { t: PF('03', 'rapida', true) - 0.09 })],
138
+ ]);
139
+ // "rápida" = flash (17/10): clarão leve + soco curto; o som (flash-pulse + whoosh) está no audio.py
140
+ flash(PF('03', 'rapida') + 0.06, { som: false, max: 0.42, dec: 9, forca: 0.3 });
141
+
142
+ // 04 · "O resultado fica totalmente diferente do que a IA faz e gera hoje em dia de forma genérica."
143
+ linhas('04', [
144
+ 'O resultado fica',
145
+ 'totalmente',
146
+ 'f|diferente',
147
+ duo('ai-opener-vertical', 'generico-dub', { t: PF('04', 'diferente') + 0.025, tG: PF('04', 'ia') - 0.035, tCinza: PF('04', 'generica') + 0.005 }),
148
+ 'do que a o|IA faz',
149
+ 'e gera hoje',
150
+ 'em dia de forma',
151
+ 'c|genérica.',
152
+ ]);
153
+
154
+ // 05 · "Aqui eu tô falando da elite dos vídeos de motion, mais ou menos nesse estilo aqui:" + vitrine (3 s sem fala)
155
+ const T_VIT = CN('vitrine').t0 - 0.56; // a janela da vitrine abre em "nesse estilo aqui:"
156
+ linhas('05', [
157
+ 'Aqui eu tô',
158
+ 'falando da',
159
+ ['f|elite', item({ w: 270, t: PF('05', 'elite') + 0.14, kind: 'pop', v: 0.32, // figurinha do Casimiro no lugar do 💎 (17/10), estampa ao lado (some quando a vitrine abre)
160
+ monta(d) { const im = $('img', null, d, { position: 'absolute', left: '0', top: '-30px', width: '270px', filter: 'drop-shadow(0 12px 18px rgba(0,0,0,.28))' }); im.src = '../assets/pessoas/casimiro-figurinha.png'; },
161
+ seek(t, it) { const u = seg(t, it.t - 0.02, it.t + 0.22), k = ILL(u), fora = seg(t, T_VIT - 0.2, T_VIT + 0.1), d = Math.max(0, t - it.t - 0.18);
162
+ const treme = t > it.t + 0.18 ? Math.exp(-d * 7) * Math.sin(d * 55) * 3.5 : 0;
163
+ tf(it.in, { op: clamp(u * 4) * (1 - fora), s: lerp(1.55, 1, k) * (1 - 0.25 * fora), r: -9 + treme + 1.2 * Math.sin(t * 2.1), y: 3 * Math.sin(t * 1.7), blur: Math.pow(1 - k, 2) * 10 + fora * 16 }); } })],
164
+ 'dos vídeos de',
165
+ 'af|motion,',
166
+ 'mais ou menos',
167
+ 'nesse a|estilo a|aqui:',
168
+ janela(['illdari-upload', 'illdari-telegram'], { t: T_VIT, quadrada: true, trocas: [CN('vitrine').t0 + 1.27], ate: CN('vitrine').t1 + 0.1, som: true, alvo: -12.5 }),
169
+ ]);