primocode 10.16.0 → 10.17.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 (234) hide show
  1. package/LICENSES/edit-ia-pro.txt +32 -0
  2. package/LICENSES/fontes-OFL.txt +476 -0
  3. package/LICENSES/hyperframes-Apache-2.0.txt +205 -0
  4. package/LICENSES/permanent-marker-Apache-2.0.txt +204 -0
  5. package/LICENSES/selfie-multiclass-Apache-2.0.txt +227 -0
  6. package/LICENSES/three-MIT.txt +23 -0
  7. package/LICENSES/video-use-MIT.txt +24 -0
  8. package/LICENSES/woven-sfx-CC0.txt +16 -0
  9. package/LICENSES/yunet-MIT.txt +21 -0
  10. package/README.md +2 -2
  11. package/bin/primocode.js +11 -2
  12. package/editor/LICENSE.md +11 -0
  13. package/editor/README.md +321 -0
  14. package/editor/SKILL.md +307 -0
  15. package/editor/THIRD_PARTY_NOTICES.md +228 -0
  16. package/editor/assets/baixar.json +591 -0
  17. package/editor/assets/fonts/anton/OFL.txt +93 -0
  18. package/editor/assets/fonts/caveat/OFL.txt +93 -0
  19. package/editor/assets/fonts/figtree/OFL.txt +93 -0
  20. package/editor/assets/fonts/fonts.json +10 -0
  21. package/editor/assets/fonts/montserrat/OFL.txt +93 -0
  22. package/editor/assets/fonts/permanentmarker/LICENSE.txt +202 -0
  23. package/editor/assets/models/SELFIE_MULTICLASS_LICENSE.txt +227 -0
  24. package/editor/assets/models/YUNET_LICENSE.txt +21 -0
  25. package/editor/assets/sfx/licencas/bass_drop.txt +32 -0
  26. package/editor/assets/sfx/licencas/cash.txt +76 -0
  27. package/editor/assets/sfx/licencas/charge.txt +31 -0
  28. package/editor/assets/sfx/licencas/click.txt +46 -0
  29. package/editor/assets/sfx/licencas/coin.txt +50 -0
  30. package/editor/assets/sfx/licencas/count.txt +47 -0
  31. package/editor/assets/sfx/licencas/data.txt +31 -0
  32. package/editor/assets/sfx/licencas/error.txt +32 -0
  33. package/editor/assets/sfx/licencas/flash.txt +31 -0
  34. package/editor/assets/sfx/licencas/gears.txt +82 -0
  35. package/editor/assets/sfx/licencas/keyboard.txt +48 -0
  36. package/editor/assets/sfx/licencas/metal_hit.txt +62 -0
  37. package/editor/assets/sfx/licencas/metal_riser.txt +61 -0
  38. package/editor/assets/sfx/licencas/mouse_click.txt +50 -0
  39. package/editor/assets/sfx/licencas/notification.txt +54 -0
  40. package/editor/assets/sfx/licencas/pop.txt +38 -0
  41. package/editor/assets/sfx/licencas/rewind.txt +32 -0
  42. package/editor/assets/sfx/licencas/rise.txt +46 -0
  43. package/editor/assets/sfx/licencas/sinteticos.txt +21 -0
  44. package/editor/assets/sfx/licencas/snap.txt +50 -0
  45. package/editor/assets/sfx/licencas/success.txt +40 -0
  46. package/editor/assets/sfx/licencas/synth_hit.txt +32 -0
  47. package/editor/assets/sfx/licencas/tick.txt +14 -0
  48. package/editor/assets/sfx/licencas/whoosh.txt +47 -0
  49. package/editor/assets/sfx/licencas/wind.txt +31 -0
  50. package/editor/assets/sfx/sfx.json +832 -0
  51. package/editor/assets/sfx/sfx_sinteticos.json +317 -0
  52. package/editor/assets/sfx/sfx_woven.json +387 -0
  53. package/editor/assets/sfx/woven/LICENCA.md +16 -0
  54. package/editor/fichas/briefing-do-video.md +45 -0
  55. package/editor/fichas/conferencia-da-amostra.md +56 -0
  56. package/editor/fichas/matriz-de-ganchos.csv +3 -0
  57. package/editor/fichas/padrao.json +16 -0
  58. package/editor/fichas/planilha-de-cenas.csv +4 -0
  59. package/editor/fichas/planilha-de-versoes.csv +4 -0
  60. package/editor/fichas/plano-em-blocos.md +32 -0
  61. package/editor/fichas/registro-de-materiais.json +27 -0
  62. package/editor/helpers/assets_ocr/ocr_vision.swift +41 -0
  63. package/editor/helpers/bordas_precisas.py +272 -0
  64. package/editor/helpers/camera_viva.py +426 -0
  65. package/editor/helpers/captions.py +601 -0
  66. package/editor/helpers/common.py +308 -0
  67. package/editor/helpers/compose_final.py +3555 -0
  68. package/editor/helpers/conferir_corte.py +234 -0
  69. package/editor/helpers/conferir_dados.py +405 -0
  70. package/editor/helpers/contact_sheet.py +282 -0
  71. package/editor/helpers/corte_por_onda.py +433 -0
  72. package/editor/helpers/corte_seco.py +595 -0
  73. package/editor/helpers/denoise.py +971 -0
  74. package/editor/helpers/efeitos.py +408 -0
  75. package/editor/helpers/efeitos_gerar.py +159 -0
  76. package/editor/helpers/elevenlabs_api.py +442 -0
  77. package/editor/helpers/face_layout.py +570 -0
  78. package/editor/helpers/fetch_images.py +423 -0
  79. package/editor/helpers/ganho_por_trecho.py +214 -0
  80. package/editor/helpers/gen_image.py +312 -0
  81. package/editor/helpers/gen_music.py +316 -0
  82. package/editor/helpers/gen_sfx.py +148 -0
  83. package/editor/helpers/grade.py +307 -0
  84. package/editor/helpers/icloud.py +119 -0
  85. package/editor/helpers/make_sfx.py +940 -0
  86. package/editor/helpers/matte.py +1342 -0
  87. package/editor/helpers/medir_referencia.py +2232 -0
  88. package/editor/helpers/mixar_trilha.py +354 -0
  89. package/editor/helpers/montar_corte.py +295 -0
  90. package/editor/helpers/motion/__init__.py +13 -0
  91. package/editor/helpers/motion/engine.py +1915 -0
  92. package/editor/helpers/motion/registry.py +510 -0
  93. package/editor/helpers/motion/render.py +665 -0
  94. package/editor/helpers/motion/templates/barra_progresso.py +370 -0
  95. package/editor/helpers/motion/templates/carimbo.py +132 -0
  96. package/editor/helpers/motion/templates/checklist.py +271 -0
  97. package/editor/helpers/motion/templates/comentario_cta.py +380 -0
  98. package/editor/helpers/motion/templates/contador.py +222 -0
  99. package/editor/helpers/motion/templates/destaque.py +263 -0
  100. package/editor/helpers/motion/templates/etiqueta_preco.py +461 -0
  101. package/editor/helpers/motion/templates/grafico_barras.py +510 -0
  102. package/editor/helpers/motion/templates/grafico_linha.py +462 -0
  103. package/editor/helpers/motion/templates/notificacao.py +266 -0
  104. package/editor/helpers/motion/templates/palavra_impacto.py +410 -0
  105. package/editor/helpers/motion/templates/passos.py +321 -0
  106. package/editor/helpers/motion/templates/riscado.py +298 -0
  107. package/editor/helpers/motion/templates/selo_garantia.py +150 -0
  108. package/editor/helpers/motion_render.py +241 -0
  109. package/editor/helpers/motion_sugerir.py +961 -0
  110. package/editor/helpers/noise_check.py +134 -0
  111. package/editor/helpers/pack_transcripts.py +223 -0
  112. package/editor/helpers/palavras_na_onda.py +176 -0
  113. package/editor/helpers/plano_sfx.py +839 -0
  114. package/editor/helpers/portao.py +427 -0
  115. package/editor/helpers/preview_server.py +1177 -0
  116. package/editor/helpers/rastrear_rosto.py +298 -0
  117. package/editor/helpers/render_cut.py +1256 -0
  118. package/editor/helpers/respiros.py +89 -0
  119. package/editor/helpers/sincronizar_cameras.py +571 -0
  120. package/editor/helpers/speech_regions.py +423 -0
  121. package/editor/helpers/style_catalog.json +231 -0
  122. package/editor/helpers/style_samples.py +246 -0
  123. package/editor/helpers/tela_verde.py +2113 -0
  124. package/editor/helpers/text_render.py +2059 -0
  125. package/editor/helpers/texto_na_tela.py +366 -0
  126. package/editor/helpers/timeline_view.py +292 -0
  127. package/editor/helpers/tira_de_quadros.py +113 -0
  128. package/editor/helpers/transcribe.py +734 -0
  129. package/editor/helpers/transcribe_batch.py +129 -0
  130. package/editor/helpers/trilhas.py +1146 -0
  131. package/editor/helpers/trilhas_humores.json +66 -0
  132. package/editor/helpers/valores.py +187 -0
  133. package/editor/helpers/verify_cut.py +820 -0
  134. package/editor/helpers/voice_levels.py +233 -0
  135. package/editor/helpers/voz_check.py +386 -0
  136. package/editor/helpers/voz_limpa.py +81 -0
  137. package/editor/helpers/watch_preview.py +372 -0
  138. package/editor/modelo-projeto/LEIA.md +402 -0
  139. package/editor/modelo-projeto/assets/fontes/OFL-Caveat.txt +93 -0
  140. package/editor/modelo-projeto/assets/fontes/OFL-JetBrainsMono.txt +93 -0
  141. package/editor/modelo-projeto/assets/fontes/OFL-Montserrat.txt +93 -0
  142. package/editor/modelo-projeto/assets/fontes/larguras.json +1 -0
  143. package/editor/modelo-projeto/assets/three/BufferGeometryUtils.js +1438 -0
  144. package/editor/modelo-projeto/assets/three/GLTFLoader.js +4895 -0
  145. package/editor/modelo-projeto/assets/three/LICENSE +21 -0
  146. package/editor/modelo-projeto/assets/three/ORIGEM.txt +17 -0
  147. package/editor/modelo-projeto/assets/three/RoomEnvironment.js +185 -0
  148. package/editor/modelo-projeto/assets/three/three.core.min.js +6 -0
  149. package/editor/modelo-projeto/assets/three/three.module.min.js +6 -0
  150. package/editor/modelo-projeto/build.py +4828 -0
  151. package/editor/modelo-projeto/compositions/cenas/2d/k2d_antes_depois.html +199 -0
  152. package/editor/modelo-projeto/compositions/cenas/2d/k2d_arquivo.html +232 -0
  153. package/editor/modelo-projeto/compositions/cenas/2d/k2d_busca.html +315 -0
  154. package/editor/modelo-projeto/compositions/cenas/2d/k2d_comando.html +304 -0
  155. package/editor/modelo-projeto/compositions/cenas/2d/k2d_conversa.html +217 -0
  156. package/editor/modelo-projeto/compositions/cenas/2d/k2d_esquema.html +289 -0
  157. package/editor/modelo-projeto/compositions/cenas/2d/k2d_medidor.html +249 -0
  158. package/editor/modelo-projeto/compositions/cenas/2d/k2d_notas.html +233 -0
  159. package/editor/modelo-projeto/compositions/cenas/3d/k3d_caminho.html +197 -0
  160. package/editor/modelo-projeto/compositions/cenas/3d/k3d_explodida.html +152 -0
  161. package/editor/modelo-projeto/compositions/cenas/3d/k3d_tela.html +167 -0
  162. package/editor/modelo-projeto/compositions/cenas/3d/k3d_volume.html +124 -0
  163. package/editor/modelo-projeto/compositions/cenas/3d/motor-three.js +728 -0
  164. package/editor/modelo-projeto/compositions/cenas/LEIA.md +177 -0
  165. package/editor/modelo-projeto/ferramentas/medir_fontes.py +65 -0
  166. package/editor/modelo-projeto/ferramentas/pessoa_recortada.py +176 -0
  167. package/editor/modelo-projeto/ferramentas/rastrear_maos.py +189 -0
  168. package/editor/modelo-projeto/hyperframes.json +12 -0
  169. package/editor/modelo-projeto/package.json +11 -0
  170. package/editor/modelo-projeto/projeto.json +16 -0
  171. package/editor/preview/app.css +1009 -0
  172. package/editor/preview/app.js +2122 -0
  173. package/editor/preview/index.html +307 -0
  174. package/editor/pyproject.toml +23 -0
  175. package/editor/references/3d.md +236 -0
  176. package/editor/references/animacao-catalogo.md +672 -0
  177. package/editor/references/animacao.md +498 -0
  178. package/editor/references/comandos.md +92 -0
  179. package/editor/references/corte-seco-como-funciona.md +50 -0
  180. package/editor/references/corte-seco.md +88 -0
  181. package/editor/references/corte.md +290 -0
  182. package/editor/references/direcao-por-blocos.md +218 -0
  183. package/editor/references/enquadramento.md +654 -0
  184. package/editor/references/estilos-prontos.md +355 -0
  185. package/editor/references/estudio.md +100 -0
  186. package/editor/references/exemplo-eventos.json +67 -0
  187. package/editor/references/lettering.md +252 -0
  188. package/editor/references/modelos.md +494 -0
  189. package/editor/references/phase2.md +1007 -0
  190. package/editor/references/referencia-aplicar.md +203 -0
  191. package/editor/references/referencia-medir.md +375 -0
  192. package/editor/references/revisao.md +335 -0
  193. package/editor/references/som-e-trilha.md +146 -0
  194. package/editor/references/tabela-de-sons.md +130 -0
  195. package/editor/references/variacoes.md +234 -0
  196. package/editor/uv.lock +1141 -0
  197. package/lib/act.js +36 -8
  198. package/lib/catalogo.js +4 -0
  199. package/lib/chamada-torta.js +81 -0
  200. package/lib/editor-pro.js +786 -0
  201. package/lib/entrega.js +58 -0
  202. package/lib/estudio/conferencia-visual.js +76 -0
  203. package/lib/estudio/diretor.js +6 -1
  204. package/lib/estudio/exportar.js +3 -1
  205. package/lib/estudio/gosto.js +45 -4
  206. package/lib/estudio/index.js +8 -5
  207. package/lib/estudio/kit-ae/base.jsx +119 -13
  208. package/lib/estudio/kit-ae/cenas.jsx +47 -15
  209. package/lib/estudio/kit-ae/guarda.jsx +274 -0
  210. package/lib/estudio/kit-ae/primitivas.jsx +180 -24
  211. package/lib/estudio/maquina-diretor.js +61 -7
  212. package/lib/estudio/maquina-foto.js +177 -0
  213. package/lib/estudio/maquina-guarda.js +207 -0
  214. package/lib/estudio/maquina-layout.js +22 -1
  215. package/lib/estudio/maquina.js +60 -11
  216. package/lib/estudio/referencias.js +1 -1
  217. package/lib/estudio/visao/visao.swift +97 -0
  218. package/lib/estudio/visao.js +60 -0
  219. package/lib/local/cerebro.json +192 -6
  220. package/lib/local/motor.js +5 -2
  221. package/lib/nuvem.js +11 -1
  222. package/lib/passagem.js +50 -0
  223. package/lib/perigo.js +19 -11
  224. package/lib/protecao.js +134 -0
  225. package/lib/titulo-conversa.js +46 -0
  226. package/lib/tools.js +3 -0
  227. package/lib/ui.js +1 -1
  228. package/package.json +3 -2
  229. package/skills/editar-meu-video/SKILL.md +6 -2
  230. package/skills/editar-video/SKILL.md +113 -0
  231. package/studio/pessoa.py +52 -0
  232. package/voz/primo_voz/app.py +43 -4
  233. package/voz/primo_voz/chat.html +17 -6
  234. package/voz/primo_voz/painel_dados.py +134 -0
@@ -0,0 +1,252 @@
1
+ # Lettering: texto com ordem de leitura
2
+
3
+ Lettering é decisão de edição, não uma segunda legenda. Você escolhe a palavra ou a frase que muda a leitura do
4
+ vídeo, dá a ela o peso certo e faz o movimento reforçar o que ela diz. Serve para destaque de frase forte,
5
+ título animado, texto em camadas e chamada. Serve também para arrumar um lettering existente em que tudo pesa
6
+ igual.
7
+
8
+ Leia junto: `references/animacao.md` (tempo da palavra e cena própria) e `references/enquadramento.md` (rosto,
9
+ zona segura e texto atrás da pessoa).
10
+
11
+ ## O estilo que o André já aprovou
12
+
13
+ O André tem um lettering aprovado, guardado na skill `lettering-reels` (quando ela está instalada). É um
14
+ ponto de partida bom para Reels e anúncio dele e da Vit:
15
+
16
+ - cada frase vira uma tela de 2 a 4 linhas, centralizada, com as palavras entrando no tempo da fala;
17
+ - a palavra que manda em Montserrat 900 grande, lilás (ou rosa; laranja para urgência), contorno escuro forte,
18
+ levemente inclinada, entrando com uma batida;
19
+ - o miolo da frase em Montserrat 900 branca, caixa alta, contorno forte;
20
+ - conectivos e complementos à mão, em Caveat amarela, minúsculas;
21
+ - a frase sobe e some quando começa a próxima;
22
+ - "modo leve" (palavras só sobem e aparecem, sem batida) para vídeo mais emocional.
23
+
24
+ Nesse estilo o lettering escreve a própria fala, então a legenda não repete o que está escrito grande: ou sai
25
+ daquele trecho, ou (legenda `discreta`, com `legenda_junto`) continua só nas palavras que não estão grandes. A hierarquia continua
26
+ valendo: a palavra lilás é a principal, a branca é apoio, a amarela é ligação. Dentro do projeto HyperFrames, a
27
+ peça `lettering` (seção abaixo) faz esse trabalho; um visual que ela não faz vira cena própria. A skill
28
+ `lettering-reels` é outro caminho (gera arquivo transparente para o CapCut) e não precisa ser chamada aqui.
29
+
30
+ Se a pessoa tem outra marca, outro estilo pedido ou uma referência medida, siga isso. O estilo do André é
31
+ opção, não obrigação.
32
+
33
+ ## O que escrever
34
+
35
+ - O pedaço exato da fala. Números, negações, condições, termos técnicos e acentos como foram ditos.
36
+ - Paráfrase curta só se não muda a afirmação. Cortar muleta ("né", "tipo") pode.
37
+ - Nunca benefício, resultado, oferta, número ou função que não foram ditos.
38
+ - Quantidade:
39
+ - destaque de frases fortes: 2 a 4 expressões por trecho, formando um raciocínio completo (menos, se a
40
+ gravação não oferece tantas);
41
+ - anúncio com prova na tela: no máximo duas ideias escritas;
42
+ - corte de conversa ou podcast: uma ou duas expressões.
43
+
44
+ ## Três papéis
45
+
46
+ Todo texto na tela tem um papel. Classifique antes de desenhar.
47
+
48
+ | papel | o que é | como aparece |
49
+ |---|---|---|
50
+ | principal | a ideia que manda naquele instante | maior, mais peso, mais contraste, no lugar mais forte |
51
+ | apoio | um complemento curto e indispensável | menor, mais leve, ao lado do principal |
52
+ | chamada | o convite à ação | no fim, com o texto inteiro legível antes de sair |
53
+
54
+ - Só uma ideia principal na tela. Ao lado dela, no máximo um apoio breve.
55
+ - O olho chega primeiro no principal pela escala, pelo peso, pelo lugar e pelo contraste. Não por animação forte
56
+ em tudo.
57
+ - A ordem também é de tempo: o principal termina de chegar antes de o apoio começar. Enquanto o principal muda,
58
+ o apoio fica parado.
59
+ - Tempo de leitura depois que o texto está completo: pelo menos 1 s para até 4 palavras e uns 0,3 s por palavra
60
+ a mais. Se não dá para ler sem pausar o vídeo, aumente a permanência ou diminua o texto.
61
+ - No fim do vídeo o tempo de leitura vence o corte seco: quando a frase escrita termina na última palavra, o
62
+ `segura_fim` do `projeto.json` segura a tela depois da fala (nunca um respiro deixado no corte). A última
63
+ expressão fica legível até o último quadro.
64
+ - Em fala rápida, conte o tempo antes de escolher as expressões: cada uma ocupa uns 2 s (chegar, 1 s de leitura e
65
+ sair) e a próxima entra na palavra dela. Em 10 s de fala rápida cabem 3. Quando não cabe, tire uma ou junte duas
66
+ numa peça só (a segunda vira o apoio); o build avisa qual expressão fica sem tempo.
67
+
68
+ ## A peça `lettering` do projeto
69
+
70
+ No `projeto.json`, em `animacoes`, uma peça por tela de texto grande:
71
+
72
+ ```json
73
+ {"id": "sozinho", "tipo": "lettering", "principal": "Editou *sozinho*", "apoio": "enquanto eu gravava o próximo",
74
+ "chamada": "Veja como", "em": "editou", "sai": "próximo", "posicao": "topo", "estilo": "bloco"}
75
+ ```
76
+
77
+ `principal` é obrigatório; `apoio` e `chamada` são opcionais; `em` e `sai` são a palavra ou o segundo; `posicao`
78
+ é `topo`, `meio` ou `base` (sem ela, a primeira que não cobre o rosto, nessa ordem); `estilo` é `bloco` (Montserrat
79
+ 900, caixa alta, contorno forte) ou `manuscrito` (Caveat, à mão). Os outros campos e o código estão no
80
+ `references/animacao-catalogo.md`, peça 12.
81
+
82
+ O que a peça garante, sem você escrever nada:
83
+
84
+ - a ordem de leitura: o principal chega primeiro e maior, o apoio só depois que ele terminou, a chamada por último;
85
+ - cada palavra na hora em que é dita: o principal e o apoio entram palavra por palavra, no tempo medido na onda
86
+ quando existe o `palavras_onda.json` do corte (`helpers/palavras_na_onda.py`, e não no do Whisper), antecipando no
87
+ máximo 0,15 s; as letras de cada palavra aparecem dentro do tempo em que ela é dita;
88
+ - a letra por letra por grafema (o acento junto da letra), com a linha já montada no lugar final;
89
+ - nenhum quadro que mude o sentido: número inteiro de uma vez (com "R$", "mil", "%"), negação solta junto da palavra
90
+ de antes;
91
+ - o encaixe na ordem desta página: largura medida com a fonte de verdade no peso usado
92
+ (`modelo-projeto/assets/fontes/larguras.json`), até 3 palavras grandes por vez, quebra por sentido em até 3
93
+ linhas, dois momentos (duas telas) quando passa de 3 palavras, e a letra menor só por último, até caber sem
94
+ cobrir o rosto;
95
+ - a fonte carregada antes de medir, também na página (a timeline é montada depois do `document.fonts.ready`);
96
+ - a legenda escondida no trecho, ou, com `legenda_junto` (o padrão quando a legenda é `discreta`), a legenda
97
+ continuando nas palavras que não estão escritas grandes naquele instante;
98
+ - a última expressão legível até o último quadro, quando o `sai` é o fim do corte (também no `segura_fim`);
99
+ - o aviso quando o texto completo não fica tempo suficiente para ser lido, dizendo se dá para atrasar o `sai` ou se
100
+ é preciso tirar uma expressão ou juntar duas;
101
+ - o som de cada entrada: pop suave na batida do principal (um pouco mais forte na conclusão, a última expressão do
102
+ vídeo), pop baixo no pouso do apoio, pop na chamada;
103
+ - uma linha `nota:` com o tamanho da letra e por que não foi maior (a largura ou o rosto).
104
+
105
+ O que continua com você: escolher as expressões (o pedaço exato da fala, 2 a 4 por trecho), o papel de cada
106
+ texto, o momento e o estilo. Um movimento que ela não faz (trocar uma palavra por outra no mesmo lugar, duas
107
+ opções frente a frente) é cena própria, com as regras desta página.
108
+
109
+ ## Legenda e lettering
110
+
111
+ - A legenda fica na região dela (no peito) e acompanha a fala, com até 3 palavras por vez numa linha: é o
112
+ `legenda.max_palavras` 3 do projeto (o `max_letras` quebra antes quando as palavras são longas). Mais que
113
+ isso já é lettering, e vira decisão de hierarquia, não legenda.
114
+ - Lettering só nas palavras que mudam o jeito de entender a frase.
115
+ - Uma frase nunca aparece escrita grande duas vezes (lettering e legenda juntos). Onde o lettering escreve a fala, a
116
+ legenda sai daquele trecho, ou continua sem as palavras escritas grandes. Na peça `lettering` o build faz isso
117
+ sozinho: com a legenda `discreta`, o padrão é `"legenda_junto": true` (a legenda segue nas palavras que não estão
118
+ grandes, e a fala não fica sem texto enquanto a letra grande é lida); com a legenda `padrao` (grande), a legenda
119
+ sai do trecho. Numa cena própria: `"esconde_legenda": true` ou `"legenda": {"esconder": [[de, ate]]}`.
120
+ - Nenhuma palavra dita some da legenda: a frase é dividida por sentido ("Eu gravei" / "esse vídeo" / "uma vez só,")
121
+ e a palavra que ficaria piscando sozinha junta com a vizinha.
122
+ - Rosto livre (olhos e boca) e zona segura do Reels: texto entre y 230 e 1530 e entre x 140 e 940 no 9:16.
123
+
124
+ ## Fonte
125
+
126
+ - Escolha pela identidade da pessoa, pelo tamanho da frase e pelo tamanho na tela. Condensada (Anton, Bebas
127
+ Neue) serve a título curto, não a tudo. Nunca comprima a letra na horizontal para caber.
128
+ - Fonte local em arquivo, com licença que cubra o uso. As do modelo (Montserrat, Caveat, JetBrains Mono) são
129
+ OFL e estão em `modelo-projeto/assets/fontes/`.
130
+ - Confira se a fonte tem os caracteres do português antes de usar:
131
+
132
+ ```python
133
+ # uv run --directory "<SKILL>" python checar_fonte.py '<caminho completo da fonte>'
134
+ import sys
135
+ from PIL import ImageFont
136
+ f = ImageFont.truetype(sys.argv[1], 80)
137
+ vazio = bytes(f.getmask("￿")) # desenho de caractere que não existe
138
+ faltam = [c for c in "ãõçáéíóúâêôàÃÕÇÁÉÍÓÚÂÊÔÀ" if bytes(f.getmask(c)) == vazio]
139
+ print("faltam:", "".join(faltam) or "nada")
140
+ ```
141
+
142
+ - Cada peso usado precisa existir em arquivo (ou a fonte ser variável com esse peso).
143
+ - Carregue antes de medir e antes do render: `@font-face` com o arquivo. Fonte do sistema não carrega no
144
+ navegador do render.
145
+ - Faltou a fonte pedida: escolha uma substituta pela função (mesma largura, mesmo peso), confira as quebras de
146
+ novo e diga a troca na entrega.
147
+
148
+ ## Movimento pelo que a frase quer dizer
149
+
150
+ Escolha o movimento pelo sentido:
151
+
152
+ - **revelar uma conclusão:** a frase monta e a última palavra chega com mais peso;
153
+ - **montar uma ideia:** pedaços que se juntam numa frase só;
154
+ - **trocar uma palavra por outra:** a palavra velha sai inteira e a nova entra no lugar;
155
+ - **pôr duas opções frente a frente:** os dois lados na mesma escala, a diferença em destaque.
156
+
157
+ Fases: um preparo curto, a transformação que dá para entender, uma pausa para ler e a saída, que libera a tela
158
+ para o próximo. Às vezes uma fase é tão curta que nem se nota. Entradas que funcionam: crescer, surgir aos poucos,
159
+ deslizar um pouco. Sem ricochete forte (`elastic`, `back` exagerado) em frase longa ou em informação que precisa
160
+ ser lida na hora.
161
+
162
+ ## Sincronia
163
+
164
+ - Pela fala real, com a transcrição do corte (`python3 build.py palavras`). Pode antecipar até 0,15 s. A
165
+ transcrição adianta o começo da palavra até 0,3 s: a palavra que manda (a batida da palavra lilás, o pouso
166
+ de uma palavra grande) entra no tempo medido na onda, com `helpers/palavras_na_onda.py` (`references/corte.md`,
167
+ passo 6), posto em segundos no `projeto.json` ou na cena.
168
+ - Com várias palavras, cada uma entra no tempo dela, não a expressão inteira de uma vez no começo: "GAGUEJEI"
169
+ escrito inteiro 0,36 s antes de ser dito é texto adiantado. A peça `lettering` faz isso sozinha; numa cena
170
+ própria, use o tempo de cada palavra das `palavras` do trecho.
171
+ - Nunca escreva antes o que a pessoa ainda vai desmentir no fim da frase.
172
+ - A negação entra junto ou antes da palavra que ela nega. "PRECISA" sozinho na tela por meio segundo, antes do
173
+ "NÃO", diz o contrário do que ela falou.
174
+ - Efeito de digitação: o tempo de leitura só começa quando a frase está completa.
175
+
176
+ ## Encaixe de frase longa
177
+
178
+ Desça a lista de cima para baixo e pare no primeiro passo que fizer a frase caber:
179
+
180
+ 1. A conta da largura só vale feita com a letra que vai aparecer: o mesmo arquivo de fonte e o mesmo peso do
181
+ vídeo. Em Python, `ImageFont.truetype(fonte, px).getlength(texto)`. A Montserrat do modelo engana: é variável
182
+ e, se ninguém mexer, é medida no peso 100, bem mais fina que a 900 da tela. Chame antes
183
+ `set_variation_by_axes([900])`; sem isso, uma linha como "EDITA SOZINHO EM 5 MINUTOS" cabe na conta e passa do
184
+ x 940 no render. No navegador, a medida só acontece depois que `document.fonts.ready` resolve, e a timeline é
185
+ montada por último (regra da `hyperframes-core`).
186
+ 2. Dê largura ao bloco: no 9:16 são até 800 px (x 140 a 940).
187
+ 3. Quebre por unidade de sentido. Não separe artigo do nome, número da unidade, "não" do verbo.
188
+ 4. Redistribua as linhas ou divida a frase em dois momentos (duas telas).
189
+ 5. Encurte só preservando o conteúdo autorizado. Nome, valor dito, negação e condição nunca somem.
190
+ 6. Só então diminua a letra. Abaixo do tamanho da legenda (60 px no 9:16) já não funciona como lettering.
191
+ 7. Confira máscara, contorno e sombra com a linha mais alta, inclusive com acento em cima (Á, É, Ã) e cedilha
192
+ embaixo (Ç). Nada mordido.
193
+
194
+ ## Animação letra por letra
195
+
196
+ - Separe por caractere que se vê, não por código. Normalize e use o `Intl.Segmenter`. `[...texto]` separa o til
197
+ do A quando o texto veio decomposto, e o acento some ou pula:
198
+
199
+ ```js
200
+ const seg = new Intl.Segmenter("pt", { granularity: "grapheme" });
201
+ const letras = [...seg.segment(texto.normalize("NFC"))].map(s => s.segment); // "NÃO" vira N, Ã, O
202
+ ```
203
+
204
+ - Espaços e quebras não podem sumir. Ponha cada palavra num `<span>` com `white-space: nowrap` e as letras dentro
205
+ dela; entre as palavras, o espaço normal.
206
+ - Ancoragem: monte a linha inteira com todas as letras já no lugar final, invisíveis (`opacity: 0`), e só revele.
207
+ Linha que se recentraliza a cada letra nova faz o título andar de lado.
208
+ - Troca de palavra: nenhum quadro no meio da troca pode formar outra palavra, esconder uma negação ou mostrar um
209
+ valor errado. Na dúvida, troque a palavra inteira.
210
+
211
+ ## Texto atrás do corpo
212
+
213
+ Letra passando por trás da pessoa só com o recorte aprovado no teste (`references/enquadramento.md`, "Portão do
214
+ recorte") e alinhado com o vídeo. Sem esse recorte, ponha o texto num espaço vazio ao lado da pessoa ou encostado
215
+ em algo que já está no cenário, e não diga na entrega que tirou o fundo. A palavra escondida em parte tem que continuar
216
+ legível.
217
+
218
+ ## Teste de fundo
219
+
220
+ Confira o texto em cima da parte mais clara e da parte mais cheia de detalhe que passam de verdade naquele
221
+ trecho, não num quadro qualquer. Se some em alguma, mais contorno, sombra ou outro lugar.
222
+
223
+ ## Revisão de hierarquia
224
+
225
+ A queixa costuma vir assim: "tá tudo do mesmo tamanho", "tá pesado", "não sei pra onde olhar". O conserto é por
226
+ papel, não por gosto:
227
+
228
+ - Todo texto da tela ganha um papel: é a legenda da fala, o título que manda naquela tela, um apoio menor ou a
229
+ chamada do fim. O que não tem papel sai, e o que só repete a legenda também.
230
+ - Palavra nova não entra nessa revisão. Na tela fica o que a pessoa falou ou o que ela já aprovou por escrito.
231
+ - Cada papel tem um tamanho, um peso e um lugar, e isso vale do primeiro ao último segundo. Título enorme no gancho
232
+ e miúdo no meio do vídeo é justamente o "tudo igual" ao contrário.
233
+ - Fonte e cores aprovadas ficam, a não ser que atrapalhem a leitura. Fala, cortes e oferta nem entram na conversa.
234
+ - Para ela decidir, mande o mesmo trecho duas vezes, como estava e como ficou, com três ou quatro linhas do que
235
+ mudou. Por exemplo: "o 'EDITADO COM IA' agora é o único texto grande; o 'sem abrir o CapCut' desceu para apoio,
236
+ menor, embaixo dele".
237
+
238
+ ## Conferir
239
+
240
+ No arquivo exportado, olhe três coisas: a frase mais comprida, toda a acentuação e a animação mais trabalhosa.
241
+ Está certo quando:
242
+
243
+ - dá para perceber o que manda numa tela de celular;
244
+ - o texto inteiro se lê sem pausar o vídeo;
245
+ - nenhuma letra sai cortada por máscara, borda ou outra peça;
246
+ - o texto diz o que a pessoa disse, na hora em que ela disse.
247
+
248
+ ## Na entrega
249
+
250
+ Registre as fontes usadas: família, peso, arquivo (caminho relativo ao projeto), origem e licença, e qualquer
251
+ substituição. A fonte só vai junto com os arquivos entregues se a licença deixar redistribuir; fonte comercial
252
+ instalada no computador não vai.