primocode 10.15.2 → 10.16.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/README.md +2 -2
- package/bin/primocode.js +64 -8
- package/lib/act.js +2 -0
- package/lib/app-chat.js +97 -0
- package/lib/catalogo.js +3 -1
- package/lib/estudio/gosto/tela.html +1349 -0
- package/lib/estudio/gosto.js +264 -0
- package/lib/estudio/index.js +9 -1
- package/lib/estudio/maquina-diretor.js +9 -5
- package/lib/estudio/maquina.js +5 -1
- package/lib/headless.js +15 -3
- package/lib/local/cerebro.json +93 -1
- package/lib/memoria-usuario.js +164 -0
- package/lib/nuvem.js +22 -1
- package/lib/repeticao.js +1 -1
- package/lib/sandbox.js +57 -9
- package/lib/tools.js +20 -4
- package/lib/ui.js +1 -1
- package/package.json +2 -2
- package/voz/primo_voz/__main__.py +55 -40
- package/voz/primo_voz/app.py +460 -3
- package/voz/primo_voz/chat.html +1762 -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
|
@@ -0,0 +1,1762 @@
|
|
|
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
|
+
/* mascote e título */
|
|
125
|
+
.mascote{transition:transform .35s cubic-bezier(.3,1.5,.5,1);filter:drop-shadow(0 0 26px rgba(34,211,238,.35))}
|
|
126
|
+
.pula-entra{animation:cai .9s cubic-bezier(.3,1.6,.5,1) both}
|
|
127
|
+
@keyframes cai{0%{opacity:0;transform:translateY(-60px) scale(.6)}60%{opacity:1}100%{transform:none}}
|
|
128
|
+
.corpo{animation:anda 1.6s ease-in-out infinite}
|
|
129
|
+
@keyframes anda{0%,100%{transform:translateY(0)}50%{transform:translateY(-.6px)}}
|
|
130
|
+
.perna-a{animation:passo .8s steps(2) infinite}
|
|
131
|
+
.perna-b{animation:passo .8s steps(2) infinite .4s}
|
|
132
|
+
@keyframes passo{0%{transform:translateY(0)}50%{transform:translateY(-1px)}}
|
|
133
|
+
.olhos{transition:transform .18s ease-out}
|
|
134
|
+
.pisca{animation:pisca2 4.5s infinite;transform-origin:8px 3px;transform-box:view-box}
|
|
135
|
+
@keyframes pisca2{0%,92%,100%{transform:scaleY(1)}95%{transform:scaleY(.1)}}
|
|
136
|
+
.titulo-entra{animation:titulo 1s cubic-bezier(.2,1,.3,1) .15s both}
|
|
137
|
+
@keyframes titulo{0%{opacity:0;letter-spacing:.2em;filter:blur(12px)}100%{opacity:1;letter-spacing:-.01em;filter:none}}
|
|
138
|
+
.palavra{color:#22d3ee;font-style:italic;display:inline-block;min-width:1ch}
|
|
139
|
+
.cursor-t{display:inline-block;width:3px;height:.82em;margin-left:4px;vertical-align:-.04em;background:#22d3ee;animation:cur 1s steps(2) infinite}
|
|
140
|
+
@keyframes cur{50%{opacity:0}}
|
|
141
|
+
.sug-entra{animation:sugin .6s cubic-bezier(.3,1.4,.5,1) both}
|
|
142
|
+
@keyframes sugin{0%{opacity:0;transform:translateX(-28px)}100%{opacity:1;transform:none}}
|
|
143
|
+
.linha-luz{height:1px;background:linear-gradient(90deg,transparent,#22d3ee,transparent);animation:luz 3.2s ease-in-out infinite}
|
|
144
|
+
@keyframes luz{0%{transform:scaleX(0);opacity:0}40%{transform:scaleX(1);opacity:.8}100%{transform:scaleX(1);opacity:0}}
|
|
145
|
+
.msg{animation:entra .5s cubic-bezier(.3,1.4,.5,1) both}
|
|
146
|
+
@keyframes entra{0%{opacity:0;transform:translateY(14px)}100%{opacity:1;transform:none}}
|
|
147
|
+
.ponto{width:7px;height:7px;border-radius:50%;background:#22d3ee;animation:pula 1s ease-in-out infinite}
|
|
148
|
+
@keyframes pula{0%,100%{transform:translateY(0);opacity:.4}50%{transform:translateY(-6px);opacity:1}}
|
|
149
|
+
.tela-entra{animation:sobe .55s cubic-bezier(.3,1.4,.5,1) both}
|
|
150
|
+
@keyframes sobe{0%{opacity:0;transform:translateY(24px);filter:blur(6px)}100%{opacity:1;transform:none;filter:none}}
|
|
151
|
+
/* markdown do Primo */
|
|
152
|
+
.md{min-width:0;flex:1;padding-top:4px;color:#cfcec8;font-size:15px;line-height:1.6;overflow-wrap:anywhere}
|
|
153
|
+
.md>*:last-child{margin-bottom:0}
|
|
154
|
+
.md p{margin:0 0 .8em}
|
|
155
|
+
.md ul{margin:0 0 .8em;padding-left:1.3em}
|
|
156
|
+
.md li{margin:.15em 0}
|
|
157
|
+
.md code{font-family:'Geist Mono',monospace;font-size:.88em;background:#232321;border-radius:5px;padding:1px 5px;color:#ecebe6}
|
|
158
|
+
.md pre{margin:0 0 .8em;padding:12px 14px;background:#0f0f0e;border:1px solid #262624;border-radius:12px;overflow:auto}
|
|
159
|
+
.md pre code{background:none;padding:0;font-size:13px;line-height:1.55;white-space:pre}
|
|
160
|
+
.md strong{color:#ecebe6;font-weight:600}
|
|
161
|
+
.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}
|
|
162
|
+
.cartao-av.erro{color:#f08a7e;border-color:#4a2a26}
|
|
163
|
+
.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}
|
|
164
|
+
.cartao-av button.x:hover{background:#2e2e2b;color:#ecebe6}
|
|
165
|
+
.vazio-txt{color:#74736d;font-size:12.5px;padding:8px 10px}
|
|
166
|
+
|
|
167
|
+
/* markdown rico */
|
|
168
|
+
.md h3.hd,.md h4.hd,.md h5.hd{margin:1.1em 0 .45em;color:#ecebe6;font-weight:600;line-height:1.25}
|
|
169
|
+
.md .hd1{font:400 28px/1.15 'Instrument Serif',serif}
|
|
170
|
+
.md .hd2{font:400 23px/1.2 'Instrument Serif',serif}
|
|
171
|
+
.md .hd3{font-size:16px}
|
|
172
|
+
.md>.hd:first-child{margin-top:0}
|
|
173
|
+
.md em{font-style:italic;color:#e3e2dc}
|
|
174
|
+
.md del{color:#8a8983}
|
|
175
|
+
.md hr{border:0;height:1px;background:linear-gradient(90deg,transparent,#2e2e2b,transparent);margin:1.2em 0}
|
|
176
|
+
.md blockquote{margin:0 0 .8em;padding:2px 0 2px 14px;border-left:2px solid #22d3ee;color:#a3a29b}
|
|
177
|
+
.md blockquote p:last-child{margin-bottom:0}
|
|
178
|
+
.md ol{margin:0 0 .8em;padding-left:1.5em}
|
|
179
|
+
.md li>ul,.md li>ol{margin:.2em 0 .2em}
|
|
180
|
+
.md li::marker{color:#74736d}
|
|
181
|
+
.md li.task{list-style:none;margin-left:-1.3em;display:flex;gap:9px;align-items:flex-start}
|
|
182
|
+
.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}
|
|
183
|
+
.ckb.on{background:#22d3ee;border-color:#22d3ee}
|
|
184
|
+
.feito{color:#8a8983;text-decoration:line-through}
|
|
185
|
+
.tb{margin:0 0 .8em;overflow:auto;border:1px solid #262624;border-radius:12px}
|
|
186
|
+
.tb table{border-collapse:collapse;width:100%;font-size:13.5px}
|
|
187
|
+
.tb th,.tb td{padding:8px 12px;border-bottom:1px solid #262624;white-space:nowrap}
|
|
188
|
+
.tb th{background:#1c1c1a;color:#ecebe6;font-weight:600;font-size:12.5px}
|
|
189
|
+
.tb tr:last-child td{border-bottom:0}
|
|
190
|
+
.cb{margin:0 0 .8em;border:1px solid #262624;border-radius:12px;background:#0f0f0e;overflow:hidden}
|
|
191
|
+
.cb-h,.mc-ch{display:flex;align-items:center;gap:8px;padding:7px 8px 7px 14px;background:#161615;border-bottom:1px solid #262624}
|
|
192
|
+
.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}
|
|
193
|
+
.cb-h .cb-l{margin-right:auto}
|
|
194
|
+
.cb pre{margin:0;border:0;border-radius:0;background:none}
|
|
195
|
+
.tc{color:#74736d;font-style:italic}.ts{color:#7ad7a3}.tn{color:#e8b86d}.tk{color:#22d3ee}
|
|
196
|
+
.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)}
|
|
197
|
+
.chip-m:hover{background:rgba(34,211,238,.18);transform:translateY(-1px)}
|
|
198
|
+
.chip-m span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px}
|
|
199
|
+
.md code .chip-m{height:22px;font-family:Geist,system-ui,sans-serif}
|
|
200
|
+
/* cartões de mídia */
|
|
201
|
+
.mcs{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px;margin-top:12px}
|
|
202
|
+
.mcs-u{grid-template-columns:repeat(auto-fill,minmax(210px,1fr));margin-top:0;width:100%}
|
|
203
|
+
.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}
|
|
204
|
+
.mc:hover{border-color:#3d4a4c}
|
|
205
|
+
.mc.flash{border-color:#22d3ee;box-shadow:0 0 0 5px rgba(34,211,238,.14)}
|
|
206
|
+
.mc-wide{grid-column:1/-1}
|
|
207
|
+
.mc-media{position:relative;background:#0f0f0e;display:block}
|
|
208
|
+
.mc-media video{display:block;width:100%;max-height:360px;background:#000}
|
|
209
|
+
.mc-img{cursor:zoom-in}
|
|
210
|
+
.mc-img img{display:block;width:100%;max-height:320px;object-fit:cover;transition:transform .5s cubic-bezier(.3,1.2,.5,1)}
|
|
211
|
+
.mc-img:hover img{transform:scale(1.03)}
|
|
212
|
+
.mc-pdf iframe{display:block;width:100%;height:420px;border:0;background:#fff}
|
|
213
|
+
.mc-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px}
|
|
214
|
+
.mc-nm{flex:1 1 120px;min-width:0;font-size:13px;color:#cfcec8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
215
|
+
.mc-nm small{display:block;color:#8a8983;font-size:11.5px;margin-top:1px}
|
|
216
|
+
.mc-video .mc-nm{cursor:pointer}
|
|
217
|
+
.mc-bt{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto}
|
|
218
|
+
.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}
|
|
219
|
+
.mc-b:hover{border-color:#22d3ee;color:#ecebe6}
|
|
220
|
+
.mc-row{display:flex;align-items:center;gap:12px;padding:10px 12px}
|
|
221
|
+
.mc-ic{flex:none;width:32px;height:32px;border-radius:9px;background:#232321;display:grid;place-items:center;color:#22d3ee}
|
|
222
|
+
.mc-ch .mc-ic{width:auto;height:auto;background:none}
|
|
223
|
+
.mc-ch .mc-nm{flex:0 1 auto;font-size:12.5px}
|
|
224
|
+
.mc-ch .mc-bt{margin-left:auto}
|
|
225
|
+
.mc-au{display:flex;align-items:center;gap:12px;padding:12px 12px 8px}
|
|
226
|
+
.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}
|
|
227
|
+
.au-p:hover{transform:scale(1.08);background:#4a7de0}
|
|
228
|
+
.au-p .i-q{display:none}
|
|
229
|
+
.mc-au.tocando .i-p{display:none}.mc-au.tocando .i-q{display:block}
|
|
230
|
+
.au-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
|
|
231
|
+
.au-bar{height:5px;border-radius:3px;background:#2e2e2b;cursor:pointer;position:relative}
|
|
232
|
+
.au-bar::before{content:"";position:absolute;left:0;right:0;top:-7px;bottom:-7px}
|
|
233
|
+
.au-bar i{display:block;height:100%;width:0;border-radius:3px;background:#22d3ee}
|
|
234
|
+
.au-t{flex:none;font-size:11px;color:#8a8983}
|
|
235
|
+
.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}
|
|
236
|
+
.site-v{position:relative;aspect-ratio:16/10;overflow:hidden;background:#fff;cursor:pointer}
|
|
237
|
+
.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}
|
|
238
|
+
.cd{display:flex;overflow:auto;max-height:340px;background:#0f0f0e}
|
|
239
|
+
.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}
|
|
240
|
+
.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}
|
|
241
|
+
.cd pre code{background:none;padding:0;font-size:inherit;line-height:inherit;white-space:pre}
|
|
242
|
+
.cd-n{padding:6px 14px;border-top:1px solid #1f1f1d;font:400 11px 'Geist Mono',monospace;color:#74736d}
|
|
243
|
+
#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}
|
|
244
|
+
#lb[hidden]{display:none}
|
|
245
|
+
#lb img{max-width:92vw;max-height:88vh;border-radius:14px;box-shadow:0 30px 80px rgba(0,0,0,.6)}
|
|
246
|
+
/* linha do tempo dos passos */
|
|
247
|
+
.passos{position:relative;display:flex;flex-direction:column;gap:2px;padding-top:10px}
|
|
248
|
+
.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}
|
|
249
|
+
.ps::before{content:"";position:absolute;left:10px;top:25px;bottom:-5px;width:1px;background:#262624}
|
|
250
|
+
.ps:last-child::before{display:none}
|
|
251
|
+
.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}
|
|
252
|
+
.ps.atual{color:#cfcec8;animation:entra .35s cubic-bezier(.3,1.5,.5,1) both}
|
|
253
|
+
.ps.atual .pi{color:#22d3ee;border-color:rgba(34,211,238,.5);animation:pulsa-p 1.4s ease-in-out infinite}
|
|
254
|
+
@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)}}
|
|
255
|
+
.ps .pt{padding-top:2px}
|
|
256
|
+
.ps-mais{font:400 11px 'Geist Mono',monospace;color:#74736d;padding:0 0 4px 31px}
|
|
257
|
+
|
|
258
|
+
/* paleta de comandos */
|
|
259
|
+
.menu.pal{left:0;right:0;bottom:calc(100% + 8px);min-width:0;max-height:360px;overflow:auto;animation:none;padding:6px}
|
|
260
|
+
.menu.pal.novo{animation:abre .28s cubic-bezier(.3,1.5,.5,1) both}
|
|
261
|
+
.pal-r{gap:12px;padding:8px 12px}
|
|
262
|
+
.pal-r.sel{background:#232321;color:#ecebe6}
|
|
263
|
+
.pal-r .pn{flex:none;min-width:118px;font:500 13px 'Geist Mono',monospace;color:#ecebe6}
|
|
264
|
+
.pal-r .pn.t-app{color:#22d3ee}
|
|
265
|
+
.pal-r .pn.t-pedido{color:#f5b94a}
|
|
266
|
+
.pal-r .pd{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#a3a29b;font-size:13px}
|
|
267
|
+
.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}
|
|
268
|
+
.pal-dica{padding:6px 12px 4px;font:400 10.5px 'Geist Mono',monospace;color:#74736d;border-top:1px solid #262624;margin-top:4px}
|
|
269
|
+
.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}
|
|
270
|
+
.cmd-l svg{flex:none;color:#22d3ee}
|
|
271
|
+
.tsaida{border:1px solid #262624;border-radius:14px;background:#0b0b0a;overflow:hidden;max-width:100%}
|
|
272
|
+
.ts-h{display:flex;align-items:center;gap:9px;padding:7px 8px 7px 14px;background:#121211;border-bottom:1px solid #1f1f1d;color:#74736d}
|
|
273
|
+
.ts-h .mono{font-size:12px;color:#cfcec8;margin-right:auto}
|
|
274
|
+
.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}
|
|
275
|
+
.ts-b .to-ok{color:#7ad7a3}.ts-b .to-err{color:#f08a7e}
|
|
276
|
+
.ts-b .tp{color:#7fb7c0}.ts-b .tnum{color:#e8b86d}
|
|
277
|
+
.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}
|
|
278
|
+
.ts-mais:hover{color:#22d3ee}
|
|
279
|
+
.tsaida .chip-m{font-family:Geist,system-ui,sans-serif}
|
|
280
|
+
#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)}
|
|
281
|
+
#toast.show{opacity:1;transform:translate(-50%,0)}
|
|
282
|
+
|
|
283
|
+
/* esforço: cartão de vidro compacto com batentes */
|
|
284
|
+
.chip[hidden]{display:none}
|
|
285
|
+
.chip-ef{height:auto;padding:3px 8px;border-radius:6px;background:rgba(255,255,255,.10);color:#cfcec8;font-size:12.5px}
|
|
286
|
+
.chip-ef:hover,.chip-ef.on{background:rgba(255,255,255,.16);color:#ecebe6}
|
|
287
|
+
.chip-ef.ultra{color:#5aa2ff;box-shadow:inset 0 0 0 1px rgba(90,162,255,.28)}
|
|
288
|
+
.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)}
|
|
289
|
+
.ef-txt{font-size:13px;color:#a3a29b;line-height:1.5}
|
|
290
|
+
.ef-txt b{display:block;color:#ecebe6;font-weight:600;font-size:14px;margin-bottom:2px}
|
|
291
|
+
.efs{--p:0;--pad:13px;position:relative;outline:0;-webkit-user-select:none;user-select:none}
|
|
292
|
+
.grupo .efs{max-width:360px}
|
|
293
|
+
.efs-cab{display:flex;align-items:center;gap:6px;font-size:13px;color:#a3a29b}
|
|
294
|
+
.efs-nome{color:#ecebe6;font-weight:600;transition:color .3s}
|
|
295
|
+
.efs.ultra .efs-nome{color:#5aa2ff}
|
|
296
|
+
.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}
|
|
297
|
+
.efs-q:hover,.efs.ajuda .efs-q{color:#ecebe6;border-color:#ecebe6}
|
|
298
|
+
.efs-ajuda{display:none;margin:6px 0 0;font-size:11.5px;line-height:1.4;color:#a3a29b}
|
|
299
|
+
.efs.ajuda .efs-ajuda{display:block}
|
|
300
|
+
.efs-eixo{display:flex;justify-content:space-between;margin:9px 0 6px;font-size:11.5px;color:#8a8983}
|
|
301
|
+
.efs-trilha{position:relative;height:22px;border-radius:999px;background:rgba(255,255,255,.10);cursor:grab;touch-action:none}
|
|
302
|
+
.efs.drag .efs-trilha{cursor:grabbing}
|
|
303
|
+
.efs-px{position:absolute;left:0;top:0;width:100%;height:100%;border-radius:999px;pointer-events:none;opacity:0;transition:opacity .45s}
|
|
304
|
+
.efs.ultra .efs-px{opacity:1}
|
|
305
|
+
.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}
|
|
306
|
+
.efs-mk.rec{width:1.5px;height:8px;margin:-4px 0 0 -.75px;border-radius:1px}
|
|
307
|
+
.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}
|
|
308
|
+
@keyframes efbump{0%{transform:scale(1.25,.8)}55%{transform:scale(.95,1.07)}100%{transform:none}}
|
|
309
|
+
.efs.bump .efs-thumb{animation:efbump .45s cubic-bezier(.3,1.6,.5,1)}
|
|
310
|
+
.efs.ultra .efs-thumb{animation:efhalo 1.2s ease-in-out infinite}
|
|
311
|
+
.efs.ultra.bump .efs-thumb{animation:efhalo 1.2s ease-in-out infinite,efbump .45s cubic-bezier(.3,1.6,.5,1)}
|
|
312
|
+
@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)}}
|
|
313
|
+
.efs-rec{position:relative;height:14px;margin-top:5px}
|
|
314
|
+
.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}
|
|
315
|
+
@media (prefers-reduced-motion:reduce){.app *{animation:none !important;transition:none !important}}
|
|
316
|
+
</style>
|
|
317
|
+
</head>
|
|
318
|
+
<body>
|
|
319
|
+
<div class="app" id="app">
|
|
320
|
+
<aside id="lado">
|
|
321
|
+
<div id="nav"></div>
|
|
322
|
+
<div id="rotConv" style="display:flex;align-items:baseline;justify-content:space-between;padding:22px 10px 8px"></div>
|
|
323
|
+
<div id="lista"></div>
|
|
324
|
+
<div id="conta" style="display:flex;align-items:center;gap:10px;padding:12px 8px 4px;border-top:1px solid #1f1f1d"></div>
|
|
325
|
+
</aside>
|
|
326
|
+
|
|
327
|
+
<main id="main" style="position:relative;flex:1;min-width:0;display:flex;flex-direction:column;height:100vh">
|
|
328
|
+
<div class="solta" id="solta" hidden>
|
|
329
|
+
<div class="solta-caixa">
|
|
330
|
+
<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>
|
|
331
|
+
<div style="font-family:'Instrument Serif',serif;font-size:34px">Solta aqui</div>
|
|
332
|
+
<div style="color:#a3a29b;font-size:14px">imagem, vídeo, PDF, código, o que quiser</div>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
<div style="height:28px;flex:none"></div>
|
|
336
|
+
<header style="height:54px;flex:none;display:flex;align-items:center;padding:0 20px;border-bottom:1px solid #1f1f1d">
|
|
337
|
+
<span id="titulo" style="font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0"></span>
|
|
338
|
+
</header>
|
|
339
|
+
|
|
340
|
+
<section id="rolagem"></section>
|
|
341
|
+
|
|
342
|
+
<div style="width:100%;max-width:760px;margin:0 auto;padding:0 24px 22px;flex:none">
|
|
343
|
+
<div id="avisos"></div>
|
|
344
|
+
<div class="caixa" style="padding:14px 12px 10px 20px">
|
|
345
|
+
<div id="anexos"></div>
|
|
346
|
+
<label for="pergunta" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)">Mensagem para o Primo</label>
|
|
347
|
+
<textarea id="pergunta" class="entrada" rows="1" placeholder="Peça qualquer coisa pro Primo · / para comandos"></textarea>
|
|
348
|
+
<div id="menu"></div>
|
|
349
|
+
<div id="pal"></div>
|
|
350
|
+
<div style="display:flex;align-items:center;justify-content:space-between;margin-top:10px">
|
|
351
|
+
<div style="display:flex;align-items:center;gap:6px">
|
|
352
|
+
<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>
|
|
353
|
+
<button class="chip" id="chipModo" data-a="menuModo"></button>
|
|
354
|
+
<button class="chip" id="chipEf" data-a="menuEf" hidden></button>
|
|
355
|
+
</div>
|
|
356
|
+
<button class="enviar vazio" id="enviar" data-a="enviar" aria-label="Abrir a voz do Primo">
|
|
357
|
+
<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>
|
|
358
|
+
<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>
|
|
359
|
+
<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>
|
|
360
|
+
</button>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
</main>
|
|
365
|
+
</div>
|
|
366
|
+
|
|
367
|
+
<div id="lb" hidden><img alt=""></div>
|
|
368
|
+
<div id="toast" role="status"></div>
|
|
369
|
+
|
|
370
|
+
<script>
|
|
371
|
+
'use strict';
|
|
372
|
+
/* ---------- ponte ---------- */
|
|
373
|
+
function post(o){
|
|
374
|
+
try{
|
|
375
|
+
var s=JSON.stringify(o);
|
|
376
|
+
if(window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.chat) window.webkit.messageHandlers.chat.postMessage(s);
|
|
377
|
+
else if(window.__demo) window.__demo(o);
|
|
378
|
+
}catch(e){}
|
|
379
|
+
}
|
|
380
|
+
window.onerror=function(msg){post({acao:'erro',arg:String(msg)});};
|
|
381
|
+
|
|
382
|
+
/* ---------- utilidades ---------- */
|
|
383
|
+
function $(id){return document.getElementById(id);}
|
|
384
|
+
function esc(s){return String(s==null?'':s).replace(/[&<>"']/g,function(c){return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];});}
|
|
385
|
+
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>';}
|
|
386
|
+
function pad(n){return n<10?'0'+n:''+n;}
|
|
387
|
+
function ts(v){if(typeof v==='number')return v<1e12?v*1000:v;var n=Date.parse(v);return isNaN(n)?0:n;}
|
|
388
|
+
function fmtData(v){
|
|
389
|
+
if(v==null||v==='')return '';
|
|
390
|
+
var d;
|
|
391
|
+
if(typeof v==='number')d=new Date(v<1e12?v*1000:v);
|
|
392
|
+
else{var m=/^(\d{4})-(\d{2})-(\d{2})/.exec(v);if(m)return m[3]+'/'+m[2]+'/'+m[1];d=new Date(v);}
|
|
393
|
+
if(isNaN(d.getTime()))return String(v);
|
|
394
|
+
return pad(d.getDate())+'/'+pad(d.getMonth()+1)+'/'+d.getFullYear();
|
|
395
|
+
}
|
|
396
|
+
var REDUZ=false;
|
|
397
|
+
try{REDUZ=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;}catch(e){}
|
|
398
|
+
|
|
399
|
+
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>';
|
|
400
|
+
var ICO={
|
|
401
|
+
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>',
|
|
402
|
+
busca:'<circle cx="11" cy="11" r="7"></circle><path d="m20 20-3.5-3.5"></path>',
|
|
403
|
+
skills:'<path d="m12 2 9 5v10l-9 5-9-5V7Z"></path><path d="m3 7 9 5 9-5M12 12v10"></path>',
|
|
404
|
+
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>',
|
|
405
|
+
x:'<path d="M6 6l12 12M18 6 6 18"></path>',
|
|
406
|
+
chev:'<path d="m6 9 6 6 6-6"></path>',
|
|
407
|
+
chev2:'<path d="m7 9 5-5 5 5M7 15l5 5 5-5"></path>',
|
|
408
|
+
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>',
|
|
409
|
+
ok:'<path d="m5 12 5 5 9-10"></path>',
|
|
410
|
+
chave:'<circle cx="8" cy="15" r="4"></circle><path d="m10.8 12.2 9.2-9.2M17 6l3 3M14 9l2 2"></path>'
|
|
411
|
+
};
|
|
412
|
+
var ABAS=[
|
|
413
|
+
{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>'},
|
|
414
|
+
{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>'},
|
|
415
|
+
{id:'voz',t:'Voz',cor:'#f0597a',ico:'<path d="M5 10v4M9.5 7v10M14 4.5v15M18.5 8v8"></path>'},
|
|
416
|
+
{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>'}
|
|
417
|
+
];
|
|
418
|
+
var MODOS=[
|
|
419
|
+
{id:'chat',t:'Chat',d:'conversa e responde, sem mexer em nada'},
|
|
420
|
+
{id:'agent',t:'Agent',d:'mexe nos arquivos e roda os comandos'}
|
|
421
|
+
];
|
|
422
|
+
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'];
|
|
423
|
+
var PALAVRAS=['constrói','anima','edita','lança','desenha'];
|
|
424
|
+
var MAX_ARQ=25*1024*1024;
|
|
425
|
+
|
|
426
|
+
function mascoteSimples(tam,olho){
|
|
427
|
+
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>';
|
|
428
|
+
}
|
|
429
|
+
function mascoteHero(){
|
|
430
|
+
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>';
|
|
431
|
+
}
|
|
432
|
+
var LOGO_PRIMO='<span class="logo-ia" style="background:#0b1416;border:1px solid #1f3a3e">'+mascoteSimples(22,'#0b1416')+'</span>';
|
|
433
|
+
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>';
|
|
434
|
+
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>';
|
|
435
|
+
|
|
436
|
+
/* ---------- destaque de código (regex pequeno, sem biblioteca) ---------- */
|
|
437
|
+
var KW={};
|
|
438
|
+
('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;});
|
|
439
|
+
var RE_A=/(\/\*[\s\S]*?\*\/|\/\/[^\n]*|<!--[\s\S]*?-->)|("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\.|[^`\\])*`)|\b(\d+(?:\.\d+)?)\b|\b([A-Za-z_$][\w$]*)\b/g;
|
|
440
|
+
var RE_B=/(\/\*[\s\S]*?\*\/|#[^\n]*|<!--[\s\S]*?-->)|("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\.|[^`\\])*`)|\b(\d+(?:\.\d+)?)\b|\b([A-Za-z_$][\w$]*)\b/g;
|
|
441
|
+
var RE_C=/(\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)|("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\.|[^`\\])*`)|\b(\d+(?:\.\d+)?)\b|\b([A-Za-z_$][\w$]*)\b/g;
|
|
442
|
+
function hl(code,lang){
|
|
443
|
+
lang=String(lang||'').toLowerCase();
|
|
444
|
+
var hash=/^(py|python|sh|bash|zsh|shell|yaml|yml|toml|rb|ruby|r|conf|ini|env|pl|ps1)$/.test(lang);
|
|
445
|
+
var markup=/^(html|htm|xml|svg|vue|css|scss|less)$/.test(lang);
|
|
446
|
+
var css=/^(css|scss|less)$/.test(lang);
|
|
447
|
+
var src=(hash?RE_B:css||markup?RE_C:RE_A).source;
|
|
448
|
+
var re=new RegExp(src,'g'),out='',last=0,m;
|
|
449
|
+
code=String(code);
|
|
450
|
+
while((m=re.exec(code))){
|
|
451
|
+
if(m.index>last)out+=esc(code.slice(last,m.index));
|
|
452
|
+
var tx=esc(m[0]);
|
|
453
|
+
if(m[1]!==undefined)out+='<span class="tc">'+tx+'</span>';
|
|
454
|
+
else if(m[2]!==undefined)out+='<span class="ts">'+tx+'</span>';
|
|
455
|
+
else if(m[3]!==undefined)out+='<span class="tn">'+tx+'</span>';
|
|
456
|
+
else if(!markup&&KW[m[4]]===1)out+='<span class="tk">'+tx+'</span>';
|
|
457
|
+
else out+=tx;
|
|
458
|
+
last=re.lastIndex;
|
|
459
|
+
if(m[0].length===0)re.lastIndex++;
|
|
460
|
+
}
|
|
461
|
+
return out+esc(code.slice(last));
|
|
462
|
+
}
|
|
463
|
+
function extDe(nome){var m=/\.([A-Za-z0-9]+)$/.exec(nome||'');return m?m[1].toLowerCase():'';}
|
|
464
|
+
var EXT_TIPO={};
|
|
465
|
+
[['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];});});
|
|
466
|
+
function tipoDe(nome){return EXT_TIPO[extDe(nome)]||'arquivo';}
|
|
467
|
+
function fmtTam(b){
|
|
468
|
+
b=Number(b);if(!isFinite(b)||b<0)return '';
|
|
469
|
+
if(b<1024)return b+' B';
|
|
470
|
+
var u=['KB','MB','GB','TB'],i=-1;
|
|
471
|
+
do{b/=1024;i++;}while(b>=1024&&i<3);
|
|
472
|
+
return (b<10?b.toFixed(1):Math.round(b))+' '+u[i];
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/* ---------- markdown seguro: escapa primeiro, transforma depois ---------- */
|
|
476
|
+
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>';
|
|
477
|
+
function md(t){
|
|
478
|
+
var partes=String(t==null?'':t).split('```'),out='';
|
|
479
|
+
partes.forEach(function(p,i){
|
|
480
|
+
if(i%2===1){
|
|
481
|
+
var nl=p.indexOf('\n'),code=p,lang='';
|
|
482
|
+
if(nl>=0&&/^[\w+#.\-]*\s*$/.test(p.slice(0,nl))){lang=p.slice(0,nl).trim();code=p.slice(nl+1);}
|
|
483
|
+
code=code.replace(/\n$/,'');
|
|
484
|
+
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>';
|
|
485
|
+
}else out+=mdBlocos(p);
|
|
486
|
+
});
|
|
487
|
+
return out;
|
|
488
|
+
}
|
|
489
|
+
var RE_LI=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/;
|
|
490
|
+
var RE_SEP=/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/;
|
|
491
|
+
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();});}
|
|
492
|
+
function mdBlocos(p){
|
|
493
|
+
var L=p.split('\n'),h='',i=0,par=[],m;
|
|
494
|
+
function fechaP(){if(par.length){h+='<p>'+par.map(inline).join('<br>')+'</p>';par=[];}}
|
|
495
|
+
while(i<L.length){
|
|
496
|
+
var l=L[i];
|
|
497
|
+
if(!l.trim()){fechaP();i++;continue;}
|
|
498
|
+
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;}
|
|
499
|
+
if(/^\s*([-*_])(\s*\1){2,}\s*$/.test(l)){fechaP();h+='<hr>';i++;continue;}
|
|
500
|
+
if(/^\s*>/.test(l)){
|
|
501
|
+
fechaP();var q=[];
|
|
502
|
+
while(i<L.length&&/^\s*>/.test(L[i])){q.push(L[i].replace(/^\s*>\s?/,''));i++;}
|
|
503
|
+
h+='<blockquote>'+mdBlocos(q.join('\n'))+'</blockquote>';continue;
|
|
504
|
+
}
|
|
505
|
+
if(l.indexOf('|')>=0&&i+1<L.length&&RE_SEP.test(L[i+1])&&L[i+1].indexOf('-')>=0){
|
|
506
|
+
fechaP();
|
|
507
|
+
var cab=celulas(l),al=celulas(L[i+1]).map(function(c){return /^:-*:$/.test(c)?'center':/-:$/.test(c)?'right':'left';});
|
|
508
|
+
i+=2;var rows=[];
|
|
509
|
+
while(i<L.length&&L[i].trim()&&L[i].indexOf('|')>=0){rows.push(celulas(L[i]));i++;}
|
|
510
|
+
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>'+
|
|
511
|
+
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>';
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
if(RE_LI.test(l)){
|
|
515
|
+
fechaP();var its=[];
|
|
516
|
+
while(i<L.length){
|
|
517
|
+
var mm=RE_LI.exec(L[i]);
|
|
518
|
+
if(mm){its.push({ind:mm[1].replace(/\t/g,' ').length,ord:/\d/.test(mm[2].charAt(0)),txt:mm[3]});i++;}
|
|
519
|
+
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;}
|
|
520
|
+
else if(/^\s+\S/.test(L[i])&&its.length){its[its.length-1].txt+=' '+L[i].trim();i++;}
|
|
521
|
+
else break;
|
|
522
|
+
}
|
|
523
|
+
h+=listaHtml(its);continue;
|
|
524
|
+
}
|
|
525
|
+
par.push(l);i++;
|
|
526
|
+
}
|
|
527
|
+
fechaP();
|
|
528
|
+
return h;
|
|
529
|
+
}
|
|
530
|
+
function itemHtml(t){
|
|
531
|
+
var m=/^\[( |x|X)\]\s+(.*)$/.exec(t);
|
|
532
|
+
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>';}
|
|
533
|
+
return '<li>'+inline(t);
|
|
534
|
+
}
|
|
535
|
+
function listaHtml(its){
|
|
536
|
+
var h='',st=[];
|
|
537
|
+
its.forEach(function(it){
|
|
538
|
+
while(st.length&&it.ind<st[st.length-1].ind){h+='</li></'+(st.pop().ord?'ol':'ul')+'>';}
|
|
539
|
+
var top=st[st.length-1];
|
|
540
|
+
if(top&&it.ind===top.ind&&it.ord!==top.ord){h+='</li></'+(top.ord?'ol':'ul')+'>';st.pop();top=st[st.length-1];}
|
|
541
|
+
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});}
|
|
542
|
+
else h+='</li>';
|
|
543
|
+
h+=itemHtml(it.txt);
|
|
544
|
+
});
|
|
545
|
+
while(st.length)h+='</li></'+(st.pop().ord?'ol':'ul')+'>';
|
|
546
|
+
return h;
|
|
547
|
+
}
|
|
548
|
+
function inline(s){
|
|
549
|
+
return String(s).split(/(`[^`\n]+`)/).map(function(x,i){
|
|
550
|
+
if(i%2)return '<code>'+esc(x.slice(1,-1))+'</code>';
|
|
551
|
+
var e=esc(x);
|
|
552
|
+
e=e.replace(/\*\*([^*]+)\*\*/g,'<strong>$1</strong>');
|
|
553
|
+
e=e.replace(/~~([^~]+)~~/g,'<del>$1</del>');
|
|
554
|
+
e=e.replace(/(^|[^*\w])\*([^*\s][^*]*)\*(?!\*)/g,'$1<em>$2</em>');
|
|
555
|
+
e=e.replace(/\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/g,'<a href="#" data-a="link" data-url="$2">$1</a>');
|
|
556
|
+
return e;
|
|
557
|
+
}).join('');
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/* ---------- mídias: cartões visuais ---------- */
|
|
561
|
+
var REG={};
|
|
562
|
+
var ICM={
|
|
563
|
+
video:'<rect x="3" y="4" width="18" height="16" rx="3"></rect><path d="m10 9 5 3-5 3Z"></path>',
|
|
564
|
+
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>',
|
|
565
|
+
audio:'<path d="M5 10v4M9.5 7v10M14 4.5v15M18.5 8v8"></path>',
|
|
566
|
+
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>',
|
|
567
|
+
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>',
|
|
568
|
+
codigo:'<path d="m8 8-4 4 4 4M16 8l4 4-4 4M14 5l-4 14"></path>',
|
|
569
|
+
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>',
|
|
570
|
+
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>'
|
|
571
|
+
};
|
|
572
|
+
function icoM(t,s){return ic(ICM[t]||ICM.arquivo,s||16);}
|
|
573
|
+
function botoes(m,so){
|
|
574
|
+
var c=esc(m.caminho||'');
|
|
575
|
+
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>');
|
|
576
|
+
}
|
|
577
|
+
function nomeTam(m,play){
|
|
578
|
+
var nm=esc(m.nome||m.caminho||''),tam=m.tamanho!=null?fmtTam(m.tamanho):'';
|
|
579
|
+
return '<div class="mc-nm"'+(play?' data-a="play"':'')+' title="'+nm+'">'+nm+(tam?'<small>'+esc(tam)+'</small>':'')+'</div>';
|
|
580
|
+
}
|
|
581
|
+
function linhaM(m,id,d){
|
|
582
|
+
REG[id]=m;
|
|
583
|
+
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>';
|
|
584
|
+
}
|
|
585
|
+
function cartaoM(m,id,d){
|
|
586
|
+
if(!m||!(m.nome||m.caminho))return '';
|
|
587
|
+
var t=m.tipo,u=esc(m.url||''),nm=esc(m.nome||m.caminho||'');
|
|
588
|
+
if(!m.url&&t!=='codigo'&&t!=='pasta')return linhaM(m,id,d);
|
|
589
|
+
var base=function(c){return '<div class="mc mc-'+t+(c?' '+c:'')+'" id="'+id+'" style="animation-delay:'+d+'s">';};
|
|
590
|
+
var foot=function(play){return '<div class="mc-foot">'+nomeTam(m,play)+'<div class="mc-bt">'+botoes(m)+'</div></div>';};
|
|
591
|
+
REG[id]=m;
|
|
592
|
+
if(t==='video')return base('mc-wide')+'<div class="mc-media"><video controls playsinline preload="metadata" src="'+u+'"></video></div>'+foot(true)+'</div>';
|
|
593
|
+
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>';
|
|
594
|
+
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>';
|
|
595
|
+
if(t==='pdf')return base('mc-wide')+'<div class="mc-media mc-pdf"><iframe src="'+u+'" title="'+nm+'" loading="lazy"></iframe></div>'+foot()+'</div>';
|
|
596
|
+
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>';
|
|
597
|
+
if(t==='codigo'){
|
|
598
|
+
if(m.trecho==null||m.trecho==='')return linhaM(m,id,d);
|
|
599
|
+
var tr=String(m.trecho).replace(/\n+$/,''),n=tr.split('\n').length,g=[];
|
|
600
|
+
for(var i=1;i<=n;i++)g.push(i);
|
|
601
|
+
var lang=extDe(m.nome||m.caminho);
|
|
602
|
+
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>';
|
|
603
|
+
}
|
|
604
|
+
return linhaM(m,id,d);
|
|
605
|
+
}
|
|
606
|
+
function gradeM(ms,pre,user){
|
|
607
|
+
if(!ms||!ms.length)return '';
|
|
608
|
+
var h='';
|
|
609
|
+
ms.forEach(function(m,k){h+=cartaoM(m,pre+'-'+k,Math.min(0.08*k,0.8).toFixed(2)+'');});
|
|
610
|
+
return h?'<div class="mcs'+(user?' mcs-u':'')+'">'+h+'</div>':'';
|
|
611
|
+
}
|
|
612
|
+
function chipEl(m,id){
|
|
613
|
+
var s=document.createElement('span');
|
|
614
|
+
s.className='chip-m';s.setAttribute('data-a','irmidia');s.setAttribute('data-id',id);
|
|
615
|
+
s.innerHTML=icoM(m.tipo,13);
|
|
616
|
+
var n=document.createElement('span');n.textContent=m.nome||m.caminho||m.achado;s.appendChild(n);
|
|
617
|
+
return s;
|
|
618
|
+
}
|
|
619
|
+
function chipify(html,ms,pre){
|
|
620
|
+
if(!ms||!ms.length)return html;
|
|
621
|
+
var lista=[];
|
|
622
|
+
ms.forEach(function(m,k){if(m&&m.achado)lista.push({m:m,k:k});});
|
|
623
|
+
if(!lista.length)return html;
|
|
624
|
+
var tpl=document.createElement('template');tpl.innerHTML=html;
|
|
625
|
+
var w=document.createTreeWalker(tpl.content,NodeFilter.SHOW_TEXT),nos=[];
|
|
626
|
+
while(w.nextNode())nos.push(w.currentNode);
|
|
627
|
+
nos.forEach(function(n){
|
|
628
|
+
var pe=n.parentElement;
|
|
629
|
+
if(pe&&pe.closest('a,pre,.chip-m'))return;
|
|
630
|
+
var txt=n.nodeValue,frag=document.createDocumentFragment(),mudou=false;
|
|
631
|
+
while(txt){
|
|
632
|
+
var best=null,pos=-1;
|
|
633
|
+
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;}});
|
|
634
|
+
if(!best){frag.appendChild(document.createTextNode(txt));break;}
|
|
635
|
+
if(pos>0)frag.appendChild(document.createTextNode(txt.slice(0,pos)));
|
|
636
|
+
frag.appendChild(chipEl(best.m,pre+'-'+best.k));mudou=true;
|
|
637
|
+
txt=txt.slice(pos+best.m.achado.length);
|
|
638
|
+
}
|
|
639
|
+
if(!mudou)return;
|
|
640
|
+
if(pe&&pe.tagName==='CODE'&&frag.childNodes.length===1&&pe.childNodes.length===1)pe.parentNode.replaceChild(frag,pe);
|
|
641
|
+
else n.parentNode.replaceChild(frag,n);
|
|
642
|
+
});
|
|
643
|
+
return tpl.innerHTML;
|
|
644
|
+
}
|
|
645
|
+
function ajustaSites(){
|
|
646
|
+
Array.prototype.forEach.call(document.querySelectorAll('.site-v'),function(el){var w=el.clientWidth;if(w)el.style.setProperty('--s',(w/1280).toFixed(4));});
|
|
647
|
+
}
|
|
648
|
+
function copiarTexto(txt,btn){
|
|
649
|
+
function ok(){var o=btn.textContent;btn.textContent='Copiado';setTimeout(function(){btn.textContent=o==='Copiado'?'Copiar':o;},1400);}
|
|
650
|
+
function velho(){
|
|
651
|
+
var t=document.createElement('textarea');t.value=txt;t.style.cssText='position:fixed;opacity:0;top:0;left:0';
|
|
652
|
+
document.body.appendChild(t);t.select();try{document.execCommand('copy');ok();}catch(e){}
|
|
653
|
+
document.body.removeChild(t);
|
|
654
|
+
}
|
|
655
|
+
try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(txt).then(ok,velho);else velho();}catch(e){velho();}
|
|
656
|
+
}
|
|
657
|
+
function tempo(s){if(!isFinite(s))s=0;s=Math.floor(s);return Math.floor(s/60)+':'+pad(s%60);}
|
|
658
|
+
|
|
659
|
+
/* ---------- estado ---------- */
|
|
660
|
+
var estado={
|
|
661
|
+
logado:false,email:'',plano:'',planoAte:'',pasta:'',modo:'agent',
|
|
662
|
+
tela:'chat',aba:'modelos',
|
|
663
|
+
conversas:null,conversasErro:'',convId:null,titulo:'',mensagens:[],animarDe:0,
|
|
664
|
+
esperando:false,ignorando:false,passos:[],erro:'',
|
|
665
|
+
anexos:[],menu:false,aviso:null,
|
|
666
|
+
skills:null,ajustes:null,busca:'',
|
|
667
|
+
comandos:[],pal:{aberta:false,itens:[],sel:0,q:null},abertas:{},confirma:null,provSel:'',chaveDraft:'',chaveSalva:false
|
|
668
|
+
};
|
|
669
|
+
var animar=false;
|
|
670
|
+
var mx=0,my=0;
|
|
671
|
+
|
|
672
|
+
/* ---------- lateral ---------- */
|
|
673
|
+
function renderNav(){
|
|
674
|
+
function b(a,i,t,on){return '<button class="navbtn'+(on?' on':'')+'" data-a="'+a+'">'+ic(ICO[i],16)+t+'</button>';}
|
|
675
|
+
$('nav').innerHTML=b('nova','nova','Nova conversa',false)+b('buscar','busca','Buscar',estado.tela==='buscar')+b('skills','skills','Skills',estado.tela==='skills');
|
|
676
|
+
}
|
|
677
|
+
function renderLista(){
|
|
678
|
+
var h='',c=estado.conversas;
|
|
679
|
+
if(Array.isArray(c)){
|
|
680
|
+
if(!c.length)h+='<div class="vazio-txt">Nenhuma conversa ainda.</div>';
|
|
681
|
+
c.forEach(function(x){
|
|
682
|
+
var on=estado.convId!=null&&String(estado.convId)===String(x.id)&&estado.tela==='chat';
|
|
683
|
+
var cf=estado.confirma!==null&&String(estado.confirma)===String(x.id);
|
|
684
|
+
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>';
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
if(estado.conversasErro)h+='<div class="vazio-txt">'+esc(estado.conversasErro)+'</div>';
|
|
688
|
+
$('lista').innerHTML=h;
|
|
689
|
+
$('rotConv').innerHTML='<span class="mono" style="font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:#8a8983">Conversas</span>'+'';
|
|
690
|
+
}
|
|
691
|
+
function removeConversa(id){
|
|
692
|
+
estado.conversas=(estado.conversas||[]).filter(function(x){return String(x.id)!==String(id);});
|
|
693
|
+
if(estado.convId!=null&&String(estado.convId)===String(id))novaConversa();
|
|
694
|
+
}
|
|
695
|
+
function renderConta(){
|
|
696
|
+
var h;
|
|
697
|
+
if(estado.logado){
|
|
698
|
+
var ini=(String(estado.email||'?').trim().charAt(0)||'?').toUpperCase();
|
|
699
|
+
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>';
|
|
700
|
+
}else h='<button class="entrar" data-a="entrar">Entrar</button><span style="flex:1"></span>';
|
|
701
|
+
h+='<button class="ico-cfg" data-a="cfg" aria-label="Ajustes">'+ic(GEAR,16)+'</button>';
|
|
702
|
+
$('conta').innerHTML=h;
|
|
703
|
+
}
|
|
704
|
+
function renderLado(){renderNav();renderLista();renderConta();}
|
|
705
|
+
|
|
706
|
+
/* ---------- principal ---------- */
|
|
707
|
+
function tituloTopo(){
|
|
708
|
+
var t=estado.tela;
|
|
709
|
+
if(t==='config')return 'Ajustes';
|
|
710
|
+
if(t==='buscar')return 'Buscar';
|
|
711
|
+
if(t==='skills')return 'Skills';
|
|
712
|
+
if(estado.titulo)return estado.titulo;
|
|
713
|
+
for(var i=0;i<estado.mensagens.length;i++)if(estado.mensagens[i].papel==='voce')return estado.mensagens[i].texto;
|
|
714
|
+
return 'Nova conversa';
|
|
715
|
+
}
|
|
716
|
+
function renderPrincipal(){
|
|
717
|
+
var anim=animar;animar=false;
|
|
718
|
+
$('titulo').textContent=tituloTopo();
|
|
719
|
+
var r=$('rolagem');
|
|
720
|
+
if(estado.tela==='buscar')r.innerHTML=htmlBuscar(anim),renderResultados();
|
|
721
|
+
else if(estado.tela==='skills')r.innerHTML=htmlSkills(anim);
|
|
722
|
+
else if(estado.tela==='config')r.innerHTML=htmlConfig(anim);
|
|
723
|
+
else if(estado.mensagens.length){r.innerHTML=htmlConversa();renderMsgs();renderEspera();}
|
|
724
|
+
else{r.innerHTML=htmlVazio();aplicaMouse();palavraAtual();}
|
|
725
|
+
if(estado.tela==='chat'&&estado.mensagens.length)rolaFim();
|
|
726
|
+
else r.scrollTop=0;
|
|
727
|
+
if(estado.tela==='config'&&estado.irPerm){var gp=$('grpPerm');if(gp){gp.scrollIntoView({block:'center'});estado.irPerm=false;}}
|
|
728
|
+
efAplica();
|
|
729
|
+
}
|
|
730
|
+
function navegar(tela){
|
|
731
|
+
estado.tela=tela;estado.menu=false;animar=true;
|
|
732
|
+
renderNav();renderLista();renderMenu();renderPrincipal();
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/* vazio */
|
|
736
|
+
function htmlVazio(){
|
|
737
|
+
var s='';
|
|
738
|
+
SUGESTOES.forEach(function(x,i){
|
|
739
|
+
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>';
|
|
740
|
+
});
|
|
741
|
+
return '<div style="width:100%;max-width:680px;margin:auto;display:flex;flex-direction:column;align-items:center;gap:22px">'+
|
|
742
|
+
'<div class="pula-entra"><div class="mascote" id="mascote">'+mascoteHero()+'</div></div>'+
|
|
743
|
+
'<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>'+
|
|
744
|
+
'<div class="linha-luz" style="width:220px"></div>'+
|
|
745
|
+
'<div style="width:100%;max-width:520px;margin-top:4px;border-top:1px solid #232321">'+s+'</div></div>';
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/* conversa */
|
|
749
|
+
function htmlConversa(){
|
|
750
|
+
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>';
|
|
751
|
+
}
|
|
752
|
+
function avatarPrimo(){
|
|
753
|
+
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>';
|
|
754
|
+
}
|
|
755
|
+
function renderMsgs(){
|
|
756
|
+
var el=$('msgs');if(!el)return;
|
|
757
|
+
REG={};
|
|
758
|
+
var h='';
|
|
759
|
+
estado.mensagens.forEach(function(m,i){
|
|
760
|
+
var cls=i>=estado.animarDe?'msg':'',ms=m.midias||[],pre='m'+i;
|
|
761
|
+
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;}
|
|
762
|
+
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;}
|
|
763
|
+
if(m.papel==='voce'){
|
|
764
|
+
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>':'';
|
|
765
|
+
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>';
|
|
766
|
+
}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>';
|
|
767
|
+
});
|
|
768
|
+
estado.animarDe=estado.mensagens.length;
|
|
769
|
+
el.innerHTML=h;
|
|
770
|
+
ajustaSites();
|
|
771
|
+
requestAnimationFrame(ajustaSites);
|
|
772
|
+
}
|
|
773
|
+
function renderEspera(){
|
|
774
|
+
var el=$('espera');if(!el)return;
|
|
775
|
+
if(estado.esperando){
|
|
776
|
+
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>';
|
|
777
|
+
renderPassos();
|
|
778
|
+
}else if(estado.erro){
|
|
779
|
+
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>';
|
|
780
|
+
}else el.innerHTML='';
|
|
781
|
+
}
|
|
782
|
+
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>']];
|
|
783
|
+
function icoPasso(txt){
|
|
784
|
+
var w=String(txt).trim().toLowerCase().replace(/[^a-zà-ú].*$/,'').slice(0,12);
|
|
785
|
+
for(var i=0;i<VERBOS.length;i++)if(w.indexOf(VERBOS[i][0])===0)return VERBOS[i][1];
|
|
786
|
+
return '<circle cx="12" cy="12" r="2.5"></circle>';
|
|
787
|
+
}
|
|
788
|
+
function renderPassos(){
|
|
789
|
+
var el=$('passos');if(!el)return;
|
|
790
|
+
var ps=estado.passos,n=ps.length,ini=Math.max(0,n-6),h='';
|
|
791
|
+
if(ini>0)h+='<div class="ps-mais">+'+ini+' antes</div>';
|
|
792
|
+
for(var i=ini;i<n;i++){
|
|
793
|
+
var atual=i===n-1;
|
|
794
|
+
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>';
|
|
795
|
+
}
|
|
796
|
+
el.innerHTML=h;
|
|
797
|
+
}
|
|
798
|
+
function rolaFim(){var r=$('rolagem');r.scrollTop=r.scrollHeight;}
|
|
799
|
+
function pertoDoFim(){var r=$('rolagem');return r.scrollHeight-r.scrollTop-r.clientHeight<140;}
|
|
800
|
+
|
|
801
|
+
/* buscar */
|
|
802
|
+
function htmlBuscar(anim){
|
|
803
|
+
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">'+
|
|
804
|
+
'<h2 style="margin:0;font-family:\'Instrument Serif\',serif;font-weight:400;font-size:40px">Buscar</h2>'+
|
|
805
|
+
'<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>'+
|
|
806
|
+
'<label for="busca" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)">Buscar nas conversas</label>'+
|
|
807
|
+
'<input id="busca" class="busca" placeholder="Buscar nas conversas" autocomplete="off" value="'+esc(estado.busca)+'"></div>'+
|
|
808
|
+
'<span class="mono" id="buscaN" style="font-size:11px;color:#8a8983"></span><div id="resultados"></div></div>';
|
|
809
|
+
}
|
|
810
|
+
function renderResultados(){
|
|
811
|
+
var el=$('resultados');if(!el)return;
|
|
812
|
+
var n=$('buscaN');
|
|
813
|
+
if(!Array.isArray(estado.conversas)){
|
|
814
|
+
if(n)n.textContent=estado.conversasErro||'Carregando as conversas.';
|
|
815
|
+
el.innerHTML='';return;
|
|
816
|
+
}
|
|
817
|
+
var q=estado.busca.toLowerCase().trim();
|
|
818
|
+
var rs=estado.conversas.filter(function(c){return !q||String(c.titulo||'').toLowerCase().indexOf(q)>=0;});
|
|
819
|
+
if(n)n.textContent=rs.length+(rs.length===1?' conversa':' conversas');
|
|
820
|
+
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('');
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/* skills */
|
|
824
|
+
function htmlSkills(anim){
|
|
825
|
+
var l=estado.skills,corpo='',resumo='';
|
|
826
|
+
if(!Array.isArray(l))resumo='Carregando as skills.';
|
|
827
|
+
else{
|
|
828
|
+
var on=l.filter(function(k){return k.ligada;}).length;
|
|
829
|
+
resumo=on+' de '+l.length+' ligadas. O Primo usa as ligadas quando o pedido combina.';
|
|
830
|
+
if(!l.length)corpo='<div class="vazio-txt" style="padding:16px 4px">Nenhuma skill instalada.</div>';
|
|
831
|
+
l.forEach(function(k,i){
|
|
832
|
+
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>';
|
|
833
|
+
});
|
|
834
|
+
}
|
|
835
|
+
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>';
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
/* ajustes */
|
|
839
|
+
function tg(a,on,rot,extra){return '<button class="tg'+(on?' on':'')+'" data-a="'+a+'" aria-label="'+esc(rot)+'"'+(extra||'')+'></button>';}
|
|
840
|
+
function htmlConfig(anim){
|
|
841
|
+
var abas=ABAS.map(function(a){
|
|
842
|
+
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>';
|
|
843
|
+
}).join('');
|
|
844
|
+
var corpo={geral:cfgGeral,modelos:cfgModelos,voz:cfgVoz,conta:cfgConta}[estado.aba]();
|
|
845
|
+
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">'+
|
|
846
|
+
'<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>'+
|
|
847
|
+
'<div style="flex:999 1 440px;min-width:0">'+corpo+'</div></div>';
|
|
848
|
+
}
|
|
849
|
+
function h3(t){return '<h3 style="margin:0;font-size:22px;font-weight:600">'+t+'</h3>';}
|
|
850
|
+
function cfgGeral(){
|
|
851
|
+
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>'+
|
|
852
|
+
'<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>';
|
|
853
|
+
}
|
|
854
|
+
function cfgModelos(){
|
|
855
|
+
var A=estado.ajustes;
|
|
856
|
+
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>';
|
|
857
|
+
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>';
|
|
858
|
+
if(!A)return h+'<p style="color:#8a8983;font-size:13px;margin:16px 4px">Carregando os ajustes.</p>';
|
|
859
|
+
h+=cfgEffort(A)+cfgPerm(A);
|
|
860
|
+
var ativo=A.provedor&&A.provedor.id?A.provedor.id:'primo';
|
|
861
|
+
function prov(id,logo,nome,sub){
|
|
862
|
+
var uso=ativo===id;
|
|
863
|
+
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>';
|
|
864
|
+
}
|
|
865
|
+
h+='<div style="margin:18px 0 0 4px" class="rotulo">Quem responde</div><div class="grupo" style="margin-top:8px">'+
|
|
866
|
+
prov('primo',LOGO_PRIMO,'Primo','o servidor do PrimoCode, no seu plano')+
|
|
867
|
+
prov('claude-code',LOGO_CLAUDE,'Claude Code','sua assinatura do Claude, sem chave')+
|
|
868
|
+
prov('codex',LOGO_OPENAI,'Codex','sua assinatura do ChatGPT, sem chave')+'</div>';
|
|
869
|
+
var ps=A.provedores_chave||[];
|
|
870
|
+
if(ps.length){
|
|
871
|
+
var ehChave=['primo','claude-code','codex'].indexOf(ativo)<0;
|
|
872
|
+
var sel=estado.provSel||(ehChave?ativo:ps[0].id);
|
|
873
|
+
if(!ps.some(function(p){return p.id===sel;}))sel=ps[0].id;
|
|
874
|
+
var masc=(ehChave&&sel===ativo&&A.provedor.chave_mascarada)?A.provedor.chave_mascarada:'';
|
|
875
|
+
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>'+
|
|
876
|
+
'<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>'+
|
|
877
|
+
'<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>';
|
|
878
|
+
}
|
|
879
|
+
return h;
|
|
880
|
+
}
|
|
881
|
+
function cfgVoz(){
|
|
882
|
+
var A=estado.ajustes;
|
|
883
|
+
if(!A||!A.voz)return h3('Voz')+'<p style="color:#8a8983;font-size:13px;margin:16px 4px">Carregando os ajustes.</p>';
|
|
884
|
+
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>'+
|
|
885
|
+
'<div class="lin"><span>Sons</span>'+tg('sons',!!A.voz.sons,'Sons')+'</div></div>';
|
|
886
|
+
}
|
|
887
|
+
function cfgConta(){
|
|
888
|
+
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>';
|
|
889
|
+
var ini=(String(estado.email||'?').trim().charAt(0)||'?').toUpperCase();
|
|
890
|
+
var sm='';
|
|
891
|
+
if(estado.plano)sm+='<small>Plano '+esc(estado.plano)+'</small>';
|
|
892
|
+
if(estado.planoAte)sm+='<small>válido até '+esc(fmtData(estado.planoAte))+'</small>';
|
|
893
|
+
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>'+
|
|
894
|
+
'<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>';
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/* ---------- composer ---------- */
|
|
898
|
+
function ta(){return $('pergunta');}
|
|
899
|
+
function renderAnexos(){
|
|
900
|
+
$('anexos').innerHTML=estado.anexos.length?'<div style="display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px">'+estado.anexos.map(function(x,i){
|
|
901
|
+
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>';
|
|
902
|
+
}).join('')+'</div>':'';
|
|
903
|
+
atualizaBotao();
|
|
904
|
+
}
|
|
905
|
+
var GAUGE='<path d="M4 17a8 8 0 1 1 16 0"></path><path d="m12 17 4-5"></path>';
|
|
906
|
+
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;}):[];}
|
|
907
|
+
function renderMenu(){
|
|
908
|
+
var chip=$('chipModo'),ce=$('chipEf');
|
|
909
|
+
var atual=MODOS.filter(function(o){return o.id===estado.modo;})[0]||MODOS[0];
|
|
910
|
+
chip.className='chip'+(estado.menu==='modo'||estado.menu===true?' on':'');
|
|
911
|
+
chip.innerHTML=ic(ICO.sol,13)+esc(atual.t)+ic(ICO.chev,12,2.2);
|
|
912
|
+
var ef=estado.ajustes&&estado.ajustes.effort;
|
|
913
|
+
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);}
|
|
914
|
+
else ce.hidden=true;
|
|
915
|
+
if(!estado.menu){$('menu').innerHTML='';return;}
|
|
916
|
+
if(estado.menu==='ef'){
|
|
917
|
+
if(!ef){$('menu').innerHTML='';return;}
|
|
918
|
+
var ex=$('menu').firstChild;
|
|
919
|
+
if(ex&&ex.querySelector&&ex.querySelector('.efs')){efAplica();return;}
|
|
920
|
+
var lf=Math.max(0,Math.min(ce.offsetLeft,$('menu').parentNode.clientWidth-268));
|
|
921
|
+
$('menu').innerHTML='<div class="menu efs-pop" style="left:'+lf+'px">'+efSlider()+'</div>';
|
|
922
|
+
efAplica();
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
$('menu').innerHTML='<div class="menu"><div class="rotulo" style="padding:8px 12px 6px">Modo</div>'+
|
|
926
|
+
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('')+
|
|
927
|
+
'<div style="height:1px;background:#2e2e2b;margin:6px 8px"></div>'+
|
|
928
|
+
'<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>';
|
|
929
|
+
}
|
|
930
|
+
var EF_NOME={low:'Baixo',medium:'Médio',high:'Alto',xhigh:'Extra alto',max:'Máximo',ultracode:'Ultracode'};
|
|
931
|
+
function efNome(id){return EF_NOME[id]||id;}
|
|
932
|
+
var EF_PAD=13;
|
|
933
|
+
var efDrag=null,efSolto=0,efRaf=0,efCtx=null,efSomT=0,efPxRaf=0;
|
|
934
|
+
function setEffort(nome){
|
|
935
|
+
var ef=estado.ajustes&&estado.ajustes.effort;
|
|
936
|
+
if(ef&&ef.atual===nome){efAplica();return;}
|
|
937
|
+
if(ef)ef.atual=nome;
|
|
938
|
+
post({acao:'ajuste',chave:'effort',valor:nome});
|
|
939
|
+
renderMenu();efAplica();
|
|
940
|
+
}
|
|
941
|
+
function setPerm(nome){
|
|
942
|
+
var p=estado.ajustes&&estado.ajustes.permissoes;
|
|
943
|
+
if(p)p.atual=nome;
|
|
944
|
+
post({acao:'ajuste',chave:'permissoes',valor:nome});
|
|
945
|
+
if(estado.tela==='config')renderPrincipal();
|
|
946
|
+
}
|
|
947
|
+
/* som mecânico: rajada de ruído filtrado + um blip de tom */
|
|
948
|
+
function efAudio(){
|
|
949
|
+
if(efCtx)return efCtx;
|
|
950
|
+
try{var C=window.AudioContext||window.webkitAudioContext;if(C)efCtx=new C();}catch(e){}
|
|
951
|
+
return efCtx;
|
|
952
|
+
}
|
|
953
|
+
function efSom(j,n){
|
|
954
|
+
var c=efCtx;if(!c)return;
|
|
955
|
+
try{
|
|
956
|
+
if(c.state==='suspended')c.resume();
|
|
957
|
+
var agora=Date.now();if(agora-efSomT<30)return;efSomT=agora;
|
|
958
|
+
var t=c.currentTime,f=n>1?j/(n-1):0,ult=n>1&&j===n-1;
|
|
959
|
+
var dur=ult?0.1:0.035,len=Math.ceil(c.sampleRate*dur),buf=c.createBuffer(1,len,c.sampleRate),d=buf.getChannelData(0);
|
|
960
|
+
for(var i=0;i<len;i++)d[i]=(Math.random()*2-1)*Math.pow(1-i/len,3);
|
|
961
|
+
var src=c.createBufferSource();src.buffer=buf;
|
|
962
|
+
var bp=c.createBiquadFilter();bp.type='bandpass';bp.frequency.value=ult?650:2200+f*2600;bp.Q.value=ult?1.1:4;
|
|
963
|
+
var g=c.createGain();g.gain.value=ult?0.3:0.15;
|
|
964
|
+
src.connect(bp);bp.connect(g);g.connect(c.destination);src.start(t);
|
|
965
|
+
var o=c.createOscillator(),og=c.createGain(),f0=ult?85:520+f*700;
|
|
966
|
+
o.type=ult?'sine':'triangle';
|
|
967
|
+
o.frequency.setValueAtTime(f0*(ult?1.7:1.15),t);
|
|
968
|
+
o.frequency.exponentialRampToValueAtTime(f0,t+0.03);
|
|
969
|
+
og.gain.setValueAtTime(ult?0.24:0.05,t);
|
|
970
|
+
og.gain.exponentialRampToValueAtTime(0.0001,t+(ult?0.22:0.05));
|
|
971
|
+
o.connect(og);og.connect(c.destination);o.start(t);o.stop(t+(ult?0.24:0.07));
|
|
972
|
+
}catch(e){}
|
|
973
|
+
}
|
|
974
|
+
/* mola: 'free' segue o ponteiro com atraso; 'snap' encaixa com overshoot */
|
|
975
|
+
function efSpring(s,alvo,modo){
|
|
976
|
+
s._t=alvo;s._modo=modo;
|
|
977
|
+
if(s._x==null||REDUZ){
|
|
978
|
+
s._x=alvo;s._v=0;s._anim=false;
|
|
979
|
+
var ns=efNiveis();if(ns.length)efVisual(s,alvo,ns);
|
|
980
|
+
return;
|
|
981
|
+
}
|
|
982
|
+
s._v=s._v||0;s._anim=true;
|
|
983
|
+
if(!efRaf)efRaf=requestAnimationFrame(efQuadro);
|
|
984
|
+
}
|
|
985
|
+
function efQuadro(){
|
|
986
|
+
efRaf=0;
|
|
987
|
+
var ns=efNiveis(),vivo=false;
|
|
988
|
+
Array.prototype.forEach.call(document.querySelectorAll('.efs'),function(s){
|
|
989
|
+
if(!s._anim)return;
|
|
990
|
+
var snap=s._modo==='snap',k=snap?0.34:0.2,d=snap?0.7:0.62;
|
|
991
|
+
s._v=(s._v+(s._t-s._x)*k)*d;
|
|
992
|
+
s._x=Math.max(-0.04,Math.min(1.04,s._x+s._v));
|
|
993
|
+
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;}
|
|
994
|
+
if(ns.length)efVisual(s,s._x,ns);
|
|
995
|
+
if(s._anim)vivo=true;
|
|
996
|
+
});
|
|
997
|
+
if(vivo)efRaf=requestAnimationFrame(efQuadro);
|
|
998
|
+
}
|
|
999
|
+
/* matriz de pixels (ultracode): azul elétrico, onda varrendo, deriva rumo ao botão, brilho e explosão na entrada */
|
|
1000
|
+
function efHash(a,b){var x=Math.sin(a*12.9898+b*78.233)*43758.5453;return x-Math.floor(x);}
|
|
1001
|
+
function efCor(b,sp){
|
|
1002
|
+
var a,c,f;
|
|
1003
|
+
if(sp)return [214,236,255];
|
|
1004
|
+
if(b<0.5){a=[30,107,255];c=[61,139,255];f=b/0.5;}
|
|
1005
|
+
else{a=[61,139,255];c=[124,196,255];f=(Math.min(1,b)-0.5)/0.5;}
|
|
1006
|
+
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)];
|
|
1007
|
+
}
|
|
1008
|
+
function efDesenha(s,agora){
|
|
1009
|
+
var cv=s.querySelector('.efs-px');if(!cv)return;
|
|
1010
|
+
var W=cv.clientWidth,H=cv.clientHeight;if(!W||!H)return;
|
|
1011
|
+
var dpr=window.devicePixelRatio||1;
|
|
1012
|
+
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);}
|
|
1013
|
+
var g=cv.getContext('2d');g.setTransform(dpr,0,0,dpr,0,0);g.clearRect(0,0,W,H);
|
|
1014
|
+
var ns=efNiveis(),n=ns.length;if(n<2)return;
|
|
1015
|
+
var xs=0,xk=EF_PAD+Math.max(0,Math.min(1,s._x==null?1:s._x))*(W-EF_PAD*2);
|
|
1016
|
+
if(xk<=xs+3)return;
|
|
1017
|
+
var P=4,rows=Math.floor((H+2)/P),offY=(H-(rows*P-2))/2,cols=Math.ceil(W/P)+1;
|
|
1018
|
+
var t=REDUZ?0:agora/1000,desl=REDUZ?0:t*7,base=Math.floor(desl),frac=(desl-base)*P;
|
|
1019
|
+
var wp=xs+(((t*0.6)%1.5)-0.25)*(xk-xs);
|
|
1020
|
+
var tb=(!REDUZ&&s._burst)?(agora-s._burst)/1000:9,flash=Math.max(0,1-tb/0.5),r=tb*190;
|
|
1021
|
+
for(var i=0;i<cols;i++){
|
|
1022
|
+
var cx=i*P+frac+1;if(cx<xs||cx>xk+4)continue;
|
|
1023
|
+
var w=Math.max(0,Math.min(1,(cx-xs)/(xk-xs)));w=Math.pow(w,1.2);
|
|
1024
|
+
var ii=i-base;
|
|
1025
|
+
for(var j=0;j<rows;j++){
|
|
1026
|
+
var h1=efHash(ii,j);
|
|
1027
|
+
if(h1>0.3+0.7*w+flash)continue;
|
|
1028
|
+
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);
|
|
1029
|
+
var boost=REDUZ?0:Math.exp(-Math.pow((cx-wp)/13,2))*0.95;
|
|
1030
|
+
var rip=(tb<0.9)?Math.exp(-Math.pow((Math.abs(xk-cx)-r)/9,2))*Math.max(0,1-tb/0.9):0;
|
|
1031
|
+
var b=Math.min(1,(0.3+0.7*w)*(0.3+0.7*sh)+boost+rip+flash*0.8);
|
|
1032
|
+
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;
|
|
1033
|
+
var c=efCor(b,sp);
|
|
1034
|
+
g.fillStyle='rgba('+c[0]+','+c[1]+','+c[2]+','+(0.28+0.72*b).toFixed(3)+')';
|
|
1035
|
+
g.fillRect(Math.round((cx-1)*dpr)/dpr,Math.round((offY+j*P)*dpr)/dpr,2,2);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
function efPxQuadro(agora){
|
|
1040
|
+
efPxRaf=0;
|
|
1041
|
+
var alguem=false;
|
|
1042
|
+
Array.prototype.forEach.call(document.querySelectorAll('.efs'),function(s){
|
|
1043
|
+
if(!s._pxOn)return;
|
|
1044
|
+
efDesenha(s,agora);alguem=true;
|
|
1045
|
+
});
|
|
1046
|
+
if(alguem&&!REDUZ)efPxRaf=requestAnimationFrame(efPxQuadro);
|
|
1047
|
+
}
|
|
1048
|
+
function efPxStart(){if(!efPxRaf)efPxRaf=requestAnimationFrame(efPxQuadro);}
|
|
1049
|
+
function efVisual(s,p,ns){
|
|
1050
|
+
var n=ns.length,pc=Math.max(0,Math.min(1,p));
|
|
1051
|
+
var i=s._lock!=null?s._lock:Math.max(0,Math.min(n-1,Math.round(pc*(n-1))));
|
|
1052
|
+
var x=ns[i]||{nome:''},ult=n>1&&i===n-1;
|
|
1053
|
+
s.style.setProperty('--p',p.toFixed(4));
|
|
1054
|
+
s.classList.toggle('ultra',ult);
|
|
1055
|
+
var a=s.querySelector('.efs-nome'),nm=efNome(x.nome);
|
|
1056
|
+
if(a&&a.textContent!==nm)a.textContent=nm;
|
|
1057
|
+
s.setAttribute('aria-valuenow',i);s.setAttribute('aria-valuetext',nm);
|
|
1058
|
+
if(ult&&!s._ult)s._burst=performance.now();
|
|
1059
|
+
s._ult=ult;
|
|
1060
|
+
if(ult){
|
|
1061
|
+
clearTimeout(s._pxOff);s._pxOff=0;s._pxOn=true;efPxStart();
|
|
1062
|
+
}else if(s._pxOn&&!s._pxOff){
|
|
1063
|
+
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);
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
function efAplica(){
|
|
1067
|
+
var ef=estado.ajustes&&estado.ajustes.effort;if(!ef)return;
|
|
1068
|
+
var ns=efNiveis(),n=ns.length,i=0;
|
|
1069
|
+
ns.forEach(function(x,k){if(x.nome===ef.atual)i=k;});
|
|
1070
|
+
var p=n>1?i/(n-1):0;
|
|
1071
|
+
Array.prototype.forEach.call(document.querySelectorAll('.efs'),function(s){
|
|
1072
|
+
if(s.classList.contains('drag'))return;
|
|
1073
|
+
s._lock=i;
|
|
1074
|
+
efSpring(s,p,'snap');
|
|
1075
|
+
});
|
|
1076
|
+
}
|
|
1077
|
+
/* travou num nível: háptico, som, batida do botão */
|
|
1078
|
+
function efTrava(s,j,dir){
|
|
1079
|
+
var ns=efNiveis(),n=ns.length;if(!n)return;
|
|
1080
|
+
s._lock=j;
|
|
1081
|
+
post(j===n-1||j===0?{acao:'haptico',forte:true}:{acao:'haptico'});
|
|
1082
|
+
efSom(j,n);
|
|
1083
|
+
s.classList.remove('bump');void s.offsetWidth;s.classList.add('bump');
|
|
1084
|
+
clearTimeout(s._bt);s._bt=setTimeout(function(){s.classList.remove('bump');},480);
|
|
1085
|
+
efVisual(s,s._x==null?j/(n-1):s._x,ns);
|
|
1086
|
+
}
|
|
1087
|
+
function efPasso(s,j,dir){
|
|
1088
|
+
var ns=efNiveis();if(!ns[j])return;
|
|
1089
|
+
efTrava(s,j,dir);
|
|
1090
|
+
setEffort(ns[j].nome);
|
|
1091
|
+
}
|
|
1092
|
+
function efSlider(){
|
|
1093
|
+
var ns=efNiveis();if(!ns.length)return '';
|
|
1094
|
+
var n=ns.length,mk='',rec='',k,ir=-1;
|
|
1095
|
+
for(k=0;k<n;k++)if(ns[k].nome==='medium')ir=k;
|
|
1096
|
+
for(k=0;k<n;k++){
|
|
1097
|
+
var q=n>1?k/(n-1):0;
|
|
1098
|
+
mk+='<span class="efs-mk'+(k===ir?' rec':'')+'" style="--q:'+q+'"></span>';
|
|
1099
|
+
}
|
|
1100
|
+
if(ir>=0)rec='<div class="efs-rec"><span style="--q:'+(n>1?ir/(n-1):0)+'">Recomendado</span></div>';
|
|
1101
|
+
return '<div class="efs" tabindex="0" role="slider" aria-label="Esforço" aria-valuemin="0" aria-valuemax="'+(n-1)+'">'+
|
|
1102
|
+
'<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>'+
|
|
1103
|
+
'<p class="efs-ajuda">Mais esforço = pensa mais e pesquisa antes; demora mais e gasta mais do plano.</p>'+
|
|
1104
|
+
'<div class="efs-eixo"><span>Mais rápido</span><span>Mais inteligente</span></div>'+
|
|
1105
|
+
'<div class="efs-trilha"><canvas class="efs-px"></canvas>'+mk+'<span class="efs-thumb"></span></div>'+rec+'</div>';
|
|
1106
|
+
}
|
|
1107
|
+
function cfgEffort(A){
|
|
1108
|
+
var ef=A.effort;if(!ef||!Array.isArray(ef.niveis)||!ef.niveis.length)return '';
|
|
1109
|
+
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>';
|
|
1110
|
+
}
|
|
1111
|
+
function efMove(e){
|
|
1112
|
+
if(!efDrag)return;
|
|
1113
|
+
var ns=efNiveis(),n=ns.length;if(n<2)return;
|
|
1114
|
+
var s=efDrag.s,rc=efDrag.tr.getBoundingClientRect();
|
|
1115
|
+
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;
|
|
1116
|
+
efDrag.p=p;
|
|
1117
|
+
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;
|
|
1118
|
+
for(k=0;k<n;k++){var sk=k*g;if(sk+z>=lo&&sk-z<=hi)ks.push(k);}
|
|
1119
|
+
if(dir<0)ks.reverse();
|
|
1120
|
+
ks.forEach(function(q){if(q!==s._lock)efTrava(s,q,dir);});
|
|
1121
|
+
var sl=(s._lock||0)*g;
|
|
1122
|
+
if(Math.abs(p-sl)<=z)efSpring(s,sl+(p-sl)*0.12,'snap');
|
|
1123
|
+
else efSpring(s,p,'free');
|
|
1124
|
+
}
|
|
1125
|
+
function efFim(e){
|
|
1126
|
+
if(!efDrag||e.pointerId!==efDrag.id)return;
|
|
1127
|
+
efMove(e);
|
|
1128
|
+
var s=efDrag.s,ns=efNiveis(),n=ns.length;
|
|
1129
|
+
var j=Math.max(0,Math.min(n-1,Math.round(efDrag.p*(n-1))));
|
|
1130
|
+
if(j!==s._lock)efTrava(s,j,j>=(s._lock||0)?1:-1);
|
|
1131
|
+
efDrag=null;efSolto=Date.now();
|
|
1132
|
+
s.classList.remove('drag');
|
|
1133
|
+
if(ns[j])setEffort(ns[j].nome);
|
|
1134
|
+
efSpring(s,j/(n-1),'snap');
|
|
1135
|
+
}
|
|
1136
|
+
document.addEventListener('pointerdown',function(e){
|
|
1137
|
+
var tr=e.target.closest&&e.target.closest('.efs-trilha');if(!tr)return;
|
|
1138
|
+
var s=tr.closest('.efs'),ns=efNiveis();if(!s||!ns.length||!(estado.ajustes&&estado.ajustes.effort))return;
|
|
1139
|
+
e.preventDefault();efAudio();
|
|
1140
|
+
if(s._lock==null)efAplica();
|
|
1141
|
+
efDrag={s:s,tr:tr,id:e.pointerId,p:(s._lock||0)/Math.max(1,ns.length-1)};
|
|
1142
|
+
try{tr.setPointerCapture(e.pointerId);}catch(_){}
|
|
1143
|
+
s.classList.add('drag');
|
|
1144
|
+
s.focus();efMove(e);
|
|
1145
|
+
});
|
|
1146
|
+
document.addEventListener('pointermove',function(e){if(efDrag&&e.pointerId===efDrag.id)efMove(e);});
|
|
1147
|
+
document.addEventListener('pointerup',efFim);
|
|
1148
|
+
document.addEventListener('pointercancel',efFim);
|
|
1149
|
+
function cfgPerm(A){
|
|
1150
|
+
var p=A.permissoes;if(!p||!Array.isArray(p.opcoes)||!p.opcoes.length)return '';
|
|
1151
|
+
var at=p.opcoes.filter(function(o){return o.nome===p.atual;})[0];
|
|
1152
|
+
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">'+
|
|
1153
|
+
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>'+
|
|
1154
|
+
'<div class="ef-txt">'+(at?'<b>'+esc(at.nome)+'</b>'+esc(at.resumo||''):'')+'</div></div></div>';
|
|
1155
|
+
}
|
|
1156
|
+
function renderAvisos(){
|
|
1157
|
+
var a=estado.aviso,el=$('avisos');
|
|
1158
|
+
if(!a){el.innerHTML='';return;}
|
|
1159
|
+
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>';
|
|
1160
|
+
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>';
|
|
1161
|
+
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>';
|
|
1162
|
+
}
|
|
1163
|
+
function atualizaBotao(){
|
|
1164
|
+
var b=$('enviar'),vazio=!ta().value.trim()&&!estado.anexos.length;
|
|
1165
|
+
if(estado.esperando){b.className='enviar parar';b.setAttribute('aria-label','Parar');}
|
|
1166
|
+
else if(vazio){b.className='enviar vazio';b.setAttribute('aria-label','Abrir a voz do Primo');}
|
|
1167
|
+
else{b.className='enviar cheio';b.setAttribute('aria-label','Enviar');}
|
|
1168
|
+
}
|
|
1169
|
+
function cresce(){var t=ta();t.style.height='auto';t.style.height=Math.min(t.scrollHeight,160)+'px';}
|
|
1170
|
+
|
|
1171
|
+
/* ---------- ações ---------- */
|
|
1172
|
+
function novaConversa(){
|
|
1173
|
+
if(estado.esperando){estado.ignorando=true;estado.esperando=false;}
|
|
1174
|
+
estado.abertas={};estado.convId=null;estado.titulo='';estado.mensagens=[];estado.animarDe=0;estado.passos=[];estado.erro='';estado.aviso=null;estado.anexos=[];estado.menu=false;
|
|
1175
|
+
ta().value='';cresce();
|
|
1176
|
+
estado.tela='chat';animar=true;
|
|
1177
|
+
renderLado();renderAnexos();renderMenu();renderAvisos();renderPrincipal();
|
|
1178
|
+
ta().focus();
|
|
1179
|
+
}
|
|
1180
|
+
function abrirConversa(id){
|
|
1181
|
+
if(estado.esperando){estado.ignorando=true;estado.esperando=false;estado.passos=[];estado.erro='';}
|
|
1182
|
+
estado.tela='chat';estado.menu=false;estado.aviso=null;
|
|
1183
|
+
post({acao:'abrir',id:id});
|
|
1184
|
+
renderLado();renderMenu();renderAvisos();atualizaBotao();
|
|
1185
|
+
renderPrincipal();
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
/* ---------- saída de terminal ---------- */
|
|
1189
|
+
function linhaSaida(l){
|
|
1190
|
+
var cls=/^\s*(✓|✔)/.test(l)?'to-ok':/^\s*(✗|✘|×|!|erro\b|error\b)/i.test(l)?'to-err':'';
|
|
1191
|
+
var re=/((?:~|\.\.?)?\/[\w.\-@+~\/]+)|(\b\d+(?:[.,]\d+)?\b)/g,out='',last=0,m;
|
|
1192
|
+
while((m=re.exec(l))){
|
|
1193
|
+
if(m.index>last)out+=esc(l.slice(last,m.index));
|
|
1194
|
+
out+='<span class="'+(m[1]?'tp':'tnum')+'">'+esc(m[0])+'</span>';
|
|
1195
|
+
last=re.lastIndex;
|
|
1196
|
+
}
|
|
1197
|
+
out+=esc(l.slice(last));
|
|
1198
|
+
return cls?'<span class="'+cls+'">'+out+'</span>':out;
|
|
1199
|
+
}
|
|
1200
|
+
function htmlSaida(s,pre){
|
|
1201
|
+
var ms=s.midias||[],linhas=String(s.texto==null?'':s.texto).replace(/\s+$/,'').split('\n');
|
|
1202
|
+
var corta=linhas.length>22&&!estado.abertas[pre],vis=corta?linhas.slice(0,22):linhas;
|
|
1203
|
+
var corpo=chipify(vis.map(linhaSaida).join('\n'),ms,pre);
|
|
1204
|
+
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>'+
|
|
1205
|
+
(corta?'<button class="ts-mais" data-a="mostrarTudo" data-id="'+pre+'">mostrar tudo ('+linhas.length+' linhas)</button>':'')+'</div>';
|
|
1206
|
+
}
|
|
1207
|
+
var NEEDS_ARG=['/read','/run','/open','/historico','/novo','/install-skill','/name'];
|
|
1208
|
+
function toast(txt){
|
|
1209
|
+
var el=$('toast');el.textContent=txt;el.classList.add('show');
|
|
1210
|
+
clearTimeout(toast.t);toast.t=setTimeout(function(){el.classList.remove('show');},1600);
|
|
1211
|
+
}
|
|
1212
|
+
function filtraCmds(q){
|
|
1213
|
+
q=String(q).toLowerCase().replace(/^\s+/,'');
|
|
1214
|
+
var w=q.split(/\s+/)[0],tem=q.indexOf(' ')>=0,r=[];
|
|
1215
|
+
estado.comandos.forEach(function(c,i){
|
|
1216
|
+
var n=c.nome.toLowerCase().replace(/^\//,''),d=String(c.descricao||'').toLowerCase(),s=-1;
|
|
1217
|
+
if(!q)s=0;
|
|
1218
|
+
else if(n.indexOf(q)===0||(tem&&(n===w||q.indexOf(n+' ')===0)))s=0;
|
|
1219
|
+
else if(n.indexOf(w)>=0)s=1;
|
|
1220
|
+
else if(d.indexOf(w)>=0)s=2;
|
|
1221
|
+
if(s>=0)r.push({c:c,s:s,i:i});
|
|
1222
|
+
});
|
|
1223
|
+
r.sort(function(a,b){return (a.s-b.s)||(a.i-b.i);});
|
|
1224
|
+
return r.map(function(x){return x.c;});
|
|
1225
|
+
}
|
|
1226
|
+
function renderPal(){
|
|
1227
|
+
var el=$('pal'),p=estado.pal;
|
|
1228
|
+
if(!p.aberta){el.innerHTML='';return;}
|
|
1229
|
+
var novo=!el.firstChild;
|
|
1230
|
+
var TAG={app:'app',terminal:'terminal',pedido:'seu comando'};
|
|
1231
|
+
el.innerHTML='<div class="menu pal'+(novo?' novo':'')+'" role="listbox">'+p.itens.map(function(c,i){
|
|
1232
|
+
var tp=TAG[c.tipo]?c.tipo:'terminal';
|
|
1233
|
+
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>';
|
|
1234
|
+
}).join('')+'<div class="pal-dica">↑↓ navegar · tab completar · enter rodar · esc fechar</div></div>';
|
|
1235
|
+
var s=el.querySelector('.pal-r.sel');if(s&&s.scrollIntoView)s.scrollIntoView({block:'nearest'});
|
|
1236
|
+
}
|
|
1237
|
+
function fechaPal(){var p=estado.pal;p.aberta=false;p.itens=[];p.q=null;renderPal();}
|
|
1238
|
+
function atualizaPal(){
|
|
1239
|
+
var v=ta().value,p=estado.pal;
|
|
1240
|
+
if(v.charAt(0)!=='/'||v.indexOf('\n')>=0||!estado.comandos.length){if(p.aberta)fechaPal();return;}
|
|
1241
|
+
var q=v.slice(1),itens=filtraCmds(q);
|
|
1242
|
+
if(!itens.length){if(p.aberta)fechaPal();return;}
|
|
1243
|
+
if(p.q!==q){p.sel=0;p.q=q;}
|
|
1244
|
+
p.itens=itens;
|
|
1245
|
+
if(!p.aberta&&estado.menu){estado.menu=false;renderMenu();}
|
|
1246
|
+
p.aberta=true;renderPal();
|
|
1247
|
+
}
|
|
1248
|
+
function completaCmd(c){
|
|
1249
|
+
ta().value=c.nome+' ';cresce();atualizaBotao();atualizaPal();ta().focus();
|
|
1250
|
+
}
|
|
1251
|
+
function acheCmd(t){
|
|
1252
|
+
var low=t.toLowerCase(),melhor=null;
|
|
1253
|
+
estado.comandos.forEach(function(c){
|
|
1254
|
+
var n=c.nome.toLowerCase();
|
|
1255
|
+
if((low===n||low.indexOf(n+' ')===0)&&(!melhor||n.length>melhor.nome.length))melhor=c;
|
|
1256
|
+
});
|
|
1257
|
+
return melhor;
|
|
1258
|
+
}
|
|
1259
|
+
function executaCmd(c,t){
|
|
1260
|
+
var nome=c.nome,args='';
|
|
1261
|
+
if(t.toLowerCase().indexOf(nome.toLowerCase())===0)args=t.slice(nome.length).trim();
|
|
1262
|
+
var texto=args?nome+' '+args:nome;
|
|
1263
|
+
if(NEEDS_ARG.indexOf(nome)>=0&&!args){completaCmd(c);return;}
|
|
1264
|
+
fechaPal();
|
|
1265
|
+
if(c.tipo==='pedido'){ta().value=texto;enviar(true);return;}
|
|
1266
|
+
if(c.tipo==='app'){ta().value='';cresce();atualizaBotao();appCmd(c,args);return;}
|
|
1267
|
+
if(estado.esperando)return;
|
|
1268
|
+
estado.mensagens.push({papel:'voce',comando:true,texto:texto});
|
|
1269
|
+
estado.tela='chat';estado.aviso=null;estado.erro='';estado.esperando=true;estado.ignorando=false;estado.passos=[];estado.menu=false;
|
|
1270
|
+
post({acao:'comando',texto:texto,conversa:estado.convId==null?null:estado.convId});
|
|
1271
|
+
ta().value='';cresce();
|
|
1272
|
+
renderAnexos();renderMenu();renderAvisos();renderLista();renderNav();renderPrincipal();
|
|
1273
|
+
}
|
|
1274
|
+
function ultimaResposta(){
|
|
1275
|
+
for(var i=estado.mensagens.length-1;i>=0;i--){
|
|
1276
|
+
var m=estado.mensagens[i];
|
|
1277
|
+
if(m.papel==='primo'){var s=m.saida?m.saida.texto:m.texto;if(s)return String(s);}
|
|
1278
|
+
}
|
|
1279
|
+
return '';
|
|
1280
|
+
}
|
|
1281
|
+
function appCmd(c,args){
|
|
1282
|
+
var a=c.acao,al=String(args||'').toLowerCase();
|
|
1283
|
+
switch(a){
|
|
1284
|
+
case 'nova':novaConversa();break;
|
|
1285
|
+
case 'buscar':post({acao:'conversas'});navegar('buscar');var b=$('busca');if(b)b.focus();break;
|
|
1286
|
+
case 'entrar':post({acao:'entrar'});break;
|
|
1287
|
+
case 'sair_conta':
|
|
1288
|
+
if(!estado.logado){estado.aviso={tipo:'erro',texto:'Você não está em nenhuma conta.'};}
|
|
1289
|
+
else estado.aviso={tipo:'sair'};
|
|
1290
|
+
renderAvisos();break;
|
|
1291
|
+
case 'conta':estado.aba='conta';post({acao:'ajustes'});navegar('config');break;
|
|
1292
|
+
case 'modo':
|
|
1293
|
+
if(al==='chat')setModo('chat');
|
|
1294
|
+
else if(al==='agent'||al==='primocode')setModo('agent');
|
|
1295
|
+
else{estado.menu='modo';renderMenu();}
|
|
1296
|
+
break;
|
|
1297
|
+
case 'modelos':case 'ajustes':estado.aba='modelos';post({acao:'ajustes'});navegar('config');break;
|
|
1298
|
+
case 'skills':post({acao:'skills'});navegar('skills');break;
|
|
1299
|
+
case 'anexar':post({acao:'anexar'});break;
|
|
1300
|
+
case 'desanexar':estado.anexos=[];renderAnexos();break;
|
|
1301
|
+
case 'copiar':
|
|
1302
|
+
var u=ultimaResposta();
|
|
1303
|
+
if(u){copiarTexto(u,{textContent:'Copiar'});toast('Copiado');}else toast('Nada pra copiar');
|
|
1304
|
+
break;
|
|
1305
|
+
case 'voz':post({acao:'voz'});break;
|
|
1306
|
+
case 'voz_nome':
|
|
1307
|
+
estado.aba='voz';post({acao:'ajustes'});
|
|
1308
|
+
if(args){post({acao:'ajuste',chave:'voz_nome',valor:String(args)});if(estado.ajustes&&estado.ajustes.voz)estado.ajustes.voz.nome=String(args);}
|
|
1309
|
+
navegar('config');
|
|
1310
|
+
setTimeout(function(){var e=$('vozNome');if(e)e.focus();},80);
|
|
1311
|
+
break;
|
|
1312
|
+
case 'effort':
|
|
1313
|
+
var efc=estado.ajustes&&estado.ajustes.effort,nvs=efc?efNiveis().map(function(x){return x.nome;}):['low','medium','high','xhigh','max','ultracode'];
|
|
1314
|
+
if(al){
|
|
1315
|
+
var ve=al.split(/\s+/)[0];
|
|
1316
|
+
if(nvs.indexOf(ve)<0)toast('Use: /effort low|medium|high|xhigh|max|ultracode');
|
|
1317
|
+
else{setEffort(ve);toast('Esforço: '+efNome(ve));}
|
|
1318
|
+
}else{post({acao:'ajustes'});estado.menu='ef';renderMenu();}
|
|
1319
|
+
break;
|
|
1320
|
+
case 'permissoes':
|
|
1321
|
+
var pc2=estado.ajustes&&estado.ajustes.permissoes,ops=pc2&&pc2.opcoes?pc2.opcoes.map(function(x){return x.nome;}):['auto','livre','plano'];
|
|
1322
|
+
if(al){
|
|
1323
|
+
var vp=al.split(/\s+/)[0];
|
|
1324
|
+
if(ops.indexOf(vp)<0)toast('Use: /permissoes '+ops.join('|'));
|
|
1325
|
+
else{setPerm(vp);toast('Permissões: '+vp);}
|
|
1326
|
+
}else{estado.aba='modelos';estado.irPerm=true;post({acao:'ajustes'});navegar('config');}
|
|
1327
|
+
break;
|
|
1328
|
+
case 'pasta':post({acao:'escolher_pasta'});break;
|
|
1329
|
+
case 'ajuda':ta().value='/';cresce();atualizaBotao();atualizaPal();ta().focus();break;
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
function enviar(pular){
|
|
1333
|
+
var t=ta().value.trim();
|
|
1334
|
+
if(estado.esperando)return;
|
|
1335
|
+
if(!t&&!estado.anexos.length)return;
|
|
1336
|
+
if(!pular&&t.charAt(0)==='/'){var cm=acheCmd(t);if(cm){executaCmd(cm,t);return;}}
|
|
1337
|
+
if(!estado.logado){estado.aviso={tipo:'login'};renderAvisos();return;}
|
|
1338
|
+
var nomes=estado.anexos.map(function(a){return a.nome;});
|
|
1339
|
+
var texto=t||('Anexei '+nomes.join(', '));
|
|
1340
|
+
var midias=estado.anexos.map(function(a){return {achado:'',caminho:a.caminho,nome:a.nome,tipo:tipoDe(a.nome),url:'file://'+encodeURI(a.caminho)};});
|
|
1341
|
+
estado.mensagens.push({papel:'voce',texto:texto,midias:midias});
|
|
1342
|
+
estado.tela='chat';estado.aviso=null;estado.erro='';estado.esperando=true;estado.ignorando=false;estado.passos=[];estado.menu=false;
|
|
1343
|
+
post({acao:'enviar',texto:texto,conversa:estado.convId==null?null:estado.convId,modo:estado.modo,anexos:estado.anexos.map(function(a){return a.caminho;})});
|
|
1344
|
+
ta().value='';estado.anexos=[];cresce();
|
|
1345
|
+
renderAnexos();renderMenu();renderAvisos();renderLista();renderNav();renderPrincipal();
|
|
1346
|
+
}
|
|
1347
|
+
function apertar(){
|
|
1348
|
+
if(estado.esperando){post({acao:'parar'});estado.esperando=false;estado.passos=[];renderEspera();atualizaBotao();return;}
|
|
1349
|
+
if(!ta().value.trim()&&!estado.anexos.length){post({acao:'voz'});return;}
|
|
1350
|
+
enviar();
|
|
1351
|
+
}
|
|
1352
|
+
function setModo(v){
|
|
1353
|
+
estado.modo=v;estado.menu=false;
|
|
1354
|
+
post({acao:'ajuste',chave:'modo',valor:v});
|
|
1355
|
+
renderMenu();
|
|
1356
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1357
|
+
}
|
|
1358
|
+
function lerArquivos(lista){
|
|
1359
|
+
Array.prototype.forEach.call(lista||[],function(f){
|
|
1360
|
+
if(f.size>MAX_ARQ){estado.aviso={tipo:'erro',texto:'"'+f.name+'" passa de 25 MB. Escolha um arquivo menor.'};renderAvisos();return;}
|
|
1361
|
+
var r=new FileReader();
|
|
1362
|
+
r.onload=function(){
|
|
1363
|
+
var s=String(r.result||''),i=s.indexOf(',');
|
|
1364
|
+
post({acao:'soltar',nome:f.name,base64:i>=0?s.slice(i+1):s});
|
|
1365
|
+
};
|
|
1366
|
+
r.onerror=function(){estado.aviso={tipo:'erro',texto:'Não consegui ler "'+f.name+'".'};renderAvisos();};
|
|
1367
|
+
r.readAsDataURL(f);
|
|
1368
|
+
});
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
document.addEventListener('click',function(e){
|
|
1372
|
+
if(estado.pal.aberta&&!e.target.closest('#pal')&&e.target.id!=='pergunta')fechaPal();
|
|
1373
|
+
if(Date.now()-efSolto<350)return;
|
|
1374
|
+
if(estado.menu&&!e.target.closest('#menu')&&!e.target.closest('#chipModo')&&!e.target.closest('#chipEf')){estado.menu=false;renderMenu();}
|
|
1375
|
+
var el=e.target.closest('[data-a]');
|
|
1376
|
+
if(estado.confirma!==null){
|
|
1377
|
+
var ca=el&&el.getAttribute('data-a'),ok=(ca==='excluir'&&String(el.dataset.id)===String(estado.confirma))||(ca==='limpar'&&estado.confirma==='todas');
|
|
1378
|
+
if(!ok){estado.confirma=null;renderLista();if(estado.tela==='buscar')renderResultados();if(estado.tela==='config')renderPrincipal();}
|
|
1379
|
+
}
|
|
1380
|
+
if(!el)return;
|
|
1381
|
+
var a=el.getAttribute('data-a'),d=el.dataset;
|
|
1382
|
+
switch(a){
|
|
1383
|
+
case 'nova':novaConversa();break;
|
|
1384
|
+
case 'buscar':post({acao:'conversas'});navegar('buscar');var b=$('busca');if(b)b.focus();break;
|
|
1385
|
+
case 'skills':post({acao:'skills'});navegar('skills');break;
|
|
1386
|
+
case 'cfg':post({acao:'ajustes'});navegar('config');break;
|
|
1387
|
+
case 'cfgmodelos':estado.aba='modelos';post({acao:'ajustes'});navegar('config');break;
|
|
1388
|
+
case 'abrirarq':if(d.c)post({acao:'abrir_arquivo',caminho:d.c});break;
|
|
1389
|
+
case 'mostrar':if(d.c)post({acao:'mostrar_finder',caminho:d.c});break;
|
|
1390
|
+
case 'copiar':
|
|
1391
|
+
var cw=el.closest('.cb,.mc'),cc=cw&&cw.querySelector('code');
|
|
1392
|
+
if(cc)copiarTexto(cc.textContent,el);
|
|
1393
|
+
break;
|
|
1394
|
+
case 'irmidia':
|
|
1395
|
+
var alvo=document.getElementById(d.id);
|
|
1396
|
+
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);}
|
|
1397
|
+
break;
|
|
1398
|
+
case 'lightbox':
|
|
1399
|
+
var mi=REG[d.id];
|
|
1400
|
+
if(mi&&mi.url){var lb=$('lb');lb.firstElementChild.src=mi.url;lb.hidden=false;}
|
|
1401
|
+
break;
|
|
1402
|
+
case 'play':
|
|
1403
|
+
var vv=el.closest('.mc').querySelector('video');
|
|
1404
|
+
if(vv){if(vv.paused)vv.play();else vv.pause();}
|
|
1405
|
+
break;
|
|
1406
|
+
case 'aplay':
|
|
1407
|
+
var au=el.closest('.mc').querySelector('audio');
|
|
1408
|
+
if(au){if(au.paused)au.play();else au.pause();}
|
|
1409
|
+
break;
|
|
1410
|
+
case 'aseek':
|
|
1411
|
+
var au2=el.closest('.mc').querySelector('audio'),rc=el.getBoundingClientRect();
|
|
1412
|
+
if(au2&&au2.duration)au2.currentTime=Math.max(0,Math.min(1,(e.clientX-rc.left)/rc.width))*au2.duration;
|
|
1413
|
+
break;
|
|
1414
|
+
case 'palrun':
|
|
1415
|
+
var pc=estado.pal.itens[+d.i];
|
|
1416
|
+
if(pc)executaCmd(pc,ta().value.trim());
|
|
1417
|
+
break;
|
|
1418
|
+
case 'sairConfirma':estado.aviso=null;renderAvisos();post({acao:'sair_conta'});break;
|
|
1419
|
+
case 'mostrarTudo':estado.abertas[d.id]=true;renderMsgs();break;
|
|
1420
|
+
case 'copiarSaida':
|
|
1421
|
+
var mi2=estado.mensagens[+String(d.id).slice(1)];
|
|
1422
|
+
if(mi2&&mi2.saida)copiarTexto(String(mi2.saida.texto||''),el);
|
|
1423
|
+
break;
|
|
1424
|
+
case 'conv':abrirConversa(d.id);break;
|
|
1425
|
+
case 'excluir':
|
|
1426
|
+
if(estado.confirma!==null&&String(estado.confirma)===String(d.id)){
|
|
1427
|
+
estado.confirma=null;post({acao:'excluir',id:d.id});removeConversa(d.id);renderLista();if(estado.tela==='buscar')renderResultados();
|
|
1428
|
+
}else{estado.confirma=d.id;renderLista();}
|
|
1429
|
+
break;
|
|
1430
|
+
case 'limpar':
|
|
1431
|
+
if(estado.confirma==='todas'){
|
|
1432
|
+
estado.confirma=null;post({acao:'excluir_todas'});estado.conversas=[];
|
|
1433
|
+
if(estado.convId!=null){var tl=estado.tela;novaConversa();if(tl==='config'){estado.tela='config';renderNav();renderPrincipal();}}else renderLista();
|
|
1434
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1435
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1436
|
+
}else{estado.confirma='todas';renderLista();if(estado.tela==='config')renderPrincipal();}
|
|
1437
|
+
break;
|
|
1438
|
+
case 'aba':estado.aba=d.id;renderPrincipal();break;
|
|
1439
|
+
case 'menuModo':estado.menu=estado.menu==='modo'?false:'modo';renderMenu();break;
|
|
1440
|
+
case 'menuEf':estado.menu=estado.menu==='ef'?false:'ef';renderMenu();break;
|
|
1441
|
+
case 'perm':setPerm(d.v);break;
|
|
1442
|
+
case 'efAjuda':el.closest('.efs').classList.toggle('ajuda');break;
|
|
1443
|
+
case 'modo':setModo(d.v);break;
|
|
1444
|
+
case 'anexar':post({acao:'anexar'});break;
|
|
1445
|
+
case 'tirar':estado.anexos.splice(+d.i,1);renderAnexos();break;
|
|
1446
|
+
case 'sug':ta().value=SUGESTOES[+d.i]||'';cresce();atualizaBotao();ta().focus();break;
|
|
1447
|
+
case 'enviar':apertar();break;
|
|
1448
|
+
case 'entrar':post({acao:'entrar'});break;
|
|
1449
|
+
case 'sair':post({acao:'sair_conta'});break;
|
|
1450
|
+
case 'fechaAviso':estado.aviso=null;renderAvisos();break;
|
|
1451
|
+
case 'link':e.preventDefault();post({acao:'abrir_link',url:d.url});break;
|
|
1452
|
+
case 'skill':
|
|
1453
|
+
var k=estado.skills&&estado.skills[+d.i];
|
|
1454
|
+
if(k){k.ligada=!k.ligada;post({acao:'skill',nome:k.nome,ligada:k.ligada});renderPrincipal();}
|
|
1455
|
+
break;
|
|
1456
|
+
case 'usar':
|
|
1457
|
+
if(estado.ajustes){
|
|
1458
|
+
var atual=estado.ajustes.provedor&&estado.ajustes.provedor.id||'primo';
|
|
1459
|
+
if(atual===d.id)break;
|
|
1460
|
+
estado.ajustes.provedor={id:d.id,nome:{primo:'Primo','claude-code':'Claude Code',codex:'Codex'}[d.id]||d.id,chave_mascarada:''};
|
|
1461
|
+
post({acao:'ajuste',chave:'provedor',valor:{provedor:d.id}});
|
|
1462
|
+
renderPrincipal();
|
|
1463
|
+
}
|
|
1464
|
+
break;
|
|
1465
|
+
case 'salvarChave':
|
|
1466
|
+
var c=estado.chaveDraft.trim(),A=estado.ajustes;
|
|
1467
|
+
if(!c||!A)break;
|
|
1468
|
+
var ps=A.provedores_chave||[],sel=estado.provSel||(ps[0]&&ps[0].id);
|
|
1469
|
+
if(!ps.some(function(p){return p.id===sel;}))sel=ps[0]&&ps[0].id;
|
|
1470
|
+
if(!sel)break;
|
|
1471
|
+
post({acao:'ajuste',chave:'provedor',valor:{provedor:sel,chave:c}});
|
|
1472
|
+
var pn=ps.filter(function(p){return p.id===sel;})[0];
|
|
1473
|
+
A.provedor={id:sel,nome:pn?pn.nome:sel,chave_mascarada:''};
|
|
1474
|
+
estado.chaveDraft='';estado.chaveSalva=true;renderPrincipal();
|
|
1475
|
+
break;
|
|
1476
|
+
case 'pasta':post({acao:'escolher_pasta'});break;
|
|
1477
|
+
case 'sons':
|
|
1478
|
+
if(estado.ajustes&&estado.ajustes.voz){
|
|
1479
|
+
estado.ajustes.voz.sons=!estado.ajustes.voz.sons;
|
|
1480
|
+
post({acao:'ajuste',chave:'voz_sons',valor:!!estado.ajustes.voz.sons});
|
|
1481
|
+
renderPrincipal();
|
|
1482
|
+
}
|
|
1483
|
+
break;
|
|
1484
|
+
}
|
|
1485
|
+
});
|
|
1486
|
+
$('lb').addEventListener('click',function(){$('lb').hidden=true;});
|
|
1487
|
+
window.addEventListener('resize',ajustaSites);
|
|
1488
|
+
['play','pause','ended','timeupdate','loadedmetadata'].forEach(function(ev){
|
|
1489
|
+
document.addEventListener(ev,function(e){
|
|
1490
|
+
var a=e.target;if(!a||a.tagName!=='AUDIO')return;
|
|
1491
|
+
var w=a.closest('.mc-au');if(!w)return;
|
|
1492
|
+
w.classList.toggle('tocando',!a.paused&&!a.ended);
|
|
1493
|
+
var f=w.querySelector('.au-bar i'),tt=w.querySelector('.au-t');
|
|
1494
|
+
if(f)f.style.width=(a.duration?(a.currentTime/a.duration*100):0)+'%';
|
|
1495
|
+
if(tt)tt.textContent=tempo(ev==='loadedmetadata'?a.duration:a.currentTime);
|
|
1496
|
+
},true);
|
|
1497
|
+
});
|
|
1498
|
+
document.addEventListener('error',function(e){
|
|
1499
|
+
var x=e.target;if(!x||!x.tagName||['VIDEO','IMG','AUDIO'].indexOf(x.tagName)<0)return;
|
|
1500
|
+
var mc=x.closest&&x.closest('.mc');if(!mc||mc.classList.contains('mc-row'))return;
|
|
1501
|
+
var m=REG[mc.id];if(!m)return;
|
|
1502
|
+
var tmp=document.createElement('div');tmp.innerHTML=linhaM(m,mc.id,0);
|
|
1503
|
+
mc.parentNode.replaceChild(tmp.firstChild,mc);
|
|
1504
|
+
},true);
|
|
1505
|
+
document.addEventListener('mouseover',function(e){
|
|
1506
|
+
var r=e.target.closest&&e.target.closest('.pal-r');if(!r||!estado.pal.aberta)return;
|
|
1507
|
+
var i=+r.getAttribute('data-i');if(i===estado.pal.sel)return;
|
|
1508
|
+
estado.pal.sel=i;
|
|
1509
|
+
Array.prototype.forEach.call(document.querySelectorAll('.pal-r'),function(x,k){x.classList.toggle('sel',k===i);});
|
|
1510
|
+
});
|
|
1511
|
+
document.addEventListener('input',function(e){
|
|
1512
|
+
var t=e.target;
|
|
1513
|
+
if(t.id==='pergunta'){cresce();atualizaBotao();atualizaPal();}
|
|
1514
|
+
else if(t.id==='busca'){estado.busca=t.value;renderResultados();}
|
|
1515
|
+
else if(t.id==='chaveApi'){
|
|
1516
|
+
estado.chaveDraft=t.value;
|
|
1517
|
+
if(estado.chaveSalva){estado.chaveSalva=false;var b=$('chaveBtn');if(b){b.className='conectar';b.textContent='Salvar';}}
|
|
1518
|
+
}
|
|
1519
|
+
});
|
|
1520
|
+
document.addEventListener('change',function(e){
|
|
1521
|
+
var t=e.target;
|
|
1522
|
+
if(t.id==='provSel'){estado.provSel=t.value;estado.chaveSalva=false;renderPrincipal();}
|
|
1523
|
+
else if(t.getAttribute&&t.getAttribute('data-in')==='voz_nome'){
|
|
1524
|
+
var v=t.value.trim();
|
|
1525
|
+
if(estado.ajustes&&estado.ajustes.voz&&v!==estado.ajustes.voz.nome){
|
|
1526
|
+
estado.ajustes.voz.nome=v;
|
|
1527
|
+
post({acao:'ajuste',chave:'voz_nome',valor:v});
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
});
|
|
1531
|
+
document.addEventListener('keydown',function(e){
|
|
1532
|
+
if(e.key==='Escape'&&!$('lb').hidden){$('lb').hidden=true;return;}
|
|
1533
|
+
if(e.target.id==='pergunta'&&estado.pal.aberta&&!e.isComposing){
|
|
1534
|
+
var pp=estado.pal,nn=pp.itens.length;
|
|
1535
|
+
if(e.key==='ArrowDown'){e.preventDefault();pp.sel=(pp.sel+1)%nn;renderPal();return;}
|
|
1536
|
+
if(e.key==='ArrowUp'){e.preventDefault();pp.sel=(pp.sel-1+nn)%nn;renderPal();return;}
|
|
1537
|
+
if(e.key==='Escape'){e.preventDefault();fechaPal();return;}
|
|
1538
|
+
if(e.key==='Tab'){e.preventDefault();completaCmd(pp.itens[pp.sel]);return;}
|
|
1539
|
+
if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();executaCmd(pp.itens[pp.sel],ta().value.trim());return;}
|
|
1540
|
+
}
|
|
1541
|
+
if(e.target.classList&&e.target.classList.contains('efs')){
|
|
1542
|
+
var nk=efNiveis(),ck=0,efk=estado.ajustes&&estado.ajustes.effort;
|
|
1543
|
+
nk.forEach(function(x,k){if(efk&&x.nome===efk.atual)ck=k;});
|
|
1544
|
+
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;
|
|
1545
|
+
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;}
|
|
1546
|
+
}
|
|
1547
|
+
if(e.key==='Escape'&&estado.menu){estado.menu=false;renderMenu();}
|
|
1548
|
+
if(e.target.id==='pergunta'&&e.key==='Enter'&&!e.shiftKey&&!e.isComposing){e.preventDefault();enviar();}
|
|
1549
|
+
if(e.target.id==='chaveApi'&&e.key==='Enter'){e.preventDefault();var b=$('chaveBtn');if(b)b.click();}
|
|
1550
|
+
if(e.target.id==='vozNome'&&e.key==='Enter'){e.preventDefault();e.target.blur();}
|
|
1551
|
+
});
|
|
1552
|
+
|
|
1553
|
+
/* arrastar e soltar */
|
|
1554
|
+
(function(){
|
|
1555
|
+
var main=$('main'),solta=$('solta');
|
|
1556
|
+
function temArq(e){var t=e.dataTransfer&&e.dataTransfer.types;return !!t&&Array.prototype.indexOf.call(t,'Files')>=0;}
|
|
1557
|
+
main.addEventListener('dragenter',function(e){if(!temArq(e))return;e.preventDefault();solta.hidden=false;});
|
|
1558
|
+
main.addEventListener('dragover',function(e){if(!temArq(e))return;e.preventDefault();if(solta.hidden)solta.hidden=false;});
|
|
1559
|
+
main.addEventListener('dragleave',function(e){if(!main.contains(e.relatedTarget))solta.hidden=true;});
|
|
1560
|
+
main.addEventListener('drop',function(e){e.preventDefault();solta.hidden=true;if(e.dataTransfer&&e.dataTransfer.files)lerArquivos(e.dataTransfer.files);});
|
|
1561
|
+
window.addEventListener('dragover',function(e){e.preventDefault();});
|
|
1562
|
+
window.addEventListener('drop',function(e){e.preventDefault();});
|
|
1563
|
+
})();
|
|
1564
|
+
|
|
1565
|
+
/* ---------- mascote segue o mouse + título digitado ---------- */
|
|
1566
|
+
function aplicaMouse(){
|
|
1567
|
+
var m=$('mascote'),o=$('olhos');
|
|
1568
|
+
if(m)m.style.transform='translate('+(mx*14).toFixed(1)+'px, '+(my*8).toFixed(1)+'px) rotate('+(mx*7).toFixed(1)+'deg)';
|
|
1569
|
+
if(o)o.setAttribute('transform','translate('+(mx*0.9).toFixed(2)+' '+(my*0.6).toFixed(2)+')');
|
|
1570
|
+
}
|
|
1571
|
+
$('app').addEventListener('mousemove',function(e){
|
|
1572
|
+
mx=Math.max(-1,Math.min(1,(e.clientX/window.innerWidth-0.55)*2.4));
|
|
1573
|
+
my=Math.max(-1,Math.min(1,(e.clientY/window.innerHeight-0.35)*2.4));
|
|
1574
|
+
aplicaMouse();
|
|
1575
|
+
});
|
|
1576
|
+
var pi=0,letras=0,apagando=false,espera=0;
|
|
1577
|
+
function palavraAtual(){var p=$('palavra');if(p)p.textContent=REDUZ?PALAVRAS[0]:PALAVRAS[pi%PALAVRAS.length].slice(0,letras);}
|
|
1578
|
+
if(!REDUZ){
|
|
1579
|
+
setInterval(function(){
|
|
1580
|
+
var alvo=PALAVRAS[pi%PALAVRAS.length];
|
|
1581
|
+
if(!apagando&&letras<alvo.length)letras++;
|
|
1582
|
+
else if(!apagando){espera++;if(espera>18){espera=0;apagando=true;}}
|
|
1583
|
+
else if(letras>0)letras--;
|
|
1584
|
+
else{apagando=false;pi++;}
|
|
1585
|
+
palavraAtual();
|
|
1586
|
+
},85);
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
/* ---------- native -> JS ---------- */
|
|
1590
|
+
function sincConta(c){
|
|
1591
|
+
if(!c)return;
|
|
1592
|
+
estado.logado=!!c.logado;estado.email=c.email||'';estado.plano=c.plano||'';estado.planoAte=c.planoAte||'';
|
|
1593
|
+
if(estado.logado&&estado.aviso&&estado.aviso.tipo==='login'){estado.aviso=null;renderAvisos();}
|
|
1594
|
+
}
|
|
1595
|
+
function pedirConversas(){if(estado.logado)post({acao:'conversas'});}
|
|
1596
|
+
var tratar={
|
|
1597
|
+
inicio:function(v){
|
|
1598
|
+
sincConta(v);
|
|
1599
|
+
if(v.pasta!=null)estado.pasta=v.pasta;
|
|
1600
|
+
if(v.modo==='chat'||v.modo==='agent')estado.modo=v.modo;
|
|
1601
|
+
renderConta();renderMenu();renderAvisos();
|
|
1602
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1603
|
+
if(estado.logado)pedirConversas();
|
|
1604
|
+
post({acao:'ajustes'});
|
|
1605
|
+
},
|
|
1606
|
+
login:function(v){
|
|
1607
|
+
sincConta(v);
|
|
1608
|
+
if(!estado.logado){estado.conversas=null;estado.conversasErro='';}
|
|
1609
|
+
renderLista();renderConta();
|
|
1610
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1611
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1612
|
+
pedirConversas();
|
|
1613
|
+
},
|
|
1614
|
+
conversas:function(v){
|
|
1615
|
+
if(!Array.isArray(v))return;
|
|
1616
|
+
var l=v.map(function(c,i){return {c:c,i:i};});
|
|
1617
|
+
l.sort(function(a,b){return (ts(b.c.atualizada)-ts(a.c.atualizada))||(a.i-b.i);});
|
|
1618
|
+
estado.conversas=l.map(function(x){return x.c;});estado.conversasErro='';
|
|
1619
|
+
renderLista();
|
|
1620
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1621
|
+
},
|
|
1622
|
+
conversas_erro:function(v){
|
|
1623
|
+
estado.conversasErro=String(v||'');renderLista();
|
|
1624
|
+
if(estado.tela==='buscar')renderResultados();
|
|
1625
|
+
},
|
|
1626
|
+
conversa:function(v){
|
|
1627
|
+
if(!v)return;
|
|
1628
|
+
estado.convId=v.id==null?null:v.id;estado.titulo=v.titulo||'';
|
|
1629
|
+
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:[]};});
|
|
1630
|
+
estado.animarDe=0;estado.esperando=false;estado.ignorando=false;estado.passos=[];estado.erro='';estado.tela='chat';
|
|
1631
|
+
renderLado();atualizaBotao();renderPrincipal();
|
|
1632
|
+
},
|
|
1633
|
+
passo:function(v){
|
|
1634
|
+
if(!estado.esperando)return;
|
|
1635
|
+
var perto=pertoDoFim();
|
|
1636
|
+
estado.passos.push(String(v));renderPassos();
|
|
1637
|
+
if(perto)rolaFim();
|
|
1638
|
+
},
|
|
1639
|
+
resposta:function(v){
|
|
1640
|
+
if(estado.ignorando){estado.ignorando=false;pedirConversas();return;}
|
|
1641
|
+
if(!v)return;
|
|
1642
|
+
estado.mensagens.push({papel:'primo',texto:String(v.texto==null?'':v.texto),midias:Array.isArray(v.midias)?v.midias:[]});
|
|
1643
|
+
if(v.conversa!=null)estado.convId=v.conversa;
|
|
1644
|
+
estado.esperando=false;estado.passos=[];estado.erro='';
|
|
1645
|
+
atualizaBotao();
|
|
1646
|
+
if(estado.tela==='chat'){renderMsgs();renderEspera();rolaFim();$('titulo').textContent=tituloTopo();}
|
|
1647
|
+
pedirConversas();
|
|
1648
|
+
},
|
|
1649
|
+
erro:function(v){
|
|
1650
|
+
var txt=String(v||'Algo deu errado.');
|
|
1651
|
+
if(estado.ignorando){estado.ignorando=false;return;}
|
|
1652
|
+
if(estado.esperando){
|
|
1653
|
+
estado.esperando=false;estado.passos=[];estado.erro=txt;atualizaBotao();
|
|
1654
|
+
if(estado.tela==='chat'&&estado.mensagens.length){renderEspera();rolaFim();}
|
|
1655
|
+
else{estado.aviso={tipo:'erro',texto:txt};renderAvisos();}
|
|
1656
|
+
}else{estado.aviso={tipo:'erro',texto:txt};renderAvisos();}
|
|
1657
|
+
},
|
|
1658
|
+
anexo:function(v){
|
|
1659
|
+
if(!v||!v.caminho)return;
|
|
1660
|
+
if(estado.anexos.some(function(a){return a.caminho===v.caminho;}))return;
|
|
1661
|
+
estado.anexos.push({nome:v.nome||v.caminho,caminho:v.caminho});renderAnexos();
|
|
1662
|
+
},
|
|
1663
|
+
skills:function(v){
|
|
1664
|
+
if(!Array.isArray(v))return;
|
|
1665
|
+
estado.skills=v.map(function(k){return {nome:String(k.nome),descricao:k.descricao||'',ligada:!!k.ligada};});
|
|
1666
|
+
if(estado.tela==='skills')renderPrincipal();
|
|
1667
|
+
},
|
|
1668
|
+
ajustes:function(v){
|
|
1669
|
+
if(!v)return;
|
|
1670
|
+
estado.ajustes=v;
|
|
1671
|
+
if(v.modo==='chat'||v.modo==='agent')estado.modo=v.modo;
|
|
1672
|
+
if(v.pasta!=null)estado.pasta=v.pasta;
|
|
1673
|
+
if(v.conta){sincConta(v.conta);renderConta();}
|
|
1674
|
+
renderMenu();
|
|
1675
|
+
if(estado.tela==='config'){
|
|
1676
|
+
var a=document.activeElement;
|
|
1677
|
+
if(a&&a.classList&&a.classList.contains('efs'))efAplica();
|
|
1678
|
+
else if(!(a&&a.closest&&a.closest('#rolagem')&&(a.tagName==='INPUT'||a.tagName==='SELECT')))renderPrincipal();
|
|
1679
|
+
}
|
|
1680
|
+
},
|
|
1681
|
+
comandos:function(v){
|
|
1682
|
+
if(!Array.isArray(v))return;
|
|
1683
|
+
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||''};});
|
|
1684
|
+
if(estado.pal.aberta||ta().value.charAt(0)==='/')atualizaPal();
|
|
1685
|
+
},
|
|
1686
|
+
saida:function(v){
|
|
1687
|
+
if(estado.ignorando){estado.ignorando=false;return;}
|
|
1688
|
+
if(!v)return;
|
|
1689
|
+
estado.mensagens.push({papel:'primo',saida:{comando:String(v.comando||''),texto:String(v.texto==null?'':v.texto),midias:Array.isArray(v.midias)?v.midias:[]}});
|
|
1690
|
+
if(v.conversa!=null)estado.convId=v.conversa;
|
|
1691
|
+
estado.esperando=false;estado.passos=[];estado.erro='';
|
|
1692
|
+
atualizaBotao();
|
|
1693
|
+
if(estado.tela==='chat'){renderMsgs();renderEspera();rolaFim();$('titulo').textContent=tituloTopo();renderLista();}
|
|
1694
|
+
},
|
|
1695
|
+
pasta:function(v){
|
|
1696
|
+
estado.pasta=String(v||'');
|
|
1697
|
+
if(estado.ajustes)estado.ajustes.pasta=estado.pasta;
|
|
1698
|
+
if(estado.tela==='config')renderPrincipal();
|
|
1699
|
+
}
|
|
1700
|
+
};
|
|
1701
|
+
window.chat=function(msg){
|
|
1702
|
+
if(!msg||typeof msg!=='object')return;
|
|
1703
|
+
Object.keys(msg).forEach(function(k){
|
|
1704
|
+
if(Object.prototype.hasOwnProperty.call(tratar,k)){
|
|
1705
|
+
try{tratar[k](msg[k]);}catch(err){post({acao:'erro',arg:String(err&&err.message||err)});}
|
|
1706
|
+
}
|
|
1707
|
+
});
|
|
1708
|
+
};
|
|
1709
|
+
|
|
1710
|
+
/* ---------- partida ---------- */
|
|
1711
|
+
renderLado();renderMenu();renderAnexos();renderAvisos();renderPrincipal();
|
|
1712
|
+
post({acao:'pronto'});
|
|
1713
|
+
|
|
1714
|
+
/* ---------- dev: so abre no navegador com ?demo ---------- */
|
|
1715
|
+
if(location.search.indexOf('demo')>=0&&!(window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.chat)){
|
|
1716
|
+
(function(){
|
|
1717
|
+
var fora=location.search.indexOf('demo=out')>=0;
|
|
1718
|
+
var convs={
|
|
1719
|
+
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).'}]},
|
|
1720
|
+
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.'}]}
|
|
1721
|
+
};
|
|
1722
|
+
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'}};
|
|
1723
|
+
function r(m,t){setTimeout(function(){window.chat(m);},t||120);}
|
|
1724
|
+
window.__demo=function(o){
|
|
1725
|
+
console.log('post',o);
|
|
1726
|
+
switch(o.acao){
|
|
1727
|
+
case 'comando':
|
|
1728
|
+
r({passo:'Lendo a pasta do projeto'},400);
|
|
1729
|
+
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);
|
|
1730
|
+
break;
|
|
1731
|
+
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);
|
|
1732
|
+
r({inicio:{logado:!fora,email:fora?'':'joel@exemplo.com',plano:'Pro',planoAte:'2026-12-31',pasta:'~/Primo',modo:'agent'}});break;
|
|
1733
|
+
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;
|
|
1734
|
+
case 'abrir':if(convs[o.id])r({conversa:convs[o.id]});break;
|
|
1735
|
+
case 'enviar':
|
|
1736
|
+
['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);});
|
|
1737
|
+
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:[
|
|
1738
|
+
{achado:'/demo/lancamento.mp4',caminho:'/demo/lancamento.mp4',nome:'lancamento.mp4',tipo:'video',url:'demo/lancamento.mp4',tamanho:12582912},
|
|
1739
|
+
{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},
|
|
1740
|
+
{achado:'/demo/site/index.html',caminho:'/demo/site/index.html',nome:'index.html',tipo:'html',url:'demo/site/index.html',tamanho:2048},
|
|
1741
|
+
{achado:'/demo/trilha.mp3',caminho:'/demo/trilha.mp3',nome:'trilha.mp3',tipo:'audio',url:'demo/trilha.mp3',tamanho:3145728},
|
|
1742
|
+
{achado:'/demo/relatorio.pdf',caminho:'/demo/relatorio.pdf',nome:'relatorio.pdf',tipo:'pdf',url:'demo/relatorio.pdf',tamanho:204800},
|
|
1743
|
+
{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));'},
|
|
1744
|
+
{achado:'/demo/site',caminho:'/demo/site',nome:'site',tipo:'pasta',url:'',tamanho:0},
|
|
1745
|
+
{achado:'/demo/dados.bin',caminho:'/demo/dados.bin',nome:'dados.bin',tipo:'arquivo',url:'demo/dados.bin',tamanho:5120}]}},3000);break;
|
|
1746
|
+
case 'anexar':r({anexo:{nome:'gravacao.mov',caminho:'/tmp/gravacao.mov'}});break;
|
|
1747
|
+
case 'soltar':r({anexo:{nome:o.nome,caminho:'/tmp/'+o.nome}});break;
|
|
1748
|
+
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;
|
|
1749
|
+
case 'skill':case 'excluir':case 'excluir_todas':break;
|
|
1750
|
+
case 'ajustes':r({ajustes:aj});break;
|
|
1751
|
+
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;
|
|
1752
|
+
case 'escolher_pasta':r({pasta:'/Users/demo/Projetos'});break;
|
|
1753
|
+
case 'entrar':r({login:{logado:true,email:'joel@exemplo.com',plano:'Pro',planoAte:'2026-12-31'}});break;
|
|
1754
|
+
case 'sair_conta':r({login:{logado:false,email:'',plano:'',planoAte:''}});break;
|
|
1755
|
+
}
|
|
1756
|
+
};
|
|
1757
|
+
if(fora)window.__demo({acao:'pronto'});else window.__demo({acao:'pronto'});
|
|
1758
|
+
})();
|
|
1759
|
+
}
|
|
1760
|
+
</script>
|
|
1761
|
+
</body>
|
|
1762
|
+
</html>
|