primocode 8.42.2 → 9.0.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 (102) hide show
  1. package/README.md +41 -37
  2. package/bin/primocode.js +598 -360
  3. package/lib/acervo.js +8 -1
  4. package/lib/act.js +205 -114
  5. package/lib/api.js +35 -4
  6. package/lib/boas-vindas.js +31 -192
  7. package/lib/catalogo.js +60 -60
  8. package/lib/config.js +1 -1
  9. package/lib/conta.js +3 -24
  10. package/lib/diff.js +161 -0
  11. package/lib/diretor.js +37 -47
  12. package/lib/entrada.js +545 -0
  13. package/lib/especialistas.js +2 -2
  14. package/lib/estudio/assets.js +343 -0
  15. package/lib/estudio/identidade.js +560 -0
  16. package/lib/estudio/index.js +565 -0
  17. package/lib/estudio/plano.js +327 -0
  18. package/lib/estudio/projeto.js +246 -0
  19. package/lib/estudio/remotion.js +606 -0
  20. package/lib/estudio/slides.js +190 -0
  21. package/lib/estudio/video.js +296 -0
  22. package/lib/fala.js +13 -1
  23. package/lib/marca.js +4 -1
  24. package/lib/marketplace.js +189 -0
  25. package/lib/permissao.js +137 -0
  26. package/lib/registro.js +229 -0
  27. package/lib/skills.js +329 -0
  28. package/lib/tools.js +51 -181
  29. package/lib/ui.js +7 -3
  30. package/lib/voz.js +239 -0
  31. package/package.json +12 -3
  32. package/skills/acessibilidade/SKILL.md +28 -0
  33. package/skills/api-que-nao-quebra/SKILL.md +27 -0
  34. package/skills/depurar-de-verdade/SKILL.md +29 -0
  35. package/skills/editar-meu-video/SKILL.md +59 -0
  36. package/skills/escrever-em-portugues/SKILL.md +28 -0
  37. package/skills/git-limpo/SKILL.md +28 -0
  38. package/skills/motion-de-primeira/SKILL.md +62 -0
  39. package/skills/pagina-que-converte/SKILL.md +28 -0
  40. package/skills/performance-web/SKILL.md +28 -0
  41. package/skills/revisao-antes-de-entregar/SKILL.md +27 -0
  42. package/skills/slides-que-prendem/SKILL.md +40 -0
  43. package/studio/edge.py +16 -66
  44. package/studio/narrar.py +274 -0
  45. package/studio/pessoa.py +167 -0
  46. package/voz/primo_voz/__init__.py +0 -0
  47. package/voz/primo_voz/__main__.py +325 -0
  48. package/voz/primo_voz/escuta.py +235 -0
  49. package/voz/primo_voz/orbe.py +216 -0
  50. package/lib/audio-livre.js +0 -177
  51. package/lib/chaves.js +0 -149
  52. package/lib/claude-engine.js +0 -631
  53. package/lib/codex-engine.js +0 -208
  54. package/lib/remotion.js +0 -663
  55. package/lib/studio.js +0 -960
  56. package/studio/PRIMOCODE.md +0 -58
  57. package/studio/README.md +0 -154
  58. package/studio/__pycache__/edge.cpython-311.pyc +0 -0
  59. package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
  60. package/studio/__pycache__/voz.cpython-311.pyc +0 -0
  61. package/studio/arquivos/corte-teste-de-camera-fb823.json +0 -57
  62. package/studio/ferramentas/00-protocolo.md +0 -125
  63. package/studio/ferramentas/01-modelos.md +0 -270
  64. package/studio/ferramentas/README.md +0 -32
  65. package/studio/ferramentas/corte.md +0 -919
  66. package/studio/ferramentas/grade.md +0 -92
  67. package/studio/ferramentas/prisma.md +0 -107
  68. package/studio/ferramentas/prosa.md +0 -86
  69. package/studio/ferramentas/tela.md +0 -93
  70. package/studio/ferramentas/traco.md +0 -79
  71. package/studio/server.py +0 -2254
  72. package/studio/studio.log +0 -57
  73. package/studio/voz.py +0 -388
  74. package/studio/web/analise.html +0 -52
  75. package/studio/web/core.css +0 -1167
  76. package/studio/web/fontes/bebas.woff2 +0 -0
  77. package/studio/web/fontes/grotesk-700.woff2 +0 -0
  78. package/studio/web/fontes/inter-400.woff2 +0 -0
  79. package/studio/web/fontes/inter-700.woff2 +0 -0
  80. package/studio/web/fontes/jetbrains-400.woff2 +0 -0
  81. package/studio/web/fontes/playfair-700.woff2 +0 -0
  82. package/studio/web/fontes.css +0 -23
  83. package/studio/web/home.html +0 -217
  84. package/studio/web/js/analise.js +0 -510
  85. package/studio/web/js/audio.js +0 -607
  86. package/studio/web/js/editor.js +0 -1802
  87. package/studio/web/js/exportar.js +0 -222
  88. package/studio/web/js/ferramentas.js +0 -108
  89. package/studio/web/js/icones.js +0 -120
  90. package/studio/web/js/midia.js +0 -157
  91. package/studio/web/js/narracao.js +0 -325
  92. package/studio/web/js/player.js +0 -903
  93. package/studio/web/js/render-grade.js +0 -243
  94. package/studio/web/js/render-prosa.js +0 -104
  95. package/studio/web/js/render.js +0 -1852
  96. package/studio/web/js/sfx.js +0 -233
  97. package/studio/web/js/video.js +0 -464
  98. package/studio/web/js/voz-neural.js +0 -152
  99. package/studio/web/render.css +0 -1352
  100. package/studio/web/tf.html +0 -15
  101. package/studio/web/tool.html +0 -78
  102. package/studio/web/view.html +0 -27
@@ -1,1167 +0,0 @@
1
- /* ==========================================================================
2
- PrimoCode Studio — núcleo visual da interface
3
- ========================================================================== */
4
-
5
- :root {
6
- --sans: "Inter", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
7
- --mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
8
-
9
- --preto: #09090b;
10
- --fundo: #0d0d10;
11
- --sup: #141419;
12
- --sup2: #1b1b22;
13
- --sup3: #23232c;
14
- --linha: rgba(255, 255, 255, .085);
15
- --linha2: rgba(255, 255, 255, .16);
16
- --texto: #f1f1f4;
17
- --fraco: #8d8d9a;
18
- --fraco2: #5a5a67;
19
- --primo: #ff5a36;
20
- --primo-suave: rgba(255, 90, 54, .14);
21
-
22
- --r: 10px;
23
- --r2: 14px;
24
- }
25
-
26
- * { box-sizing: border-box; }
27
-
28
- html, body {
29
- margin: 0;
30
- height: 100%;
31
- background: var(--fundo);
32
- color: var(--texto);
33
- font-family: var(--sans);
34
- font-size: 14px;
35
- -webkit-font-smoothing: antialiased;
36
- -moz-osx-font-smoothing: grayscale;
37
- }
38
-
39
- a { color: inherit; text-decoration: none; }
40
- ::selection { background: var(--primo); color: #fff; }
41
-
42
- ::-webkit-scrollbar { width: 10px; height: 10px; }
43
- ::-webkit-scrollbar-thumb { background: #2a2a33; border-radius: 6px; border: 3px solid var(--fundo); }
44
- ::-webkit-scrollbar-thumb:hover { background: #383843; }
45
-
46
- /* ------------------------------------------------------------- primitivas */
47
-
48
- .btn {
49
- display: inline-flex;
50
- align-items: center;
51
- gap: 7px;
52
- height: 32px;
53
- padding: 0 12px;
54
- border: 1px solid var(--linha);
55
- border-radius: var(--r);
56
- background: var(--sup2);
57
- color: var(--texto);
58
- font: 500 13px/1 var(--sans);
59
- cursor: pointer;
60
- white-space: nowrap;
61
- transition: background .14s, border-color .14s, color .14s;
62
- }
63
- .btn:hover { background: var(--sup3); border-color: var(--linha2); }
64
- .btn.primo { background: var(--primo); border-color: transparent; color: #fff; font-weight: 560; }
65
- .btn.primo:hover { background: #ff6f50; }
66
- .btn.vazio { background: transparent; }
67
- .btn.vazio:hover { background: var(--sup2); }
68
- .btn.perigo:hover { color: #ff8a72; border-color: rgba(255, 138, 114, .4); }
69
- .btn svg { width: 15px; height: 15px; }
70
- .btn.so-icone { width: 32px; padding: 0; justify-content: center; }
71
-
72
- .campo {
73
- height: 32px;
74
- padding: 0 10px;
75
- border: 1px solid var(--linha);
76
- border-radius: var(--r);
77
- background: var(--preto);
78
- color: var(--texto);
79
- font: 400 13px/1 var(--sans);
80
- width: 100%;
81
- min-width: 0;
82
- }
83
- .campo:focus { outline: none; border-color: var(--primo); }
84
- select.campo { padding-right: 6px; cursor: pointer; }
85
- textarea.campo { height: auto; padding: 9px 10px; resize: vertical; line-height: 1.5; font-family: var(--sans); }
86
- input[type="color"].campo { padding: 3px; cursor: pointer; height: 32px; }
87
- input[type="range"] { width: 100%; accent-color: var(--primo); }
88
-
89
- .rotulo {
90
- font-size: 10.5px;
91
- font-weight: 600;
92
- letter-spacing: .1em;
93
- text-transform: uppercase;
94
- color: var(--fraco2);
95
- }
96
-
97
- .pilula {
98
- display: inline-flex;
99
- align-items: center;
100
- gap: 6px;
101
- height: 22px;
102
- padding: 0 9px;
103
- border-radius: 999px;
104
- background: var(--sup2);
105
- border: 1px solid var(--linha);
106
- font-size: 11px;
107
- color: var(--fraco);
108
- }
109
-
110
- /* ------------------------------------------------------------------ topo -- */
111
-
112
- .topo {
113
- display: flex;
114
- align-items: center;
115
- gap: 10px;
116
- height: 52px;
117
- padding: 0 14px;
118
- background: var(--sup);
119
- border-bottom: 1px solid var(--linha);
120
- flex: 0 0 auto;
121
- position: relative;
122
- z-index: 20;
123
- overflow: hidden;
124
- }
125
-
126
- .marca {
127
- display: flex;
128
- align-items: center;
129
- gap: 9px;
130
- font-size: 13.5px;
131
- font-weight: 640;
132
- letter-spacing: -.015em;
133
- white-space: nowrap;
134
- }
135
- .marca .cubo {
136
- width: 22px; height: 22px;
137
- border-radius: 7px;
138
- background: linear-gradient(150deg, var(--primo), #ff9a3c);
139
- display: grid; place-items: center;
140
- font-size: 12px; font-weight: 800; color: #1a0a06;
141
- }
142
- .marca em { font-style: normal; color: var(--fraco2); font-weight: 500; }
143
-
144
- .topo .divisor { width: 1px; height: 22px; background: var(--linha); }
145
- .topo .cresce { flex: 1; }
146
-
147
- input.titulo-arq {
148
- background: transparent;
149
- border: 1px solid transparent;
150
- border-radius: 8px;
151
- color: var(--texto);
152
- font: 600 14px/1 var(--sans);
153
- padding: 8px 9px;
154
- min-width: 160px;
155
- max-width: 380px;
156
- flex: 1;
157
- }
158
- input.titulo-arq:hover { border-color: var(--linha); }
159
- input.titulo-arq:focus { outline: none; border-color: var(--primo); background: var(--preto); }
160
-
161
- .estado { font-size: 11.5px; color: var(--fraco2); min-width: 62px; text-align: right; }
162
- .estado.ok { color: #4ade80; }
163
-
164
- /* ----------------------------------------------------------------- home --- */
165
-
166
- .home { max-width: 1080px; margin: 0 auto; padding: 54px 30px 90px; }
167
-
168
- .hero h1 {
169
- font-size: 34px;
170
- font-weight: 660;
171
- letter-spacing: -.035em;
172
- margin: 0 0 10px;
173
- }
174
- .hero p { color: var(--fraco); font-size: 15px; line-height: 1.65; margin: 0 0 34px; max-width: 620px; }
175
-
176
- .grade-ferr {
177
- display: grid;
178
- grid-template-columns: repeat(auto-fill, minmax(238px, 1fr));
179
- gap: 14px;
180
- margin-bottom: 46px;
181
- }
182
-
183
- .cartao-ferr {
184
- position: relative;
185
- border: 1px solid var(--linha);
186
- border-radius: var(--r2);
187
- background: var(--sup);
188
- padding: 20px;
189
- display: flex;
190
- flex-direction: column;
191
- gap: 8px;
192
- cursor: pointer;
193
- overflow: hidden;
194
- transition: border-color .16s, transform .16s, background .16s;
195
- }
196
- .cartao-ferr:hover { border-color: var(--linha2); transform: translateY(-2px); background: var(--sup2); }
197
- .cartao-ferr .icone {
198
- width: 34px; height: 34px;
199
- border-radius: 10px;
200
- display: grid; place-items: center;
201
- margin-bottom: 4px;
202
- }
203
- .cartao-ferr .icone svg { width: 18px; height: 18px; }
204
- .cartao-ferr b { font-size: 15.5px; font-weight: 620; letter-spacing: -.015em; }
205
- .cartao-ferr .papel { font-size: 12px; color: var(--fraco2); }
206
- .cartao-ferr p { margin: 4px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--fraco); }
207
- .cartao-ferr .equiv { margin-top: 10px; font-size: 11px; color: var(--fraco2); }
208
-
209
- .faixa-ia {
210
- border: 1px solid var(--linha);
211
- border-radius: var(--r2);
212
- background:
213
- radial-gradient(600px 200px at 8% 0%, var(--primo-suave), transparent 70%),
214
- var(--sup);
215
- padding: 24px 26px;
216
- margin-bottom: 46px;
217
- }
218
- .faixa-ia h2 { margin: 0 0 6px; font-size: 15px; font-weight: 620; }
219
- .faixa-ia p { margin: 0 0 14px; color: var(--fraco); font-size: 13px; line-height: 1.6; }
220
- .faixa-ia pre {
221
- margin: 0 0 12px;
222
- padding: 14px 16px;
223
- background: var(--preto);
224
- border: 1px solid var(--linha);
225
- border-radius: var(--r);
226
- font: 400 12px/1.6 var(--mono);
227
- color: #ffbba8;
228
- overflow-x: auto;
229
- }
230
- .faixa-ia .acoes { display: flex; gap: 9px; align-items: center; }
231
-
232
- .secao-tit {
233
- font-size: 11px; letter-spacing: .13em; text-transform: uppercase;
234
- color: var(--fraco2); font-weight: 620; margin: 0 0 14px;
235
- }
236
-
237
- .lista-arq { display: grid; gap: 8px; }
238
- .item-arq {
239
- display: flex;
240
- align-items: center;
241
- gap: 12px;
242
- padding: 12px 14px;
243
- border: 1px solid var(--linha);
244
- border-radius: var(--r);
245
- background: var(--sup);
246
- transition: border-color .14s, background .14s;
247
- }
248
- .item-arq:hover { border-color: var(--linha2); background: var(--sup2); }
249
- .item-arq .tag {
250
- width: 26px; height: 26px; border-radius: 8px;
251
- display: grid; place-items: center; flex: 0 0 auto;
252
- }
253
- .item-arq .tag svg { width: 14px; height: 14px; }
254
- .item-arq b { font-size: 13.5px; font-weight: 560; }
255
- .item-arq .meta { font-size: 11.5px; color: var(--fraco2); }
256
- .item-arq .cresce { flex: 1; min-width: 0; }
257
- .vazio-msg { color: var(--fraco2); font-size: 13px; padding: 18px 0; }
258
-
259
- /* --------------------------------------------------------------- editor -- */
260
-
261
- .editor { display: flex; height: calc(100% - 52px); overflow: hidden; }
262
-
263
- /* trilho de inserção */
264
- .trilho {
265
- width: 52px;
266
- background: var(--sup);
267
- border-right: 1px solid var(--linha);
268
- display: flex;
269
- flex-direction: column;
270
- align-items: center;
271
- gap: 4px;
272
- padding: 10px 0;
273
- flex: 0 0 auto;
274
- }
275
- .trilho button {
276
- width: 36px; height: 36px;
277
- border: 1px solid transparent;
278
- border-radius: var(--r);
279
- background: transparent;
280
- color: var(--fraco);
281
- display: grid; place-items: center;
282
- cursor: pointer;
283
- transition: background .14s, color .14s;
284
- }
285
- .trilho button:hover { background: var(--sup3); color: var(--texto); }
286
- .trilho button.ativo { background: var(--primo-suave); color: var(--primo); }
287
- .trilho button svg { width: 17px; height: 17px; }
288
- .trilho .esp { height: 8px; }
289
-
290
- /* painel de estrutura */
291
- .painel {
292
- width: 216px;
293
- background: var(--sup);
294
- border-right: 1px solid var(--linha);
295
- display: flex;
296
- flex-direction: column;
297
- flex: 0 0 auto;
298
- overflow: hidden;
299
- }
300
- .painel-topo {
301
- display: flex; align-items: center; justify-content: space-between;
302
- padding: 12px 12px 8px;
303
- }
304
- .painel-lista { flex: 1; overflow: auto; padding: 0 8px 10px; display: grid; gap: 5px; align-content: start; }
305
-
306
- .miniatura {
307
- border: 1px solid var(--linha);
308
- border-radius: 9px;
309
- overflow: hidden;
310
- cursor: pointer;
311
- background: var(--preto);
312
- position: relative;
313
- transition: border-color .14s;
314
- }
315
- .miniatura:hover { border-color: var(--linha2); }
316
- .miniatura.ativa { border-color: var(--primo); }
317
- .miniatura .caixa { position: relative; width: 100%; aspect-ratio: 16/9; overflow: hidden; }
318
- .miniatura .caixa .cena { position: absolute; top: 0; left: 0; transform-origin: top left; }
319
- .miniatura .num {
320
- position: absolute; left: 6px; bottom: 4px;
321
- font-size: 10px; color: var(--fraco2);
322
- background: rgba(0, 0, 0, .6); padding: 1px 5px; border-radius: 5px;
323
- }
324
-
325
- .camada {
326
- display: flex; align-items: center; gap: 8px;
327
- padding: 7px 9px;
328
- border-radius: 8px;
329
- font-size: 12.5px;
330
- color: var(--fraco);
331
- cursor: pointer;
332
- border: 1px solid transparent;
333
- }
334
- .camada:hover { background: var(--sup2); color: var(--texto); }
335
- .camada.ativa { background: var(--primo-suave); color: var(--texto); border-color: rgba(255, 90, 54, .3); }
336
- .camada svg { width: 13px; height: 13px; flex: 0 0 auto; opacity: .8; }
337
- .camada span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
338
-
339
- /* palco */
340
- .area-palco {
341
- flex: 1;
342
- min-width: 0;
343
- display: flex;
344
- flex-direction: column;
345
- background:
346
- radial-gradient(900px 500px at 50% -10%, rgba(255, 255, 255, .028), transparent 70%),
347
- var(--fundo);
348
- }
349
- .palco-wrap {
350
- flex: 1;
351
- display: grid;
352
- place-items: center;
353
- padding: 26px;
354
- overflow: auto;
355
- min-height: 0;
356
- }
357
- .palco {
358
- position: relative;
359
- box-shadow: 0 30px 70px -30px rgba(0, 0, 0, .85);
360
- border-radius: 8px;
361
- overflow: hidden;
362
- }
363
- .palco-barra {
364
- display: flex; align-items: center; gap: 10px;
365
- height: 42px; padding: 0 14px;
366
- border-top: 1px solid var(--linha);
367
- background: var(--sup);
368
- font-size: 12px; color: var(--fraco2);
369
- flex: 0 0 auto;
370
- }
371
- .palco-barra .btn { height: 27px; font-size: 12px; padding: 0 10px; }
372
-
373
- /* inspetor */
374
- .inspetor {
375
- width: 268px;
376
- background: var(--sup);
377
- border-left: 1px solid var(--linha);
378
- overflow: auto;
379
- flex: 0 0 auto;
380
- padding-bottom: 30px;
381
- }
382
- .grupo { border-bottom: 1px solid var(--linha); padding: 14px; }
383
- .grupo > .rotulo { display: block; margin-bottom: 11px; }
384
- /* Rótulo em cima, controle embaixo.
385
-
386
- A coluna do rótulo tinha 62px fixos. "Acabamento" não cabia e saía
387
- cortado; "Cor do fundo" e "Tema da cena" quebravam em duas linhas e
388
- desalinhavam a altura de tudo. Era metade da sensação de "estranho" no
389
- painel. Empilhado, o nome cabe inteiro e o controle usa a largura toda. */
390
- .linha-campo { display: grid; gap: 4px; margin-bottom: 11px; }
391
- .linha-campo:last-child { margin-bottom: 0; }
392
- .linha-campo > span {
393
- font-size: 10.5px; color: var(--fraco2);
394
- letter-spacing: .04em; text-transform: uppercase;
395
- }
396
- .dois { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
397
- .tres { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
398
- .opcoes { display: flex; gap: 4px; }
399
- .opcoes button {
400
- flex: 1; height: 30px;
401
- border: 1px solid var(--linha); border-radius: 8px;
402
- background: var(--sup2); color: var(--fraco);
403
- cursor: pointer; display: grid; place-items: center; font-size: 12px;
404
- }
405
- .opcoes button.ativo { background: var(--primo-suave); border-color: rgba(255, 90, 54, .4); color: var(--primo); }
406
- .opcoes button svg { width: 14px; height: 14px; }
407
- .nada { padding: 26px 16px; color: var(--fraco2); font-size: 12.5px; line-height: 1.6; text-align: center; }
408
-
409
- .dica-voz {
410
- margin-top: 14px;
411
- padding: 12px 13px;
412
- border: 1px solid rgba(255, 176, 58, .28);
413
- border-left: 3px solid #ffb03a;
414
- border-radius: 9px;
415
- background: rgba(255, 176, 58, .07);
416
- font-size: 11.5px;
417
- line-height: 1.6;
418
- color: var(--fraco);
419
- }
420
- .dica-voz b { color: var(--texto); }
421
- .dica-voz p { margin: 8px 0 0; }
422
- .dica-voz .caminho {
423
- font-family: var(--mono);
424
- font-size: 10.5px;
425
- color: #ffcf94;
426
- background: rgba(0, 0, 0, .3);
427
- padding: 8px 9px;
428
- border-radius: 7px;
429
- line-height: 1.7;
430
- }
431
-
432
- /* swatches */
433
- .cores { display: flex; flex-wrap: wrap; gap: 5px; }
434
- .cores button {
435
- width: 22px; height: 22px; border-radius: 6px;
436
- border: 1px solid var(--linha); cursor: pointer; padding: 0;
437
- }
438
-
439
- /* seleção no palco */
440
- .selecao {
441
- position: absolute;
442
- border: 1.5px solid var(--primo);
443
- pointer-events: none;
444
- z-index: 900;
445
- }
446
- .alca {
447
- position: absolute;
448
- width: 9px; height: 9px;
449
- background: #fff;
450
- border: 1.5px solid var(--primo);
451
- border-radius: 2px;
452
- pointer-events: auto;
453
- z-index: 901;
454
- }
455
- .alca.nw { cursor: nwse-resize; } .alca.ne { cursor: nesw-resize; }
456
- .alca.sw { cursor: nesw-resize; } .alca.se { cursor: nwse-resize; }
457
-
458
- /* linha do tempo (Corte) */
459
- .tempo {
460
- height: 96px;
461
- border-top: 1px solid var(--linha);
462
- background: var(--sup);
463
- display: flex;
464
- align-items: center;
465
- gap: 8px;
466
- padding: 0 14px;
467
- overflow-x: auto;
468
- flex: 0 0 auto;
469
- }
470
- .clipe {
471
- position: relative;
472
- height: 62px;
473
- min-width: 70px;
474
- border: 1px solid var(--linha);
475
- border-radius: 9px;
476
- background: var(--preto);
477
- overflow: hidden;
478
- cursor: pointer;
479
- flex: 0 0 auto;
480
- }
481
- .clipe.ativo { border-color: var(--primo); }
482
- .clipe .caixa { position: absolute; inset: 0; overflow: hidden; }
483
- .clipe .caixa .cena { position: absolute; top: 0; left: 0; transform-origin: top left; }
484
- .clipe .dur {
485
- position: absolute; right: 4px; bottom: 3px;
486
- font-size: 9.5px; color: #fff;
487
- background: rgba(0, 0, 0, .68); padding: 1px 4px; border-radius: 4px;
488
- }
489
-
490
- /* modal / folha */
491
- .folha {
492
- position: fixed; inset: 0; z-index: 200;
493
- background: rgba(6, 6, 8, .74);
494
- backdrop-filter: blur(7px);
495
- display: none; place-items: center; padding: 30px;
496
- }
497
- .folha.on { display: grid; }
498
- .folha .caixa {
499
- background: var(--sup);
500
- border: 1px solid var(--linha);
501
- border-radius: var(--r2);
502
- width: min(860px, 100%);
503
- max-height: 84vh;
504
- overflow: auto;
505
- padding: 24px 28px;
506
- }
507
- .folha h3 { margin: 0 0 14px; font-size: 15px; }
508
- .folha pre { margin: 0; font: 400 12px/1.65 var(--mono); color: #c9d1da; white-space: pre-wrap; }
509
- .folha textarea {
510
- width: 100%; min-height: 380px;
511
- font: 400 12.5px/1.6 var(--mono);
512
- background: var(--preto); color: #d7dee6;
513
- border: 1px solid var(--linha); border-radius: var(--r);
514
- padding: 14px; resize: vertical;
515
- }
516
- .folha .rodape { display: flex; gap: 9px; justify-content: flex-end; margin-top: 14px; }
517
-
518
- /* biblioteca de mídia ----------------------------------------------------- */
519
-
520
- .folha.midia .caixa { width: min(760px, 100%); }
521
- .midia-topo { display: flex; align-items: center; gap: 9px; margin-bottom: 16px; }
522
- .midia-topo h3 { margin: 0; }
523
-
524
- .solta {
525
- border: 1.5px dashed var(--linha2);
526
- border-radius: var(--r2);
527
- padding: 22px;
528
- text-align: center;
529
- color: var(--fraco);
530
- font-size: 13px;
531
- cursor: pointer;
532
- margin-bottom: 18px;
533
- transition: border-color .15s, background .15s, color .15s;
534
- }
535
- .solta:hover, .solta.ativo { border-color: var(--primo); background: var(--primo-suave); color: var(--texto); }
536
- .solta b { color: var(--texto); }
537
-
538
- .midia-grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(146px, 1fr)); gap: 12px; }
539
- .midia-item {
540
- position: relative;
541
- border: 1px solid var(--linha);
542
- border-radius: var(--r);
543
- padding: 8px;
544
- cursor: pointer;
545
- background: var(--sup2);
546
- transition: border-color .14s, transform .14s;
547
- }
548
- .midia-item:hover { border-color: var(--primo); transform: translateY(-2px); }
549
- .midia-item .mini-img {
550
- height: 86px; border-radius: 7px; background-size: cover; background-position: center;
551
- background-color: var(--preto);
552
- }
553
- .midia-item .mini-audio {
554
- height: 86px; border-radius: 7px;
555
- display: grid; place-items: center;
556
- background: linear-gradient(140deg, #2a1b3d, #14202e);
557
- color: var(--primo);
558
- }
559
- .midia-item .mini-audio svg { width: 30px; height: 30px; }
560
- .midia-item .mini-nome {
561
- font-size: 11.5px; margin-top: 8px; overflow: hidden;
562
- text-overflow: ellipsis; white-space: nowrap;
563
- }
564
- .midia-item .mini-meta { font-size: 10.5px; color: var(--fraco2); }
565
- .midia-item .mini-x {
566
- position: absolute; top: 5px; right: 5px;
567
- width: 21px; height: 21px; border-radius: 6px;
568
- border: 0; background: rgba(0, 0, 0, .66); color: #fff;
569
- cursor: pointer; font-size: 14px; line-height: 1;
570
- opacity: 0; transition: opacity .14s;
571
- }
572
- .midia-item:hover .mini-x { opacity: 1; }
573
- .midia-item .mini-x:hover { background: #e0224b; }
574
- .vazio-midia { grid-column: 1/-1; color: var(--fraco2); font-size: 13px; padding: 20px 0; text-align: center; }
575
-
576
- /* trilhas geradas ---------------------------------------------------------- */
577
-
578
- .trilha-grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin-top: 10px; }
579
- .trilha-item {
580
- position: relative;
581
- border: 1px solid var(--linha);
582
- border-radius: var(--r);
583
- background: var(--sup2);
584
- padding: 14px 15px;
585
- cursor: pointer;
586
- display: grid;
587
- gap: 3px;
588
- transition: border-color .14s, background .14s;
589
- }
590
- .trilha-item:hover { border-color: var(--linha2); }
591
- .trilha-item.ativo { border-color: var(--primo); background: var(--primo-suave); }
592
- .trilha-item b { font-size: 14px; font-weight: 600; }
593
- .trilha-item span { font-size: 11px; color: var(--fraco2); }
594
- .trilha-item .ouvir {
595
- position: absolute; top: 10px; right: 10px;
596
- width: 26px; height: 26px; border-radius: 999px;
597
- border: 1px solid var(--linha); background: var(--sup3);
598
- color: var(--texto); cursor: pointer;
599
- display: grid; place-items: center;
600
- }
601
- .trilha-item .ouvir svg { width: 11px; height: 11px; }
602
- .trilha-item .ouvir:hover { background: var(--primo); border-color: transparent; }
603
-
604
- /* modo apresentação / visualização */
605
- body.modo-ver { overflow: hidden; background: #000; }
606
- body.modo-ver .palco { border-radius: 0; box-shadow: none; }
607
-
608
- /* transporte do Corte (modo Abrir) --------------------------------------- */
609
-
610
- .transporte {
611
- position: fixed;
612
- left: 0; right: 0; bottom: 0;
613
- height: 62px;
614
- display: flex;
615
- align-items: center;
616
- gap: 12px;
617
- padding: 0 18px;
618
- background: linear-gradient(to top, rgba(6, 6, 9, .96), rgba(6, 6, 9, .72));
619
- backdrop-filter: blur(10px);
620
- border-top: 1px solid rgba(255, 255, 255, .1);
621
- z-index: 500;
622
- font-family: var(--sans);
623
- }
624
- .transporte .tp-btn {
625
- width: 36px; height: 36px;
626
- border-radius: 999px;
627
- border: 1px solid rgba(255, 255, 255, .16);
628
- background: rgba(255, 255, 255, .08);
629
- color: #f1f1f4;
630
- display: grid; place-items: center;
631
- cursor: pointer;
632
- flex: 0 0 auto;
633
- transition: background .15s;
634
- }
635
- .transporte .tp-btn:hover { background: rgba(255, 255, 255, .18); }
636
- .transporte .tp-btn svg { width: 15px; height: 15px; }
637
- .transporte .tp-btn.pequeno { width: 30px; height: 30px; }
638
- .transporte .tp-btn.texto {
639
- width: auto; padding: 0 15px; border-radius: 9px;
640
- font: 500 12.5px/1 var(--sans);
641
- }
642
- .transporte .tp-btn.gravando {
643
- background: #e0224b; border-color: transparent; color: #fff;
644
- animation: pulsaGrav 1.3s ease-in-out infinite;
645
- }
646
- @keyframes pulsaGrav { 50% { opacity: .55; } }
647
-
648
- .transporte .tp-tempo {
649
- font: 500 12px/1 var(--mono);
650
- color: #9aa0aa;
651
- font-variant-numeric: tabular-nums;
652
- flex: 0 0 auto;
653
- }
654
- .transporte .tp-barra {
655
- position: relative;
656
- flex: 1;
657
- height: 6px;
658
- border-radius: 999px;
659
- background: rgba(255, 255, 255, .13);
660
- cursor: pointer;
661
- }
662
- .transporte .tp-barra::before {
663
- content: ""; position: absolute; inset: -9px 0; /* alvo de clique maior */
664
- }
665
- .transporte .tp-cheio {
666
- position: absolute; left: 0; top: 0; bottom: 0;
667
- border-radius: 999px;
668
- background: linear-gradient(90deg, var(--primo), #ff9a3c);
669
- width: 0;
670
- }
671
- .transporte .tp-marcas { position: absolute; inset: 0; pointer-events: none; }
672
- .transporte .tp-marcas i {
673
- position: absolute; top: -2px; bottom: -2px;
674
- width: 2px;
675
- background: rgba(9, 9, 11, .85);
676
- }
677
- .transporte .tp-vol { width: 88px; flex: 0 0 auto; }
678
-
679
- @media (max-width: 620px) {
680
- .transporte .tp-vol, .transporte .tp-btn.pequeno { display: none; }
681
- }
682
-
683
- .aviso {
684
- position: fixed; left: 50%; bottom: 22px; transform: translateX(-50%);
685
- background: var(--sup3); border: 1px solid var(--linha2);
686
- padding: 9px 16px; border-radius: 999px; font-size: 12.5px;
687
- z-index: 500; opacity: 0; pointer-events: none; transition: opacity .25s;
688
- }
689
- .aviso.on { opacity: 1; }
690
- body:has(.transporte) .aviso { bottom: 80px; }
691
-
692
- /* painel do apresentador (Prisma) ----------------------------------------- */
693
-
694
- .apresentador {
695
- position: fixed; right: 0; top: 0; bottom: 0; width: 360px;
696
- z-index: 480;
697
- background: #0c0f13;
698
- color: #e8edf3;
699
- border-left: 1px solid rgba(255, 255, 255, .1);
700
- padding: 24px;
701
- display: flex; flex-direction: column; gap: 18px;
702
- font-family: var(--sans);
703
- overflow: auto;
704
- }
705
- .apresentador h4 {
706
- margin: 0 0 8px; font-size: 10.5px; letter-spacing: .17em;
707
- text-transform: uppercase; color: #7b8794; font-weight: 620;
708
- }
709
- .apresentador .relogio {
710
- font-size: 38px; font-weight: 640; letter-spacing: -.02em;
711
- font-variant-numeric: tabular-nums;
712
- }
713
- .apresentador .corpo { font-size: 14.5px; line-height: 1.65; color: #c3ccd6; }
714
- .apresentador .prox {
715
- font-size: 14px; color: #98a4b1;
716
- border-top: 1px solid rgba(255, 255, 255, .1); padding-top: 14px;
717
- }
718
- .apresentador .dica { margin-top: auto; font-size: 11.5px; color: #5e6a77; line-height: 1.75; }
719
-
720
- @media (max-width: 1100px) {
721
- .painel { width: 176px; }
722
- .inspetor { width: 240px; }
723
- input.titulo-arq { min-width: 90px; }
724
- }
725
- @media (max-width: 900px) {
726
- .trilho { width: 44px; }
727
- .trilho button { width: 32px; height: 32px; }
728
- .painel { width: 146px; }
729
- .inspetor { width: 214px; }
730
- .topo { gap: 6px; padding: 0 8px; }
731
- .marca em { display: none; }
732
- }
733
-
734
- /* ══════════════════════════════════════════════════════════════════════════
735
- Reordenar, modelos e ações de camada
736
-
737
- Três coisas que faltavam e faziam o editor parecer travado: arrastar não
738
- dava retorno nenhum, camada não tinha ação à mão, e "nova cena" abria uma
739
- tela em branco. O visual aqui é de propósito discreto — a peça que a
740
- pessoa está fazendo é que tem de chamar atenção, não a ferramenta.
741
- ═════════════════════════════════════════════════════════════════════════ */
742
-
743
- /* enquanto arrasta: o item sai de cena, o alvo se anuncia */
744
- .arrastando { opacity: .35; }
745
- .camada.alvo-solta, .miniatura.alvo-solta, .clipe.alvo-solta {
746
- outline: 2px solid var(--primo);
747
- outline-offset: 1px;
748
- }
749
- .camada, .miniatura, .clipe { -webkit-user-drag: element; }
750
- .camada:active { cursor: grabbing; }
751
-
752
- /* ações que aparecem ao passar o mouse na camada */
753
- .camada { position: relative; }
754
- .camada-acoes {
755
- display: none; gap: 1px; margin-left: auto; flex: 0 0 auto;
756
- }
757
- .camada:hover .camada-acoes, .camada.ativa .camada-acoes { display: flex; }
758
- .camada-acoes button {
759
- background: none; border: 0; padding: 3px;
760
- border-radius: 5px; cursor: pointer; color: var(--fraco2);
761
- display: grid; place-items: center;
762
- }
763
- .camada-acoes button:hover { background: var(--sup3, rgba(255,255,255,.08)); color: var(--texto); }
764
- .camada-acoes button:disabled { opacity: .25; cursor: default; }
765
- .camada-acoes button:disabled:hover { background: none; color: var(--fraco2); }
766
- .camada-acoes svg { width: 12px; height: 12px; opacity: 1; }
767
-
768
- /* a transição marcada no próprio clipe da linha do tempo */
769
- .clipe .tr-marca {
770
- position: absolute; left: 4px; top: 4px;
771
- background: rgba(6, 6, 8, .72);
772
- color: #cbd5e1;
773
- font-size: 9.5px; letter-spacing: .02em;
774
- padding: 2px 5px; border-radius: 4px;
775
- pointer-events: none;
776
- max-width: calc(100% - 8px);
777
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
778
- }
779
-
780
- /* o "+" no fim da tira */
781
- .clipe-mais {
782
- flex: 0 0 auto;
783
- width: 40px; height: 62px;
784
- border: 1px dashed var(--linha2);
785
- border-radius: 8px;
786
- background: none; color: var(--fraco2);
787
- cursor: pointer;
788
- display: grid; place-items: center;
789
- }
790
- .clipe-mais:hover { border-color: var(--primo); color: var(--primo); }
791
- .clipe-mais svg { width: 15px; height: 15px; }
792
-
793
- /* galeria de modelos */
794
- .folha .caixa.larga { width: min(1040px, 100%); }
795
- .folha .sub { color: var(--fraco); font-size: 12.5px; margin: -8px 0 18px; }
796
- .modelos {
797
- display: grid;
798
- grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
799
- gap: 14px;
800
- }
801
- .modelo {
802
- background: none; border: 0; padding: 0;
803
- cursor: pointer; text-align: left;
804
- display: grid; gap: 7px;
805
- }
806
- .modelo .caixa-mini {
807
- position: relative; width: 100%; aspect-ratio: 16/9;
808
- overflow: hidden; border-radius: 9px;
809
- border: 1px solid var(--linha);
810
- background: var(--sup2);
811
- transition: border-color .12s, transform .12s;
812
- }
813
- .modelo .caixa-mini .cena { position: absolute; top: 0; left: 0; transform-origin: top left; }
814
- .modelo .caixa-mini.vazia { display: grid; place-items: center; border-style: dashed; }
815
- .modelo .caixa-mini.vazia svg { width: 22px; height: 22px; color: var(--fraco2); }
816
- .modelo:hover .caixa-mini { border-color: var(--primo); transform: translateY(-2px); }
817
- .modelo span { font-size: 12.5px; color: var(--fraco); }
818
- .modelo:hover span { color: var(--texto); }
819
-
820
- /* seletor de cor compacto: amostras numa faixa, hex ao lado */
821
- .cor-faixa { display: grid; grid-template-columns: 1fr 62px; gap: 6px; align-items: center; }
822
- .cor-faixa .cores { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 2px; }
823
- .cor-faixa .cores::-webkit-scrollbar { height: 0; }
824
- .cor-faixa .cores button { width: 19px; height: 19px; flex: 0 0 auto; }
825
- .cor-faixa .cores button.ativa { outline: 2px solid var(--texto); outline-offset: 1px; }
826
- .cor-faixa .sem-cor {
827
- background: repeating-linear-gradient(45deg, var(--sup2) 0 4px, var(--linha2) 4px 8px);
828
- }
829
- .campo.hex { font-size: 11px; padding-left: 6px; padding-right: 6px; }
830
-
831
- /* chaves de animação: a régua mostra QUANDO cada uma acontece */
832
- .regua-chaves { position: relative; height: 26px; margin: 2px 0 2px; }
833
- .trilho-chaves {
834
- position: absolute; left: 5px; right: 5px; top: 11px; height: 3px;
835
- background: var(--sup3); border-radius: 2px;
836
- }
837
- .trilho-chaves .pino {
838
- position: absolute; top: 50%; width: 11px; height: 11px;
839
- margin: -5.5px 0 0 -5.5px; padding: 0;
840
- border-radius: 50%; border: 2px solid var(--fundo);
841
- background: var(--fraco); cursor: pointer;
842
- }
843
- .trilho-chaves .pino:hover { background: var(--texto); }
844
- .trilho-chaves .pino.ativo { background: var(--primo); transform: scale(1.25); }
845
- .sub-regua { font-size: 10.5px; color: var(--fraco2); margin-bottom: 10px; }
846
- .opcoes button.ativo { border-color: var(--primo); color: var(--primo); background: var(--primo-suave); }
847
- .presets { display: grid; gap: 5px; margin-top: 9px; }
848
- .presets button {
849
- height: 30px; padding: 0 10px; text-align: left;
850
- border: 1px solid var(--linha); border-radius: 8px;
851
- background: var(--sup2); color: var(--fraco);
852
- font: 500 12px/1 var(--sans); cursor: pointer;
853
- }
854
- .presets button:hover { background: var(--sup3); color: var(--texto); border-color: var(--primo); }
855
-
856
- /* ==========================================================================
857
- Refresh 2026 — o estúdio deixa de parecer template.
858
- Um bloco só, no fim, sobrepondo o essencial: profundidade no fundo,
859
- gradiente na marca, cartões com vida e o transporte flutuando de vidro.
860
- ========================================================================== */
861
-
862
- :root {
863
- --primo2: #ffb03a; /* o par do laranja no gradiente */
864
- --grad-primo: linear-gradient(120deg, #ff5a36 0%, #ff7a3c 55%, #ffb03a 100%);
865
- --brilho-primo: 0 8px 32px rgba(255, 90, 54, .25);
866
- }
867
-
868
- body {
869
- background:
870
- radial-gradient(ellipse 1000px 640px at 18% -10%, rgba(255, 90, 54, .07), transparent 60%),
871
- radial-gradient(ellipse 900px 600px at 92% 108%, rgba(124, 92, 246, .05), transparent 60%),
872
- var(--fundo);
873
- }
874
-
875
- /* marca com gradiente e cubo aceso */
876
- .topo .marca .cubo {
877
- background: var(--grad-primo);
878
- box-shadow: var(--brilho-primo);
879
- }
880
- .topo .marca em {
881
- background: var(--grad-primo);
882
- -webkit-background-clip: text;
883
- background-clip: text;
884
- color: transparent;
885
- font-style: normal;
886
- }
887
-
888
- /* hero maior, título com peso de capa */
889
- .home .hero h1 {
890
- font-size: 42px;
891
- letter-spacing: -.02em;
892
- background: linear-gradient(120deg, #fff 30%, #ffd9cd 70%, var(--primo2) 100%);
893
- -webkit-background-clip: text;
894
- background-clip: text;
895
- color: transparent;
896
- }
897
-
898
- /* cartões de ferramenta: vidro, glow no hover, levanta */
899
- .cartao-ferr {
900
- border-radius: 16px;
901
- background: linear-gradient(180deg, rgba(255, 255, 255, .035), rgba(255, 255, 255, .012));
902
- transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;
903
- }
904
- .cartao-ferr:hover {
905
- transform: translateY(-3px);
906
- border-color: var(--linha2);
907
- box-shadow: 0 14px 44px rgba(0, 0, 0, .45), 0 0 0 1px rgba(255, 90, 54, .12);
908
- }
909
- .cartao-ferr .icone {
910
- border-radius: 12px;
911
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .06);
912
- }
913
-
914
- /* botão principal: gradiente da marca */
915
- .btn.primo,
916
- .transporte .tp-btn.texto.primo {
917
- background: var(--grad-primo);
918
- border: none;
919
- color: #fff;
920
- font-weight: 600;
921
- box-shadow: var(--brilho-primo);
922
- }
923
- .btn.primo:hover,
924
- .transporte .tp-btn.texto.primo:hover {
925
- filter: brightness(1.08);
926
- }
927
-
928
- /* itens da lista de arquivos: respiro e hover */
929
- .item-arq {
930
- border-radius: 14px;
931
- transition: background .15s ease, border-color .15s ease;
932
- }
933
- .item-arq:hover { background: var(--sup2); border-color: var(--linha2); }
934
-
935
- /* transporte do player: vidro flutuante */
936
- .transporte {
937
- background: rgba(16, 16, 20, .78);
938
- backdrop-filter: blur(14px);
939
- -webkit-backdrop-filter: blur(14px);
940
- border: 1px solid var(--linha);
941
- border-radius: 16px;
942
- margin: 0 14px 12px;
943
- width: calc(100% - 28px);
944
- box-shadow: 0 12px 40px rgba(0, 0, 0, .5);
945
- }
946
- .transporte .tp-cheio { background: var(--grad-primo); }
947
-
948
- /* menu do botão Baixar (vídeo / áudio) */
949
- .menu-baixar {
950
- position: fixed;
951
- right: 22px;
952
- bottom: 84px;
953
- z-index: 60;
954
- display: flex;
955
- flex-direction: column;
956
- gap: 4px;
957
- padding: 6px;
958
- border-radius: 14px;
959
- border: 1px solid var(--linha2);
960
- background: rgba(18, 18, 23, .96);
961
- backdrop-filter: blur(16px);
962
- -webkit-backdrop-filter: blur(16px);
963
- box-shadow: 0 18px 60px rgba(0, 0, 0, .6);
964
- animation: menu-sobe .16s ease;
965
- }
966
- @keyframes menu-sobe {
967
- from { opacity: 0; transform: translateY(8px); }
968
- to { opacity: 1; transform: none; }
969
- }
970
- .menu-baixar button {
971
- display: flex;
972
- flex-direction: column;
973
- align-items: flex-start;
974
- gap: 2px;
975
- min-width: 250px;
976
- padding: 11px 14px;
977
- border: none;
978
- border-radius: 10px;
979
- background: transparent;
980
- color: var(--texto);
981
- font: 600 13.5px/1.2 var(--sans);
982
- text-align: left;
983
- cursor: pointer;
984
- }
985
- .menu-baixar button:hover { background: var(--primo-suave); }
986
- .menu-baixar button span {
987
- font: 400 11.5px/1.2 var(--sans);
988
- color: var(--fraco);
989
- }
990
-
991
- /* ==========================================================================
992
- REDESENHO DA CAPA — o estúdio se apresentando
993
- --------------------------------------------------------------------------
994
- O que estava aqui era uma página de lista: título, cartões, lista de
995
- arquivos. Funcionava e não dizia nada — quem abria pela primeira vez não
996
- descobria que o vídeo sai com narração, câmera e keyframes, nem que dá para
997
- pedir tudo por texto ao agente.
998
-
999
- Este bloco vem DEPOIS do núcleo de propósito: ele acrescenta a capa, os
1000
- poderes e o acabamento dos cartões sem reescrever a primitiva (.btn, .campo,
1001
- .topo) que o editor usa — mudar aquilo mexeria em cinco telas de uma vez.
1002
- ========================================================================== */
1003
-
1004
- .home { max-width: 1140px; padding-top: 34px; }
1005
-
1006
- .busca-topo { width: 220px; background: var(--sup2); }
1007
- .busca-topo::placeholder { color: var(--fraco2); }
1008
- @media (max-width: 720px) { .busca-topo { display: none; } }
1009
-
1010
- /* ------------------------------------------------------------------ capa -- */
1011
-
1012
- .capa {
1013
- position: relative;
1014
- display: grid;
1015
- grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
1016
- gap: 30px;
1017
- align-items: center;
1018
- padding: 46px 40px;
1019
- margin-bottom: 54px;
1020
- border: 1px solid var(--linha);
1021
- border-radius: 22px;
1022
- background: linear-gradient(180deg, var(--sup) 0%, #101014 100%);
1023
- overflow: hidden;
1024
- }
1025
- /* A luz é a única coisa que se move na capa, e devagar: movimento na página
1026
- inteira briga com o vídeo que a pessoa veio fazer. */
1027
- .capa-luz {
1028
- position: absolute;
1029
- inset: -40% -10% auto -20%;
1030
- height: 520px;
1031
- background:
1032
- radial-gradient(420px 240px at 20% 40%, rgba(255, 90, 54, .22), transparent 70%),
1033
- radial-gradient(360px 220px at 70% 30%, rgba(139, 92, 246, .18), transparent 72%);
1034
- filter: blur(6px);
1035
- animation: capaLuz 18s ease-in-out infinite alternate;
1036
- pointer-events: none;
1037
- }
1038
- @keyframes capaLuz { from { transform: translate3d(-3%, 0, 0); } to { transform: translate3d(6%, 3%, 0); } }
1039
-
1040
- .capa-texto { position: relative; z-index: 1; }
1041
- .capa h1 {
1042
- font-size: 40px;
1043
- line-height: 1.12;
1044
- font-weight: 680;
1045
- letter-spacing: -.04em;
1046
- margin: 14px 0 12px;
1047
- }
1048
- .capa h1 .grad {
1049
- background: linear-gradient(92deg, var(--primo), #ff9f7a 55%, #8b5cf6);
1050
- -webkit-background-clip: text;
1051
- background-clip: text;
1052
- color: transparent;
1053
- }
1054
- .capa p { color: var(--fraco); font-size: 14.5px; line-height: 1.7; margin: 0 0 22px; max-width: 560px; }
1055
- .capa-acoes { display: flex; gap: 10px; flex-wrap: wrap; }
1056
- .btn.grande { height: 40px; padding: 0 18px; font-size: 13.5px; border-radius: 12px; }
1057
-
1058
- .selo-vivo { color: var(--fraco); }
1059
- .selo-vivo i {
1060
- width: 7px; height: 7px; border-radius: 999px; background: #4ade80;
1061
- box-shadow: 0 0 0 3px rgba(74, 222, 128, .16);
1062
- animation: pulso 2.4s ease-in-out infinite;
1063
- }
1064
- @keyframes pulso { 50% { box-shadow: 0 0 0 6px rgba(74, 222, 128, 0); } }
1065
-
1066
- /* A arte da direita é o produto em miniatura: três quadros de cena, com a
1067
- mesma linguagem do render. Nada de screenshot — captura envelhece e mente. */
1068
- .capa-arte { position: relative; height: 250px; }
1069
- .capa-arte .quadro {
1070
- position: absolute;
1071
- border: 1px solid var(--linha2);
1072
- border-radius: 14px;
1073
- background: linear-gradient(160deg, #16161d, #0c0c11);
1074
- box-shadow: 0 24px 60px rgba(0, 0, 0, .45);
1075
- animation: flutua 9s ease-in-out infinite alternate;
1076
- }
1077
- .capa-arte .q1 {
1078
- left: 0; top: 16px; width: 62%; height: 132px; padding: 16px;
1079
- display: flex; flex-direction: column; gap: 9px; justify-content: center;
1080
- }
1081
- .capa-arte .q1 span { height: 9px; border-radius: 5px; background: rgba(255, 255, 255, .16); }
1082
- .capa-arte .q1 span:first-child { width: 42%; background: var(--primo); height: 11px; }
1083
- .capa-arte .q1 span:last-child { width: 68%; }
1084
- .capa-arte .q2 {
1085
- right: 6px; top: 0; width: 42%; height: 104px;
1086
- display: grid; place-content: center; text-align: center;
1087
- animation-delay: -3s;
1088
- }
1089
- .capa-arte .q2 b { font-size: 26px; font-weight: 680; letter-spacing: -.03em; display: block; }
1090
- .capa-arte .q2 i { font-size: 11px; color: var(--fraco2); font-style: normal; }
1091
- .capa-arte .q3 {
1092
- right: 22px; bottom: 4px; width: 54%; height: 96px; padding: 14px;
1093
- display: flex; align-items: flex-end; gap: 8px;
1094
- animation-delay: -6s;
1095
- }
1096
- .capa-arte .q3 u { flex: 1; border-radius: 4px 4px 0 0; background: linear-gradient(180deg, var(--primo), rgba(255, 90, 54, .25)); }
1097
- .capa-arte .q3 u:nth-child(1) { height: 38%; }
1098
- .capa-arte .q3 u:nth-child(2) { height: 72%; }
1099
- .capa-arte .q3 u:nth-child(3) { height: 54%; }
1100
- @keyframes flutua { from { transform: translateY(-5px); } to { transform: translateY(7px); } }
1101
-
1102
- @media (max-width: 880px) {
1103
- .capa { grid-template-columns: 1fr; padding: 34px 24px; }
1104
- .capa-arte { display: none; }
1105
- .capa h1 { font-size: 31px; }
1106
- }
1107
-
1108
- /* ------------------------------------------------------- cartões e listas -- */
1109
-
1110
- /* Seis ferramentas em três colunas fecham duas fileiras cheias; em quatro
1111
- colunas sobra uma fileira pela metade, e a página parece interrompida. */
1112
- .grade-ferr {
1113
- gap: 16px;
1114
- margin-bottom: 52px;
1115
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1116
- }
1117
-
1118
- .cartao-ferr { padding: 22px; background: linear-gradient(180deg, var(--sup), #101015); }
1119
- .cartao-ferr .brilho {
1120
- position: absolute; inset: -1px -1px auto -1px; height: 2px;
1121
- background: linear-gradient(90deg, transparent, var(--cor, var(--primo)), transparent);
1122
- opacity: 0; transition: opacity .18s;
1123
- }
1124
- .cartao-ferr:hover .brilho, .cartao-ferr:focus-visible .brilho { opacity: .9; }
1125
- .cartao-ferr:focus-visible { outline: 2px solid var(--cor, var(--primo)); outline-offset: 2px; }
1126
- .cartao-ferr .icone {
1127
- width: 38px; height: 38px; border-radius: 11px;
1128
- background: color-mix(in srgb, var(--cor, var(--primo)) 16%, transparent);
1129
- color: var(--cor, var(--primo));
1130
- border: 1px solid color-mix(in srgb, var(--cor, var(--primo)) 28%, transparent);
1131
- }
1132
- .cartao-ferr .icone svg { width: 19px; height: 19px; }
1133
- .cartao-ferr:hover { transform: translateY(-3px); box-shadow: 0 18px 40px rgba(0, 0, 0, .35); }
1134
-
1135
- .item-arq { border-radius: 12px; }
1136
- .item-arq .tag {
1137
- background: color-mix(in srgb, var(--cor, var(--primo)) 16%, transparent);
1138
- color: var(--cor, var(--primo));
1139
- }
1140
- .item-arq:hover { transform: translateX(2px); }
1141
-
1142
- /* ------------------------------------------------------------- poderes --- */
1143
-
1144
- .poderes { margin-bottom: 50px; }
1145
- .grade-poder {
1146
- display: grid;
1147
- grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
1148
- gap: 12px;
1149
- }
1150
- .grade-poder article {
1151
- border: 1px solid var(--linha);
1152
- border-radius: var(--r2);
1153
- background: var(--sup);
1154
- padding: 16px 18px;
1155
- }
1156
- .grade-poder b { font-size: 13.5px; font-weight: 620; display: block; margin-bottom: 5px; }
1157
- .grade-poder p { margin: 0; font-size: 12.5px; line-height: 1.6; color: var(--fraco); }
1158
-
1159
- .copiado { font-size: 12px; color: #4ade80; opacity: 0; transition: opacity .2s; }
1160
- .copiado.on { opacity: 1; }
1161
-
1162
- /* Quem pediu menos movimento recebe menos movimento — a capa continua
1163
- inteira, só para de respirar. */
1164
- @media (prefers-reduced-motion: reduce) {
1165
- .capa-luz, .capa-arte .quadro, .selo-vivo i { animation: none; }
1166
- .cartao-ferr:hover, .item-arq:hover { transform: none; }
1167
- }