primocode 10.15.2 → 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.
- package/LICENSES/edit-ia-pro.txt +32 -0
- package/LICENSES/fontes-OFL.txt +476 -0
- package/LICENSES/hyperframes-Apache-2.0.txt +205 -0
- package/LICENSES/permanent-marker-Apache-2.0.txt +204 -0
- package/LICENSES/selfie-multiclass-Apache-2.0.txt +227 -0
- package/LICENSES/three-MIT.txt +23 -0
- package/LICENSES/video-use-MIT.txt +24 -0
- package/LICENSES/woven-sfx-CC0.txt +16 -0
- package/LICENSES/yunet-MIT.txt +21 -0
- package/README.md +2 -2
- package/bin/primocode.js +74 -9
- package/editor/LICENSE.md +11 -0
- package/editor/README.md +321 -0
- package/editor/SKILL.md +307 -0
- package/editor/THIRD_PARTY_NOTICES.md +228 -0
- package/editor/assets/baixar.json +591 -0
- package/editor/assets/fonts/anton/OFL.txt +93 -0
- package/editor/assets/fonts/caveat/OFL.txt +93 -0
- package/editor/assets/fonts/figtree/OFL.txt +93 -0
- package/editor/assets/fonts/fonts.json +10 -0
- package/editor/assets/fonts/montserrat/OFL.txt +93 -0
- package/editor/assets/fonts/permanentmarker/LICENSE.txt +202 -0
- package/editor/assets/models/SELFIE_MULTICLASS_LICENSE.txt +227 -0
- package/editor/assets/models/YUNET_LICENSE.txt +21 -0
- package/editor/assets/sfx/licencas/bass_drop.txt +32 -0
- package/editor/assets/sfx/licencas/cash.txt +76 -0
- package/editor/assets/sfx/licencas/charge.txt +31 -0
- package/editor/assets/sfx/licencas/click.txt +46 -0
- package/editor/assets/sfx/licencas/coin.txt +50 -0
- package/editor/assets/sfx/licencas/count.txt +47 -0
- package/editor/assets/sfx/licencas/data.txt +31 -0
- package/editor/assets/sfx/licencas/error.txt +32 -0
- package/editor/assets/sfx/licencas/flash.txt +31 -0
- package/editor/assets/sfx/licencas/gears.txt +82 -0
- package/editor/assets/sfx/licencas/keyboard.txt +48 -0
- package/editor/assets/sfx/licencas/metal_hit.txt +62 -0
- package/editor/assets/sfx/licencas/metal_riser.txt +61 -0
- package/editor/assets/sfx/licencas/mouse_click.txt +50 -0
- package/editor/assets/sfx/licencas/notification.txt +54 -0
- package/editor/assets/sfx/licencas/pop.txt +38 -0
- package/editor/assets/sfx/licencas/rewind.txt +32 -0
- package/editor/assets/sfx/licencas/rise.txt +46 -0
- package/editor/assets/sfx/licencas/sinteticos.txt +21 -0
- package/editor/assets/sfx/licencas/snap.txt +50 -0
- package/editor/assets/sfx/licencas/success.txt +40 -0
- package/editor/assets/sfx/licencas/synth_hit.txt +32 -0
- package/editor/assets/sfx/licencas/tick.txt +14 -0
- package/editor/assets/sfx/licencas/whoosh.txt +47 -0
- package/editor/assets/sfx/licencas/wind.txt +31 -0
- package/editor/assets/sfx/sfx.json +832 -0
- package/editor/assets/sfx/sfx_sinteticos.json +317 -0
- package/editor/assets/sfx/sfx_woven.json +387 -0
- package/editor/assets/sfx/woven/LICENCA.md +16 -0
- package/editor/fichas/briefing-do-video.md +45 -0
- package/editor/fichas/conferencia-da-amostra.md +56 -0
- package/editor/fichas/matriz-de-ganchos.csv +3 -0
- package/editor/fichas/padrao.json +16 -0
- package/editor/fichas/planilha-de-cenas.csv +4 -0
- package/editor/fichas/planilha-de-versoes.csv +4 -0
- package/editor/fichas/plano-em-blocos.md +32 -0
- package/editor/fichas/registro-de-materiais.json +27 -0
- package/editor/helpers/assets_ocr/ocr_vision.swift +41 -0
- package/editor/helpers/bordas_precisas.py +272 -0
- package/editor/helpers/camera_viva.py +426 -0
- package/editor/helpers/captions.py +601 -0
- package/editor/helpers/common.py +308 -0
- package/editor/helpers/compose_final.py +3555 -0
- package/editor/helpers/conferir_corte.py +234 -0
- package/editor/helpers/conferir_dados.py +405 -0
- package/editor/helpers/contact_sheet.py +282 -0
- package/editor/helpers/corte_por_onda.py +433 -0
- package/editor/helpers/corte_seco.py +595 -0
- package/editor/helpers/denoise.py +971 -0
- package/editor/helpers/efeitos.py +408 -0
- package/editor/helpers/efeitos_gerar.py +159 -0
- package/editor/helpers/elevenlabs_api.py +442 -0
- package/editor/helpers/face_layout.py +570 -0
- package/editor/helpers/fetch_images.py +423 -0
- package/editor/helpers/ganho_por_trecho.py +214 -0
- package/editor/helpers/gen_image.py +312 -0
- package/editor/helpers/gen_music.py +316 -0
- package/editor/helpers/gen_sfx.py +148 -0
- package/editor/helpers/grade.py +307 -0
- package/editor/helpers/icloud.py +119 -0
- package/editor/helpers/make_sfx.py +940 -0
- package/editor/helpers/matte.py +1342 -0
- package/editor/helpers/medir_referencia.py +2232 -0
- package/editor/helpers/mixar_trilha.py +354 -0
- package/editor/helpers/montar_corte.py +295 -0
- package/editor/helpers/motion/__init__.py +13 -0
- package/editor/helpers/motion/engine.py +1915 -0
- package/editor/helpers/motion/registry.py +510 -0
- package/editor/helpers/motion/render.py +665 -0
- package/editor/helpers/motion/templates/barra_progresso.py +370 -0
- package/editor/helpers/motion/templates/carimbo.py +132 -0
- package/editor/helpers/motion/templates/checklist.py +271 -0
- package/editor/helpers/motion/templates/comentario_cta.py +380 -0
- package/editor/helpers/motion/templates/contador.py +222 -0
- package/editor/helpers/motion/templates/destaque.py +263 -0
- package/editor/helpers/motion/templates/etiqueta_preco.py +461 -0
- package/editor/helpers/motion/templates/grafico_barras.py +510 -0
- package/editor/helpers/motion/templates/grafico_linha.py +462 -0
- package/editor/helpers/motion/templates/notificacao.py +266 -0
- package/editor/helpers/motion/templates/palavra_impacto.py +410 -0
- package/editor/helpers/motion/templates/passos.py +321 -0
- package/editor/helpers/motion/templates/riscado.py +298 -0
- package/editor/helpers/motion/templates/selo_garantia.py +150 -0
- package/editor/helpers/motion_render.py +241 -0
- package/editor/helpers/motion_sugerir.py +961 -0
- package/editor/helpers/noise_check.py +134 -0
- package/editor/helpers/pack_transcripts.py +223 -0
- package/editor/helpers/palavras_na_onda.py +176 -0
- package/editor/helpers/plano_sfx.py +839 -0
- package/editor/helpers/portao.py +427 -0
- package/editor/helpers/preview_server.py +1177 -0
- package/editor/helpers/rastrear_rosto.py +298 -0
- package/editor/helpers/render_cut.py +1256 -0
- package/editor/helpers/respiros.py +89 -0
- package/editor/helpers/sincronizar_cameras.py +571 -0
- package/editor/helpers/speech_regions.py +423 -0
- package/editor/helpers/style_catalog.json +231 -0
- package/editor/helpers/style_samples.py +246 -0
- package/editor/helpers/tela_verde.py +2113 -0
- package/editor/helpers/text_render.py +2059 -0
- package/editor/helpers/texto_na_tela.py +366 -0
- package/editor/helpers/timeline_view.py +292 -0
- package/editor/helpers/tira_de_quadros.py +113 -0
- package/editor/helpers/transcribe.py +734 -0
- package/editor/helpers/transcribe_batch.py +129 -0
- package/editor/helpers/trilhas.py +1146 -0
- package/editor/helpers/trilhas_humores.json +66 -0
- package/editor/helpers/valores.py +187 -0
- package/editor/helpers/verify_cut.py +820 -0
- package/editor/helpers/voice_levels.py +233 -0
- package/editor/helpers/voz_check.py +386 -0
- package/editor/helpers/voz_limpa.py +81 -0
- package/editor/helpers/watch_preview.py +372 -0
- package/editor/modelo-projeto/LEIA.md +402 -0
- package/editor/modelo-projeto/assets/fontes/OFL-Caveat.txt +93 -0
- package/editor/modelo-projeto/assets/fontes/OFL-JetBrainsMono.txt +93 -0
- package/editor/modelo-projeto/assets/fontes/OFL-Montserrat.txt +93 -0
- package/editor/modelo-projeto/assets/fontes/larguras.json +1 -0
- package/editor/modelo-projeto/assets/three/BufferGeometryUtils.js +1438 -0
- package/editor/modelo-projeto/assets/three/GLTFLoader.js +4895 -0
- package/editor/modelo-projeto/assets/three/LICENSE +21 -0
- package/editor/modelo-projeto/assets/three/ORIGEM.txt +17 -0
- package/editor/modelo-projeto/assets/three/RoomEnvironment.js +185 -0
- package/editor/modelo-projeto/assets/three/three.core.min.js +6 -0
- package/editor/modelo-projeto/assets/three/three.module.min.js +6 -0
- package/editor/modelo-projeto/build.py +4828 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_antes_depois.html +199 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_arquivo.html +232 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_busca.html +315 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_comando.html +304 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_conversa.html +217 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_esquema.html +289 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_medidor.html +249 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_notas.html +233 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_caminho.html +197 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_explodida.html +152 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_tela.html +167 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_volume.html +124 -0
- package/editor/modelo-projeto/compositions/cenas/3d/motor-three.js +728 -0
- package/editor/modelo-projeto/compositions/cenas/LEIA.md +177 -0
- package/editor/modelo-projeto/ferramentas/medir_fontes.py +65 -0
- package/editor/modelo-projeto/ferramentas/pessoa_recortada.py +176 -0
- package/editor/modelo-projeto/ferramentas/rastrear_maos.py +189 -0
- package/editor/modelo-projeto/hyperframes.json +12 -0
- package/editor/modelo-projeto/package.json +11 -0
- package/editor/modelo-projeto/projeto.json +16 -0
- package/editor/preview/app.css +1009 -0
- package/editor/preview/app.js +2122 -0
- package/editor/preview/index.html +307 -0
- package/editor/pyproject.toml +23 -0
- package/editor/references/3d.md +236 -0
- package/editor/references/animacao-catalogo.md +672 -0
- package/editor/references/animacao.md +498 -0
- package/editor/references/comandos.md +92 -0
- package/editor/references/corte-seco-como-funciona.md +50 -0
- package/editor/references/corte-seco.md +88 -0
- package/editor/references/corte.md +290 -0
- package/editor/references/direcao-por-blocos.md +218 -0
- package/editor/references/enquadramento.md +654 -0
- package/editor/references/estilos-prontos.md +355 -0
- package/editor/references/estudio.md +100 -0
- package/editor/references/exemplo-eventos.json +67 -0
- package/editor/references/lettering.md +252 -0
- package/editor/references/modelos.md +494 -0
- package/editor/references/phase2.md +1007 -0
- package/editor/references/referencia-aplicar.md +203 -0
- package/editor/references/referencia-medir.md +375 -0
- package/editor/references/revisao.md +335 -0
- package/editor/references/som-e-trilha.md +146 -0
- package/editor/references/tabela-de-sons.md +130 -0
- package/editor/references/variacoes.md +234 -0
- package/editor/uv.lock +1141 -0
- package/lib/act.js +38 -8
- package/lib/app-chat.js +97 -0
- package/lib/catalogo.js +7 -1
- package/lib/chamada-torta.js +81 -0
- package/lib/editor-pro.js +786 -0
- package/lib/entrega.js +58 -0
- package/lib/estudio/conferencia-visual.js +76 -0
- package/lib/estudio/diretor.js +6 -1
- package/lib/estudio/exportar.js +3 -1
- package/lib/estudio/gosto/tela.html +1349 -0
- package/lib/estudio/gosto.js +305 -0
- package/lib/estudio/index.js +12 -1
- package/lib/estudio/kit-ae/base.jsx +119 -13
- package/lib/estudio/kit-ae/cenas.jsx +47 -15
- package/lib/estudio/kit-ae/guarda.jsx +274 -0
- package/lib/estudio/kit-ae/primitivas.jsx +180 -24
- package/lib/estudio/maquina-diretor.js +70 -12
- package/lib/estudio/maquina-foto.js +177 -0
- package/lib/estudio/maquina-guarda.js +207 -0
- package/lib/estudio/maquina-layout.js +22 -1
- package/lib/estudio/maquina.js +64 -11
- package/lib/estudio/referencias.js +1 -1
- package/lib/estudio/visao/visao.swift +97 -0
- package/lib/estudio/visao.js +60 -0
- package/lib/headless.js +15 -3
- package/lib/local/cerebro.json +285 -7
- package/lib/local/motor.js +5 -2
- package/lib/memoria-usuario.js +164 -0
- package/lib/nuvem.js +33 -2
- package/lib/passagem.js +50 -0
- package/lib/perigo.js +19 -11
- package/lib/protecao.js +134 -0
- package/lib/repeticao.js +1 -1
- package/lib/sandbox.js +57 -9
- package/lib/titulo-conversa.js +46 -0
- package/lib/tools.js +23 -4
- package/lib/ui.js +2 -2
- package/package.json +3 -2
- package/skills/editar-meu-video/SKILL.md +6 -2
- package/skills/editar-video/SKILL.md +113 -0
- package/studio/pessoa.py +52 -0
- package/voz/primo_voz/__main__.py +55 -40
- package/voz/primo_voz/app.py +500 -4
- package/voz/primo_voz/chat.html +1773 -0
- package/voz/primo_voz/conversa.py +0 -26
- package/voz/primo_voz/hud.html +8 -2
- package/voz/primo_voz/hud.py +129 -5
- package/voz/primo_voz/identidade.py +1 -1
- package/voz/primo_voz/painel_dados.py +134 -0
|
@@ -0,0 +1,1773 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="pt-BR">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Primo</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600&family=Geist+Mono:wght@400;500&family=Instrument+Serif:ital@0;1&display=swap" rel="stylesheet">
|
|
10
|
+
<style>
|
|
11
|
+
html,body{height:100%}
|
|
12
|
+
body{margin:0;background:#131312;overflow:hidden}
|
|
13
|
+
a{color:#67e8f9}a:hover{color:#22d3ee}
|
|
14
|
+
.app *{box-sizing:border-box}
|
|
15
|
+
.app button{font:inherit;color:inherit}
|
|
16
|
+
.app button{-webkit-user-select:none;user-select:none}
|
|
17
|
+
.mono{font-family:'Geist Mono',monospace}
|
|
18
|
+
.app{position:relative;height:100vh;display:flex;background:#131312;color:#ecebe6;font-family:Geist,system-ui,sans-serif;-webkit-font-smoothing:antialiased;overflow:hidden}
|
|
19
|
+
#lado{flex:0 0 260px;width:260px;background:#0f0f0e;border-right:1px solid #1f1f1d;padding:28px 12px 16px;display:flex;flex-direction:column;gap:2px;min-height:0}
|
|
20
|
+
#lista{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;gap:1px}
|
|
21
|
+
#lista::-webkit-scrollbar{width:6px}#lista::-webkit-scrollbar-thumb{background:#262624;border-radius:3px}
|
|
22
|
+
#rolagem{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;padding:32px 24px 12px;overflow:auto;width:100%}
|
|
23
|
+
/* lateral */
|
|
24
|
+
.navbtn{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;border:0;border-radius:9px;background:transparent;color:#cfcec8;font-size:13.5px;text-align:left;cursor:pointer;transition:background .15s,color .15s}
|
|
25
|
+
.navbtn:hover{background:#1c1c1a;color:#ecebe6}
|
|
26
|
+
.navbtn.on{background:#1f1f1d;color:#ecebe6}
|
|
27
|
+
.navbtn.on svg{color:#22d3ee}
|
|
28
|
+
.conv{position:relative;display:flex;align-items:center;gap:8px;width:100%;flex:none;padding:7px 10px;border:0;border-radius:9px;background:transparent;color:#a3a29b;font-size:13px;text-align:left;cursor:pointer;transition:background .15s,color .15s}
|
|
29
|
+
.conv span.t{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
30
|
+
.conv:hover{background:#1c1c1a;color:#ecebe6}
|
|
31
|
+
.conv.on{background:#1f1f1d;color:#ecebe6}
|
|
32
|
+
.conv-w{position:relative;flex:none}
|
|
33
|
+
.conv-w .conv{padding-right:34px}
|
|
34
|
+
.conv-x{position:absolute;right:4px;top:50%;transform:translateY(-50%);height:24px;min-width:24px;padding:0 6px;border:0;border-radius:7px;background:transparent;color:#74736d;font-size:11.5px;cursor:pointer;display:grid;place-items:center;opacity:0;transition:opacity .15s,background .15s,color .15s}
|
|
35
|
+
.conv-w:hover .conv-x,.conv-x.conf,.conv-x:focus-visible{opacity:1}
|
|
36
|
+
.conv-x:hover{background:#2e2e2b;color:#f08a7e}
|
|
37
|
+
.conv-x.conf{background:#3a1f1c;color:#f08a7e}
|
|
38
|
+
.apagar{flex:none;height:34px;padding:0 14px;border:1px solid #2e2e2b;border-radius:999px;background:transparent;color:#f08a7e;font-size:13px;cursor:pointer;transition:all .2s}
|
|
39
|
+
.apagar:hover{border-color:#f08a7e}
|
|
40
|
+
.apagar.conf{background:#3a1f1c;border-color:transparent}
|
|
41
|
+
.limpar{border:0;background:transparent;color:#74736d;font:400 10.5px 'Geist Mono',monospace;letter-spacing:.06em;cursor:pointer;padding:2px 4px;border-radius:5px}
|
|
42
|
+
.limpar:hover{color:#f08a7e}
|
|
43
|
+
.limpar.conf{color:#f08a7e;background:#3a1f1c}
|
|
44
|
+
.avatar{flex:none;width:30px;height:30px;border-radius:50%;background:#22d3ee;color:#06191c;display:grid;place-items:center;font-weight:600;font-size:13px}
|
|
45
|
+
/* telas */
|
|
46
|
+
.sug{display:flex;align-items:center;gap:12px;width:100%;padding:12px 14px;border:0;border-bottom:1px solid #232321;background:transparent;color:#cfcec8;font-size:14px;text-align:left;cursor:pointer;transition:color .2s,padding .25s cubic-bezier(.3,1.5,.5,1)}
|
|
47
|
+
.sug:hover{color:#ecebe6;padding-left:22px}
|
|
48
|
+
.sug:hover .seta{opacity:1;transform:translateX(0)}
|
|
49
|
+
.seta{margin-left:auto;opacity:0;transform:translateX(-8px);transition:all .25s cubic-bezier(.3,1.5,.5,1);color:#22d3ee}
|
|
50
|
+
.linha-lista{display:flex;align-items:center;gap:16px;padding:16px 4px;border-bottom:1px solid #232321}
|
|
51
|
+
.tela-entra .linha-lista{animation:sugin .5s cubic-bezier(.3,1.4,.5,1) both}
|
|
52
|
+
.chave{flex:none;position:relative;width:42px;height:24px;border:0;border-radius:999px;background:#2e2e2b;cursor:pointer;transition:background .25s}
|
|
53
|
+
.chave::after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#a3a29b;transition:transform .3s cubic-bezier(.3,1.6,.5,1),background .25s}
|
|
54
|
+
.chave.on{background:#3b6fd4}
|
|
55
|
+
.chave.on::after{transform:translateX(18px);background:#fff}
|
|
56
|
+
.busca{width:100%;height:52px;padding:0 18px 0 48px;border:1px solid #2e2e2b;border-radius:16px;background:#1a1a18;color:#ecebe6;font:400 16px Geist,system-ui,sans-serif;outline:0;transition:border-color .2s,box-shadow .3s}
|
|
57
|
+
.busca:focus{border-color:#3d4a4c;box-shadow:0 0 0 6px rgba(34,211,238,.06)}
|
|
58
|
+
.res{display:flex;align-items:center;gap:12px;width:100%;padding:13px 6px;border:0;border-bottom:1px solid #232321;background:transparent;color:#cfcec8;font-size:14px;text-align:left;cursor:pointer;transition:color .15s,padding .25s}
|
|
59
|
+
.res:hover{color:#ecebe6;padding-left:14px}
|
|
60
|
+
.solta{position:absolute;inset:12px;z-index:15;border:2px dashed rgba(34,211,238,.6);border-radius:24px;background:rgba(10,20,22,.82);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:grid;place-items:center;pointer-events:none;animation:abre .25s cubic-bezier(.3,1.5,.5,1) both}
|
|
61
|
+
.solta[hidden]{display:none}
|
|
62
|
+
.solta-caixa{display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}
|
|
63
|
+
.solta-mascote{animation:pulo .7s cubic-bezier(.3,1.6,.5,1) infinite alternate;filter:drop-shadow(0 0 24px rgba(34,211,238,.5))}
|
|
64
|
+
@keyframes pulo{0%{transform:translateY(0) scale(1)}100%{transform:translateY(-14px) scale(1.06)}}
|
|
65
|
+
/* ajustes, estilo macOS */
|
|
66
|
+
.lado-cfg{display:flex;align-items:center;gap:10px;width:100%;padding:6px 8px;border:0;border-radius:8px;background:transparent;color:#cfcec8;font-size:13.5px;text-align:left;cursor:pointer;transition:background .15s}
|
|
67
|
+
.lado-cfg:hover{background:#1c1c1a}
|
|
68
|
+
.lado-cfg.on{background:#3b6fd4;color:#fff}
|
|
69
|
+
.tile{flex:none;width:24px;height:24px;border-radius:6px;display:grid;place-items:center;color:#fff;box-shadow:inset 0 1px 0 rgba(255,255,255,.18)}
|
|
70
|
+
.grupo{background:#1c1c1a;border:1px solid #262624;border-radius:14px;overflow:hidden;margin-top:12px}
|
|
71
|
+
.lin{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:52px;padding:10px 16px;border-bottom:1px solid #262624;font-size:14px}
|
|
72
|
+
.lin:last-child{border-bottom:0}
|
|
73
|
+
.lin small{display:block;color:#8a8983;font-size:12px;margin-top:2px}
|
|
74
|
+
.tg{flex:none;position:relative;width:46px;height:28px;border:0;border-radius:999px;background:#3a3a37;cursor:pointer;transition:background .25s}
|
|
75
|
+
.tg::after{content:"";position:absolute;top:2px;left:2px;width:24px;height:24px;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgba(0,0,0,.35);transition:transform .32s cubic-bezier(.3,1.5,.5,1)}
|
|
76
|
+
.tg.on{background:#3b6fd4}
|
|
77
|
+
.tg.on::after{transform:translateX(18px)}
|
|
78
|
+
.seg{flex:none;display:inline-flex;padding:2px;border-radius:9px;background:#2a2a28;gap:2px}
|
|
79
|
+
.seg button{height:28px;padding:0 14px;border:0;border-radius:7px;background:transparent;color:#a3a29b;font-size:13px;cursor:pointer;transition:background .2s,color .2s,box-shadow .2s}
|
|
80
|
+
.seg button.on{background:#4a4a46;color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}
|
|
81
|
+
.sel{flex:none;appearance:none;-webkit-appearance:none;height:30px;padding:0 30px 0 12px;border:1px solid #333330;border-radius:8px;background:#2a2a28;color:#ecebe6;font:400 13px Geist,system-ui,sans-serif;cursor:pointer;outline:0}
|
|
82
|
+
.sel:focus{border-color:#3b6fd4}
|
|
83
|
+
.sel-w{position:relative;flex:none;display:inline-flex}
|
|
84
|
+
.sel-w svg{position:absolute;right:9px;top:9px;pointer-events:none;color:#a3a29b}
|
|
85
|
+
.logo-ia{flex:none;width:40px;height:40px;border-radius:11px;display:grid;place-items:center}
|
|
86
|
+
.ico-cfg{flex:none;width:34px;height:34px;border:0;border-radius:9px;background:transparent;color:#8a8983;display:grid;place-items:center;cursor:pointer;transition:background .15s,color .15s,transform .5s cubic-bezier(.3,1.5,.5,1)}
|
|
87
|
+
.ico-cfg:hover{background:#1c1c1a;color:#ecebe6;transform:rotate(60deg)}
|
|
88
|
+
.conectar{flex:none;height:34px;padding:0 14px;border:1px solid #2e2e2b;border-radius:999px;background:transparent;color:#cfcec8;font-size:13px;cursor:pointer;transition:all .2s}
|
|
89
|
+
.conectar:hover{border-color:#22d3ee;color:#ecebe6}
|
|
90
|
+
.conectar.on{border-color:transparent;background:rgba(122,215,163,.12);color:#7ad7a3;cursor:default}
|
|
91
|
+
.entrar{flex:none;height:34px;padding:0 16px;border:0;border-radius:999px;background:#3b6fd4;color:#fff;font-size:13px;cursor:pointer;transition:background .2s,transform .3s cubic-bezier(.3,1.7,.5,1)}
|
|
92
|
+
.entrar:hover{background:#4a7de0;transform:scale(1.05)}
|
|
93
|
+
.campo{width:100%;height:42px;padding:0 14px;border:1px solid #2e2e2b;border-radius:12px;background:#1a1a18;color:#ecebe6;font:400 14px 'Geist Mono',monospace;outline:0}
|
|
94
|
+
.campo:focus{border-color:#3d4a4c}
|
|
95
|
+
.campo-s{height:34px;border-radius:9px;max-width:240px;font-size:13px}
|
|
96
|
+
/* caixa */
|
|
97
|
+
.caixa{position:relative;border:1px solid #2e2e2b;border-radius:26px;background:#1a1a18;transition:border-color .25s,box-shadow .35s}
|
|
98
|
+
.caixa:focus-within{border-color:#3d4a4c;box-shadow:0 0 0 6px rgba(34,211,238,.06),0 20px 60px rgba(0,0,0,.45)}
|
|
99
|
+
.entrada{display:block;width:100%;min-height:28px;max-height:160px;border:0;outline:0;resize:none;background:transparent;color:#ecebe6;font:400 15.5px/1.55 Geist,system-ui,sans-serif}
|
|
100
|
+
.entrada::placeholder{color:#74736d}
|
|
101
|
+
.mais{width:36px;height:36px;border:1px solid #2e2e2b;border-radius:50%;background:transparent;display:grid;place-items:center;color:#a3a29b;cursor:pointer;transition:transform .3s cubic-bezier(.3,1.6,.5,1),color .2s,border-color .2s}
|
|
102
|
+
.mais:hover,.mais.on{color:#ecebe6;border-color:#4a4a45}
|
|
103
|
+
.chip{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 11px;border:0;border-radius:999px;background:transparent;color:#a3a29b;font-size:12.5px;cursor:pointer;transition:background .15s,color .15s}
|
|
104
|
+
.chip:hover,.chip.on{background:#232321;color:#ecebe6}
|
|
105
|
+
.anexo{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 6px 0 10px;border:1px solid #2e2e2b;border-radius:10px;background:#232321;font-size:12.5px;color:#cfcec8;max-width:100%;animation:entra .35s cubic-bezier(.3,1.5,.5,1) both}
|
|
106
|
+
.anexo span.n{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px}
|
|
107
|
+
.anexo button{flex:none;width:22px;height:22px;border:0;border-radius:6px;background:transparent;color:#8a8983;cursor:pointer;display:grid;place-items:center}
|
|
108
|
+
.anexo button:hover{background:#2e2e2b;color:#ecebe6}
|
|
109
|
+
.menu{position:absolute;bottom:58px;left:56px;min-width:300px;padding:6px;border:1px solid #2e2e2b;border-radius:16px;background:#1c1c1a;box-shadow:0 24px 60px rgba(0,0,0,.55);z-index:5;animation:abre .28s cubic-bezier(.3,1.5,.5,1) both;transform-origin:bottom left}
|
|
110
|
+
@keyframes abre{0%{opacity:0;transform:translateY(10px) scale(.94)}100%{opacity:1;transform:none}}
|
|
111
|
+
.opcao{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:0;border-radius:10px;background:transparent;color:#cfcec8;font-size:13.5px;text-align:left;cursor:pointer}
|
|
112
|
+
.opcao:hover{background:#232321;color:#ecebe6}
|
|
113
|
+
.opcao small{display:block;color:#8a8983;font-size:12px;margin-top:2px}
|
|
114
|
+
.opcao .ok{margin-left:auto;color:#22d3ee}
|
|
115
|
+
.rotulo{font-size:11px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:#8a8983}
|
|
116
|
+
.enviar{position:relative;flex:none;width:44px;height:44px;border:0;border-radius:50%;background:#3b6fd4;color:#fff;cursor:pointer;display:grid;place-items:center;transition:transform .35s cubic-bezier(.3,1.7,.5,1),background .3s}
|
|
117
|
+
.enviar:hover{transform:scale(1.08);background:#4a7de0}
|
|
118
|
+
.enviar:active{transform:scale(.92)}
|
|
119
|
+
.enviar svg{position:absolute;transition:opacity .22s,transform .45s cubic-bezier(.3,1.7,.5,1)}
|
|
120
|
+
.enviar .i-voz,.enviar .i-seta,.enviar .i-stop{opacity:0;transform:scale(.3) rotate(-90deg)}
|
|
121
|
+
.enviar.vazio .i-voz{opacity:1;transform:none}
|
|
122
|
+
.enviar.cheio .i-seta{opacity:1;transform:none}
|
|
123
|
+
.enviar.parar .i-stop{opacity:1;transform:none}
|
|
124
|
+
.enviar.semvoz{visibility:hidden;pointer-events:none}
|
|
125
|
+
/* mascote e título */
|
|
126
|
+
.mascote{transition:transform .35s cubic-bezier(.3,1.5,.5,1);filter:drop-shadow(0 0 26px rgba(34,211,238,.35))}
|
|
127
|
+
.pula-entra{animation:cai .9s cubic-bezier(.3,1.6,.5,1) both}
|
|
128
|
+
@keyframes cai{0%{opacity:0;transform:translateY(-60px) scale(.6)}60%{opacity:1}100%{transform:none}}
|
|
129
|
+
.corpo{animation:anda 1.6s ease-in-out infinite}
|
|
130
|
+
@keyframes anda{0%,100%{transform:translateY(0)}50%{transform:translateY(-.6px)}}
|
|
131
|
+
.perna-a{animation:passo .8s steps(2) infinite}
|
|
132
|
+
.perna-b{animation:passo .8s steps(2) infinite .4s}
|
|
133
|
+
@keyframes passo{0%{transform:translateY(0)}50%{transform:translateY(-1px)}}
|
|
134
|
+
.olhos{transition:transform .18s ease-out}
|
|
135
|
+
.pisca{animation:pisca2 4.5s infinite;transform-origin:8px 3px;transform-box:view-box}
|
|
136
|
+
@keyframes pisca2{0%,92%,100%{transform:scaleY(1)}95%{transform:scaleY(.1)}}
|
|
137
|
+
.titulo-entra{animation:titulo 1s cubic-bezier(.2,1,.3,1) .15s both}
|
|
138
|
+
@keyframes titulo{0%{opacity:0;letter-spacing:.2em;filter:blur(12px)}100%{opacity:1;letter-spacing:-.01em;filter:none}}
|
|
139
|
+
.palavra{color:#22d3ee;font-style:italic;display:inline-block;min-width:1ch}
|
|
140
|
+
.cursor-t{display:inline-block;width:3px;height:.82em;margin-left:4px;vertical-align:-.04em;background:#22d3ee;animation:cur 1s steps(2) infinite}
|
|
141
|
+
@keyframes cur{50%{opacity:0}}
|
|
142
|
+
.sug-entra{animation:sugin .6s cubic-bezier(.3,1.4,.5,1) both}
|
|
143
|
+
@keyframes sugin{0%{opacity:0;transform:translateX(-28px)}100%{opacity:1;transform:none}}
|
|
144
|
+
.linha-luz{height:1px;background:linear-gradient(90deg,transparent,#22d3ee,transparent);animation:luz 3.2s ease-in-out infinite}
|
|
145
|
+
@keyframes luz{0%{transform:scaleX(0);opacity:0}40%{transform:scaleX(1);opacity:.8}100%{transform:scaleX(1);opacity:0}}
|
|
146
|
+
.msg{animation:entra .5s cubic-bezier(.3,1.4,.5,1) both}
|
|
147
|
+
@keyframes entra{0%{opacity:0;transform:translateY(14px)}100%{opacity:1;transform:none}}
|
|
148
|
+
.ponto{width:7px;height:7px;border-radius:50%;background:#22d3ee;animation:pula 1s ease-in-out infinite}
|
|
149
|
+
@keyframes pula{0%,100%{transform:translateY(0);opacity:.4}50%{transform:translateY(-6px);opacity:1}}
|
|
150
|
+
.tela-entra{animation:sobe .55s cubic-bezier(.3,1.4,.5,1) both}
|
|
151
|
+
@keyframes sobe{0%{opacity:0;transform:translateY(24px);filter:blur(6px)}100%{opacity:1;transform:none;filter:none}}
|
|
152
|
+
/* markdown do Primo */
|
|
153
|
+
.md{min-width:0;flex:1;padding-top:4px;color:#cfcec8;font-size:15px;line-height:1.6;overflow-wrap:anywhere}
|
|
154
|
+
.md>*:last-child{margin-bottom:0}
|
|
155
|
+
.md p{margin:0 0 .8em}
|
|
156
|
+
.md ul{margin:0 0 .8em;padding-left:1.3em}
|
|
157
|
+
.md li{margin:.15em 0}
|
|
158
|
+
.md code{font-family:'Geist Mono',monospace;font-size:.88em;background:#232321;border-radius:5px;padding:1px 5px;color:#ecebe6}
|
|
159
|
+
.md pre{margin:0 0 .8em;padding:12px 14px;background:#0f0f0e;border:1px solid #262624;border-radius:12px;overflow:auto}
|
|
160
|
+
.md pre code{background:none;padding:0;font-size:13px;line-height:1.55;white-space:pre}
|
|
161
|
+
.md strong{color:#ecebe6;font-weight:600}
|
|
162
|
+
.cartao-av{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:10px;padding:11px 12px 11px 16px;border:1px solid #2e2e2b;border-radius:16px;background:#1c1c1a;font-size:13.5px;color:#cfcec8;animation:entra .35s cubic-bezier(.3,1.5,.5,1) both}
|
|
163
|
+
.cartao-av.erro{color:#f08a7e;border-color:#4a2a26}
|
|
164
|
+
.cartao-av button.x{flex:none;width:24px;height:24px;border:0;border-radius:6px;background:transparent;color:#8a8983;cursor:pointer;display:grid;place-items:center}
|
|
165
|
+
.cartao-av button.x:hover{background:#2e2e2b;color:#ecebe6}
|
|
166
|
+
.vazio-txt{color:#74736d;font-size:12.5px;padding:8px 10px}
|
|
167
|
+
|
|
168
|
+
/* markdown rico */
|
|
169
|
+
.md h3.hd,.md h4.hd,.md h5.hd{margin:1.1em 0 .45em;color:#ecebe6;font-weight:600;line-height:1.25}
|
|
170
|
+
.md .hd1{font:400 28px/1.15 'Instrument Serif',serif}
|
|
171
|
+
.md .hd2{font:400 23px/1.2 'Instrument Serif',serif}
|
|
172
|
+
.md .hd3{font-size:16px}
|
|
173
|
+
.md>.hd:first-child{margin-top:0}
|
|
174
|
+
.md em{font-style:italic;color:#e3e2dc}
|
|
175
|
+
.md del{color:#8a8983}
|
|
176
|
+
.md hr{border:0;height:1px;background:linear-gradient(90deg,transparent,#2e2e2b,transparent);margin:1.2em 0}
|
|
177
|
+
.md blockquote{margin:0 0 .8em;padding:2px 0 2px 14px;border-left:2px solid #22d3ee;color:#a3a29b}
|
|
178
|
+
.md blockquote p:last-child{margin-bottom:0}
|
|
179
|
+
.md ol{margin:0 0 .8em;padding-left:1.5em}
|
|
180
|
+
.md li>ul,.md li>ol{margin:.2em 0 .2em}
|
|
181
|
+
.md li::marker{color:#74736d}
|
|
182
|
+
.md li.task{list-style:none;margin-left:-1.3em;display:flex;gap:9px;align-items:flex-start}
|
|
183
|
+
.ckb{flex:none;width:16px;height:16px;margin-top:4px;border:1.5px solid #4a4a45;border-radius:5px;display:grid;place-items:center;color:#06191c}
|
|
184
|
+
.ckb.on{background:#22d3ee;border-color:#22d3ee}
|
|
185
|
+
.feito{color:#8a8983;text-decoration:line-through}
|
|
186
|
+
.tb{margin:0 0 .8em;overflow:auto;border:1px solid #262624;border-radius:12px}
|
|
187
|
+
.tb table{border-collapse:collapse;width:100%;font-size:13.5px}
|
|
188
|
+
.tb th,.tb td{padding:8px 12px;border-bottom:1px solid #262624;white-space:nowrap}
|
|
189
|
+
.tb th{background:#1c1c1a;color:#ecebe6;font-weight:600;font-size:12.5px}
|
|
190
|
+
.tb tr:last-child td{border-bottom:0}
|
|
191
|
+
.cb{margin:0 0 .8em;border:1px solid #262624;border-radius:12px;background:#0f0f0e;overflow:hidden}
|
|
192
|
+
.cb-h,.mc-ch{display:flex;align-items:center;gap:8px;padding:7px 8px 7px 14px;background:#161615;border-bottom:1px solid #262624}
|
|
193
|
+
.cb-l{font:500 10.5px 'Geist Mono',monospace;letter-spacing:.1em;text-transform:uppercase;color:#22d3ee;background:rgba(34,211,238,.08);border-radius:5px;padding:2px 7px}
|
|
194
|
+
.cb-h .cb-l{margin-right:auto}
|
|
195
|
+
.cb pre{margin:0;border:0;border-radius:0;background:none}
|
|
196
|
+
.tc{color:#74736d;font-style:italic}.ts{color:#7ad7a3}.tn{color:#e8b86d}.tk{color:#22d3ee}
|
|
197
|
+
.chip-m{display:inline-flex;align-items:center;gap:6px;vertical-align:baseline;max-width:100%;height:24px;padding:0 9px 0 7px;border-radius:8px;background:rgba(34,211,238,.1);border:1px solid rgba(34,211,238,.25);color:#67e8f9;font-size:13px;line-height:1;cursor:pointer;transition:background .15s,transform .25s cubic-bezier(.3,1.7,.5,1)}
|
|
198
|
+
.chip-m:hover{background:rgba(34,211,238,.18);transform:translateY(-1px)}
|
|
199
|
+
.chip-m span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px}
|
|
200
|
+
.md code .chip-m{height:22px;font-family:Geist,system-ui,sans-serif}
|
|
201
|
+
/* cartões de mídia */
|
|
202
|
+
.mcs{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px;margin-top:12px}
|
|
203
|
+
.mcs-u{grid-template-columns:repeat(auto-fill,minmax(210px,1fr));margin-top:0;width:100%}
|
|
204
|
+
.mc{min-width:0;border:1px solid #2e2e2b;border-radius:16px;background:#1a1a18;overflow:hidden;animation:entra .5s cubic-bezier(.3,1.5,.5,1) both;transition:border-color .25s,box-shadow .35s}
|
|
205
|
+
.mc:hover{border-color:#3d4a4c}
|
|
206
|
+
.mc.flash{border-color:#22d3ee;box-shadow:0 0 0 5px rgba(34,211,238,.14)}
|
|
207
|
+
.mc-wide{grid-column:1/-1}
|
|
208
|
+
.mc-media{position:relative;background:#0f0f0e;display:block}
|
|
209
|
+
.mc-media video{display:block;width:100%;max-height:360px;background:#000}
|
|
210
|
+
.mc-img{cursor:zoom-in}
|
|
211
|
+
.mc-img img{display:block;width:100%;max-height:320px;object-fit:cover;transition:transform .5s cubic-bezier(.3,1.2,.5,1)}
|
|
212
|
+
.mc-img:hover img{transform:scale(1.03)}
|
|
213
|
+
.mc-pdf iframe{display:block;width:100%;height:420px;border:0;background:#fff}
|
|
214
|
+
.mc-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px}
|
|
215
|
+
.mc-nm{flex:1 1 120px;min-width:0;font-size:13px;color:#cfcec8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
216
|
+
.mc-nm small{display:block;color:#8a8983;font-size:11.5px;margin-top:1px}
|
|
217
|
+
.mc-video .mc-nm{cursor:pointer}
|
|
218
|
+
.mc-bt{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto}
|
|
219
|
+
.mc-b{height:26px;padding:0 10px;border:1px solid #2e2e2b;border-radius:999px;background:transparent;color:#a3a29b;font-size:12px;cursor:pointer;white-space:nowrap;transition:border-color .2s,color .2s}
|
|
220
|
+
.mc-b:hover{border-color:#22d3ee;color:#ecebe6}
|
|
221
|
+
.mc-row{display:flex;align-items:center;gap:12px;padding:10px 12px}
|
|
222
|
+
.mc-ic{flex:none;width:32px;height:32px;border-radius:9px;background:#232321;display:grid;place-items:center;color:#22d3ee}
|
|
223
|
+
.mc-ch .mc-ic{width:auto;height:auto;background:none}
|
|
224
|
+
.mc-ch .mc-nm{flex:0 1 auto;font-size:12.5px}
|
|
225
|
+
.mc-ch .mc-bt{margin-left:auto}
|
|
226
|
+
.mc-au{display:flex;align-items:center;gap:12px;padding:12px 12px 8px}
|
|
227
|
+
.au-p{flex:none;width:36px;height:36px;border:0;border-radius:50%;background:#3b6fd4;color:#fff;cursor:pointer;display:grid;place-items:center;transition:transform .3s cubic-bezier(.3,1.7,.5,1),background .2s}
|
|
228
|
+
.au-p:hover{transform:scale(1.08);background:#4a7de0}
|
|
229
|
+
.au-p .i-q{display:none}
|
|
230
|
+
.mc-au.tocando .i-p{display:none}.mc-au.tocando .i-q{display:block}
|
|
231
|
+
.au-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
|
|
232
|
+
.au-bar{height:5px;border-radius:3px;background:#2e2e2b;cursor:pointer;position:relative}
|
|
233
|
+
.au-bar::before{content:"";position:absolute;left:0;right:0;top:-7px;bottom:-7px}
|
|
234
|
+
.au-bar i{display:block;height:100%;width:0;border-radius:3px;background:#22d3ee}
|
|
235
|
+
.au-t{flex:none;font-size:11px;color:#8a8983}
|
|
236
|
+
.site-bar{padding:7px 12px;background:#161615;border-bottom:1px solid #262624;font-size:11.5px;color:#8a8983;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
237
|
+
.site-v{position:relative;aspect-ratio:16/10;overflow:hidden;background:#fff;cursor:pointer}
|
|
238
|
+
.site-v iframe{position:absolute;left:0;top:0;width:1280px;height:800px;border:0;transform:scale(var(--s,.2));transform-origin:0 0;pointer-events:none}
|
|
239
|
+
.cd{display:flex;overflow:auto;max-height:340px;background:#0f0f0e}
|
|
240
|
+
.cd .gut{flex:none;padding:12px 10px 12px 14px;text-align:right;color:#4a4a45;font:400 12.5px/1.6 'Geist Mono',monospace;white-space:pre;-webkit-user-select:none;user-select:none;border-right:1px solid #1f1f1d}
|
|
241
|
+
.cd pre{margin:0;padding:12px 14px;flex:1;min-width:0;font:400 12.5px/1.6 'Geist Mono',monospace;color:#cfcec8;overflow:visible;background:none;border:0}
|
|
242
|
+
.cd pre code{background:none;padding:0;font-size:inherit;line-height:inherit;white-space:pre}
|
|
243
|
+
.cd-n{padding:6px 14px;border-top:1px solid #1f1f1d;font:400 11px 'Geist Mono',monospace;color:#74736d}
|
|
244
|
+
#lb{position:fixed;inset:0;z-index:50;display:grid;place-items:center;background:rgba(8,8,8,.88);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);cursor:zoom-out;animation:abre .25s cubic-bezier(.3,1.5,.5,1) both}
|
|
245
|
+
#lb[hidden]{display:none}
|
|
246
|
+
#lb img{max-width:92vw;max-height:88vh;border-radius:14px;box-shadow:0 30px 80px rgba(0,0,0,.6)}
|
|
247
|
+
/* linha do tempo dos passos */
|
|
248
|
+
.passos{position:relative;display:flex;flex-direction:column;gap:2px;padding-top:10px}
|
|
249
|
+
.ps{position:relative;display:flex;align-items:flex-start;gap:10px;padding:3px 0;font-size:12.5px;line-height:1.5;color:#8a8983;overflow-wrap:anywhere}
|
|
250
|
+
.ps::before{content:"";position:absolute;left:10px;top:25px;bottom:-5px;width:1px;background:#262624}
|
|
251
|
+
.ps:last-child::before{display:none}
|
|
252
|
+
.pi{flex:none;position:relative;z-index:1;width:21px;height:21px;border-radius:50%;background:#1c1c1a;border:1px solid #2e2e2b;display:grid;place-items:center;color:#7ad7a3}
|
|
253
|
+
.ps.atual{color:#cfcec8;animation:entra .35s cubic-bezier(.3,1.5,.5,1) both}
|
|
254
|
+
.ps.atual .pi{color:#22d3ee;border-color:rgba(34,211,238,.5);animation:pulsa-p 1.4s ease-in-out infinite}
|
|
255
|
+
@keyframes pulsa-p{0%,100%{box-shadow:0 0 0 0 rgba(34,211,238,.35)}50%{box-shadow:0 0 0 6px rgba(34,211,238,0)}}
|
|
256
|
+
.ps .pt{padding-top:2px}
|
|
257
|
+
.ps-mais{font:400 11px 'Geist Mono',monospace;color:#74736d;padding:0 0 4px 31px}
|
|
258
|
+
|
|
259
|
+
/* paleta de comandos */
|
|
260
|
+
.menu.pal{left:0;right:0;bottom:calc(100% + 8px);min-width:0;max-height:360px;overflow:auto;animation:none;padding:6px}
|
|
261
|
+
.menu.pal.novo{animation:abre .28s cubic-bezier(.3,1.5,.5,1) both}
|
|
262
|
+
.pal-r{gap:12px;padding:8px 12px}
|
|
263
|
+
.pal-r.sel{background:#232321;color:#ecebe6}
|
|
264
|
+
.pal-r .pn{flex:none;min-width:118px;font:500 13px 'Geist Mono',monospace;color:#ecebe6}
|
|
265
|
+
.pal-r .pn.t-app{color:#22d3ee}
|
|
266
|
+
.pal-r .pn.t-pedido{color:#f5b94a}
|
|
267
|
+
.pal-r .pd{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#a3a29b;font-size:13px}
|
|
268
|
+
.pal-r .pt{flex:none;font:500 10px 'Geist Mono',monospace;letter-spacing:.08em;text-transform:uppercase;color:#74736d;border:1px solid #2e2e2b;border-radius:999px;padding:2px 8px}
|
|
269
|
+
.pal-dica{padding:6px 12px 4px;font:400 10.5px 'Geist Mono',monospace;color:#74736d;border-top:1px solid #262624;margin-top:4px}
|
|
270
|
+
.cmd-l{align-self:flex-end;max-width:78%;display:inline-flex;align-items:center;gap:9px;padding:9px 14px;border:1px solid #2e2e2b;border-radius:14px 14px 6px 14px;background:#1c1c1a;font:500 13.5px 'Geist Mono',monospace;color:#ecebe6;width:max-content;overflow-wrap:break-word}
|
|
271
|
+
.cmd-l svg{flex:none;color:#22d3ee}
|
|
272
|
+
.tsaida{border:1px solid #262624;border-radius:14px;background:#0b0b0a;overflow:hidden;max-width:100%}
|
|
273
|
+
.ts-h{display:flex;align-items:center;gap:9px;padding:7px 8px 7px 14px;background:#121211;border-bottom:1px solid #1f1f1d;color:#74736d}
|
|
274
|
+
.ts-h .mono{font-size:12px;color:#cfcec8;margin-right:auto}
|
|
275
|
+
.ts-b{display:block;margin:0;padding:12px 14px;overflow-x:auto;font:400 12.5px/1.55 'Geist Mono',monospace;color:#cfcec8;white-space:pre}
|
|
276
|
+
.ts-b .to-ok{color:#7ad7a3}.ts-b .to-err{color:#f08a7e}
|
|
277
|
+
.ts-b .tp{color:#7fb7c0}.ts-b .tnum{color:#e8b86d}
|
|
278
|
+
.ts-mais{display:block;width:100%;padding:8px 14px;border:0;border-top:1px solid #1f1f1d;background:#121211;color:#8a8983;font:400 11.5px 'Geist Mono',monospace;text-align:left;cursor:pointer}
|
|
279
|
+
.ts-mais:hover{color:#22d3ee}
|
|
280
|
+
.tsaida .chip-m{font-family:Geist,system-ui,sans-serif}
|
|
281
|
+
#toast{position:fixed;left:50%;bottom:112px;transform:translate(-50%,12px);z-index:60;padding:8px 16px;border-radius:999px;background:#232321;border:1px solid #3d4a4c;color:#ecebe6;font-size:13px;opacity:0;pointer-events:none;transition:opacity .25s,transform .35s cubic-bezier(.3,1.6,.5,1)}
|
|
282
|
+
#toast.show{opacity:1;transform:translate(-50%,0)}
|
|
283
|
+
|
|
284
|
+
/* esforço: cartão de vidro compacto com batentes */
|
|
285
|
+
.chip[hidden]{display:none}
|
|
286
|
+
.chip-ef{height:auto;padding:3px 8px;border-radius:6px;background:rgba(255,255,255,.10);color:#cfcec8;font-size:12.5px}
|
|
287
|
+
.chip-ef:hover,.chip-ef.on{background:rgba(255,255,255,.16);color:#ecebe6}
|
|
288
|
+
.chip-ef.ultra{color:#5aa2ff;box-shadow:inset 0 0 0 1px rgba(90,162,255,.28)}
|
|
289
|
+
.menu.efs-pop{width:260px;min-width:0;padding:12px 14px;border-radius:12px;background:rgba(60,60,58,.72);-webkit-backdrop-filter:blur(24px) saturate(140%);backdrop-filter:blur(24px) saturate(140%);border:1px solid rgba(255,255,255,.08);box-shadow:0 18px 44px rgba(0,0,0,.5)}
|
|
290
|
+
.ef-txt{font-size:13px;color:#a3a29b;line-height:1.5}
|
|
291
|
+
.ef-txt b{display:block;color:#ecebe6;font-weight:600;font-size:14px;margin-bottom:2px}
|
|
292
|
+
.efs{--p:0;--pad:13px;position:relative;outline:0;-webkit-user-select:none;user-select:none}
|
|
293
|
+
.grupo .efs{max-width:360px}
|
|
294
|
+
.efs-cab{display:flex;align-items:center;gap:6px;font-size:13px;color:#a3a29b}
|
|
295
|
+
.efs-nome{color:#ecebe6;font-weight:600;transition:color .3s}
|
|
296
|
+
.efs.ultra .efs-nome{color:#5aa2ff}
|
|
297
|
+
.efs-q{margin-left:auto;width:14px;height:14px;padding:0;border:1.2px solid #8a8983;border-radius:50%;background:transparent;color:#8a8983;font:600 9px Geist,system-ui,sans-serif;line-height:1;cursor:pointer;display:grid;place-items:center;transition:color .2s,border-color .2s}
|
|
298
|
+
.efs-q:hover,.efs.ajuda .efs-q{color:#ecebe6;border-color:#ecebe6}
|
|
299
|
+
.efs-ajuda{display:none;margin:6px 0 0;font-size:11.5px;line-height:1.4;color:#a3a29b}
|
|
300
|
+
.efs.ajuda .efs-ajuda{display:block}
|
|
301
|
+
.efs-eixo{display:flex;justify-content:space-between;margin:9px 0 6px;font-size:11.5px;color:#8a8983}
|
|
302
|
+
.efs-trilha{position:relative;height:22px;border-radius:999px;background:rgba(255,255,255,.10);cursor:grab;touch-action:none}
|
|
303
|
+
.efs.drag .efs-trilha{cursor:grabbing}
|
|
304
|
+
.efs-px{position:absolute;left:0;top:0;width:100%;height:100%;border-radius:999px;pointer-events:none;opacity:0;transition:opacity .45s}
|
|
305
|
+
.efs.ultra .efs-px{opacity:1}
|
|
306
|
+
.efs-mk{position:absolute;top:50%;left:calc(var(--pad) + var(--q)*(100% - var(--pad)*2));width:2px;height:2px;margin:-1px 0 0 -1px;border-radius:50%;background:rgba(255,255,255,.45);pointer-events:none}
|
|
307
|
+
.efs-mk.rec{width:1.5px;height:8px;margin:-4px 0 0 -.75px;border-radius:1px}
|
|
308
|
+
.efs-thumb{position:absolute;top:1px;left:calc(var(--pad) + var(--p)*(100% - var(--pad)*2));width:16px;height:20px;margin-left:-8px;border-radius:6px;background:#f2f2f0;box-shadow:0 1px 5px rgba(0,0,0,.4),inset 0 1px 0 rgba(255,255,255,.8);pointer-events:none}
|
|
309
|
+
@keyframes efbump{0%{transform:scale(1.25,.8)}55%{transform:scale(.95,1.07)}100%{transform:none}}
|
|
310
|
+
.efs.bump .efs-thumb{animation:efbump .45s cubic-bezier(.3,1.6,.5,1)}
|
|
311
|
+
.efs.ultra .efs-thumb{animation:efhalo 1.2s ease-in-out infinite}
|
|
312
|
+
.efs.ultra.bump .efs-thumb{animation:efhalo 1.2s ease-in-out infinite,efbump .45s cubic-bezier(.3,1.6,.5,1)}
|
|
313
|
+
@keyframes efhalo{0%,100%{box-shadow:0 1px 5px rgba(0,0,0,.4),0 0 5px 1px rgba(61,139,255,.5)}50%{box-shadow:0 1px 5px rgba(0,0,0,.4),0 0 9px 2px rgba(61,139,255,.7)}}
|
|
314
|
+
.efs-rec{position:relative;height:14px;margin-top:5px}
|
|
315
|
+
.efs-rec span{position:absolute;top:0;left:calc(var(--pad) + var(--q)*(100% - var(--pad)*2));transform:translateX(-50%);font-size:11px;color:#8a8983;white-space:nowrap}
|
|
316
|
+
@media (prefers-reduced-motion:reduce){.app *{animation:none !important;transition:none !important}}
|
|
317
|
+
</style>
|
|
318
|
+
</head>
|
|
319
|
+
<body>
|
|
320
|
+
<div class="app" id="app">
|
|
321
|
+
<aside id="lado">
|
|
322
|
+
<div id="nav"></div>
|
|
323
|
+
<div id="rotConv" style="display:flex;align-items:baseline;justify-content:space-between;padding:22px 10px 8px"></div>
|
|
324
|
+
<div id="lista"></div>
|
|
325
|
+
<div id="conta" style="display:flex;align-items:center;gap:10px;padding:12px 8px 4px;border-top:1px solid #1f1f1d"></div>
|
|
326
|
+
</aside>
|
|
327
|
+
|
|
328
|
+
<main id="main" style="position:relative;flex:1;min-width:0;display:flex;flex-direction:column;height:100vh">
|
|
329
|
+
<div class="solta" id="solta" hidden>
|
|
330
|
+
<div class="solta-caixa">
|
|
331
|
+
<svg class="solta-mascote" width="84" height="84" viewBox="-1 -4 18 18" shape-rendering="crispEdges" aria-hidden="true"><rect x="2" y="0" width="12" height="4" fill="#22d3ee"></rect><rect x="0" y="4" width="16" height="2" fill="#22d3ee"></rect><rect x="2" y="6" width="12" height="2" fill="#22d3ee"></rect><rect x="4" y="2" width="1" height="2" fill="#131312"></rect><rect x="11" y="2" width="1" height="2" fill="#131312"></rect><rect x="3" y="8" width="1" height="2" fill="#22d3ee"></rect><rect x="5" y="8" width="1" height="2" fill="#22d3ee"></rect><rect x="10" y="8" width="1" height="2" fill="#22d3ee"></rect><rect x="12" y="8" width="1" height="2" fill="#22d3ee"></rect></svg>
|
|
332
|
+
<div style="font-family:'Instrument Serif',serif;font-size:34px">Solta aqui</div>
|
|
333
|
+
<div style="color:#a3a29b;font-size:14px">imagem, vídeo, PDF, código, o que quiser</div>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
<div style="height:28px;flex:none"></div>
|
|
337
|
+
<header style="height:54px;flex:none;display:flex;align-items:center;padding:0 20px;border-bottom:1px solid #1f1f1d">
|
|
338
|
+
<span id="titulo" style="font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0"></span>
|
|
339
|
+
</header>
|
|
340
|
+
|
|
341
|
+
<section id="rolagem"></section>
|
|
342
|
+
|
|
343
|
+
<div style="width:100%;max-width:760px;margin:0 auto;padding:0 24px 22px;flex:none">
|
|
344
|
+
<div id="avisos"></div>
|
|
345
|
+
<div class="caixa" style="padding:14px 12px 10px 20px">
|
|
346
|
+
<div id="anexos"></div>
|
|
347
|
+
<label for="pergunta" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)">Mensagem para o Primo</label>
|
|
348
|
+
<textarea id="pergunta" class="entrada" rows="1" placeholder="Peça qualquer coisa pro Primo · / para comandos"></textarea>
|
|
349
|
+
<div id="menu"></div>
|
|
350
|
+
<div id="pal"></div>
|
|
351
|
+
<div style="display:flex;align-items:center;justify-content:space-between;margin-top:10px">
|
|
352
|
+
<div style="display:flex;align-items:center;gap:6px">
|
|
353
|
+
<button class="mais" data-a="anexar" title="Anexar arquivos" aria-label="Anexar arquivos"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"></path></svg></button>
|
|
354
|
+
<button class="chip" id="chipModo" data-a="menuModo"></button>
|
|
355
|
+
<button class="chip" id="chipEf" data-a="menuEf" hidden></button>
|
|
356
|
+
</div>
|
|
357
|
+
<button class="enviar vazio" id="enviar" data-a="enviar" aria-label="Abrir a voz do Primo">
|
|
358
|
+
<svg class="i-voz" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M5 10v4M9.5 7v10M14 4.5v15M18.5 8v8"></path></svg>
|
|
359
|
+
<svg class="i-seta" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5M5 12l7-7 7 7"></path></svg>
|
|
360
|
+
<svg class="i-stop" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><rect x="6" y="6" width="12" height="12" rx="2.5"></rect></svg>
|
|
361
|
+
</button>
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
</main>
|
|
366
|
+
</div>
|
|
367
|
+
|
|
368
|
+
<div id="lb" hidden><img alt=""></div>
|
|
369
|
+
<div id="toast" role="status"></div>
|
|
370
|
+
|
|
371
|
+
<script>
|
|
372
|
+
'use strict';
|
|
373
|
+
/* ---------- ponte ---------- */
|
|
374
|
+
function post(o){
|
|
375
|
+
try{
|
|
376
|
+
var s=JSON.stringify(o);
|
|
377
|
+
if(window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.chat) window.webkit.messageHandlers.chat.postMessage(s);
|
|
378
|
+
else if(window.__demo) window.__demo(o);
|
|
379
|
+
}catch(e){}
|
|
380
|
+
}
|
|
381
|
+
window.onerror=function(msg){post({acao:'erro',arg:String(msg)});};
|
|
382
|
+
|
|
383
|
+
/* ---------- utilidades ---------- */
|
|
384
|
+
function $(id){return document.getElementById(id);}
|
|
385
|
+
function esc(s){return String(s==null?'':s).replace(/[&<>"']/g,function(c){return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];});}
|
|
386
|
+
function ic(body,s,sw){return '<svg width="'+s+'" height="'+s+'" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="'+(sw||2)+'" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">'+body+'</svg>';}
|
|
387
|
+
function pad(n){return n<10?'0'+n:''+n;}
|
|
388
|
+
function ts(v){if(typeof v==='number')return v<1e12?v*1000:v;var n=Date.parse(v);return isNaN(n)?0:n;}
|
|
389
|
+
function fmtData(v){
|
|
390
|
+
if(v==null||v==='')return '';
|
|
391
|
+
var d;
|
|
392
|
+
if(typeof v==='number')d=new Date(v<1e12?v*1000:v);
|
|
393
|
+
else{var m=/^(\d{4})-(\d{2})-(\d{2})/.exec(v);if(m)return m[3]+'/'+m[2]+'/'+m[1];d=new Date(v);}
|
|
394
|
+
if(isNaN(d.getTime()))return String(v);
|
|
395
|
+
return pad(d.getDate())+'/'+pad(d.getMonth()+1)+'/'+d.getFullYear();
|
|
396
|
+
}
|
|
397
|
+
var REDUZ=false;
|
|
398
|
+
try{REDUZ=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;}catch(e){}
|
|
399
|
+
|
|
400
|
+
var GEAR='<circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z"></path>';
|
|
401
|
+
var ICO={
|
|
402
|
+
nova:'<path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path>',
|
|
403
|
+
busca:'<circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path>',
|
|
404
|
+
skills:'<path d="m12 2 9 5v10l-9 5-9-5V7Z"></path><path d="m3 7 9 5 9-5M12 12v10"></path>',
|
|
405
|
+
clip:'<path d="M21 12.5 12.5 21a5.5 5.5 0 0 1-8-8L13 4.5a3.7 3.7 0 0 1 5.2 5.2l-8.5 8.5a1.8 1.8 0 0 1-2.6-2.6L15 7.7"></path>',
|
|
406
|
+
x:'<path d="M6 6l12 12M18 6 6 18"></path>',
|
|
407
|
+
chev:'<path d="m6 9 6 6 6-6"></path>',
|
|
408
|
+
chev2:'<path d="m7 9 5-5 5 5M7 15l5 5 5-5"></path>',
|
|
409
|
+
sol:'<path d="M12 3v3M12 18v3M3 12h3M18 12h3M5.6 5.6l2.1 2.1M16.3 16.3l2.1 2.1M5.6 18.4l2.1-2.1M16.3 7.7l2.1-2.1"></path>',
|
|
410
|
+
ok:'<path d="m5 12 5 5 9-10"></path>',
|
|
411
|
+
chave:'<circle cx="8" cy="15" r="4"></circle><path d="m10.8 12.2 9.2-9.2M17 6l3 3M14 9l2 2"></path>'
|
|
412
|
+
};
|
|
413
|
+
var ABAS=[
|
|
414
|
+
{id:'geral',t:'Geral',cor:'#6b6b66',ico:'<path d="M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9l2.1 2.1M17 17l2.1 2.1M4.9 19.1 7 17M17 7l2.1-2.1"></path>'},
|
|
415
|
+
{id:'modelos',t:'Modelos',cor:'#7c5cff',ico:'<path d="M12 3l2.2 5.8L20 11l-5.8 2.2L12 19l-2.2-5.8L4 11l5.8-2.2Z"></path>'},
|
|
416
|
+
{id:'voz',t:'Voz',cor:'#f0597a',ico:'<path d="M5 10v4M9.5 7v10M14 4.5v15M18.5 8v8"></path>'},
|
|
417
|
+
{id:'conta',t:'Conta',cor:'#0ea5b7',ico:'<path d="M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8ZM4 21a8 8 0 0 1 16 0"></path>'}
|
|
418
|
+
];
|
|
419
|
+
var MODOS=[
|
|
420
|
+
{id:'chat',t:'Chat',d:'conversa e responde, sem mexer em nada'},
|
|
421
|
+
{id:'agent',t:'Agent',d:'mexe nos arquivos e roda os comandos'}
|
|
422
|
+
];
|
|
423
|
+
var SUGESTOES=['Um vídeo de lançamento pro meu app','Um site pra padaria com botão de WhatsApp','Editar a minha gravação com legenda'];
|
|
424
|
+
var PALAVRAS=['constrói','anima','edita','lança','desenha'];
|
|
425
|
+
var MAX_ARQ=25*1024*1024;
|
|
426
|
+
|
|
427
|
+
function mascoteSimples(tam,olho){
|
|
428
|
+
return '<svg width="'+tam+'" height="'+tam+'" viewBox="-1 -4 18 18" shape-rendering="crispEdges" aria-hidden="true"><rect x="2" y="0" width="12" height="4" fill="#22d3ee"></rect><rect x="0" y="4" width="16" height="2" fill="#22d3ee"></rect><rect x="2" y="6" width="12" height="2" fill="#22d3ee"></rect><rect x="4" y="2" width="1" height="2" fill="'+olho+'"></rect><rect x="11" y="2" width="1" height="2" fill="'+olho+'"></rect><rect x="3" y="8" width="1" height="2" fill="#22d3ee"></rect><rect x="5" y="8" width="1" height="2" fill="#22d3ee"></rect><rect x="10" y="8" width="1" height="2" fill="#22d3ee"></rect><rect x="12" y="8" width="1" height="2" fill="#22d3ee"></rect></svg>';
|
|
429
|
+
}
|
|
430
|
+
function mascoteHero(){
|
|
431
|
+
return '<svg width="132" height="132" viewBox="-1 -4 18 18" shape-rendering="crispEdges" role="img" aria-label="Mascote do PrimoCode"><g class="corpo"><rect x="2" y="0" width="12" height="4" fill="#22d3ee"></rect><rect x="0" y="4" width="16" height="2" fill="#22d3ee"></rect><rect x="2" y="6" width="12" height="2" fill="#22d3ee"></rect><g class="olhos" id="olhos" transform="translate(0 0)"><g class="pisca"><rect x="4" y="2" width="1" height="2" fill="#131312"></rect><rect x="11" y="2" width="1" height="2" fill="#131312"></rect></g></g></g><rect class="perna-a" x="3" y="8" width="1" height="2" fill="#22d3ee"></rect><rect class="perna-b" x="5" y="8" width="1" height="2" fill="#22d3ee"></rect><rect class="perna-a" x="10" y="8" width="1" height="2" fill="#22d3ee"></rect><rect class="perna-b" x="12" y="8" width="1" height="2" fill="#22d3ee"></rect></svg>';
|
|
432
|
+
}
|
|
433
|
+
var LOGO_PRIMO='<span class="logo-ia" style="background:#0b1416;border:1px solid #1f3a3e">'+mascoteSimples(22,'#0b1416')+'</span>';
|
|
434
|
+
var LOGO_CLAUDE='<span class="logo-ia" style="background:#f4ede4"><svg width="22" height="22" viewBox="0 0 24 24" role="img" aria-label="Claude"><path fill="#D97757" d="m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"></path></svg></span>';
|
|
435
|
+
var LOGO_OPENAI='<span class="logo-ia" style="background:#ffffff"><svg width="22" height="22" viewBox="0 0 24 24" role="img" aria-label="OpenAI"><path fill="#0d0d0d" d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"></path></svg></span>';
|
|
436
|
+
|
|
437
|
+
/* ---------- destaque de código (regex pequeno, sem biblioteca) ---------- */
|
|
438
|
+
var KW={};
|
|
439
|
+
('const let var function return if else for while do switch case break continue new class extends import export from default async await try catch finally throw typeof instanceof in of this super static null undefined true false void delete yield def elif lambda pass None True False self print and or not is with as raise global del echo fi then done esac fn pub mut impl struct enum trait use mod match loop where type interface public private protected int string bool float double char byte package func go defer chan range map select nil end begin module require include implements abstract final readonly namespace using').split(' ').forEach(function(k){KW[k]=1;});
|
|
440
|
+
var RE_A=/(\/\*[\s\S]*?\*\/|\/\/[^\n]*|<!--[\s\S]*?-->)|("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\.|[^`\\])*`)|\b(\d+(?:\.\d+)?)\b|\b([A-Za-z_$][\w$]*)\b/g;
|
|
441
|
+
var RE_B=/(\/\*[\s\S]*?\*\/|#[^\n]*|<!--[\s\S]*?-->)|("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\.|[^`\\])*`)|\b(\d+(?:\.\d+)?)\b|\b([A-Za-z_$][\w$]*)\b/g;
|
|
442
|
+
var RE_C=/(\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)|("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\.|[^`\\])*`)|\b(\d+(?:\.\d+)?)\b|\b([A-Za-z_$][\w$]*)\b/g;
|
|
443
|
+
function hl(code,lang){
|
|
444
|
+
lang=String(lang||'').toLowerCase();
|
|
445
|
+
var hash=/^(py|python|sh|bash|zsh|shell|yaml|yml|toml|rb|ruby|r|conf|ini|env|pl|ps1)$/.test(lang);
|
|
446
|
+
var markup=/^(html|htm|xml|svg|vue|css|scss|less)$/.test(lang);
|
|
447
|
+
var css=/^(css|scss|less)$/.test(lang);
|
|
448
|
+
var src=(hash?RE_B:css||markup?RE_C:RE_A).source;
|
|
449
|
+
var re=new RegExp(src,'g'),out='',last=0,m;
|
|
450
|
+
code=String(code);
|
|
451
|
+
while((m=re.exec(code))){
|
|
452
|
+
if(m.index>last)out+=esc(code.slice(last,m.index));
|
|
453
|
+
var tx=esc(m[0]);
|
|
454
|
+
if(m[1]!==undefined)out+='<span class="tc">'+tx+'</span>';
|
|
455
|
+
else if(m[2]!==undefined)out+='<span class="ts">'+tx+'</span>';
|
|
456
|
+
else if(m[3]!==undefined)out+='<span class="tn">'+tx+'</span>';
|
|
457
|
+
else if(!markup&&KW[m[4]]===1)out+='<span class="tk">'+tx+'</span>';
|
|
458
|
+
else out+=tx;
|
|
459
|
+
last=re.lastIndex;
|
|
460
|
+
if(m[0].length===0)re.lastIndex++;
|
|
461
|
+
}
|
|
462
|
+
return out+esc(code.slice(last));
|
|
463
|
+
}
|
|
464
|
+
function extDe(nome){var m=/\.([A-Za-z0-9]+)$/.exec(nome||'');return m?m[1].toLowerCase():'';}
|
|
465
|
+
var EXT_TIPO={};
|
|
466
|
+
[['video','mp4 mov m4v webm mkv avi'],['imagem','png jpg jpeg gif webp svg avif heic bmp'],['audio','mp3 wav m4a aac ogg flac'],['pdf','pdf'],['html','html htm'],['codigo','js jsx ts tsx mjs cjs json py sh bash zsh css scss md txt yml yaml toml rb go rs java c h cpp swift kt php sql xml vue lock csv']].forEach(function(p){p[1].split(' ').forEach(function(e){EXT_TIPO[e]=p[0];});});
|
|
467
|
+
function tipoDe(nome){return EXT_TIPO[extDe(nome)]||'arquivo';}
|
|
468
|
+
function urlArq(c){return estado.arqBase?estado.arqBase+String(c).split('/').map(encodeURIComponent).join('/'):'file://'+encodeURI(c);}
|
|
469
|
+
function fmtTam(b){
|
|
470
|
+
b=Number(b);if(!isFinite(b)||b<0)return '';
|
|
471
|
+
if(b<1024)return b+' B';
|
|
472
|
+
var u=['KB','MB','GB','TB'],i=-1;
|
|
473
|
+
do{b/=1024;i++;}while(b>=1024&&i<3);
|
|
474
|
+
return (b<10?b.toFixed(1):Math.round(b))+' '+u[i];
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* ---------- markdown seguro: escapa primeiro, transforma depois ---------- */
|
|
478
|
+
var CK='<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m5 12 5 5 9-10"></path></svg>';
|
|
479
|
+
function md(t){
|
|
480
|
+
var partes=String(t==null?'':t).split('```'),out='';
|
|
481
|
+
partes.forEach(function(p,i){
|
|
482
|
+
if(i%2===1){
|
|
483
|
+
var nl=p.indexOf('\n'),code=p,lang='';
|
|
484
|
+
if(nl>=0&&/^[\w+#.\-]*\s*$/.test(p.slice(0,nl))){lang=p.slice(0,nl).trim();code=p.slice(nl+1);}
|
|
485
|
+
code=code.replace(/\n$/,'');
|
|
486
|
+
out+='<div class="cb"><div class="cb-h"><span class="cb-l">'+esc(lang||'código')+'</span><button class="mc-b" data-a="copiar">Copiar</button></div><pre><code>'+hl(code,lang)+'</code></pre></div>';
|
|
487
|
+
}else out+=mdBlocos(p);
|
|
488
|
+
});
|
|
489
|
+
return out;
|
|
490
|
+
}
|
|
491
|
+
var RE_LI=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/;
|
|
492
|
+
var RE_SEP=/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/;
|
|
493
|
+
function celulas(l){l=l.trim();if(l.charAt(0)==='|')l=l.slice(1);if(l.charAt(l.length-1)==='|')l=l.slice(0,-1);return l.split('|').map(function(c){return c.trim();});}
|
|
494
|
+
function mdBlocos(p){
|
|
495
|
+
var L=p.split('\n'),h='',i=0,par=[],m;
|
|
496
|
+
function fechaP(){if(par.length){h+='<p>'+par.map(inline).join('<br>')+'</p>';par=[];}}
|
|
497
|
+
while(i<L.length){
|
|
498
|
+
var l=L[i];
|
|
499
|
+
if(!l.trim()){fechaP();i++;continue;}
|
|
500
|
+
if((m=/^(#{1,3})\s+(.*?)\s*#*\s*$/.exec(l))){fechaP();h+='<h'+(m[1].length+2)+' class="hd hd'+m[1].length+'">'+inline(m[2])+'</h'+(m[1].length+2)+'>';i++;continue;}
|
|
501
|
+
if(/^\s*([-*_])(\s*\1){2,}\s*$/.test(l)){fechaP();h+='<hr>';i++;continue;}
|
|
502
|
+
if(/^\s*>/.test(l)){
|
|
503
|
+
fechaP();var q=[];
|
|
504
|
+
while(i<L.length&&/^\s*>/.test(L[i])){q.push(L[i].replace(/^\s*>\s?/,''));i++;}
|
|
505
|
+
h+='<blockquote>'+mdBlocos(q.join('\n'))+'</blockquote>';continue;
|
|
506
|
+
}
|
|
507
|
+
if(l.indexOf('|')>=0&&i+1<L.length&&RE_SEP.test(L[i+1])&&L[i+1].indexOf('-')>=0){
|
|
508
|
+
fechaP();
|
|
509
|
+
var cab=celulas(l),al=celulas(L[i+1]).map(function(c){return /^:-*:$/.test(c)?'center':/-:$/.test(c)?'right':'left';});
|
|
510
|
+
i+=2;var rows=[];
|
|
511
|
+
while(i<L.length&&L[i].trim()&&L[i].indexOf('|')>=0){rows.push(celulas(L[i]));i++;}
|
|
512
|
+
h+='<div class="tb"><table><thead><tr>'+cab.map(function(c,k){return '<th style="text-align:'+(al[k]||'left')+'">'+inline(c)+'</th>';}).join('')+'</tr></thead><tbody>'+
|
|
513
|
+
rows.map(function(r){return '<tr>'+cab.map(function(_,k){return '<td style="text-align:'+(al[k]||'left')+'">'+inline(r[k]||'')+'</td>';}).join('')+'</tr>';}).join('')+'</tbody></table></div>';
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
if(RE_LI.test(l)){
|
|
517
|
+
fechaP();var its=[];
|
|
518
|
+
while(i<L.length){
|
|
519
|
+
var mm=RE_LI.exec(L[i]);
|
|
520
|
+
if(mm){its.push({ind:mm[1].replace(/\t/g,' ').length,ord:/\d/.test(mm[2].charAt(0)),txt:mm[3]});i++;}
|
|
521
|
+
else if(!L[i].trim()){var j=i;while(j<L.length&&!L[j].trim())j++;if(j<L.length&&RE_LI.test(L[j])){i=j;}else break;}
|
|
522
|
+
else if(/^\s+\S/.test(L[i])&&its.length){its[its.length-1].txt+=' '+L[i].trim();i++;}
|
|
523
|
+
else break;
|
|
524
|
+
}
|
|
525
|
+
h+=listaHtml(its);continue;
|
|
526
|
+
}
|
|
527
|
+
par.push(l);i++;
|
|
528
|
+
}
|
|
529
|
+
fechaP();
|
|
530
|
+
return h;
|
|
531
|
+
}
|
|
532
|
+
function itemHtml(t){
|
|
533
|
+
var m=/^\[( |x|X)\]\s+(.*)$/.exec(t);
|
|
534
|
+
if(m){var on=m[1]!==' ';return '<li class="task"><span class="ckb'+(on?' on':'')+'">'+(on?CK:'')+'</span><span'+(on?' class="feito"':'')+'>'+inline(m[2])+'</span>';}
|
|
535
|
+
return '<li>'+inline(t);
|
|
536
|
+
}
|
|
537
|
+
function listaHtml(its){
|
|
538
|
+
var h='',st=[];
|
|
539
|
+
its.forEach(function(it){
|
|
540
|
+
while(st.length&&it.ind<st[st.length-1].ind){h+='</li></'+(st.pop().ord?'ol':'ul')+'>';}
|
|
541
|
+
var top=st[st.length-1];
|
|
542
|
+
if(top&&it.ind===top.ind&&it.ord!==top.ord){h+='</li></'+(top.ord?'ol':'ul')+'>';st.pop();top=st[st.length-1];}
|
|
543
|
+
if(!top||it.ind>top.ind||(top.ind===it.ind&&top.ord!==it.ord)){h+='<'+(it.ord?'ol':'ul')+'>';st.push({ind:it.ind,ord:it.ord});}
|
|
544
|
+
else h+='</li>';
|
|
545
|
+
h+=itemHtml(it.txt);
|
|
546
|
+
});
|
|
547
|
+
while(st.length)h+='</li></'+(st.pop().ord?'ol':'ul')+'>';
|
|
548
|
+
return h;
|
|
549
|
+
}
|
|
550
|
+
function inline(s){
|
|
551
|
+
return String(s).split(/(`[^`\n]+`)/).map(function(x,i){
|
|
552
|
+
if(i%2)return '<code>'+esc(x.slice(1,-1))+'</code>';
|
|
553
|
+
var e=esc(x);
|
|
554
|
+
e=e.replace(/\*\*([^*]+)\*\*/g,'<strong>$1</strong>');
|
|
555
|
+
e=e.replace(/~~([^~]+)~~/g,'<del>$1</del>');
|
|
556
|
+
e=e.replace(/(^|[^*\w])\*([^*\s][^*]*)\*(?!\*)/g,'$1<em>$2</em>');
|
|
557
|
+
e=e.replace(/\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/g,'<a href="#" data-a="link" data-url="$2">$1</a>');
|
|
558
|
+
return e;
|
|
559
|
+
}).join('');
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/* ---------- mídias: cartões visuais ---------- */
|
|
563
|
+
var REG={};
|
|
564
|
+
var ICM={
|
|
565
|
+
video:'<rect x="3" y="4" width="18" height="16" rx="3"></rect><path d="m10 9 5 3-5 3Z"></path>',
|
|
566
|
+
imagem:'<rect x="3" y="4" width="18" height="16" rx="3"></rect><circle cx="9" cy="10" r="1.6"></circle><path d="m21 16-5-5-8 8"></path>',
|
|
567
|
+
audio:'<path d="M5 10v4M9.5 7v10M14 4.5v15M18.5 8v8"></path>',
|
|
568
|
+
pdf:'<path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z"></path><path d="M14 3v5h5M9 14h6M9 17h4"></path>',
|
|
569
|
+
html:'<circle cx="12" cy="12" r="9"></circle><path d="M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"></path>',
|
|
570
|
+
codigo:'<path d="m8 8-4 4 4 4M16 8l4 4-4 4M14 5l-4 14"></path>',
|
|
571
|
+
pasta:'<path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"></path>',
|
|
572
|
+
arquivo:'<path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z"></path><path d="M14 3v5h5"></path>'
|
|
573
|
+
};
|
|
574
|
+
function icoM(t,s){return ic(ICM[t]||ICM.arquivo,s||16);}
|
|
575
|
+
function botoes(m,so){
|
|
576
|
+
var c=esc(m.caminho||'');
|
|
577
|
+
return '<button class="mc-b" data-a="abrirarq" data-c="'+c+'">Abrir</button>'+(so?'':'<button class="mc-b" data-a="mostrar" data-c="'+c+'">Mostrar no Finder</button>');
|
|
578
|
+
}
|
|
579
|
+
function nomeTam(m,play){
|
|
580
|
+
var nm=esc(m.nome||m.caminho||''),tam=m.tamanho!=null?fmtTam(m.tamanho):'';
|
|
581
|
+
return '<div class="mc-nm"'+(play?' data-a="play"':'')+' title="'+nm+'">'+nm+(tam?'<small>'+esc(tam)+'</small>':'')+'</div>';
|
|
582
|
+
}
|
|
583
|
+
function linhaM(m,id,d){
|
|
584
|
+
REG[id]=m;
|
|
585
|
+
return '<div class="mc mc-row" id="'+id+'" style="animation-delay:'+d+'s"><span class="mc-ic">'+icoM(m.tipo,18)+'</span>'+nomeTam(m)+'<div class="mc-bt">'+botoes(m)+'</div></div>';
|
|
586
|
+
}
|
|
587
|
+
function cartaoM(m,id,d){
|
|
588
|
+
if(!m||!(m.nome||m.caminho))return '';
|
|
589
|
+
var t=m.tipo,u=esc(m.url||''),nm=esc(m.nome||m.caminho||'');
|
|
590
|
+
if(!m.url&&t!=='codigo'&&t!=='pasta')return linhaM(m,id,d);
|
|
591
|
+
var base=function(c){return '<div class="mc mc-'+t+(c?' '+c:'')+'" id="'+id+'" style="animation-delay:'+d+'s">';};
|
|
592
|
+
var foot=function(play){return '<div class="mc-foot">'+nomeTam(m,play)+'<div class="mc-bt">'+botoes(m)+'</div></div>';};
|
|
593
|
+
REG[id]=m;
|
|
594
|
+
if(t==='video')return base('mc-wide')+'<div class="mc-media"><video controls playsinline preload="metadata" src="'+u+'"></video></div>'+foot(true)+'</div>';
|
|
595
|
+
if(t==='imagem')return base()+'<div class="mc-media mc-img" data-a="lightbox" data-id="'+id+'"><img src="'+u+'" alt="'+nm+'" loading="lazy"></div>'+foot()+'</div>';
|
|
596
|
+
if(t==='audio')return base()+'<div class="mc-au"><button class="au-p" data-a="aplay" aria-label="Tocar"><svg class="i-p" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5v14l11-7z"></path></svg><svg class="i-q" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M7 5h3.5v14H7zM13.5 5H17v14h-3.5z"></path></svg></button><div class="au-mid">'+nomeTam(m)+'<div class="au-bar" data-a="aseek"><i></i></div></div><span class="au-t mono">0:00</span><audio preload="metadata" src="'+u+'"></audio></div><div class="mc-bt" style="padding:0 12px 10px">'+botoes(m)+'</div></div>';
|
|
597
|
+
if(t==='pdf')return base('mc-wide')+'<div class="mc-media mc-pdf"><iframe src="'+u+'" title="'+nm+'" loading="lazy"></iframe></div>'+foot()+'</div>';
|
|
598
|
+
if(t==='html')return base()+'<div class="site-bar"><span>'+nm+'</span></div><div class="site-v" data-a="abrirarq" data-c="'+esc(m.caminho||'')+'" title="Abrir no navegador"><iframe sandbox="allow-scripts" src="'+u+'" tabindex="-1" title="'+nm+'" loading="lazy"></iframe></div>'+foot()+'</div>';
|
|
599
|
+
if(t==='codigo'){
|
|
600
|
+
if(m.trecho==null||m.trecho==='')return linhaM(m,id,d);
|
|
601
|
+
var tr=String(m.trecho).replace(/\n+$/,''),n=tr.split('\n').length,g=[];
|
|
602
|
+
for(var i=1;i<=n;i++)g.push(i);
|
|
603
|
+
var lang=extDe(m.nome||m.caminho);
|
|
604
|
+
return base('mc-wide')+'<div class="mc-ch"><span class="mc-ic">'+icoM('codigo',15)+'</span><span class="mc-nm" title="'+nm+'">'+nm+'</span>'+(lang?'<span class="cb-l">'+esc(lang)+'</span>':'')+'<div class="mc-bt"><button class="mc-b" data-a="copiar">Copiar</button>'+botoes(m,true)+'</div></div><div class="cd"><div class="gut" aria-hidden="true">'+g.join('\n')+'</div><pre><code>'+hl(tr,lang)+'</code></pre></div>'+(n>=40?'<div class="cd-n">primeiras '+n+' linhas</div>':'')+'</div>';
|
|
605
|
+
}
|
|
606
|
+
return linhaM(m,id,d);
|
|
607
|
+
}
|
|
608
|
+
function gradeM(ms,pre,user){
|
|
609
|
+
if(!ms||!ms.length)return '';
|
|
610
|
+
var h='';
|
|
611
|
+
ms.forEach(function(m,k){h+=cartaoM(m,pre+'-'+k,Math.min(0.08*k,0.8).toFixed(2)+'');});
|
|
612
|
+
return h?'<div class="mcs'+(user?' mcs-u':'')+'">'+h+'</div>':'';
|
|
613
|
+
}
|
|
614
|
+
function chipEl(m,id){
|
|
615
|
+
var s=document.createElement('span');
|
|
616
|
+
s.className='chip-m';s.setAttribute('data-a','irmidia');s.setAttribute('data-id',id);
|
|
617
|
+
s.innerHTML=icoM(m.tipo,13);
|
|
618
|
+
var n=document.createElement('span');n.textContent=m.nome||m.caminho||m.achado;s.appendChild(n);
|
|
619
|
+
return s;
|
|
620
|
+
}
|
|
621
|
+
function chipify(html,ms,pre){
|
|
622
|
+
if(!ms||!ms.length)return html;
|
|
623
|
+
var lista=[];
|
|
624
|
+
ms.forEach(function(m,k){if(m&&m.achado)lista.push({m:m,k:k});});
|
|
625
|
+
if(!lista.length)return html;
|
|
626
|
+
var tpl=document.createElement('template');tpl.innerHTML=html;
|
|
627
|
+
var w=document.createTreeWalker(tpl.content,NodeFilter.SHOW_TEXT),nos=[];
|
|
628
|
+
while(w.nextNode())nos.push(w.currentNode);
|
|
629
|
+
nos.forEach(function(n){
|
|
630
|
+
var pe=n.parentElement;
|
|
631
|
+
if(pe&&pe.closest('a,pre,.chip-m'))return;
|
|
632
|
+
var txt=n.nodeValue,frag=document.createDocumentFragment(),mudou=false;
|
|
633
|
+
while(txt){
|
|
634
|
+
var best=null,pos=-1;
|
|
635
|
+
lista.forEach(function(x){var p=txt.indexOf(x.m.achado);if(p>=0&&(best===null||p<pos||(p===pos&&x.m.achado.length>best.m.achado.length))){best=x;pos=p;}});
|
|
636
|
+
if(!best){frag.appendChild(document.createTextNode(txt));break;}
|
|
637
|
+
if(pos>0)frag.appendChild(document.createTextNode(txt.slice(0,pos)));
|
|
638
|
+
frag.appendChild(chipEl(best.m,pre+'-'+best.k));mudou=true;
|
|
639
|
+
txt=txt.slice(pos+best.m.achado.length);
|
|
640
|
+
}
|
|
641
|
+
if(!mudou)return;
|
|
642
|
+
if(pe&&pe.tagName==='CODE'&&frag.childNodes.length===1&&pe.childNodes.length===1)pe.parentNode.replaceChild(frag,pe);
|
|
643
|
+
else n.parentNode.replaceChild(frag,n);
|
|
644
|
+
});
|
|
645
|
+
return tpl.innerHTML;
|
|
646
|
+
}
|
|
647
|
+
function ajustaSites(){
|
|
648
|
+
Array.prototype.forEach.call(document.querySelectorAll('.site-v'),function(el){var w=el.clientWidth;if(w)el.style.setProperty('--s',(w/1280).toFixed(4));});
|
|
649
|
+
}
|
|
650
|
+
function copiarTexto(txt,btn){
|
|
651
|
+
function ok(){var o=btn.textContent;btn.textContent='Copiado';setTimeout(function(){btn.textContent=o==='Copiado'?'Copiar':o;},1400);}
|
|
652
|
+
function velho(){
|
|
653
|
+
var t=document.createElement('textarea');t.value=txt;t.style.cssText='position:fixed;opacity:0;top:0;left:0';
|
|
654
|
+
document.body.appendChild(t);t.select();try{document.execCommand('copy');ok();}catch(e){}
|
|
655
|
+
document.body.removeChild(t);
|
|
656
|
+
}
|
|
657
|
+
try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(txt).then(ok,velho);else velho();}catch(e){velho();}
|
|
658
|
+
}
|
|
659
|
+
function tempo(s){if(!isFinite(s))s=0;s=Math.floor(s);return Math.floor(s/60)+':'+pad(s%60);}
|
|
660
|
+
|
|
661
|
+
/* ---------- estado ---------- */
|
|
662
|
+
var estado={
|
|
663
|
+
logado:false,email:'',plano:'',planoAte:'',pasta:'',modo:'agent',
|
|
664
|
+
tela:'chat',aba:'modelos',
|
|
665
|
+
conversas:null,conversasErro:'',convId:null,titulo:'',mensagens:[],animarDe:0,
|
|
666
|
+
esperando:false,ignorando:false,passos:[],erro:'',
|
|
667
|
+
anexos:[],menu:false,aviso:null,
|
|
668
|
+
skills:null,ajustes:null,busca:'',
|
|
669
|
+
comandos:[],pal:{aberta:false,itens:[],sel:0,q:null},abertas:{},confirma:null,provSel:'',chaveDraft:'',chaveSalva:false,
|
|
670
|
+
semVoz:false,arqBase:'' /* o app desktop manda semVoz (sem motor de voz) e arqBase (o protocolo que serve os arquivos); no Mac ficam vazios */
|
|
671
|
+
};
|
|
672
|
+
var animar=false;
|
|
673
|
+
var mx=0,my=0;
|
|
674
|
+
|
|
675
|
+
/* ---------- lateral ---------- */
|
|
676
|
+
function renderNav(){
|
|
677
|
+
function b(a,i,t,on){return '<button class="navbtn'+(on?' on':'')+'" data-a="'+a+'">'+ic(ICO[i],16)+t+'</button>';}
|
|
678
|
+
$('nav').innerHTML=b('nova','nova','Nova conversa',false)+b('buscar','busca','Buscar',estado.tela==='buscar')+b('skills','skills','Skills',estado.tela==='skills');
|
|
679
|
+
}
|
|
680
|
+
function renderLista(){
|
|
681
|
+
var h='',c=estado.conversas;
|
|
682
|
+
if(Array.isArray(c)){
|
|
683
|
+
if(!c.length)h+='<div class="vazio-txt">Nenhuma conversa ainda.</div>';
|
|
684
|
+
c.forEach(function(x){
|
|
685
|
+
var on=estado.convId!=null&&String(estado.convId)===String(x.id)&&estado.tela==='chat';
|
|
686
|
+
var cf=estado.confirma!==null&&String(estado.confirma)===String(x.id);
|
|
687
|
+
h+='<div class="conv-w"><button class="conv'+(on?' on':'')+'" data-a="conv" data-id="'+esc(x.id)+'" title="'+esc(x.titulo)+'"><span class="t">'+esc(x.titulo||'Sem título')+'</span></button><button class="conv-x'+(cf?' conf':'')+'" data-a="excluir" data-id="'+esc(x.id)+'" aria-label="Excluir conversa" title="Excluir conversa">'+(cf?'Excluir?':ic('<path d="M4 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3"></path>',14))+'</button></div>';
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
if(estado.conversasErro)h+='<div class="vazio-txt">'+esc(estado.conversasErro)+'</div>';
|
|
691
|
+
$('lista').innerHTML=h;
|
|
692
|
+
$('rotConv').innerHTML='<span class="mono" style="font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:#8a8983">Conversas</span>'+'';
|
|
693
|
+
}
|
|
694
|
+
function removeConversa(id){
|
|
695
|
+
estado.conversas=(estado.conversas||[]).filter(function(x){return String(x.id)!==String(id);});
|
|
696
|
+
if(estado.convId!=null&&String(estado.convId)===String(id))novaConversa();
|
|
697
|
+
}
|
|
698
|
+
function renderConta(){
|
|
699
|
+
var h;
|
|
700
|
+
if(estado.logado){
|
|
701
|
+
var ini=(String(estado.email||'?').trim().charAt(0)||'?').toUpperCase();
|
|
702
|
+
h='<div class="avatar">'+esc(ini)+'</div><span style="font-size:13px;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis" title="'+esc(estado.email)+'">'+esc(estado.email)+'</span>';
|
|
703
|
+
}else h='<button class="entrar" data-a="entrar">Entrar</button><span style="flex:1"></span>';
|
|
704
|
+
h+='<button class="ico-cfg" data-a="cfg" aria-label="Ajustes">'+ic(GEAR,16)+'</button>';
|
|
705
|
+
$('conta').innerHTML=h;
|
|
706
|
+
}
|
|
707
|
+
function renderLado(){renderNav();renderLista();renderConta();}
|
|
708
|
+
|
|
709
|
+
/* ---------- principal ---------- */
|
|
710
|
+
function tituloTopo(){
|
|
711
|
+
var t=estado.tela;
|
|
712
|
+
if(t==='config')return 'Ajustes';
|
|
713
|
+
if(t==='buscar')return 'Buscar';
|
|
714
|
+
if(t==='skills')return 'Skills';
|
|
715
|
+
if(estado.titulo)return estado.titulo;
|
|
716
|
+
for(var i=0;i<estado.mensagens.length;i++)if(estado.mensagens[i].papel==='voce')return estado.mensagens[i].texto;
|
|
717
|
+
return 'Nova conversa';
|
|
718
|
+
}
|
|
719
|
+
function renderPrincipal(){
|
|
720
|
+
var anim=animar;animar=false;
|
|
721
|
+
$('titulo').textContent=tituloTopo();
|
|
722
|
+
var r=$('rolagem');
|
|
723
|
+
if(estado.tela==='buscar')r.innerHTML=htmlBuscar(anim),renderResultados();
|
|
724
|
+
else if(estado.tela==='skills')r.innerHTML=htmlSkills(anim);
|
|
725
|
+
else if(estado.tela==='config')r.innerHTML=htmlConfig(anim);
|
|
726
|
+
else if(estado.mensagens.length){r.innerHTML=htmlConversa();renderMsgs();renderEspera();}
|
|
727
|
+
else{r.innerHTML=htmlVazio();aplicaMouse();palavraAtual();}
|
|
728
|
+
if(estado.tela==='chat'&&estado.mensagens.length)rolaFim();
|
|
729
|
+
else r.scrollTop=0;
|
|
730
|
+
if(estado.tela==='config'&&estado.irPerm){var gp=$('grpPerm');if(gp){gp.scrollIntoView({block:'center'});estado.irPerm=false;}}
|
|
731
|
+
efAplica();
|
|
732
|
+
}
|
|
733
|
+
function navegar(tela){
|
|
734
|
+
estado.tela=tela;estado.menu=false;animar=true;
|
|
735
|
+
renderNav();renderLista();renderMenu();renderPrincipal();
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/* vazio */
|
|
739
|
+
function htmlVazio(){
|
|
740
|
+
var s='';
|
|
741
|
+
SUGESTOES.forEach(function(x,i){
|
|
742
|
+
s+='<button class="sug sug-entra" style="animation-delay:'+(0.55+i*0.12).toFixed(2)+'s" data-a="sug" data-i="'+i+'"><span class="mono" style="font-size:11px;color:#74736d;width:22px">0'+(i+1)+'</span><span>'+esc(x)+'</span>'+ic('<path d="M5 12h14M13 6l6 6-6 6"></path>',16,2.2).replace('<svg ','<svg class="seta" ')+'</button>';
|
|
743
|
+
});
|
|
744
|
+
return '<div style="width:100%;max-width:680px;margin:auto;display:flex;flex-direction:column;align-items:center;gap:22px">'+
|
|
745
|
+
'<div class="pula-entra"><div class="mascote" id="mascote">'+mascoteHero()+'</div></div>'+
|
|
746
|
+
'<h1 class="titulo-entra" style="margin:0;font-family:\'Instrument Serif\',serif;font-weight:400;font-size:clamp(38px,4.6vw,58px);line-height:1.02;text-align:center">O que a gente <span class="palavra" id="palavra"></span><span class="cursor-t"></span> hoje?</h1>'+
|
|
747
|
+
'<div class="linha-luz" style="width:220px"></div>'+
|
|
748
|
+
'<div style="width:100%;max-width:520px;margin-top:4px;border-top:1px solid #232321">'+s+'</div></div>';
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/* conversa */
|
|
752
|
+
function htmlConversa(){
|
|
753
|
+
return '<div style="width:100%;max-width:720px;align-self:center;margin-top:auto;display:flex;flex-direction:column;gap:22px"><div id="msgs" style="display:contents"></div><div id="espera"></div></div>';
|
|
754
|
+
}
|
|
755
|
+
function avatarPrimo(){
|
|
756
|
+
return '<div style="flex:none;width:28px;height:28px;border-radius:9px;background:#1c1c1a;border:1px solid #2e2e2b;display:grid;place-items:center">'+mascoteSimples(18,'#1c1c1a')+'</div>';
|
|
757
|
+
}
|
|
758
|
+
function renderMsgs(){
|
|
759
|
+
var el=$('msgs');if(!el)return;
|
|
760
|
+
REG={};
|
|
761
|
+
var h='';
|
|
762
|
+
estado.mensagens.forEach(function(m,i){
|
|
763
|
+
var cls=i>=estado.animarDe?'msg':'',ms=m.midias||[],pre='m'+i;
|
|
764
|
+
if(m.comando){h+='<div class="'+cls+'" style="align-self:flex-end;max-width:78%;display:flex;justify-content:flex-end;min-width:0"><span class="cmd-l">'+ic('<path d="M16 3 8 21"></path>',15,2.4)+'<span>'+esc(m.texto)+'</span></span></div>';return;}
|
|
765
|
+
if(m.saida){h+='<div class="'+cls+'" style="display:flex;gap:12px;align-items:flex-start">'+avatarPrimo()+'<div class="md" style="min-width:0">'+htmlSaida(m.saida,pre)+gradeM(m.saida.midias||[],pre,false)+'</div></div>';return;}
|
|
766
|
+
if(m.papel==='voce'){
|
|
767
|
+
var corpo=m.texto?'<div style="background:#232321;border-radius:20px 20px 6px 20px;padding:12px 16px;font-size:15px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere;max-width:100%">'+chipify(esc(m.texto),ms,pre)+'</div>':'';
|
|
768
|
+
h+='<div class="'+cls+'" style="align-self:flex-end;max-width:78%;min-width:0;display:flex;flex-direction:column;align-items:flex-end;gap:10px">'+corpo+gradeM(ms,pre,true)+'</div>';
|
|
769
|
+
}else h+='<div class="'+cls+'" style="display:flex;gap:12px;align-items:flex-start">'+avatarPrimo()+'<div class="md">'+chipify(md(m.texto),ms,pre)+gradeM(ms,pre,false)+'</div></div>';
|
|
770
|
+
});
|
|
771
|
+
estado.animarDe=estado.mensagens.length;
|
|
772
|
+
el.innerHTML=h;
|
|
773
|
+
ajustaSites();
|
|
774
|
+
requestAnimationFrame(ajustaSites);
|
|
775
|
+
}
|
|
776
|
+
function renderEspera(){
|
|
777
|
+
var el=$('espera');if(!el)return;
|
|
778
|
+
if(estado.esperando){
|
|
779
|
+
el.innerHTML='<div class="msg" style="display:flex;gap:12px;align-items:flex-start">'+avatarPrimo()+'<div style="min-width:0;flex:1"><div style="display:flex;gap:5px;padding-top:10px"><span class="ponto"></span><span class="ponto" style="animation-delay:.15s"></span><span class="ponto" style="animation-delay:.3s"></span></div><div class="passos" id="passos"></div></div></div>';
|
|
780
|
+
renderPassos();
|
|
781
|
+
}else if(estado.erro){
|
|
782
|
+
el.innerHTML='<div class="msg" style="display:flex;gap:12px;align-items:flex-start">'+avatarPrimo()+'<div style="padding-top:4px;color:#f08a7e;font-size:14px;line-height:1.5;overflow-wrap:anywhere">'+esc(estado.erro)+'</div></div>';
|
|
783
|
+
}else el.innerHTML='';
|
|
784
|
+
}
|
|
785
|
+
var VERBOS=[['lend','<path d="M2 12s4-7 10-7 10 7 10 7-4 7-10 7S2 12 2 12Z"></path><circle cx="12" cy="12" r="3"></circle>'],['abr','<path d="M2 12s4-7 10-7 10 7 10 7-4 7-10 7S2 12 2 12Z"></path><circle cx="12" cy="12" r="3"></circle>'],['escrev','<path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path>'],['edit','<path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path>'],['cri','<path d="M12 5v14M5 12h14"></path>'],['rod','<path d="m5 8 4 4-4 4M12 16h7"></path>'],['execut','<path d="m5 8 4 4-4 4M12 16h7"></path>'],['instal','<path d="M12 4v12M6 12l6 6 6-6"></path>'],['baix','<path d="M12 4v12M6 12l6 6 6-6"></path>'],['publi','<path d="M12 20V8M6 12l6-6 6 6"></path>'],['procur','<circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path>'],['busc','<circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path>'],['olhand','<path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"></path>'],['list','<path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"></path>'],['render','<rect x="3" y="4" width="18" height="16" rx="3"></rect><path d="m10 9 5 3-5 3Z"></path>'],['anim','<path d="M12 3l2.2 5.8L20 11l-5.8 2.2L12 19l-2.2-5.8L4 11l5.8-2.2Z"></path>'],['pens','<path d="M12 3l2.2 5.8L20 11l-5.8 2.2L12 19l-2.2-5.8L4 11l5.8-2.2Z"></path>'],['test','<circle cx="12" cy="12" r="9"></circle><path d="m8 12 3 3 5-6"></path>']];
|
|
786
|
+
function icoPasso(txt){
|
|
787
|
+
var w=String(txt).trim().toLowerCase().replace(/[^a-zà-ú].*$/,'').slice(0,12);
|
|
788
|
+
for(var i=0;i<VERBOS.length;i++)if(w.indexOf(VERBOS[i][0])===0)return VERBOS[i][1];
|
|
789
|
+
return '<circle cx="12" cy="12" r="2.5"></circle>';
|
|
790
|
+
}
|
|
791
|
+
function renderPassos(){
|
|
792
|
+
var el=$('passos');if(!el)return;
|
|
793
|
+
var ps=estado.passos,n=ps.length,ini=Math.max(0,n-6),h='';
|
|
794
|
+
if(ini>0)h+='<div class="ps-mais">+'+ini+' antes</div>';
|
|
795
|
+
for(var i=ini;i<n;i++){
|
|
796
|
+
var atual=i===n-1;
|
|
797
|
+
h+='<div class="ps'+(atual?' atual':'')+'"><span class="pi">'+(atual?ic(icoPasso(ps[i]),12,2.2):ic('<path d="m5 12 5 5 9-10"></path>',12,3))+'</span><span class="pt">'+esc(ps[i])+'</span></div>';
|
|
798
|
+
}
|
|
799
|
+
el.innerHTML=h;
|
|
800
|
+
}
|
|
801
|
+
function rolaFim(){var r=$('rolagem');r.scrollTop=r.scrollHeight;}
|
|
802
|
+
function pertoDoFim(){var r=$('rolagem');return r.scrollHeight-r.scrollTop-r.clientHeight<140;}
|
|
803
|
+
|
|
804
|
+
/* buscar */
|
|
805
|
+
function htmlBuscar(anim){
|
|
806
|
+
return '<div class="'+(anim?'tela-entra':'')+'" style="width:100%;max-width:680px;align-self:center;margin-bottom:auto;display:flex;flex-direction:column;gap:18px">'+
|
|
807
|
+
'<h2 style="margin:0;font-family:\'Instrument Serif\',serif;font-weight:400;font-size:40px">Buscar</h2>'+
|
|
808
|
+
'<div style="position:relative"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#8a8983" stroke-width="2" stroke-linecap="round" aria-hidden="true" style="position:absolute;left:18px;top:17px"><circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path></svg>'+
|
|
809
|
+
'<label for="busca" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)">Buscar nas conversas</label>'+
|
|
810
|
+
'<input id="busca" class="busca" placeholder="Buscar nas conversas" autocomplete="off" value="'+esc(estado.busca)+'"></div>'+
|
|
811
|
+
'<span class="mono" id="buscaN" style="font-size:11px;color:#8a8983"></span><div id="resultados"></div></div>';
|
|
812
|
+
}
|
|
813
|
+
function renderResultados(){
|
|
814
|
+
var el=$('resultados');if(!el)return;
|
|
815
|
+
var n=$('buscaN');
|
|
816
|
+
if(!Array.isArray(estado.conversas)){
|
|
817
|
+
if(n)n.textContent=estado.conversasErro||'Carregando as conversas.';
|
|
818
|
+
el.innerHTML='';return;
|
|
819
|
+
}
|
|
820
|
+
var q=estado.busca.toLowerCase().trim();
|
|
821
|
+
var rs=estado.conversas.filter(function(c){return !q||String(c.titulo||'').toLowerCase().indexOf(q)>=0;});
|
|
822
|
+
if(n)n.textContent=rs.length+(rs.length===1?' conversa':' conversas');
|
|
823
|
+
el.innerHTML=rs.map(function(c){return '<button class="res" data-a="conv" data-id="'+esc(c.id)+'"><span style="flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">'+esc(c.titulo||'Sem título')+'</span></button>';}).join('');
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/* skills */
|
|
827
|
+
function htmlSkills(anim){
|
|
828
|
+
var l=estado.skills,corpo='',resumo='';
|
|
829
|
+
if(!Array.isArray(l))resumo='Carregando as skills.';
|
|
830
|
+
else{
|
|
831
|
+
var on=l.filter(function(k){return k.ligada;}).length;
|
|
832
|
+
resumo=on+' de '+l.length+' ligadas. O Primo usa as ligadas quando o pedido combina.';
|
|
833
|
+
if(!l.length)corpo='<div class="vazio-txt" style="padding:16px 4px">Nenhuma skill instalada.</div>';
|
|
834
|
+
l.forEach(function(k,i){
|
|
835
|
+
corpo+='<div class="linha-lista" style="animation-delay:'+(i*0.05).toFixed(2)+'s"><div style="flex:1;min-width:0"><div class="mono" style="font-size:14px;color:#ecebe6;overflow-wrap:anywhere">'+esc(k.nome)+'</div>'+(k.descricao?'<div style="font-size:13px;color:#a3a29b;margin-top:4px">'+esc(k.descricao)+'</div>':'')+'</div><button class="chave'+(k.ligada?' on':'')+'" data-a="skill" data-i="'+i+'" aria-label="'+(k.ligada?'Desligar ':'Ligar ')+esc(k.nome)+'"></button></div>';
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
return '<div class="'+(anim?'tela-entra':'')+'" style="width:100%;max-width:720px;align-self:center;margin-bottom:auto;display:flex;flex-direction:column;gap:10px"><div><h2 style="margin:0;font-family:\'Instrument Serif\',serif;font-weight:400;font-size:40px">Skills</h2><p style="margin:6px 0 0;color:#a3a29b;font-size:14px">'+esc(resumo)+'</p></div><div style="margin-top:14px;border-top:1px solid #232321">'+corpo+'</div></div>';
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
/* ajustes */
|
|
842
|
+
function tg(a,on,rot,extra){return '<button class="tg'+(on?' on':'')+'" data-a="'+a+'" aria-label="'+esc(rot)+'"'+(extra||'')+'></button>';}
|
|
843
|
+
function htmlConfig(anim){
|
|
844
|
+
var abas=ABAS.filter(function(a){return !(estado.semVoz&&a.id==='voz');}).map(function(a){
|
|
845
|
+
return '<button class="lado-cfg'+(estado.aba===a.id?' on':'')+'" data-a="aba" data-id="'+a.id+'"><span class="tile" style="background:'+a.cor+'">'+ic(a.ico,14,2.2)+'</span>'+a.t+'</button>';
|
|
846
|
+
}).join('');
|
|
847
|
+
if(estado.semVoz&&estado.aba==='voz')estado.aba='modelos';
|
|
848
|
+
var corpo={geral:cfgGeral,modelos:cfgModelos,voz:cfgVoz,conta:cfgConta}[estado.aba]();
|
|
849
|
+
return '<div class="'+(anim?'tela-entra':'')+'" style="width:100%;max-width:860px;align-self:center;margin-bottom:auto;display:flex;flex-wrap:wrap;gap:32px">'+
|
|
850
|
+
'<nav style="flex:1 1 170px;max-width:210px;display:flex;flex-direction:column;gap:2px"><h2 style="margin:0 0 14px 8px;font-family:\'Instrument Serif\',serif;font-weight:400;font-size:34px">Ajustes</h2>'+abas+'</nav>'+
|
|
851
|
+
'<div style="flex:999 1 440px;min-width:0">'+corpo+'</div></div>';
|
|
852
|
+
}
|
|
853
|
+
function h3(t){return '<h3 style="margin:0;font-size:22px;font-weight:600">'+t+'</h3>';}
|
|
854
|
+
function cfgGeral(){
|
|
855
|
+
return h3('Geral')+'<div class="grupo"><div class="lin"><span style="min-width:0">Pasta dos projetos<small class="mono" style="overflow-wrap:anywhere">'+esc(estado.pasta||'')+'</small></span><button class="conectar" data-a="pasta">Mudar…</button></div></div>'+
|
|
856
|
+
'<div class="grupo"><div class="lin"><span style="min-width:0">Histórico de conversas<small>apaga todas as conversas, sem volta</small></span><button class="apagar'+(estado.confirma==='todas'?' conf':'')+'" data-a="limpar">'+(estado.confirma==='todas'?'Apagar tudo?':'Apagar…')+'</button></div></div>';
|
|
857
|
+
}
|
|
858
|
+
function cfgModelos(){
|
|
859
|
+
var A=estado.ajustes;
|
|
860
|
+
var seg='<div class="seg">'+MODOS.map(function(o){return '<button class="'+(estado.modo===o.id?'on':'')+'" data-a="modo" data-v="'+o.id+'">'+o.t+'</button>';}).join('')+'</div>';
|
|
861
|
+
var h=h3('Modelos')+'<div class="grupo"><div class="lin"><span>Modo padrão<small>Chat conversa; Agent mexe nos arquivos</small></span>'+seg+'</div></div>';
|
|
862
|
+
if(!A)return h+'<p style="color:#8a8983;font-size:13px;margin:16px 4px">Carregando os ajustes.</p>';
|
|
863
|
+
h+=cfgEffort(A)+cfgPerm(A);
|
|
864
|
+
var ativo=A.provedor&&A.provedor.id?A.provedor.id:'primo';
|
|
865
|
+
function prov(id,logo,nome,sub){
|
|
866
|
+
var uso=ativo===id;
|
|
867
|
+
return '<div class="lin"><div style="display:flex;align-items:center;gap:14px;min-width:0">'+logo+'<span>'+nome+'<small>'+sub+'</small></span></div><button class="conectar'+(uso?' on':'')+'" data-a="usar" data-id="'+id+'">'+(uso?'Em uso':'Usar')+'</button></div>';
|
|
868
|
+
}
|
|
869
|
+
h+='<div style="margin:18px 0 0 4px" class="rotulo">Quem responde</div><div class="grupo" style="margin-top:8px">'+
|
|
870
|
+
prov('primo',LOGO_PRIMO,'Primo','o servidor do PrimoCode, no seu plano')+
|
|
871
|
+
prov('claude-code',LOGO_CLAUDE,'Claude Code','sua assinatura do Claude, sem chave')+
|
|
872
|
+
prov('codex',LOGO_OPENAI,'Codex','sua assinatura do ChatGPT, sem chave')+'</div>';
|
|
873
|
+
var ps=A.provedores_chave||[];
|
|
874
|
+
if(ps.length){
|
|
875
|
+
var ehChave=['primo','claude-code','codex'].indexOf(ativo)<0;
|
|
876
|
+
var sel=estado.provSel||(ehChave?ativo:ps[0].id);
|
|
877
|
+
if(!ps.some(function(p){return p.id===sel;}))sel=ps[0].id;
|
|
878
|
+
var masc=(ehChave&&sel===ativo&&A.provedor.chave_mascarada)?A.provedor.chave_mascarada:'';
|
|
879
|
+
h+='<div style="margin:18px 0 0 4px" class="rotulo">Chave de API</div><div class="grupo" style="margin-top:8px"><div class="lin" style="flex-wrap:wrap"><div style="display:flex;align-items:center;gap:14px;flex:1 1 220px;min-width:0"><span class="logo-ia" style="background:#2a2a28;color:#ecebe6">'+ic(ICO.chave,18)+'</span><span>Sua chave de API<small>'+(masc?'chave atual: <span class="mono">'+esc(masc)+'</span>':'sem o limite do servidor')+'</small></span></div>'+
|
|
880
|
+
'<span class="sel-w"><label for="provSel" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)">Provedor da chave</label><select id="provSel" class="sel">'+ps.map(function(p){return '<option value="'+esc(p.id)+'"'+(p.id===sel?' selected':'')+'>'+esc(p.nome)+'</option>';}).join('')+'</select>'+ic(ICO.chev2,12,2.5)+'</span>'+
|
|
881
|
+
'<div style="flex:1 1 100%;display:flex;gap:10px;padding-left:54px"><label for="chaveApi" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)">Chave de API</label><input id="chaveApi" class="campo" type="password" autocomplete="off" placeholder="'+(estado.chaveSalva?'chave salva':'cole a chave aqui')+'" value="'+esc(estado.chaveDraft)+'"><button id="chaveBtn" class="conectar'+(estado.chaveSalva?' on':'')+'" data-a="salvarChave">'+(estado.chaveSalva?'Salva':'Salvar')+'</button></div></div></div>';
|
|
882
|
+
}
|
|
883
|
+
return h;
|
|
884
|
+
}
|
|
885
|
+
function cfgVoz(){
|
|
886
|
+
var A=estado.ajustes;
|
|
887
|
+
if(!A||!A.voz)return h3('Voz')+'<p style="color:#8a8983;font-size:13px;margin:16px 4px">Carregando os ajustes.</p>';
|
|
888
|
+
return h3('Voz')+'<div class="grupo"><div class="lin"><label for="vozNome" style="min-width:0">Nome do assistente<small>é a palavra que chama o Primo na voz</small></label><input id="vozNome" class="campo campo-s" data-in="voz_nome" autocomplete="off" value="'+esc(A.voz.nome||'')+'"></div>'+
|
|
889
|
+
'<div class="lin"><span>Sons</span>'+tg('sons',!!A.voz.sons,'Sons')+'</div></div>';
|
|
890
|
+
}
|
|
891
|
+
function cfgConta(){
|
|
892
|
+
if(!estado.logado)return h3('Conta')+'<div class="grupo"><div class="lin"><span>Entre pra salvar as conversas e usar o Primo.</span><button class="entrar" data-a="entrar">Entrar</button></div></div>';
|
|
893
|
+
var ini=(String(estado.email||'?').trim().charAt(0)||'?').toUpperCase();
|
|
894
|
+
var sm='';
|
|
895
|
+
if(estado.plano)sm+='<small>Plano '+esc(estado.plano)+'</small>';
|
|
896
|
+
if(estado.planoAte)sm+='<small>válido até '+esc(fmtData(estado.planoAte))+'</small>';
|
|
897
|
+
return h3('Conta')+'<div class="grupo"><div class="lin"><div style="display:flex;align-items:center;gap:14px;min-width:0"><div class="avatar" style="width:40px;height:40px;font-size:16px">'+esc(ini)+'</div><span style="min-width:0;overflow-wrap:anywhere">'+esc(estado.email)+sm+'</span></div></div></div>'+
|
|
898
|
+
'<div class="grupo"><div class="lin"><button data-a="sair" style="border:0;background:transparent;color:#f08a7e;font-size:14px;cursor:pointer;padding:0">Sair da conta</button></div></div>';
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/* ---------- composer ---------- */
|
|
902
|
+
function ta(){return $('pergunta');}
|
|
903
|
+
function renderAnexos(){
|
|
904
|
+
$('anexos').innerHTML=estado.anexos.length?'<div style="display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px">'+estado.anexos.map(function(x,i){
|
|
905
|
+
return '<span class="anexo"><span style="color:#22d3ee;display:inline-flex">'+ic(ICO.clip,13)+'</span><span class="n" title="'+esc(x.nome)+'">'+esc(x.nome)+'</span><button data-a="tirar" data-i="'+i+'" aria-label="Tirar anexo">'+ic(ICO.x,12,2.4)+'</button></span>';
|
|
906
|
+
}).join('')+'</div>':'';
|
|
907
|
+
atualizaBotao();
|
|
908
|
+
}
|
|
909
|
+
var GAUGE='<path d="M4 17a8 8 0 1 1 16 0"></path><path d="m12 17 4-5"></path>';
|
|
910
|
+
function efNiveis(){var e=estado.ajustes&&estado.ajustes.effort;return e&&Array.isArray(e.niveis)?e.niveis.map(function(x){return typeof x==='string'?{nome:x,resumo:''}:x;}):[];}
|
|
911
|
+
function renderMenu(){
|
|
912
|
+
var chip=$('chipModo'),ce=$('chipEf');
|
|
913
|
+
var atual=MODOS.filter(function(o){return o.id===estado.modo;})[0]||MODOS[0];
|
|
914
|
+
chip.className='chip'+(estado.menu==='modo'||estado.menu===true?' on':'');
|
|
915
|
+
chip.innerHTML=ic(ICO.sol,13)+esc(atual.t)+ic(ICO.chev,12,2.2);
|
|
916
|
+
var ef=estado.ajustes&&estado.ajustes.effort;
|
|
917
|
+
if(ef&&ef.atual){var ns0=efNiveis(),ult=ns0.length>1&&ns0[ns0.length-1].nome===ef.atual;ce.hidden=false;ce.className='chip chip-ef'+(estado.menu==='ef'?' on':'')+(ult?' ultra':'');ce.textContent=efNome(ef.atual);}
|
|
918
|
+
else ce.hidden=true;
|
|
919
|
+
if(!estado.menu){$('menu').innerHTML='';return;}
|
|
920
|
+
if(estado.menu==='ef'){
|
|
921
|
+
if(!ef){$('menu').innerHTML='';return;}
|
|
922
|
+
var ex=$('menu').firstChild;
|
|
923
|
+
if(ex&&ex.querySelector&&ex.querySelector('.efs')){efAplica();return;}
|
|
924
|
+
var lf=Math.max(0,Math.min(ce.offsetLeft,$('menu').parentNode.clientWidth-268));
|
|
925
|
+
$('menu').innerHTML='<div class="menu efs-pop" style="left:'+lf+'px">'+efSlider()+'</div>';
|
|
926
|
+
efAplica();
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
$('menu').innerHTML='<div class="menu"><div class="rotulo" style="padding:8px 12px 6px">Modo</div>'+
|
|
930
|
+
MODOS.map(function(o){return '<button class="opcao" data-a="modo" data-v="'+o.id+'"><span>'+o.t+'<small>'+o.d+'</small></span>'+(o.id===estado.modo?ic(ICO.ok,16,2.6).replace('<svg ','<svg class="ok" '):'')+'</button>';}).join('')+
|
|
931
|
+
'<div style="height:1px;background:#2e2e2b;margin:6px 8px"></div>'+
|
|
932
|
+
'<button class="opcao" data-a="cfgmodelos"><span style="color:#a3a29b;display:inline-flex">'+ic(GEAR,16)+'</span><span>Configurar outros modelos<small>Claude, Codex ou a sua chave</small></span></button></div>';
|
|
933
|
+
}
|
|
934
|
+
var EF_NOME={low:'Baixo',medium:'Médio',high:'Alto',xhigh:'Extra alto',max:'Máximo',ultracode:'Ultracode'};
|
|
935
|
+
function efNome(id){return EF_NOME[id]||id;}
|
|
936
|
+
var EF_PAD=13;
|
|
937
|
+
var efDrag=null,efSolto=0,efRaf=0,efCtx=null,efSomT=0,efPxRaf=0;
|
|
938
|
+
function setEffort(nome){
|
|
939
|
+
var ef=estado.ajustes&&estado.ajustes.effort;
|
|
940
|
+
if(ef&&ef.atual===nome){efAplica();return;}
|
|
941
|
+
if(ef)ef.atual=nome;
|
|
942
|
+
post({acao:'ajuste',chave:'effort',valor:nome});
|
|
943
|
+
renderMenu();efAplica();
|
|
944
|
+
}
|
|
945
|
+
function setPerm(nome){
|
|
946
|
+
var p=estado.ajustes&&estado.ajustes.permissoes;
|
|
947
|
+
if(p)p.atual=nome;
|
|
948
|
+
post({acao:'ajuste',chave:'permissoes',valor:nome});
|
|
949
|
+
if(estado.tela==='config')renderPrincipal();
|
|
950
|
+
}
|
|
951
|
+
/* som mecânico: rajada de ruído filtrado + um blip de tom */
|
|
952
|
+
function efAudio(){
|
|
953
|
+
if(efCtx)return efCtx;
|
|
954
|
+
try{var C=window.AudioContext||window.webkitAudioContext;if(C)efCtx=new C();}catch(e){}
|
|
955
|
+
return efCtx;
|
|
956
|
+
}
|
|
957
|
+
function efSom(j,n){
|
|
958
|
+
var c=efCtx;if(!c)return;
|
|
959
|
+
try{
|
|
960
|
+
if(c.state==='suspended')c.resume();
|
|
961
|
+
var agora=Date.now();if(agora-efSomT<30)return;efSomT=agora;
|
|
962
|
+
var t=c.currentTime,f=n>1?j/(n-1):0,ult=n>1&&j===n-1;
|
|
963
|
+
var dur=ult?0.1:0.035,len=Math.ceil(c.sampleRate*dur),buf=c.createBuffer(1,len,c.sampleRate),d=buf.getChannelData(0);
|
|
964
|
+
for(var i=0;i<len;i++)d[i]=(Math.random()*2-1)*Math.pow(1-i/len,3);
|
|
965
|
+
var src=c.createBufferSource();src.buffer=buf;
|
|
966
|
+
var bp=c.createBiquadFilter();bp.type='bandpass';bp.frequency.value=ult?650:2200+f*2600;bp.Q.value=ult?1.1:4;
|
|
967
|
+
var g=c.createGain();g.gain.value=ult?0.3:0.15;
|
|
968
|
+
src.connect(bp);bp.connect(g);g.connect(c.destination);src.start(t);
|
|
969
|
+
var o=c.createOscillator(),og=c.createGain(),f0=ult?85:520+f*700;
|
|
970
|
+
o.type=ult?'sine':'triangle';
|
|
971
|
+
o.frequency.setValueAtTime(f0*(ult?1.7:1.15),t);
|
|
972
|
+
o.frequency.exponentialRampToValueAtTime(f0,t+0.03);
|
|
973
|
+
og.gain.setValueAtTime(ult?0.24:0.05,t);
|
|
974
|
+
og.gain.exponentialRampToValueAtTime(0.0001,t+(ult?0.22:0.05));
|
|
975
|
+
o.connect(og);og.connect(c.destination);o.start(t);o.stop(t+(ult?0.24:0.07));
|
|
976
|
+
}catch(e){}
|
|
977
|
+
}
|
|
978
|
+
/* mola: 'free' segue o ponteiro com atraso; 'snap' encaixa com overshoot */
|
|
979
|
+
function efSpring(s,alvo,modo){
|
|
980
|
+
s._t=alvo;s._modo=modo;
|
|
981
|
+
if(s._x==null||REDUZ){
|
|
982
|
+
s._x=alvo;s._v=0;s._anim=false;
|
|
983
|
+
var ns=efNiveis();if(ns.length)efVisual(s,alvo,ns);
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
s._v=s._v||0;s._anim=true;
|
|
987
|
+
if(!efRaf)efRaf=requestAnimationFrame(efQuadro);
|
|
988
|
+
}
|
|
989
|
+
function efQuadro(){
|
|
990
|
+
efRaf=0;
|
|
991
|
+
var ns=efNiveis(),vivo=false;
|
|
992
|
+
Array.prototype.forEach.call(document.querySelectorAll('.efs'),function(s){
|
|
993
|
+
if(!s._anim)return;
|
|
994
|
+
var snap=s._modo==='snap',k=snap?0.34:0.2,d=snap?0.7:0.62;
|
|
995
|
+
s._v=(s._v+(s._t-s._x)*k)*d;
|
|
996
|
+
s._x=Math.max(-0.04,Math.min(1.04,s._x+s._v));
|
|
997
|
+
if(Math.abs(s._v)<0.0004&&Math.abs(s._t-s._x)<0.0004){s._x=s._t;s._v=0;s._anim=false;}
|
|
998
|
+
if(ns.length)efVisual(s,s._x,ns);
|
|
999
|
+
if(s._anim)vivo=true;
|
|
1000
|
+
});
|
|
1001
|
+
if(vivo)efRaf=requestAnimationFrame(efQuadro);
|
|
1002
|
+
}
|
|
1003
|
+
/* matriz de pixels (ultracode): azul elétrico, onda varrendo, deriva rumo ao botão, brilho e explosão na entrada */
|
|
1004
|
+
function efHash(a,b){var x=Math.sin(a*12.9898+b*78.233)*43758.5453;return x-Math.floor(x);}
|
|
1005
|
+
function efCor(b,sp){
|
|
1006
|
+
var a,c,f;
|
|
1007
|
+
if(sp)return [214,236,255];
|
|
1008
|
+
if(b<0.5){a=[30,107,255];c=[61,139,255];f=b/0.5;}
|
|
1009
|
+
else{a=[61,139,255];c=[124,196,255];f=(Math.min(1,b)-0.5)/0.5;}
|
|
1010
|
+
return [Math.round(a[0]+(c[0]-a[0])*f),Math.round(a[1]+(c[1]-a[1])*f),Math.round(a[2]+(c[2]-a[2])*f)];
|
|
1011
|
+
}
|
|
1012
|
+
function efDesenha(s,agora){
|
|
1013
|
+
var cv=s.querySelector('.efs-px');if(!cv)return;
|
|
1014
|
+
var W=cv.clientWidth,H=cv.clientHeight;if(!W||!H)return;
|
|
1015
|
+
var dpr=window.devicePixelRatio||1;
|
|
1016
|
+
if(cv.width!==Math.round(W*dpr)||cv.height!==Math.round(H*dpr)){cv.width=Math.round(W*dpr);cv.height=Math.round(H*dpr);}
|
|
1017
|
+
var g=cv.getContext('2d');g.setTransform(dpr,0,0,dpr,0,0);g.clearRect(0,0,W,H);
|
|
1018
|
+
var ns=efNiveis(),n=ns.length;if(n<2)return;
|
|
1019
|
+
var xs=0,xk=EF_PAD+Math.max(0,Math.min(1,s._x==null?1:s._x))*(W-EF_PAD*2);
|
|
1020
|
+
if(xk<=xs+3)return;
|
|
1021
|
+
var P=4,rows=Math.floor((H+2)/P),offY=(H-(rows*P-2))/2,cols=Math.ceil(W/P)+1;
|
|
1022
|
+
var t=REDUZ?0:agora/1000,desl=REDUZ?0:t*7,base=Math.floor(desl),frac=(desl-base)*P;
|
|
1023
|
+
var wp=xs+(((t*0.6)%1.5)-0.25)*(xk-xs);
|
|
1024
|
+
var tb=(!REDUZ&&s._burst)?(agora-s._burst)/1000:9,flash=Math.max(0,1-tb/0.5),r=tb*190;
|
|
1025
|
+
for(var i=0;i<cols;i++){
|
|
1026
|
+
var cx=i*P+frac+1;if(cx<xs||cx>xk+4)continue;
|
|
1027
|
+
var w=Math.max(0,Math.min(1,(cx-xs)/(xk-xs)));w=Math.pow(w,1.2);
|
|
1028
|
+
var ii=i-base;
|
|
1029
|
+
for(var j=0;j<rows;j++){
|
|
1030
|
+
var h1=efHash(ii,j);
|
|
1031
|
+
if(h1>0.3+0.7*w+flash)continue;
|
|
1032
|
+
var sh=REDUZ?0.7:0.5+0.5*Math.sin(t*(1.5+efHash(j,ii)*4)+efHash(ii+7,j+3)*6.283);
|
|
1033
|
+
var boost=REDUZ?0:Math.exp(-Math.pow((cx-wp)/13,2))*0.95;
|
|
1034
|
+
var rip=(tb<0.9)?Math.exp(-Math.pow((Math.abs(xk-cx)-r)/9,2))*Math.max(0,1-tb/0.9):0;
|
|
1035
|
+
var b=Math.min(1,(0.3+0.7*w)*(0.3+0.7*sh)+boost+rip+flash*0.8);
|
|
1036
|
+
var sp=!REDUZ&&efHash(ii+3,j+11)>0.965&&sh>0.85||rip>0.7||flash>0.6&&efHash(ii,j+5)>0.7;
|
|
1037
|
+
var c=efCor(b,sp);
|
|
1038
|
+
g.fillStyle='rgba('+c[0]+','+c[1]+','+c[2]+','+(0.28+0.72*b).toFixed(3)+')';
|
|
1039
|
+
g.fillRect(Math.round((cx-1)*dpr)/dpr,Math.round((offY+j*P)*dpr)/dpr,2,2);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
function efPxQuadro(agora){
|
|
1044
|
+
efPxRaf=0;
|
|
1045
|
+
var alguem=false;
|
|
1046
|
+
Array.prototype.forEach.call(document.querySelectorAll('.efs'),function(s){
|
|
1047
|
+
if(!s._pxOn)return;
|
|
1048
|
+
efDesenha(s,agora);alguem=true;
|
|
1049
|
+
});
|
|
1050
|
+
if(alguem&&!REDUZ)efPxRaf=requestAnimationFrame(efPxQuadro);
|
|
1051
|
+
}
|
|
1052
|
+
function efPxStart(){if(!efPxRaf)efPxRaf=requestAnimationFrame(efPxQuadro);}
|
|
1053
|
+
function efVisual(s,p,ns){
|
|
1054
|
+
var n=ns.length,pc=Math.max(0,Math.min(1,p));
|
|
1055
|
+
var i=s._lock!=null?s._lock:Math.max(0,Math.min(n-1,Math.round(pc*(n-1))));
|
|
1056
|
+
var x=ns[i]||{nome:''},ult=n>1&&i===n-1;
|
|
1057
|
+
s.style.setProperty('--p',p.toFixed(4));
|
|
1058
|
+
s.classList.toggle('ultra',ult);
|
|
1059
|
+
var a=s.querySelector('.efs-nome'),nm=efNome(x.nome);
|
|
1060
|
+
if(a&&a.textContent!==nm)a.textContent=nm;
|
|
1061
|
+
s.setAttribute('aria-valuenow',i);s.setAttribute('aria-valuetext',nm);
|
|
1062
|
+
if(ult&&!s._ult)s._burst=performance.now();
|
|
1063
|
+
s._ult=ult;
|
|
1064
|
+
if(ult){
|
|
1065
|
+
clearTimeout(s._pxOff);s._pxOff=0;s._pxOn=true;efPxStart();
|
|
1066
|
+
}else if(s._pxOn&&!s._pxOff){
|
|
1067
|
+
s._pxOff=setTimeout(function(){s._pxOn=false;s._pxOff=0;var cv=s.querySelector('.efs-px');if(cv&&cv.getContext)cv.getContext('2d').clearRect(0,0,cv.width,cv.height);},500);
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
function efAplica(){
|
|
1071
|
+
var ef=estado.ajustes&&estado.ajustes.effort;if(!ef)return;
|
|
1072
|
+
var ns=efNiveis(),n=ns.length,i=0;
|
|
1073
|
+
ns.forEach(function(x,k){if(x.nome===ef.atual)i=k;});
|
|
1074
|
+
var p=n>1?i/(n-1):0;
|
|
1075
|
+
Array.prototype.forEach.call(document.querySelectorAll('.efs'),function(s){
|
|
1076
|
+
if(s.classList.contains('drag'))return;
|
|
1077
|
+
s._lock=i;
|
|
1078
|
+
efSpring(s,p,'snap');
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
/* travou num nível: háptico, som, batida do botão */
|
|
1082
|
+
function efTrava(s,j,dir){
|
|
1083
|
+
var ns=efNiveis(),n=ns.length;if(!n)return;
|
|
1084
|
+
s._lock=j;
|
|
1085
|
+
post(j===n-1||j===0?{acao:'haptico',forte:true}:{acao:'haptico'});
|
|
1086
|
+
efSom(j,n);
|
|
1087
|
+
s.classList.remove('bump');void s.offsetWidth;s.classList.add('bump');
|
|
1088
|
+
clearTimeout(s._bt);s._bt=setTimeout(function(){s.classList.remove('bump');},480);
|
|
1089
|
+
efVisual(s,s._x==null?j/(n-1):s._x,ns);
|
|
1090
|
+
}
|
|
1091
|
+
function efPasso(s,j,dir){
|
|
1092
|
+
var ns=efNiveis();if(!ns[j])return;
|
|
1093
|
+
efTrava(s,j,dir);
|
|
1094
|
+
setEffort(ns[j].nome);
|
|
1095
|
+
}
|
|
1096
|
+
function efSlider(){
|
|
1097
|
+
var ns=efNiveis();if(!ns.length)return '';
|
|
1098
|
+
var n=ns.length,mk='',rec='',k,ir=-1;
|
|
1099
|
+
for(k=0;k<n;k++)if(ns[k].nome==='medium')ir=k;
|
|
1100
|
+
for(k=0;k<n;k++){
|
|
1101
|
+
var q=n>1?k/(n-1):0;
|
|
1102
|
+
mk+='<span class="efs-mk'+(k===ir?' rec':'')+'" style="--q:'+q+'"></span>';
|
|
1103
|
+
}
|
|
1104
|
+
if(ir>=0)rec='<div class="efs-rec"><span style="--q:'+(n>1?ir/(n-1):0)+'">Recomendado</span></div>';
|
|
1105
|
+
return '<div class="efs" tabindex="0" role="slider" aria-label="Esforço" aria-valuemin="0" aria-valuemax="'+(n-1)+'">'+
|
|
1106
|
+
'<div class="efs-cab"><span>Esforço</span><b class="efs-nome"></b><button class="efs-q" data-a="efAjuda" aria-label="O que é isso?">?</button></div>'+
|
|
1107
|
+
'<p class="efs-ajuda">Mais esforço = pensa mais e pesquisa antes; demora mais e gasta mais do plano.</p>'+
|
|
1108
|
+
'<div class="efs-eixo"><span>Mais rápido</span><span>Mais inteligente</span></div>'+
|
|
1109
|
+
'<div class="efs-trilha"><canvas class="efs-px"></canvas>'+mk+'<span class="efs-thumb"></span></div>'+rec+'</div>';
|
|
1110
|
+
}
|
|
1111
|
+
function cfgEffort(A){
|
|
1112
|
+
var ef=A.effort;if(!ef||!Array.isArray(ef.niveis)||!ef.niveis.length)return '';
|
|
1113
|
+
return '<div style="margin:18px 0 0 4px" class="rotulo">Esforço</div><div class="grupo" style="margin-top:8px"><div class="lin" style="display:block;padding:14px 16px">'+efSlider()+'</div></div>';
|
|
1114
|
+
}
|
|
1115
|
+
function efMove(e){
|
|
1116
|
+
if(!efDrag)return;
|
|
1117
|
+
var ns=efNiveis(),n=ns.length;if(n<2)return;
|
|
1118
|
+
var s=efDrag.s,rc=efDrag.tr.getBoundingClientRect();
|
|
1119
|
+
var p=Math.max(0,Math.min(1,(e.clientX-rc.left-EF_PAD)/Math.max(1,rc.width-EF_PAD*2))),prev=efDrag.p;
|
|
1120
|
+
efDrag.p=p;
|
|
1121
|
+
var g=1/(n-1),z=0.2*g,lo=Math.min(prev,p),hi=Math.max(prev,p),dir=p>=prev?1:-1,ks=[],k;
|
|
1122
|
+
for(k=0;k<n;k++){var sk=k*g;if(sk+z>=lo&&sk-z<=hi)ks.push(k);}
|
|
1123
|
+
if(dir<0)ks.reverse();
|
|
1124
|
+
ks.forEach(function(q){if(q!==s._lock)efTrava(s,q,dir);});
|
|
1125
|
+
var sl=(s._lock||0)*g;
|
|
1126
|
+
if(Math.abs(p-sl)<=z)efSpring(s,sl+(p-sl)*0.12,'snap');
|
|
1127
|
+
else efSpring(s,p,'free');
|
|
1128
|
+
}
|
|
1129
|
+
function efFim(e){
|
|
1130
|
+
if(!efDrag||e.pointerId!==efDrag.id)return;
|
|
1131
|
+
efMove(e);
|
|
1132
|
+
var s=efDrag.s,ns=efNiveis(),n=ns.length;
|
|
1133
|
+
var j=Math.max(0,Math.min(n-1,Math.round(efDrag.p*(n-1))));
|
|
1134
|
+
if(j!==s._lock)efTrava(s,j,j>=(s._lock||0)?1:-1);
|
|
1135
|
+
efDrag=null;efSolto=Date.now();
|
|
1136
|
+
s.classList.remove('drag');
|
|
1137
|
+
if(ns[j])setEffort(ns[j].nome);
|
|
1138
|
+
efSpring(s,j/(n-1),'snap');
|
|
1139
|
+
}
|
|
1140
|
+
document.addEventListener('pointerdown',function(e){
|
|
1141
|
+
var tr=e.target.closest&&e.target.closest('.efs-trilha');if(!tr)return;
|
|
1142
|
+
var s=tr.closest('.efs'),ns=efNiveis();if(!s||!ns.length||!(estado.ajustes&&estado.ajustes.effort))return;
|
|
1143
|
+
e.preventDefault();efAudio();
|
|
1144
|
+
if(s._lock==null)efAplica();
|
|
1145
|
+
efDrag={s:s,tr:tr,id:e.pointerId,p:(s._lock||0)/Math.max(1,ns.length-1)};
|
|
1146
|
+
try{tr.setPointerCapture(e.pointerId);}catch(_){}
|
|
1147
|
+
s.classList.add('drag');
|
|
1148
|
+
s.focus();efMove(e);
|
|
1149
|
+
});
|
|
1150
|
+
document.addEventListener('pointermove',function(e){if(efDrag&&e.pointerId===efDrag.id)efMove(e);});
|
|
1151
|
+
document.addEventListener('pointerup',efFim);
|
|
1152
|
+
document.addEventListener('pointercancel',efFim);
|
|
1153
|
+
function cfgPerm(A){
|
|
1154
|
+
var p=A.permissoes;if(!p||!Array.isArray(p.opcoes)||!p.opcoes.length)return '';
|
|
1155
|
+
var at=p.opcoes.filter(function(o){return o.nome===p.atual;})[0];
|
|
1156
|
+
return '<div style="margin:18px 0 0 4px" class="rotulo">Permissões</div><div class="grupo" id="grpPerm" style="margin-top:8px"><div class="lin" style="flex-direction:column;align-items:stretch;gap:12px;padding:14px 16px 16px"><div class="seg" style="align-self:flex-start">'+
|
|
1157
|
+
p.opcoes.map(function(o){return '<button class="'+(o.nome===p.atual?'on':'')+'" data-a="perm" data-v="'+esc(o.nome)+'">'+esc(o.nome)+'</button>';}).join('')+'</div>'+
|
|
1158
|
+
'<div class="ef-txt">'+(at?'<b>'+esc(at.nome)+'</b>'+esc(at.resumo||''):'')+'</div></div></div>';
|
|
1159
|
+
}
|
|
1160
|
+
function renderAvisos(){
|
|
1161
|
+
var a=estado.aviso,el=$('avisos');
|
|
1162
|
+
if(!a){el.innerHTML='';return;}
|
|
1163
|
+
if(a.tipo==='login')el.innerHTML='<div class="cartao-av"><span>Entre na sua conta do PrimoCode pra conversar.</span><span style="display:flex;align-items:center;gap:6px"><button class="entrar" data-a="entrar">Entrar</button><button class="x" data-a="fechaAviso" aria-label="Fechar">'+ic(ICO.x,12,2.4)+'</button></span></div>';
|
|
1164
|
+
else if(a.tipo==='voz')el.innerHTML='<div class="cartao-av"><span style="min-width:0;overflow-wrap:anywhere">'+esc(a.texto)+'</span><span style="display:flex;align-items:center;gap:6px">'+(a.instalar?'<button class="entrar" data-a="vozInstalar">Instalar a voz</button>':'')+(a.instalando?'':'<button class="x" data-a="fechaAviso" aria-label="Fechar">'+ic(ICO.x,12,2.4)+'</button>')+'</span></div>';
|
|
1165
|
+
else if(a.tipo==='sair')el.innerHTML='<div class="cartao-av"><span>Sair da conta?</span><span style="display:flex;align-items:center;gap:6px"><button class="mc-b" data-a="fechaAviso">Cancelar</button><button class="entrar" style="background:#b8473d" data-a="sairConfirma">Sair</button></span></div>';
|
|
1166
|
+
else el.innerHTML='<div class="cartao-av erro"><span style="min-width:0;overflow-wrap:anywhere">'+esc(a.texto)+'</span><button class="x" data-a="fechaAviso" aria-label="Fechar">'+ic(ICO.x,12,2.4)+'</button></div>';
|
|
1167
|
+
}
|
|
1168
|
+
function atualizaBotao(){
|
|
1169
|
+
var b=$('enviar'),vazio=!ta().value.trim()&&!estado.anexos.length;
|
|
1170
|
+
if(estado.esperando){b.className='enviar parar';b.setAttribute('aria-label','Parar');}
|
|
1171
|
+
else if(vazio){b.className='enviar vazio'+(estado.semVoz?' semvoz':'');b.setAttribute('aria-label','Abrir a voz do Primo');}
|
|
1172
|
+
else{b.className='enviar cheio';b.setAttribute('aria-label','Enviar');}
|
|
1173
|
+
}
|
|
1174
|
+
function cresce(){var t=ta();t.style.height='auto';t.style.height=Math.min(t.scrollHeight,160)+'px';}
|
|
1175
|
+
|
|
1176
|
+
/* ---------- ações ---------- */
|
|
1177
|
+
function novaConversa(){
|
|
1178
|
+
if(estado.esperando){estado.ignorando=true;estado.esperando=false;}
|
|
1179
|
+
estado.abertas={};estado.convId=null;estado.titulo='';estado.mensagens=[];estado.animarDe=0;estado.passos=[];estado.erro='';estado.aviso=null;estado.anexos=[];estado.menu=false;
|
|
1180
|
+
ta().value='';cresce();
|
|
1181
|
+
estado.tela='chat';animar=true;
|
|
1182
|
+
renderLado();renderAnexos();renderMenu();renderAvisos();renderPrincipal();
|
|
1183
|
+
ta().focus();
|
|
1184
|
+
}
|
|
1185
|
+
function abrirConversa(id){
|
|
1186
|
+
if(estado.esperando){estado.ignorando=true;estado.esperando=false;estado.passos=[];estado.erro='';}
|
|
1187
|
+
estado.tela='chat';estado.menu=false;estado.aviso=null;
|
|
1188
|
+
post({acao:'abrir',id:id});
|
|
1189
|
+
renderLado();renderMenu();renderAvisos();atualizaBotao();
|
|
1190
|
+
renderPrincipal();
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
/* ---------- saída de terminal ---------- */
|
|
1194
|
+
function linhaSaida(l){
|
|
1195
|
+
var cls=/^\s*(✓|✔)/.test(l)?'to-ok':/^\s*(✗|✘|×|!|erro\b|error\b)/i.test(l)?'to-err':'';
|
|
1196
|
+
var re=/((?:~|\.\.?)?\/[\w.\-@+~\/]+)|(\b\d+(?:[.,]\d+)?\b)/g,out='',last=0,m;
|
|
1197
|
+
while((m=re.exec(l))){
|
|
1198
|
+
if(m.index>last)out+=esc(l.slice(last,m.index));
|
|
1199
|
+
out+='<span class="'+(m[1]?'tp':'tnum')+'">'+esc(m[0])+'</span>';
|
|
1200
|
+
last=re.lastIndex;
|
|
1201
|
+
}
|
|
1202
|
+
out+=esc(l.slice(last));
|
|
1203
|
+
return cls?'<span class="'+cls+'">'+out+'</span>':out;
|
|
1204
|
+
}
|
|
1205
|
+
function htmlSaida(s,pre){
|
|
1206
|
+
var ms=s.midias||[],linhas=String(s.texto==null?'':s.texto).replace(/\s+$/,'').split('\n');
|
|
1207
|
+
var corta=linhas.length>22&&!estado.abertas[pre],vis=corta?linhas.slice(0,22):linhas;
|
|
1208
|
+
var corpo=chipify(vis.map(linhaSaida).join('\n'),ms,pre);
|
|
1209
|
+
return '<div class="tsaida"><div class="ts-h">'+ic('<path d="m5 8 4 4-4 4M12 16h7"></path>',14,2.2)+'<span class="mono">'+esc(s.comando||'')+'</span><button class="mc-b" data-a="copiarSaida" data-id="'+pre+'">Copiar</button></div><code class="ts-b">'+corpo+'</code>'+
|
|
1210
|
+
(corta?'<button class="ts-mais" data-a="mostrarTudo" data-id="'+pre+'">mostrar tudo ('+linhas.length+' linhas)</button>':'')+'</div>';
|
|
1211
|
+
}
|
|
1212
|
+
var NEEDS_ARG=['/read','/run','/open','/historico','/novo','/install-skill','/name'];
|
|
1213
|
+
function toast(txt){
|
|
1214
|
+
var el=$('toast');el.textContent=txt;el.classList.add('show');
|
|
1215
|
+
clearTimeout(toast.t);toast.t=setTimeout(function(){el.classList.remove('show');},1600);
|
|
1216
|
+
}
|
|
1217
|
+
function filtraCmds(q){
|
|
1218
|
+
q=String(q).toLowerCase().replace(/^\s+/,'');
|
|
1219
|
+
var w=q.split(/\s+/)[0],tem=q.indexOf(' ')>=0,r=[];
|
|
1220
|
+
estado.comandos.forEach(function(c,i){
|
|
1221
|
+
var n=c.nome.toLowerCase().replace(/^\//,''),d=String(c.descricao||'').toLowerCase(),s=-1;
|
|
1222
|
+
if(!q)s=0;
|
|
1223
|
+
else if(n.indexOf(q)===0||(tem&&(n===w||q.indexOf(n+' ')===0)))s=0;
|
|
1224
|
+
else if(n.indexOf(w)>=0)s=1;
|
|
1225
|
+
else if(d.indexOf(w)>=0)s=2;
|
|
1226
|
+
if(s>=0)r.push({c:c,s:s,i:i});
|
|
1227
|
+
});
|
|
1228
|
+
r.sort(function(a,b){return (a.s-b.s)||(a.i-b.i);});
|
|
1229
|
+
return r.map(function(x){return x.c;});
|
|
1230
|
+
}
|
|
1231
|
+
function renderPal(){
|
|
1232
|
+
var el=$('pal'),p=estado.pal;
|
|
1233
|
+
if(!p.aberta){el.innerHTML='';return;}
|
|
1234
|
+
var novo=!el.firstChild;
|
|
1235
|
+
var TAG={app:'app',terminal:'terminal',pedido:'seu comando'};
|
|
1236
|
+
el.innerHTML='<div class="menu pal'+(novo?' novo':'')+'" role="listbox">'+p.itens.map(function(c,i){
|
|
1237
|
+
var tp=TAG[c.tipo]?c.tipo:'terminal';
|
|
1238
|
+
return '<button class="opcao pal-r'+(i===p.sel?' sel':'')+'" role="option" data-a="palrun" data-i="'+i+'"><span class="pn t-'+tp+'">'+esc(c.nome)+'</span><span class="pd">'+esc(c.descricao||'')+'</span><span class="pt">'+TAG[tp]+'</span></button>';
|
|
1239
|
+
}).join('')+'<div class="pal-dica">↑↓ navegar · tab completar · enter rodar · esc fechar</div></div>';
|
|
1240
|
+
var s=el.querySelector('.pal-r.sel');if(s&&s.scrollIntoView)s.scrollIntoView({block:'nearest'});
|
|
1241
|
+
}
|
|
1242
|
+
function fechaPal(){var p=estado.pal;p.aberta=false;p.itens=[];p.q=null;renderPal();}
|
|
1243
|
+
function atualizaPal(){
|
|
1244
|
+
var v=ta().value,p=estado.pal;
|
|
1245
|
+
if(v.charAt(0)!=='/'||v.indexOf('\n')>=0||!estado.comandos.length){if(p.aberta)fechaPal();return;}
|
|
1246
|
+
var q=v.slice(1),itens=filtraCmds(q);
|
|
1247
|
+
if(!itens.length){if(p.aberta)fechaPal();return;}
|
|
1248
|
+
if(p.q!==q){p.sel=0;p.q=q;}
|
|
1249
|
+
p.itens=itens;
|
|
1250
|
+
if(!p.aberta&&estado.menu){estado.menu=false;renderMenu();}
|
|
1251
|
+
p.aberta=true;renderPal();
|
|
1252
|
+
}
|
|
1253
|
+
function completaCmd(c){
|
|
1254
|
+
ta().value=c.nome+' ';cresce();atualizaBotao();atualizaPal();ta().focus();
|
|
1255
|
+
}
|
|
1256
|
+
function acheCmd(t){
|
|
1257
|
+
var low=t.toLowerCase(),melhor=null;
|
|
1258
|
+
estado.comandos.forEach(function(c){
|
|
1259
|
+
var n=c.nome.toLowerCase();
|
|
1260
|
+
if((low===n||low.indexOf(n+' ')===0)&&(!melhor||n.length>melhor.nome.length))melhor=c;
|
|
1261
|
+
});
|
|
1262
|
+
return melhor;
|
|
1263
|
+
}
|
|
1264
|
+
function executaCmd(c,t){
|
|
1265
|
+
var nome=c.nome,args='';
|
|
1266
|
+
if(t.toLowerCase().indexOf(nome.toLowerCase())===0)args=t.slice(nome.length).trim();
|
|
1267
|
+
var texto=args?nome+' '+args:nome;
|
|
1268
|
+
if(NEEDS_ARG.indexOf(nome)>=0&&!args){completaCmd(c);return;}
|
|
1269
|
+
fechaPal();
|
|
1270
|
+
if(c.tipo==='pedido'){ta().value=texto;enviar(true);return;}
|
|
1271
|
+
if(c.tipo==='app'){ta().value='';cresce();atualizaBotao();appCmd(c,args);return;}
|
|
1272
|
+
if(estado.esperando)return;
|
|
1273
|
+
estado.mensagens.push({papel:'voce',comando:true,texto:texto});
|
|
1274
|
+
estado.tela='chat';estado.aviso=null;estado.erro='';estado.esperando=true;estado.ignorando=false;estado.passos=[];estado.menu=false;
|
|
1275
|
+
post({acao:'comando',texto:texto,conversa:estado.convId==null?null:estado.convId});
|
|
1276
|
+
ta().value='';cresce();
|
|
1277
|
+
renderAnexos();renderMenu();renderAvisos();renderLista();renderNav();renderPrincipal();
|
|
1278
|
+
}
|
|
1279
|
+
function ultimaResposta(){
|
|
1280
|
+
for(var i=estado.mensagens.length-1;i>=0;i--){
|
|
1281
|
+
var m=estado.mensagens[i];
|
|
1282
|
+
if(m.papel==='primo'){var s=m.saida?m.saida.texto:m.texto;if(s)return String(s);}
|
|
1283
|
+
}
|
|
1284
|
+
return '';
|
|
1285
|
+
}
|
|
1286
|
+
function appCmd(c,args){
|
|
1287
|
+
var a=c.acao,al=String(args||'').toLowerCase();
|
|
1288
|
+
switch(a){
|
|
1289
|
+
case 'nova':novaConversa();break;
|
|
1290
|
+
case 'buscar':post({acao:'conversas'});navegar('buscar');var b=$('busca');if(b)b.focus();break;
|
|
1291
|
+
case 'entrar':post({acao:'entrar'});break;
|
|
1292
|
+
case 'sair_conta':
|
|
1293
|
+
if(!estado.logado){estado.aviso={tipo:'erro',texto:'Você não está em nenhuma conta.'};}
|
|
1294
|
+
else estado.aviso={tipo:'sair'};
|
|
1295
|
+
renderAvisos();break;
|
|
1296
|
+
case 'conta':estado.aba='conta';post({acao:'ajustes'});navegar('config');break;
|
|
1297
|
+
case 'modo':
|
|
1298
|
+
if(al==='chat')setModo('chat');
|
|
1299
|
+
else if(al==='agent'||al==='primocode')setModo('agent');
|
|
1300
|
+
else{estado.menu='modo';renderMenu();}
|
|
1301
|
+
break;
|
|
1302
|
+
case 'modelos':case 'ajustes':estado.aba='modelos';post({acao:'ajustes'});navegar('config');break;
|
|
1303
|
+
case 'skills':post({acao:'skills'});navegar('skills');break;
|
|
1304
|
+
case 'anexar':post({acao:'anexar'});break;
|
|
1305
|
+
case 'desanexar':estado.anexos=[];renderAnexos();break;
|
|
1306
|
+
case 'copiar':
|
|
1307
|
+
var u=ultimaResposta();
|
|
1308
|
+
if(u){copiarTexto(u,{textContent:'Copiar'});toast('Copiado');}else toast('Nada pra copiar');
|
|
1309
|
+
break;
|
|
1310
|
+
case 'voz':if(!estado.semVoz)post({acao:'voz'});break;
|
|
1311
|
+
case 'voz_nome':
|
|
1312
|
+
estado.aba='voz';post({acao:'ajustes'});
|
|
1313
|
+
if(args){post({acao:'ajuste',chave:'voz_nome',valor:String(args)});if(estado.ajustes&&estado.ajustes.voz)estado.ajustes.voz.nome=String(args);}
|
|
1314
|
+
navegar('config');
|
|
1315
|
+
setTimeout(function(){var e=$('vozNome');if(e)e.focus();},80);
|
|
1316
|
+
break;
|
|
1317
|
+
case 'effort':
|
|
1318
|
+
var efc=estado.ajustes&&estado.ajustes.effort,nvs=efc?efNiveis().map(function(x){return x.nome;}):['low','medium','high','xhigh','max','ultracode'];
|
|
1319
|
+
if(al){
|
|
1320
|
+
var ve=al.split(/\s+/)[0];
|
|
1321
|
+
if(nvs.indexOf(ve)<0)toast('Use: /effort low|medium|high|xhigh|max|ultracode');
|
|
1322
|
+
else{setEffort(ve);toast('Esforço: '+efNome(ve));}
|
|
1323
|
+
}else{post({acao:'ajustes'});estado.menu='ef';renderMenu();}
|
|
1324
|
+
break;
|
|
1325
|
+
case 'permissoes':
|
|
1326
|
+
var pc2=estado.ajustes&&estado.ajustes.permissoes,ops=pc2&&pc2.opcoes?pc2.opcoes.map(function(x){return x.nome;}):['auto','livre','plano'];
|
|
1327
|
+
if(al){
|
|
1328
|
+
var vp=al.split(/\s+/)[0];
|
|
1329
|
+
if(ops.indexOf(vp)<0)toast('Use: /permissoes '+ops.join('|'));
|
|
1330
|
+
else{setPerm(vp);toast('Permissões: '+vp);}
|
|
1331
|
+
}else{estado.aba='modelos';estado.irPerm=true;post({acao:'ajustes'});navegar('config');}
|
|
1332
|
+
break;
|
|
1333
|
+
case 'pasta':post({acao:'escolher_pasta'});break;
|
|
1334
|
+
case 'ajuda':ta().value='/';cresce();atualizaBotao();atualizaPal();ta().focus();break;
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
function enviar(pular){
|
|
1338
|
+
var t=ta().value.trim();
|
|
1339
|
+
if(estado.esperando)return;
|
|
1340
|
+
if(!t&&!estado.anexos.length)return;
|
|
1341
|
+
if(!pular&&t.charAt(0)==='/'){var cm=acheCmd(t);if(cm){executaCmd(cm,t);return;}}
|
|
1342
|
+
if(!estado.logado){estado.aviso={tipo:'login'};renderAvisos();return;}
|
|
1343
|
+
var nomes=estado.anexos.map(function(a){return a.nome;});
|
|
1344
|
+
var texto=t||('Anexei '+nomes.join(', '));
|
|
1345
|
+
var midias=estado.anexos.map(function(a){return {achado:'',caminho:a.caminho,nome:a.nome,tipo:tipoDe(a.nome),url:urlArq(a.caminho)};});
|
|
1346
|
+
estado.mensagens.push({papel:'voce',texto:texto,midias:midias});
|
|
1347
|
+
estado.tela='chat';estado.aviso=null;estado.erro='';estado.esperando=true;estado.ignorando=false;estado.passos=[];estado.menu=false;
|
|
1348
|
+
post({acao:'enviar',texto:texto,conversa:estado.convId==null?null:estado.convId,modo:estado.modo,anexos:estado.anexos.map(function(a){return a.caminho;})});
|
|
1349
|
+
ta().value='';estado.anexos=[];cresce();
|
|
1350
|
+
renderAnexos();renderMenu();renderAvisos();renderLista();renderNav();renderPrincipal();
|
|
1351
|
+
}
|
|
1352
|
+
function apertar(){
|
|
1353
|
+
if(estado.esperando){post({acao:'parar'});estado.esperando=false;estado.passos=[];renderEspera();atualizaBotao();return;}
|
|
1354
|
+
if(!ta().value.trim()&&!estado.anexos.length){if(!estado.semVoz)post({acao:'voz'});return;}
|
|
1355
|
+
enviar();
|
|
1356
|
+
}
|
|
1357
|
+
function setModo(v){
|
|
1358
|
+
estado.modo=v;estado.menu=false;
|
|
1359
|
+
post({acao:'ajuste',chave:'modo',valor:v});
|
|
1360
|
+
renderMenu();
|
|
1361
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1362
|
+
}
|
|
1363
|
+
function lerArquivos(lista){
|
|
1364
|
+
Array.prototype.forEach.call(lista||[],function(f){
|
|
1365
|
+
if(f.size>MAX_ARQ){estado.aviso={tipo:'erro',texto:'"'+f.name+'" passa de 25 MB. Escolha um arquivo menor.'};renderAvisos();return;}
|
|
1366
|
+
var r=new FileReader();
|
|
1367
|
+
r.onload=function(){
|
|
1368
|
+
var s=String(r.result||''),i=s.indexOf(',');
|
|
1369
|
+
post({acao:'soltar',nome:f.name,base64:i>=0?s.slice(i+1):s});
|
|
1370
|
+
};
|
|
1371
|
+
r.onerror=function(){estado.aviso={tipo:'erro',texto:'Não consegui ler "'+f.name+'".'};renderAvisos();};
|
|
1372
|
+
r.readAsDataURL(f);
|
|
1373
|
+
});
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
document.addEventListener('click',function(e){
|
|
1377
|
+
if(estado.pal.aberta&&!e.target.closest('#pal')&&e.target.id!=='pergunta')fechaPal();
|
|
1378
|
+
if(Date.now()-efSolto<350)return;
|
|
1379
|
+
if(estado.menu&&!e.target.closest('#menu')&&!e.target.closest('#chipModo')&&!e.target.closest('#chipEf')){estado.menu=false;renderMenu();}
|
|
1380
|
+
var el=e.target.closest('[data-a]');
|
|
1381
|
+
if(estado.confirma!==null){
|
|
1382
|
+
var ca=el&&el.getAttribute('data-a'),ok=(ca==='excluir'&&String(el.dataset.id)===String(estado.confirma))||(ca==='limpar'&&estado.confirma==='todas');
|
|
1383
|
+
if(!ok){estado.confirma=null;renderLista();if(estado.tela==='buscar')renderResultados();if(estado.tela==='config')renderPrincipal();}
|
|
1384
|
+
}
|
|
1385
|
+
if(!el)return;
|
|
1386
|
+
var a=el.getAttribute('data-a'),d=el.dataset;
|
|
1387
|
+
switch(a){
|
|
1388
|
+
case 'nova':novaConversa();break;
|
|
1389
|
+
case 'buscar':post({acao:'conversas'});navegar('buscar');var b=$('busca');if(b)b.focus();break;
|
|
1390
|
+
case 'skills':post({acao:'skills'});navegar('skills');break;
|
|
1391
|
+
case 'cfg':post({acao:'ajustes'});navegar('config');break;
|
|
1392
|
+
case 'cfgmodelos':estado.aba='modelos';post({acao:'ajustes'});navegar('config');break;
|
|
1393
|
+
case 'abrirarq':if(d.c)post({acao:'abrir_arquivo',caminho:d.c});break;
|
|
1394
|
+
case 'mostrar':if(d.c)post({acao:'mostrar_finder',caminho:d.c});break;
|
|
1395
|
+
case 'copiar':
|
|
1396
|
+
var cw=el.closest('.cb,.mc'),cc=cw&&cw.querySelector('code');
|
|
1397
|
+
if(cc)copiarTexto(cc.textContent,el);
|
|
1398
|
+
break;
|
|
1399
|
+
case 'irmidia':
|
|
1400
|
+
var alvo=document.getElementById(d.id);
|
|
1401
|
+
if(alvo){alvo.scrollIntoView({behavior:REDUZ?'auto':'smooth',block:'center'});alvo.classList.remove('flash');void alvo.offsetWidth;alvo.classList.add('flash');setTimeout(function(){alvo.classList.remove('flash');},1400);}
|
|
1402
|
+
break;
|
|
1403
|
+
case 'lightbox':
|
|
1404
|
+
var mi=REG[d.id];
|
|
1405
|
+
if(mi&&mi.url){var lb=$('lb');lb.firstElementChild.src=mi.url;lb.hidden=false;}
|
|
1406
|
+
break;
|
|
1407
|
+
case 'play':
|
|
1408
|
+
var vv=el.closest('.mc').querySelector('video');
|
|
1409
|
+
if(vv){if(vv.paused)vv.play();else vv.pause();}
|
|
1410
|
+
break;
|
|
1411
|
+
case 'aplay':
|
|
1412
|
+
var au=el.closest('.mc').querySelector('audio');
|
|
1413
|
+
if(au){if(au.paused)au.play();else au.pause();}
|
|
1414
|
+
break;
|
|
1415
|
+
case 'aseek':
|
|
1416
|
+
var au2=el.closest('.mc').querySelector('audio'),rc=el.getBoundingClientRect();
|
|
1417
|
+
if(au2&&au2.duration)au2.currentTime=Math.max(0,Math.min(1,(e.clientX-rc.left)/rc.width))*au2.duration;
|
|
1418
|
+
break;
|
|
1419
|
+
case 'palrun':
|
|
1420
|
+
var pc=estado.pal.itens[+d.i];
|
|
1421
|
+
if(pc)executaCmd(pc,ta().value.trim());
|
|
1422
|
+
break;
|
|
1423
|
+
case 'sairConfirma':estado.aviso=null;renderAvisos();post({acao:'sair_conta'});break;
|
|
1424
|
+
case 'mostrarTudo':estado.abertas[d.id]=true;renderMsgs();break;
|
|
1425
|
+
case 'copiarSaida':
|
|
1426
|
+
var mi2=estado.mensagens[+String(d.id).slice(1)];
|
|
1427
|
+
if(mi2&&mi2.saida)copiarTexto(String(mi2.saida.texto||''),el);
|
|
1428
|
+
break;
|
|
1429
|
+
case 'conv':abrirConversa(d.id);break;
|
|
1430
|
+
case 'excluir':
|
|
1431
|
+
if(estado.confirma!==null&&String(estado.confirma)===String(d.id)){
|
|
1432
|
+
estado.confirma=null;post({acao:'excluir',id:d.id});removeConversa(d.id);renderLista();if(estado.tela==='buscar')renderResultados();
|
|
1433
|
+
}else{estado.confirma=d.id;renderLista();}
|
|
1434
|
+
break;
|
|
1435
|
+
case 'limpar':
|
|
1436
|
+
if(estado.confirma==='todas'){
|
|
1437
|
+
estado.confirma=null;post({acao:'excluir_todas'});estado.conversas=[];
|
|
1438
|
+
if(estado.convId!=null){var tl=estado.tela;novaConversa();if(tl==='config'){estado.tela='config';renderNav();renderPrincipal();}}else renderLista();
|
|
1439
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1440
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1441
|
+
}else{estado.confirma='todas';renderLista();if(estado.tela==='config')renderPrincipal();}
|
|
1442
|
+
break;
|
|
1443
|
+
case 'aba':estado.aba=d.id;renderPrincipal();break;
|
|
1444
|
+
case 'menuModo':estado.menu=estado.menu==='modo'?false:'modo';renderMenu();break;
|
|
1445
|
+
case 'menuEf':estado.menu=estado.menu==='ef'?false:'ef';renderMenu();break;
|
|
1446
|
+
case 'perm':setPerm(d.v);break;
|
|
1447
|
+
case 'efAjuda':el.closest('.efs').classList.toggle('ajuda');break;
|
|
1448
|
+
case 'modo':setModo(d.v);break;
|
|
1449
|
+
case 'anexar':post({acao:'anexar'});break;
|
|
1450
|
+
case 'tirar':estado.anexos.splice(+d.i,1);renderAnexos();break;
|
|
1451
|
+
case 'sug':ta().value=SUGESTOES[+d.i]||'';cresce();atualizaBotao();ta().focus();break;
|
|
1452
|
+
case 'enviar':apertar();break;
|
|
1453
|
+
case 'entrar':post({acao:'entrar'});break;
|
|
1454
|
+
case 'sair':post({acao:'sair_conta'});break;
|
|
1455
|
+
case 'fechaAviso':estado.aviso=null;renderAvisos();break;
|
|
1456
|
+
case 'vozInstalar':estado.aviso={tipo:'voz',texto:'Preparando a voz…',instalando:true};renderAvisos();post({acao:'voz_instalar'});break;
|
|
1457
|
+
case 'link':e.preventDefault();post({acao:'abrir_link',url:d.url});break;
|
|
1458
|
+
case 'skill':
|
|
1459
|
+
var k=estado.skills&&estado.skills[+d.i];
|
|
1460
|
+
if(k){k.ligada=!k.ligada;post({acao:'skill',nome:k.nome,ligada:k.ligada});renderPrincipal();}
|
|
1461
|
+
break;
|
|
1462
|
+
case 'usar':
|
|
1463
|
+
if(estado.ajustes){
|
|
1464
|
+
var atual=estado.ajustes.provedor&&estado.ajustes.provedor.id||'primo';
|
|
1465
|
+
if(atual===d.id)break;
|
|
1466
|
+
estado.ajustes.provedor={id:d.id,nome:{primo:'Primo','claude-code':'Claude Code',codex:'Codex'}[d.id]||d.id,chave_mascarada:''};
|
|
1467
|
+
post({acao:'ajuste',chave:'provedor',valor:{provedor:d.id}});
|
|
1468
|
+
renderPrincipal();
|
|
1469
|
+
}
|
|
1470
|
+
break;
|
|
1471
|
+
case 'salvarChave':
|
|
1472
|
+
var c=estado.chaveDraft.trim(),A=estado.ajustes;
|
|
1473
|
+
if(!c||!A)break;
|
|
1474
|
+
var ps=A.provedores_chave||[],sel=estado.provSel||(ps[0]&&ps[0].id);
|
|
1475
|
+
if(!ps.some(function(p){return p.id===sel;}))sel=ps[0]&&ps[0].id;
|
|
1476
|
+
if(!sel)break;
|
|
1477
|
+
post({acao:'ajuste',chave:'provedor',valor:{provedor:sel,chave:c}});
|
|
1478
|
+
var pn=ps.filter(function(p){return p.id===sel;})[0];
|
|
1479
|
+
A.provedor={id:sel,nome:pn?pn.nome:sel,chave_mascarada:''};
|
|
1480
|
+
estado.chaveDraft='';estado.chaveSalva=true;renderPrincipal();
|
|
1481
|
+
break;
|
|
1482
|
+
case 'pasta':post({acao:'escolher_pasta'});break;
|
|
1483
|
+
case 'sons':
|
|
1484
|
+
if(estado.ajustes&&estado.ajustes.voz){
|
|
1485
|
+
estado.ajustes.voz.sons=!estado.ajustes.voz.sons;
|
|
1486
|
+
post({acao:'ajuste',chave:'voz_sons',valor:!!estado.ajustes.voz.sons});
|
|
1487
|
+
renderPrincipal();
|
|
1488
|
+
}
|
|
1489
|
+
break;
|
|
1490
|
+
}
|
|
1491
|
+
});
|
|
1492
|
+
$('lb').addEventListener('click',function(){$('lb').hidden=true;});
|
|
1493
|
+
window.addEventListener('resize',ajustaSites);
|
|
1494
|
+
['play','pause','ended','timeupdate','loadedmetadata'].forEach(function(ev){
|
|
1495
|
+
document.addEventListener(ev,function(e){
|
|
1496
|
+
var a=e.target;if(!a||a.tagName!=='AUDIO')return;
|
|
1497
|
+
var w=a.closest('.mc-au');if(!w)return;
|
|
1498
|
+
w.classList.toggle('tocando',!a.paused&&!a.ended);
|
|
1499
|
+
var f=w.querySelector('.au-bar i'),tt=w.querySelector('.au-t');
|
|
1500
|
+
if(f)f.style.width=(a.duration?(a.currentTime/a.duration*100):0)+'%';
|
|
1501
|
+
if(tt)tt.textContent=tempo(ev==='loadedmetadata'?a.duration:a.currentTime);
|
|
1502
|
+
},true);
|
|
1503
|
+
});
|
|
1504
|
+
document.addEventListener('error',function(e){
|
|
1505
|
+
var x=e.target;if(!x||!x.tagName||['VIDEO','IMG','AUDIO'].indexOf(x.tagName)<0)return;
|
|
1506
|
+
var mc=x.closest&&x.closest('.mc');if(!mc||mc.classList.contains('mc-row'))return;
|
|
1507
|
+
var m=REG[mc.id];if(!m)return;
|
|
1508
|
+
var tmp=document.createElement('div');tmp.innerHTML=linhaM(m,mc.id,0);
|
|
1509
|
+
mc.parentNode.replaceChild(tmp.firstChild,mc);
|
|
1510
|
+
},true);
|
|
1511
|
+
document.addEventListener('mouseover',function(e){
|
|
1512
|
+
var r=e.target.closest&&e.target.closest('.pal-r');if(!r||!estado.pal.aberta)return;
|
|
1513
|
+
var i=+r.getAttribute('data-i');if(i===estado.pal.sel)return;
|
|
1514
|
+
estado.pal.sel=i;
|
|
1515
|
+
Array.prototype.forEach.call(document.querySelectorAll('.pal-r'),function(x,k){x.classList.toggle('sel',k===i);});
|
|
1516
|
+
});
|
|
1517
|
+
document.addEventListener('input',function(e){
|
|
1518
|
+
var t=e.target;
|
|
1519
|
+
if(t.id==='pergunta'){cresce();atualizaBotao();atualizaPal();}
|
|
1520
|
+
else if(t.id==='busca'){estado.busca=t.value;renderResultados();}
|
|
1521
|
+
else if(t.id==='chaveApi'){
|
|
1522
|
+
estado.chaveDraft=t.value;
|
|
1523
|
+
if(estado.chaveSalva){estado.chaveSalva=false;var b=$('chaveBtn');if(b){b.className='conectar';b.textContent='Salvar';}}
|
|
1524
|
+
}
|
|
1525
|
+
});
|
|
1526
|
+
document.addEventListener('change',function(e){
|
|
1527
|
+
var t=e.target;
|
|
1528
|
+
if(t.id==='provSel'){estado.provSel=t.value;estado.chaveSalva=false;renderPrincipal();}
|
|
1529
|
+
else if(t.getAttribute&&t.getAttribute('data-in')==='voz_nome'){
|
|
1530
|
+
var v=t.value.trim();
|
|
1531
|
+
if(estado.ajustes&&estado.ajustes.voz&&v!==estado.ajustes.voz.nome){
|
|
1532
|
+
estado.ajustes.voz.nome=v;
|
|
1533
|
+
post({acao:'ajuste',chave:'voz_nome',valor:v});
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1536
|
+
});
|
|
1537
|
+
document.addEventListener('keydown',function(e){
|
|
1538
|
+
if(e.key==='Escape'&&!$('lb').hidden){$('lb').hidden=true;return;}
|
|
1539
|
+
if(e.target.id==='pergunta'&&estado.pal.aberta&&!e.isComposing){
|
|
1540
|
+
var pp=estado.pal,nn=pp.itens.length;
|
|
1541
|
+
if(e.key==='ArrowDown'){e.preventDefault();pp.sel=(pp.sel+1)%nn;renderPal();return;}
|
|
1542
|
+
if(e.key==='ArrowUp'){e.preventDefault();pp.sel=(pp.sel-1+nn)%nn;renderPal();return;}
|
|
1543
|
+
if(e.key==='Escape'){e.preventDefault();fechaPal();return;}
|
|
1544
|
+
if(e.key==='Tab'){e.preventDefault();completaCmd(pp.itens[pp.sel]);return;}
|
|
1545
|
+
if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();executaCmd(pp.itens[pp.sel],ta().value.trim());return;}
|
|
1546
|
+
}
|
|
1547
|
+
if(e.target.classList&&e.target.classList.contains('efs')){
|
|
1548
|
+
var nk=efNiveis(),ck=0,efk=estado.ajustes&&estado.ajustes.effort;
|
|
1549
|
+
nk.forEach(function(x,k){if(efk&&x.nome===efk.atual)ck=k;});
|
|
1550
|
+
var nx=e.key==='ArrowRight'||e.key==='ArrowUp'?ck+1:e.key==='ArrowLeft'||e.key==='ArrowDown'?ck-1:e.key==='Home'?0:e.key==='End'?nk.length-1:null;
|
|
1551
|
+
if(nx!==null&&nk.length){e.preventDefault();nx=Math.max(0,Math.min(nk.length-1,nx));if(nx!==ck){efAudio();efPasso(e.target,nx,nx>ck?1:-1);}return;}
|
|
1552
|
+
}
|
|
1553
|
+
if(e.key==='Escape'&&estado.menu){estado.menu=false;renderMenu();}
|
|
1554
|
+
if(e.target.id==='pergunta'&&e.key==='Enter'&&!e.shiftKey&&!e.isComposing){e.preventDefault();enviar();}
|
|
1555
|
+
if(e.target.id==='chaveApi'&&e.key==='Enter'){e.preventDefault();var b=$('chaveBtn');if(b)b.click();}
|
|
1556
|
+
if(e.target.id==='vozNome'&&e.key==='Enter'){e.preventDefault();e.target.blur();}
|
|
1557
|
+
});
|
|
1558
|
+
|
|
1559
|
+
/* arrastar e soltar */
|
|
1560
|
+
(function(){
|
|
1561
|
+
var main=$('main'),solta=$('solta');
|
|
1562
|
+
function temArq(e){var t=e.dataTransfer&&e.dataTransfer.types;return !!t&&Array.prototype.indexOf.call(t,'Files')>=0;}
|
|
1563
|
+
main.addEventListener('dragenter',function(e){if(!temArq(e))return;e.preventDefault();solta.hidden=false;});
|
|
1564
|
+
main.addEventListener('dragover',function(e){if(!temArq(e))return;e.preventDefault();if(solta.hidden)solta.hidden=false;});
|
|
1565
|
+
main.addEventListener('dragleave',function(e){if(!main.contains(e.relatedTarget))solta.hidden=true;});
|
|
1566
|
+
main.addEventListener('drop',function(e){e.preventDefault();solta.hidden=true;if(e.dataTransfer&&e.dataTransfer.files)lerArquivos(e.dataTransfer.files);});
|
|
1567
|
+
window.addEventListener('dragover',function(e){e.preventDefault();});
|
|
1568
|
+
window.addEventListener('drop',function(e){e.preventDefault();});
|
|
1569
|
+
})();
|
|
1570
|
+
|
|
1571
|
+
/* ---------- mascote segue o mouse + título digitado ---------- */
|
|
1572
|
+
function aplicaMouse(){
|
|
1573
|
+
var m=$('mascote'),o=$('olhos');
|
|
1574
|
+
if(m)m.style.transform='translate('+(mx*14).toFixed(1)+'px, '+(my*8).toFixed(1)+'px) rotate('+(mx*7).toFixed(1)+'deg)';
|
|
1575
|
+
if(o)o.setAttribute('transform','translate('+(mx*0.9).toFixed(2)+' '+(my*0.6).toFixed(2)+')');
|
|
1576
|
+
}
|
|
1577
|
+
$('app').addEventListener('mousemove',function(e){
|
|
1578
|
+
mx=Math.max(-1,Math.min(1,(e.clientX/window.innerWidth-0.55)*2.4));
|
|
1579
|
+
my=Math.max(-1,Math.min(1,(e.clientY/window.innerHeight-0.35)*2.4));
|
|
1580
|
+
aplicaMouse();
|
|
1581
|
+
});
|
|
1582
|
+
var pi=0,letras=0,apagando=false,espera=0;
|
|
1583
|
+
function palavraAtual(){var p=$('palavra');if(p)p.textContent=REDUZ?PALAVRAS[0]:PALAVRAS[pi%PALAVRAS.length].slice(0,letras);}
|
|
1584
|
+
if(!REDUZ){
|
|
1585
|
+
setInterval(function(){
|
|
1586
|
+
var alvo=PALAVRAS[pi%PALAVRAS.length];
|
|
1587
|
+
if(!apagando&&letras<alvo.length)letras++;
|
|
1588
|
+
else if(!apagando){espera++;if(espera>18){espera=0;apagando=true;}}
|
|
1589
|
+
else if(letras>0)letras--;
|
|
1590
|
+
else{apagando=false;pi++;}
|
|
1591
|
+
palavraAtual();
|
|
1592
|
+
},85);
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
/* ---------- native -> JS ---------- */
|
|
1596
|
+
function sincConta(c){
|
|
1597
|
+
if(!c)return;
|
|
1598
|
+
estado.logado=!!c.logado;estado.email=c.email||'';estado.plano=c.plano||'';estado.planoAte=c.planoAte||'';
|
|
1599
|
+
if(estado.logado&&estado.aviso&&estado.aviso.tipo==='login'){estado.aviso=null;renderAvisos();}
|
|
1600
|
+
}
|
|
1601
|
+
function pedirConversas(){if(estado.logado)post({acao:'conversas'});}
|
|
1602
|
+
var tratar={
|
|
1603
|
+
inicio:function(v){
|
|
1604
|
+
sincConta(v);
|
|
1605
|
+
if(v.pasta!=null)estado.pasta=v.pasta;
|
|
1606
|
+
if(v.modo==='chat'||v.modo==='agent')estado.modo=v.modo;
|
|
1607
|
+
estado.semVoz=!!v.semVoz;estado.arqBase=String(v.arqBase||'');atualizaBotao();
|
|
1608
|
+
renderConta();renderMenu();renderAvisos();
|
|
1609
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1610
|
+
if(estado.logado)pedirConversas();
|
|
1611
|
+
post({acao:'ajustes'});
|
|
1612
|
+
},
|
|
1613
|
+
login:function(v){
|
|
1614
|
+
sincConta(v);
|
|
1615
|
+
if(!estado.logado){estado.conversas=null;estado.conversasErro='';}
|
|
1616
|
+
renderLista();renderConta();
|
|
1617
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1618
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1619
|
+
pedirConversas();
|
|
1620
|
+
},
|
|
1621
|
+
conversas:function(v){
|
|
1622
|
+
if(!Array.isArray(v))return;
|
|
1623
|
+
var l=v.map(function(c,i){return {c:c,i:i};});
|
|
1624
|
+
l.sort(function(a,b){return (ts(b.c.atualizada)-ts(a.c.atualizada))||(a.i-b.i);});
|
|
1625
|
+
estado.conversas=l.map(function(x){return x.c;});estado.conversasErro='';
|
|
1626
|
+
renderLista();
|
|
1627
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1628
|
+
},
|
|
1629
|
+
conversas_erro:function(v){
|
|
1630
|
+
estado.conversasErro=String(v||'');renderLista();
|
|
1631
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1632
|
+
},
|
|
1633
|
+
conversa:function(v){
|
|
1634
|
+
if(!v)return;
|
|
1635
|
+
estado.convId=v.id==null?null:v.id;estado.titulo=v.titulo||'';
|
|
1636
|
+
estado.mensagens=(v.mensagens||[]).map(function(m){return {papel:m.papel==='voce'?'voce':'primo',texto:String(m.texto==null?'':m.texto),midias:Array.isArray(m.midias)?m.midias:[]};});
|
|
1637
|
+
estado.animarDe=0;estado.esperando=false;estado.ignorando=false;estado.passos=[];estado.erro='';estado.tela='chat';
|
|
1638
|
+
renderLado();atualizaBotao();renderPrincipal();
|
|
1639
|
+
},
|
|
1640
|
+
passo:function(v){
|
|
1641
|
+
if(!estado.esperando)return;
|
|
1642
|
+
var perto=pertoDoFim();
|
|
1643
|
+
estado.passos.push(String(v));renderPassos();
|
|
1644
|
+
if(perto)rolaFim();
|
|
1645
|
+
},
|
|
1646
|
+
resposta:function(v){
|
|
1647
|
+
if(estado.ignorando){estado.ignorando=false;pedirConversas();return;}
|
|
1648
|
+
if(!v)return;
|
|
1649
|
+
estado.mensagens.push({papel:'primo',texto:String(v.texto==null?'':v.texto),midias:Array.isArray(v.midias)?v.midias:[]});
|
|
1650
|
+
if(v.conversa!=null)estado.convId=v.conversa;
|
|
1651
|
+
estado.esperando=false;estado.passos=[];estado.erro='';
|
|
1652
|
+
atualizaBotao();
|
|
1653
|
+
if(estado.tela==='chat'){renderMsgs();renderEspera();rolaFim();$('titulo').textContent=tituloTopo();}
|
|
1654
|
+
pedirConversas();
|
|
1655
|
+
},
|
|
1656
|
+
erro:function(v){
|
|
1657
|
+
var txt=String(v||'Algo deu errado.');
|
|
1658
|
+
if(estado.ignorando){estado.ignorando=false;return;}
|
|
1659
|
+
if(estado.esperando){
|
|
1660
|
+
estado.esperando=false;estado.passos=[];estado.erro=txt;atualizaBotao();
|
|
1661
|
+
if(estado.tela==='chat'&&estado.mensagens.length){renderEspera();rolaFim();}
|
|
1662
|
+
else{estado.aviso={tipo:'erro',texto:txt};renderAvisos();}
|
|
1663
|
+
}else{estado.aviso={tipo:'erro',texto:txt};renderAvisos();}
|
|
1664
|
+
},
|
|
1665
|
+
vozAviso:function(v){ /* o app desktop: a voz não está instalada, está instalando ou terminou */
|
|
1666
|
+
if(!v)return;
|
|
1667
|
+
estado.aviso={tipo:'voz',texto:String(v.texto||''),instalar:!!v.instalar,instalando:!!v.instalando};renderAvisos();
|
|
1668
|
+
},
|
|
1669
|
+
anexo:function(v){
|
|
1670
|
+
if(!v||!v.caminho)return;
|
|
1671
|
+
if(estado.anexos.some(function(a){return a.caminho===v.caminho;}))return;
|
|
1672
|
+
estado.anexos.push({nome:v.nome||v.caminho,caminho:v.caminho});renderAnexos();
|
|
1673
|
+
},
|
|
1674
|
+
skills:function(v){
|
|
1675
|
+
if(!Array.isArray(v))return;
|
|
1676
|
+
estado.skills=v.map(function(k){return {nome:String(k.nome),descricao:k.descricao||'',ligada:!!k.ligada};});
|
|
1677
|
+
if(estado.tela==='skills')renderPrincipal();
|
|
1678
|
+
},
|
|
1679
|
+
ajustes:function(v){
|
|
1680
|
+
if(!v)return;
|
|
1681
|
+
estado.ajustes=v;
|
|
1682
|
+
if(v.modo==='chat'||v.modo==='agent')estado.modo=v.modo;
|
|
1683
|
+
if(v.pasta!=null)estado.pasta=v.pasta;
|
|
1684
|
+
if(v.conta){sincConta(v.conta);renderConta();}
|
|
1685
|
+
renderMenu();
|
|
1686
|
+
if(estado.tela==='config'){
|
|
1687
|
+
var a=document.activeElement;
|
|
1688
|
+
if(a&&a.classList&&a.classList.contains('efs'))efAplica();
|
|
1689
|
+
else if(!(a&&a.closest&&a.closest('#rolagem')&&(a.tagName==='INPUT'||a.tagName==='SELECT')))renderPrincipal();
|
|
1690
|
+
}
|
|
1691
|
+
},
|
|
1692
|
+
comandos:function(v){
|
|
1693
|
+
if(!Array.isArray(v))return;
|
|
1694
|
+
estado.comandos=v.filter(function(c){return c&&c.nome;}).map(function(c){return {nome:String(c.nome),descricao:c.descricao||'',tipo:c.tipo||'terminal',acao:c.acao||''};});
|
|
1695
|
+
if(estado.pal.aberta||ta().value.charAt(0)==='/')atualizaPal();
|
|
1696
|
+
},
|
|
1697
|
+
saida:function(v){
|
|
1698
|
+
if(estado.ignorando){estado.ignorando=false;return;}
|
|
1699
|
+
if(!v)return;
|
|
1700
|
+
estado.mensagens.push({papel:'primo',saida:{comando:String(v.comando||''),texto:String(v.texto==null?'':v.texto),midias:Array.isArray(v.midias)?v.midias:[]}});
|
|
1701
|
+
if(v.conversa!=null)estado.convId=v.conversa;
|
|
1702
|
+
estado.esperando=false;estado.passos=[];estado.erro='';
|
|
1703
|
+
atualizaBotao();
|
|
1704
|
+
if(estado.tela==='chat'){renderMsgs();renderEspera();rolaFim();$('titulo').textContent=tituloTopo();renderLista();}
|
|
1705
|
+
},
|
|
1706
|
+
pasta:function(v){
|
|
1707
|
+
estado.pasta=String(v||'');
|
|
1708
|
+
if(estado.ajustes)estado.ajustes.pasta=estado.pasta;
|
|
1709
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1710
|
+
}
|
|
1711
|
+
};
|
|
1712
|
+
window.chat=function(msg){
|
|
1713
|
+
if(!msg||typeof msg!=='object')return;
|
|
1714
|
+
Object.keys(msg).forEach(function(k){
|
|
1715
|
+
if(Object.prototype.hasOwnProperty.call(tratar,k)){
|
|
1716
|
+
try{tratar[k](msg[k]);}catch(err){post({acao:'erro',arg:String(err&&err.message||err)});}
|
|
1717
|
+
}
|
|
1718
|
+
});
|
|
1719
|
+
};
|
|
1720
|
+
|
|
1721
|
+
/* ---------- partida ---------- */
|
|
1722
|
+
renderLado();renderMenu();renderAnexos();renderAvisos();renderPrincipal();
|
|
1723
|
+
post({acao:'pronto'});
|
|
1724
|
+
|
|
1725
|
+
/* ---------- dev: so abre no navegador com ?demo ---------- */
|
|
1726
|
+
if(location.search.indexOf('demo')>=0&&!(window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.chat)){
|
|
1727
|
+
(function(){
|
|
1728
|
+
var fora=location.search.indexOf('demo=out')>=0;
|
|
1729
|
+
var convs={
|
|
1730
|
+
d1:{id:'d1',titulo:'Botão do WhatsApp no topo',mensagens:[{papel:'voce',texto:'Põe um botão do WhatsApp fixo no topo'},{papel:'primo',texto:'Pronto: o botão fica **fixo no topo**.\n\n- abre a conversa\n- mensagem já escrita\n\nVeja `index.html`:\n```html\n<a class="zap">Fale comigo</a>\n```\nMais em [o site](https://example.com).'}]},
|
|
1731
|
+
d2:{id:'d2',titulo:'Cardápio com fotos',mensagens:[{papel:'voce',texto:'Monta o cardápio'},{papel:'primo',texto:'Montei o cardápio em 3 seções.'}]}
|
|
1732
|
+
};
|
|
1733
|
+
var aj={effort:{atual:'medium',niveis:[{nome:'low',resumo:'rápido — tarefa simples, resposta curta'},{nome:'medium',resumo:'equilibrado — o padrão'},{nome:'high',resumo:'pensa mais antes de agir'},{nome:'xhigh',resumo:'bem fundo — tarefas difíceis'},{nome:'max',resumo:'o máximo de raciocínio'},{nome:'ultracode',resumo:'esforço total em código, sem pressa'}]},permissoes:{atual:'auto',opcoes:[{nome:'auto',resumo:'o Primo decide quando pedir licença'},{nome:'livre',resumo:'faz tudo sem perguntar'},{nome:'plano',resumo:'só planeja, não mexe em nada'}]},modo:'agent',provedor:{id:'primo',nome:'Primo',chave_mascarada:''},provedores_chave:[{id:'anthropic',nome:'Anthropic'},{id:'openai',nome:'OpenAI'},{id:'openrouter',nome:'OpenRouter'}],pasta:'~/Primo',voz:{nome:'Primo',sons:true},conta:{logado:!fora,email:'joel@exemplo.com',plano:'Pro',planoAte:'2026-12-31'}};
|
|
1734
|
+
function r(m,t){setTimeout(function(){window.chat(m);},t||120);}
|
|
1735
|
+
window.__demo=function(o){
|
|
1736
|
+
console.log('post',o);
|
|
1737
|
+
switch(o.acao){
|
|
1738
|
+
case 'comando':
|
|
1739
|
+
r({passo:'Lendo a pasta do projeto'},400);
|
|
1740
|
+
r({saida:{comando:o.texto.split(' ')[0],texto:'projeto/\n├── src/\n│ ├── app.js 12 KB\n│ └── util.js 3 KB\n├── public/\n│ └── capa.png 80 KB\n└── package.json\n\n✓ 3 pastas, 4 arquivos em /demo/projeto\n✗ falta o README.md\n'+Array.apply(null,Array(24)).map(function(_,i){return 'linha extra '+(i+1);}).join('\n'),conversa:null,midias:[{achado:'/demo/projeto',caminho:'/demo/projeto',nome:'projeto',tipo:'pasta',url:'',tamanho:0}]}},1200);
|
|
1741
|
+
break;
|
|
1742
|
+
case 'pronto':r({comandos:[{nome:'/tree',descricao:'árvore do projeto',tipo:'terminal'},{nome:'/read',descricao:'lê um arquivo',tipo:'terminal'},{nome:'/voice nome',descricao:'muda o nome do assistente',tipo:'app',acao:'voz_nome'},{nome:'/nova',descricao:'começa uma conversa nova',tipo:'app',acao:'nova'},{nome:'/modo',descricao:'chat ou agent',tipo:'app',acao:'modo'},{nome:'/copiar',descricao:'copia a última resposta',tipo:'app',acao:'copiar'},{nome:'/sair',descricao:'sai da conta',tipo:'app',acao:'sair_conta'},{nome:'/ajuda',descricao:'mostra todos os comandos',tipo:'app',acao:'ajuda'},{nome:'/effort',descricao:'nível de esforço do Primo',tipo:'app',acao:'effort'},{nome:'/permissoes',descricao:'o que o Primo pode fazer sozinho',tipo:'app',acao:'permissoes'},{nome:'/revisar',descricao:'revisa o código do projeto',tipo:'pedido'},{nome:'/explicar',descricao:'explica o que o projeto faz',tipo:'pedido'}]},300);
|
|
1743
|
+
r({inicio:{logado:!fora,email:fora?'':'joel@exemplo.com',plano:'Pro',planoAte:'2026-12-31',pasta:'~/Primo',modo:'agent'}});break;
|
|
1744
|
+
case 'conversas':r({conversas:[{id:'d2',titulo:'Cardápio com fotos',atualizada:'2026-10-18T10:00:00Z'},{id:'d1',titulo:'Botão do WhatsApp no topo',atualizada:'2026-10-19T09:00:00Z'}]});break;
|
|
1745
|
+
case 'abrir':if(convs[o.id])r({conversa:convs[o.id]});break;
|
|
1746
|
+
case 'enviar':
|
|
1747
|
+
['Lendo os arquivos','Procurando o index.html','Editando o topo do site','Rodando npm test','Renderizando o vídeo','Animando a logo','Olhando a pasta site','Escrevendo app.js'].forEach(function(p,i){r({passo:p},500+i*700);});
|
|
1748
|
+
r({resposta:{texto:'# Pronto\nFeito. Montei tudo:\n\n- [x] vídeo `/demo/lancamento.mp4`\n- [x] capa /demo/capa.png\n- [ ] publicar\n - passo **aninhado**\n\n1. site /demo/site/index.html\n2. trilha /demo/trilha.mp3\n\n> Dica: o relatório está em /demo/relatorio.pdf.\n\n| item | tamanho |\n|:--|--:|\n| vídeo | 12 MB |\n| capa | 80 KB |\n\n---\n\nCódigo em /demo/app.js e a pasta /demo/site e o arquivo /demo/dados.bin.\n\n```js\nconst x = 1; // soma\nfunction f(a){ return "oi " + a }\n```',conversa:'d3',midias:[
|
|
1749
|
+
{achado:'/demo/lancamento.mp4',caminho:'/demo/lancamento.mp4',nome:'lancamento.mp4',tipo:'video',url:'demo/lancamento.mp4',tamanho:12582912},
|
|
1750
|
+
{achado:'/demo/capa.png',caminho:'/demo/capa.png',nome:'capa.png',tipo:'imagem',url:'data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%27640%27 height=%27400%27%3E%3Cdefs%3E%3ClinearGradient id=%27g%27%3E%3Cstop offset=%270%27 stop-color=%27%2322d3ee%27/%3E%3Cstop offset=%271%27 stop-color=%27%233b6fd4%27/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width=%27640%27 height=%27400%27 fill=%27url(%23g)%27/%3E%3C/svg%3E',tamanho:81920},
|
|
1751
|
+
{achado:'/demo/site/index.html',caminho:'/demo/site/index.html',nome:'index.html',tipo:'html',url:'demo/site/index.html',tamanho:2048},
|
|
1752
|
+
{achado:'/demo/trilha.mp3',caminho:'/demo/trilha.mp3',nome:'trilha.mp3',tipo:'audio',url:'demo/trilha.mp3',tamanho:3145728},
|
|
1753
|
+
{achado:'/demo/relatorio.pdf',caminho:'/demo/relatorio.pdf',nome:'relatorio.pdf',tipo:'pdf',url:'demo/relatorio.pdf',tamanho:204800},
|
|
1754
|
+
{achado:'/demo/app.js',caminho:'/demo/app.js',nome:'app.js',tipo:'codigo',url:'demo/app.js',tamanho:900,trecho:'// app\nconst n = 42;\nfunction soma(a, b) {\n return a + b; // soma\n}\nconsole.log("total", soma(n, 1));'},
|
|
1755
|
+
{achado:'/demo/site',caminho:'/demo/site',nome:'site',tipo:'pasta',url:'',tamanho:0},
|
|
1756
|
+
{achado:'/demo/dados.bin',caminho:'/demo/dados.bin',nome:'dados.bin',tipo:'arquivo',url:'demo/dados.bin',tamanho:5120}]}},3000);break;
|
|
1757
|
+
case 'anexar':r({anexo:{nome:'gravacao.mov',caminho:'/tmp/gravacao.mov'}});break;
|
|
1758
|
+
case 'soltar':r({anexo:{nome:o.nome,caminho:'/tmp/'+o.nome}});break;
|
|
1759
|
+
case 'skills':r({skills:[{nome:'editar-meu-video',descricao:'Corta, legenda e anima a sua gravação',ligada:true},{nome:'testar-o-site',descricao:'Abre o site e confere',ligada:false}]});break;
|
|
1760
|
+
case 'skill':case 'excluir':case 'excluir_todas':break;
|
|
1761
|
+
case 'ajustes':r({ajustes:aj});break;
|
|
1762
|
+
case 'ajuste':if(o.chave==='modo')aj.modo=o.valor;if(o.chave==='effort'){aj.effort.atual=o.valor;r({ajustes:aj});}if(o.chave==='permissoes'){aj.permissoes.atual=o.valor;r({ajustes:aj});}break;
|
|
1763
|
+
case 'escolher_pasta':r({pasta:'/Users/demo/Projetos'});break;
|
|
1764
|
+
case 'entrar':r({login:{logado:true,email:'joel@exemplo.com',plano:'Pro',planoAte:'2026-12-31'}});break;
|
|
1765
|
+
case 'sair_conta':r({login:{logado:false,email:'',plano:'',planoAte:''}});break;
|
|
1766
|
+
}
|
|
1767
|
+
};
|
|
1768
|
+
if(fora)window.__demo({acao:'pronto'});else window.__demo({acao:'pronto'});
|
|
1769
|
+
})();
|
|
1770
|
+
}
|
|
1771
|
+
</script>
|
|
1772
|
+
</body>
|
|
1773
|
+
</html>
|