primocode 10.12.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 (207) hide show
  1. package/README.md +74 -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/assinaturas/gerativo.json +1 -1
  7. package/lib/estudio/camadas.js +4 -0
  8. package/lib/estudio/cota.js +150 -0
  9. package/lib/estudio/dados/projetos/clube-ad5.json +105 -0
  10. package/lib/estudio/dados/projetos/clube-ae-sem-memoria.json +107 -0
  11. package/lib/estudio/dados/projetos/clube-agent.json +120 -0
  12. package/lib/estudio/dados/projetos/clube-antes-e-agora.json +86 -0
  13. package/lib/estudio/dados/projetos/clube-apresentando-clube.json +110 -0
  14. package/lib/estudio/dados/projetos/clube-bluevisa.json +106 -0
  15. package/lib/estudio/dados/projetos/clube-caught-in-the-fire.json +127 -0
  16. package/lib/estudio/dados/projetos/clube-chat-cliente-satisfeito.json +98 -0
  17. package/lib/estudio/dados/projetos/clube-chatgpt-anuncios.json +120 -0
  18. package/lib/estudio/dados/projetos/clube-claude-dj.json +140 -0
  19. package/lib/estudio/dados/projetos/clube-claude-mcp.json +142 -0
  20. package/lib/estudio/dados/projetos/clube-cleanui.json +106 -0
  21. package/lib/estudio/dados/projetos/clube-clinica-take-unico.json +128 -0
  22. package/lib/estudio/dados/projetos/clube-clinica.json +104 -0
  23. package/lib/estudio/dados/projetos/clube-clube-opener.json +125 -0
  24. package/lib/estudio/dados/projetos/clube-clube.json +108 -0
  25. package/lib/estudio/dados/projetos/clube-codigo.json +101 -0
  26. package/lib/estudio/dados/projetos/clube-distilbook.json +104 -0
  27. package/lib/estudio/dados/projetos/clube-drive-upload.json +115 -0
  28. package/lib/estudio/dados/projetos/clube-dub.json +119 -0
  29. package/lib/estudio/dados/projetos/clube-enxovaly.json +105 -0
  30. package/lib/estudio/dados/projetos/clube-fecha7.json +118 -0
  31. package/lib/estudio/dados/projetos/clube-filatov.json +128 -0
  32. package/lib/estudio/dados/projetos/clube-frame.json +108 -0
  33. package/lib/estudio/dados/projetos/clube-glass.json +118 -0
  34. package/lib/estudio/dados/projetos/clube-letra-em-apps.json +84 -0
  35. package/lib/estudio/dados/projetos/clube-letra-globo-3d.json +111 -0
  36. package/lib/estudio/dados/projetos/clube-letra-nos-apps.json +146 -0
  37. package/lib/estudio/dados/projetos/clube-letra-seis-mundos.json +100 -0
  38. package/lib/estudio/dados/projetos/clube-lula-3.json +146 -0
  39. package/lib/estudio/dados/projetos/clube-morph.json +119 -0
  40. package/lib/estudio/dados/projetos/clube-motion-designer.json +115 -0
  41. package/lib/estudio/dados/projetos/clube-motion-pacote.json +112 -0
  42. package/lib/estudio/dados/projetos/clube-movimento.json +103 -0
  43. package/lib/estudio/dados/projetos/clube-not-like-us.json +117 -0
  44. package/lib/estudio/dados/projetos/clube-pinterest-inspiracao.json +86 -0
  45. package/lib/estudio/dados/projetos/clube-pixel-e-tinta.json +108 -0
  46. package/lib/estudio/dados/projetos/clube-ponte.json +118 -0
  47. package/lib/estudio/dados/projetos/clube-processo-edit-tonal.json +126 -0
  48. package/lib/estudio/dados/projetos/clube-processo-motion-100-ia.json +109 -0
  49. package/lib/estudio/dados/projetos/clube-promo.json +114 -0
  50. package/lib/estudio/dados/projetos/clube-proposito.json +115 -0
  51. package/lib/estudio/dados/projetos/clube-rankhog.json +128 -0
  52. package/lib/estudio/dados/projetos/clube-recursao.json +116 -0
  53. package/lib/estudio/dados/projetos/clube-revelar.json +118 -0
  54. package/lib/estudio/dados/projetos/clube-robo.json +125 -0
  55. package/lib/estudio/dados/projetos/clube-shelby-ep2.json +144 -0
  56. package/lib/estudio/dados/projetos/clube-shelby.json +97 -0
  57. package/lib/estudio/dados/projetos/clube-solar-eclipse.json +96 -0
  58. package/lib/estudio/dados/projetos/clube-soldier.json +128 -0
  59. package/lib/estudio/dados/projetos/clube-som-de-cena.json +108 -0
  60. package/lib/estudio/dados/projetos/clube-spotify-candidatura.json +112 -0
  61. package/lib/estudio/dados/projetos/clube-tda-app.json +118 -0
  62. package/lib/estudio/dados/projetos/clube-tda-ia.json +75 -0
  63. package/lib/estudio/dados/projetos/clube-telegram-chat.json +118 -0
  64. package/lib/estudio/dados/projetos/clube-telegram-ilha.json +106 -0
  65. package/lib/estudio/dados/projetos/clube-tennessee-nike.json +132 -0
  66. package/lib/estudio/dados/projetos/clube-tudo-se-move.json +112 -0
  67. package/lib/estudio/dados/projetos/clube-uiad.json +107 -0
  68. package/lib/estudio/dados/projetos/clube-viralgrow.json +108 -0
  69. package/lib/estudio/dados/projetos/clube-whose-side.json +140 -0
  70. package/lib/estudio/dados/projetos/clube-youtube-inscrever.json +108 -0
  71. package/lib/estudio/dados/projetos/elementos-do-site-em-movimento.json +49 -0
  72. package/lib/estudio/dados/projetos/explainer-narrado.json +51 -0
  73. package/lib/estudio/dados/projetos/lancamento-de-produto.json +51 -0
  74. package/lib/estudio/dados/projetos/motion-so-com-sons.json +50 -0
  75. package/lib/estudio/dados/projetos/titulo-em-after-effects.json +51 -0
  76. package/lib/estudio/dados/projetos/tour-de-saas.json +50 -0
  77. package/lib/estudio/dados/projetos-ae/antes-e-agora/ae/cenas.jsx +733 -0
  78. package/lib/estudio/dados/projetos-ae/antes-e-agora/assets/fazer_assets.py +88 -0
  79. package/lib/estudio/dados/projetos-ae/letra-em-apps/ae/cenas.jsx +402 -0
  80. package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/preparar_assets.py +17 -0
  81. package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/svg_para_ae.py +25 -0
  82. package/lib/estudio/dados/projetos-ae/letra-nos-apps/BRIEF-AGENTES.md +31 -0
  83. package/lib/estudio/dados/projetos-ae/letra-nos-apps/README.md +53 -0
  84. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ROTEIRO-CENAS.md +69 -0
  85. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/A-agenda.jsx +148 -0
  86. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/B-docs.jsx +174 -0
  87. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/C-alttab.jsx +113 -0
  88. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/D-spotify.jsx +118 -0
  89. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/E-notas.jsx +146 -0
  90. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/F-jornal1.jsx +144 -0
  91. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/G-google.jsx +153 -0
  92. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/H-mapa.jsx +176 -0
  93. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/I-imagens.jsx +132 -0
  94. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/J-jornal2.jsx +191 -0
  95. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/K-maps.jsx +184 -0
  96. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera-movimentos.jsx +48 -0
  97. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera.jsx +57 -0
  98. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/card-spotify.jsx +98 -0
  99. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/digitar.jsx +38 -0
  100. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/jornal-comum.jsx +196 -0
  101. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra.jsx +23 -0
  102. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra_automatica.py +83 -0
  103. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/montagem.jsx +74 -0
  104. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/render_html.py +13 -0
  105. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/util.jsx +162 -0
  106. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-midia-comum.jsx +114 -0
  107. package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/wg-util.jsx +360 -0
  108. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/F-jornal1/render_html.py +13 -0
  109. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/render_w-midia.py +26 -0
  110. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/inclin.py +30 -0
  111. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_d.py +36 -0
  112. package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_e.py +27 -0
  113. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ajustar_movimentos.py +61 -0
  114. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ancorar.py +74 -0
  115. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/assar.py +47 -0
  116. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/camera3d_jornal.py +172 -0
  117. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/comparar.py +32 -0
  118. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/dados_ae_jornal.py +46 -0
  119. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/folha_contato.py +28 -0
  120. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/homografia_jornal.py +74 -0
  121. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/integrar.py +44 -0
  122. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/medir_quadro_a_quadro.py +32 -0
  123. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/mesa_2d.py +64 -0
  124. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/plot_cenas.py +11 -0
  125. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/retificar_quadros.py +38 -0
  126. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/assar_ab.py +52 -0
  127. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/medir_ab.py +59 -0
  128. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ajustar_h.py +111 -0
  129. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_corrige_cam.py +17 -0
  130. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ecc_cadeia.py +80 -0
  131. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_finalizar_cam.py +65 -0
  132. package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_mosaico.py +61 -0
  133. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/01-gramatica-e-roteiro.md +55 -0
  134. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/02-camera.md +66 -0
  135. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/03-montagem-no-ae.md +50 -0
  136. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/04-render-e-conferencia.md +43 -0
  137. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/05-abertura-celular-mergulho.md +43 -0
  138. package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces.md +42 -0
  139. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/atraso_imagem.py +31 -0
  140. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/fundo.py +56 -0
  141. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/juntar.py +45 -0
  142. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/montar.py +177 -0
  143. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/rastreio.py +74 -0
  144. package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/sincronia.py +18 -0
  145. package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/ae/cenas.jsx +530 -0
  146. package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/assets/fazer_assets.py +107 -0
  147. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/assets/pessoas/figurinha.py +46 -0
  148. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/BRIEF-A.md +83 -0
  149. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/audio.py +179 -0
  150. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/confere.py +20 -0
  151. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte1.js +1 -0
  152. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte2.js +1 -0
  153. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/gerar_emojis.py +11 -0
  154. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/img/filmes/_indice.js +122 -0
  155. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/base.js +380 -0
  156. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/main.js +86 -0
  157. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1a.js +169 -0
  158. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1b.js +455 -0
  159. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1c.js +389 -0
  160. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p2.js +379 -0
  161. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/video.py +62 -0
  162. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/README.md +65 -0
  163. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/oraculo_take.py +137 -0
  164. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/render_take.py +388 -0
  165. package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/take.js +235 -0
  166. package/lib/estudio/diretor.js +2 -1
  167. package/lib/estudio/editor.js +285 -0
  168. package/lib/estudio/efeitos-fabrica/terminal-digitando.jsx +2 -1
  169. package/lib/estudio/effectcraft.js +152 -0
  170. package/lib/estudio/exportar.js +181 -0
  171. package/lib/estudio/gerativo.js +44 -15
  172. package/lib/estudio/index.js +126 -5
  173. package/lib/estudio/kit/gerativo.jsx +15 -0
  174. package/lib/estudio/kit-ae/base.jsx +1146 -0
  175. package/lib/estudio/kit-ae/cenas.jsx +395 -0
  176. package/lib/estudio/kit-ae/primitivas.jsx +911 -0
  177. package/lib/estudio/kokoro.js +3 -1
  178. package/lib/estudio/maquina-diretor.js +393 -0
  179. package/lib/estudio/maquina-elementos.js +134 -0
  180. package/lib/estudio/maquina-layout.js +198 -0
  181. package/lib/estudio/maquina-som.js +478 -0
  182. package/lib/estudio/maquina-trilha.js +160 -0
  183. package/lib/estudio/maquina-voz.js +429 -0
  184. package/lib/estudio/maquina.js +516 -0
  185. package/lib/estudio/projetos.js +60 -0
  186. package/lib/estudio/remotion.js +6 -4
  187. package/lib/estudio/revisor.js +61 -0
  188. package/lib/estudio/voicestudio.js +81 -0
  189. package/lib/headless.js +71 -0
  190. package/lib/hooks.js +72 -0
  191. package/lib/local/cerebro.json +398 -12
  192. package/lib/local/entrada.js +46 -2
  193. package/lib/marca-kit.js +309 -0
  194. package/lib/mcp.js +286 -6
  195. package/lib/perigo.js +31 -3
  196. package/lib/planos.js +47 -19
  197. package/lib/preparar.js +111 -0
  198. package/lib/retomar.js +55 -0
  199. package/lib/sandbox.js +197 -0
  200. package/lib/skills.js +3 -1
  201. package/lib/tools.js +13 -4
  202. package/lib/ui.js +1 -1
  203. package/lib/video/auto.js +18 -3
  204. package/package.json +4 -2
  205. package/skills/after-effects/SKILL.md +52 -0
  206. package/skills/maquina-de-motion/SKILL.md +84 -0
  207. package/skills/motion-de-primeira/SKILL.md +33 -51
@@ -0,0 +1,118 @@
1
+ // =====================================================================
2
+ // CENA D-spotify (6,04–8,05 s, ref 8,00): janela do Spotify em modo letra, karaokê nas linhas 5 e 6.
3
+ // Monta 4 comps (reaproveita as que já existem, só troca as camadas):
4
+ // "D janela" 2002x1292 janela.png (3x) + 9 linhas de letra lidas de ae/letra.json (slots D1–D9) com karaokê em D5/D6
5
+ // "Area de trabalho" 1080x1080 papel de parede + ícones + barra (usada na cena C e no começo da D)
6
+ // "D mundo" 1400x1400 null "CAM espelho" (copia o CAM da CENA D) + "D janela" no mundo (margem de 160 px p/ a inclinação não abrir buraco)
7
+ // "CENA D-spotify" 1080x1080 CAM (câmera medida) + "D mundo" em 3D sem colapsar (a inclinação da janela é de tela) + fundo
8
+ // Obs.: precomp 3D COLAPSADA com camadas 2D dentro não inclina (testado 17/10); por isso "D mundo" não é colapsada.
9
+ // Mundo da cena D = quadro 8,00 s do original. Janela: canto sup. esq. no mundo (-314,-142), 2002x1292.
10
+ // Rodar com: P = "<raiz do projeto>/"; $.evalFile(P + "ae/D-spotify.jsx"); (ES3, comp fechada)
11
+ // =====================================================================
12
+ $.evalFile(P + "ae/w-midia-comum.jsx");
13
+ $.evalFile(P + "ae/camera.jsx");
14
+ $.evalFile(P + "ae/letra.jsx");
15
+
16
+ var D = {};
17
+ D.pasta = WM.pasta("w-midia");
18
+ D.pastaAssets = WM.pasta("w-midia assets");
19
+ D.JX = -314; D.JY = -142; // canto da janela no mundo
20
+ D.TX = 112 - D.JX; // x do texto da letra dentro da "D janela" (mundo 112)
21
+ D.LINHA0 = 40 - D.JY; // centro da 1ª linha (mundo 40)
22
+ D.PASSO = 113.5; // distância entre linhas (medida no quadro 8,00)
23
+ D.APAGADA = WM.cor("#4D8AB2"); // linhas 1–6 sem acender
24
+ D.CLARA = WM.cor("#8FD8FD"); // linhas 7–9 (mais claras, como no original)
25
+ // as 9 linhas vêm do letra.json (o autor cola a letra; vazio = "reserva" em inglês)
26
+ D.LINHAS = []; (function () { for (var n = 1; n <= 9; n++) D.LINHAS.push(LETRA("D" + n)); })();
27
+ // karaokê: janela [início, fim] em que cada palavra acende (letra a letra), MEDIDA no original quadro a quadro
28
+ // (linha 5: 1ª palavra acesa em 6,00; 2ª 6,10–6,40; 3ª 6,46–6,58; 4ª 6,68–7,08 · linha 6: 7,30–7,50; 7,54–7,66; 7,71–7,83; 7,85–8,08).
29
+ // Fica melhor que os tempos de canto do slot porque o acendimento do original anda um pouco atrás da voz.
30
+ D.ACENDE = { 4: [[5.80, 5.98], [6.10, 6.40], [6.46, 6.58], [6.68, 7.08]], 5: [[7.30, 7.50], [7.54, 7.66], [7.71, 7.83], [7.85, 8.08]] };
31
+ // chaves do índice "End" do animador de cor: palavras a mais seguem no mesmo ritmo (0,06 s por letra)
32
+ D.chavesKaraoke = function (palavras, janelas) {
33
+ var keys = [], c = 0, k, j;
34
+ for (k = 0; k < palavras.length; k++) {
35
+ j = janelas[k];
36
+ if (!j) { var t0 = keys[keys.length - 1][0] + 0.04; j = [t0, t0 + 0.06 * palavras[k].length]; }
37
+ keys.push([j[0], c]); c += palavras[k].length; keys.push([j[1], c]); c += 1;
38
+ }
39
+ return keys;
40
+ };
41
+
42
+ // ---------- 1. Area de trabalho ----------
43
+ var ftDesk = WM.png(P + "assets/C-alttab/desktop.png", D.pastaAssets);
44
+ var cDesk = WM.comp("Area de trabalho", 1080, 1080, D.pasta);
45
+ WM.camadaPNG(cDesk, ftDesk, 0, 0, "area de trabalho (PNG 3x)");
46
+
47
+ // ---------- 2. D janela ----------
48
+ var ftJan = WM.png(P + "assets/D-spotify/janela.png", D.pastaAssets);
49
+ var cJan = WM.comp("D janela", 2002, 1292, D.pasta);
50
+ WM.camadaPNG(cJan, ftJan, 0, 0, "janela spotify (PNG 3x)");
51
+ var i, L;
52
+ for (i = 0; i < D.LINHAS.length; i++) {
53
+ // Figtree ExtraBold 60 com espaçamento +6: com a letra colada, a largura das linhas iguais ao original fica dentro de ±1 %
54
+ L = WM.texto(cJan, D.LINHAS[i].texto, "Figtree-ExtraBold", 60, (i >= 6 ? D.CLARA : D.APAGADA), ParagraphJustification.LEFT_JUSTIFY,
55
+ D.TX, D.LINHA0 + D.PASSO * i + 21, "letra " + (i + 1) + " (slot D" + (i + 1) + ")", 6);
56
+ if (D.ACENDE[i]) {
57
+ var tp = L.property("ADBE Text Properties");
58
+ var an = tp.property("ADBE Text Animators").addProperty("ADBE Text Animator"); an.name = "karaoke";
59
+ an.property("ADBE Text Animator Properties").addProperty("ADBE Text Fill Color");
60
+ an = tp.property("ADBE Text Animators").property("karaoke");
61
+ an.property("ADBE Text Animator Properties").property("ADBE Text Fill Color").setValue([1, 1, 1]);
62
+ var sel = an.property("ADBE Text Selectors").addProperty("ADBE Text Selector");
63
+ sel = tp.property("ADBE Text Animators").property("karaoke").property("ADBE Text Selectors").property(1);
64
+ var adv = sel.property("ADBE Text Range Advanced");
65
+ adv.property("ADBE Text Range Units").setValue(2); // índice
66
+ adv.property("ADBE Text Range Type2").setValue(1); // caracteres
67
+ adv.property("ADBE Text Range Shape").setValue(1); // quadrado
68
+ sel.property("ADBE Text Index Start").setValue(0);
69
+ WM.chaves(sel.property("ADBE Text Index End"), D.chavesKaraoke(D.LINHAS[i].palavras, D.ACENDE[i]), "linear");
70
+ }
71
+ }
72
+
73
+ // ---------- 3. D mundo ----------
74
+ var cMun = WM.comp("D mundo", 1400, 1400, D.pasta);
75
+ var esp = cMun.layers.addNull(WM.DUR); esp.name = "CAM espelho (segue o CAM da CENA D-spotify)"; esp.enabled = false; esp.label = 1;
76
+ var trE = esp.property("ADBE Transform Group");
77
+ trE.property("ADBE Anchor Point").expression = 'comp("CENA D-spotify").layer("CAM").transform.anchorPoint';
78
+ trE.property("ADBE Position").expression = '[thisComp.width/2, thisComp.height/2]'; // 700,700 = centro da tela da CENA D
79
+ trE.property("ADBE Scale").expression = 'comp("CENA D-spotify").layer("CAM").transform.scale';
80
+ trE.property("ADBE Rotate Z").expression = 'comp("CENA D-spotify").layer("CAM").transform.rotation';
81
+ var Lj = cMun.layers.add(cJan); Lj.name = "D janela"; Lj.collapseTransformation = true; Lj.parent = esp;
82
+ Lj.property("ADBE Transform Group").property("ADBE Anchor Point").setValue([0, 0]);
83
+ Lj.property("ADBE Transform Group").property("ADBE Position").setValue([D.JX, D.JY]);
84
+ Lj.property("ADBE Transform Group").property("ADBE Scale").setValue([100, 100]); // parent= compensa a escala do pai; zera aqui
85
+ // corte da nota (borda direita em mundo 1050 a partir de 7,5 s — é o começo da máscara que vira o círculo "Sua nota" na cena E)
86
+ var mk = Lj.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"); mk.name = "corte nota";
87
+ mk = Lj.property("ADBE Mask Parade").property("corte nota");
88
+ var mp = mk.property("ADBE Mask Shape");
89
+ var sLarga = WM.retRed(1001, 646, 2400, 1700, 0), sCorte = WM.retRed((-200 + 1050 - D.JX) / 2, 646, (1050 - D.JX) + 200, 1700, 0);
90
+ mp.setValueAtTime(0, sLarga); mp.setValueAtTime(7.5, sCorte);
91
+ mp.setInterpolationTypeAtKey(1, KeyframeInterpolationType.HOLD, KeyframeInterpolationType.HOLD);
92
+ mk.property("ADBE Mask Feather").setValue([0, 0]);
93
+ WM.blurTodas(cMun);
94
+
95
+ // ---------- 4. CENA D-spotify ----------
96
+ var cena = WM.comp("CENA D-spotify", 1080, 1080, D.pasta);
97
+ var fundo = cena.layers.addSolid(WM.cor("#090F11"), "Fundo IG (aparece no corte da nota)", 1080, 1080, 1, WM.DUR);
98
+ var desk = cena.layers.add(cDesk); desk.name = "Area de trabalho (fixa na tela, 6,04–6,33)";
99
+ var op = desk.property("ADBE Transform Group").property("ADBE Opacity");
100
+ WM.chaves(op, [[0, 0], [6.0417, 100], [6.3333, 0]], "hold");
101
+ var mun = cena.layers.add(cMun); mun.name = "D mundo (3D: inclinação de tela)"; mun.threeDLayer = true; mun.collapseTransformation = false;
102
+ var trM = mun.property("ADBE Transform Group");
103
+ trM.property("ADBE Anchor Point").setValue([700, 700, 0]); trM.property("ADBE Position").setValue([540, 540, 0]);
104
+ // inclinação 3D da janela enquanto a câmera avança (medida a olho no original: lados divergem p/ a direita, some em 7,25)
105
+ // giro Y medido pelo declive das linhas no original (declive = Δy·tanθ/1500): 3,8° em 6,25 -> 16,8° em 6,75 -> 0 em 7,5
106
+ WM.chaves(trM.property("ADBE Rotate Y"), [[6.0417, 0], [6.125, 1.4], [6.25, 3.8], [6.375, 7.8], [6.5, 16.3], [6.75, 17.3], [6.875, 17.5],
107
+ [7.0, 16.7], [7.125, 13.75], [7.25, 7.2], [7.375, 2.0], [7.5, 0]], "suave");
108
+ // giro Z pequeno: no original o "horizonte" da perspectiva fica ~190 px acima do centro; um giro leve reproduz o declive extra
109
+ WM.chaves(trM.property("ADBE Rotate Z"), [[6.0417, 0], [6.25, 0.26], [6.375, 1.0], [6.5, 1.45], [6.75, 2.2], [7.0, 1.65], [7.125, 0.4],
110
+ [7.25, 0], [7.5, 0]], "suave");
111
+ var cam = CAMERA_criar(cena, P + "camera/cena-D-spotify.json");
112
+ // correção do zoom em 6,6–7,25 (o passo das linhas no original fica ~8% maior em 7,0; conferido por medição das linhas)
113
+ WM.trocarChaves(cam.property("ADBE Effect Parade").property("Zoom (log2)").property(1), 6.59, 7.34, [[6.625, 0.8372],[6.6667, 0.9099],[6.7083, 0.9753],[6.75, 1.0338],[6.7917, 1.0717],[6.8333, 1.1048],[6.875, 1.134],[6.9167, 1.1597],[6.9583, 1.1829],[7.0, 1.2057],[7.0417, 1.2037],[7.0833, 1.2025],[7.125, 1.172],[7.1667, 1.1256],[7.2083, 1.0779],[7.25, 1.033],[7.2917, 0.9974],[7.3333, 0.9635]]);
114
+ cam.moveToBeginning();
115
+ WM.blurTodas(cena);
116
+ cena.layer("CAM").motionBlur = false;
117
+ WM.limparSolidos();
118
+ "ok D: " + cJan.numLayers + " camadas na janela; CENA D com " + cena.numLayers;
@@ -0,0 +1,146 @@
1
+ // =====================================================================
2
+ // CENA E-notas (8,05–10,80 s, ref 9,50): notas do Instagram em modo escuro + linha de conversa.
3
+ // Mundo = quadro 9,50 s do original. Duas partes:
4
+ // - UI FIXA (fundo, trilho de ícones, "Pesquisar", linha "Render Farm") — PNG ui.png, filha do CAM
5
+ // - TRILHO (fileira de notas) — null filho do CAM que ROLA para a esquerda (no original a fileira rola de nota em nota
6
+ // enquanto a busca e o trilho de ícones ficam parados; medido pelo avatar de mari e pelo ícone amarelo)
7
+ // filhos: notas.png, 2 balões digitados (slots E2/E3 do letra.json, fade letra a letra como no original) e a CENA D-spotify na bolinha "Your note"
8
+ // A fileira é recortada em x >= 100 (borda da área de conteúdo, como no original) a partir de 8,46 s.
9
+ // Câmera: camera/cena-E-notas.json com 8,04–8,75 e 10,1–10,8 corrigidos (a medição seguia a fileira, que rola).
10
+ // Rodar: P = "<raiz>/"; $.evalFile(P + "ae/E-notas.jsx"); (depois de D-spotify.jsx)
11
+ // =====================================================================
12
+ $.evalFile(P + "ae/w-midia-comum.jsx");
13
+ $.evalFile(P + "ae/camera.jsx");
14
+ $.evalFile(P + "ae/letra.jsx");
15
+
16
+ var E = {};
17
+ E.pasta = WM.pasta("w-midia");
18
+ E.pastaAssets = WM.pasta("w-midia assets");
19
+ E.ESPACO = 412; // distância entre avatares
20
+ E.X0 = -599; // x da bolinha "Sua nota" com a fileira na posição do quadro 9,50
21
+ E.YAV = 568.36; // y do centro da bolinha "Sua nota" (= mira y do CAM em 8,04)
22
+ // deslocamento da fileira (R) por tempo, em px do mundo — ajustado medindo os balões (fileira) e o círculo amarelo (UI) contra o original, quadro a quadro
23
+ E.TRILHO = [[8.0417, 820], [8.375, 815], [8.4167, 805], [8.4583, 777], [8.5, 738], [8.5417, 699], [8.5833, 669], [8.625, 597.5], [8.6667, 528.6],
24
+ [8.7083, 475.8], [8.75, 442], [8.7917, 409], [8.8333, 390.5], [8.875, 373.8], [8.9167, 357.4], [9.0, 324.5], [9.125, 278], [9.25, 197], [9.375, 92], [9.5, 0],
25
+ [9.625, -49], [9.75, -75], [9.875, -88], [10.0, -92], [10.0833, -95]];
26
+ // mira X corrigida (no começo a medição andava com a fileira; no fim, com o zoom em mari)
27
+ E.MX_INI = [[8.0417, 221.2], [8.0833, 231.8], [8.125, 243.0], [8.1667, 254.4], [8.2083, 267.1], [8.25, 281.4], [8.2917, 298.0],
28
+ [8.3333, 317.6], [8.375, 336.1], [8.4167, 354.7], [8.4583, 362.5], [8.5, 370.2], [8.5417, 392], [8.5833, 415.6], [8.625, 447.7], [8.6667, 472.3],
29
+ [8.7083, 487.3], [8.75, 499.5], [8.7917, 508.2], [8.8333, 516.2], [8.875, 520.7], [8.9167, 526.0], [9.0, 532.8]];
30
+ E.MX_FIM = [[10.0417, 540], [10.0833, 538.5], [10.1667, 538], [10.25, 537.5], [10.3333, 539], [10.5, 539.5], [10.75, 545.5], [10.7917, 547.5]];
31
+ E.MY_FIM = [[10.0417, 540], [10.1667, 540], [10.3333, 540.5], [10.5, 540.5], [10.75, 541], [10.7917, 541]]; // conferido pela caixa do balão de mari em 10,75 (topo y 67 como no original)
32
+ // balões digitados: texto do letra.json (slots E2 e E3, caixa alta), caixa de parágrafo que quebra em 2 linhas como no original.
33
+ // [nome, slot, índice do avatar, largura da caixa, janelas [início, fim] de cada palavra MEDIDAS no original (fade letra a letra)]
34
+ E.BALOES = [
35
+ ["balão the.producer (slot E2)", "E2", 2, 290, [[8.66, 8.85], [8.90, 8.95], [8.96, 9.20]]],
36
+ ["balão mari.frames (slot E3)", "E3", 3, 270, [[9.20, 10.08], [10.15, 10.78]]]
37
+ ];
38
+ E.TOPO_TEXTO = 344; // topo da caixa de texto (conferido com a letra colada: linhas no mesmo lugar do original)
39
+ // chaves P(t) = letras já digitadas (contando espaços); palavras a mais seguem a 0,06 s por letra
40
+ E.chavesDigita = function (palavras, janelas) {
41
+ var keys = [], c = 0, k, j;
42
+ for (k = 0; k < palavras.length; k++) {
43
+ j = janelas[k];
44
+ if (!j) { var t0 = keys[keys.length - 1][0] + 0.04; j = [t0, t0 + 0.06 * palavras[k].length]; }
45
+ keys.push([j[0], c]); c += palavras[k].length; keys.push([j[1], c]); c += 1;
46
+ }
47
+ keys.push([keys[keys.length - 1][0] + 0.17, c + 2.5]); // termina o fade da última letra
48
+ return keys;
49
+ };
50
+
51
+ var cD = WM.item("CENA D-spotify");
52
+ if (!cD) throw new Error("rode D-spotify.jsx antes (falta CENA D-spotify)");
53
+ var ftUI = WM.png(P + "assets/E-notas/ui.png", E.pastaAssets);
54
+ var ftNo = WM.png(P + "assets/E-notas/notas.png", E.pastaAssets);
55
+ var cena = WM.comp("CENA E-notas", 1080, 1080, E.pasta);
56
+ var cam = CAMERA_criar(cena, P + "camera/cena-E-notas.json");
57
+ var fx = cam.property("ADBE Effect Parade"), k;
58
+ WM.trocarChaves(fx.property("Mira X").property(1), 8.03, 9.01, E.MX_INI);
59
+ WM.trocarChaves(fx.property("Mira X").property(1), 10.03, 10.8, E.MX_FIM);
60
+ WM.trocarChaves(fx.property("Mira Y").property(1), 10.03, 10.8, E.MY_FIM);
61
+ var CAM = cena.layer("CAM");
62
+
63
+ function zerar(L, ax, ay, px, py, esc) {
64
+ var tr = L.property("ADBE Transform Group");
65
+ tr.property("ADBE Anchor Point").setValue([ax, ay]); tr.property("ADBE Position").setValue([px, py]);
66
+ tr.property("ADBE Scale").setValue([esc, esc]); tr.property("ADBE Rotate Z").setValue(0);
67
+ }
68
+ // 1. UI fixa
69
+ var ui = cena.layers.add(ftUI); ui.name = "UI fixa (fundo, ícones, busca, conversa)"; ui.parent = CAM;
70
+ zerar(ui, 0, 0, -400, -100, 100 / 3);
71
+ // sempre visível: até 8,6 os ícones e a busca estão fora da tela; o fundo #090F11 dele é o fundo do Instagram atrás da bolinha D
72
+ // 2. recorte da fileira (x >= 100 no mundo) — liga em 8,4583, quando a borda já está fora da tela
73
+ var rec = cena.layers.addShape(); rec.name = "RECORTE fileira (x>=100)"; rec.parent = CAM;
74
+ var rg = rec.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group"); rg.name = "ret";
75
+ var rv = rec.property("ADBE Root Vectors Group").property("ret").property("ADBE Vectors Group");
76
+ rv.addProperty("ADBE Vector Shape - Rect"); rv.addProperty("ADBE Vector Graphic - Fill");
77
+ rv = rec.property("ADBE Root Vectors Group").property("ret").property("ADBE Vectors Group");
78
+ rv.property(1).property("ADBE Vector Rect Size").setValue([6000, 3000]);
79
+ WM.chaves(rv.property(1).property("ADBE Vector Rect Position"), [[0, [-500, 540]], [8.4583, [100 + 3000, 540]]], "hold");
80
+ zerar(rec, 0, 0, 0, 0, 100);
81
+ // 3. TRILHO (fileira que rola)
82
+ var tri = cena.layers.addNull(WM.DUR); tri.name = "TRILHO (fileira de notas rola)"; tri.enabled = false; tri.label = 9; tri.parent = CAM;
83
+ zerar(tri, 0, 0, 0, 0, 100);
84
+ var ptri = [];
85
+ for (k = 0; k < E.TRILHO.length; k++) ptri.push([E.TRILHO[k][0], [E.TRILHO[k][1], 0]]);
86
+ WM.chaves(tri.property("ADBE Transform Group").property("ADBE Position"), ptri, "suave");
87
+ // 3a. fileira (PNG)
88
+ var no = cena.layers.add(ftNo); no.name = "fileira de notas (PNG 3x)"; no.parent = tri;
89
+ zerar(no, 0, 0, -900, 250, 100 / 3);
90
+ // 3b. balões digitados
91
+ var bal = [];
92
+ for (k = 0; k < E.BALOES.length; k++) {
93
+ var B = E.BALOES[k], slot = LETRA(B[1]), txt = slot.texto.toUpperCase(), Wc = B[3];
94
+ var L = cena.layers.addBoxText([Wc, 130]); L.name = B[0];
95
+ var pd = L.property("ADBE Text Properties").property("ADBE Text Document"), d = pd.value;
96
+ d.resetCharStyle(); d.resetParagraphStyle();
97
+ d.font = "SegoeUI-Bold"; d.fontSize = 42; d.fillColor = WM.cor("#F6F7FB"); d.applyFill = true; d.applyStroke = false;
98
+ d.tracking = 12; d.autoLeading = false; d.leading = 52; d.justification = ParagraphJustification.CENTER_JUSTIFY; d.text = txt;
99
+ pd.setValue(d);
100
+ d = pd.value; try { d.boxTextPos = [-Wc / 2, 0]; pd.setValue(d); } catch (eB) {}
101
+ L.startTime = 0; L.inPoint = 0; L.outPoint = WM.DUR;
102
+ L.parent = tri; zerar(L, 0, 0, E.X0 + E.ESPACO * B[2], E.TOPO_TEXTO, 100);
103
+ var tp = L.property("ADBE Text Properties");
104
+ tp.property("ADBE Text Animators").addProperty("ADBE Text Animator").name = "digita";
105
+ var an = tp.property("ADBE Text Animators").property("digita");
106
+ an.property("ADBE Text Animator Properties").addProperty("ADBE Text Opacity");
107
+ an = tp.property("ADBE Text Animators").property("digita");
108
+ an.property("ADBE Text Animator Properties").property("ADBE Text Opacity").setValue(0);
109
+ an.property("ADBE Text Selectors").addProperty("ADBE Text Selector");
110
+ var sel = tp.property("ADBE Text Animators").property("digita").property("ADBE Text Selectors").property(1);
111
+ var adv = sel.property("ADBE Text Range Advanced");
112
+ adv.property("ADBE Text Range Units").setValue(2); adv.property("ADBE Text Range Type2").setValue(1); adv.property("ADBE Text Range Shape").setValue(2);
113
+ var pk = E.chavesDigita(txt.replace(/^\s+|\s+$/g, "").split(/\s+/), B[4]), fimL = [], iniL = [];
114
+ for (var j = 0; j < pk.length; j++) { fimL.push([pk[j][0], pk[j][1]]); iniL.push([pk[j][0], pk[j][1] - 2.5]); }
115
+ WM.chaves(sel.property("ADBE Text Index End"), fimL, "linear");
116
+ WM.chaves(sel.property("ADBE Text Index Start"), iniL, "linear");
117
+ bal.push(L);
118
+ }
119
+ // 3c. CENA D na bolinha "Sua nota": enche a tela em 8,0417; máscara quadrado -> círculo até 8,4167 (no original 8,04–8,42)
120
+ var Ld = cena.layers.add(cD); Ld.name = "ENCAIXE D-spotify (já é a CENA D-spotify real)"; Ld.parent = tri;
121
+ var e0 = 100 * (1080 / Math.pow(2, 2.0449)) / 1080, e1 = 100 * 300 / 1080;
122
+ zerar(Ld, 540, 540, E.X0, E.YAV, e0);
123
+ Ld.property("ADBE Transform Group").property("ADBE Scale").setValuesAtTimes([8.0417, 8.4167], [[e0, e0], [e1, e1]]);
124
+ WM.easeTodas(Ld.property("ADBE Transform Group").property("ADBE Scale"), 30, 60);
125
+ var md = Ld.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"); md = Ld.property("ADBE Mask Parade").property(1); md.name = "quadrado -> círculo";
126
+ var dCirc = 290 / (e1 / 100);
127
+ // a camada é colapsada: a janela inteira da D aparece além do quadrado (como no original, a barra de busca surge em cima em 8,17).
128
+ // máscara em px da CENA D: começa no contorno da janela (x -400..973 = corte da nota, y -87..1119) e vira o círculo até 8,4167
129
+ Ld.collapseTransformation = true;
130
+ function caixa(x0, x1, y0, y1, r) { return WM.retRed((x0 + x1) / 2, (y0 + y1) / 2, x1 - x0, y1 - y0, r); }
131
+ var c0 = 540 - dCirc / 2, c1 = 540 + dCirc / 2;
132
+ var mt = [8.0417, 8.1667, 8.25, 8.3333, 8.4167], ms = [];
133
+ ms.push(caixa(-400, 973, -87, 1119, 30)); ms.push(caixa(-330, 973, -87, 1119, 55)); ms.push(caixa(-200, 975, -75, 1110, 110));
134
+ ms.push(caixa(-20, 1030, -10, 1090, 330)); ms.push(caixa(c0, c1, c0, c1, dCirc / 2));
135
+ md.property("ADBE Mask Shape").setValuesAtTimes(mt, ms);
136
+ // recorte (matte) na fileira, nos balões e na bolinha D
137
+ var recL = cena.layer("RECORTE fileira (x>=100)");
138
+ no.setTrackMatte(recL, TrackMatteType.ALPHA);
139
+ for (k = 0; k < bal.length; k++) bal[k].setTrackMatte(recL, TrackMatteType.ALPHA);
140
+ Ld.setTrackMatte(recL, TrackMatteType.ALPHA);
141
+ recL.enabled = false;
142
+ // ordem (de cima p/ baixo): CAM, D, balões, fileira, TRILHO, recorte, UI
143
+ CAM.moveToBeginning();
144
+ WM.blurTodas(cena); CAM.motionBlur = false; tri.motionBlur = false;
145
+ WM.limparSolidos();
146
+ "ok E: " + cena.numLayers + " camadas";
@@ -0,0 +1,144 @@
1
+ // =====================================================================
2
+ // CENA F-jornal1 (10,80–16,62 s, ref 16,40) — jornal moderno "THE DAILY DROP" em 3D sobre a mesa.
3
+ // Interface em inglês como o original (pedido do autor, 17/10); manchetes = letra, lidas de ae/letra.json
4
+ // (slots F1–F4; vazio = "reserva"). Depois de colar a letra, rode este gerador de novo.
5
+ // Gera a comp "CENA F-jornal1" (1080x1080, 24 qps, 814 quadros, tempo interno = tempo do vídeo).
6
+ // Rodar num eval.run só, com a comp fechada: $.evalFile(File.decode(".../ae/F-jornal1.jsx"))
7
+ //
8
+ // Rig: ver ae/jornal-comum.jsx (câmera padrão + null 3D PLANO medido no original + mesa 2D).
9
+ // Mundo (unidades do plano, origem = centro da tela no 1º quadro da cena):
10
+ // página 1 x -624..1620, y -2515..665 (PNG 2244x3180, 1 px = 1 un.)
11
+ // página 2 x 1622..3866, y -2530..650
12
+ // encaixe E (troca 10,80): quadrado lado 1071,35 em (-4,21; 0,04), giro -0,18° -> encolhe até a moldura
13
+ // da foto (x -526..494, y -506..510) até 10,92; cortina de baixo para cima com a foto 1 em 11,00–11,35.
14
+ // Manchetes: caixa do tamanho da do original (altura de maiúscula e largura medidas); texto maior encolhe.
15
+ // Fonte Noto Serif Display ExtraCondensed Black (instalada em Common Files/Adobe/Fonts).
16
+ // =====================================================================
17
+ (function () {
18
+ var JP = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
19
+ $.evalFile(File(JP + "ae/jornal-comum.jsx"));
20
+ $.evalFile(File(JP + "ae/digitar.jsx"));
21
+ $.evalFile(File(JP + "ae/letra.jsx"));
22
+ var D = J_lerJSON(JP + "ae/F-jornal1-dados.json");
23
+ var A = JP + "assets/F-jornal1/";
24
+ var fold = J_pasta("F-jornal1");
25
+ var foldA = J_pasta("F-jornal1 assets", fold);
26
+
27
+ // ---------- itens ----------
28
+ var imgP1 = J_importar(A + "pagina1.png", foldA), imgP2 = J_importar(A + "pagina2.png", foldA);
29
+ try { imgP1.mainSource.reload(); imgP2.mainSource.reload(); } catch (e) {}
30
+ var imgMesa = J_importar(A + "mesa-escura.png", foldA);
31
+ var f1 = J_importar(A + "foto-estudio-1.png", foldA), f2 = J_importar(A + "foto-estudio-2.png", foldA);
32
+ var f3 = J_importar(A + "foto-estudio-3.png", foldA), f4 = J_importar(A + "foto-estudio-4.png", foldA);
33
+ var cF1b = J_compFoto("F foto p1 baixo (cortina)", f1, 950, 1007, foldA, [0.42, 0.5], 0.012);
34
+ var cF1c = J_compFoto("F foto p1 cima", f2, 960, 1188, foldA, [0.5, 0.5], 0.012);
35
+ var cF2c = J_compFoto("F foto p2 cima", f3, 966, 1184, foldA, [0.62, 0.5], 0.012);
36
+ var cF2b = J_compFoto("F foto p2 baixo", f4, 950, 1136, foldA, [0.5, 0.5], 0.012);
37
+ // encaixe provisório da cena E (na montagem vira a CENA E-notas)
38
+ var encE = null;
39
+ for (var i = 1; i <= app.project.numItems; i++) { var it = app.project.item(i); if (it instanceof CompItem && it.name == "ENCAIXE E-notas") encE = it; }
40
+ if (!encE) encE = J_encaixeProvisorio("ENCAIXE E-notas", fold);
41
+
42
+ // ---------- comp ----------
43
+ var comp = J_comp("CENA F-jornal1", 1080, 1080, fold);
44
+ comp.bgColor = [45 / 255, 45 / 255, 51 / 255];
45
+ comp.motionBlur = true; comp.shutterAngle = 90; comp.shutterPhase = -45;
46
+ comp.motionBlurSamplesPerFrame = 16; comp.motionBlurAdaptiveSampleLimit = 128;
47
+ comp.workAreaStart = 10.75; comp.workAreaDuration = 16.625 - 10.75;
48
+
49
+ // fundo (o que aparece quando a mesa encolhe no fim, cor do Google escuro da cena G)
50
+ var fundo = comp.layers.addSolid([45 / 255, 45 / 255, 51 / 255], "FUNDO", 1080, 1080, 1, comp.duration);
51
+ // mesa 2D: retângulo da mesa na tela do ref (16,417 s) = x 6..1059, y 7..1050 (bordas medidas no original)
52
+ var mesa = J_mesa(comp, D, imgMesa, [6, 7, 1059, 1050], foldA, "F mesa textura", 2, 30);
53
+ var plano = J_plano(comp, D);
54
+
55
+ // sombra das páginas na mesa (no plano, um pouco abaixo das folhas)
56
+ // (sólidos em 1/4 da resolução, escala 400%: sólido gigante com desfoque trava o render)
57
+ var sombra = comp.layers.addSolid([0, 0, 0], "SOMBRA páginas", 1130, 805, 1, comp.duration);
58
+ J_filho(sombra, plano, [565, 402.5], [(-624 + 3866) / 2 + 14, (-2530 + 665) / 2 + 26, 3], 400, 0);
59
+ sombra.opacity.setValue(62);
60
+ sombra.property("ADBE Effect Parade").addProperty("ADBE Box Blur2"); var bb = sombra.property("ADBE Effect Parade").property(1);
61
+ bb.property(1).setValue(6); bb.property(2).setValue(3);
62
+ var sombra2 = comp.layers.addSolid([0, 0, 0], "SOMBRA contato", 1125, 800, 1, comp.duration);
63
+ J_filho(sombra2, plano, [562.5, 400], [(-624 + 3866) / 2 + 4, (-2530 + 665) / 2 + 8, 2], 400, 0);
64
+ sombra2.opacity.setValue(70);
65
+ sombra2.property("ADBE Effect Parade").addProperty("ADBE Box Blur2"); var bb2 = sombra2.property("ADBE Effect Parade").property(1); bb2.property(1).setValue(1.5); bb2.property(2).setValue(2);
66
+
67
+ // páginas
68
+ var p1 = comp.layers.add(imgP1); p1.name = "PÁGINA 1"; J_filho(p1, plano, [0, 0], [-624, -2515, 0], 100, 0);
69
+ var p2 = comp.layers.add(imgP2); p2.name = "PÁGINA 2"; J_filho(p2, plano, [0, 0], [1622, -2530, 0], 100, 0);
70
+ // dobra no meio: leve sombra na borda interna das folhas
71
+ var dob = comp.layers.addSolid([0.25, 0.22, 0.2], "DOBRA", 60, 3180, 1, comp.duration);
72
+ J_filho(dob, plano, [30, 1590], [1621, -2515 + 1590 - 8, -1], 100, 0); dob.opacity.setValue(35);
73
+ var bbd = dob.property("ADBE Effect Parade").addProperty("ADBE Box Blur2"); bbd.property(1).setValue(14); bbd.property(2).setValue(2);
74
+
75
+ // fotos (pré-comps do tamanho exato da moldura)
76
+ function poeFoto(c, nome, x0, y0) { var L = comp.layers.add(c); L.name = nome; J_filho(L, plano, [0, 0], [x0, y0, -1], 100, 0); return L; }
77
+ poeFoto(cF1c, "FOTO p1 cima", 576, -1944);
78
+ poeFoto(cF2c, "FOTO p2 cima", 1690, -1970);
79
+ poeFoto(cF2b, "FOTO p2 baixo", 2834, -616);
80
+
81
+ // encaixe E: enche a tela na troca e encolhe até a moldura da foto
82
+ var E = D.encaixe, troca = D.troca;
83
+ var LE = comp.layers.add(encE); LE.name = "ENCAIXE E-notas (provisório)";
84
+ J_filho(LE, plano, [540, 540], [E.centro[0], E.centro[1], -1.2], 100 * E.lado / 1080, E.giro);
85
+ var tE = J_tr(LE);
86
+ // moldura da foto medida no original desentortado em 11,75 s: x -500..450, y -490..517 (950 x 1007)
87
+ var slot = [-500, -490, 450, 517], sc = [(slot[0] + slot[2]) / 2, (slot[1] + slot[3]) / 2], sl = slot[3] - slot[1];
88
+ var t1 = troca + 0.125;
89
+ tE.property("ADBE Position").setValuesAtTimes([troca, t1], [[E.centro[0], E.centro[1], -1.2], [sc[0], sc[1], -1.2]]);
90
+ tE.property("ADBE Scale").setValuesAtTimes([troca, t1], [[100 * E.lado / 1080, 100 * E.lado / 1080, 100], [100 * sl / 1080, 100 * sl / 1080, 100]]);
91
+ tE.property("ADBE Rotate Z").setValuesAtTimes([troca, t1], [E.giro, 0]);
92
+ var easeOut = [new KeyframeEase(0, 33)], easeIn = [new KeyframeEase(0, 75)];
93
+ var pr3 = [tE.property("ADBE Scale"), tE.property("ADBE Rotate Z")];
94
+ for (var q = 0; q < pr3.length; q++) {
95
+ var ee = (pr3[q].propertyValueType == PropertyValueType.ThreeD) ? [easeOut[0], easeOut[0], easeOut[0]] : easeOut;
96
+ var ei = (pr3[q].propertyValueType == PropertyValueType.ThreeD) ? [easeIn[0], easeIn[0], easeIn[0]] : easeIn;
97
+ pr3[q].setTemporalEaseAtKey(1, ee, ee); pr3[q].setTemporalEaseAtKey(2, ei, ei);
98
+ }
99
+ tE.property("ADBE Position").setTemporalEaseAtKey(1, easeOut, easeOut); tE.property("ADBE Position").setTemporalEaseAtKey(2, easeIn, easeIn);
100
+ var mE = LE.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"); mE.name = "moldura";
101
+ var cortaX = (1080 - (slot[2] - slot[0]) * 1080 / sl) / 2;
102
+ function retM(a, b, c, d) { var q = new Shape(); q.vertices = [[a, b], [c, b], [c, d], [a, d]]; q.closed = true; return q; }
103
+ mE.property("ADBE Mask Shape").setValuesAtTimes([troca, t1], [retM(-2, -2, 1082, 1082), retM(cortaX, 0, 1080 - cortaX, 1080)]);
104
+
105
+ // cortina: foto 1 sobe de baixo para cima por cima do encaixe (11,00–11,35)
106
+ var LC = poeFoto(cF1b, "FOTO p1 baixo (cortina)", slot[0], slot[1]);
107
+ J_tr(LC).property("ADBE Position").setValue([slot[0], slot[1], -1.6]);
108
+ var mk = LC.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"); mk.name = "cortina";
109
+ function retMask(x0, y0, x1, y1) { var s = new Shape(); s.vertices = [[x0, y0], [x1, y0], [x1, y1], [x0, y1]]; s.closed = true; return s; }
110
+ var W1 = slot[2] - slot[0], H1 = slot[3] - slot[1], c0 = 11.02, c1 = 11.42; // medido: 12% em 11,08 e 65% em 11,25
111
+ mk.property("ADBE Mask Shape").setValuesAtTimes([c0, c1], [retMask(0, H1, W1, H1), retMask(0, 0, W1, H1)]);
112
+ var es1 = [new KeyframeEase(0, 0.1)], es2 = [new KeyframeEase(0, 30)];
113
+ mk.property("ADBE Mask Shape").setInterpolationTypeAtKey(1, KeyframeInterpolationType.LINEAR, KeyframeInterpolationType.LINEAR); mk.property("ADBE Mask Shape").setInterpolationTypeAtKey(2, KeyframeInterpolationType.LINEAR, KeyframeInterpolationType.LINEAR); // cortina com velocidade constante (medido: 12% em 11,08 e 62% em 11,25)
114
+ // filete claro na borda da cortina
115
+ var fil = comp.layers.addSolid([0.86, 0.88, 0.9], "CORTINA filete", 950, 10, 1, comp.duration);
116
+ J_filho(fil, plano, [475, 5], [slot[0] + 475, slot[3], -1.8], 100, 0);
117
+ fil.property("ADBE Transform Group").property("ADBE Position").expression =
118
+ 'var m = thisComp.layer("FOTO p1 baixo (cortina)").mask("cortina").maskPath.points()[0][1];\n' +
119
+ '[value[0], ' + slot[1] + ' + m, value[2]]';
120
+ fil.property("ADBE Transform Group").property("ADBE Opacity").expression =
121
+ '(time > ' + c0 + ' && time < ' + (c1 + 0.04) + ') ? 85 : 0';
122
+
123
+ // ---------- manchetes digitadas (letra: ae/letra.json, slots F1–F4) ----------
124
+ // caixa de cada manchete = a do original no plano: x da 1ª letra, linha de base, altura de maiúscula, largura máx.
125
+ // atraso/ini/fim: o original digita cada palavra um pouco depois de cantada (medido quadro a quadro).
126
+ var FONTE = "NotoSerifDisplay-ExtraCondensedBlack";
127
+ var MANCHETES = [
128
+ { slot: "F1", nome: "MANCHETE 1 (F1)", x: 487, base: -347, cap: 134, larg: 900, atraso: 0.00, ini: 11.20, fim: 12.10 },
129
+ { slot: "F2", nome: "MANCHETE 2 (F2)", x: -540, base: -1740, cap: 140, larg: 1085, atraso: 0.27, ini: 12.92, fim: 14.00 },
130
+ { slot: "F3", nome: "MANCHETE 3 (F3)", x: 2694, base: -1806, cap: 110, larg: 1110, atraso: 0.12, ini: 14.16, fim: 15.25 },
131
+ { slot: "F4", nome: "MANCHETE 4 (F4)", x: 1684, base: -410, cap: 106, larg: 1130, atraso: 0.07, ini: 15.25, fim: 16.50 }];
132
+ var rel = [];
133
+ for (var m = 0; m < MANCHETES.length; m++) {
134
+ var M = MANCHETES[m], sl = LETRA(M.slot);
135
+ var h = J_manchete(comp, plano, M.nome, sl.texto, FONTE, M.x, M.base, M.cap, M.larg, 70);
136
+ DIGITAR(h.layer, sl.palavras, J_tempos(sl.tempos, M.atraso, M.ini, M.fim), M.fim, { cursor: true, cursorFica: 0.25 });
137
+ rel.push(M.slot + " '" + sl.texto + "' " + (sl.preenchido ? "(letra)" : "(reserva)") + " corpo " + h.corpo.toFixed(0) + " hs " + h.hs.toFixed(0));
138
+ }
139
+
140
+ // ordem: PLANO no topo (só organiza), textos, fotos/encaixe, páginas, sombras, mesa, fundo
141
+ plano.moveToBeginning();
142
+ J_limpaSolidos();
143
+ return "ok CENA F-jornal1 | " + rel.join(" | ");
144
+ })();
@@ -0,0 +1,153 @@
1
+ // =====================================================================
2
+ // CENA G-google (16,62–18,95 s, ref 18,80) — busca do Google escura (agente w-google, 17/10). ES3.
3
+ // Mundo = quadro do original em 18,80. Câmera: camera/cena-G-google-ajustada.json (homografia; o resto
4
+ // projetivo — a página inclina ~28° em Y e ~14° em X no chicote 17,2–17,8 — vai no Corner Pin da CENA).
5
+ // Encaixe F: o ícone do chip "Estúdio Quadro" (comp provisória "ENCAIXE F-jornal1").
6
+ // Fim (18,45–18,95): página vira retângulo arredondado; o fundo é o mundo H (mapa + anel amarelo do marcador 1),
7
+ // alinhado com a câmera de H na troca (18,958); o avatar @mari.frames cresce sobre a página.
8
+ // Rodar com a comp fechada: $.evalFile(P + "ae/G-google.jsx");
9
+ // =====================================================================
10
+ (function () {
11
+ var P0 = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
12
+ $.evalFile(P0 + "ae/wg-util.jsx");
13
+ var ID = "G-google", MG = 320, TS = 16.625, TF = 18.9583;
14
+ var pasta = WG.pasta("CENA " + ID + " (w-google)");
15
+ var M = WG.comp("MUNDO " + ID, 1080 + 2 * MG, 1080 + 2 * MG, pasta);
16
+ var C = WG.camera(M, ID), cam = C.cam;
17
+ // as medidas da página foram tiradas do quadro 18,833 do original (o ffmpeg -ss pegou o quadro seguinte ao ref):
18
+ // o nulo LAYOUT leva essas medidas para o mundo (= quadro 18,792) pela câmera daquele quadro
19
+ var cL = WG.camEm(cam, 18.8333), sL = Math.pow(2, cL.z);
20
+ var LAY = WG.nulo(M, cam, "LAYOUT (medidas do quadro 18,833)", [540, 540], [cL.mx, cL.my], [100 / sL, 100 / sL], -cL.g);
21
+ function TW(p) { var r = -cL.g * Math.PI / 180, dx = (p[0] - 540) / sL, dy = (p[1] - 540) / sL; return [cL.mx + Math.cos(r) * dx - Math.sin(r) * dy, cL.my + Math.sin(r) * dx + Math.cos(r) * dy]; }
22
+ var FG = "GoogleSansFlex120pt-Regular", FGM = "GoogleSansFlex120pt-Medium";
23
+ var BG = "#202228", BUSCA = "#34353E", CHIP = "#2C2E34", TXT = "#E8EAED", CINZA = "#9AA0A6";
24
+
25
+ // ---------- fundo: mundo H (mapa + anel do marcador 1), alinhado com a câmera de H em 18,958
26
+ var dH = WG.CAMERA_lerJSON(WG.P + "camera/cena-H-mapa-ajustada.json");
27
+ var cG = WG.camEm(cam, TF), cH = WG.camJSON(dH, TF);
28
+ var fH = WG.nuloOutroMundo(M, cam, "FUNDO H (mundo do mapa)", cG, cH);
29
+ var itMapa = WG.footage("assets/H-mapa/mapa-satelite.png");
30
+ var mapa = M.layers.add(itMapa); mapa.name = "FUNDO H mapa"; mapa.parent = fH;
31
+ WG.pos(mapa, [0, 0], [WG.H_MAPA.x, WG.H_MAPA.y], [WG.H_MAPA.k * 100, WG.H_MAPA.k * 100]);
32
+ mapa.motionBlur = true;
33
+ var anel = WG.forma(M, fH, "FUNDO H anel amarelo", { x: WG.H_M1[0] - 49.5, y: WG.H_M1[1] - 49.5, w: 99, h: 99, elipse: true, cor: WG.AMARELO });
34
+ mapa.inPoint = 18.3; anel.inPoint = 18.3;
35
+ mapa.outPoint = TF; anel.outPoint = TF; // depois da troca o mundo H de verdade aparece em volta (G vira encaixe em H)
36
+
37
+ // ---------- página (fundo escuro) + máscara de recorte usada por todo o conteúdo
38
+ function pagina(nome) {
39
+ var L = WG.forma(M, LAY, nome, { x: -700, y: -700, w: 2500, h: 2500, r: 0, cor: BG });
40
+ var sz = WG.rectProp(L, "ADBE Vector Rect Size"), ps = WG.rectProp(L, "ADBE Vector Rect Position"), rd = WG.rectProp(L, "ADBE Vector Rect Roundness");
41
+ // posição da forma é relativa ao centro da camada (550,550)
42
+ // no fim a página "respira" para o tamanho que tem quando entra no marcador de H (medido em 18,80 e 18,958)
43
+ WG.chaves(sz, [[17.95, [2500, 2500]], [18.52, [1020, 1017]], [18.80, [1020, 1017]], [TF, [1047, 1046]]], 70);
44
+ WG.chaves(ps, [[17.95, [0, 0]], [18.52, [538 - 550, 541.5 - 550]], [18.80, [538 - 550, 541.5 - 550]], [TF, [552.5 - 550, 545 - 550]]], 70);
45
+ WG.chaves(rd, [[17.95, 0], [18.52, 26], [TF, 30]], 70);
46
+ return L;
47
+ }
48
+ var pag = pagina("PAGINA fundo");
49
+ var matte = pagina("PAGINA recorte (matte)");
50
+ var conteudo = [];
51
+ function cont(L) { conteudo.push(L); return L; }
52
+
53
+ // ---------- cabeçalho
54
+ cont(WG.texto(M, LAY, "logo Google", "Google", { x: 80, y: 100, fonte: FGM, tam: 45, cor: "#FFFFFF", track: -12 }));
55
+ cont(WG.forma(M, LAY, "caixa de busca", { x: 302, y: 49, w: 1150, h: 82, r: 41, cor: BUSCA }));
56
+ var ph = cont(WG.texto(M, LAY, "busca placeholder", "Search", { x: 333, y: 100, fonte: FG, tam: 27, cor: CINZA }));
57
+ ph.outPoint = 17.20;
58
+ var sG1 = WG.LETRA("G1"); // letra: caixa de busca (digitada 17,20–17,60 como no original)
59
+ var busca = cont(WG.texto(M, LAY, "busca digitada (letra G1)", sG1.texto, { x: 333, y: 101, fonte: FG, tam: 30, cor: "#FFFFFF" }));
60
+ WG.DIGITAR(busca, sG1.palavras, WG.tempoDig("G1", sG1), WG.DIG.G1.fim, { cursor: true, cursorFica: 0.25 });
61
+ busca.inPoint = 17.20;
62
+
63
+ // ---------- abas (layout medido: começam em x=80, linha de base 200, espaço 40)
64
+ var abas = ["AI Mode", "All", "Shopping", "Images", "Videos", "Short videos", "News", "More"];
65
+ var x = 80;
66
+ for (var i = 0; i < abas.length; i++) {
67
+ var ativa = (i == 1);
68
+ var L = cont(WG.texto(M, LAY, "aba " + abas[i], abas[i], { x: x, y: 200, fonte: ativa ? FGM : FG, tam: 22, cor: ativa ? "#FFFFFF" : CINZA }));
69
+ var w = L.sourceRectAtTime(0, false).width;
70
+ if (ativa) cont(WG.forma(M, LAY, "aba ativa sublinhado", { x: x - 2, y: 222, w: w + 4, h: 4, r: 2, cor: "#FFFFFF" }));
71
+ if (abas[i] == "More") cont(WG.texto(M, LAY, "aba Mais seta", "\u25BE", { x: x + w + 8, y: 198, fonte: FG, tam: 16, cor: CINZA }));
72
+ x += w + 40;
73
+ }
74
+ cont(WG.forma(M, LAY, "linha sob as abas", { x: 68, y: 230, w: 1500, h: 1.5, cor: "#3A3D44" }));
75
+
76
+ // ---------- "Ver resultados sobre" + chip
77
+ cont(WG.texto(M, LAY, "ver resultados 1", "See results", { x: 78, y: 305, fonte: FG, tam: 20, cor: TXT }));
78
+ cont(WG.texto(M, LAY, "ver resultados 2", "about", { x: 78, y: 335, fonte: FG, tam: 20, cor: TXT }));
79
+ var t1 = cont(WG.texto(M, LAY, "chip titulo", "Studio Quadro", { x: 305, y: 307, fonte: FGM, tam: 23, cor: TXT }));
80
+ var t2 = cont(WG.texto(M, LAY, "chip subtitulo", "Mobile app", { x: 305, y: 335, fonte: FG, tam: 19, cor: CINZA }));
81
+ var wchip = Math.max(t1.sourceRectAtTime(0, false).width, t2.sourceRectAtTime(0, false).width);
82
+ var chip = cont(WG.forma(M, LAY, "chip fundo", { x: 218, y: 275, w: 305 + wchip + 22 - 218, h: 77, r: 16, cor: CHIP }));
83
+ chip.moveAfter(t1);
84
+
85
+ // ---------- painel: título (palavra a palavra, entra de cima), subtítulo, grade de imagens
86
+ // no original cada palavra desce ~140 px (mundo) já no lugar em x, aparecendo, e pousa devagar (~0,55 s)
87
+ var sG2 = WG.LETRA("G2"), palavras = sG2.palavras, tIn = WG.tempoDig("G2", sG2); // letra: título do painel (cada palavra desce)
88
+ var px = 75;
89
+ for (i = 0; i < palavras.length; i++) {
90
+ var Lw = cont(WG.texto(M, LAY, "titulo palavra " + (i + 1) + " (" + palavras[i] + ")", palavras[i], { x: px, y: 481, fonte: FG, tam: 46, cor: TXT }));
91
+ var ww = Lw.sourceRectAtTime(0, false).width;
92
+ var tr = WG.tr(Lw);
93
+ WG.chave2(tr.property("ADBE Position"), tIn[i], [px, 481 - 140], tIn[i] + 0.6, [px, 481], 15, 92);
94
+ WG.chave2(tr.property("ADBE Opacity"), tIn[i], 0, tIn[i] + 0.2, 100, 30, 60);
95
+ Lw.inPoint = tIn[i];
96
+ px += ww + 12;
97
+ }
98
+ var sub = cont(WG.texto(M, LAY, "subtitulo", "Video game", { x: 76, y: 520, fonte: FG, tam: 21, cor: "#BDC1C6" }));
99
+ var wsub = sub.sourceRectAtTime(0, false).width;
100
+ cont(WG.texto(M, LAY, "subtitulo menu", "\u22EE", { x: 76 + wsub + 20, y: 520, fonte: FGM, tam: 22, cor: "#BDC1C6" }));
101
+ cont(WG.imagem(M, LAY, "grade imagem 1", "assets/G-google/motion-1.png", { x: 74, y: 563, w: 516, h: 570, r: 16, fx: 0.42 }));
102
+ cont(WG.imagem(M, LAY, "grade imagem 2", "assets/G-google/motion-2.png", { x: 596, y: 565, w: 374, h: 257, r: 16 }));
103
+ cont(WG.imagem(M, LAY, "grade imagem 3", "assets/G-google/motion-3.png", { x: 596, y: 826, w: 374, h: 300, r: 16 }));
104
+ cont(WG.imagem(M, LAY, "grade imagem 4 (direita)", "assets/G-google/motion-4.png", { x: 1005, y: 565, w: 420, h: 560, r: 16, fx: 0.2 }));
105
+ cont(WG.forma(M, LAY, "icone imagem", { x: 897, y: 1021, w: 26, h: 22, r: 4, traco: "#FFFFFF", tracoL: 2.2 }));
106
+
107
+ for (i = 0; i < conteudo.length; i++) conteudo[i].setTrackMatte(matte, TrackMatteType.ALPHA);
108
+ matte.enabled = false;
109
+
110
+ // ---------- encaixe F (jornal) no ícone do chip + arte do ícone que desliza por cima
111
+ var c0 = WG.camEm(cam, TS);
112
+ var provF = WG.provisoria("ENCAIXE F-jornal1");
113
+ var lado0 = 1080 / Math.pow(2, c0.z);
114
+ var enc = WG.CAMERA_encaixe(M, cam, provF, [c0.mx, c0.my], lado0, -c0.g, "ENCAIXE F-jornal1");
115
+ enc.motionBlur = true;
116
+ var et = WG.tr(enc), slot = TW([255, 312]), ladoSlot = 58 / sL;
117
+ WG.chaves(et.property("ADBE Position"), [[TS, [c0.mx, c0.my]], [16.80, slot]], 75);
118
+ WG.chaves(et.property("ADBE Scale"), [[TS, [100 * lado0 / 1080, 100 * lado0 / 1080]], [16.80, [100 * ladoSlot / 1080, 100 * ladoSlot / 1080]]], 75);
119
+ WG.chaves(et.property("ADBE Rotate Z"), [[TS, -c0.g], [16.80, 0]], 75);
120
+ var mk = WG.mascara(enc, WG.formaRet(0, 0, 1080, 1080, 0), "arredonda");
121
+ WG.chaves(mk.property("ADBE Mask Shape"), [[TS, WG.formaRet(0, 0, 1080, 1080, 0)], [16.80, WG.formaRet(0, 0, 1080, 1080, 1080 * 12.5 / 58)]], 75);
122
+ var ico = WG.imagem(M, cam, "icone Studio Quadro (arte)", "assets/G-google/icone-estudio-quadro.png", { x: slot[0] - ladoSlot / 2, y: slot[1] - ladoSlot / 2, w: ladoSlot, h: ladoSlot, r: 12.5 / sL });
123
+ var itI = WG.footage("assets/G-google/icone-estudio-quadro.png");
124
+ var ip = WG.tr(ico);
125
+ // tamanho no mundo medido no original (px do mundo): cresce enquanto a câmera recua
126
+ var tam = [[16.42, 0.0], [16.46, 2.8], [16.54, 3.9], [16.625, 9], [16.667, 12.5], [16.708, 18], [16.75, 30], [16.792, 45], [16.833, 54], [16.875, 58 / sL]];
127
+ var esc = [], pos = [];
128
+ for (i = 0; i < tam.length; i++) {
129
+ var s = 100 * tam[i][1] / itI.width; esc.push([tam[i][0], [s, s]]);
130
+ var u = Math.min(1, Math.max(0, (tam[i][0] - 16.60) / (16.85 - 16.60))); u = u * u * (3 - 2 * u);
131
+ pos.push([tam[i][0], [c0.mx + (slot[0] - c0.mx) * u, c0.my + 6 + (slot[1] - c0.my - 6) * u]]);
132
+ }
133
+ WG.chaves(ip.property("ADBE Scale"), esc, 40, true);
134
+ WG.chaves(ip.property("ADBE Position"), pos, 40, true);
135
+ ico.inPoint = 16.40;
136
+
137
+ // ---------- avatar @mari.frames cresce sobre a página (18,62–18,958); termina onde fica o marcador 1 de H
138
+ var e = Math.pow(2, cH.z - cG.z), r = (cH.g - cG.g) * Math.PI / 180;
139
+ var dx = WG.H_M1[0] - cH.mx, dy = WG.H_M1[1] - cH.my;
140
+ var fimAv = [cG.mx + e * (Math.cos(r) * dx - Math.sin(r) * dy), cG.my + e * (Math.sin(r) * dx + Math.cos(r) * dy)];
141
+ var dFim = 15.4 * e; // 15,4 px no mundo H (tamanho da foto do marcador na troca)
142
+ var av = WG.imagem(M, cam, "avatar mari.frames (cresce)", "assets/comum/avatar-mari.png", { x: 0, y: 0, w: 100, h: 100, circulo: true, fy: 0.35 });
143
+ var avt = WG.tr(av), itA = WG.footage("assets/comum/avatar-mari.png");
144
+ var sA = function (d) { var k = 100 * d / (itA.width); return [k, k]; };
145
+ WG.chaves(avt.property("ADBE Position"), [[18.62, TW([495, 541])], [18.80, TW([537, 540])], [TF, fimAv]], 50);
146
+ WG.chaves(avt.property("ADBE Scale"), [[18.62, sA(2)], [18.70, sA(18 / sL)], [18.80, sA(64 / sL)], [TF, sA(dFim)]], 40);
147
+ av.inPoint = 18.60;
148
+
149
+ // ---------- CENA G-google (Corner Pin)
150
+ var cena = WG.cena(ID, M, C.d, pasta);
151
+ WG.limparSolidos();
152
+ return "ok G: " + M.numLayers + " camadas no mundo; encaixe lado " + lado0.toFixed(2) + "; avatar fim " + fimAv[0].toFixed(1) + "," + fimAv[1].toFixed(1) + " d " + dFim.toFixed(1);
153
+ })();