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,176 @@
1
+ // =====================================================================
2
+ // CENA H-mapa (18,95–22,30 s, ref 22,20) — mapa de satélite estilo jogo (agente w-google, 17/10). ES3.
3
+ // Mundo = quadro do original em 22,20 (o mapa já está inclinado em 3D nesse quadro; o resto projetivo da
4
+ // câmera medida vai no Corner Pin da CENA; inclinação chega a ~30° entre 19,5 e 20,6 s).
5
+ // Encaixe G: a página do Google encolhe dentro do marcador 1 (anel amarelo) = comp provisória "ENCAIXE G-google".
6
+ // Marcador 2 (@o.produtor) sobe ~180 px pelo mapa de 20,8 a 22,3 (medido no original) com a etiqueta branca.
7
+ // Fim: o mapa é recortado no retângulo da 1ª célula da grade de I (fundo = página de imagens de I) e a
8
+ // miniatura do céu nasce na etiqueta branca (22,04) e cresce até cobrir o mapa (22,55, já dentro de I).
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 = "H-mapa", MG = 540, TS = 18.9583, TF = 22.2917;
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
+ var FE = "Anton-Regular", FN = "Roboto-Bold", FM = "Roboto-Medium";
18
+ var recortaveis = [];
19
+ function rec(L) { recortaveis.push(L); return L; }
20
+
21
+ // ---------- fundo: página de imagens de I (aparece quando o mapa vira a 1ª célula)
22
+ var dI = WG.CAMERA_lerJSON(WG.P + "camera/cena-I-imagens-ajustada.json");
23
+ var cH = WG.camEm(cam, TF), cI = WG.camJSON(dI, TF);
24
+ var fI = WG.nuloOutroMundo(M, cam, "FUNDO I (mundo da busca de imagens)", cH, cI);
25
+ var pagI = WG.nulo(M, fI, "FUNDO I pagina grande", WG.I_PAG.anc, WG.I_PAG.pos, [WG.I_PAG.esc, WG.I_PAG.esc], WG.I_PAG.rot);
26
+ var bgI = WG.forma(M, pagI, "FUNDO I fundo escuro", { x: -400, y: -200, w: 2200, h: 1600, cor: "#202228" });
27
+ var cel = [WG.I_CEL.c2, WG.I_CEL.c3, WG.I_CEL.c4];
28
+ for (var i = 0; i < 3; i++) {
29
+ var cc = cel[i];
30
+ var Lc = WG.imagem(M, pagI, "FUNDO I celula " + (i + 2), WG.I_IMGS[i + 1], { x: cc[0], y: cc[1], w: cc[2], h: cc[3], r: 4 });
31
+ Lc.inPoint = 21.8;
32
+ }
33
+ bgI.inPoint = 21.8;
34
+
35
+ // ---------- mapa: centro + 8 cópias espelhadas (só aparecem nas bordas com a inclinação forte)
36
+ var itM = WG.footage("assets/H-mapa/mapa-satelite.png");
37
+ var mw = itM.width * WG.H_MAPA.k, mh = itM.height * WG.H_MAPA.k;
38
+ for (var ty = -1; ty <= 1; ty++) for (var tx = -1; tx <= 1; tx++) {
39
+ var Lm = M.layers.add(itM); Lm.name = "mapa " + (tx == 0 && ty == 0 ? "centro" : ("espelho " + tx + "," + ty));
40
+ Lm.parent = cam;
41
+ var sx = (tx == 0 ? 1 : -1) * WG.H_MAPA.k * 100, sy = (ty == 0 ? 1 : -1) * WG.H_MAPA.k * 100;
42
+ WG.pos(Lm, [itM.width / 2, itM.height / 2], [WG.H_MAPA.x + mw / 2 + tx * mw, WG.H_MAPA.y + mh / 2 + ty * mh], [sx, sy]);
43
+ Lm.motionBlur = true; Lm.quality = LayerQuality.BEST;
44
+ // tom de mapa de jogo: menos saturado, mais escuro e um pouco macio
45
+ Lm.property("ADBE Effect Parade").addProperty("ADBE Color Balance (HLS)");
46
+ Lm.property("ADBE Effect Parade").addProperty("ADBE Gaussian Blur 2");
47
+ var cb = Lm.property("ADBE Effect Parade").property("ADBE Color Balance (HLS)");
48
+ cb.property(2).setValue(-10); cb.property(3).setValue(-32);
49
+ Lm.property("ADBE Effect Parade").property("ADBE Gaussian Blur 2").property(1).setValue(1.6);
50
+ rec(Lm);
51
+ }
52
+ // leve escurecida para parecer o mapa do jogo (mais fechado que a foto gerada)
53
+ var esc = rec(WG.forma(M, cam, "mapa tom (escurece)", { x: -1500, y: -1500, w: 4200, h: 4200, cor: "#0B1A0E", alfa: 22 }));
54
+
55
+ // ---------- nomes no mapa (branco com contorno escuro)
56
+ function nome(s, x, y, tam, rot, fonte, ital) {
57
+ var L = rec(WG.texto(M, cam, "nome " + s, s, { x: x, y: y, fonte: fonte, tam: tam, cor: "#F2F2F2", traco: "#1C211C", tracoL: 3.2, italico: ital }));
58
+ WG.tr(L).property("ADBE Rotate Z").setValue(rot);
59
+ return L;
60
+ }
61
+ nome("Pine Village", 280, 316, 44, -2, FN, false);
62
+ nome("Pine Hill", 825, 96, 30, -3, FM, false);
63
+ nome("Ruins", 228, 42, 24, -3, "Roboto-MediumItalic", false);
64
+ nome("Farm Ridge", 603, 866, 42, 2, FM, false);
65
+ nome("Ridge Complex", 100, 995, 40, 4, FM, false);
66
+
67
+ // ---------- etiqueta-seta (forma que cresce com o texto digitado)
68
+ function etiqueta(nomeE, pai, cor, alt, ponta, ladoEsq, txtNome) {
69
+ var L = M.layers.addShape(); L.name = nomeE; L.parent = pai;
70
+ var root = L.property("ADBE Root Vectors Group"); root.addProperty("ADBE Vector Group");
71
+ var v = root.property(1).property("ADBE Vectors Group");
72
+ v.addProperty("ADBE Vector Shape - Group"); v.addProperty("ADBE Vector Graphic - Fill");
73
+ v = L.property("ADBE Root Vectors Group").property(1).property("ADBE Vectors Group");
74
+ v.property("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color").setValue(WG.cor(cor));
75
+ var H = alt / 2, T = ponta;
76
+ var ex = 'var t = thisComp.layer("' + txtNome + '"); var W = Math.max(t.sourceRectAtTime(time, false).width, 0) + 34;\n';
77
+ if (ladoEsq) ex += 'createPath([[0,0],[-' + T + ',-' + H + '],[-' + T + '-W,-' + H + '],[-2*' + T + '-W,0],[-' + T + '-W,' + H + '],[-' + T + ',' + H + ']], [], [], true);';
78
+ else ex += 'createPath([[0,0],[' + T + ',-' + H + '],[' + T + '+W,-' + H + '],[2*' + T + '+W,0],[' + T + '+W,' + H + '],[' + T + ',' + H + ']], [], [], true);';
79
+ v.property("ADBE Vector Shape - Group").property("ADBE Vector Shape").expression = ex;
80
+ WG.pos(L, [0, 0], [0, 0]);
81
+ L.motionBlur = true;
82
+ var sh = L.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
83
+ sh = L.property("ADBE Effect Parade").property("ADBE Drop Shadow");
84
+ sh.property("ADBE Drop Shadow-0002").setValue(45); sh.property("ADBE Drop Shadow-0004").setValue(3); sh.property("ADBE Drop Shadow-0005").setValue(5);
85
+ return L;
86
+ }
87
+
88
+ // ---------- marcador 1 (@mari.frames, anel amarelo) + encaixe G que encolhe dentro dele
89
+ var c0 = WG.camEm(cam, TS);
90
+ var provG = WG.provisoria("ENCAIXE G-google");
91
+ var lado0 = 1080 / Math.pow(2, c0.z);
92
+ var anel1 = rec(WG.forma(M, cam, "marcador 1 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 }));
93
+ var enc = WG.CAMERA_encaixe(M, cam, provG, [c0.mx, c0.my], lado0, -c0.g, "ENCAIXE G-google");
94
+ enc.motionBlur = true; rec(enc);
95
+ var et = WG.tr(enc);
96
+ // a página de G ocupa ~80% do quadro do encaixe; o encaixe quase não muda de tamanho: a máscara é que
97
+ // arredonda até virar o círculo do marcador (Ø 91 no mundo) enquanto a foto cresce por cima
98
+ var ladoF = lado0 * 0.985, dC = 1080 * 92 / ladoF;
99
+ WG.chaves(et.property("ADBE Position"), [[TS, [c0.mx, c0.my]], [19.17, WG.H_M1]], 70);
100
+ WG.chaves(et.property("ADBE Scale"), [[TS, [100 * lado0 / 1080, 100 * lado0 / 1080]], [19.17, [100 * ladoF / 1080, 100 * ladoF / 1080]]], 70);
101
+ WG.chaves(et.property("ADBE Rotate Z"), [[TS, -c0.g], [19.17, 0]], 70);
102
+ var mk = WG.mascara(enc, WG.formaRet(0, 0, 1080, 1080, 0), "arredonda");
103
+ WG.chaves(mk.property("ADBE Mask Shape"), [[TS, WG.formaRet(0, 0, 1080, 1080, 0)], [19.02, WG.formaRet(60, 60, 960, 960, 110)],
104
+ [19.15, WG.formaRet(100, 100, 880, 880, 200)], [19.22, WG.formaRet(140, 140, 800, 800, 250)]], 60); // no original a página ainda é um quadrado arredondado em 19,21 e some atrás da foto
105
+ enc.outPoint = 19.25;
106
+ var itA = WG.footage("assets/comum/avatar-mari.png");
107
+ var foto1 = rec(WG.imagem(M, cam, "marcador 1 foto (mari.frames)", "assets/comum/avatar-mari.png", { x: WG.H_M1[0] - 45.5, y: WG.H_M1[1] - 45.5, w: 91, h: 91, circulo: true, fy: 0.35 }));
108
+ // diâmetro da foto no mundo, medido quadro a quadro no original
109
+ var dF = [[TS, 15.4], [19.0, 19.5], [19.042, 28], [19.083, 42], [19.125, 56], [19.167, 69], [19.208, 82], [19.25, 91]];
110
+ var kF = [];
111
+ for (i = 0; i < dF.length; i++) { var sF = 100 * dF[i][1] / itA.width; kF.push([dF[i][0], [sF, sF]]); }
112
+ WG.chaves(WG.tr(foto1).property("ADBE Scale"), kF, 33, true);
113
+ var sh1 = anel1.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
114
+ sh1 = anel1.property("ADBE Effect Parade").property("ADBE Drop Shadow");
115
+ sh1.property("ADBE Drop Shadow-0002").setValue(50); sh1.property("ADBE Drop Shadow-0004").setValue(3); sh1.property("ADBE Drop Shadow-0005").setValue(6);
116
+
117
+ // ---------- etiqueta amarela (ponta direita encostada no marcador 1), digitada 19,20–20,30
118
+ var gA = WG.nulo(M, cam, "ETIQUETA AMARELA (grupo)", [0, 0], [414, 405], [100, 100], -4);
119
+ var sH1 = WG.LETRA("H1"); // letra: etiqueta amarela
120
+ var txA = rec(WG.texto(M, gA, "etiqueta amarela texto", sH1.texto, { x: -24, y: 14, fonte: FE, tam: 38, cor: "#111111", just: "D", italico: true, hscale: 84 }));
121
+ WG.DIGITAR(txA, sH1.palavras, WG.tempoDig("H1", sH1), WG.DIG.H1.fim, { cursor: true, cursorFica: 0.25 });
122
+ var shA = rec(etiqueta("etiqueta amarela forma", gA, WG.AMARELO, 40, 20, true, "etiqueta amarela texto"));
123
+ shA.moveAfter(txA);
124
+ WG.chave2(WG.tr(gA).property("ADBE Opacity"), 19.03, 0, 19.08, 100, 30, 30);
125
+ WG.chave2(WG.tr(gA).property("ADBE Scale"), 19.03, [60, 60], 19.14, [100, 100], 30, 70);
126
+
127
+ // ---------- marcador 2 (@o.produtor, anel branco) + etiqueta branca, sobe pelo mapa (trajetória medida)
128
+ var g2 = WG.nulo(M, cam, "MARCADOR 2 (grupo, sobe)", [0, 0], [351, 566]);
129
+ WG.chaves(WG.tr(g2).property("ADBE Position"), [[20.75, [246, 800]], [21.0, [236, 732]], [21.25, [230, 702]], [21.5, [246, 659]], [21.75, [290, 614]], [22.0, [330, 581]], [22.21, [351, 566]], [22.45, [360, 558]]], 33, true);
130
+ WG.chave2(WG.tr(g2).property("ADBE Opacity"), 20.75, 0, 20.80, 100, 30, 30);
131
+ var anel2 = rec(WG.forma(M, g2, "marcador 2 anel branco", { x: -52, y: -52, w: 104, h: 104, elipse: true, cor: "#F4F4F4" }));
132
+ var foto2 = rec(WG.imagem(M, g2, "marcador 2 foto (o.produtor)", "assets/comum/avatar-produtor.png", { x: -47, y: -47, w: 94, h: 94, circulo: true, fy: 0.3 }));
133
+ var sh2 = anel2.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
134
+ sh2 = anel2.property("ADBE Effect Parade").property("ADBE Drop Shadow");
135
+ sh2.property("ADBE Drop Shadow-0002").setValue(50); sh2.property("ADBE Drop Shadow-0004").setValue(3); sh2.property("ADBE Drop Shadow-0005").setValue(6);
136
+ var gB = WG.nulo(M, g2, "ETIQUETA BRANCA (grupo)", [0, 0], [67, -13]);
137
+ var sH2 = WG.LETRA("H2"); // letra: etiqueta branca
138
+ var txB = rec(WG.texto(M, gB, "etiqueta branca texto", sH2.texto, { x: 30, y: 18, fonte: FE, tam: 47, cor: "#111111", italico: true, hscale: 84 }));
139
+ WG.DIGITAR(txB, sH2.palavras, WG.tempoDig("H2", sH2), WG.DIG.H2.fim, { cursor: true, cursorFica: 0.3 });
140
+ var shB = rec(etiqueta("etiqueta branca forma", gB, "#F4F4F4", 56, 22, false, "etiqueta branca texto"));
141
+ shB.moveAfter(txB);
142
+
143
+ // ---------- miniatura do céu (imagem 1 de I): nasce na etiqueta branca e cobre o mapa
144
+ var mini = rec(WG.imagem(M, cam, "miniatura ceu (vira a celula 1 de I)", WG.I_IMGS[0], { x: 0, y: 0, w: 100, h: 100, r: 0 }));
145
+ var itC = WG.footage(WG.I_IMGS[0]);
146
+ function sC(d) { var k = 100 * d / itC.width; return [k, k]; }
147
+ // posição: acompanha a etiqueta (marcador 2 + (187,-49)) até 22,25, depois vai ao centro do recorte
148
+ var pm = [[22.04, [330 + 187, 581 - 49]], [22.12, [337 + 187, 571 - 49]], [22.21, [351 + 187, 566 - 49]], [22.27, [354 + 187, 563 - 49]]]; // segue a etiqueta branca
149
+ WG.chaves(WG.tr(mini).property("ADBE Position"), pm, 33, true);
150
+ WG.chaves(WG.tr(mini).property("ADBE Scale"), [[22.04, sC(0)], [22.10, sC(14)], [22.15, sC(32)], [22.21, sC(87)], [22.27, sC(150)]], 33, true);
151
+ mini.inPoint = 22.04;
152
+
153
+ // ---------- recorte final no retângulo da célula 1 de I (matte), calculado pela câmera de I na troca
154
+ var c1 = WG.I_CEL.c1, cantos = [[c1[0], c1[1]], [c1[0] + c1[2], c1[1]], [c1[0], c1[1] + c1[3]], [c1[0] + c1[2], c1[1] + c1[3]]];
155
+ var xs = [], ys = [];
156
+ for (i = 0; i < 4; i++) { var q = WG.mundoBparaA(WG.iLocalParaMundo(cantos[i]), cH, cI); xs.push(q[0]); ys.push(q[1]); }
157
+ var rx0 = Math.min(xs[0], xs[2]), rx1 = Math.max(xs[1], xs[3]), ry0 = Math.min(ys[0], ys[1]), ry1 = Math.max(ys[2], ys[3]);
158
+ var rot = Math.atan2(ys[1] - ys[0], xs[1] - xs[0]) * 180 / Math.PI;
159
+ var matte = WG.forma(M, cam, "RECORTE celula 1 de I (matte)", { x: -2000, y: -2000, w: 5000, h: 5000, cor: "#FFFFFF" });
160
+ var cx = (rx0 + rx1) / 2, cy = (ry0 + ry1) / 2;
161
+ var mt = WG.tr(matte);
162
+ WG.chaves(mt.property("ADBE Position"), [[21.90, [500, 500]], [22.06, [cx, cy]]], 70);
163
+ WG.chaves(WG.rectProp(matte, "ADBE Vector Rect Size"), [[21.90, [5000, 5000]], [22.06, [rx1 - rx0, ry1 - ry0]]], 70);
164
+ WG.chaves(mt.property("ADBE Rotate Z"), [[21.90, 0], [22.06, rot]], 70);
165
+ // a miniatura termina cobrindo o recorte (já dentro de I)
166
+ // já dentro de I: cresce devagar e só cobre a célula inteira por volta de 22,92 (medido na célula 1 do original)
167
+ var lc = Math.max(rx1 - rx0, ry1 - ry0);
168
+ WG.chaves(WG.tr(mini).property("ADBE Position"), [[22.333, [541, 514]], [22.92, [cx, cy]]], 50);
169
+ WG.chaves(WG.tr(mini).property("ADBE Scale"), [[22.333, sC(185)], [22.417, sC(310)], [22.458, sC(455)], [22.542, sC(680)], [22.583, sC(770)], [22.75, sC(890)], [22.92, sC(lc * 1.08)]], 40, true);
170
+ for (i = 0; i < recortaveis.length; i++) recortaveis[i].setTrackMatte(matte, TrackMatteType.ALPHA);
171
+ matte.enabled = false;
172
+
173
+ var cena = WG.cena(ID, M, C.d, pasta);
174
+ WG.limparSolidos();
175
+ return "ok H: " + M.numLayers + " camadas; encaixe lado " + lado0.toFixed(1) + "; recorte " + rx0.toFixed(0) + "," + ry0.toFixed(0) + " a " + rx1.toFixed(0) + "," + ry1.toFixed(0) + " rot " + rot.toFixed(2);
176
+ })();
@@ -0,0 +1,132 @@
1
+ // =====================================================================
2
+ // CENA I-imagens (22,30–24,62 s, ref 24,58) — busca de imagens escura + resultado de vídeo (agente w-google). ES3.
3
+ // O mundo tem duas escalas, como saiu da câmera medida: a página grande de imagens (grupo "PAGINA IMAGENS",
4
+ // coordenadas locais = tela do original em 23,042, ~2,6x maior e girada 2,5°) e o resultado de vídeo no
5
+ // tamanho do quadro de referência (24,58). O chicote 23,4–24,0 vai de uma para a outra.
6
+ // Encaixe H: a 1ª célula da grade = comp provisória "ENCAIXE H-mapa" (o próprio H recorta o mapa na célula).
7
+ // Fim: recorte arredondado da página e fundo bege provisório do jornal J (desligar na montagem).
8
+ // =====================================================================
9
+ (function () {
10
+ var P0 = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
11
+ $.evalFile(P0 + "ae/wg-util.jsx");
12
+ var ID = "I-imagens", MG = 180, TS = 22.2917;
13
+ var pasta = WG.pasta("CENA " + ID + " (w-google)");
14
+ var M = WG.comp("MUNDO " + ID, 1080 + 2 * MG, 1080 + 2 * MG, pasta);
15
+ var C = WG.camera(M, ID), cam = C.cam;
16
+ var FG = "GoogleSansFlex120pt-Regular", FGM = "GoogleSansFlex120pt-Medium", FI = "SegoeMDL2Assets";
17
+ var BG = "#202228", PILL = "#303134", TXT = "#E8EAED", CINZA = "#9AA0A6", CLARO = "#BDC1C6", LINK = "#8AB4F8", LINHA = "#3A3D44";
18
+ function largura(L) { return L.sourceRectAtTime(0, false).width; }
19
+ function pontos3(comp, pai, nome, x, y, r, cor) { // menu "⋮" com 3 bolinhas
20
+ var g = WG.nulo(comp, pai, nome, [0, 0], [x, y]);
21
+ for (var k = -1; k <= 1; k++) WG.forma(comp, g, nome + " " + (k + 2), { x: -r, y: k * r * 3.2 - r, w: 2 * r, h: 2 * r, elipse: true, cor: cor });
22
+ return g;
23
+ }
24
+
25
+ // =================== página grande (imagens) ===================
26
+ var pg = WG.nulo(M, cam, "PAGINA IMAGENS (grupo, escala da tela em 23,042)", WG.I_PAG.anc, WG.I_PAG.pos, [WG.I_PAG.esc, WG.I_PAG.esc], WG.I_PAG.rot);
27
+ WG.forma(M, pg, "pag grande fundo", { x: -900, y: -500, w: 2900, h: 2100, cor: BG });
28
+ // barra do topo
29
+ WG.forma(M, pg, "pag grande busca (pilula)", { x: -700, y: 5, w: 1335, h: 90, r: 45, cor: PILL });
30
+ WG.texto(M, pg, "icone fechar", "\uE711", { x: 360, y: 62, fonte: FI, tam: 26, cor: CLARO });
31
+ WG.texto(M, pg, "icone microfone", "\uE720", { x: 440, y: 62, fonte: FI, tam: 26, cor: CLARO });
32
+ WG.texto(M, pg, "icone lente", "\uE722", { x: 504, y: 62, fonte: FI, tam: 26, cor: CLARO });
33
+ WG.texto(M, pg, "icone buscar", "\uE721", { x: 568, y: 62, fonte: FI, tam: 26, cor: CLARO });
34
+ WG.texto(M, pg, "icone compartilhar", "\uE72D", { x: 897, y: 55, fonte: FI, tam: 28, cor: CLARO });
35
+ WG.texto(M, pg, "icone apps", "\uE8A9", { x: 972, y: 54, fonte: FI, tam: 28, cor: CLARO });
36
+ WG.imagem(M, pg, "avatar conta (seu.perfil)", "assets/comum/avatar-seu.png", { x: 1040, y: 13, w: 44, h: 44, circulo: true, fy: 0.3 });
37
+ // título digitado
38
+ var sI1 = WG.LETRA("I1"); // letra: título da busca de imagens (digitado 22,60–23,40)
39
+ var tit = WG.texto(M, pg, "titulo digitado (letra I1)", sI1.texto, { x: 412, y: 212, fonte: FG, tam: 52, cor: TXT });
40
+ WG.DIGITAR(tit, sI1.palavras, WG.tempoDig("I1", sI1), WG.DIG.I1.fim, { cursor: true, cursorFica: 0.3 });
41
+ pontos3(M, pg, "titulo menu", 1015, 190, 2.6, CLARO);
42
+ // grade de imagens (célula 1 = encaixe H)
43
+ var cel = [WG.I_CEL.c2, WG.I_CEL.c3, WG.I_CEL.c4];
44
+ for (var i = 0; i < 3; i++) WG.imagem(M, pg, "grade celula " + (i + 2), WG.I_IMGS[i + 1], { x: cel[i][0], y: cel[i][1], w: cel[i][2], h: cel[i][3], r: 6, fy: (i == 1) ? 0.45 : 0.5 });
45
+ WG.forma(M, pg, "grade icone imagem", { x: 960, y: 592, w: 26, h: 22, r: 4, traco: "#FFFFFF", tracoL: 2.2 });
46
+ // descrição + fonte
47
+ var desc = ["An October sunset sky turns orange and red when the low", "sun shines through a thicker layer of air. Blue light scatters",
48
+ "away along the path, so mostly the warm colors reach the", "eye, especially after dry and clear autumn days."];
49
+ for (i = 0; i < desc.length; i++) WG.texto(M, pg, "descricao linha " + (i + 1), desc[i], { x: 412, y: 705 + 37 * i, fonte: FG, tam: 22, cor: TXT });
50
+ var f1 = WG.texto(M, pg, "fonte rotulo", "Source:", { x: 412, y: 920, fonte: FG, tam: 21, cor: CINZA });
51
+ WG.texto(M, pg, "fonte wikipedia", "Wikipedia", { x: 412 + largura(f1) + 7, y: 920, fonte: FG, tam: 21, cor: LINK });
52
+ WG.forma(M, pg, "proxima data (pilula)", { x: 412, y: 998, w: 620, h: 77, r: 20, cor: PILL });
53
+ WG.texto(M, pg, "proxima data rotulo", "Next date", { x: 432, y: 1043, fonte: FG, tam: 21, cor: CINZA });
54
+ WG.texto(M, pg, "proxima data valor", "Sat, Oct 24, 2026 – Sun, Oct 25, 2026", { x: 1010, y: 1045, fonte: FG, tam: 22, cor: TXT, just: "D" });
55
+ // coluna da esquerda (outros resultados, cortados)
56
+ WG.texto(M, pg, "esq credito 1", "Camera: Leo Prado / Studio Quadro ·", { x: 255, y: 307, fonte: FG, tam: 22, cor: CLARO, just: "D" });
57
+ WG.texto(M, pg, "esq credito 2", "Tech assistant: ...", { x: 160, y: 345, fonte: FG, tam: 22, cor: CLARO, just: "D" });
58
+ var ys = [505, 592, 678, 765];
59
+ for (i = 0; i < 4; i++) {
60
+ WG.forma(M, pg, "pergunta seta fundo " + (i + 1), { x: 237, y: ys[i] - 21, w: 42, h: 42, elipse: true, cor: "#2A2C31" });
61
+ WG.texto(M, pg, "pergunta seta " + (i + 1), "\uE70D", { x: 258, y: ys[i] + 7, fonte: FI, tam: 16, cor: CLARO, just: "C" });
62
+ if (i < 3) WG.forma(M, pg, "pergunta linha " + (i + 1), { x: -400, y: ys[i] + 42, w: 690, h: 1.5, cor: LINHA });
63
+ }
64
+ WG.texto(M, pg, "esq pesquisa relacionada", "red sky or orange sky", { x: 227, y: 1022, fonte: FGM, tam: 22, cor: TXT, just: "D" });
65
+ WG.forma(M, pg, "divisoria vertical", { x: 379, y: 255, w: 1.5, h: 1400, cor: LINHA });
66
+
67
+ // encaixe H na célula 1 (enche a tela na troca)
68
+ var c0 = WG.camEm(cam, TS), provH = WG.provisoria("ENCAIXE H-mapa");
69
+ var lado0 = 1080 / Math.pow(2, c0.z);
70
+ var encH = WG.CAMERA_encaixe(M, cam, provH, [c0.mx, c0.my], lado0, -c0.g, "ENCAIXE H-mapa");
71
+ encH.motionBlur = true;
72
+
73
+ // =================== resultado de vídeo (escala do quadro de referência 24,58) ===================
74
+ var vid = [];
75
+ function v(L) { vid.push(L); return L; }
76
+ var fundoJ = WG.forma(M, cam, "FUNDO J provisorio (papel bege; desligar na montagem)", { x: -600, y: -600, w: 2300, h: 2300, cor: "#DCD1C3" });
77
+ fundoJ.inPoint = 24.30;
78
+ var vbg = v(WG.forma(M, cam, "video fundo", { x: -250, y: -250, w: 1360, h: 1500, cor: BG }));
79
+ v(WG.texto(M, cam, "video logo Google", "Google", { x: -88, y: 93, fonte: FGM, tam: 56, cor: "#FFFFFF", track: -12 }));
80
+ var vp = v(WG.forma(M, cam, "video busca (pilula)", { x: 222, y: -60, w: 1100, h: 225, r: 75, cor: "#38363A" }));
81
+ WG.tr(vp).property("ADBE Rotate Z").setValue(2.2);
82
+ v(WG.texto(M, cam, "video busca texto", sI1.texto.toLowerCase(), { x: 283, y: 103, fonte: FG, tam: 44, cor: TXT }));
83
+ v(WG.texto(M, cam, "video canal", "YouTube · Studio Quadro", { x: -40, y: 307, fonte: FGM, tam: 32, cor: "#E3E3E3" }));
84
+ v(WG.texto(M, cam, "video views", "1.2M views · 2 days ago", { x: -32, y: 357, fonte: FG, tam: 28, cor: CLARO }));
85
+ var vm = pontos3(M, cam, "video menu", 848, 368, 3.2, CLARO);
86
+ // título = letra I2; as 4 últimas palavras grifam em azul nos tempos do slot (a 4ª já com a cena dentro de J)
87
+ var sI2 = WG.LETRA("I2"), TIT = sI2.texto, tx = -40, tyB = 455, tam = 50;
88
+ var pw = sI2.palavras, nW = pw.length, nG = Math.min(4, nW), iG = nW - nG;
89
+ var tW = []; for (i = 0; i < nG; i++) tW.push(sI2.preenchido ? sI2.tempos[iG + i] : sI2.tempos[i]); // com a letra colada, cada palavra tem o seu tempo
90
+ var cortes = []; // prefixo antes do grifo + prefixos que terminam em cada palavra grifada
91
+ cortes.push(pw.slice(0, iG).join(" "));
92
+ for (i = 1; i <= nG; i++) cortes.push(pw.slice(0, iG + i).join(" "));
93
+ var lx = [];
94
+ for (i = 0; i < cortes.length; i++) {
95
+ if (cortes[i] === "") { lx.push(0); continue; }
96
+ var tmp = WG.texto(M, null, "tmp", cortes[i], { x: 0, y: 0, fonte: FG, tam: tam, cor: "#FFFFFF" }); lx.push(largura(tmp)); tmp.remove();
97
+ }
98
+ var x0 = (iG > 0) ? lx[0] + tam * 0.27 : 0; // sourceRect ignora o espaço final
99
+ tx = 298 - x0; // como no original: o grifo começa em x≈290 e o começo do título fica cortado à esquerda
100
+ var gx0 = tx + x0 - 8;
101
+ var gr = v(WG.forma(M, cam, "video grifo azul", { x: gx0, y: tyB - 48, w: 10, h: 60, cor: "#2B2FE3" }));
102
+ var gsz = WG.rectProp(gr, "ADBE Vector Rect Size"), gps = WG.rectProp(gr, "ADBE Vector Rect Position");
103
+ var kw = [[tW[0] - 0.08, 0]];
104
+ for (i = 0; i < nG; i++) { kw.push([tW[i], (i == 0 ? 0 : lx[i] - x0 + 16)]); kw.push([tW[i] + 0.08, lx[i + 1] - x0 + 16]); }
105
+ var ksz = [], kps = [];
106
+ for (i = 0; i < kw.length; i++) { ksz.push([kw[i][0], [Math.max(kw[i][1], 0.1), 60]]); kps.push([kw[i][0], [Math.max(kw[i][1], 0.1) / 2 - 5, 0]]); }
107
+ WG.chaves(gsz, ksz, 40, true); WG.chaves(gps, kps, 40, true);
108
+ WG.tr(gr).property("ADBE Position").setValue([gx0 + 5, tyB - 18]);
109
+ var tAz = v(WG.texto(M, cam, "video titulo (azul claro)", TIT, { x: tx, y: tyB, fonte: FG, tam: tam, cor: "#9DBDF5" }));
110
+ var tBr = WG.texto(M, cam, "video titulo (branco no grifo)", TIT, { x: tx, y: tyB, fonte: FG, tam: tam, cor: "#FFFFFF" });
111
+ var grM = WG.forma(M, cam, "video grifo (matte do branco)", { x: gx0, y: tyB - 48, w: 10, h: 60, cor: "#FFFFFF" });
112
+ WG.chaves(WG.rectProp(grM, "ADBE Vector Rect Size"), ksz, 40, true); WG.chaves(WG.rectProp(grM, "ADBE Vector Rect Position"), kps, 40, true);
113
+ WG.tr(grM).property("ADBE Position").setValue([gx0 + 5, tyB - 18]);
114
+ tBr.setTrackMatte(grM, TrackMatteType.ALPHA); grM.enabled = false; // fica dentro do recorte, não precisa do matte da página
115
+ v(WG.texto(M, cam, "video creditos 1", "Studio Quadro · Director: Ana Lima · Producer: Caio Reis · Color: Lia Santos", { x: -30, y: 527, fonte: FG, tam: 32, cor: CLARO }));
116
+ v(WG.texto(M, cam, "video creditos 2", "Motion: Bia Torres · Sound: Davi Melo · Editor: Rui Alves · Art: Nina Rocha", { x: -40, y: 590, fonte: FG, tam: 32, cor: CLARO }));
117
+ v(WG.texto(M, cam, "video pessoas perguntam", "People also ask", { x: -310, y: 755, fonte: FGM, tam: 44, cor: TXT }));
118
+ v(WG.texto(M, cam, "video pergunta 1", "Why is the sky orange at sunset?", { x: -330, y: 893, fonte: FG, tam: 40, cor: TXT }));
119
+ v(WG.forma(M, cam, "video pergunta linha", { x: -250, y: 955, w: 1400, h: 2, cor: LINHA }));
120
+ v(WG.texto(M, cam, "video pergunta 2", "What makes an October sky so red?", { x: -300, y: 1040, fonte: FG, tam: 40, cor: TXT }));
121
+ // recorte arredondado da página no fim (vira a figura do jornal J)
122
+ var rec = WG.forma(M, cam, "RECORTE pagina video (matte)", { x: -1500, y: -1500, w: 4000, h: 4000, cor: "#FFFFFF" });
123
+ WG.chaves(WG.tr(rec).property("ADBE Position"), [[24.30, [500, 500]], [24.40, [531.5, 548.5]]], 60);
124
+ WG.chaves(WG.rectProp(rec, "ADBE Vector Rect Size"), [[24.30, [4000, 4000]], [24.40, [1003, 1003]]], 60);
125
+ WG.chaves(WG.rectProp(rec, "ADBE Vector Rect Roundness"), [[24.30, 0], [24.40, 10]], 60);
126
+ for (i = 0; i < vid.length; i++) vid[i].setTrackMatte(rec, TrackMatteType.ALPHA);
127
+ rec.enabled = false;
128
+ // o bloco do vídeo só existe à esquerda da página grande: some antes do chicote mostrar o meio
129
+ var cena = WG.cena(ID, M, C.d, pasta);
130
+ WG.limparSolidos();
131
+ return "ok I: " + M.numLayers + " camadas; encaixe H lado " + lado0.toFixed(1) + " centro " + c0.mx.toFixed(1) + "," + c0.my.toFixed(1) + " giro " + (-c0.g).toFixed(2) + "; grifo de x " + gx0.toFixed(0);
132
+ })();
@@ -0,0 +1,191 @@
1
+ // =====================================================================
2
+ // CENA J-jornal2 (24,62–28,00 s, ref 27,90) — jornal antigo "THE DAILY HERALD" em 3D sobre a mesa clara.
3
+ // Interface em inglês como o original (17/10); manchete = letra, lida de ae/letra.json (slot J1; vazio = "reserva").
4
+ // Gera a comp "CENA J-jornal2" (1080x1080, 24 qps, 814 quadros, tempo interno = tempo do vídeo).
5
+ // Rodar num eval.run só, com a comp fechada: $.evalFile(File.decode(".../ae/J-jornal2.jsx"))
6
+ //
7
+ // Rig: ver ae/jornal-comum.jsx (câmera padrão + null 3D PLANO medido no original + mesa 2D).
8
+ // Mundo (unidades do plano; 1 un. = 1 px na troca, quando a câmera está ~20x dentro da figura):
9
+ // página x -5200..7350, y -12320..5350 (PNG 5020x7068 = 0,4 px/un., escala 250%)
10
+ // figura pequena (encaixe I) x -605..652, y -545..711; na troca (24,62) o encaixe é o quadrado
11
+ // lado 1064,9 em (-1,4; -4,9), giro -0,32°, e cresce até a figura em 24,745.
12
+ // manchete: linha 1 base -8650 (maiúscula 1650), linha 2 base -7320 (maiúscula ~870), x -4650.
13
+ // queima: nasce entre os olhos (~750; -3900) em 25,0 e cresce até cobrir o olho esquerdo e a linha 2.
14
+ // =====================================================================
15
+ (function () {
16
+ var JP = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
17
+ $.evalFile(File(JP + "ae/jornal-comum.jsx"));
18
+ $.evalFile(File(JP + "ae/digitar.jsx"));
19
+ $.evalFile(File(JP + "ae/letra.jsx"));
20
+ var D = J_lerJSON(JP + "ae/J-jornal2-dados.json");
21
+ var A = JP + "assets/J-jornal2/";
22
+ var fold = J_pasta("J-jornal2");
23
+ var foldA = J_pasta("J-jornal2 assets", fold);
24
+
25
+ var imgPg = J_importar(A + "pagina.png", foldA); try { imgPg.mainSource.reload(); } catch (e) {}
26
+ var imgMesa = J_importar(A + "mesa-clara.png", foldA);
27
+ var encI = null;
28
+ for (var i = 1; i <= app.project.numItems; i++) { var it = app.project.item(i); if (it instanceof CompItem && it.name == "ENCAIXE I-imagens") encI = it; }
29
+ if (!encI) encI = J_encaixeProvisorio("ENCAIXE I-imagens", fold);
30
+
31
+ // ---------------- queima (pré-comp em unidades do plano x 0,15) ----------------
32
+ // Medido no original desentortado (camera/: pixels alaranjados por quadro levados ao plano):
33
+ // 25,04 s mancha estreita entre os olhos (x 790..1270, y -4410..-3050); 25,54 s x -750..1540, y -5810..-3090;
34
+ // o topo sobe até -6730 em 26,17; chamas a partir de ~26,3; com as chamas o laranja chega a y -10600 em 27,5
35
+ // (cobre a manchete); no fim o furo escuro ocupa x -3300..1300, y -6650..-2300.
36
+ var QK = 0.15, QX0 = -6500, QY0 = -12000, QW = 10500, QH = 12000; // cobre x -6500..4000, y -12000..0
37
+ function qx(X) { return (X - QX0) * QK; } function qy(Y) { return (Y - QY0) * QK; }
38
+ var formaC = J_comp("J queima forma", Math.round(QW * QK), Math.round(QH * QK), foldA);
39
+ function ultimo(L) { var ep = L.property("ADBE Effect Parade"); return ep.property(ep.numProperties); }
40
+ function efeito(L, mn) { L.property("ADBE Effect Parade").addProperty(mn); return ultimo(L); }
41
+ function elipse(comp, nome, chaves, cor, traco) {
42
+ var L = comp.layers.addShape(); L.name = nome;
43
+ var g = L.property("ADBE Root Vectors Group");
44
+ g.addProperty("ADBE Vector Shape - Ellipse");
45
+ g.addProperty("ADBE Vector Graphic - Fill");
46
+ if (traco) g.addProperty("ADBE Vector Graphic - Stroke");
47
+ g = L.property("ADBE Root Vectors Group");
48
+ g.property(2).property("ADBE Vector Fill Color").setValue(cor || [1, 1, 1]);
49
+ if (traco) { g.property(3).property("ADBE Vector Stroke Color").setValue(traco[0]); g.property(3).property("ADBE Vector Stroke Width").setValue(traco[1]); }
50
+ var el = g.property(1), ts = [], sz = [], ps = [];
51
+ for (var k = 0; k < chaves.length; k++) { var c = chaves[k]; ts.push(c[0]); ps.push([qx(c[1]), qy(c[2])]); sz.push([Math.max(0.1, 2 * c[3] * QK), Math.max(0.1, 2 * c[4] * QK)]); }
52
+ el.property("ADBE Vector Ellipse Size").setValuesAtTimes(ts, sz);
53
+ el.property("ADBE Vector Ellipse Position").setValuesAtTimes(ts, ps);
54
+ J_tr(L).property("ADBE Position").setValue([0, 0]); J_tr(L).property("ADBE Anchor Point").setValue([0, 0]);
55
+ return L;
56
+ }
57
+ function turb(L, amt, size, cx, seed, vel) {
58
+ var t = efeito(L, "ADBE Turbulent Displace");
59
+ t.property(2).setValue(amt); t.property(3).setValue(size); t.property(5).setValue(cx); t.property(10).setValue(seed || 0);
60
+ t.property(6).expression = "time * " + (vel || 120);
61
+ return t;
62
+ }
63
+ function desfoque(L, r) { var gb = efeito(L, "ADBE Gaussian Blur 2"); gb.property(1).setValue(r); gb.property(3).setValue(0); return gb; }
64
+ // [t, centro X, centro Y, raio X, raio Y] em unidades do plano
65
+ // (x das primeiras chaves puxado para o canto de dentro do olho esquerdo da nossa foto, x -335: o original nasce colado no olho)
66
+ var CARVAO = [[24.98, -120, -3700, 0, 0], [25.04, -120, -3700, 245, 680], [25.17, 0, -3800, 300, 790], [25.29, -200, -4160, 630, 1000],
67
+ [25.42, -400, -4360, 1010, 1200], [25.54, -400, -4450, 1145, 1360], [25.79, -450, -4600, 1350, 1630], [26.04, -500, -4750, 1550, 1870],
68
+ [26.29, -500, -4850, 1800, 2100], [26.54, -600, -4900, 2100, 2400], [26.92, -800, -4950, 2500, 2850], [27.17, -1000, -4950, 2850, 3150],
69
+ [27.54, -1300, -4900, 3250, 3600], [27.92, -1400, -4850, 3400, 3850], [28.2, -1420, -4840, 3480, 3920]];
70
+ var FURO = [[26.9, -900, -4600, 0, 0], [27.17, -950, -4550, 1100, 1000], [27.42, -1000, -4500, 1800, 1700], [27.92, -1000, -4475, 2300, 2175], [28.2, -1000, -4470, 2380, 2250]];
71
+ var eC = elipse(formaC, "carvão", CARVAO);
72
+ turb(eC, 48, 60, 4, 3, 90); turb(eC, 14, 14, 2, 5, 160);
73
+
74
+ var queima = J_comp("J queima", Math.round(QW * QK), Math.round(QH * QK), foldA);
75
+ var queimaM = J_comp("J queima mult", Math.round(QW * QK), Math.round(QH * QK), foldA);
76
+ function camadaForma(nome, cor, maxRaio, blur, opac, modo, alvo) {
77
+ var L = (alvo || queima).layers.add(formaC); L.name = nome;
78
+ if (maxRaio) { var mm = efeito(L, "ADBE Minimax"); mm.property(1).setValue(2); mm.property(2).setValue(maxRaio); mm.property(3).setValue(1); }
79
+ var fl = efeito(L, "ADBE Fill"); fl.property(3).setValue(cor);
80
+ if (blur) desfoque(L, blur);
81
+ L.opacity.setValue(opac == null ? 100 : opac);
82
+ if (modo) L.blendingMode = modo;
83
+ return L;
84
+ }
85
+ // papel tostado em volta (escurece o papel, não pinta por cima)
86
+ var halo = camadaForma("tostado (halo)", [0.66, 0.44, 0.24], 40, 38, 85, null, queimaM);
87
+ // brasa na borda (laranja fino com brilho), entra quando a queima começa a pegar fogo
88
+ var brasa = camadaForma("brasa (borda)", [0.95, 0.33, 0.05], 3, 3, 100);
89
+ var gl = efeito(brasa, "ADBE Glo2"); gl.property(2).setValue(120); gl.property(3).setValue(14); gl.property(4).setValue(0.6);
90
+ brasa.opacity.setValuesAtTimes([25.6, 26.2], [25, 100]);
91
+ var recorte = queima.layers.add(formaC); recorte.name = "recorte do aro"; recorte.moveBefore(brasa);
92
+ try { brasa.setTrackMatte(recorte, TrackMatteType.ALPHA_INVERTED); recorte.enabled = false; } catch (e) { brasa.trackMatteType = TrackMatteType.ALPHA_INVERTED; }
93
+ // carvão: marrom médio no começo (mancha), escurece quando queima de verdade
94
+ var carv = camadaForma("carvão", [0.45, 0.22, 0.1], 0, 7, 100, null, queimaM);
95
+ var fillC = carv.property("ADBE Effect Parade").property("ADBE Fill").property(3);
96
+ fillC.setValuesAtTimes([25.0, 26.3, 27.3], [[0.4, 0.18, 0.08, 1], [0.24, 0.1, 0.04, 1], [0.17, 0.075, 0.03, 1]]);
97
+ // furo escuro com aro de brasa
98
+ var eFb = elipse(queima, "furo (brilho laranja)", FURO, [1, 0.42, 0.08]);
99
+ turb(eFb, 42, 50, 4, 9, 100);
100
+ var mmF = efeito(eFb, "ADBE Minimax"); mmF.property(1).setValue(2); mmF.property(2).setValue(7); mmF.property(3).setValue(1);
101
+ desfoque(eFb, 14); eFb.opacity.setValue(55);
102
+ var eF = elipse(queima, "furo", FURO, [0.05, 0.025, 0.015]);
103
+ turb(eF, 42, 50, 4, 9, 100); desfoque(eF, 5);
104
+ // chamas: línguas translúcidas que sobem da borda de cima (26,25 em diante), presas ao topo do carvão
105
+ function chama(nome, fx, larg, alt, atraso, seed, cor, opac, modo, alvo) {
106
+ var L = (alvo || queima).layers.addShape(); L.name = nome;
107
+ var g = L.property("ADBE Root Vectors Group");
108
+ g.addProperty("ADBE Vector Shape - Ellipse"); g.addProperty("ADBE Vector Graphic - Fill");
109
+ g = L.property("ADBE Root Vectors Group");
110
+ g.property(1).property("ADBE Vector Ellipse Size").setValue([larg * QK, alt * QK]);
111
+ g.property(2).property("ADBE Vector Fill Color").setValue(cor);
112
+ J_tr(L).property("ADBE Anchor Point").setValue([0, alt * QK * 0.5]); // base da chama
113
+ J_tr(L).property("ADBE Position").expression =
114
+ 'var e = comp("J queima forma").layer("carv\\u00e3o").content(1);\n' +
115
+ 'var p = e.position, s = e.size;\n' +
116
+ '[p[0] + ' + fx + ' * s[0] * 0.5, p[1] - s[1] * 0.40]';
117
+ J_tr(L).property("ADBE Scale").expression =
118
+ 'var cres = linear(time, ' + (26.35 + atraso) + ', ' + (27.45 + atraso) + ', 15, 100);\n' +
119
+ '[cres * (1 + 0.08 * Math.sin(time * 7 + ' + seed + ')), cres * (1 + 0.16 * Math.sin(time * 9.3 + ' + seed + '))]';
120
+ J_tr(L).property("ADBE Opacity").expression =
121
+ 'linear(time, ' + (26.35 + atraso) + ', ' + (26.7 + atraso) + ', 0, 1) * ' + opac + ' * (0.8 + 0.2 * noise(time * 5 + ' + seed + '))';
122
+ turb(L, 110, 55, 4, seed, 320);
123
+ desfoque(L, 26);
124
+ if (modo) L.blendingMode = modo;
125
+ return L;
126
+ }
127
+ chama("chama 1", -0.55, 2000, 4200, 0.05, 1, [1, 0.52, 0.22], 90, null, queimaM);
128
+ chama("chama 2", -0.1, 2600, 5200, 0.00, 2, [1, 0.55, 0.24], 95, null, queimaM);
129
+ chama("chama 3", 0.42, 1700, 3600, 0.20, 3, [1, 0.5, 0.2], 85, null, queimaM);
130
+ chama("miolo 2", -0.08, 1100, 2600, 0.10, 4, [1, 0.62, 0.25], 30);
131
+ chama("miolo 1", -0.5, 800, 2000, 0.30, 5, [1, 0.6, 0.22], 26);
132
+ var glq = queima.layers.addSolid([0, 0, 0], "brilho geral", queima.width, queima.height, 1, queima.duration); glq.adjustmentLayer = true;
133
+ var g2 = efeito(glq, "ADBE Glo2"); g2.property(2).setValue(185); g2.property(3).setValue(30); g2.property(4).setValue(0.45);
134
+
135
+ // ---------------- comp da cena ----------------
136
+ var comp = J_comp("CENA J-jornal2", 1080, 1080, fold);
137
+ comp.bgColor = [0.55, 0.43, 0.31];
138
+ comp.motionBlur = true; comp.shutterAngle = 90; comp.shutterPhase = -45;
139
+ comp.motionBlurSamplesPerFrame = 16; comp.motionBlurAdaptiveSampleLimit = 128;
140
+ comp.workAreaStart = 24.58; comp.workAreaDuration = 28.04 - 24.58;
141
+
142
+ var fundo = comp.layers.addSolid([0.55, 0.43, 0.31], "FUNDO", 1080, 1080, 1, comp.duration);
143
+ var mesa = J_mesa(comp, D, imgMesa, [-420, -420, 1500, 1500], foldA, "J mesa textura", 2, 35);
144
+ var plano = J_plano(comp, D);
145
+ // sombra da página
146
+ // (sólido em 1/20 da resolução, escala 2000%: sólido gigante com desfoque trava o render)
147
+ var sombra = comp.layers.addSolid([0, 0, 0], "SOMBRA página", 640, 895, 1, comp.duration);
148
+ J_filho(sombra, plano, [320, 447.5], [(-5200 + 7350) / 2 + 160, (-12320 + 5350) / 2 + 260, 6], 2000, 0);
149
+ sombra.opacity.setValue(45);
150
+ var bb = sombra.property("ADBE Effect Parade").addProperty("ADBE Box Blur2"); bb = sombra.property("ADBE Effect Parade").property(1); bb.property(1).setValue(7); bb.property(2).setValue(3);
151
+ // página
152
+ var pg = comp.layers.add(imgPg); pg.name = "PÁGINA (Gazeta)"; J_filho(pg, plano, [0, 0], [-5200, -12320, 0], 250, 0);
153
+ // encaixe I: enche a tela na troca e cresce até a figura da página
154
+ var E = D.encaixe, troca = D.troca;
155
+ var LE = comp.layers.add(encI); LE.name = "ENCAIXE I-imagens (provisório)";
156
+ J_filho(LE, plano, [540, 540], [E.centro[0], E.centro[1], -1.2], 100 * E.lado / 1080, E.giro);
157
+ var tE = J_tr(LE);
158
+ var fig = [-605, -545, 652, 711], fc = [(fig[0] + fig[2]) / 2, (fig[1] + fig[3]) / 2], fl = Math.min(fig[2] - fig[0], fig[3] - fig[1]);
159
+ var t1 = troca + 0.125;
160
+ tE.property("ADBE Position").setValuesAtTimes([troca, t1], [[E.centro[0], E.centro[1], -1.2], [fc[0], fc[1], -1.2]]);
161
+ tE.property("ADBE Scale").setValuesAtTimes([troca, t1], [[100 * E.lado / 1080, 100 * E.lado / 1080, 100], [100 * fl / 1080, 100 * fl / 1080, 100]]);
162
+ tE.property("ADBE Rotate Z").setValuesAtTimes([troca, t1], [E.giro, 0]);
163
+ var eo = new KeyframeEase(0, 33), ei = new KeyframeEase(0, 75);
164
+ tE.property("ADBE Position").setTemporalEaseAtKey(1, [eo], [eo]); tE.property("ADBE Position").setTemporalEaseAtKey(2, [ei], [ei]);
165
+ tE.property("ADBE Scale").setTemporalEaseAtKey(1, [eo, eo, eo], [eo, eo, eo]); tE.property("ADBE Scale").setTemporalEaseAtKey(2, [ei, ei, ei], [ei, ei, ei]);
166
+ tE.property("ADBE Rotate Z").setTemporalEaseAtKey(1, [eo], [eo]); tE.property("ADBE Rotate Z").setTemporalEaseAtKey(2, [ei], [ei]);
167
+
168
+ // manchete digitada (letra, slot J1) em 2 linhas como o original: metade das palavras em cada linha
169
+ // linha 1: maiúscula 1650, largura 10600, base -8650; linha 2: maiúscula 870, largura 6600, base -7320 (x -4650)
170
+ var FONTE = "NotoSerifDisplay-ExtraCondensedBold";
171
+ var sl = LETRA("J1"), np = sl.palavras.length, n1 = Math.ceil(np / 2);
172
+ var tj = J_tempos(sl.tempos, 0, 25.38, 28.2); // original: 1ª palavra visível em 25,5; ainda digitando em 27,92
173
+ var w1 = sl.palavras.slice(0, n1), w2 = sl.palavras.slice(n1);
174
+ var m1 = J_manchete(comp, plano, "MANCHETE linha 1 (J1)", w1.join(" "), FONTE, -4650, -8650, 1650, 10600, 45, [0.06, 0.05, 0.045]);
175
+ DIGITAR(m1.layer, w1, tj.slice(0, n1), w2.length ? tj[n1] : 28.2, { cursor: true, cursorFica: w2.length ? 0 : 0.25 });
176
+ var m2 = null;
177
+ if (w2.length) {
178
+ m2 = J_manchete(comp, plano, "MANCHETE linha 2 (J1)", w2.join(" "), FONTE, -4650, -7320, 870, 6600, 45, [0.06, 0.05, 0.045]);
179
+ DIGITAR(m2.layer, w2, tj.slice(n1), 28.2, { cursor: true, cursorFica: 0.25 });
180
+ }
181
+
182
+ // queima por cima de tudo (no plano)
183
+ var LQM = comp.layers.add(queimaM); LQM.name = "QUEIMA (multiplicar)";
184
+ J_filho(LQM, plano, [0, 0], [QX0, QY0, -3], 100 / QK, 0); LQM.blendingMode = BlendingMode.MULTIPLY;
185
+ var LQ = comp.layers.add(queima); LQ.name = "QUEIMA";
186
+ J_filho(LQ, plano, [0, 0], [QX0, QY0, -3.5], 100 / QK, 0);
187
+
188
+ plano.moveToBeginning();
189
+ J_limpaSolidos();
190
+ return "ok CENA J-jornal2 | J1 '" + sl.texto + "' " + (sl.preenchido ? "(letra)" : "(reserva)") + " | linha 1 corpo/hs " + m1.corpo.toFixed(0) + "/" + m1.hs.toFixed(0) + (m2 ? " | linha 2 " + m2.corpo.toFixed(0) + "/" + m2.hs.toFixed(0) : "");
191
+ })();