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,733 @@
1
+ /* cenas.jsx — recriação do edit "how it started vs how its going" do @illdari (16, DcgUeIEMfX3)
2
+ -------------------------------------------------------------------------------------------
3
+ Monta do zero, num projeto novo, a comp RECRIACAO (1080×1080, 30 qps, 28,17 s). Formato "antes × agora":
4
+
5
+ 0,00–5,47 ANTES motion "de iniciante" de propósito: tudo linear, sem desfoque, canto reto. O avião sai
6
+ do ícone e dá uma volta inteira; selo vermelho; barra branca estica; o ícone atravessa
7
+ e troca a frase; a barra achata. Meio segundo de tela vazia antes do drop.
8
+ 5,50 DROP corte seco: ícone do After Effects gigante e borrado pousa; grade de ícones Adobe;
9
+ painel de arquivos; aviso de travamento; "Obter info"; clique; notificação de RAM.
10
+ 9,75–13,55 MÚSICA trecho estilo Spotify (nosso, simplificado): logo, título, artistas, página, item.
11
+ 13,55–14,3 ZOOM barras azuis viram um cartão que gira e cresce até o miolo virar a cena nova.
12
+ 14,3–17,3 3D galeria escura; iPhone dourado entra girando; câmera corre; MacBook em perspectiva.
13
+ 16,8–19,3 FITA fita azul atravessa, aplaina com o texto correndo, vira pílula → círculo → check.
14
+ 19,33–28,2 NAVEGADOR íris de 3 q abre o desktop; barra lateral rosa: favoritos, pastas, cliques, arrastar.
15
+
16
+ COMO USAR
17
+ - Troque os textos no bloco TEXTOS. File > Scripts > Run Script File… e escolha este arquivo: cria o projeto,
18
+ salva em ae/trust-process.aep e grava os eventos de som em audio/eventos.json.
19
+ - Mockups 3D (iPhone e MacBook) são camadas 3D do AE: tela (precomp) + moldura + 8 cópias para a espessura.
20
+ Para um mockup mais fiel, troque por um render .glb (ver README do projeto).
21
+ */
22
+ (function () {
23
+
24
+ // ================================================================ TEXTOS (trocáveis)
25
+ var TEXTOS = {
26
+ tituloAntes: 'como começou vs :', tituloDepois: 'como está indo',
27
+ frase1: 'Me chama quando quiser', frase2: 'Pode deixar :)',
28
+ rotuloAe: 'After Effects',
29
+ arquivos: [['projeto-final', '15MB'], ['abertura', '12MB'], ['marca', '2MB'], ['saas', '15MB']],
30
+ tituloArquivos: 'Arquivos do projeto',
31
+ alerta1: 'After Effects travou', alerta2: 'Precisa de mais memória.',
32
+ info: 'Obter info',
33
+ ram1: 'Mais memória', ram2: '16 GB', ram3: 'agora o After Effects respira',
34
+ musica: 'Puro Movimento',
35
+ somGlobal: 'Som Global', artistas: [['Você', 'Criador'], ['Marina', 'Cantora'], ['Léo', 'Produtor']],
36
+ imersao: 'Imersão Global', paragrafo: 'Mergulhe numa paisagem sonora sem limites,\ronde cada camada do seu som favorito\rganha vida e lugar.',
37
+ botao: 'Ir além', faixa: 'Luzes Piscando', faixaSub: 'Single',
38
+ app: 'Clube', iphone1: 'Puxe sua', iphone2: 'inspiração', abrir: 'Abrir o Clube', fechar: 'Fechar',
39
+ mac1: 'Dentro do seu', mac2: 'fluxo',
40
+ fita: 'Salvando sua ideia', feito: 'Feito',
41
+ espaco: 'Clube', pastas: ['Trabalho', 'Entretenimento', 'Redes sociais'], filhos: ['Pinterest', 'Figma', 'Gmail'],
42
+ novaAba: 'Nova aba', insta: 'Instagram', lateral: ['Favoritos', 'Pastas', 'Espaços']
43
+ };
44
+
45
+ // ================================================================ pastas
46
+ var BASE = (typeof RECR_BASE !== 'undefined') ? new Folder(RECR_BASE) : File($.fileName).parent.parent;
47
+ var ASSETS = BASE.fsName + '/assets/';
48
+ var ICON = ASSETS + 'icones/';
49
+ var W = 1080, H = 1080, FPS = 30, DUR = 845 / 30;
50
+ function F(f) { return f / FPS; }
51
+
52
+ // ================================================================ ajudantes
53
+ function rgb(h) { h = h.replace('#', ''); return [parseInt(h.substr(0, 2), 16) / 255, parseInt(h.substr(2, 2), 16) / 255, parseInt(h.substr(4, 2), 16) / 255]; }
54
+ function nEase(p) {
55
+ var t = p.propertyValueType;
56
+ if (t == PropertyValueType.TwoD) return 2;
57
+ if (t == PropertyValueType.ThreeD) return 3;
58
+ return 1;
59
+ }
60
+ // K(prop, [[t, valor, influênciaEntrada, influênciaSaída], …]); influência -1 = linear; padrão 33
61
+ function K(p, arr) {
62
+ var i, k, e, n = nEase(p);
63
+ for (i = 0; i < arr.length; i++) arr[i][0] = Math.round(arr[i][0] * FPS) / FPS; // chaves na grade de quadros
64
+ for (i = 0; i < arr.length; i++) p.setValueAtTime(arr[i][0], arr[i][1]);
65
+ for (i = 0; i < arr.length; i++) {
66
+ k = p.nearestKeyIndex(arr[i][0]);
67
+ var ei = arr[i].length > 2 ? arr[i][2] : 33, eo = arr[i].length > 3 ? arr[i][3] : ei;
68
+ if (ei === 'a') { // 'a' = curva automática contínua (velocidade sem degrau)
69
+ p.setTemporalContinuousAtKey(k, true); p.setTemporalAutoBezierAtKey(k, true);
70
+ if (p.isSpatial && p.matchName == 'ADBE Position') { p.setSpatialAutoBezierAtKey(k, false); p.setSpatialContinuousAtKey(k, false); }
71
+ continue;
72
+ }
73
+ var ie = [], oe = [];
74
+ for (e = 0; e < n; e++) { ie.push(new KeyframeEase(0, Math.max(0.1, ei))); oe.push(new KeyframeEase(0, Math.max(0.1, eo))); }
75
+ p.setTemporalEaseAtKey(k, ie, oe);
76
+ if (ei < 0 || eo < 0) p.setInterpolationTypeAtKey(k, ei < 0 ? KeyframeInterpolationType.LINEAR : KeyframeInterpolationType.BEZIER, eo < 0 ? KeyframeInterpolationType.LINEAR : KeyframeInterpolationType.BEZIER);
77
+ if (p.isSpatial && p.matchName == 'ADBE Position') {
78
+ p.setSpatialAutoBezierAtKey(k, false); p.setSpatialContinuousAtKey(k, false);
79
+ var z = (p.value.length == 3) ? [0, 0, 0] : [0, 0];
80
+ p.setSpatialTangentsAtKey(k, z, z);
81
+ }
82
+ }
83
+ }
84
+ function T(L) { return L.property('ADBE Transform Group'); }
85
+ function P(L) { return T(L).property('ADBE Position'); }
86
+ function S(L) { return T(L).property('ADBE Scale'); }
87
+ function R(L) { return T(L).property('ADBE Rotate Z'); }
88
+ function O(L) { return T(L).property('ADBE Opacity'); }
89
+ function A(L) { return T(L).property('ADBE Anchor Point'); }
90
+ function fx(L, mn) { return L.property('ADBE Effect Parade').addProperty(mn); }
91
+ function blur(L) { var e = fx(L, 'ADBE Gaussian Blur 2'); e.property('ADBE Gaussian Blur 2-0003').setValue(0); /* sem repetir borda: o desfoque some suave (com 1, PNG vira caixa) */ return L.property('ADBE Effect Parade').property(e.name).property('ADBE Gaussian Blur 2-0001'); }
92
+ function NUL(comp, nome, pos) { var L = comp.layers.addNull(); L.name = nome; A(L).setValue([0, 0]); P(L).setValue(pos); L.enabled = true; return L; }
93
+ function solid(comp, nome, cor, w, h) { var L = comp.layers.addSolid(rgb(cor), nome, w || comp.width, h || comp.height, 1); return L; }
94
+ function img(comp, arq) {
95
+ var it = app.project.importFile(new ImportOptions(new File(arq)));
96
+ it.parentFolder = PASTA;
97
+ return comp.layers.add(it);
98
+ }
99
+ function shape(comp, nome) { var L = comp.layers.addShape(); L.name = nome; return L; }
100
+ function grupo(L, nome) { var g = L.property('ADBE Root Vectors Group').addProperty('ADBE Vector Group'); g.name = nome; return g; }
101
+ function cont(L, nome) { return L.property('ADBE Root Vectors Group').property(nome).property('ADBE Vectors Group'); }
102
+ function addRect(L, gn, w, h, r) { var g = grupo(L, gn); var rc = cont(L, gn).addProperty('ADBE Vector Shape - Rect'); rc.property('ADBE Vector Rect Size').setValue([w, h]); rc.property('ADBE Vector Rect Roundness').setValue(r); return gn; }
103
+ function addEllipse(L, gn, w, h, pos) { grupo(L, gn); var el = cont(L, gn).addProperty('ADBE Vector Shape - Ellipse'); el.property('ADBE Vector Ellipse Size').setValue([w, h]); if (pos) el.property('ADBE Vector Ellipse Position').setValue(pos); return gn; }
104
+ function addFill(L, gn, cor) { var f = cont(L, gn).addProperty('ADBE Vector Graphic - Fill'); f.property('ADBE Vector Fill Color').setValue(rgb(cor)); return f; }
105
+ function addStroke(L, gn, cor, w) { var s = cont(L, gn).addProperty('ADBE Vector Graphic - Stroke'); s.property('ADBE Vector Stroke Color').setValue(rgb(cor)); s.property('ADBE Vector Stroke Width').setValue(w); return s; }
106
+ function rectProp(L, gn, mn) { return cont(L, gn).property('ADBE Vector Shape - Rect').property(mn); }
107
+ function TX(comp, s, fonte, tam, cor, pos, just, track) {
108
+ var L = comp.layers.addText(s);
109
+ var tp = L.property('ADBE Text Properties').property('ADBE Text Document');
110
+ var d = tp.value;
111
+ d.resetCharStyle(); d.font = fonte; d.fontSize = tam; d.applyFill = true; d.fillColor = rgb(cor); d.applyStroke = false;
112
+ d.tracking = track || 0;
113
+ tp.setValue(d);
114
+ d = tp.value; d.justification = just || ParagraphJustification.LEFT_JUSTIFY; tp.setValue(d);
115
+ P(L).setValue(pos);
116
+ return L;
117
+ }
118
+ function setLeading(L, lead) { var tp = L.property('ADBE Text Properties').property('ADBE Text Document'); var d = tp.value; d.autoLeading = false; d.leading = lead; tp.setValue(d); }
119
+ function caixa(L, t) { return L.sourceRectAtTime(t || 0, false); } // {left, top, width, height} em coordenadas da camada
120
+ // animador de texto: esconde o que não foi "digitado" (opacidade 0 e 10 px abaixo). base: 1 caracteres, 3 palavras
121
+ function digita(L, base, chaves, desloc, indice) {
122
+ var an = L.property('ADBE Text Properties').property('ADBE Text Animators').addProperty('ADBE Text Animator');
123
+ an.name = 'digita';
124
+ an.property('ADBE Text Animator Properties').addProperty('ADBE Text Opacity').setValue(0);
125
+ if (desloc) L.property('ADBE Text Properties').property('ADBE Text Animators').property('digita').property('ADBE Text Animator Properties').addProperty('ADBE Text Position 3D').setValue([0, desloc, 0]);
126
+ var sel = L.property('ADBE Text Properties').property('ADBE Text Animators').property('digita').property('ADBE Text Selectors').addProperty('ADBE Text Selector');
127
+ var adv = sel.property('ADBE Text Range Advanced');
128
+ adv.property('ADBE Text Range Type2').setValue(base);
129
+ if (base == 3 || indice) {
130
+ adv.property('ADBE Text Range Units').setValue(2); // índice (palavra/letra 1, 2, 3…)
131
+ sel.property('ADBE Text Index End').setValue(999);
132
+ K(sel.property('ADBE Text Index Start'), chaves);
133
+ } else {
134
+ K(sel.property('ADBE Text Percent Start'), chaves);
135
+ }
136
+ }
137
+ function mb(L) { L.motionBlur = true; }
138
+
139
+ function R3(L, eixo) { return T(L).property(eixo == 'x' ? 'ADBE Rotate X' : 'ADBE Rotate Y'); }
140
+ function circ(comp, nome, d, cor, pos) { var L = shape(comp, nome); addEllipse(L, 'o', d, d); addFill(L, 'o', cor); if (pos) P(L).setValue(pos); return L; }
141
+ function rr(comp, nome, w, h, r, cor, pos) { var L = shape(comp, nome); addRect(L, 'r', w, h, r); addFill(L, 'r', cor); if (pos) P(L).setValue(pos); return L; }
142
+ function contorno(L, gn, cor, w) { return addStroke(L, gn, cor, w); }
143
+ function sombra(L, op, dist, suave) {
144
+ var e = fx(L, 'ADBE Drop Shadow'); var n = e.name;
145
+ L.property('ADBE Effect Parade').property(n).property('ADBE Drop Shadow-0002').setValue(op);
146
+ L.property('ADBE Effect Parade').property(n).property('ADBE Drop Shadow-0003').setValue(180);
147
+ L.property('ADBE Effect Parade').property(n).property('ADBE Drop Shadow-0004').setValue(dist);
148
+ L.property('ADBE Effect Parade').property(n).property('ADBE Drop Shadow-0005').setValue(suave);
149
+ }
150
+ function filho(L, pai, pos) { L.setParentWithJump(pai); if (pos) P(L).setValue(pos); return L; } // sem compensar: valores ficam locais ao pai
151
+ function caminho(L, gn, pts, fechado) { // path de pontos retos
152
+ grupo(L, gn);
153
+ var pp = cont(L, gn).addProperty('ADBE Vector Shape - Group');
154
+ var sh = new Shape(); sh.vertices = pts; sh.closed = !!fechado;
155
+ cont(L, gn).property('ADBE Vector Shape - Group').property('ADBE Vector Shape').setValue(sh);
156
+ return gn;
157
+ }
158
+ function entra(L, t, dur, dy, bl) { // entrada padrão "depois": sobe, sai do desfoque, ease-out
159
+ var p0 = P(L).value;
160
+ K(P(L), [[t, [p0[0], p0[1] + (dy || 0)], 33, 10], [t + F(dur), p0, 85, 33]]);
161
+ K(O(L), [[t, 0], [t + F(Math.max(3, Math.round(dur * 0.6))), 100]]);
162
+ if (bl) K(blur(L), [[t, bl, 33, 10], [t + F(dur), 0, 85, 33]]);
163
+ L.inPoint = Math.max(0, t - F(1));
164
+ }
165
+
166
+ // ================================================================ projeto
167
+ app.newProject();
168
+ var proj = app.project;
169
+ var PASTA = proj.items.addFolder('assets');
170
+ var COMPS = proj.items.addFolder('cenas');
171
+ function novaComp(nome, w, h, mbOn) { var c = proj.items.addComp(nome, w || W, h || H, 1, DUR, FPS); c.parentFolder = COMPS; c.motionBlur = (mbOn !== false); c.shutterAngle = 270; c.shutterPhase = -135; c.motionBlurSamplesPerFrame = 16; return c; }
172
+ var EVENTOS = [];
173
+ function ev(t, kind, pan, v) { EVENTOS.push({ t: Math.round(t * 1000) / 1000, kind: kind, pan: pan || 0, v: v || 0.7 }); }
174
+
175
+ // ================================================================ 1. ANTES (0–5,5): linear de propósito, sem desfoque
176
+ var P1 = novaComp('ANTES', W, H, true);
177
+ (function () {
178
+ var c = P1;
179
+ solid(c, 'fundo', '#161616');
180
+ var G = NUL(c, 'GRUPO', [540, 540]);
181
+ // barra branca de canto reto: a borda esquerda fica fixa em x 9, a direita estica (3,35–4,0)
182
+ var barra = shape(c, 'barra'); addRect(barra, 'r', 230, 234, 0); addFill(barra, 'r', '#FFFFFF'); filho(barra, G, [0, 0]);
183
+ var ws = [[3.35, 230], [3.50, 688], [3.60, 846], [3.70, 945], [3.80, 994], [3.90, 1017], [4.00, 1026]];
184
+ var ks = [], kp = [], i;
185
+ for (i = 0; i < ws.length; i++) { ks.push([ws[i][0], [ws[i][1], 234], -1, -1]); kp.push([ws[i][0], [-531 + ws[i][1] / 2, 0], -1, -1]); }
186
+ K(rectProp(barra, 'r', 'ADBE Vector Rect Size'), ks);
187
+ K(rectProp(barra, 'r', 'ADBE Vector Rect Position'), kp);
188
+ barra.inPoint = 3.33; mb(barra);
189
+ // frases (itálico): a nova aparece à esquerda do ícone, a velha some à direita dele (mattes filhos do ícone)
190
+ var f1 = TX(c, TEXTOS.frase1, 'RobotoCondensed-Italic', 60, '#111111', [0, 0], ParagraphJustification.LEFT_JUSTIFY, 60); filho(f1, G, [-275, 20]);
191
+ K(O(f1), [[3.68, 0, -1, -1], [3.80, 100, -1, -1]]);
192
+ f1.inPoint = 3.66;
193
+ var f2 = TX(c, TEXTOS.frase2, 'RobotoCondensed-Italic', 60, '#111111', [0, 0], ParagraphJustification.LEFT_JUSTIFY, 60); filho(f2, G, [-279, 20]);
194
+ f2.inPoint = 3.95;
195
+ // ícone do Telegram "antigo": quadrado branco arredondado, círculo azul-claro, avião branco
196
+ var IC = NUL(c, 'ICONE', [0, 0]); IC.parent = G; P(IC).setValue([0, 0]);
197
+ var q = rr(c, 'quadrado', 234, 234, 50, '#FFFFFF', [0, 0]); filho(q, IC, [0, 0]);
198
+ var bola = circ(c, 'circulo azul', 206, '#A3CDE1', [0, 0]); filho(bola, IC, [0, 0]);
199
+ var selo = circ(c, 'selo vermelho', 36, '#E0303E', [0, 0]); filho(selo, IC, [104, -104]);
200
+ K(S(selo), [[2.10, [0, 0], -1, -1], [2.20, [100, 100], -1, -1]]);
201
+ selo.inPoint = 2.08;
202
+ // mattes da troca de frase
203
+ var mD = rr(c, 'matte direita', 1400, 300, 0, '#FFFFFF', [0, 0]); filho(mD, IC, [700, 0]);
204
+ var mE = rr(c, 'matte esquerda', 1400, 300, 0, '#FFFFFF', [0, 0]); filho(mE, IC, [-700, 0]);
205
+ f1.moveAfter(mD); f1.setTrackMatte(mD, TrackMatteType.ALPHA);
206
+ f2.moveAfter(mE); f2.setTrackMatte(mE, TrackMatteType.ALPHA);
207
+ // movimento do ícone: balanço leve (2,1–3,2), vai à esquerda (3,15–3,32), atravessa (4,0–4,3)
208
+ K(R(IC), [[2.15, 0, -1, -1], [2.45, 6, -1, -1], [2.75, -5, -1, -1], [3.05, 3, -1, -1], [3.20, 0, -1, -1]]);
209
+ K(P(IC), [[3.15, [0, 0], -1, -1], [3.32, [-419, 0], -1, -1], [4.00, [-419, 0], -1, -1], [4.30, [377, 0], -1, -1], [4.45, [391, 0], -1, -1]]);
210
+ // avião: sai do ícone, dá a volta (direita → cima → esquerda) em velocidade constante e volta (0,20–1,92)
211
+ var av = shape(c, 'aviao'); caminho(av, 'a', [[-36, -30], [44, 0], [-36, 30], [-18, 0]], true); addFill(av, 'a', '#FFFFFF');
212
+ av.parent = G;
213
+ P(av).expression = [
214
+ 'var C = thisComp.layer("ICONE").transform.position;',
215
+ 'function E(a){ return [250*Math.cos(a), -70 - 230*Math.sin(a)]; }',
216
+ 'var t0 = 0.20, t1 = 0.33, t2 = 1.80, t3 = 1.92;',
217
+ 'if (time < t0 || time > t3) C;',
218
+ 'else if (time < t1) linear(time, t0, t1, C, E(-0.17));',
219
+ 'else if (time < t2) E(linear(time, t1, t2, -0.17, 3.42));',
220
+ 'else linear(time, t2, t3, E(3.42), C);'
221
+ ].join('\n');
222
+ R(av).setValue(-28);
223
+ R(av).expression = 'var v = transform.position.velocity; (length(v) > 5) ? radiansToDegrees(Math.atan2(v[1], v[0])) : value + thisComp.layer("ICONE").transform.rotation;';
224
+ av.moveToBeginning();
225
+ // achata e some (4,80–4,95) — tudo junto
226
+ K(S(G), [[4.80, [100, 100], -1, -1], [4.95, [100, 0], -1, -1]]);
227
+ ev(0.20, 'move', 0.4, 0.4); ev(1.90, 'pouso', 0, 0.45); ev(2.10, 'notifica', 0.3, 0.5); ev(3.15, 'move', -0.4, 0.45);
228
+ ev(3.35, 'abre', 0, 0.5); ev(3.70, 'texto', 0, 0.4); ev(4.00, 'empurra', 0.3, 0.55); ev(4.80, 'encolhe', 0, 0.5);
229
+ })();
230
+
231
+ // ================================================================ 2. ADOBE (5,5–7,15): ícone gigante pousa, grade, rótulo em onda
232
+ var AD = novaComp('ADOBE');
233
+ (function () {
234
+ var c = AD;
235
+ solid(c, 'fundo lilas', '#D4D4E0');
236
+ var GR = NUL(c, 'GRADE', [540, 540]);
237
+ K(P(GR), [[6.25, [540, 540], 33, 33], [6.50, [300, 540], 'a'], [7.00, [135, 540], 'a'], [7.15, [100, 540], 50, 33]]);
238
+ var cinza = [['Pr', 0, -470], ['An', 0, 470], ['Ai', -470, 0], ['Xd', 470, 0], ['Ai', 940, 0], ['Xd', -940, 0]];
239
+ for (var i = 0; i < cinza.length; i++) {
240
+ var b = rr(c, 'icone ' + cinza[i][0] + i, 300, 300, 66, '#8E8E93', [0, 0]); filho(b, GR, [cinza[i][1], cinza[i][2]]);
241
+ var l = TX(c, cinza[i][0], 'SFProDisplay-Semibold', 150, '#B9B9BE', [0, 0], ParagraphJustification.CENTER_JUSTIFY); filho(l, b, [0, 52]);
242
+ var t0 = 5.62 + (i % 4) * F(1);
243
+ K(O(b), [[t0, 0], [t0 + F(6), 100]]); K(S(b), [[t0, [80, 80], 33, 10], [t0 + F(8), [100, 100], 85, 33]]);
244
+ O(l).expression = 'thisComp.layer("' + b.name + '").transform.opacity';
245
+ }
246
+ // Ae: entra a 250% e borrado, pousa em 100% (360 px) em ~15 q
247
+ var ae = rr(c, 'Ae', 360, 360, 80, '#00005B', [0, 0]); filho(ae, GR, [0, 0]); mb(ae);
248
+ var al = TX(c, 'Ae', 'SFProDisplay-Semibold', 200, '#9999FF', [0, 0], ParagraphJustification.CENTER_JUSTIFY); al.name = 'Ae letras'; filho(al, ae, [0, 70]);
249
+ K(S(ae), [[5.50, [200, 200], 33, 8], [5.75, [106, 106], 'a'], [6.00, [100, 100], 60, 33]]);
250
+ K(O(ae), [[5.50, 30], [5.72, 100]]); O(al).expression = 'thisComp.layer("Ae").transform.opacity';
251
+ K(P(ae), [[5.50, [0, 120], 33, 8], [5.75, [0, 8], 'a'], [6.00, [0, 0], 60, 33]]);
252
+ var bae = blur(ae); K(bae, [[5.50, 30, 33, 8], [5.95, 0, 88, 33]]);
253
+ blur(al).expression = 'thisComp.layer("Ae").effect(1)(1)';
254
+ // rótulo em onda (por caractere)
255
+ var rot = TX(c, TEXTOS.rotuloAe, 'SFProDisplay-Semibold', 30, '#00005B', [0, 0], ParagraphJustification.CENTER_JUSTIFY); filho(rot, GR, [0, 236]);
256
+ var an = rot.property('ADBE Text Properties').property('ADBE Text Animators').addProperty('ADBE Text Animator');
257
+ an.property('ADBE Text Animator Properties').addProperty('ADBE Text Opacity').setValue(0);
258
+ rot.property('ADBE Text Properties').property('ADBE Text Animators').property(1).property('ADBE Text Animator Properties').addProperty('ADBE Text Position 3D').setValue([0, 18, 0]);
259
+ var sel = rot.property('ADBE Text Properties').property('ADBE Text Animators').property(1).property('ADBE Text Selectors').addProperty('ADBE Text Selector');
260
+ sel.property('ADBE Text Range Advanced').property('ADBE Text Range Shape').setValue(3); // rampa para cima (onda)
261
+ K(sel.property('ADBE Text Percent Offset'), [[5.68, -100, 33, 33], [6.05, 100, 60, 33]]);
262
+ ev(5.50, 'impacto', 0, 0.9); ev(5.58, 'pouso', 0, 0.6); ev(5.70, 'letras', 0, 0.4);
263
+ })();
264
+
265
+ // ================================================================ 3. PAINEL (6,25–8,0): arquivos, aviso de travamento, câmera aproxima
266
+ var PN = novaComp('PAINEL');
267
+ (function () {
268
+ var c = PN;
269
+ // o painel branco entra pela direita com desfoque direcional e cresce até virar o fundo
270
+ var pn = rr(c, 'painel', 472, 520, 28, '#FFFFFF', [540, 540]); mb(pn);
271
+ sombra(pn, 25, 30, 60);
272
+ K(P(pn), [[6.28, [900, 527], 33, 10], [6.50, [600, 527], 'a'], [6.70, [540, 540], 'a'], [6.90, [540, 540], 50, 50]]);
273
+ K(rectProp(pn, 'r', 'ADBE Vector Rect Size'), [[6.28, [60, 495], 33, 10], [6.50, [427, 495], 'a'], [6.70, [472, 500], 'a'], [6.90, [756, 810], 'a'], [7.00, [931, 995], 'a'], [7.12, [1200, 1200], 60, 33]]);
274
+ K(cont(pn, 'r').property('ADBE Vector Graphic - Fill').property('ADBE Vector Fill Color'), [[6.90, rgb('#FFFFFF')], [7.15, rgb('#EDEDED')]]);
275
+ var db = fx(pn, 'ADBE Motion Blur');
276
+ K(pn.property('ADBE Effect Parade').property(db.name).property('ADBE Motion Blur-0002'), [[6.28, 60, 33, 10], [6.55, 0, 85, 33]]);
277
+ pn.property('ADBE Effect Parade').property(db.name).property('ADBE Motion Blur-0001').setValue(90);
278
+ // conteúdo da lista (null LISTA: o "zoom" da câmera é a escala dela, com foco no título)
279
+ var LI = NUL(c, 'LISTA', [540, 540]);
280
+ LI.parent = null;
281
+ K(P(LI), [[6.28, [900, 527], 33, 10], [6.50, [600, 527], 'a'], [6.70, [540, 540], 'a'], [7.15, [540, 540], 40, 30], [7.75, [402, 694], 'a'], [7.95, [402, 900], 60, 33]]);
282
+ K(S(LI), [[6.28, [55, 55], 33, 10], [6.70, [85, 85], 'a'], [7.00, [100, 100], 'a'], [7.15, [100, 100], 40, 30], [7.75, [140, 140], 60, 33]]);
283
+ K(O(LI), [[6.28, 0], [6.40, 100]]);
284
+ var tit = TX(c, TEXTOS.tituloArquivos, 'SFProText-Semibold', 30, '#1C1C1E', [0, 0]); filho(tit, LI, [-216, -210]);
285
+ var lupa = shape(c, 'lupa'); addEllipse(lupa, 'o', 18, 18); addStroke(lupa, 'o', '#8E8E93', 3); filho(lupa, LI, [200, -220]);
286
+ var linhas = [];
287
+ for (var i = 0; i < 4; i++) {
288
+ var y = -117 + i * 72;
289
+ var gl = NUL(c, 'linha ' + i, [0, 0]); filho(gl, LI, [0, y]);
290
+ var icn = rr(c, 'doc ' + i, 22, 28, 4, '#2C3E9E', [0, 0]); filho(icn, gl, [-200, -8]);
291
+ var nm = TX(c, TEXTOS.arquivos[i][0], 'SFProText-Regular', 24, '#1C1C1E', [0, 0]); filho(nm, gl, [-174, 0]);
292
+ var sz = TX(c, TEXTOS.arquivos[i][1], 'SFProText-Regular', 18, '#A1A1A6', [0, 0], ParagraphJustification.RIGHT_JUSTIFY); filho(sz, gl, [210, 0]);
293
+ var fundo = rr(c, 'faixa ' + i, 440, 56, 12, '#F4F4F6', [0, 0]); filho(fundo, gl, [5, -8]); fundo.moveAfter(icn);
294
+ // o aviso empurra a lista (7,15) e a profundidade de campo borra quem está embaixo
295
+ K(P(gl), [[7.15, [0, y], 40, 10], [7.45, [0, y + 92], 85, 33]]);
296
+ var bl = [icn, nm, sz, fundo];
297
+ for (var k = 0; k < bl.length; k++) { mb(bl[k]); K(blur(bl[k]), [[7.15, 0], [7.75, i * 7]]); }
298
+ linhas.push(gl);
299
+ }
300
+ // aviso vermelho
301
+ var al = NUL(c, 'ALERTA', [0, 0]); filho(al, LI, [0, -128]);
302
+ var alf = rr(c, 'alerta fundo', 440, 76, 14, '#FFFFFF', [0, 0]); filho(alf, al, [5, 0]); sombra(alf, 30, 6, 30);
303
+ var alq = rr(c, 'alerta icone', 46, 46, 8, '#D01D2D', [0, 0]); filho(alq, al, [-186, 0]);
304
+ var ala = TX(c, 'A', 'SFProDisplay-Bold', 30, '#FFFFFF', [0, 0], ParagraphJustification.CENTER_JUSTIFY); filho(ala, al, [-186, 11]);
305
+ var at1 = TX(c, TEXTOS.alerta1, 'SFProText-Medium', 20, '#1C1C1E', [0, 0]); filho(at1, al, [-150, -4]);
306
+ var at2 = TX(c, TEXTOS.alerta2, 'SFProText-Regular', 15, '#E0505E', [0, 0]); filho(at2, al, [-150, 20]);
307
+ K(P(al), [[7.15, [0, -168], 33, 10], [7.45, [0, -128], 85, 33]]);
308
+ K(O(al), [[7.15, 0], [7.30, 100]]);
309
+ var filhosAl = [alf, alq, ala, at1, at2];
310
+ for (i = 0; i < filhosAl.length; i++) { O(filhosAl[i]).expression = 'thisComp.layer("ALERTA").transform.opacity'; filhosAl[i].inPoint = 7.12; }
311
+ // saída: a lista desce borrada (7,75–7,95)
312
+ var todos = [tit, lupa];
313
+ for (i = 0; i < todos.length; i++) K(blur(todos[i]), [[7.75, 0], [7.95, 20]]);
314
+ K(O(LI), [[6.28, 0], [6.40, 100], [7.80, 100], [7.95, 0]]);
315
+ var tudo = [tit, lupa, alf, alq, ala, at1, at2];
316
+ for (i = 0; i < c.numLayers; i++) { }
317
+ // opacidade do grupo LISTA não passa aos filhos: expressão em cada um
318
+ var nomes = [];
319
+ for (i = 1; i <= c.numLayers; i++) { var L = c.layer(i); if (L.parent && L.name != 'LISTA' && L.name.indexOf('alerta') < 0 && L.name.indexOf('ALERTA') < 0 && L.name != 'painel' && !(L instanceof AVLayer && L.nullLayer)) nomes.push(L); }
320
+ for (i = 0; i < nomes.length; i++) { var op = O(nomes[i]); if (op.expression == '' && op.numKeys == 0) op.expression = 'thisComp.layer("LISTA").transform.opacity'; }
321
+ ev(6.30, 'painel', 0.5, 0.6); ev(7.15, 'alerta', 0, 0.7); ev(7.78, 'sai', 0, 0.5);
322
+ })();
323
+
324
+ // ================================================================ 4. OBTER INFO (7,85–9,67): botão, clique, ripple, notificação
325
+ var GI = novaComp('OBTER INFO');
326
+ (function () {
327
+ var c = GI;
328
+ solid(c, 'fundo', '#EDEDED');
329
+ // ripple cinza grande do clique
330
+ var rp = circ(c, 'ripple', 1200, '#B9B9C6', [420, 562]);
331
+ K(S(rp), [[8.48, [0, 0], 33, 10], [9.00, [100, 100], 80, 33]]); K(O(rp), [[8.48, 0], [8.60, 35], [9.00, 0]]);
332
+ K(blur(rp), [[8.48, 60]]);
333
+ var pill = rr(c, 'pilula', 270, 68, 34, '#E3E3E8', [540, 540]);
334
+ K(O(pill), [[8.15, 0], [8.25, 100]]);
335
+ K(cont(pill, 'r').property('ADBE Vector Graphic - Fill').property('ADBE Vector Fill Color'), [[8.70, rgb('#E3E3E8')], [8.85, rgb('#A7E6EE')]]);
336
+ K(rectProp(pill, 'r', 'ADBE Vector Rect Size'), [[8.85, [270, 68], 33, 10], [9.00, [585, 150], 85, 33]]);
337
+ K(rectProp(pill, 'r', 'ADBE Vector Rect Roundness'), [[8.85, 34, 33, 10], [9.00, 30, 85, 33]]);
338
+ K(cont(pill, 'r').property('ADBE Vector Graphic - Fill').property('ADBE Vector Fill Color'), [[8.70, rgb('#E3E3E8')], [8.85, rgb('#A7E6EE')], [9.00, rgb('#E4E4E9')]]);
339
+ K(blur(pill), [[8.85, 0], [8.92, 10], [9.00, 0]]);
340
+ var ic = shape(c, 'i'); addEllipse(ic, 'o', 26, 26); addStroke(ic, 'o', '#3A3A3C', 2.5); P(ic).setValue([440, 540]);
341
+ var ii = TX(c, 'i', 'SFProText-Semibold', 18, '#3A3A3C', [440, 547], ParagraphJustification.CENTER_JUSTIFY);
342
+ var tx = TX(c, TEXTOS.info, 'SFProText-Medium', 24, '#1C1C1E', [466, 549]);
343
+ digita(tx, 1, [[7.95, 0, -1, -1], [8.20, 100, -1, -1]]);
344
+ K(O(ic), [[7.88, 0], [7.95, 100], [8.85, 100], [8.92, 0]]); O(ii).expression = 'thisComp.layer("i").transform.opacity';
345
+ K(O(tx), [[8.85, 100], [8.92, 0]]);
346
+ // notificação "mais memória" que nasce do botão
347
+ var N = NUL(c, 'NOTIF', [540, 540]);
348
+ var nq = rr(c, 'ae mini', 84, 84, 18, '#00005B', [0, 0]); filho(nq, N, [-220, 0]);
349
+ var nqa = TX(c, 'Ae', 'SFProDisplay-Semibold', 40, '#9999FF', [0, 0], ParagraphJustification.CENTER_JUSTIFY); filho(nqa, N, [-220, 14]);
350
+ var n1 = TX(c, TEXTOS.ram1, 'SFProText-Semibold', 28, '#1C1C1E', [0, 0]); filho(n1, N, [-160, -6]);
351
+ var n2 = TX(c, TEXTOS.ram2, 'SFProText-Semibold', 24, '#1C1C1E', [0, 0], ParagraphJustification.RIGHT_JUSTIFY); filho(n2, N, [262, -6]);
352
+ var n3 = TX(c, TEXTOS.ram3, 'SFProText-Regular', 17, '#8E8E93', [0, 0]); filho(n3, N, [-160, 26]);
353
+ K(S(N), [[8.95, [70, 70], 33, 10], [9.10, [100, 100], 85, 33], [9.65, [103, 103], -1, -1]]);
354
+ var nn = [nq, nqa, n1, n2, n3];
355
+ for (var i = 0; i < nn.length; i++) { K(O(nn[i]), [[8.95, 0], [9.08, 100]]); nn[i].inPoint = 8.93; }
356
+ // mão que clica
357
+ var mao = img(c, ASSETS + 'mao-aponta.png'); mao.name = 'mao'; A(mao).setValue([258, 60]); mb(mao);
358
+ K(P(mao), [[8.25, [700, 760], 33, 10], [8.42, [430, 560], 85, 50], [8.70, [436, 566], 40, 40], [8.85, [520, 760], 50, 33]]);
359
+ K(S(mao), [[8.42, [24, 24]], [8.47, [20, 20]], [8.53, [24, 24]]]);
360
+ K(O(mao), [[8.25, 0], [8.32, 100], [8.75, 100], [8.85, 0]]);
361
+ mao.inPoint = 8.23; mao.outPoint = 8.9;
362
+ ev(7.95, 'digita', 0, 0.4); ev(8.47, 'clique', -0.2, 0.7); ev(8.50, 'brilho', 0, 0.4); ev(8.97, 'notificacao', 0, 0.7);
363
+ })();
364
+
365
+ // ================================================================ 5. MÚSICA estilo Spotify (9,67–13,6), nosso conteúdo
366
+ var SP = novaComp('MUSICA');
367
+ (function () {
368
+ var c = SP;
369
+ solid(c, 'fundo', '#000000');
370
+ var gl = circ(c, 'brilho verde', 1100, '#0B2E15', [380, 300]); K(blur(gl), [[0, 300]]); K(O(gl), [[9.72, 0], [10.0, 80]]);
371
+ var lg = img(c, ASSETS + 'spotify-logo.png'); lg.name = 'logo'; mb(lg);
372
+ K(P(lg), [[9.80, [540, 571], 33, 33], [10.30, [540, 571], 40, 10], [10.55, [315, 540], 85, 33]]);
373
+ K(S(lg), [[9.80, [22, 22], 33, 10], [9.98, [37, 37], 85, 33], [10.30, [37, 37], 40, 10], [10.55, [33, 33], 85, 33]]);
374
+ K(blur(lg), [[9.80, 30, 33, 10], [9.98, 0, 85, 33], [10.80, 0], [10.95, 25]]);
375
+ K(O(lg), [[9.80, 0], [9.88, 100], [10.80, 100], [10.95, 0]]);
376
+ lg.inPoint = 9.78; lg.outPoint = 11.0;
377
+ var t1 = TX(c, TEXTOS.musica, 'SFProDisplay-Bold', 54, '#FFFFFF', [418, 559]);
378
+ digita(t1, 1, [[10.40, 0, -1, -1], [10.70, 100, -1, -1]]);
379
+ K(blur(t1), [[10.80, 0], [10.95, 25]]); K(O(t1), [[10.80, 100], [10.95, 0]]); t1.inPoint = 10.38; t1.outPoint = 11.0;
380
+ // artista em destaque (avatar ilustrado/gerado, sem foto real)
381
+ function avatar(nome, x, y, d, t, foto, cor, letra) {
382
+ var a = circ(c, nome + ' anel', d + 14, '#1ED760', [x, y]);
383
+ var b;
384
+ if (foto) { b = img(c, ASSETS + 'avatar-pessoa.png'); S(b).setValue([d / 256 * 100, d / 256 * 100]); P(b).setValue([x, y]); }
385
+ else { b = circ(c, nome + ' fundo', d, cor, [x, y]); var l = TX(c, letra, 'SFProRounded-Semibold', d * 0.42, cor == '#FFFFFF' ? '#111111' : '#FFFFFF', [x, y + d * 0.15], ParagraphJustification.CENTER_JUSTIFY); entra(l, t, 9, 20, 12); l.outPoint = 11.9; }
386
+ entra(a, t, 9, 20, 12); entra(b, t, 9, 20, 12);
387
+ return [a, b];
388
+ }
389
+ var i;
390
+ // "Som Global" com 3 artistas
391
+ var sg = TX(c, TEXTOS.somGlobal, 'SFProDisplay-Bold', 40, '#FFFFFF', [144, 192]); entra(sg, 10.95, 9, 20, 12);
392
+ var XS = [292, 540, 770], CORES = ['#FFFFFF', '#3A6B4B', '#6B4B3A'], TA = [10.98, 11.08, 11.40];
393
+ for (i = 0; i < 3; i++) {
394
+ var av = (i == 1) ? avatar('artista' + i, XS[i], 540, 150, TA[i], true) : avatar('artista' + i, XS[i], 540, 150, TA[i], false, CORES[i], TEXTOS.artistas[i][0].charAt(0));
395
+ var n1 = TX(c, TEXTOS.artistas[i][0], 'SFProText-Semibold', 22, '#FFFFFF', [XS[i], 660], ParagraphJustification.CENTER_JUSTIFY); entra(n1, TA[i] + F(2), 9, 15, 10);
396
+ var n2 = TX(c, TEXTOS.artistas[i][1], 'SFProText-Regular', 16, '#9A9A9A', [XS[i], 688], ParagraphJustification.CENTER_JUSTIFY); entra(n2, TA[i] + F(3), 9, 15, 10);
397
+ n1.outPoint = n2.outPoint = av[0].outPoint = av[1].outPoint = 11.9;
398
+ }
399
+ sg.outPoint = 11.9;
400
+ // página "Imersão Global"
401
+ var im = TX(c, TEXTOS.imersao, 'SFProDisplay-Bold', 46, '#FFFFFF', [185, 330]); entra(im, 11.92, 10, 25, 14);
402
+ var pg = TX(c, TEXTOS.paragrafo, 'SFProText-Regular', 19, '#A0A0A0', [185, 380]); setLeading(pg, 27); entra(pg, 12.20, 10, 20, 10);
403
+ var bt = shape(c, 'botao'); addRect(bt, 'r', 150, 46, 23); addStroke(bt, 'r', '#1ED760', 2); P(bt).setValue([260, 590]); entra(bt, 12.45, 9, 20, 8);
404
+ var btt = TX(c, TEXTOS.botao, 'SFProText-Medium', 18, '#1ED760', [260, 596], ParagraphJustification.CENTER_JUSTIFY); entra(btt, 12.45, 9, 20, 8);
405
+ var cp = img(c, ASSETS + 'capa-album.png'); S(cp).setValue([27, 27]); P(cp).setValue([190, 680]); entra(cp, 12.90, 9, 25, 10);
406
+ var ft = TX(c, TEXTOS.faixa, 'SFProText-Semibold', 24, '#FFFFFF', [262, 674]); entra(ft, 12.92, 9, 25, 10);
407
+ var fs = TX(c, TEXTOS.faixaSub, 'SFProText-Regular', 17, '#9A9A9A', [262, 702]); entra(fs, 12.94, 9, 25, 10);
408
+ var sombraItem = rr(c, 'item apagado', 560, 90, 14, '#151515', [455, 880]); entra(sombraItem, 13.0, 9, 25, 10);
409
+ // saída em riscos horizontais (13,35–13,55): estica e borra na horizontal
410
+ var pag = [im, pg, bt, btt, cp, ft, fs, sombraItem];
411
+ for (i = 0; i < pag.length; i++) {
412
+ var p0 = P(pag[i]).value;
413
+ var dbx = fx(pag[i], 'ADBE Motion Blur'); var nn = dbx.name;
414
+ pag[i].property('ADBE Effect Parade').property(nn).property('ADBE Motion Blur-0001').setValue(90);
415
+ K(pag[i].property('ADBE Effect Parade').property(nn).property('ADBE Motion Blur-0002'), [[13.32, 0], [13.52, 220]]);
416
+ K(S(pag[i]), [[13.32, [S(pag[i]).value[0], S(pag[i]).value[1]], 50, 10], [13.52, [S(pag[i]).value[0] * 2.2, S(pag[i]).value[1]], 85, 33]]);
417
+ pag[i].outPoint = 13.58;
418
+ }
419
+ ev(9.80, 'logo', 0, 0.7); ev(10.35, 'move', -0.3, 0.5); ev(10.40, 'digita', 0.3, 0.4); ev(10.95, 'texto', 0, 0.45);
420
+ ev(10.98, 'pop', -0.4, 0.45); ev(11.08, 'pop', 0, 0.45); ev(11.40, 'pop', 0.4, 0.45); ev(11.92, 'texto', 0, 0.45);
421
+ ev(12.45, 'pop', -0.3, 0.4); ev(12.90, 'card', -0.3, 0.45); ev(13.32, 'sai-tela', 0, 0.7);
422
+ })();
423
+
424
+ // ================================================================ 6. CARTÃO (13,55–14,35): barras azuis → cartão que gira e cresce
425
+ var CD = novaComp('CARTAO PRECOMP', 450, 495);
426
+ (function () {
427
+ var c = CD;
428
+ var mid = img(c, ASSETS + 'galeria-3.png'); S(mid).setValue([52, 52]); P(mid).setValue([225, 247]);
429
+ var esc = solid(c, 'escurece', '#000000', 450, 495); O(esc).setValue(84);
430
+ rr(c, 'azul topo', 450, 90, 0, '#2B47E6', [225, 45]); rr(c, 'azul base', 450, 90, 0, '#2B47E6', [225, 450]);
431
+ })();
432
+ var CT = novaComp('CARTAO');
433
+ (function () {
434
+ var c = CT;
435
+ var bg = solid(c, 'fundo', '#000000');
436
+ var tint = fx(bg, 'ADBE Fill'); var tn = tint.name;
437
+ K(bg.property('ADBE Effect Parade').property(tn).property('ADBE Fill-0002'), [[13.55, rgb('#0A0A0A'), -1, -1], [13.62, rgb('#7E7E7E'), -1, -1], [13.72, rgb('#BDBDBD'), -1, -1], [13.86, rgb('#FFFFFF'), -1, -1]]);
438
+ var b1 = rr(c, 'barra 1', 450, 112, 0, '#2C40D0', [540, 270]), b2 = rr(c, 'barra 2', 450, 112, 0, '#2C40D0', [540, 800]);
439
+ K(P(b1), [[13.58, [540, 270], 33, 10], [13.85, [504, 323], 85, 33]]); K(P(b2), [[13.58, [540, 800], 33, 10], [13.85, [504, 728], 85, 33]]);
440
+ K(rectProp(b1, 'r', 'ADBE Vector Rect Size'), [[13.75, [450, 112]], [13.85, [450, 90]]]); K(rectProp(b2, 'r', 'ADBE Vector Rect Size'), [[13.75, [450, 112]], [13.85, [450, 90]]]);
441
+ b1.outPoint = b2.outPoint = 13.87; mb(b1); mb(b2);
442
+ var cd = c.layers.add(CD); cd.name = 'cartao'; mb(cd);
443
+ cd.inPoint = 13.84;
444
+ P(cd).setValue([504, 526]);
445
+ K(S(cd), [[13.86, [100, 100], 33, 60], [14.10, [165, 165], 'a'], [14.20, [290, 290], 'a'], [14.30, [640, 640], 20, 33]]);
446
+ K(R(cd), [[13.86, 0, 33, 60], [14.10, 6, 'a'], [14.20, 18, 'a'], [14.30, 34, 20, 33]]);
447
+ ev(13.60, 'morph', 0, 0.6); ev(13.88, 'viagem', 0, 0.8);
448
+ })();
449
+
450
+ // ================================================================ 7. TELAS dos mockups
451
+ var TI = novaComp('TELA IPHONE', 390, 844);
452
+ (function () {
453
+ var c = TI;
454
+ rr(c, 'fundo', 390, 844, 56, '#0B0B10', [195, 422]);
455
+ var g = img(c, ASSETS + 'galeria-1.png'); S(g).setValue([55, 30]); P(g).setValue([195, 470]); O(g).setValue(55);
456
+ var mt = rr(c, 'molde', 330, 230, 22, '#FFFFFF', [195, 470]); g.moveAfter(mt); g.setTrackMatte(mt, TrackMatteType.ALPHA);
457
+ circ(c, 'ponto', 14, '#3B82F6', [40, 100]);
458
+ TX(c, TEXTOS.app, 'SFProText-Semibold', 18, '#FFFFFF', [56, 106]);
459
+ var a = TX(c, TEXTOS.iphone1, 'SFProDisplay-Bold', 46, '#FFFFFF', [30, 200]);
460
+ var b = TX(c, TEXTOS.iphone2, 'SFProDisplay-Bold', 46, '#4F8DFF', [30, 252]);
461
+ digita(a, 1, [[14.95, 0, -1, -1], [15.20, 100, -1, -1]]); digita(b, 1, [[15.20, 0, -1, -1], [15.55, 100, -1, -1]]);
462
+ rr(c, 'abrir', 330, 66, 33, '#2F6BFF', [195, 680]); TX(c, TEXTOS.abrir, 'SFProText-Semibold', 22, '#FFFFFF', [195, 688], ParagraphJustification.CENTER_JUSTIFY);
463
+ rr(c, 'fechar', 330, 66, 33, '#2A2A30', [195, 760]); TX(c, TEXTOS.fechar, 'SFProText-Semibold', 22, '#FFFFFF', [195, 768], ParagraphJustification.CENTER_JUSTIFY);
464
+ })();
465
+ var TM = novaComp('TELA MAC', 1040, 650);
466
+ (function () {
467
+ var c = TM;
468
+ rr(c, 'fundo', 1040, 650, 10, '#0B0B10', [520, 325]);
469
+ for (var i = 0; i < 6; i++) { var t = img(c, ASSETS + 'galeria-' + (i + 1) + '.png'); S(t).setValue([22, 22]); P(t).setValue([600 + (i % 3) * 150, 230 + Math.floor(i / 3) * 240]); O(t).setValue(70); }
470
+ circ(c, 'ponto', 14, '#3B82F6', [50, 60]); TX(c, TEXTOS.app, 'SFProText-Semibold', 20, '#FFFFFF', [68, 67]);
471
+ var a = TX(c, TEXTOS.mac1, 'SFProDisplay-Bold', 50, '#FFFFFF', [60, 300]);
472
+ var b = TX(c, TEXTOS.mac2, 'SFProDisplay-Bold', 50, '#4F8DFF', [60, 360]);
473
+ digita(a, 1, [[16.00, 0, -1, -1], [16.20, 100, -1, -1]]); digita(b, 1, [[16.20, 0, -1, -1], [16.45, 100, -1, -1]]);
474
+ })();
475
+
476
+ // ================================================================ 8. 3D (14,25–17,4): galeria, iPhone e MacBook
477
+ var TD = novaComp('TRES D');
478
+ (function () {
479
+ var c = TD;
480
+ solid(c, 'fundo', '#050614');
481
+ // galeria escura atrás (cartões de imagem desfocados, deriva lenta)
482
+ var G = NUL(c, 'GALERIA', [540, 540]);
483
+ K(S(G), [[14.25, [112, 112], 33, 33], [17.4, [100, 100], 33, 33]]);
484
+ K(P(G), [[14.25, [540, 540], 33, 33], [15.55, [500, 540], 'a'], [15.85, [260, 540], 'a'], [17.4, [200, 540], 33, 33]]);
485
+ var pos = [[-420, -300], [0, -330], [420, -290], [-420, 330], [0, 300], [420, 340], [840, 0], [-840, 0], [1260, -300], [1260, 330]];
486
+ for (var i = 0; i < pos.length; i++) {
487
+ var t = img(c, ASSETS + 'galeria-' + (i % 6 + 1) + '.png'); t.name = 'galeria ' + i;
488
+ filho(t, G, pos[i]); S(t).setValue([58, 58]);
489
+ var m = rr(c, 'molde ' + i, 360, 580, 40, '#FFFFFF', [0, 0]); filho(m, G, pos[i]);
490
+ t.moveAfter(m); t.setTrackMatte(m, TrackMatteType.ALPHA);
491
+ K(blur(t), [[14.25, 20]]); O(t).setValue(38);
492
+ }
493
+ var cam = c.layers.addCamera('camera', [540, 540]);
494
+ var zm = cam.property('ADBE Camera Options Group').property('ADBE Camera Zoom').value;
495
+ P(cam).setValue([540, 540, -zm]);
496
+ // iPhone: tela + moldura dourada + 8 cópias para a espessura (camadas 3D filhas do null IPHONE)
497
+ var IP = NUL(c, 'IPHONE', [585, 1500]); IP.threeDLayer = true; A(IP).setValue([0, 0, 0]);
498
+ K(P(IP), [[14.40, [585, 1500, 0], 33, 10], [14.95, [700, 560, 0], 82, 33], [15.55, [722, 548, 0], 40, 30], [15.80, [1550, 520, 0], 10, 33]]);
499
+ K(R3(IP, 'y'), [[14.40, 85, 33, 10], [14.95, -16, 82, 33], [15.55, -20, 40, 30]]);
500
+ K(R(IP), [[14.40, 0, 33, 10], [14.95, 6, 82, 33], [15.55, 4, 40, 30]]);
501
+ S(IP).setValue([82, 82, 82]);
502
+ var ts = c.layers.add(TI); ts.threeDLayer = true; filho(ts, IP, [0, 0, -2]); mb(ts);
503
+ var fr = rr(c, 'moldura', 420, 874, 70, '#C9A46A', [0, 0]); fr.threeDLayer = true; filho(fr, IP, [0, 0, 0]); mb(fr);
504
+ for (var k = 1; k <= 8; k++) { var e = rr(c, 'espessura ' + k, 420, 874, 70, '#8C6A3A', [0, 0]); e.threeDLayer = true; filho(e, IP, [0, 0, k * 3]); e.moveAfter(fr); }
505
+ ts.moveBefore(fr);
506
+ IP.inPoint = 14.35;
507
+ // MacBook: tampa (tela) inclinada para trás + base deitada com teclado
508
+ var MC = NUL(c, 'MACBOOK', [-700, 600]); MC.threeDLayer = true; A(MC).setValue([0, 0, 0]);
509
+ K(P(MC), [[15.68, [-700, 640, 200], 33, 10], [15.95, [470, 600, 200], 85, 40], [16.60, [430, 590, 200], 'a'], [17.00, [300, 600, 200], 'a'], [17.30, [-500, 620, 200], 40, 33]]);
510
+ R3(MC, 'y').setValue(26); R3(MC, 'x').setValue(22); S(MC).setValue([62, 62, 62]); // visto de cima: aparece o teclado
511
+ var tampa = NUL(c, 'TAMPA', [0, 0]); tampa.threeDLayer = true; filho(tampa, MC, [0, 0, 0]); A(tampa).setValue([0, 0, 0]);
512
+ R3(tampa, 'x').setValue(-18);
513
+ var lid = rr(c, 'tampa', 1100, 700, 26, '#1C1C1E', [0, 0]); lid.threeDLayer = true; filho(lid, tampa, [0, -350, 0]);
514
+ var tm = c.layers.add(TM); tm.threeDLayer = true; filho(tm, tampa, [0, -350, -1]); tm.moveBefore(lid);
515
+ var base = rr(c, 'base', 1180, 760, 30, '#AEB1B7', [0, 0]); base.threeDLayer = true; filho(base, MC, [0, 0, -380]); R3(base, 'x').setValue(90);
516
+ var tec = rr(c, 'teclado', 1000, 360, 14, '#2A2A2E', [0, 0]); tec.threeDLayer = true; filho(tec, MC, [0, -4, -300]); R3(tec, 'x').setValue(90);
517
+ var tp = rr(c, 'touchpad', 360, 200, 16, '#B5B7BC', [0, 0]); tp.threeDLayer = true; filho(tp, MC, [0, -4, -620]); R3(tp, 'x').setValue(90);
518
+ var mcs = [lid, tm, base, tec, tp]; for (i = 0; i < mcs.length; i++) mb(mcs[i]);
519
+ MC.inPoint = 15.65;
520
+ ev(14.42, 'sobe', 0.3, 0.6); ev(14.95, 'pouso', 0.3, 0.5); ev(14.95, 'digita', 0.3, 0.35);
521
+ ev(15.55, 'chicote', 0.5, 0.75); ev(15.95, 'pouso', -0.3, 0.55); ev(16.0, 'digita', -0.3, 0.35);
522
+ })();
523
+
524
+ // ================================================================ 9. FITA (16,8–19,35): onda azul → faixa com texto → pílula → check
525
+ var FT = novaComp('FITA');
526
+ (function () {
527
+ var c = FT;
528
+ var bg = solid(c, 'fundo', '#00010F'); K(O(bg), [[17.15, 0], [17.35, 100]]);
529
+ // onda: traço grosso em S que entra por Trim Paths
530
+ var onda = shape(c, 'onda');
531
+ grupo(onda, 'o');
532
+ var pth = cont(onda, 'o').addProperty('ADBE Vector Shape - Group');
533
+ var s1 = new Shape(); s1.vertices = [[-150, 560], [320, 300], [760, 180], [1250, 420]];
534
+ s1.inTangents = [[0, 0], [-160, 90], [-160, 0], [-150, -90]]; s1.outTangents = [[160, -90], [160, -90], [160, 0], [0, 0]]; s1.closed = false;
535
+ var s2 = new Shape(); s2.vertices = [[-250, 760], [250, 700], [750, 630], [1350, 560]];
536
+ s2.inTangents = [[0, 0], [-160, 20], [-160, 20], [-160, 20]]; s2.outTangents = [[160, -20], [160, -20], [160, -20], [0, 0]]; s2.closed = false;
537
+ K(cont(onda, 'o').property('ADBE Vector Shape - Group').property('ADBE Vector Shape'), [[16.80, s1, 33, 33], [17.20, s1, 40, 10], [17.40, s2, 85, 33]]);
538
+ var tr = cont(onda, 'o').addProperty('ADBE Vector Filter - Trim');
539
+ var stk = cont(onda, 'o').addProperty('ADBE Vector Graphic - Stroke');
540
+ stk = cont(onda, 'o').property('ADBE Vector Graphic - Stroke');
541
+ stk.property('ADBE Vector Stroke Color').setValue(rgb('#1E9BDB'));
542
+ stk.property('ADBE Vector Stroke Line Cap').setValue(1);
543
+ K(stk.property('ADBE Vector Stroke Width'), [[16.80, 120, 33, 33], [17.40, 270, 60, 33]]);
544
+ K(cont(onda, 'o').property('ADBE Vector Filter - Trim').property('ADBE Vector Trim End'), [[16.80, 0, 33, 10], [17.20, 100, 85, 33]]);
545
+ onda.inPoint = 16.78; onda.outPoint = 17.45; mb(onda); P(onda).setValue([0, 0]);
546
+ // faixa reta (null FAIXA gira e desce), com degradê azul e o texto correndo
547
+ var FX = NUL(c, 'FAIXA', [540, 690]);
548
+ K(P(FX), [[17.40, [540, 690], 'a'], [18.10, [540, 660], 'a'], [18.55, [560, 620], 50, 10], [18.62, [585, 520], 'a'], [18.90, [600, 540], 'a'], [19.05, [585, 540], 60, 33]]);
549
+ K(R(FX), [[17.40, -3.5, 'a'], [18.10, -12, 'a'], [18.50, -16, 50, 10], [18.62, -4, 'a'], [18.90, 0, 60, 33]]);
550
+ var fx1 = rr(c, 'faixa', 2400, 270, 0, '#1E9BDB', [0, 0]); filho(fx1, FX, [0, 0]); mb(fx1);
551
+ K(rectProp(fx1, 'r', 'ADBE Vector Rect Size'), [[18.55, [2400, 270], 50, 10], [18.62, [990, 250], 'a'], [18.90, [675, 250], 'a'], [19.00, [450, 250], 'a'], [19.08, [250, 250], 70, 33]]);
552
+ K(rectProp(fx1, 'r', 'ADBE Vector Rect Roundness'), [[18.55, 0], [18.62, 125]]);
553
+ fx1.inPoint = 17.38; fx1.outPoint = 19.12;
554
+ var grd = solid(c, 'degrade', '#000000', 2600, 600); filho(grd, FX, [0, 0]);
555
+ var rp = fx(grd, 'ADBE Ramp'); var rpn = rp.name;
556
+ grd.property('ADBE Effect Parade').property(rpn).property('ADBE Ramp-0001').setValue([400, 300]);
557
+ grd.property('ADBE Effect Parade').property(rpn).property('ADBE Ramp-0002').setValue(rgb('#1784CC'));
558
+ grd.property('ADBE Effect Parade').property(rpn).property('ADBE Ramp-0003').setValue([2200, 300]);
559
+ grd.property('ADBE Effect Parade').property(rpn).property('ADBE Ramp-0004').setValue(rgb('#26BAE1'));
560
+ var mold = rr(c, 'molde faixa', 2400, 270, 0, '#FFFFFF', [0, 0]); filho(mold, FX, [0, 0]);
561
+ K(rectProp(mold, 'r', 'ADBE Vector Rect Size'), [[18.55, [2400, 270], 50, 10], [18.62, [990, 250], 'a'], [18.90, [675, 250], 'a'], [19.00, [450, 250], 'a'], [19.08, [250, 250], 70, 33]]);
562
+ K(rectProp(mold, 'r', 'ADBE Vector Rect Roundness'), [[18.55, 0], [18.62, 125]]);
563
+ grd.moveBefore(fx1); mold.moveBefore(grd); grd.setTrackMatte(mold, TrackMatteType.ALPHA);
564
+ grd.inPoint = mold.inPoint = 17.38; grd.outPoint = mold.outPoint = 19.12;
565
+ var tx = TX(c, TEXTOS.fita, 'SFProDisplay-Bold', 118, '#FFFFFF', [0, 0], ParagraphJustification.LEFT_JUSTIFY); filho(tx, FX, [0, 0]);
566
+ var wtx = caixa(tx).width;
567
+ K(P(tx), [[17.40, [-wtx / 2 + 120, 42], -1, -1], [18.55, [-wtx / 2 - 140, 42], 40, 10], [18.90, [-300, 42], 70, 33]]);
568
+ tx.inPoint = 17.40; tx.outPoint = 19.05; mb(tx);
569
+ // apaga da direita para a esquerda enquanto vira pílula
570
+ var an = tx.property('ADBE Text Properties').property('ADBE Text Animators').addProperty('ADBE Text Animator');
571
+ an.property('ADBE Text Animator Properties').addProperty('ADBE Text Opacity').setValue(0);
572
+ var sl = tx.property('ADBE Text Properties').property('ADBE Text Animators').property(1).property('ADBE Text Selectors').addProperty('ADBE Text Selector');
573
+ K(sl.property('ADBE Text Percent Start'), [[18.55, 100, -1, -1], [19.00, 0, -1, -1]]);
574
+ var mt = rr(c, 'molde texto', 2400, 270, 0, '#FFFFFF', [0, 0]); filho(mt, FX, [0, 0]);
575
+ K(rectProp(mt, 'r', 'ADBE Vector Rect Size'), [[18.55, [2400, 270], 50, 10], [18.62, [990, 250], 'a'], [18.90, [675, 250], 'a'], [19.00, [450, 250], 'a']]);
576
+ tx.moveBefore(mold); mt.moveBefore(tx); tx.setTrackMatte(mt, TrackMatteType.ALPHA); mt.inPoint = 17.38; mt.outPoint = 19.05;
577
+ // círculo: spinner → seta → check
578
+ var cc = circ(c, 'circulo', 250, '#1E9BDB', [585, 540]); cc.inPoint = 19.05; cc.outPoint = 19.45;
579
+ var sp = shape(c, 'spinner'); addEllipse(sp, 's', 110, 110); addStroke(sp, 's', '#FFFFFF', 10);
580
+ var trs = cont(sp, 's').addProperty('ADBE Vector Filter - Trim'); trs = cont(sp, 's').property('ADBE Vector Filter - Trim');
581
+ trs.property('ADBE Vector Trim End').setValue(30); K(trs.property('ADBE Vector Trim Offset'), [[19.05, 0, -1, -1], [19.12, 300, -1, -1]]);
582
+ P(sp).setValue([585, 540]); sp.inPoint = 19.05; sp.outPoint = 19.12;
583
+ var se = shape(c, 'seta'); caminho(se, 'a', [[0, -40], [0, 40]], false); addStroke(se, 'a', '#FFFFFF', 12);
584
+ caminho(se, 'b', [[-30, 12], [0, 42], [30, 12]], false); addStroke(se, 'b', '#FFFFFF', 12);
585
+ P(se).setValue([585, 540]); se.inPoint = 19.12; se.outPoint = 19.18;
586
+ var ck = shape(c, 'check'); caminho(ck, 'c', [[-48, 2], [-14, 36], [50, -32]], false); addStroke(ck, 'c', '#FFFFFF', 16);
587
+ var trc = cont(ck, 'c').addProperty('ADBE Vector Filter - Trim'); K(cont(ck, 'c').property('ADBE Vector Filter - Trim').property('ADBE Vector Trim End'), [[19.18, 0, -1, -1], [19.26, 100, 60, 33]]);
588
+ P(ck).setValue([585, 540]); ck.inPoint = 19.18; ck.outPoint = 19.45;
589
+ var fe = TX(c, TEXTOS.feito, 'SFProText-Medium', 26, '#1E9BDB', [585, 712], ParagraphJustification.CENTER_JUSTIFY); fe.inPoint = 19.22; fe.outPoint = 19.45;
590
+ K(O(fe), [[19.22, 0], [19.28, 100]]);
591
+ ev(16.82, 'viagem', 0.4, 0.75); ev(17.40, 'texto', 0, 0.5); ev(18.55, 'encolhe', 0, 0.55); ev(19.07, 'carregando', 0, 0.4); ev(19.19, 'check', 0, 0.7);
592
+ })();
593
+
594
+ // ================================================================ 10. NAVEGADOR (19,33–28,2): desktop, barra lateral rosa, pastas, arrastar
595
+ var NV = novaComp('JANELA', 1080, 2300);
596
+ var LIN = {}; // y de cada linha da barra lateral (coordenadas da JANELA)
597
+ (function () {
598
+ var c = NV;
599
+ // janela: barra lateral rosa (279–765) e área de conteúdo (765–1200)
600
+ var jan = rr(c, 'janela', 940, 2300, 30, '#D46F8E', [279 + 470, 202 + 1150]); sombra(jan, 35, 20, 60);
601
+ var area = rr(c, 'area conteudo', 440, 2240, 18, '#DB7F9A', [765 + 230, 232 + 1120]);
602
+ var tb = [[300, '#FFFFFF'], [340, '#FFFFFF'], [890, '#FFFFFF'], [930, '#FFFFFF'], [970, '#FFFFFF']];
603
+ for (var i = 0; i < tb.length; i++) { var d = circ(c, 'barra ferramentas ' + i, 16, tb[i][1], [tb[i][0], 232]); O(d).setValue(70); }
604
+ // favoritos: quadrados que nascem e recebem o ícone
605
+ var FAV = ['chatgpt', 'gmail', 'youtube'], FX = [369, 531, 697];
606
+ for (i = 0; i < 3; i++) {
607
+ var q = shape(c, 'favorito ' + i); addRect(q, 'r', 150, 120, 20); addFill(q, 'r', '#EE6F86'); addStroke(q, 'r', '#E8364E', 4); P(q).setValue([FX[i], 330]);
608
+ var t0 = 19.45 + i * F(5);
609
+ K(S(q), [[t0, [0, 0], 33, 10], [t0 + F(6), [100, 100], 85, 33]]);
610
+ var ic = img(c, ICON + FAV[i] + '.png'); ic.name = 'icone ' + FAV[i]; S(ic).setValue([12, 12]); P(ic).setValue([FX[i], 330]);
611
+ K(O(ic), [[19.95 + i * F(5), 0], [19.95 + i * F(5) + F(5), 100]]); K(S(ic), [[19.95 + i * F(5), [6, 6], 33, 10], [19.95 + i * F(5) + F(6), [12, 12], 85, 33]]);
612
+ ev(t0, 'pop', -0.3 + i * 0.3, 0.4);
613
+ }
614
+ var esp = TX(c, TEXTOS.espaco, 'SFProText-Medium', 20, '#F6D2DC', [305, 430]); entra(esp, 20.55, 6, 8, 0);
615
+ // pastas e itens (linhas de 75 px); a pasta Trabalho abre e empurra as outras 3 linhas para baixo
616
+ function linha(nome, txt, icone, y, t, x) {
617
+ var gL = NUL(c, nome, [x || 300, y]);
618
+ var fd = rr(c, nome + ' destaque', 420, 64, 16, '#FFFFFF', [0, 0]); filho(fd, gL, [200, -8]); O(fd).setValue(0);
619
+ var ic2;
620
+ if (icone) { ic2 = img(c, ICON + icone + '.png'); S(ic2).setValue([7, 7]); filho(ic2, gL, [20, -8]); }
621
+ else { ic2 = shape(c, nome + ' pasta'); addRect(ic2, 'r', 30, 24, 5); addStroke(ic2, 'r', '#C61F3E', 3); filho(ic2, gL, [20, -8]); }
622
+ var tx = TX(c, txt, 'SFProText-Medium', 24, '#FFFFFF', [0, 0]); filho(tx, gL, [52, 0]);
623
+ var ks = [ic2, tx];
624
+ for (var k = 0; k < ks.length; k++) { K(O(ks[k]), [[t, 0], [t + F(6), 100]]); }
625
+ K(P(gL), [[t, [x || 300, y + 12], 33, 10], [t + F(6), [x || 300, y], 85, 33]]);
626
+ return { g: gL, fundo: fd, icone: ic2, texto: tx, y: y };
627
+ }
628
+ var Y0 = 520;
629
+ var pastas = [];
630
+ for (i = 0; i < 3; i++) pastas.push(linha('pasta ' + i, TEXTOS.pastas[i], null, Y0 + i * 75, 21.27 + i * F(5)));
631
+ // clique em Trabalho (21,6): destaca e abre os filhos (22,27); as pastas de baixo descem 225 px
632
+ K(O(pastas[0].fundo), [[21.70, 0], [21.80, 100]]);
633
+ for (i = 1; i < 3; i++) { var yy = Y0 + i * 75; P(pastas[i].g).setValueAtTime(22.25, [300, yy]); P(pastas[i].g).setValueAtTime(22.45, [300, yy + 225]); }
634
+ var ICF = ['pinterest', 'figma', 'gmail'], filhos = [];
635
+ for (i = 0; i < 3; i++) filhos.push(linha('filho ' + i, TEXTOS.filhos[i], ICF[i], Y0 + 75 * (i + 1), 22.30 + i * F(3), 330));
636
+ // linha divisória, nova aba e Instagram
637
+ var dv = rr(c, 'divisoria', 400, 3, 1, '#E79AAE', [500, 1060]); K(O(dv), [[22.5, 0], [22.7, 100]]);
638
+ var na = linha('nova aba', '+ ' + TEXTOS.novaAba, null, 1120, 22.55); na.icone.enabled = false; P(na.texto).setValue([12, 0]);
639
+ O(na.texto).expression = 'value*0.7';
640
+ var ins = linha('instagram', TEXTOS.insta, 'instagram', 1195, 22.60);
641
+ // destaques ao passar por Pinterest (23,27), Figma (23,6) e Gmail (24,1)
642
+ var hl = [[0, 23.27, 23.60], [1, 23.60, 24.10], [2, 24.10, 26.20]];
643
+ for (i = 0; i < 3; i++) {
644
+ var f = filhos[hl[i][0]].fundo;
645
+ K(O(f), [[hl[i][1], 0], [hl[i][1] + F(3), 100], [hl[i][2], 100], [hl[i][2] + F(3), 0]]);
646
+ K(O(pastas[0].fundo), [[21.70, 0], [21.80, 100], [23.20, 100], [23.30, 0]]);
647
+ ev(hl[i][1], 'clique', 0.1, 0.45);
648
+ }
649
+ // arrastar o Instagram para "Redes sociais" (24,9–26,6): a linha segue o cursor com atraso
650
+ var yRS = Y0 + 2 * 75 + 225; // y final de "Redes sociais"
651
+ K(P(ins.g), [[22.60, [300, 1207], 33, 10], [22.60 + F(6), [300, 1195], 85, 33], [25.00, [300, 1195], 50, 30], [25.30, [330, 1180], 'a'],
652
+ [26.00, [330, 980], 'a'], [26.45, [320, yRS + 20], 'a'], [26.60, [330, yRS + 75], 70, 33]]);
653
+ K(O(ins.fundo), [[25.00, 0], [25.10, 100], [26.55, 100], [26.70, 0]]);
654
+ K(O(pastas[2].fundo), [[26.45, 0], [26.55, 100], [27.10, 100], [27.25, 60]]);
655
+ ev(25.00, 'clique', 0.1, 0.5); ev(26.56, 'pouso', 0, 0.55); ev(27.0, 'pop', 0, 0.4);
656
+ ev(21.65, 'clique', -0.2, 0.55); ev(22.30, 'abre', 0, 0.45);
657
+ for (i = 0; i < 3; i++) ev(21.27 + i * F(5), 'pop', -0.2, 0.35);
658
+ // painel branco à direita (22,93): prévia do site
659
+ var PV = NUL(c, 'PREVIA', [1400, 820]);
660
+ K(P(PV), [[22.93, [1400, 820], 33, 10], [23.25, [1000, 820], 85, 33], [27.0, [1000, 1100], 33, 33]]);
661
+ var pf = rr(c, 'previa fundo', 420, 900, 18, '#FFFFFF', [0, 0]); filho(pf, PV, [0, 0]);
662
+ for (i = 0; i < 9; i++) { var ln = rr(c, 'previa linha ' + i, i % 3 == 0 ? 160 : 240, 14, 7, '#E5E5EA', [0, 0]); filho(ln, PV, [-60 + (i % 3 == 0 ? -40 : 0), -360 + i * 46]); }
663
+ var pi = img(c, ASSETS + 'galeria-5.png'); S(pi).setValue([45, 30]); filho(pi, PV, [0, 230]);
664
+ var cores = ['#3B82F6', '#22C55E', '#EF4444', '#F5A524', '#3B82F6', '#22C55E', '#EF4444'];
665
+ for (i = 0; i < 7; i++) { var dt = circ(c, 'rotulo ' + i, 22, cores[i], [0, 0]); filho(dt, PV, [170, -240 + i * 60]); K(O(dt), [[24.10, 0], [24.20, 100]]); }
666
+ ev(22.95, 'painel', 0.6, 0.55);
667
+ // texto da janela de trás (à esquerda, cortado)
668
+ var lat = TX(c, TEXTOS.lateral.join('\r\r\r\r\r'), 'SFProDisplay-Bold', 40, '#16213E', [-30, 380]); setLeading(lat, 120); lat.moveToEnd();
669
+ // cursor: seta (desliza) que vira mão ao arrastar
670
+ var cur = shape(c, 'cursor'); caminho(cur, 'c', [[0, 0], [0, 34], [9, 26], [16, 40], [22, 37], [15, 24], [27, 24]], true); addFill(cur, 'c', '#FFFFFF'); addStroke(cur, 'c', '#111111', 2.5);
671
+ K(P(cur), [[20.90, [620, 900], 33, 10], [21.60, [420, 525], 85, 40], [22.20, [430, 540], 'a'], [23.27, [470, 600], 'a'], [23.60, [470, 675], 'a'], [24.10, [470, 750], 'a'],
672
+ [24.90, [420, 1190], 'a'], [25.30, [450, 1175], 'a'], [26.00, [450, 975], 'a'], [26.45, [440, yRS + 15], 'a'], [27.30, [470, yRS + 20], 50, 33]]);
673
+ K(S(cur), [[21.60, [130, 130]], [21.65, [105, 105]], [21.72, [130, 130]], [25.00, [130, 130]], [25.05, [105, 105]], [25.12, [130, 130]]]);
674
+ cur.inPoint = 20.88; mb(cur);
675
+ var maoD = img(c, ASSETS + 'mao-agarra.png'); maoD.name = 'mao arrastando'; S(maoD).setValue([10, 10]); maoD.parent = cur; P(maoD).setValue([10, 10]);
676
+ S(maoD).setValue([8, 8]); maoD.inPoint = 25.0; maoD.outPoint = 26.6;
677
+ })();
678
+ var DK = novaComp('DESKTOP');
679
+ (function () {
680
+ var c = DK;
681
+ var pp = img(c, ASSETS + 'papel-de-parede.png'); S(pp).setValue([52, 52]); P(pp).setValue([540, 540]);
682
+ K(S(pp), [[19.33, [56, 56], 33, 33], [28.17, [52, 52], 33, 33]]);
683
+ var tn = fx(pp, 'ADBE Tint'); pp.property('ADBE Effect Parade').property(tn.name).property('ADBE Tint-0001').setValue(rgb('#06207A'));
684
+ pp.property('ADBE Effect Parade').property(tn.name).property('ADBE Tint-0002').setValue(rgb('#A9D2FF'));
685
+ var j = c.layers.add(NV); j.name = 'JANELA'; mb(j);
686
+ A(j).setValue([540, 0]);
687
+ // câmera do navegador: sobe ~740 px em 7 s, quase sem parar, com degraus a cada ação
688
+ K(P(j), [[19.33, [540, 0], 'a'], [21.0, [540, -110], 'a'], [22.5, [540, -300], 'a'], [24.0, [540, -560], 'a'], [25.5, [540, -700], 'a'], [27.0, [540, -840], 'a'], [28.17, [540, -900], 'a']]);
689
+ P(j).expression = 'wiggle(4, 2)'; // tremida medida 2,2 px RMS
690
+ K(S(j), [[19.33, [100, 100], 33, 33], [28.17, [102, 102], 33, 33]]);
691
+ })();
692
+
693
+ // ================================================================ RECRIACAO (comp final)
694
+ var M = proj.items.addComp('RECRIACAO', W, H, 1, DUR, FPS);
695
+ M.motionBlur = true; M.shutterAngle = 270; M.shutterPhase = -135; M.motionBlurSamplesPerFrame = 16;
696
+ solid(M, 'fundo', '#161616');
697
+ function poe(comp, nome, ini, fim) { var L = M.layers.add(comp); L.name = nome; L.inPoint = ini; L.outPoint = fim; return L; }
698
+ var l1 = poe(P1, 'ANTES', 0, 5.5);
699
+ var l2 = poe(AD, 'ADOBE', 5.5, 7.2);
700
+ var l3 = poe(PN, 'PAINEL', 6.25, 8.0); mb(l3);
701
+ var l4 = poe(GI, 'OBTER INFO', 7.85, F(290));
702
+ var l5 = poe(SP, 'MUSICA', F(290), 13.6);
703
+ var l6 = poe(CT, 'CARTAO', 13.55, 14.32);
704
+ var l7 = poe(TD, 'TRES D', 14.28, 17.45);
705
+ K(blur(l7), [[14.28, 18, 33, 10], [14.45, 0, 85, 33]]);
706
+ var l8 = poe(FT, 'FITA', 16.78, 19.45);
707
+ var l9 = poe(DK, 'DESKTOP', 19.33, DUR);
708
+ // íris de 3 quadros, borda suave de 120 px, centrada no check
709
+ var mk = l9.property('ADBE Mask Parade').addProperty('ADBE Mask Atom');
710
+ var el = new Shape(); var rx = 60, cx = 585, cy = 540, kk = 0.5523 * rx;
711
+ el.vertices = [[cx, cy - rx], [cx + rx, cy], [cx, cy + rx], [cx - rx, cy]];
712
+ el.inTangents = [[-kk, 0], [0, -kk], [kk, 0], [0, kk]]; el.outTangents = [[kk, 0], [0, kk], [-kk, 0], [0, -kk]]; el.closed = true;
713
+ l9.property('ADBE Mask Parade').property(1).property('ADBE Mask Shape').setValue(el);
714
+ l9.property('ADBE Mask Parade').property(1).property('ADBE Mask Feather').setValue([120, 120]);
715
+ K(l9.property('ADBE Mask Parade').property(1).property('ADBE Mask Offset'), [[19.33, -60, 33, 70], [19.43, 900, 20, 33]]);
716
+ ev(19.33, 'iris', 0, 0.7);
717
+ // títulos fixos no topo (antes: branco; depois: cinza escuro, apaga em 8,3–8,9)
718
+ var tA = TX(M, TEXTOS.tituloAntes, 'SFProDisplay-Medium', 84, '#FFFFFF', [540, 140], ParagraphJustification.CENTER_JUSTIFY); tA.outPoint = 5.5;
719
+ var tD = TX(M, TEXTOS.tituloDepois, 'SFProDisplay-Medium', 84, '#3A3A3C', [540, 140], ParagraphJustification.CENTER_JUSTIFY); tD.inPoint = 5.5; tD.outPoint = 9.0;
720
+ K(O(tD), [[8.30, 100], [8.90, 0]]);
721
+ var fim = solid(M, 'escurece', '#000000'); fim.inPoint = 27.4; K(O(fim), [[27.50, 0], [28.15, 100]]); fim.moveToBeginning();
722
+ ev(27.5, 'sai', 0, 0.35);
723
+
724
+ // ================================================================ salvar e eventos de som
725
+ EVENTOS.sort(function (a, b) { return a.t - b.t; });
726
+ var out = new File(BASE.fsName + '/audio/eventos.json');
727
+ out.encoding = 'UTF-8'; out.open('w');
728
+ var linhas = [];
729
+ for (var q = 0; q < EVENTOS.length; q++) { var e = EVENTOS[q]; linhas.push('{"t": ' + e.t + ', "kind": "' + e.kind + '", "pan": ' + (Math.round(e.pan * 100) / 100) + ', "v": ' + e.v + '}'); }
730
+ out.write('{"dur": ' + Math.round(DUR * 1000) / 1000 + ', "events": [\n' + linhas.join(',\n') + '\n]}\n'); out.close();
731
+ proj.save(new File(BASE.fsName + '/ae/trust-process.aep'));
732
+ return 'ok: ' + M.numLayers + ' camadas, ' + EVENTOS.length + ' eventos';
733
+ })();