primocode 9.10.0 → 10.0.9

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 (89) hide show
  1. package/README.md +30 -6
  2. package/bin/primocode.js +169 -342
  3. package/lib/act.js +360 -39
  4. package/lib/browser.js +105 -4
  5. package/lib/casar.js +108 -0
  6. package/lib/catalogo.js +6 -2
  7. package/lib/claude-engine.js +38 -17
  8. package/lib/codex-engine.js +27 -9
  9. package/lib/config.js +10 -3
  10. package/lib/cursor.js +10 -1
  11. package/lib/entrada.js +77 -11
  12. package/lib/estudio/cinema.js +27 -9
  13. package/lib/estudio/diretor.js +21 -1
  14. package/lib/estudio/ende.js +16 -5
  15. package/lib/estudio/estilo.js +66 -0
  16. package/lib/estudio/gerativo.js +1453 -0
  17. package/lib/estudio/glifos.js +215 -0
  18. package/lib/estudio/hibrido.js +165 -0
  19. package/lib/estudio/index.js +284 -53
  20. package/lib/estudio/kit/base.jsx +285 -0
  21. package/lib/estudio/kit/gerativo.jsx +980 -0
  22. package/lib/estudio/kit/index.jsx +13 -0
  23. package/lib/estudio/kit/marca.jsx +741 -0
  24. package/lib/estudio/kit/tres.jsx +308 -0
  25. package/lib/estudio/kit/vox.jsx +357 -0
  26. package/lib/estudio/kit.js +78 -0
  27. package/lib/estudio/lancamento.js +441 -0
  28. package/lib/estudio/motion.js +2 -5
  29. package/lib/estudio/plano.js +28 -3
  30. package/lib/estudio/referencias.js +105 -0
  31. package/lib/estudio/remotion.js +139 -51
  32. package/lib/estudio/ritmo.js +77 -0
  33. package/lib/estudio/sons-leves.js +38 -1
  34. package/lib/estudio/variedade.js +105 -0
  35. package/lib/estudio/vox.js +414 -0
  36. package/lib/fala.js +1 -94
  37. package/lib/mcp.js +156 -0
  38. package/lib/personas.js +67 -0
  39. package/lib/pipeline.js +55 -56
  40. package/lib/repeticao.js +3 -1
  41. package/lib/skills.js +44 -2
  42. package/lib/snapshot.js +111 -0
  43. package/lib/tools.js +100 -22
  44. package/lib/ui.js +50 -8
  45. package/lib/video/analise.js +89 -0
  46. package/lib/video/auto.js +329 -0
  47. package/lib/video/camadas.js +207 -0
  48. package/lib/video/cli.js +74 -0
  49. package/lib/video/delta.js +90 -0
  50. package/lib/video/edits.js +379 -0
  51. package/lib/video/filters.js +280 -0
  52. package/lib/video/fx3d/Camadas.jsx +64 -0
  53. package/lib/video/fx3d/Objetos.jsx +128 -0
  54. package/lib/video/fx3d/Root.jsx +18 -0
  55. package/lib/video/fx3d/modelos.jsx +304 -0
  56. package/lib/video/fx3d.js +108 -0
  57. package/lib/video/gerados.js +119 -0
  58. package/lib/video/objetos.js +111 -0
  59. package/lib/video/ops-fx.js +453 -0
  60. package/lib/video/ops.js +347 -0
  61. package/lib/video/paralelo.js +50 -0
  62. package/lib/video/pedido.js +191 -0
  63. package/lib/video/projeto.js +133 -0
  64. package/lib/video/rastrear.js +95 -0
  65. package/lib/video/rastro.js +276 -0
  66. package/lib/video/render.js +274 -0
  67. package/lib/video/texto.js +144 -0
  68. package/lib/video/timeline.js +318 -0
  69. package/lib/video/transcript.js +124 -0
  70. package/lib/voz.js +75 -223
  71. package/package.json +2 -3
  72. package/skills/motion-de-primeira/SKILL.md +5 -5
  73. package/studio/narrar.py +10 -7
  74. package/studio/rastrear.py +399 -0
  75. package/studio/texto.py +208 -0
  76. package/voz/primo_voz/__main__.py +96 -236
  77. package/voz/primo_voz/transcrever.py +31 -1
  78. package/app/ansi.js +0 -55
  79. package/app/app.css +0 -500
  80. package/app/app.js +0 -1017
  81. package/app/icone.svg +0 -6
  82. package/app/index.html +0 -220
  83. package/app/primo-marca.js +0 -192
  84. package/lib/app.js +0 -615
  85. package/lib/icone.js +0 -263
  86. package/lib/instalar-app.js +0 -231
  87. package/lib/painel.js +0 -291
  88. package/voz/primo_voz/desperta.py +0 -195
  89. package/voz/primo_voz/orbe.py +0 -406
package/app/app.css DELETED
@@ -1,500 +0,0 @@
1
- /* A janela do PrimoCode.
2
- *
3
- * O desenho segue o de um app de mesa de agente, cinza e calmo: fundo
4
- * neutro, barra lateral um degrau mais clara, compositor mais clara ainda, e
5
- * cor só onde ela quer dizer alguma coisa — o laranja do "Acesso completo"
6
- * (o agente não pergunta nada, nem antes do que não tem volta), o ciano da
7
- * marca no botão de enviar quando há o que enviar, verde e vermelho só nos
8
- * números de linha de uma edição.
9
- *
10
- * Tema escuro primeiro, porque é o da janela. O claro redefine SÓ os tokens:
11
- * nenhum componente tem cor própria fora do :root, então trocar o tema troca
12
- * a tela inteira, não metade dela.
13
- */
14
-
15
- :root {
16
- color-scheme: dark;
17
- --fundo: #181818;
18
- --lado: #262626;
19
- --compositor: #2f2f2f;
20
- --barra-projeto: #202020;
21
- --elevado: #2a2a2a;
22
- --menu: #2b2b2b;
23
- --borda: rgba(255, 255, 255, 0.07);
24
- --borda-forte: rgba(255, 255, 255, 0.12);
25
- --hover: rgba(255, 255, 255, 0.055);
26
- --ativo: rgba(255, 255, 255, 0.085);
27
- --texto: #ececec;
28
- --texto-2: #cfcfcf;
29
- --fraco: #8d8d8d;
30
- --mais-fraco: #6a6a6a;
31
- --balao: #2c2c2c;
32
- --codigo: #111111;
33
- --marca: #22d3ee;
34
- --marca-texto: #06232a;
35
- --enviar-off: #34425a;
36
- --enviar-off-texto: #8391a8;
37
- --laranja: #f08b4f;
38
- --mais-linha: #5fcf8a;
39
- --menos-linha: #f07a7a;
40
- --aviso: #f0b64f;
41
- --avatar: #3a6bd6;
42
- --sombra: 0 12px 32px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.06);
43
- --fonte: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", system-ui, Roboto, "Helvetica Neue", Arial, sans-serif;
44
- --mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
45
- --largura-lado: 272px;
46
- --largura-conversa: 736px;
47
- --largura-painel: 44%;
48
- }
49
-
50
- :root[data-tema="claro"] {
51
- color-scheme: light;
52
- --fundo: #ffffff;
53
- --lado: #f4f4f3;
54
- --compositor: #ffffff;
55
- --barra-projeto: #f4f4f3;
56
- --elevado: #f7f7f6;
57
- --menu: #ffffff;
58
- --borda: rgba(0, 0, 0, 0.08);
59
- --borda-forte: rgba(0, 0, 0, 0.14);
60
- --hover: rgba(0, 0, 0, 0.045);
61
- --ativo: rgba(0, 0, 0, 0.07);
62
- --texto: #1d1d1d;
63
- --texto-2: #3a3a3a;
64
- --fraco: #6f6f6f;
65
- --mais-fraco: #9a9a9a;
66
- --balao: #f1f1f0;
67
- --codigo: #f6f6f5;
68
- --marca: #0e7490;
69
- --marca-texto: #ffffff;
70
- --enviar-off: #d9dde6;
71
- --enviar-off-texto: #8a93a4;
72
- --laranja: #c75a17;
73
- --mais-linha: #1a7f45;
74
- --menos-linha: #c23a3a;
75
- --aviso: #9a6200;
76
- --sombra: 0 12px 32px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.08);
77
- }
78
-
79
- * { box-sizing: border-box; }
80
- html, body { height: 100%; }
81
- body {
82
- margin: 0;
83
- background: var(--fundo);
84
- color: var(--texto);
85
- font: 14px/1.45 var(--fonte);
86
- -webkit-font-smoothing: antialiased;
87
- overflow: hidden;
88
- }
89
- [hidden] { display: none !important; }
90
- button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
91
- button:focus-visible, textarea:focus-visible, input:focus-visible, [tabindex]:focus-visible {
92
- outline: 2px solid var(--marca);
93
- outline-offset: 1px;
94
- }
95
- .ic {
96
- width: 18px; height: 18px; flex: none;
97
- fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round;
98
- }
99
- .ic-p { width: 14px; height: 14px; }
100
- .espaco { flex: 1; }
101
- .fraco { color: var(--fraco); }
102
-
103
- .icone-btn {
104
- display: inline-grid; place-items: center;
105
- width: 28px; height: 28px; border-radius: 7px;
106
- color: var(--fraco);
107
- }
108
- .icone-btn:hover { background: var(--hover); color: var(--texto); }
109
- .icone-btn[aria-pressed="true"] { color: var(--marca); }
110
- .icone-btn.grande .ic { width: 20px; height: 20px; }
111
-
112
- /* ── o esqueleto ───────────────────────────────────────────────────────── */
113
-
114
- .app { display: flex; height: 100%; }
115
-
116
- .lado {
117
- width: var(--largura-lado); flex: none;
118
- display: flex; flex-direction: column;
119
- background: var(--lado);
120
- border-right: 1px solid var(--borda);
121
- min-height: 0;
122
- }
123
- .app.sem-lado .lado { display: none; }
124
- #btnLadoAbrir { display: none; }
125
- .app.sem-lado #btnLadoAbrir { display: inline-grid; }
126
-
127
- .lado-barra { height: 42px; display: flex; align-items: center; padding: 0 12px; }
128
-
129
- .lado-marca {
130
- display: flex; align-items: center; justify-content: space-between;
131
- padding: 0 10px 0 12px; height: 40px;
132
- }
133
- .marca-btn {
134
- display: inline-flex; align-items: center; gap: 6px;
135
- font-size: 17px; font-weight: 600; letter-spacing: -0.01em;
136
- padding: 3px 6px; margin-left: -6px; border-radius: 7px;
137
- }
138
- .marca-btn .ic { color: var(--fraco); }
139
- .marca-btn:hover { background: var(--hover); }
140
- .lado-acoes { display: flex; gap: 4px; }
141
-
142
- .busca { padding: 4px 10px 6px; }
143
- .busca input {
144
- width: 100%; height: 30px; padding: 0 10px;
145
- background: var(--fundo); color: var(--texto);
146
- border: 1px solid var(--borda-forte); border-radius: 8px; font: inherit;
147
- }
148
-
149
- .nav { display: flex; flex-direction: column; gap: 1px; padding: 8px 6px 0; }
150
- .nav-linha { display: flex; align-items: center; gap: 4px; }
151
- .nav-linha .nav-item { flex: 1; }
152
- .nav-linha .icone-btn { margin-right: 6px; }
153
- .nav-item {
154
- display: flex; align-items: center; gap: 11px;
155
- height: 31px; padding: 0 9px; border-radius: 8px;
156
- color: var(--texto); text-align: left; white-space: nowrap;
157
- }
158
- .nav-item .ic { color: var(--texto-2); }
159
- .nav-item:hover { background: var(--hover); }
160
- .nav-item.ativo { background: var(--ativo); }
161
- .nav-item[aria-pressed="true"] { background: var(--ativo); }
162
-
163
- .rolagem-lado { flex: 1; min-height: 0; overflow-y: auto; padding: 22px 6px 12px; }
164
- .secao { color: var(--fraco); padding: 0 9px; height: 30px; display: flex; align-items: center; }
165
- .lista { display: flex; flex-direction: column; gap: 1px; margin-bottom: 18px; }
166
- .vazio-lista { color: var(--mais-fraco); padding: 0 9px; height: 34px; display: flex; align-items: center; }
167
- .item {
168
- display: flex; align-items: center; gap: 8px;
169
- height: 31px; padding: 0 9px; border-radius: 8px;
170
- color: var(--texto); text-align: left; width: 100%;
171
- }
172
- .item:hover { background: var(--hover); color: var(--texto); }
173
- .item[aria-current="true"] { background: var(--ativo); color: var(--texto); }
174
- .item .titulo { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
175
- .item .quando { color: var(--mais-fraco); font-size: 12px; flex: none; font-variant-numeric: tabular-nums; }
176
- .item .ic { width: 16px; height: 16px; color: var(--fraco); }
177
- .dia { color: var(--mais-fraco); font-size: 12px; padding: 8px 9px 2px; }
178
-
179
- .lado-pe {
180
- display: flex; align-items: center; justify-content: space-between;
181
- height: 54px; padding: 0 12px 0 14px; border-top: 1px solid var(--borda);
182
- }
183
- .usuario { display: flex; align-items: center; gap: 10px; min-width: 0; color: var(--texto-2); font-size: 14.5px; }
184
- .nome-usuario { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
185
- .avatar {
186
- width: 20px; height: 20px; border-radius: 50%; flex: none;
187
- display: grid; place-items: center;
188
- background: var(--avatar); color: #fff; font-size: 8px; font-weight: 600; letter-spacing: 0.02em;
189
- }
190
-
191
- /* ── o centro ──────────────────────────────────────────────────────────── */
192
-
193
- .centro { flex: 1; min-width: 0; display: flex; flex-direction: column; position: relative; }
194
- .topo {
195
- position: absolute; top: 0; left: 0; right: 0; z-index: 2;
196
- height: 42px; display: flex; align-items: center; gap: 8px; padding: 0 12px;
197
- pointer-events: none;
198
- }
199
- .topo > * { pointer-events: auto; }
200
- .topo-titulo {
201
- flex: 1; min-width: 0; text-align: center; color: var(--fraco); font-size: 13px;
202
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap; pointer-events: none;
203
- }
204
-
205
- .rolo { flex: 1; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; }
206
- .vazio {
207
- flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
208
- gap: 22px; padding: 60px 24px 20px;
209
- }
210
- .vazio h1 { margin: 0; font-size: 26px; font-weight: 400; letter-spacing: -0.01em; text-wrap: balance; text-align: center; }
211
- .mascote { color: var(--fraco); display: grid; place-items: center; }
212
- .mascote.pequeno { color: var(--mais-fraco); }
213
-
214
- .chat {
215
- width: 100%; max-width: calc(var(--largura-conversa) + 48px); margin: 0 auto;
216
- padding: 58px 24px 28px; display: flex; flex-direction: column; gap: 14px;
217
- }
218
-
219
- .msg-voce { display: flex; justify-content: flex-end; }
220
- .msg-voce .balao {
221
- max-width: 76%; background: var(--balao); padding: 9px 15px; border-radius: 18px;
222
- white-space: pre-wrap; overflow-wrap: anywhere; font-size: 15px; line-height: 1.5;
223
- }
224
-
225
- .msg-primo { font-size: 15px; line-height: 1.62; overflow-wrap: anywhere; color: var(--texto); }
226
- .msg-primo > :first-child { margin-top: 0; }
227
- .msg-primo > :last-child { margin-bottom: 0; }
228
- .msg-primo p { margin: 0 0 10px; }
229
- .msg-primo h3, .msg-primo h4 { margin: 16px 0 6px; font-size: 15px; font-weight: 600; }
230
- .msg-primo ul, .msg-primo ol { margin: 0 0 10px; padding-left: 22px; }
231
- .msg-primo li { margin: 2px 0; }
232
- .msg-primo code { font-family: var(--mono); font-size: 13px; background: var(--hover); padding: 1px 5px; border-radius: 5px; }
233
- .msg-primo pre {
234
- margin: 0 0 10px; padding: 12px 14px; background: var(--codigo); border: 1px solid var(--borda);
235
- border-radius: 10px; overflow-x: auto; font: 12.5px/1.55 var(--mono);
236
- }
237
- .msg-primo pre code { background: none; padding: 0; font-size: inherit; }
238
-
239
- .pensamento { color: var(--fraco); font-size: 14px; white-space: pre-wrap; }
240
- .aviso-msg { color: var(--aviso); font-size: 14px; white-space: pre-wrap; }
241
- .aviso-msg.erro { color: var(--menos-linha); }
242
-
243
- /* A linha de ação: pequena, cinza, e só abre quando a pessoa quer. O agente
244
- faz dez coisas por pedido; se cada uma ocupasse um bloco, a resposta —
245
- que é o que importa — ficaria lá embaixo. */
246
- .acoes { display: flex; flex-direction: column; gap: 0; }
247
- .acao { color: var(--fraco); font-size: 13.5px; }
248
- .acao-linha {
249
- display: flex; align-items: center; gap: 8px; width: 100%;
250
- min-height: 28px; padding: 3px 8px; margin-left: -8px; border-radius: 7px; text-align: left;
251
- }
252
- .acao-linha.abre:hover { background: var(--hover); color: var(--texto-2); }
253
- .acao-linha:not(.abre) { cursor: default; }
254
- .acao-linha .ic { width: 16px; height: 16px; }
255
- .acao-texto { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
256
- .acao-texto b { font-weight: 500; color: var(--texto-2); }
257
- .acao-meta { flex: none; font-variant-numeric: tabular-nums; display: inline-flex; gap: 6px; }
258
- .acao .mais { color: var(--mais-linha); }
259
- .acao .menos { color: var(--menos-linha); }
260
- .acao .ok { color: var(--mais-linha); }
261
- .acao .falhou { color: var(--aviso); }
262
- .acao .rodando { width: 10px; height: 10px; border-radius: 50%; border: 1.5px solid var(--mais-fraco); border-top-color: var(--texto-2); animation: gira 0.8s linear infinite; }
263
- .acao-seta { width: 14px; height: 14px; transition: transform 0.15s; opacity: 0; }
264
- .acao-linha.abre .acao-seta { opacity: 0.8; }
265
- .acao.aberta .acao-seta { transform: rotate(180deg); }
266
- .acao-detalhe {
267
- margin: 2px 0 8px 24px; padding: 10px 12px; max-height: 280px; overflow: auto;
268
- background: var(--codigo); border: 1px solid var(--borda); border-radius: 9px;
269
- font: 12px/1.55 var(--mono); color: var(--texto-2); white-space: pre;
270
- }
271
- .acao-detalhe .l-mais { color: var(--mais-linha); }
272
- .acao-detalhe .l-menos { color: var(--menos-linha); }
273
- .acao.fundo { padding-left: 18px; }
274
-
275
- .saida-comando {
276
- margin: 0; padding: 12px 14px; background: var(--codigo); border: 1px solid var(--borda);
277
- border-radius: 10px; overflow-x: auto; font: 12.5px/1.55 var(--mono); color: var(--texto-2); white-space: pre-wrap;
278
- }
279
-
280
- .trabalhando { display: flex; align-items: center; gap: 10px; color: var(--fraco); font-size: 14px; }
281
- .trabalhando .pulso {
282
- width: 8px; height: 8px; border-radius: 50%; background: var(--marca);
283
- animation: pulsa 1.2s ease-in-out infinite;
284
- }
285
- .brilho {
286
- background: linear-gradient(90deg, var(--fraco) 0%, var(--texto) 50%, var(--fraco) 100%);
287
- background-size: 200% 100%; -webkit-background-clip: text; background-clip: text; color: transparent;
288
- animation: brilha 1.8s linear infinite;
289
- }
290
- @keyframes pulsa { 50% { opacity: 0.35; transform: scale(0.8); } }
291
- @keyframes brilha { to { background-position: -200% 0; } }
292
- @keyframes gira { to { transform: rotate(360deg); } }
293
-
294
- /* ── o terminal ────────────────────────────────────────────────────────── */
295
-
296
- .terminal { flex: 1; min-height: 0; display: flex; flex-direction: column; padding: 48px 24px 12px; }
297
- .terminal-topo { display: flex; align-items: center; justify-content: space-between; padding-bottom: 10px; }
298
- .terminal-topo small { color: var(--fraco); font-size: 12.5px; margin-left: 6px; }
299
- .terminal-saida {
300
- flex: 1; margin: 0; padding: 14px 16px; overflow: auto;
301
- background: #0d0d0d; color: #d4d4d4; border: 1px solid var(--borda); border-radius: 12px;
302
- font: 12.5px/1.5 var(--mono); white-space: pre-wrap; overflow-wrap: anywhere;
303
- }
304
- /* As cores de terminal: as mesmas do PALETTE de lib/ui.js (cubo de 256),
305
- no fundo escuro fixo do terminal — por isso literais, não tokens. */
306
- .c45 { color: #22d3ee; } .c31 { color: #0891b2; } .c254 { color: #e2e8f0; }
307
- .c247 { color: #94a3b8; } .c243 { color: #64748b; } .c214 { color: #fbbf24; } .c204 { color: #fb7185; }
308
- .forte { font-weight: 700; }
309
-
310
- /* ── o compositor ─────────────────────────────────────────────────────── */
311
-
312
- .rodape { flex: none; padding: 0 24px 16px; }
313
- .compositor-zona { width: 100%; max-width: var(--largura-conversa); margin: 0 auto; }
314
- .projeto-barra {
315
- margin: 0 14px; height: 40px; padding: 0 16px 8px; display: flex; align-items: center;
316
- background: var(--barra-projeto); border: 1px solid var(--borda); border-bottom: 0;
317
- border-radius: 16px 16px 0 0; margin-bottom: -8px; box-sizing: content-box; padding-top: 0;
318
- }
319
- .projeto-btn { display: inline-flex; align-items: center; gap: 9px; color: var(--fraco); font-size: 14px; height: 30px; padding: 0 6px; margin-left: -6px; border-radius: 7px; }
320
- .projeto-btn:hover { color: var(--texto); background: var(--hover); }
321
- .projeto-btn .ic { width: 17px; height: 17px; }
322
- .projeto-btn.tem { color: var(--texto-2); }
323
-
324
- .compositor {
325
- position: relative; background: var(--compositor); border: 1px solid var(--borda);
326
- border-radius: 20px; padding: 13px 12px 10px 14px;
327
- display: flex; flex-direction: column; gap: 10px;
328
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
329
- container-type: inline-size;
330
- }
331
- /* Compositor apertado (painel aberto, janela estreita): o nome técnico do
332
- esforço sai primeiro, depois o texto da permissão — os ícones ficam. */
333
- @container (max-width: 560px) { #esforcoNome { display: none; } }
334
- @container (max-width: 420px) { .chip-perm span { display: none; } }
335
- .compositor textarea {
336
- width: 100%; min-height: 44px; max-height: 40vh; resize: none; border: 0; outline: 0;
337
- background: transparent; color: var(--texto); font: 15px/1.5 var(--fonte); padding: 0 2px;
338
- }
339
- .compositor textarea::placeholder { color: var(--mais-fraco); }
340
- .controles { display: flex; align-items: center; gap: 6px; min-width: 0; }
341
- .controles > * { flex: none; }
342
- .controles > .espaco { flex: 1; }
343
- .controles > .icone-btn:first-child { margin-left: -3px; color: var(--texto-2); }
344
-
345
- .chip-perm {
346
- flex: 0 1 auto !important; min-width: 0; overflow: hidden;
347
- display: inline-flex; align-items: center; gap: 7px; height: 30px; padding: 0 8px; border-radius: 8px;
348
- color: var(--fraco); font-size: 14px; margin-left: 6px; white-space: nowrap;
349
- }
350
- .chip-perm:hover { background: var(--hover); }
351
- .chip-perm .ic { width: 17px; height: 17px; }
352
- .chip-perm span { overflow: hidden; text-overflow: ellipsis; }
353
- .chip-perm[data-modo="livre"] { color: var(--laranja); }
354
-
355
- .seletor {
356
- display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 8px; border-radius: 8px;
357
- color: var(--fraco); font-size: 14px; white-space: nowrap;
358
- }
359
- .seletor b { font-weight: 500; color: var(--texto-2); }
360
- .seletor:hover { background: var(--hover); }
361
-
362
- .enviar {
363
- width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center; margin-left: 2px;
364
- background: var(--marca); color: var(--marca-texto);
365
- }
366
- .enviar .ic { width: 17px; height: 17px; stroke-width: 2; }
367
- .enviar:disabled { background: var(--enviar-off); color: var(--enviar-off-texto); cursor: default; }
368
- .enviar.parar { background: var(--texto); color: var(--fundo); }
369
-
370
- .anexos { display: flex; flex-wrap: wrap; gap: 6px; }
371
- .anexo {
372
- display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 6px 0 9px;
373
- background: var(--hover); border: 1px solid var(--borda); border-radius: 8px; font-size: 13px; color: var(--texto-2);
374
- }
375
- .anexo .ic { width: 14px; height: 14px; }
376
- .anexo button { display: grid; place-items: center; width: 18px; height: 18px; border-radius: 5px; color: var(--fraco); }
377
- .anexo button:hover { background: var(--hover); color: var(--texto); }
378
-
379
- /* ── o menu flutuante ─────────────────────────────────────────────────── */
380
-
381
- .menu {
382
- position: fixed; z-index: 20; min-width: 230px; max-width: 340px; max-height: 60vh; overflow-y: auto;
383
- background: var(--menu); border-radius: 12px; box-shadow: var(--sombra); padding: 5px;
384
- }
385
- .menu-titulo { color: var(--fraco); font-size: 12px; padding: 7px 10px 4px; }
386
- .menu-item {
387
- display: flex; align-items: flex-start; gap: 10px; width: 100%; padding: 7px 10px; border-radius: 8px; text-align: left;
388
- }
389
- .menu-item:hover, .menu-item:focus-visible { background: var(--hover); outline: 0; }
390
- .menu-item .ic { width: 16px; height: 16px; margin-top: 1px; color: var(--fraco); }
391
- .menu-item .rot { flex: 1; min-width: 0; }
392
- .menu-item .rot span { display: block; color: var(--fraco); font-size: 12.5px; margin-top: 1px; }
393
- .menu-item .marcado { color: var(--marca); font-size: 13px; }
394
- .menu-item.laranja, .menu-item.laranja .ic { color: var(--laranja); }
395
- .menu-sep { height: 1px; background: var(--borda); margin: 5px 4px; }
396
- .menu-entrada { display: flex; gap: 6px; padding: 6px; }
397
- .menu-entrada input {
398
- flex: 1; min-width: 0; height: 30px; padding: 0 9px; font: inherit; color: var(--texto);
399
- background: var(--fundo); border: 1px solid var(--borda-forte); border-radius: 7px;
400
- }
401
- .menu-entrada button { padding: 0 10px; border-radius: 7px; background: var(--ativo); }
402
-
403
- /* ── o painel da direita ─────────────────────────────────────────────── */
404
-
405
- .painel {
406
- width: var(--largura-painel); min-width: 340px; max-width: 760px; flex: none;
407
- display: flex; flex-direction: column; border-left: 1px solid var(--borda); background: var(--fundo);
408
- }
409
- .painel-topo { height: 42px; display: flex; align-items: center; gap: 4px; padding: 0 8px 0 10px; border-bottom: 1px solid var(--borda); }
410
- .abas { display: flex; gap: 2px; }
411
- .aba { height: 28px; padding: 0 11px; border-radius: 7px; color: var(--fraco); }
412
- .aba:hover { color: var(--texto); }
413
- .aba[aria-selected="true"] { background: var(--ativo); color: var(--texto); }
414
- .painel-corpo { flex: 1; min-height: 0; position: relative; display: flex; }
415
- .previa { flex: 1; border: 0; background: #fff; width: 100%; }
416
- .painel-vazio {
417
- position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;
418
- gap: 4px; padding: 24px; text-align: center; background: var(--fundo);
419
- }
420
- .painel-vazio p { margin: 0; max-width: 34ch; }
421
- .painel-vazio .mascote { margin-bottom: 10px; }
422
- .arquivos { display: grid; grid-template-rows: minmax(120px, 40%) 1fr; }
423
- .arvore { overflow: auto; padding: 8px 6px; border-bottom: 1px solid var(--borda); font-size: 13px; }
424
- .no {
425
- display: flex; align-items: center; gap: 6px; width: 100%; height: 26px; padding-right: 8px; border-radius: 6px;
426
- text-align: left; color: var(--texto-2); white-space: nowrap;
427
- }
428
- .no:hover { background: var(--hover); }
429
- .no[aria-selected="true"] { background: var(--ativo); color: var(--texto); }
430
- .no .ic { width: 15px; height: 15px; color: var(--fraco); }
431
- .no .nome { overflow: hidden; text-overflow: ellipsis; }
432
- .no.mudou .nome::after { content: " •"; color: var(--marca); }
433
- .visor { display: flex; flex-direction: column; min-height: 0; }
434
- .visor-topo { padding: 8px 14px; color: var(--fraco); font-size: 12.5px; border-bottom: 1px solid var(--borda); font-family: var(--mono); }
435
- .visor-texto { flex: 1; margin: 0; padding: 10px 0; overflow: auto; font: 12px/1.6 var(--mono); color: var(--texto-2); counter-reset: l; }
436
- .visor-texto .ln { display: block; padding: 0 14px 0 0; white-space: pre; }
437
- .visor-texto .ln::before {
438
- counter-increment: l; content: counter(l); display: inline-block; width: 3.4em; margin-right: 12px;
439
- text-align: right; color: var(--mais-fraco); user-select: none;
440
- }
441
-
442
- /* ── diálogo ──────────────────────────────────────────────────────────── */
443
-
444
- .dialogo {
445
- width: min(520px, calc(100vw - 32px)); padding: 0; border: 0; border-radius: 14px;
446
- background: var(--menu); color: var(--texto); box-shadow: var(--sombra);
447
- }
448
- .dialogo::backdrop { background: rgba(0, 0, 0, 0.5); }
449
- .dlg-topo { display: flex; align-items: center; justify-content: space-between; padding: 14px 14px 4px 20px; }
450
- .dlg-topo h2 { margin: 0; font-size: 16px; font-weight: 600; }
451
- .dlg-corpo { padding: 4px 20px 20px; }
452
- .dlg-corpo h3 { font-size: 12.5px; font-weight: 500; color: var(--fraco); margin: 14px 0 8px; }
453
- .dlg-corpo p { margin: 0 0 8px; font-size: 13px; }
454
- .atalhos { display: grid; grid-template-columns: max-content 1fr; gap: 8px 16px; margin: 0; align-items: center; }
455
- .atalhos dd { margin: 0; color: var(--texto-2); }
456
- kbd {
457
- font: 12px var(--mono); padding: 2px 6px; border-radius: 5px; background: var(--hover);
458
- border: 1px solid var(--borda-forte); color: var(--texto-2);
459
- }
460
- .comandos { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; }
461
- .comandos button { text-align: left; padding: 7px 10px; border-radius: 8px; font-family: var(--mono); font-size: 13px; }
462
- .comandos button:hover { background: var(--hover); }
463
- .comandos span { display: block; font-family: var(--fonte); color: var(--fraco); font-size: 12px; }
464
-
465
- /* ── soltar arquivo ───────────────────────────────────────────────────── */
466
-
467
- .alvo-solto {
468
- position: fixed; inset: 0; z-index: 30; display: none; place-items: center;
469
- background: rgba(0, 0, 0, 0.45); pointer-events: none;
470
- }
471
- body.soltando .alvo-solto { display: grid; }
472
- .alvo-solto > div {
473
- display: flex; flex-direction: column; gap: 4px; align-items: center; padding: 28px 40px;
474
- border: 1.5px dashed var(--marca); border-radius: 18px; background: var(--menu);
475
- }
476
- .alvo-solto span { color: var(--fraco); }
477
-
478
- /* ── telas estreitas ──────────────────────────────────────────────────
479
- Abaixo de 1100px o painel não cabe ao lado da conversa e passa a flutuar
480
- por cima; abaixo de 960px a barra lateral também, e começa recolhida. */
481
- @media (max-width: 960px) {
482
- .lado { position: absolute; z-index: 10; top: 0; bottom: 0; left: 0; box-shadow: var(--sombra); }
483
- }
484
- @media (max-width: 1100px) {
485
- .painel { position: absolute; z-index: 9; top: 0; bottom: 0; right: 0; width: min(560px, 92vw); min-width: 0; box-shadow: var(--sombra); }
486
- }
487
- @media (max-width: 640px) {
488
- .rodape { padding: 0 12px 12px; }
489
- .chat { padding-left: 14px; padding-right: 14px; }
490
- .chip-perm span, .seletor span { display: none; }
491
- .comandos { grid-template-columns: 1fr; }
492
- }
493
- @media (prefers-reduced-motion: reduce) {
494
- *, *::before, *::after { animation: none !important; transition: none !important; }
495
- }
496
-
497
- /* A saída de um comando também aparece no chat, sobre o fundo de código do
498
- tema — no claro, o "branco de terminal" sumiria. */
499
- :root[data-tema="claro"] .saida-comando .c254 { color: var(--texto); }
500
- :root[data-tema="claro"] .saida-comando .c247 { color: var(--fraco); }