PageSourceSearch

https://kekedepatinete.com.br/

html kekedepatinete.com.br collected 2026-10-02 01:17:54 UTC 127,800 bytes, 1,699 lines download raw bytes

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.0">
6<title>Keke de Patinete — Guia de Hunts, Charms, RTC &amp; Roda</title>
7<meta name="description" content="Guia completo de hunts por level, ordem de charms, configs de RTC e Roda para RP, Monk e EK. Criado por @KekeDePatinete.">
8<link rel="preconnect" href="https://fonts.googleapis.com">
9<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10<link href="https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800;900&family=League+Spartan:wght@700;800;900&family=Lilita+One&family=Sora:wght@400;500;600;700;800&display=swap" rel="stylesheet">
11<link rel="icon" type="image/webp" href="/assets/logo-k.webp">
12<script>document.documentElement.classList.toggle('route-store',location.pathname==='/loja'||location.pathname.startsWith('/loja/'));</script>
vendor: 1 bytes, line 12
12
13<script src="/assets/public-html-page.js?v=2"></script>
13
14<style>
15:root{
16  --bg:#070b1c;
17  --bg2:#0d1226;
18  --card:#121831;
19  --card2:#171e3c;
20  --border:#232c52;
21  --text:#e8ebf4;
22  --muted:#9aa3bc;
23  --gold:#f0b429;
24  --gold-soft:rgba(240,180,41,.12);
25  --green:#3dd68c;
26  --red:#ff6b6b;
27  --purple:#a970ff;
28  --radius:14px;
29  /* Fluidas: crescem suavemente com a largura da tela, sem "saltos" bruscos
30     em breakpoints fixos (o que causava overflow horizontal perto de 1280px
31     e vãos grandes demais entre os banners e a tabela em telas grandes). */
32  --maxw:clamp(880px, 53vw + 289px, 1320px);
33  --railw:clamp(96px, 7.2vw + 13px, 172px);
34  --railgap:clamp(12px, 1.4vw + 6px, 26px);
35  --raile:12px;
36}
37@media(min-width:1700px){
38  html{font-size:clamp(16px, .55vw + 8.9px, 18px)}
39}
40*{margin:0;padding:0;box-sizing:border-box}
41html{scroll-behavior:smooth;width:100%;max-width:100%;overflow-x:hidden}
42body{
43  font-family:'Inter',system-ui,sans-serif;
44  background:
45    radial-gradient(900px 420px at 18% -80px, rgba(48,92,222,.14), transparent 60%),
46    radial-gradient(1200px 500px at 50% -100px, rgba(240,180,41,.08), transparent 60%),
47    radial-gradient(900px 420px at 85% -80px, rgba(255,120,40,.08), transparent 60%),
48    var(--bg);
49  color:var(--text);
50  line-height:1.5;
51  min-height:100vh;
52  display:flex;
53  flex-direction:column;
54  width:100%;max-width:100%;overflow-x:hidden;
55}
56a{color:inherit}
57
58header{
59  position:sticky;top:0;z-index:50;
60  background:rgba(7,11,28,.85);
61  backdrop-filter:blur(12px);
62  border-bottom:1px solid var(--border);
63}
64.header-inner{
65  max-width:var(--maxw);margin:0 auto;padding:12px 20px;
66  width:100%;display:flex;align-items:center;gap:16px;flex-wrap:wrap;
67}
68.brand{display:flex;align-items:center;gap:12px;text-decoration:none}
69.brand .klogo{
70  width:46px;height:46px;object-fit:contain;border-radius:12px;
71  filter:drop-shadow(0 4px 14px rgba(240,180,41,.4));
72}
73.brand h1{font-family:'Lilita One',cursive;font-size:1.1rem;letter-spacing:1px;line-height:1.2;text-transform:uppercase;
74  background:linear-gradient(180deg,#fff3c4,#f0b429 70%,#d99a12);
75  -webkit-background-clip:text;background-clip:text;color:transparent;}
76.brand h1 small{display:block;font-family:'Inter',sans-serif;font-weight:500;font-size:.7rem;color:var(--muted);letter-spacing:1.5px;text-transform:uppercase}
77.socials{margin-left:auto;display:flex;gap:10px;align-items:center}
78.home-nav{display:flex;gap:8px;align-items:center;margin-left:12px}
79.hn-btn{
80  display:flex;align-items:center;gap:6px;
81  padding:8px 14px;border-radius:10px;font-size:.82rem;font-weight:700;
82  background:var(--card);border:1px solid var(--border);color:var(--muted);
83  cursor:pointer;font-family:inherit;transition:.2s;text-decoration:none;justify-content:center;
84}
85.hn-btn:hover{color:var(--text);border-color:#39415f}
86.hn-btn.active{background:linear-gradient(135deg,rgba(240,180,41,.18),rgba(240,180,41,.06));color:var(--gold);border-color:rgba(240,180,41,.5)}
87@media(max-width:760px){
88  .header-inner{padding:12px 14px;gap:12px}
89  .home-nav{margin-left:0;order:3;width:100%;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
90  .home-nav .hn-btn:last-child{grid-column:1/-1}
91  .hn-btn{min-width:0;padding:9px 8px;font-size:.76rem;white-space:normal;text-align:center}
92}
93@media(min-width:761px) and (max-width:1699px){
94  .header-inner{gap:9px;flex-wrap:nowrap;padding:10px 16px}
95  .brand{gap:8px;flex:0 0 auto}
96  .brand .klogo{width:40px;height:40px}
97  .brand h1{font-size:.98rem}
98  .brand h1 small{font-size:.6rem;letter-spacing:1.1px}
99  .home-nav{gap:6px;margin-left:4px;min-width:0}
100  .hn-btn{padding:7px 10px;font-size:.72rem;white-space:nowrap}
101  .socials{gap:7px;flex:0 0 auto}
102  .header-inner .social-btn{padding:7px 10px;font-size:.73rem}
103}
104.social-btn{
105  display:flex;align-items:center;gap:8px;
106  padding:8px 14px;border-radius:10px;font-size:.82rem;font-weight:700;
107  text-decoration:none;border:1px solid var(--border);transition:.2s;
108}
109.social-btn.youtube{background:rgba(255,74,74,.12);color:#ff8080;border-color:rgba(255,74,74,.3)}
110.social-btn.youtube:hover{background:rgba(255,74,74,.25)}
111.social-btn.twitch{background:rgba(169,112,255,.12);color:#c7a2ff;border-color:rgba(169,112,255,.3)}
112.social-btn.twitch:hover{background:rgba(169,112,255,.25)}
113.social-btn.support{background:rgba(240,180,41,.1);color:#ffd76a;border-color:rgba(240,180,41,.32)}
114.social-btn.support:hover{background:rgba(240,180,41,.2);border-color:rgba(240,180,41,.55);color:#ffe49b}
115.social-btn.support .support-heart{font-size:1rem;line-height:1;color:#f0b429}
116
117.live-badge{
118  display:inline-flex;align-items:center;gap:7px;
119  font-size:.72rem;font-weight:600;color:var(--muted);
120  background:var(--card);border:1px solid var(--border);
121  padding:6px 12px;border-radius:99px;
122}
123.badge-row{display:flex;justify-content:center;max-width:var(--maxw);margin:14px auto 0;padding:0 20px}
124.live-badge .dot{width:8px;height:8px;border-radius:99px;background:#5b6480}
125.live-badge.live .dot{background:var(--green);box-shadow:0 0 8px var(--green);animation:pulse 2s infinite}
126.live-badge.live{color:#8fe6bd;border-color:rgba(61,214,140,.35)}
127.live-badge.err .dot{background:var(--gold)}
128.live-badge.err{color:#ffd97a;border-color:rgba(240,180,41,.35)}
129@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}
130
131.hero{
132  padding:30px 20px 26px;text-align:center;position:relative;
133  background:linear-gradient(180deg,var(--bg2),var(--bg));
134  border-bottom:1px solid var(--border);
135}
136.hero h2{font-family:'Lilita One',cursive;font-size:clamp(1.9rem,5vw,3.2rem);letter-spacing:1.5px;text-transform:uppercase;
137  background:linear-gradient(180deg,#fff8dd,#ffd95e 45%,#f0a81c 80%,#c9820a);
138  -webkit-background-clip:text;background-clip:text;color:transparent;
139  filter:drop-shadow(0 3px 0 rgba(46,26,2,.9));}
140.hero p{color:#c3cae0;max-width:640px;margin:10px auto 0;font-size:.95rem}
141
142.tabs{
143  max-width:var(--maxw);margin:28px auto 0;padding:0 20px;
144  display:flex;gap:10px;flex-wrap:wrap;justify-content:center;
145}
146.tab{
147  padding:11px 22px;border-radius:12px;cursor:pointer;
148  background:var(--card);border:1px solid var(--border);
149  font-weight:700;font-size:.92rem;color:var(--muted);
150  transition:.2s;display:flex;align-items:center;gap:8px;user-select:none;
151}
152.tab:hover{color:var(--text);border-color:#39415f}
153.tab.active{background:linear-gradient(135deg,rgba(240,180,41,.18),rgba(240,180,41,.06));color:var(--gold);border-color:rgba(240,180,41,.5)}
154.tab .beta{font-size:.62rem;background:var(--purple);color:#fff;padding:2px 6px;border-radius:6px;letter-spacing:.5px}
155
156.toolbar{max-width:var(--maxw);margin:18px auto 0;padding:0 20px;display:flex;gap:8px;flex-wrap:wrap;align-items:center;justify-content:center}
157
158.subnav{max-width:var(--maxw);margin:14px auto 0;padding:0 20px;display:flex;gap:8px;flex-wrap:wrap;justify-content:center}
159.sub-btn{
160  padding:9px 18px;border-radius:10px;cursor:pointer;
161  background:var(--card);border:1px solid var(--border);
162  font-weight:700;font-size:.85rem;color:var(--muted);
163  transition:.2s;display:flex;align-items:center;gap:7px;user-select:none;font-family:inherit;
164}
165.sub-btn:hover{color:var(--text);border-color:#39415f}
166.sub-btn.active{background:linear-gradient(135deg,rgba(240,180,41,.18),rgba(240,180,41,.06));color:var(--gold);border-color:rgba(240,180,41,.5)}
167
168.hint{max-width:var(--maxw);margin:20px auto 0;padding:0 20px;text-align:center;color:var(--muted);font-size:.9rem}
169.hint-main{
170  font-size:1.15rem;font-weight:700;margin:34px auto 10px;padding:0 20px;
171  background:linear-gradient(90deg,#fff,#ffe9b8,#ffd97a,#ffe9b8,#fff);
172  background-size:300% auto;
173  -webkit-background-clip:text;background-clip:text;color:transparent;
174  animation:hintShine 9s ease-in-out infinite;
175}
176@keyframes hintShine{0%{background-position:0% 50%}50%{background-position:150% 50%}100%{background-position:300% 50%}}
177
178.warning{
179  max-width:var(--maxw);margin:0 auto 22px;padding:18px 22px;
180  background:var(--gold-soft);border:1px solid rgba(240,180,41,.35);
181  border-radius:var(--radius);font-size:1.02rem;line-height:1.55;color:#ffd97a;
182  display:flex;gap:12px;align-items:center;justify-content:center;text-align:center;
183}
184.warning>span:first-child{font-size:1.3rem;line-height:1.3}
185.warning-text{
186  background:linear-gradient(90deg,#fff,#ffe9b8,#ffd97a,#ffe9b8,#fff);
187  background-size:300% auto;
188  -webkit-background-clip:text;background-clip:text;color:transparent;
189  animation:hintShine 9s ease-in-out infinite;
190}
191.warning-text strong{color:inherit}
192
193.soon-panel{max-width:var(--maxw);margin:10px auto 60px;padding:0 20px}
194.soon-box{
195  text-align:center;padding:70px 20px;border-radius:var(--radius);
196  background:linear-gradient(180deg,var(--card),var(--bg2));border:1px solid var(--border);
197}
198.soon-emoji{font-size:3rem;margin-bottom:10px}
199.soon-box h3{font-family:'Lilita One',cursive;color:#ffe3a0;font-size:1.4rem;margin-bottom:8px}
200.soon-box p{color:var(--muted);font-size:.9rem}
201
202.section-title,.bracket-card,.config-card{scroll-margin-top:90px}
203
204.toolbar>button{
205  padding:7px 12px;border-radius:9px;font-size:.75rem;font-weight:700;cursor:pointer;
206  background:var(--card);border:1px solid var(--border);color:var(--muted);transition:.2s;font-family:inherit;
207}
208.toolbar>button:hover{color:var(--gold);border-color:rgba(240,180,41,.4)}
209
210main{max-width:var(--maxw);margin:0 auto;padding:26px 20px 40px}
211.voc-panel{animation:fadeIn .35s ease}
212@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
213.section-title{
214  font-family:'Lilita One',cursive;font-size:1.25rem;margin:38px 0 16px;
215  display:flex;align-items:center;gap:10px;color:#ffe3a0;
216}
217.section-title::after{content:'';flex:1;height:1px;background:linear-gradient(90deg,var(--border),transparent)}
218.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:18px}
219/* A partir de 1600px sempre 3 colunas nas hunts, em vez de depender do
220   encaixe automático do auto-fill — garante o layout mesmo perto do limiar.
221   Config-grid e video-grid têm suas próprias regras fluidas (ver abaixo),
222   já que precisam se ajustar em 1, 2, 3 ou 4 colunas conforme o espaço. */
223@media(min-width:1600px){
224  .grid{grid-template-columns:repeat(3,1fr)}
225}
226.bracket-card{
227  background:linear-gradient(180deg,var(--card),var(--bg2));
228  border:1px solid var(--border);border-radius:var(--radius);
229  overflow:hidden;transition:.25s;
230}
231.bracket-card:hover{border-color:rgba(240,180,41,.35);transform:translateY(-2px);box-shadow:0 10px 30px rgba(0,0,0,.35)}
232.bracket-head{
233  padding:14px 18px;display:flex;align-items:center;gap:10px;
234  background:rgba(240,180,41,.07);border-bottom:1px solid var(--border);
235}
236.bracket-head .lvl{font-family:'Lilita One',cursive;font-weight:800;font-size:1.05rem;color:var(--gold)}
237.bracket-head .count{margin-left:auto;font-size:.72rem;color:var(--muted);background:var(--card2);padding:3px 9px;border-radius:99px;border:1px solid var(--border)}
238.hunt-list{list-style:none;padding:8px 0}
239.hunt-list li{display:flex;align-items:center;gap:10px;padding:8px 18px;font-size:.88rem;border-bottom:1px dashed rgba(37,44,69,.6)}
240.hunt-list li:last-child{border-bottom:none}
241.hunt-name{flex:1}
242.hunt-tag{margin-left:12px;margin-right:auto;font-size:.62rem;font-weight:700;padding:2px 7px;border-radius:6px;white-space:nowrap;border:1px solid transparent}
243.tag-imbue{color:#7dd3fc;background:rgba(125,211,252,.08);border-color:rgba(125,211,252,.3)}
244.tag-xp{color:#22C55E;background:rgba(34,197,94,.10);border-color:rgba(34,197,94,.42)}
245.tag-profit{color:#F5B400;background:rgba(245,180,0,.10);border-color:rgba(245,180,0,.42)}
246.tag-xpprofit{color:#3B82F6;background:rgba(59,130,246,.10);border-color:rgba(59,130,246,.42)}
247.map-link{
248  display:inline-flex;align-items:center;gap:5px;
249  font-size:.72rem;font-weight:700;text-decoration:none;
250  color:var(--gold);background:var(--gold-soft);
251  border:1px solid rgba(240,180,41,.3);padding:4px 10px;border-radius:8px;transition:.2s;white-space:nowrap;
252}
253.map-link:hover{background:rgba(240,180,41,.28)}
254.copy-preset-btn{cursor:pointer;font-family:inherit}
255.copy-preset-btn.copied{color:var(--green);background:rgba(74,222,128,.14);border-color:rgba(74,222,128,.35)}
256.no-map{font-size:.72rem;color:#525b78;font-style:italic;white-space:nowrap}
257.hunt-list li.hidden{display:none}
258.bracket-card.hidden{display:none}
259.empty-msg{display:none;text-align:center;color:var(--muted);padding:30px;font-size:.9rem}
260
261.table-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius);background:var(--card)}
262table{width:100%;border-collapse:collapse;font-size:.86rem;min-width:640px}
263th{
264  text-align:left;padding:12px 16px;font-size:.72rem;letter-spacing:1px;text-transform:uppercase;
265  color:var(--gold);background:rgba(240,180,41,.07);border-bottom:1px solid var(--border);white-space:nowrap;
266}
267td{padding:11px 16px;border-bottom:1px solid rgba(37,44,69,.5);vertical-align:top}
268tr:last-child td{border-bottom:none}
269tr:hover td{background:rgba(255,255,255,.02)}
270.ord{font-family:'Lilita One',cursive;font-weight:800;color:var(--gold)}
271.charm-name{font-weight:700}
272.obs{color:var(--muted);font-size:.8rem;max-width:420px}
273
274/* Breakpoints explícitos (como o resto do site já faz para .grid): 1 coluna
275   no celular, 2 em telas médias, 3 lado a lado a partir de telas de
276   notebook/desktop. align-items:start impede que RTC/Equipamentos sejam
277   esticados até a altura do card mais alto (Roda); cada um mantém o
278   próprio tamanho, terminando na última informação. */
279.config-grid{display:grid;grid-template-columns:1fr;gap:18px;align-items:start}
280@media(min-width:640px){.config-grid{grid-template-columns:repeat(2,1fr)}}
281@media(min-width:980px){.config-grid{grid-template-columns:repeat(3,1fr)}}
282.config-card{
283  background:linear-gradient(180deg,var(--card),var(--bg2));
284  border:1px solid var(--border);border-radius:var(--radius);padding:20px;
285}
286.config-card h4{font-family:'Lilita One',cursive;color:#ffe3a0;font-size:1rem;margin-bottom:14px;display:flex;gap:8px;align-items:center}
287.config-card ul{list-style:none}
288.config-card li{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px dashed rgba(37,44,69,.6);font-size:.87rem}
289.config-card li:last-child{border-bottom:none}
290.config-card li span{flex:1}
291
292/* Breakpoints explícitos: 1 coluna no celular, 2 em telas pequenas, 3 vídeos
293   lado a lado a partir de notebook/desktop, 4 em telas bem grandes. */
294.video-grid{display:grid;grid-template-columns:1fr;gap:18px}
295@media(min-width:520px){.video-grid{grid-template-columns:repeat(2,1fr)}}
296@media(min-width:820px){.video-grid{grid-template-columns:repeat(3,1fr)}}
297@media(min-width:1180px){.video-grid{grid-template-columns:repeat(4,1fr)}}
298.video-card{
299  display:flex;gap:14px;align-items:center;text-decoration:none;
300  background:linear-gradient(180deg,var(--card),var(--bg2));
301  border:1px solid var(--border);border-radius:var(--radius);padding:18px;transition:.25s;
302}
303.video-card:hover{border-color:rgba(255,74,74,.45);transform:translateY(-2px);box-shadow:0 10px 26px rgba(0,0,0,.35)}
304.video-card .play{
305  width:46px;height:46px;min-width:46px;border-radius:12px;
306  background:rgba(255,74,74,.14);border:1px solid rgba(255,74,74,.35);
307  display:flex;align-items:center;justify-content:center;font-size:18px;
308}
309.video-card .vt{font-weight:700;font-size:.92rem}
310.video-card .vs{font-size:.75rem;color:var(--muted);margin-top:2px}
311
312/* Banner único de patrocinador, fixo no canto — 1 card só, nunca 2,
313   adapta a posição/formato conforme o tamanho de tela e nunca tampa
314   conteúdo (largura pequena + z-index abaixo do header sticky). */
315.corner-sponsor{position:fixed;z-index:45}
316.corner-sponsor .cs-card{position:relative;border-radius:12px;overflow:hidden;border:1px solid var(--border);background:var(--card);box-shadow:0 10px 30px rgba(0,0,0,.45)}
317.corner-sponsor .cs-close{
318  position:absolute;top:5px;right:5px;z-index:6;width:20px;height:20px;border-radius:99px;
319  background:rgba(7,11,28,.75);color:#cbd2e8;border:1px solid var(--border);
320  font-size:13px;line-height:18px;text-align:center;cursor:pointer;padding:0;
321}
322.corner-sponsor .cs-close:hover{color:#fff;border-color:#39415f}
323.corner-sponsor .cs-label{text-align:center;font-size:.58rem;letter-spacing:1.4px;text-transform:uppercase;color:#5b6480;padding:5px 0 3px}
324.corner-sponsor .cs-window{position:relative;width:100%;overflow:hidden}
325.corner-sponsor .cs-window a{position:absolute;inset:0;display:block;opacity:0;transition:opacity 1.1s ease}
326.corner-sponsor .cs-window a.show{opacity:1;z-index:2}
327.corner-sponsor .cs-window img{width:100%;height:100%;object-fit:cover;display:block}
328.corner-sponsor.pos-desktop{top:126px;right:16px;width:130px;display:none}
329.corner-sponsor.pos-desktop .cs-window{aspect-ratio:4/15}
330@media(min-width:1750px){.corner-sponsor.pos-desktop{display:block;width:150px}}
331.corner-sponsor.pos-mobile{position:relative;inset:auto;width:100%;display:block;margin-top:16px}
332.corner-sponsor.pos-mobile .cs-card{width:100%;max-width:none;margin:0}
333.corner-sponsor.pos-mobile .cs-window{aspect-ratio:1152/220;max-height:none}
334.corner-sponsor.pos-mobile .cs-window img{object-fit:contain;background:#070b1c}
335.corner-sponsor.pos-mobile .cs-close{display:none}
336@media(min-width:1750px){.corner-sponsor.pos-mobile{display:none}}
337.hc-placeholder{
338  width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:13px;
339  background:linear-gradient(180deg,#1a1408,#12100a 60%,#1a1408);text-align:center;padding:18px 13px;
340}
341.hc-placeholder .coin{font-size:47px;filter:drop-shadow(0 4px 14px rgba(240,180,41,.5))}
342.hc-placeholder .hc-name{font-family:'Lilita One',cursive;font-weight:800;font-size:1.04rem;color:var(--gold);line-height:1.2}
343.hc-placeholder .hc-sub{font-size:.63rem;color:var(--muted);letter-spacing:.9px;text-transform:uppercase}
344.hc-placeholder .hc-btn{
345  margin-top:7px;padding:8px 16px;border-radius:9px;font-size:.7rem;font-weight:800;
346  background:linear-gradient(135deg,#f0b429,#c98a10);color:#181000;letter-spacing:.45px;
347}
348.el-placeholder{
349  width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:13px;
350  background:linear-gradient(180deg,#08181c,#0a2226 60%,#08181c);text-align:center;padding:18px 13px;
351}
352.el-placeholder .el-icon{font-size:41px;filter:drop-shadow(0 4px 14px rgba(56,224,201,.5))}
353.el-placeholder .el-name{font-family:'Lilita One',cursive;font-weight:800;font-size:1.04rem;color:#4be3d0;line-height:1.2}
354.el-placeholder .el-sub{font-size:.61rem;color:var(--muted);letter-spacing:.45px}
355.el-placeholder .el-btn{
356  margin-top:7px;padding:8px 16px;border-radius:9px;font-size:.7rem;font-weight:800;
357  background:linear-gradient(135deg,#38e0c9,#1a9a8a);color:#04211d;letter-spacing:.45px;
358}
359.el-horizontal{
360  width:1152px;max-width:100%;min-height:96px;display:flex;align-items:center;justify-content:center;gap:18px;
361  background:linear-gradient(90deg,#08181c,#0a2226 50%,#08181c);padding:16px 22px;flex-wrap:wrap;text-align:center;
362}
363.el-horizontal .el-icon{font-size:36px;filter:drop-shadow(0 4px 14px rgba(56,224,201,.5))}
364.el-horizontal .el-name{font-family:'Lilita One',cursive;font-weight:800;font-size:1.2rem;color:#4be3d0}
365.el-horizontal .el-sub{font-size:.7rem;color:var(--muted);letter-spacing:.5px}
366.el-horizontal .el-btn{
367  padding:9px 20px;border-radius:10px;font-size:.78rem;font-weight:800;
368  background:linear-gradient(135deg,#38e0c9,#1a9a8a);color:#04211d;letter-spacing:.5px;
369}
370.hc-horizontal{
371  width:1152px;max-width:100%;min-height:96px;display:flex;align-items:center;justify-content:center;gap:18px;
372  background:linear-gradient(90deg,#1a1408,#12100a 50%,#1a1408);padding:16px 22px;flex-wrap:wrap;text-align:center;
373}
374.hc-horizontal .coin{font-size:38px;filter:drop-shadow(0 4px 14px rgba(240,180,41,.5))}
375.hc-horizontal .hc-name{font-family:'Lilita One',cursive;font-weight:800;font-size:1.2rem;color:var(--gold)}
376.hc-horizontal .hc-sub{font-size:.7rem;color:var(--muted);letter-spacing:1px;text-transform:uppercase}
377.hc-horizontal .hc-btn{
378  padding:9px 20px;border-radius:10px;font-size:.78rem;font-weight:800;
379  background:linear-gradient(135deg,#f0b429,#c98a10);color:#181000;letter-spacing:.5px;
380}
381
382header,footer{width:100%;max-width:100vw}
383footer{border-top:1px solid var(--border);background:var(--bg2);margin-top:auto}
384.footer-inner{max-width:var(--maxw);margin:0 auto;padding:34px 20px;text-align:center;color:var(--muted);font-size:.85rem}
385.footer-inner strong{color:var(--gold)}
386.footer-inner .flinks{margin-top:12px;display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
387.footer-inner a{color:var(--text);text-decoration:none;font-weight:600}
388.footer-inner a:hover{color:var(--gold)}
389.note{margin-top:14px;font-size:.72rem;color:#5b6480}
390.note a{color:#8a93b0;font-weight:600}
391@media(max-width:640px){
392  .brand h1{font-size:.9rem}
393  .socials{margin-left:0;width:100%;justify-content:center}
394  /* Tabela de Charms: no celular a coluna "Observações" some (fica só
395     Ordem/Charm/Minor Charm) pra caber na tela sem precisar arrastar
396     pro lado. As outras seções/tabelas do site não são afetadas —
397     esse é o único <table> que existe na página. */
398  table{min-width:0;width:100%}
399  th:nth-child(4),td:nth-child(4){display:none}
400}
401
402/* ---------------- Home: carrossel + banner do último vídeo ---------------- */
403.home-section{width:100%;max-width:var(--maxw);margin:26px auto 0;padding:0 20px 8px;min-width:0}
404.carousel{
405  position:relative;border-radius:var(--radius);overflow:hidden;
406  border:1px solid var(--border);background:linear-gradient(180deg,var(--bg2),var(--bg));
407}
408.car-track{display:flex;transition:transform .5s ease}
409.car-slide{
410  min-width:100%;padding:56px 44px 46px;box-sizing:border-box;
411  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;text-align:center;min-height:280px;
412}
413.car-slide h2{
414  font-family:'Lilita One',cursive;font-size:clamp(1.7rem,4.2vw,2.7rem);letter-spacing:1px;text-transform:uppercase;
415  background:linear-gradient(180deg,#fff8dd,#ffd95e 45%,#f0a81c 80%,#c9820a);
416  -webkit-background-clip:text;background-clip:text;color:transparent;
417  filter:drop-shadow(0 3px 0 rgba(46,26,2,.9));
418}
419.car-slide p{color:#c3cae0;max-width:600px;font-size:.98rem;line-height:1.6}
420.car-btn{
421  margin-top:6px;padding:13px 30px;border-radius:11px;border:none;cursor:pointer;font-family:inherit;
422  font-weight:800;font-size:.95rem;letter-spacing:.3px;color:#181000;
423  background:linear-gradient(135deg,#f0b429,#c98a10);transition:.2s;
424}
425.car-btn:hover{filter:brightness(1.08);transform:translateY(-1px)}
426.car-note{font-size:.78rem;color:var(--muted)}
427.car-lead{margin-bottom:0}
428.home-top-five{width:min(560px,100%);display:grid;gap:5px}
429.home-rank-row{display:grid;grid-template-columns:38px minmax(0,1fr) auto;align-items:center;gap:9px;padding:7px 12px;border:1px solid rgba(106,124,183,.16);border-radius:10px;background:rgba(8,13,31,.62);color:#dce3f8;text-decoration:none;text-align:left;transition:.2s}
430.home-rank-row:hover{border-color:rgba(240,180,41,.46);transform:translateY(-1px)}
431.home-rank-row.champion{padding:10px 14px;border-color:rgba(255,203,55,.48);background:linear-gradient(90deg,rgba(240,180,41,.18),rgba(8,13,31,.72));box-shadow:0 0 22px rgba(240,180,41,.1)}
432.home-rank-position{text-align:center;font-weight:900;color:#f3c94e}
433.home-rank-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:750}
434.home-rank-row strong{color:#ffd45e;font-size:.82rem}
435.home-rank-row.champion .home-rank-name{font-size:1rem;color:#fff4bf}
436.car-action.primary{background:linear-gradient(135deg,#f0b429,#c98a10);border-color:transparent;color:#181000}
437.car-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-top:4px}
438.car-action{
439  padding:10px 18px;border-radius:10px;font-weight:700;font-size:.85rem;text-decoration:none;
440  background:var(--card2);border:1px solid var(--border);color:var(--text);transition:.2s;
441}
442.car-action:hover{border-color:rgba(240,180,41,.5);color:var(--gold)}
443.car-arrow{
444  position:absolute;top:50%;transform:translateY(-50%);width:38px;height:38px;border-radius:50%;
445  background:rgba(7,11,28,.55);border:1px solid var(--border);color:#fff;font-size:22px;line-height:1;
446  cursor:pointer;opacity:0;transition:opacity .25s,background .2s;display:flex;align-items:center;justify-content:center;
447}
448.carousel:hover .car-arrow{opacity:1}
449.car-arrow:hover{background:rgba(7,11,28,.85)}
450.car-arrow.prev{left:14px}.car-arrow.next{right:14px}
451.car-dots{display:flex;justify-content:center;gap:8px;padding:14px 0}
452.car-dot{width:20px;height:6px;border-radius:99px;border:none;cursor:pointer;background:var(--border);padding:0;transition:.2s}
453.car-dot.active{background:linear-gradient(135deg,#f0b429,#c98a10);width:28px}
454@media(max-width:640px){.car-slide{padding:44px 22px 36px}}
455
456.latest-video{
457  display:flex;align-items:center;gap:20px;margin-top:16px;flex-wrap:wrap;
458  border:1px solid var(--border);border-radius:var(--radius);padding:14px;
459  background:linear-gradient(180deg,var(--card),var(--bg2));
460}
461.lv-thumb{position:relative;flex:0 0 220px;max-width:100%;aspect-ratio:16/9;border-radius:10px;overflow:hidden;display:block}
462.lv-thumb img{width:100%;height:100%;object-fit:cover;display:block;background:#000}
463.lv-play{
464  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
465  font-size:15px;color:#fff;background:rgba(0,0,0,.32);transition:.2s;
466}
467.lv-thumb:hover .lv-play{background:rgba(0,0,0,.5)}
468.lv-play::before{content:'▶';width:46px;height:46px;border-radius:50%;background:rgba(255,59,59,.85);display:flex;align-items:center;justify-content:center;font-size:16px}
469.lv-info{flex:1;min-width:180px}
470.lv-label{font-size:.68rem;letter-spacing:1.4px;text-transform:uppercase;color:var(--muted)}
471.lv-title{font-weight:800;margin:5px 0;font-size:1rem;line-height:1.35}
472.lv-sub{font-size:.85rem;color:#c3cae0}
473.lv-btn{
474  display:inline-flex;align-items:center;gap:9px;background:#ff3b3b;color:#fff;font-weight:800;
475  padding:13px 22px;border-radius:10px;text-decoration:none;white-space:nowrap;transition:.2s;
476}
477.lv-btn:hover{background:#e22c2c}
478.lv-yticon{font-size:.8rem}
479@media(max-width:560px){.latest-video{justify-content:center;text-align:center}.lv-thumb{flex-basis:100%}.lv-btn{width:100%;justify-content:center}}
480@media(max-width:640px){
481  .home-section{padding-left:12px;padding-right:12px}
482  .carousel,.latest-video,.corner-sponsor.pos-mobile{max-width:100%}
483  .hunt-list li{flex-wrap:wrap;gap:8px}
484  .hunt-name{flex:1 1 100%}
485  .hunt-tag{margin-left:0;margin-right:auto}
486}
487
488.home-rank-label{width:min(560px,100%);display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:2px;padding:0 3px;color:#aeb9d5;font-size:.65rem;font-weight:850;letter-spacing:.9px}
489.home-rank-label strong{color:#ffd55d;font-size:.7rem}
490.home-top-five{gap:7px;padding:7px;border:1px solid rgba(240,180,41,.22);border-radius:15px;background:linear-gradient(145deg,rgba(17,24,49,.93),rgba(6,11,27,.94));box-shadow:inset 0 1px 0 rgba(255,255,255,.04),0 12px 32px rgba(0,0,0,.22)}
491.home-rank-row{border-color:rgba(100,124,187,.25);background:linear-gradient(90deg,rgba(18,27,58,.97),rgba(8,14,33,.97));box-shadow:inset 0 1px 0 rgba(255,255,255,.035)}
492.home-rank-row.champion{min-height:58px;padding:13px 15px;grid-template-columns:48px minmax(0,1fr) auto;border-color:rgba(255,203,55,.68);background:linear-gradient(90deg,rgba(128,87,4,.38),rgba(18,22,40,.98) 72%);box-shadow:inset 0 0 20px rgba(255,196,38,.09),0 0 24px rgba(240,180,41,.13)}
493.home-rank-position{position:relative;display:grid;place-items:center;line-height:1}
494.home-rank-position i{font-style:normal;font-size:1.24rem;filter:drop-shadow(0 0 6px rgba(255,204,64,.38))}
495.home-rank-position small{position:absolute;bottom:-3px;right:0;display:grid;place-items:center;min-width:17px;height:17px;padding:0 3px;border-radius:7px;background:#111936;border:1px solid rgba(255,255,255,.12);color:#fff;font-size:.52rem}
496.home-rank-row.rank-2 .home-rank-position i{filter:grayscale(1) brightness(1.65) drop-shadow(0 0 6px rgba(210,224,255,.38))}
497.home-rank-row.rank-3 .home-rank-position i{filter:sepia(1) saturate(2.2) hue-rotate(338deg) brightness(.88) drop-shadow(0 0 6px rgba(205,116,52,.38))}
498.home-rank-row.rank-2{border-color:rgba(192,207,236,.28)}
499.home-rank-row.rank-3{border-color:rgba(196,116,58,.3)}
500.home-rank-row.champion .home-rank-name{font-size:1.08rem;text-shadow:0 0 13px rgba(255,213,90,.24)}
501.home-rank-row.champion strong{font-size:.92rem}
502@media(max-width:620px){.home-rank-label{font-size:.57rem}.home-rank-label strong{font-size:.6rem}.home-rank-row.champion{min-height:54px}}
503
504
505/* Refinamento final do ranking compacto */
506.home-rank-label{justify-content:center!important;text-align:center;color:#ffd45e!important}
507.home-rank-label strong{color:#ffd45e!important;font-size:.72rem;letter-spacing:1.15px;text-shadow:0 0 12px rgba(240,180,41,.3)}
508.home-rank-position{width:48px;height:38px;justify-self:center}
509.home-rank-position i{display:block;width:30px;text-align:center;transform-origin:center}
510.home-rank-position small{left:50%;right:auto;bottom:-1px;transform:translateX(2px)}
511.home-rank-row:not(.champion) .home-rank-position{width:38px}
512
513
514/* Troféu e colocação formam um único conjunto perfeitamente centralizado */
515.home-rank-position,.home-rank-row:not(.champion) .home-rank-position{position:relative;width:42px;height:42px;justify-self:center;display:block}
516.home-rank-position i{position:absolute;
516left:50%;top:38%;width:auto;line-height:1;transform:translate(-50%,-50%);text-align:center}
517.home-rank-position small{left:50%;right:auto;bottom:1px;transform:translateX(-50%);margin:0}
518.home-rank-row.champion .home-rank-position{width:48px;height:44px}
519
520
521/* Mantém o troféu central e posiciona apenas o selo no canto inferior direito. */
522.home-rank-position small{left:auto!important;right:0!important;bottom:0!important;transform:none!important}
523
524
525/* O troféu do campeão cresce junto com o cartão, preservando o selo e a responsividade. */
526.home-rank-row.champion .home-rank-position i{font-size:clamp(1.42rem,2.15vw,1.72rem);top:36%}
527@media(max-width:620px){.home-rank-row.champion .home-rank-position i{font-size:1.38rem;top:37%}}
528
529
530/* Centralização geométrica do troféu campeão na área completa do quadrado. */
531.home-rank-row.champion .home-rank-position i{inset:0!important;width:100%!important;height:100%!important;display:grid!important;place-items:center!important;transform:none!important;line-height:1!important;padding:0 0 2px!important}
532
533</style>
534
535<style id="twitch-floating-player">
536#twitchFloat{position:fixed;right:18px;bottom:18px;z-index:9999;width:300px;max-width:calc(100vw - 32px);
537  background:#121831;border:1px solid #232c52;border-radius:14px;overflow:hidden;
538  box-shadow:0 14px 44px rgba(0,0,0,.5);transition:.3s;font-family:'Inter',sans-serif;animation:tfIn .35s ease}
539@keyframes tfIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
540#twitchFloat.off{width:190px}
541#twitchFloat .tfHead{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 12px;background:#171e3c;color:#fff}
542#twitchFloat .tfLabel{display:flex;align-items:center;gap:8px;font-weight:800;font-size:.82rem;letter-spacing:.3px;text-transform:uppercase}
543#twitchFloat .tfDot{width:9px;height:9px;border-radius:50%;background:#ff3b3b;box-shadow:0 0 9px #ff3b3b;animation:tfPulse 1.4s infinite}
544@keyframes tfPulse{0%,100%{opacity:1}50%{opacity:.3}}
545#twitchFloat.off .tfDot{background:#6b7280;box-shadow:none;animation:none}
546#twitchFloat .tfClose{background:none;border:0;color:#9aa3bc;font-size:20px;line-height:1;cursor:pointer;padding:0 2px}
547#twitchFloat .tfClose:hover{color:#fff}
548#twitchFloat iframe{display:block;width:100%;aspect-ratio:16/9;border:0;background:#000}
549#twitchFloat .tfFoot{display:block;text-align:center;padding:10px;background:#9146ff;color:#fff;font-weight:800;font-size:.8rem;letter-spacing:.3px;text-decoration:none}
550#twitchFloat .tfFoot:hover{background:#7c31e8}
551#twitchFloat .tfOffBtn{display:flex;align-items:center;gap:8px;padding:11px 16px;color:#fff;font-weight:700;font-size:.82rem;text-decoration:none}
552#twitchFloat .tfOffBtn:hover{background:#171e3c}
553@media(max-width:520px){#twitchFloat{right:12px;bottom:12px;width:min(280px,calc(100vw - 24px))}}
554</style>
555
556<link rel="stylesheet" href="/assets/beta.css?v=12">
557<link rel="stylesheet" href="/assets/channel-store.css?v=32">
558<link rel="stylesheet" href="/assets/channel-features.css?v=7">
559<link rel="stylesheet" href="/assets/premium-preview.css?v=5">
560<link rel="stylesheet" href="/assets/map-task.css?v=3">
561<link rel="stylesheet" href="/assets/hunting-places.css?v=3b81ce6dff91">
562<link rel="stylesheet" href="/assets/ux-responsive-audit.css?v=767ce1e5bc77">
563<style id="compact-single-row-header">
564/* Mantém marca, navegação e redes sociais em uma única faixa enquanto houver
565   largura útil. Os ícones têm limites próprios para não crescerem com o zoom. */
566header .header-inner{
567  width:min(1800px,calc(100vw - 24px));max-width:none;
568  display:grid;grid-template-columns:minmax(168px,auto) minmax(0,1fr) auto;
569  align-items:center;gap:clamp(5px,.7vw,14px);padding:9px 0;flex-wrap:nowrap;
570}
571header .brand{min-width:0;gap:clamp(6px,.55vw,10px)}
572header .header-inner>.brand{grid-column:1;grid-row:1}
573header .brand .klogo{flex:0 0 auto;width:clamp(36px,2.35vw,44px);height:clamp(36px,2.35vw,44px);border-radius:10px}
574header .brand h1{min-width:0;font-size:clamp(.82rem,.38vw + .55rem,1rem);letter-spacing:clamp(.35px,.08vw,1px);white-space:nowrap}
575header .brand h1 small{font-size:clamp(.51rem,.2vw + .37rem,.62rem);letter-spacing:clamp(.55px,.14vw,1.2px)}
576header .header-inner>.home-nav{grid-column:2;grid-row:1;width:auto}
577header .home-nav{display:flex;min-width:0;margin-left:0;gap:clamp(2px,.38vw,7px);justify-content:center;flex-wrap:nowrap}
578header .hn-btn{
579  min-width:0;flex:0 1 auto;gap:clamp(3px,.28vw,6px);
580  padding:7px clamp(5px,.58vw,11px);font-size:clamp(.63rem,.25vw + .46rem,.76rem);
581  line-height:1.15;white-space:nowrap;
582}
583header .hn-btn .nav-pixel-icon,header .hn-btn .nav-rubinot-brand,header .hn-btn .nav-rubini-icon{
584  flex:0 0 auto;width:clamp(18px,1.25vw,23px)!important;height:clamp(18px,1.25vw,23px)!important;
585  background-size:contain!important;
586}
587header .header-inner>.socials{grid-column:3;grid-row:1}
588header .socials{width:auto;min-width:0;margin-left:0;gap:clamp(4px,.42vw,8px);flex-wrap:nowrap}
589header .social-btn{
590  gap:5px;padding:7px clamp(7px,.55vw,11px);
591  font-size:clamp(.64rem,.24vw + .47rem,.76rem);line-height:1.15;white-space:nowrap;
592}
593header .social-btn img{flex:0 0 16px;width:16px;height:16px;object-fit:contain}
594@media(max-width:1480px){
595  header .header-inner{
596    width:min(100% - 18px,900px);grid-template-columns:minmax(0,1fr) auto;
597    grid-template-areas:"brand socials" "nav nav";gap:6px 10px;padding:7px 0;
598  }
599  header .header-inner>.brand{grid-area:brand}
600  header .header-inner>.home-nav{
601    grid-area:nav;width:100%;justify-content:flex-start;overflow-x:auto;
602    overscroll-behavior-inline:contain;scrollbar-width:none;padding-bottom:1px;
603  }
604  header .home-nav::-webkit-scrollbar{display:none}
605  header .header-inner>.socials{grid-area:socials}
606  header .hn-btn{flex:0 0 auto;padding:6px 8px;font-size:.66rem}
607  header .brand .klogo{width:36px;height:36px}
608}
609@media(max-width:520px){
610  header .header-inner{width:calc(100% - 12px);gap:5px 7px}
611  header .brand{gap:5px}
612  header .brand .klogo{width:32px;height:32px}
613  header .brand h1{font-size:.72rem;letter-spacing:.25px}
614  header .brand h1 small{font-size:.45rem;letter-spacing:.45px}
615  header .social-btn{padding:6px 7px;font-size:.61rem}
616  header .social-btn img{width:14px;height:14px;flex-basis:14px}
617  header .social-btn.support{padding-inline:8px}
618  header .social-btn.support .support-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
619}
620</style>
621  <link rel="stylesheet" href="/assets/hunting-place-suggestions.css?v=158b4ced3d1c">
622  <link rel="stylesheet" href="/assets/charm-calculator.css?v=1">
623  <link rel="stylesheet" href="/assets/imbuements.css?v=5">
624<link rel="stylesheet" href="/assets/bounty-tier-list.css">
625
626<style id="mobile-navigation-sponsor-refinement">
627.store-dropdown-disabled{display:none!important}.hn-btn.sponsor-rubini{color:#ffe69a;border-color:rgba(240,180,41,.5);background:linear-gradient(135deg,rgba(240,180,41,.17),rgba(56,43,12,.16));box-shadow:0 5px 18px rgba(240,180,41,.08)}.hn-btn.sponsor-rubini:hover{color:#fff0bc;border-color:rgba(240,180,41,.72);background:linear-gradient(135deg,rgba(240,180,41,.24),rgba(56,43,12,.2));box-shadow:0 7px 24px rgba(240,180,41,.13)}
628.mobile-nav-toggle,.mobile-nav-extra,.mobile-rubini-ticker{display:none}.mobile-nav-toggle{width:42px;height:38px;padding:8px;border:1px solid rgba(240,180,41,.35);border-radius:10px;background:rgba(18,24,49,.94);cursor:pointer;align-items:center;justify-content:center;flex-direction:column;gap:4px}.mobile-nav-toggle span{display:block;width:20px;height:2px;border-radius:99px;background:#f3ca58;transition:.2s}header.mobile-nav-open .mobile-nav-toggle span:nth-child(1){transform:translateY(6px) rotate(45deg)}header.mobile-nav-open .mobile-nav-toggle span:nth-child(2){opacity:0}header.mobile-nav-open .mobile-nav-toggle span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}
629@keyframes rubiniTickerMove{from{transform:translateX(0)}to{transform:translateX(-50%)}}
630@media(max-width:760px){header .header-inner{position:relative!important;width:calc(100% - 20px)!important;grid-template-columns:minmax(0,1fr) auto!important;grid-template-areas:"brand toggle"!important;gap:8px!important;padding:8px 0!important}header .header-inner>.brand{grid-area:brand!important;min-width:0}header .mobile-nav-toggle{display:flex;grid-area:toggle;justify-self:end}header .header-inner>.socials{display:none!important}header .header-inner>.home-nav{position:absolute!important;left:-10px!important;right:-10px!important;top:calc(100% + 1px)!important;z-index:120!important;display:none!important;width:auto!important;max-height:calc(100vh - 72px);overflow-y:auto!important;overflow-x:hidden!important;flex-direction:column!important;align-items:stretch!important;gap:6px!important;padding:10px!important;border:1px solid rgba(70,83,126,.5);border-radius:0 0 16px 16px;background:rgba(7,11,28,.985);box-shadow:0 18px 42px rgba(0,0,0,.48);backdrop-filter:blur(16px)}header.mobile-nav-open .header-inner>.home-nav{display:flex!important}header .home-nav>.hn-btn,header .home-nav>.store-menu,header .home-nav>.store-menu>.hn-btn{width:100%!important;flex:0 0 auto!important}header .home-nav .hn-btn{min-height:42px;padding:10px 12px!important;justify-content:flex-start!important;font-size:.78rem!important;text-align:left}header .store-menu{display:block!important}header .mobile-nav-extra{display:flex!important}header .mobile-nav-extra img{width:20px;height:20px;object-fit:contain}.mobile-rubini-ticker{display:block;position:relative;z-index:20;width:100%;overflow:hidden;border-bottom:1px solid rgba(240,180,41,.27);background:linear-gradient(90deg,#141626,#1d1a21,#141626);color:#ffe69a;text-decoration:none;white-space:nowrap}.mobile-rubini-ticker-track{display:flex;width:max-content;align-items:center;animation:rubiniTickerMove 13s linear infinite;will-change:transform}.mobile-rubini-ticker-item{display:inline-flex;align-items:center;gap:8px;padding:7px 26px 7px 0;font-size:.72rem;font-weight:900;letter-spacing:.3px;text-transform:uppercase}.mobile-rubini-ticker-item img{width:20px;height:20px;object-fit:contain;filter:drop-shadow(0 0 7px rgba(240,180,41,.28))}}
631@media(prefers-reduced-motion:reduce){.mobile-rubini-ticker-track{animation:none}}
632</style>
633
634<style id="unified-top-navigation">
635/* Keep the mobile menu above sticky guide controls. */
636@media(max-width:760px){body>header{z-index:110!important}}
637/* Desktop: navegação principal vira uma única faixa visual, sem caixas
638   individuais. Hover/ativo continuam perceptíveis só por cor e brilho. */
639@media(min-width:761px){
640  header .home-nav .hn-btn,
641  header .home-nav .store-menu > .hn-btn{
642    background:transparent!important;
643    border-color:transparent!important;
644    box-shadow:none!important;
645    border-radius:0!important;
646    transition:color .18s ease,text-shadow .18s ease,filter .18s ease!important;
647  }
648  header .home-nav .hn-btn:hover,
649  header .home-nav .store-menu > .hn-btn:hover{
650    background:transparent!important;
651    border-color:transparent!important;
652    box-shadow:none!important;
653    color:#f4f6ff!important;
654    text-shadow:0 0 10px rgba(206,218,255,.18);
655  }
656  header .home-nav .hn-btn.active,
657  header .home-nav .store-menu > .hn-btn.active{
658    background:transparent!important;
659    border-color:transparent!important;
660    box-shadow:none!important;
661    color:#f0b429!important;
662    text-shadow:0 0 10px rgba(240,180,41,.22);
663  }
664  header .home-nav .hn-btn.sponsor-rubini{
665    background:transparent!important;
666    border-color:transparent!important;
667    box-shadow:none!important;
668    color:#f4c84d!important;
669    font-weight:800!important;
670    text-shadow:0 0 9px rgba(240,180,41,.22);
671  }
672  header .home-nav .hn-btn.sponsor-rubini:hover{
673    color:#ffe58a!important;
674    text-shadow:0 0 13px rgba(240,180,41,.36);
675  }
676}
677
678/* One desktop row; shrink spacing and social labels before the mobile menu. */
679@media(min-width:761px){
680  body>header .header-inner{width:min(1800px,calc(100% - 24px))!important;grid-template-columns:auto minmax(0,1fr) auto!important;grid-template-areas:"brand nav socials"!important;gap:clamp(6px,.6vw,12px)!important;min-height:64px!important;height:auto!important;padding:8px 0!important;box-sizing:border-box}
681  body>header .header-inner>.brand{grid-area:brand!important}
682  body>header .header-inner>#homeNav{grid-area:nav!important;display:flex!important;flex-wrap:nowrap!important;width:100%!important;min-width:0!important;justify-content:center!important;
682gap:clamp(1px,.25vw,5px)!important;padding:0!important;overflow:visible!important;box-sizing:border-box}
683  body>header .header-inner>.socials{grid-area:socials!important;gap:5px!important;flex-wrap:nowrap!important}
684  body>header #homeNav .hn-btn{flex:0 0 auto!important;min-height:38px!important;padding:6px clamp(4px,.45vw,9px)!important;gap:4px!important;font-size:clamp(.63rem,.72vw,.86rem)!important;line-height:1.2!important;white-space:nowrap}
685  body>header #homeNav .nav-pixel-icon,body>header #homeNav .nav-rubini-icon,body>header #homeNav .nav-rubinot-brand{width:18px!important;height:18px!important;flex:0 0 18px!important}
686  body>header .social-btn{min-height:38px!important;padding:7px 9px!important;font-size:.75rem!important;white-space:nowrap}
687}
688@media(min-width:761px) and (max-width:1350px){
689  body>header .social-btn{font-size:0!important;width:36px!important;min-width:36px!important;height:36px!important;min-height:36px!important;padding:7px!important;gap:0!important;box-sizing:border-box;justify-content:center}
690  body>header .social-btn img{width:18px!important;height:18px!important;flex-basis:18px!important}
691  body>header .social-btn .support-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
692  body>header .social-btn .support-heart{font-size:17px!important}
693}
694@media(min-width:761px) and (max-width:1100px){
695  body>header .brand h1{display:none}
696  body>header .brand .klogo{width:34px!important;height:34px!important}
697  body>header #homeNav .nav-pixel-icon,body>header #homeNav .nav-rubini-icon,body>header #homeNav .nav-rubinot-brand{width:15px!important;height:15px!important;flex-basis:15px!important}
698}
699
700</style>
701
702<link id="keke-vocation-guide-css" rel="stylesheet" href="/assets/vocation-guide.css?v=b56c25f84987">
703  
703<script id="keke-vocation-guide-preload">if(location.pathname.startsWith('/guias/vocacoes')){for(const [href,as] of [['/assets/vocation-guide.js?v=b56c25f84987','script'],['/assets/vocation-guide/equipment/catalog.json','fetch']]){const link=document.createElement('link');link.rel='preload';link.href=href;link.as=as;if(as==='fetch')link.crossOrigin='anonymous';document.head.appendChild(link)}}</script>
703
704
705<style id="keke-hub-cards">
706#guidesHub,#soonPanel{width:100%!important;max-width:1480px!important;margin:28px auto 56px!important;padding:0 24px!important;box-sizing:border-box}
707#guidesHub .vg-guide-hub-box,#soonPanel .soon-box{width:100%!important;max-width:none!important;display:block!important;padding:0!important;background:transparent!important;border:0!important;box-shadow:none!important;text-align:left!important}
708#guidesHub .vg-guide-hub-icon,#soonPanel .soon-emoji{display:none!important}
709#guidesHub h2,#soonPanel .soon-box>h2{margin:0!important;color:#f4f5fb;font:900 clamp(1.7rem,2.5vw,2.15rem) 'League Spartan','Sora',sans-serif;letter-spacing:-.02em}
710#guidesHub .vg-guide-hub-box>p,#soonPanel .soon-box>p{margin:8px 0 0!important;max-width:680px!important;color:#aeb8cf!important;font-size:.9rem!important;line-height:1.6!important}
711#guidesHub .vg-guide-grid,#soonPanel .tools-grid{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:16px!important;margin-top:22px!important;width:100%}
712#guidesHub a.hub-card,#soonPanel a.hub-card{position:relative;isolation:isolate;overflow:hidden;display:flex!important;flex-direction:column;align-items:flex-start!important;gap:12px!important;min-width:0;min-height:280px;padding:20px!important;box-sizing:border-box;border:1px solid #2a3449!important;border-radius:18px!important;background:#0c1323!important;box-shadow:0 12px 32px #0002;text-align:left!important;text-decoration:none;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease!important}
713.hub-card .hub-card-preview{position:absolute;inset:0 0 auto;width:100%;height:112px;object-fit:cover;object-position:center top;opacity:.85;pointer-events:none;z-index:-1;mask-image:linear-gradient(to bottom,#000 0%,#000d 35%,transparent 100%);-webkit-mask-image:linear-gradient(to bottom,#000 0%,#000d 35%,transparent 100%)}
714#guidesHub .hub-card .vg-guide-entry-icon,#soonPanel .hub-card .tool-entry-icon{margin-top:30px!important;width:36px!important;height:36px!important;flex:0 0 36px!important;border:1px solid color-mix(in srgb,var(--hub-accent) 40%,transparent)!important;border-radius:12px!important;background:#10192deb!important;color:var(--hub-accent)!important;box-shadow:0 6px 16px #0003}
715.hub-card .hub-card-copy{display:block;min-width:0;max-width:480px}
716#guidesHub .hub-card strong,#soonPanel .hub-card strong{display:block;font:800 1.28rem 'Sora',sans-serif!important;line-height:1.3!important;letter-spacing:-.025em;color:#fff!important;text-shadow:0 2px 8px #0008}
717#guidesHub .hub-card small,#soonPanel .hub-card small{display:block;margin-top:8px!important;font-size:.84rem!important;line-height:1.55!important;color:#d2d9e8!important}
718#guidesHub .hub-card-action,#soonPanel .hub-card-action{display:flex!important;align-items:center;justify-content:space-between;width:100%;padding-top:12px;border-top:1px solid #ffffff12;margin-top:auto;color:var(--hub-accent);font-size:.78rem;font-weight:800;box-sizing:border-box}
719.hub-card-action>span{font-size:1.1rem}
720#guidesHub a.hub-card:hover,#soonPanel a.hub-card:hover{border-color:var(--hub-accent)!important;box-shadow:0 16px 36px #0004;transform:translateY(-3px)}
721#guidesHub a.hub-card:focus-visible,#soonPanel a.hub-card:focus-visible{outline:3px solid var(--hub-accent);outline-offset:4px}
722@media(min-width:1080px){#guidesHub .vg-guide-grid,#soonPanel .tools-grid{grid-template-columns:repeat(3,minmax(0,1fr))!important}}
723@media(min-width:1600px){#guidesHub .vg-guide-grid,#soonPanel .tools-grid{grid-template-columns:repeat(4,minmax(0,1fr))!important}}
724@media(max-width:680px){#guidesHub,#soonPanel{padding:0 16px!important;margin-top:24px!important}#guidesHub .vg-guide-grid,#soonPanel .tools-grid{grid-template-columns:1fr!important;gap:16px!important;margin-top:22px!important}#guidesHub a.hub-card,#soonPanel a.hub-card{padding:20px!important;min-height:260px}#guidesHub .hub-card strong,#soonPanel .hub-card strong{font-size:1.22rem!important}}
725@media(prefers-reduced-motion:reduce){#guidesHub a.hub-card,#soonPanel a.hub-card{transition:none!important;transform:none!important}}
726</style>
727
728</head>
729<body>
730<script src="/assets/premium-preview.js?v=4"></script>
730
731
732<header>
733  <div class="header-inner">
734    <a class="brand" href="/">
735      <img class="klogo" src="/assets/logo-k.webp" alt="Logo Keke de Patinete">
736      <h1>Keke de Patinete<small>Guia de Hunts &amp; Configs</small></h1>
737    </a>
738    <button class="mobile-nav-toggle" id="mobileNavToggle" type="button" aria-controls="homeNav" aria-expanded="false" aria-label="Abrir menu">
739      <span></span><span></span><span></span>
740    </button>
741    <div class="home-nav" id="homeNav">
742      <a class="hn-btn active" id="homeBtn" href="/"><span class="nav-pixel-icon icon-home" aria-hidden="true"></span>Home</a>
743      <a class="hn-btn" id="guiasBtn" href="/guias"><span class="nav-pixel-icon icon-guides" aria-hidden="true"></span>Guias</a>
744      <a class="hn-btn" id="toolsBtn" href="/ferramentas"><span class="nav-pixel-icon icon-tools" aria-hidden="true"></span>Ferramentas</a>
745      <div class="store-menu store-menu-direct" id="storeMenu">
746        <a class="hn-btn" id="storeBtn" href="/loja/painel"><span class="nav-pixel-icon icon-store" aria-hidden="true"></span>Loja do Canal</a>
747        <div class="store-dropdown store-dropdown-disabled" id="storeDropdown" hidden aria-hidden="true"></div>
748      </div>
749      <a class="hn-btn sponsor-rubini" href="/rubini-coin" target="_blank" rel="noopener sponsored"><img class="nav-rubini-icon" src="/assets/rubini-coin.gif" alt="">Compre Rubini Coins</a>
750      <a class="hn-btn" href="https://rubinot.com.br/r/KEKEDEPATINETE" target="_blank" rel="noopener sponsored"><span class="nav-rubinot-brand" aria-hidden="true"></span>Jogue Rubinot</a>
751      <a class="hn-btn mobile-nav-extra" href="https://www.youtube.com/@KekeDePatinete" target="_blank" rel="noopener"><img src="/assets/icon-youtube.svg" alt="">YouTube</a>
752      <a class="hn-btn mobile-nav-extra" href="https://twitch.tv/kekedepatinete" target="_blank" rel="noopener"><img src="/assets/icon-twitch.svg" alt="">Twitch</a>
753      <a class="hn-btn mobile-nav-extra" href="https://livepix.gg/kekedepatinete" target="_blank" rel="noopener"><span class="support-heart" aria-hidden="true">♥</span>Apoie o projeto</a>
754    </div>
755    <div class="socials">
756      <a class="social-btn youtube" href="https://www.youtube.com/@KekeDePatinete" target="_blank" rel="noopener"><img src="/assets/icon-youtube.svg" alt="">YouTube</a>
757      <a class="social-btn twitch" href="https://twitch.tv/kekedepatinete" target="_blank" rel="noopener"><img src="/assets/icon-twitch.svg" alt="">Twitch</a>
758      <a class="social-btn support" href="https://livepix.gg/kekedepatinete" target="_blank" rel="noopener" aria-label="Apoie o projeto pelo Livepix"><span class="support-heart" aria-hidden="true">♥</span><span class="support-label">Apoie o projeto</span></a>
759    </div>
760  </div>
761</header>
762<a class="mobile-rubini-ticker" href="/rubini-coin" target="_blank" rel="noopener sponsored" aria-label="Compre Rubini Coins"><span class="mobile-rubini-ticker-track"><span class="mobile-rubini-ticker-item"><img src="/assets/rubini-coin.gif" alt="">Compre Rubini Coins</span><span class="mobile-rubini-ticker-item"><img src="/assets/rubini-coin.gif" alt="">Compre Rubini Coins</span><span class="mobile-rubini-ticker-item"><img src="/assets/rubini-coin.gif" alt="">Compre Rubini Coins</span><span class="mobile-rubini-ticker-item"><img src="/assets/rubini-coin.gif" alt="">Compre Rubini Coins</span></span></a>
763<script>(()=>{const h=document.querySelector('header'),t=document.getElementById('mobileNavToggle'),n=document.getElementById('homeNav');if(!h||!t||!n)return;const c=()=>{h.classList.remove('mobile-nav-open');t.setAttribute('aria-expanded','false');t.setAttribute('aria-label','Abrir menu')};t.addEventListener('click',e=>{e.stopPropagation();const o=!h.classList.contains('mobile-nav-open');h.classList.toggle('mobile-nav-open',o);t.setAttribute('aria-expanded',String(o));t.setAttribute('aria-label',o?'Fechar menu':'Abrir menu')});n.addEventListener('click',e=>{if(e.target.closest('a'))c()});document.addEventListener('click',e=>{if(!h.contains(e.target))c()});document.addEventListener('keydown',e=>{if(e.key==='Escape')c()});window.addEventListener('resize',()=>{if(innerWidth>760)c()})})();</script>
763
764
765
766<section class="home-section" id="homeSection">
767  <div class="carousel" id="carousel">
768    <div class="car-track" id="carTrack">
769      <div class="car-slide car-community-slide">
770        <h2>Keke de Patinete</h2>
771        <p class="car-lead">A comunidade que transforma suas horas nas lives em progresso, baús e recompensas.</p>
772        <div class="home-rank-label"><strong>RANKING DA COMUNIDADE</strong></div><div class="home-ranking-preview home-top-five" id="homeRankingPreview" aria-live="polite">Carregando TOP 3 de horas…</div>
773        <div class="car-actions"><a class="car-action primary" href="/loja/painel">Ver meu painel</a></div>
774      </div>
775      <div class="car-slide">
776        <h2>Guias</h2>
777        <p>Encontre configurações de RTC, Roda de Habilidades, sugestões de hunts e conteúdos para evoluir seu personagem.</p>
778        <div class="car-actions"><a class="car-action primary" href="/guias">Explorar guias</a></div>
779      </div>
780      <div class="car-slide">
781        <h2>Ferramentas</h2>
782        <p>Utilidades para o RubinOT, incluindo otimizador de charms, Bounty Task, calculadora de imbuements e muito mais.</p>
783        <div class="car-actions"><a class="car-action primary" href="/ferramentas">Explorar ferramentas</a></div>
784      </div>
785      <div class="car-slide">
786        <h2 id="homeRaffleTitle">Sorteios da Comunidade</h2>
787        <p id="homeRaffleDescription">Participe dos sorteios semanais e mensais de Rubini Coins e acompanhe os vencedores.</p>
788        <div class="car-actions"><a class="car-action" href="/loja/sorteios">Ver sorteios</a></div>
789      </div>
790      <div class="car-slide">
791        <h2>Baús &amp; KEKE Coins</h2>
792        <p>Assista às lives oficiais, receba Baús Twitch, Twitch Sub e YouTube e acumule KEKE Coins.</p>
793        <div class="car-actions"><a class="car-action" href="/loja/inventario">Ver recompensas dos baús</a></div>
794      </div>
795    </div>
796    <button type="button" class="car-arrow prev" id="carPrev" aria-label="Slide anterior">‹</button>
797    <button type="button" class="car-arrow next" id="carNext" aria-label="Próximo slide">›</button>
798    <div class="car-dots" id="carDots"></div>
799  </div>
800
801  <nav class="home-quicklinks" aria-label="Acessos principais">
802    <a class="home-quicklink" href="/guias"><span class="home-quicklink-icon" aria-hidden="true">📚</span><span><strong>Guias por vocação</strong><small>Hunts, configurações, RTC e Roda em um só lugar.</small></span></a>
803    <a class="home-quicklink" href="/ferramentas"><span class="home-quicklink-icon" aria-hidden="true">🧰</span><span><strong>Ferramentas RubinOT</strong><small>Mapa Task, Hunting Places e Calculadora de Charm.</small></span></a>
804    <a class="home-quicklink" href="/loja/painel"><span class="home-quicklink-icon" aria-hidden="true">🎁</span><span><strong>Recompensas da comunidade</strong><small>Acompanhe baús, KEKE Coins, resgates e sorteios.</small></span></a>
805  </nav>
806
807  <div class="latest-video" id="latestVideo" style="display:none">
808    <a class="lv-thumb" id="lvThumbLink" href="https://www.youtube.com/watch?v=sdb25p2Fhbo" target="_blank" rel="noopener">
809      <img id="lvThumbImg" src="https://i.ytimg.com/vi/sdb25p2Fhbo/hqdefault.jpg" alt="Último vídeo do canal Keke de Patinete">
810      <span class="lv-play"></span>
811    </a>
812    <div class="lv-info">
813      <div class="lv-label">Último vídeo lançado</div>
814      <div class="lv-title" id="lvTitle">MELHORES HUNTS DE PALADIN 300 AO 600 PARA XP &amp; PROFIT | Rubinot</div>
815      <div class="lv-sub">Assista agora e já deixa o like &lt;3</div>
816    </div>
817    <a class="lv-btn" id="lvBtn" href="https://www.youtube.com/watch?v=sdb25p2Fhbo" target="_blank" rel="noopener">
818      <span class="lv-yticon">▶</span> Assistir Agora
819    </a>
820  </div>
821
822</section>
823
824
825
826<section id="guidesHub" class="vg-guide-hub" hidden>
827  <div class="vg-guide-hub-box">
828    <div class="vg-guide-hub-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 5.5A2.5 2.5 0 0 1 6.5 3H11v16H6.5A2.5 2.5 0 0 0 4 21.5Z"/><path d="M20 5.5A2.5 2.5 0 0 0 17.5 3H13v16h4.5a2.5 2.5 0 0 1 2.5 2.5Z"/></svg></div>
829    <h2>Guias Keke de Patinete</h2>
830    <p>Da próxima hunt à sua build: encontre o guia certo para cada etapa do jogo.</p>
831    <div class="vg-guide-grid">
832      <a class="vg-guide-entry hub-card" href="/guias/planilha" style="--hub-accent:#e9bf62"><img class="hub-card-preview" src="/assets/hub-previews/planilhas.webp?v=0c31ad0b92c3" alt="" loading="eager" decoding="async" aria-hidden="true"><span class="vg-guide-entry-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 3.5h14v17H5z"/><path d="M5 8h14M9.5 8v12.5M14.5 8v12.5M5 12.5h14M5 16.5h14"/></svg></span><span class="hub-card-copy"><strong>Planilhas de Hunts</strong><small>Encontre hunts por vocação e nível, com prioridades, configurações e vídeos para planejar sua evolução.</small></span><span class="hub-card-action">Explorar planilhas<span aria-hidden="true">↗</span></span></a>
833      <a class="vg-guide-entry hub-card" href="/guias/vocacoes" style="--hub-accent:#bd9aff"><img class="hub-card-preview" src="/assets/hub-previews/vocacoes.webp?v=f154b5aaafd2" alt="" loading="eager" decoding="async" aria-hidden="true"><span class="vg-guide-entry-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="7" r="3"/><path d="M6.5 21v-4.2A5.5 5.5 0 0 1 12 11.3a5.5 5.5 0 0 1 5.5 5.5V21"/><path d="m4 12 2.2 1.1M20 12l-2.2 1.1"/></svg></span><span class="hub-card-copy"><strong>Guia de Vocações</strong><small>
833Escolha sua vocação e level para consultar equipamentos, Roda de Habilidades e RTC em um só lugar.</small></span><span class="hub-card-action">Encontrar minha build<span aria-hidden="true">↗</span></span></a>
834    </div>
835  </div>
836</section>
837
838<nav class="tabs" id="tabs" style="display:none"></nav>
839
840<nav class="subnav" id="subnav" style="display:none"></nav>
841
842<div class="toolbar" id="toolbar" style="display:none"></div>
843
844<div id="hint" class="hint"></div>
845<div id="guideLoadStatus" class="guide-load-status" role="status" aria-live="polite" hidden></div>
846
847<main id="main" style="display:none"></main>
848
849<div id="soonPanel" class="soon-panel" style="display:none">
850  <div class="soon-box">
851    <div class="soon-emoji" aria-hidden="true"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4 8.5h16v10.2a1.8 1.8 0 0 1-1.8 1.8H5.8A1.8 1.8 0 0 1 4 18.7Z"/><path d="M8 8.5V6.8A2.8 2.8 0 0 1 10.8 4h2.4A2.8 2.8 0 0 1 16 6.8v1.7"/><path d="M4 12.2h16"/><path d="M10.5 11.4h3v2.2h-3z"/></svg></div>
852    <h2>Ferramentas RubinOT</h2>
853    <p>Explore mapas, compare opções e planeje sua próxima caçada.</p>
854    <div class="tools-grid">
855      <a class="tool-entry-card hub-card" href="/ferramentas/mapa-task" style="--hub-accent:#68d3ac"><img class="hub-card-preview" src="/assets/hub-previews/mapa-task.webp?v=3696885bd373" alt="" loading="eager" decoding="async" aria-hidden="true"><span class="tool-entry-icon" aria-hidden="true"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 6.5 8.5 4l7 2.5 5-2.5v13.5l-5 2.5-7-2.5-5 2.5Z"/><path d="M8.5 4v13.5M15.5 6.5V20"/></svg></span><span class="hub-card-copy"><strong>Mapa Task + Item Tasks</strong><small>Localize criaturas e respawns no mapa. Consulte os itens das tasks e descubra onde buscar cada drop.</small></span><span class="hub-card-action">Explorar o mapa<span aria-hidden="true">↗</span></span></a>
856      <a class="tool-entry-card hub-card" href="/ferramentas/hunting-places" style="--hub-accent:#83bcff"><img class="hub-card-preview" src="/assets/hub-previews/hunting-places.webp?v=294da1a2dbe5" alt="" loading="eager" decoding="async" aria-hidden="true"><span class="tool-entry-icon" aria-hidden="true"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="m15.7 8.3-2.2 5.2-5.2 2.2 2.2-5.2Z"/><path d="M12 2v2M22 12h-2M12 22v-2M2 12h2"/></svg></span><span class="hub-card-copy"><strong>Hunting Places</strong><small>Compare hunts por level, experiência e profit. Veja o caminho até a hunt e o circuito dentro do respawn.</small></span><span class="hub-card-action">Encontrar uma hunt<span aria-hidden="true">↗</span></span></a>
857      <a class="tool-entry-card hub-card" href="/ferramentas/charm-calculator" style="--hub-accent:#d5a0fa"><img class="hub-card-preview" src="/assets/hub-previews/charm.webp?v=f38557990e53" alt="" loading="eager" decoding="async" aria-hidden="true"><span class="tool-entry-icon" aria-hidden="true"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="m12 3 6.5 3.7v7.5L12 18l-6.5-3.8V6.7Z"/><path d="m12 6.2-2.1 4.1h3.1l-1 3.5 3-5h-3.2Z"/></svg></span><span class="hub-card-copy"><strong>Calculadora de Charm</strong><small>Cole seu Hunt Analyzer ou adicione criaturas para comparar charms e montar a combinação para sua caçada.</small></span><span class="hub-card-action">Calcular meus charms<span aria-hidden="true">↗</span></span></a>
858      <a class="tool-entry-card hub-card" href="/ferramentas/imbuements" style="--hub-accent:#f0ba79"><img class="hub-card-preview" src="/assets/hub-previews/imbuements.webp?v=e32d4896e05a" alt="" loading="eager" decoding="async" aria-hidden="true"><span class="tool-entry-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3 18.5 6.7v7.5L12 18l-6.5-3.8V6.7Z"/><path d="M9 8.5h6M8.2 11.5h7.6M10 14.5h4"/></svg></span><span class="hub-card-copy"><strong>Imbuements</strong><small>Confira efeitos e materiais de cada imbuement. Compare os custos do Market e dos Gold Tokens antes de comprar.</small></span><span class="hub-card-action">Comparar custos<span aria-hidden="true">↗</span></span></a>
859    </div>
860  </div>
861</div>
862
863<section id="mapTaskPanel" class="map-task-panel" style="display:none" aria-live="polite"></section>
864
865<section id="vocationGuidePanel" class="vocation-guide-panel" aria-live="polite"></section>
866
867<section id="huntingPlacesPanel" class="hunting-places-panel" style="display:none" aria-live="polite"></section>
868
869<section id="charmCalculatorPanel" class="charm-calculator-panel" style="display:none" aria-live="polite"></section>
870
871<section id="imbuementsPanel" class="imbuements-panel" style="display:none" aria-live="polite"></section>
872
873<section id="bountyTierPanel" class="bounty-tier-panel" style="display:none" aria-live="polite"></section>
874
875<section id="channelStore" class="channel-store" hidden aria-live="polite"></section>
876
877<footer>
878  <div class="footer-inner">
879    <div class="footer-signature"><strong>Keke de Patinete</strong><span>Comunidade, lives e guias para evoluir no jogo.</span></div>
880    <div class="flinks">
881      <a href="https://www.youtube.com/@KekeDePatinete" target="_blank" rel="noopener"><img src="/assets/icon-youtube.svg" alt="">YouTube</a>
882      <a href="https://twitch.tv/kekedepatinete" target="_blank" rel="noopener"><img src="/assets/icon-twitch.svg" alt="">Twitch</a>
883    </div>
884    <div class="footer-copy">© Keke de Patinete · Todos os direitos reservados.</div>
885  </div>
886</footer>
887
888<script>
889
890const YT_CHANNEL_ID = "UC9cf5qu2UgQ50SlwjrqxuPQ"; // @KekeDePatinete (para o banner "último vídeo")
891/* Arquivo público completo da planilha oficial. Ele é baixado somente quando
892   a pessoa entra em Guias e preserva inclusive os hyperlinks das células. */
893const LIVE_GUIDES_URL = "https://docs.google.com/spreadsheets/d/18UuTX5hf284_ML0-pGz-9dkVSwEASbtaevbQwKSfb3o/export?format=xlsx";
894let guideReaderPromise=null;
895function ensureGuideReader(){
896  if(window.XLSX)return Promise.resolve(window.XLSX);
897  if(guideReaderPromise)return guideReaderPromise;
898  guideReaderPromise=new Promise((resolve,reject)=>{
899    const script=document.createElement('script');
900    script.src='/assets/xlsx.full.min.js';
901    script.async=true;
902    script.onload=()=>window.XLSX?resolve(window.XLSX):reject(new Error('leitor de planilhas indisponível'));
903    script.onerror=()=>reject(new Error('não foi possível carregar o leitor de planilhas'));
904    document.head.appendChild(script);
905  });
906  return guideReaderPromise;
907}
908
909/* ============================================================
910   [KEKE:SHEET-SNAPSHOT] — CÓPIA DE SEGURANÇA DA PLANILHA OFICIAL
911   Estes dados aparecem imediatamente e continuam disponíveis caso a
912   atualização pública do Google não possa ser carregada.
913
914   Como atualizar quando o Keke enviar uma planilha nova (.xlsx):
915   - Abas esperadas: uma por vocação (ex.: "RP", "Monk", "EK (Beta)")
916     com blocos "Level N+" → lista de hunts (nome, link do mapa,
917     tag opcional entre parênteses: Experiência / Profit / XP + Profit /
918     Profit Imbue), uma tabela de "Runas por Prioridade" → "Ordem"
919     (charm, minor charm, observação), e cards de "RTC"/"RODA"/
920     "Equipamentos" (label, link, preset opcional).
921   - Também uma aba de vídeos com coluna "Tema" + link.
922   - Regenerar este objeto (SNAPSHOT) inteiro a partir da planilha
923     nova, mantendo exatamente esta mesma estrutura de chaves
924     (vocs[].brackets[].hunts, charms, configs, videos, attention).
925   ============================================================ */
926const SNAPSHOT={"vocs":[{"key":"voc0","sheetName":"RP","icon":"🏹","label":"Paladin","beta":false,"brackets":[{"lvl":"0+","hunts":[["Cyclops Thais","https://www.youtube.com/watch?v=Sb0TqL_TCHg","XP"],["Corym","https://www.youtube.com/watch?v=SARRCqv3Bs8","XP"],["Stonerefiner","https://www.youtube.com/watch?v=T8vcncPxnOc","XP/Profit"],["Orc Fortress (Profit Imbue)","https://www.youtube.com/watch?v=MAp7QMhLt2s","Profit"],["Elfos Yalahar (Profit Imbue)","https://www.youtube.com/watch?v=1E8YKhLMmmQ","Profit"],["Cults Yalahar (Profit Imbue)","https://www.youtube.com/watch?v=jOqPmuK4Xt0","Profit"],["Tarantula (Profit Imbue)","https://www.youtube.com/watch?v=mZMdsVI-uTA","Profit"]]},{"lvl":"100+","hunts":[["Putrid Mummy","https://www.youtube.com/watch?v=thXQ_L_ugC0","XP/Profit"],["Exotic Cave","https://www.youtube.com/watch?v=kYqDUZYQbWA","XP/Profit"],["Grimvale (Primeiros Andares)","https://www.youtube.com/watch?v=1S4IqV6HMis","XP"],["Mino Oramond (Campo)","https://www.youtube.com/watch?v=3id3WCAk_XY","XP"],["Boquinha Feyrist","https://www.youtube.com/watch?v=7BWHSzRZHAU","Profit"],["Insectoids","https://www.youtube.com/watch?v=NYVuKQe_1U4","XP/Profit"],["Hero Cave","https://www.youtube.com/watch?v=GKy9qB0wKhg","XP"],["GS Krailos","https://www.youtube.com/watch?v=Btdtwz92HoY","XP"],["Nightmare Krailos","https://www.youtube.com/watch?v=EkcUWv0FrVw","XP"],["Horestis Tomb","https://www.youtube.com/watch?v=mps62zB4M00","XP/Profit"]]},{"lvl":"200+","hunts":[["Minotauros Oramond (Montanha)","https://www.youtube.com/watch?v=iYGZxfMk2gk","XP"],["Invasão Minos","https://www.youtube.com/watch?v=OvP95nnv-jA","XP"],["Invasão Quaras (Oramond West)","https://www.youtube.com/watch?v=K2aQgXRz92E","XP"],["Wyrm Drefia","https://www.youtube.com/watch?v=GlChAeT9LLg","XP"],["Werehyaenas","https://www.youtube.com/watch?v=G0E2eiQGAlo","XP/Profit"],["Pirats","https://www.youtube.com/watch?v=8kwsJLPuvmQ","XP/Profit"],["Glooth Tower","https://www.youtube.com/watch?v=nU03K9MRi7Q","XP/Profit"],["Glooth Bandit","https://www.youtube.com/watch?v=vOUSZAhGqHI","Profit"],["Medusa Tower","https://www.youtube.com/watch?v=9v5OTRmuOVs","XP/Profit"],["Grimvale (Últimos Andares)","https://www.youtube.com/watch?v=9gSnt_oZO1g","XP/Profit"]]},{"lvl":"300+","hunts":[["Asura Palace","https://www.youtube.com/watch?v=ia30DJXcK54","XP"],["Werelion","https://youtu.be/-nBODgPvX5c?si=ardvCleSGyeZsjF_","XP"],["Grim Reaper Drefia","https://www.youtube.com/watch?v=n-nfv_NnJMs","XP"],["Mino Cult","https://www.youtube.com/watch?v=oE5_8x1RBAQ","XP/Profit"],["Banuta","https://www.youtube.com/watch?v=KzRGD7X4Z6o","XP/Profit"],["Lower Roshamuul","https://www.youtube.com/watch?v=pJVLxvBqNCE","XP"],["Behemoth Invasion (Oramond)","https://www.youtube.com/watch?v=m2seVKsMBkU","XP"],["War Golem Invasion (Oramond)","https://www.youtube.com/watch?v=ieNT5CRITqE","XP/Profit"],["Draken Walls","https://www.youtube.com/watch?v=2ThiEXCLojk","XP/Profit"],["Fury Oramond","https://www.youtube.com/watch?v=c_3g2FbDfjI","Profit"]]},{"lvl":"400+","hunts":[["Elfo de Fogo","https://www.youtube.com/watch?v=wFr632Gh4h4","XP/Profit"],["Elfo de Gelo","https://www.youtube.com/watch?v=L68Zi_bDGbs","XP"],["Marapur Turtles","https://www.youtube.com/watch?v=RlfvLs508Jo","Profit"],["Werecrocodiles","https://www.youtube.com/watch?v=h6XILhDCw0E","XP"],["Weretigers","https://www.youtube.com/watch?v=h6XILhDCw0E","XP/Profit"],["Catacombs","https://www.youtube.com/watch?v=f622rcVZ0pE","XP"],["Warzone 5","https://www.youtube.com/watch?v=yVb6pERCFr4","XP"],["Warzone 6","https://www.youtube.com/watch?v=RRv5bj2hBNY","XP"],["Candia (Bocão Doce)","https://www.youtube.com/watch?v=3KfiNODPXrc","Profit"],["Nightmare Isles","https://www.youtube.com/watch?v=25XX4Lo2_fg","XP/Profit"],["MoTA (-1 / -2)","https://www.youtube.com/watch?v=w02oiI0rmmk","XP/Profit"],["Crypt Warriors","https://www.youtube.com/watch?v=yqWl0V1xj74","XP"],["Zao Palace","https://www.youtube.com/watch?v=dtRLJnoMr0o","XP/Profit"],["Ripper Spectres","https://www.youtube.com/watch?v=MFVwYrwkIMY","XP"],["Asura Mirror","https://www.youtube.com/watch?v=ia30DJXcK54","XP/Profit"]]},{"lvl":"500+","hunts":[["Bashmu","https://www.youtube.com/watch?v=0SkdEe0Y6rQ","Profit"],["Deathlings","https://www.youtube.com/watch?v=5FU208gw9nQ","XP"],["Demon (Oramond)","https://www.youtube.com/watch?v=o1NYtz-qLhs","XP"],["North DP Roshamuul","https://www.youtube.com/watch?v=_oLXumhPsOE","XP/Profit"],["Roshamuul West (Bocão)","https://www.youtube.com/watch?v=3Au2GIF0MzA","XP/Profit"],["DT Seal (Inquisition)","https://www.youtube.com/watch?v=TmLRxUMinYs","Profit"],["Mitmah","https://www.youtube.com/watch?v=woiMt1hDZLE","XP/Profit"],["GT","https://www.youtube.com/watch?v=-5L27b-Wiy4","Profit"],["Alminha (Venore)","https://www.youtube.com/watch?v=CDBRyb03Qh4","XP"],["Undead Dragons (Oramond)","https://www.youtube.com/watch?v=Zw5vFuZmPuM","Profit"],["Warzone 2","https://www.youtube.com/watch?v=OcpWWh3BsYE","XP/Profit"],["Warzone 3","https://www.youtube.com/watch?v=kuKHMQy14Gk","XP/Profit"],["Tubarão Roshamuul","https://www.youtube.com/watch?v=wT11p7A3yuY","XP/Profit"],["Buried Cathedral","https://www.youtube.com/watch?v=pFPwVYJZrTQ","XP"],["Nagas","https://www.youtube.com/watch?v=iBQ6NAugTWk","XP"]]},{"lvl":"600+","hunts":[["Goanas Issavi","https://www.youtube.com/watch?v=d2hrejHhBBw","XP"],["Bueiro Issavi","https://www.youtube.com/watch?v=FeogBQ5JTdw","XP"],["Cachoeira Issavi","https://www.youtube.com/watch?v=8DLdU37w9po","XP"],["Caminho Ferumbras","https://www.youtube.com/watch?v=JxpiDBRpslg","Profit"],["DT Ferumbras","https://www.youtube.com/watch?v=1ta09q1zRLk","Profit"],["War Dragon Zao","https://www.youtube.com/watch?v=LWPRGt9B3f0","XP"]]},{"lvl":"700+","hunts":[["Falcon Bastion","https://www.youtube.com/watch?v=MEuKHBZ_2z8","XP/Profit"],["Falcon Castelo","https://www.youtube.com/watch?v=y8yNDxTVZTU","XP/Profit"],["Cobra Bastion","https://www.youtube.com/watch?v=pEmITe9o0mY","XP"],["Alminha Venore (-1/-2)","https://www.youtube.com/watch?v=CDBRyb03Qh4","XP"],["Escadão Ferumbras","https://www.youtube.com/watch?v=2RRS-hft1Uo","Profit"],["Pumin -1 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["Pumin -3 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["Selo de fogo Ferumbras","https://www.youtube.com/watch?v=4hivnhuFiN8","XP/Profit"],["Undead Ferumbras","https://www.youtube.com/watch?v=iPitUipIHcs","XP/Profit"],["Inferniach","https://www.youtube.com/watch?v=Z4DeD6y9dk0","XP"]]},{"lvl":"800+++","hunts":[["Plague Seal Ferumbras","https://www.youtube.com/watch?v=dV4jecLpNzc","XP/Profit"],["Pumin -2 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["True Asura (cuidado!)","https://www.youtube.com/watch?v=gDcU4zmrtnE","XP/Profit"],["Warzone 7","https://www.youtube.com/watch?v=YXc2-sH36c0","Profit"],["Jugger Seal Ferumbras","https://www.youtube.com/watch?v=8SyxjamYMZw","XP/Profit"],["Girtabilu (começa a ficar OK)","https://www.youtube.com/watch?v=O-FxAso878s","Profit"],["Alminha Venore -3","https://www.youtube.com/watch?v=CDBRyb03Qh4","XP"]]}],"charms":[["1.","Wound","Fatal Hold","Personagens 1000+ com arma BIS, pode liberar low blow & savage blow como primeiras runas (Abrindo mão da diversidade de runas por dano bruto)"],["2.","Freeze","Vampiric Embrace","RP precisa de muito nível para tirar 100% proveito da overflux e overpower"],["3.","Zap","Void's Call","As 4 primeiras runas pode liberar nivel 1, e depois focar em upar nível 2"],["4.","Divine","Gut","Fatal Hold é CORE para caçar dark torturer"],["5.","Poison","Void Inversion",""],["6.","Enflame","Adrenaline Burst",""],["7.","Curse","",""],["8.","Low Blow","",""],["9.","Savage Blow","",""],["10.","Overflux","",""],["11.","Overpower","",""]],"configs":[{"title":"🎯 RTC","items":[["Cura","https://prnt.sc/71YXku0pKTcX","RTC-1.57250.7,135,0,5,Fisico|303,1,8,1,0,0,0,2;303,1,1,2,0,0,0,0;258,1,10,3,0,0,0,2;124,1,4,4,0,0,0,0;302,1,1,5,0,0,0,0|36,85;125,95;2,99|0,1,6,0;0,1,7,0|23374,50,1;7642,65,1;53162,70,0|0,0;0,0|0,0;0,0|11,90,0|6,1,1"],["Holy (Situacional)","https://prnt.sc/ysp_1hzR52S8","RTC-1.47985.7,314,0,5,Holy|302,1,6,1,0,0,0,2;302,1,1,2,0,0,0,0;124,1,1,3,0,0,0,0;0,5,1,4,0,0,0,0;0,5,1,5,0,0,0,0|36,85;125,95;2,99|0,1,6,0;0,1,7,0|23374,50,1;7642,65,1;53162,70,0|0,0;0,0|0,0;0,0|11,90,0|6,1,1"],["Fisico + Granada (ATK)","https://prnt.sc/mCzkclPRneX
926M","RTC-1.57250.7,135,0,5,Fisico|303,1,8,1,0,0,0,2;303,1,1,2,0,0,0,0;258,1,10,3,0,0,0,2;124,1,4,4,0,0,0,0;302,1,1,5,0,0,0,0|36,85;125,95;2,99|0,1,6,0;0,1,7,0|23374,50,1;7642,65,1;53162,70,0|0,0;0,0|0,0;0,0|11,90,0|6,1,1"]]},{"title":"☸️ RODA","items":[["Level 100","https://prnt.sc/jrd58B__GTEq",null],["Level 150","https://prnt.sc/ejMgNY3iMbzd",null],["Level 275","https://prnt.sc/88UpM8ZQ1nZ6",null],["Level 375","https://prnt.sc/cUrRWRdBafJN",null],["Level 500","https://prnt.sc/IY9CgThPRFie",null],["Level 675 (Fisico)","https://prnt.sc/fDSUYK2kLOVw",null],["Level 775 (Fisico + Gema Granada)","https://prnt.sc/vVO-Dv1iwPGD",null],["Level 975 (Fisico + Gema Granada)","https://prnt.sc/e4LsPbOnp900",null],["Level 1300 (Fisico + Gema Granada)","https://prnt.sc/MBKfRKGYQjoS",null],["Level 800 (Holy)","https://prnt.sc/x11qTITm12dj",null],["Level 1125 (Holy)","https://prnt.sc/3_C7d20npigC",null]]},{"title":"🛡️ Guia Equipamentos RP","items":[["Ver guia","https://youtu.be/8iXsTc8pFhw?si=jnqYIEJWUIX6NLr7",null]]}],"attention":"A indicação mostra o nível mínimo recomendado para iniciar cada hunt.\nVocê pode continuar caçando na mesma hunt mesmo em níveis mais altos."},{"key":"voc1","sheetName":"Monk","icon":"👊","label":"Monk","beta":false,"brackets":[{"lvl":"0+","hunts":[["Cyclops Thais","https://www.youtube.com/watch?v=Sb0TqL_TCHg","XP"],["Corym","https://www.youtube.com/watch?v=SARRCqv3Bs8","XP"],["Stonerefiner","https://www.youtube.com/watch?v=T8vcncPxnOc","XP/Profit"],["Orc Fortress (Profit Imbue)","https://www.youtube.com/watch?v=MAp7QMhLt2s","Profit"],["Elfos Yalahar (Profit Imbue)","https://www.youtube.com/watch?v=1E8YKhLMmmQ","Profit"],["Cults Yalahar (Profit Imbue)","https://www.youtube.com/watch?v=jOqPmuK4Xt0","Profit"],["Tarantula (Profit Imbue)","https://www.youtube.com/watch?v=mZMdsVI-uTA","Profit"]]},{"lvl":"100+","hunts":[["Putrid Mummy","https://www.youtube.com/watch?v=thXQ_L_ugC0","XP/Profit"],["Exotic Cave","https://www.youtube.com/watch?v=kYqDUZYQbWA","XP/Profit"],["Boquinha Feyrist","https://www.youtube.com/watch?v=7BWHSzRZHAU","Profit"],["Insectoids","https://www.youtube.com/watch?v=NYVuKQe_1U4","XP/Profit"],["Hero Fortress","https://www.youtube.com/watch?v=GKy9qB0wKhg","XP"],["GS Krailos","https://www.youtube.com/watch?v=Btdtwz92HoY","XP"],["Nightmare Krailos","https://www.youtube.com/watch?v=EkcUWv0FrVw","XP"],["Horestis Tomb","https://www.youtube.com/watch?v=mps62zB4M00","XP/Profit"]]},{"lvl":"200+","hunts":[["Invasão Minos","https://www.youtube.com/watch?v=OvP95nnv-jA","XP"],["Invasão Quaras (Oramond West)","https://www.youtube.com/watch?v=K2aQgXRz92E","XP"],["Wyrm Drefia","https://www.youtube.com/watch?v=GlChAeT9LLg","XP"],["Werehyaenas","https://www.youtube.com/watch?v=G0E2eiQGAlo","XP/Profit"],["Pirats","https://www.youtube.com/watch?v=8kwsJLPuvmQ","XP/Profit"],["Glooth Tower","https://www.youtube.com/watch?v=nU03K9MRi7Q","XP/Profit"],["Glooth Bandit","https://www.youtube.com/watch?v=vOUSZAhGqHI","Profit"],["Medusa Tower","https://www.youtube.com/watch?v=9v5OTRmuOVs","XP/Profit"]]},{"lvl":"300+","hunts":[["Asura Palace","https://www.youtube.com/watch?v=ia30DJXcK54","XP"],["Werelion","https://youtu.be/-nBODgPvX5c?si=ardvCleSGyeZsjF_","XP"],["Grim Reaper Drefia","https://www.youtube.com/watch?v=n-nfv_NnJMs","XP"],["Mino Cult","https://www.youtube.com/watch?v=oE5_8x1RBAQ","XP/Profit"],["Lower Roshamuul","https://www.youtube.com/watch?v=pJVLxvBqNCE","XP"],["Behemoth Invasion (Oramond)","https://www.youtube.com/watch?v=m2seVKsMBkU","XP"],["War Golem Invasion (Oramond)","https://www.youtube.com/watch?v=ieNT5CRITqE","XP/Profit"],["Draken Walls","https://www.youtube.com/watch?v=2ThiEXCLojk","XP/Profit"],["Fury Oramond","https://www.youtube.com/watch?v=c_3g2FbDfjI","Profit"],["MoTA (-1 / -2)","https://www.youtube.com/watch?v=w02oiI0rmmk","XP/Profit"],["Medusa Tower","https://www.youtube.com/watch?v=9v5OTRmuOVs","XP/Profit"]]},{"lvl":"400+","hunts":[["Elfo de Fogo","https://www.youtube.com/watch?v=wFr632Gh4h4","XP/Profit"],["Elfo de Gelo","https://www.youtube.com/watch?v=L68Zi_bDGbs","XP"],["Marapur Turtles","https://www.youtube.com/watch?v=RlfvLs508Jo","Profit"],["Werecrocodiles","https://www.youtube.com/watch?v=h6XILhDCw0E","XP"],["Weretigers","https://www.youtube.com/watch?v=h6XILhDCw0E","XP/Profit"],["Catacombs","https://www.youtube.com/watch?v=f622rcVZ0pE","XP"],["Warzone 5","https://www.youtube.com/watch?v=yVb6pERCFr4","XP"],["Warzone 6","https://www.youtube.com/watch?v=RRv5bj2hBNY","XP"],["Candia (Bocão Doce)","https://www.youtube.com/watch?v=3KfiNODPXrc","Profit"],["Nightmare Isles","https://www.youtube.com/watch?v=25XX4Lo2_fg","XP/Profit"],["Crypt Warriors","https://www.youtube.com/watch?v=yqWl0V1xj74","XP"],["Ripper Spectres","https://www.youtube.com/watch?v=MFVwYrwkIMY","XP"],["Asura Mirror","https://www.youtube.com/watch?v=ia30DJXcK54","XP/Profit"],["GT","https://www.youtube.com/watch?v=-5L27b-Wiy4","Profit"]]},{"lvl":"500+","hunts":[["Deathlings","https://www.youtube.com/watch?v=5FU208gw9nQ","XP"],["North DP Roshamuul","https://www.youtube.com/watch?v=_oLXumhPsOE","XP/Profit"],["Mitmah","https://www.youtube.com/watch?v=woiMt1hDZLE","XP/Profit"],["Undead Dragons (Oramond)","https://www.youtube.com/watch?v=Zw5vFuZmPuM","Profit"],["Warzone 2","https://www.youtube.com/watch?v=OcpWWh3BsYE","XP/Profit"],["Warzone 3","https://www.youtube.com/watch?v=kuKHMQy14Gk","XP/Profit"],["Tubarão Roshamuul","https://www.youtube.com/watch?v=wT11p7A3yuY","XP/Profit"],["Buried Cathedral","https://www.youtube.com/watch?v=pFPwVYJZrTQ","XP"],["Nagas","https://www.youtube.com/watch?v=iBQ6NAugTWk","XP"],["Roshamuul West (Bocão)","https://www.youtube.com/watch?v=3Au2GIF0MzA","XP/Profit"]]},{"lvl":"600+","hunts":[["Bueiro Issavi","https://www.youtube.com/watch?v=FeogBQ5JTdw","XP"],["Cachoeira Issavi","https://www.youtube.com/watch?v=8DLdU37w9po","XP"]]},{"lvl":"700+","hunts":[["Falcon Bastion","https://www.youtube.com/watch?v=MEuKHBZ_2z8","XP/Profit"],["Falcon Castelo","https://www.youtube.com/watch?v=y8yNDxTVZTU","XP/Profit"],["Cobra Bastion","https://www.youtube.com/watch?v=pEmITe9o0mY","XP"],["Escadão Ferumbras","https://www.youtube.com/watch?v=2RRS-hft1Uo","Profit"],["Pumin -1 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["Pumin -3 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["Undead Ferumbras","https://www.youtube.com/watch?v=iPitUipIHcs","XP/Profit"],["Inferniach","https://www.youtube.com/watch?v=Z4DeD6y9dk0","XP"]]},{"lvl":"800+++","hunts":[["Plague Seal Ferumbras","https://www.youtube.com/watch?v=dV4jecLpNzc","XP/Profit"],["Pumin -2 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["True Asura (cuidado!)","https://www.youtube.com/watch?v=gDcU4zmrtnE","XP/Profit"],["Warzone 9","https://www.youtube.com/watch?v=YXc2-sH36c0","Profit"],["Jugger Seal Ferumbras","https://www.youtube.com/watch?v=8SyxjamYMZw","XP/Profit"],["Girtabilu","https://www.youtube.com/watch?v=O-FxAso878s","Profit"],["Bulltaur","https://www.youtube.com/watch?v=LWPRGt9B3f0","XP"],["Wardragon","https://www.youtube.com/watch?v=LWPRGt9B3f0","XP"],["Warzone 8","https://www.youtube.com/watch?v=YXc2-sH36c0","Profit"],["Norcferatu","https://www.youtube.com/watch?v=JVAMtvtwpCY","XP"],["Livraria Energy (900+)","https://www.youtube.com/watch?v=QSdIhVc3ow8","XP/Profit"]]}],"charms":[["1.","Zap","Vampiric Embrace","Low Blow e Savage Blow ficam absurdas no Monk por conta do seu dano elevado, porém precisa de um investimento alto em charm points!"],["2.","Poison","Void's Call","Monk precisa de muito nível para tirar 100% proveito da overflux e overpower"],["3.","Wound","Gut","As 4 primeiras runas pode liberar nivel 1, e depois focar em upar nível 2"],["4.","Divine","Fatal Hold","Fatal Hold para o Monk é situacional, e não muito importante."],["5.","Low Blow","Void Inversion",""],["6.","Savage Blow","Adrenaline Burst",""],["7.","Freeze","",""],["8.","Enflame","",""],["9.","Curse","",""],["10.","Overflux","",""],["11.","Overpower","",""]],"configs":[{"title":"🎯 RTC","items":[["Cura","https://prnt.sc/qgE-faaNCiFc","RTC-1.4953.9,274,0,7,Default|295,1,1,1,0,0,1,0;294,1,1,2,0,0,0,0;288,1,1,3,0,0,0,0;301,1,1,4,0,0,0,0;289,1,1,5,0,0,0,0|2,99;273,80;0,80|0,1,6,0;0,1,7,0|7642,55,1;7642,50,2;0,50,0|0,0;0,0|0,0;0,0|11,80,0|39,1,1"],["Caster","https://prnt.sc/GJVqip8OYxJY","RTC-1.4953.9,274,0,7,Default|295,1,1,1,0,0,1,0;294,1,1,2,0,0,0,0;288,1,1,3,0,0,0,0;301,1,1,4,0,0,0,0;289,1,1,5,0,0,0,0|2,99;273,80;0,80|0,1,6,0;0,1,7,0|7642,55,1;7642,50,2;0,50,0|0,0;0,0|0,0;
9260,0|11,80,0|39,1,1"]]},{"title":"☸️ RODA","items":[["Level 100","https://prnt.sc/i1QdSZKDnBux",null],["Level 150","https://prnt.sc/U-8dLTXcgkcQ",null],["Level 300","https://prnt.sc/IAZMtwKI7E_x",null],["Level 350","https://prnt.sc/KydYX_uGu6tN",null],["Level 500","https://prnt.sc/Tj0QkmQKgQCC",null],["Level 675","https://prnt.sc/HQhJRRUGx5Lf",null],["Level 775 com Gema lv3","https://prnt.sc/cvgxPpdqfh-A",null],["Level 775 sem gema lv3","https://prnt.sc/htAzGooxp-Bk",null],["Level 875","https://prnt.sc/gxjOTrMx6qhC",null],["Level 975 com Gema lv3","https://prnt.sc/YXlbZHnZ2Lp3",null],["Level 1200","https://prnt.sc/Cdewuh5BGP11",null],["Level 1300","https://prnt.sc/MH0iX_5jUXHK",null]]},{"title":"🛡️ Guia Equipamentos Monk","items":[["Ver guia","https://www.youtube.com/watch?v=AWtaSBO77zg",null]]}],"attention":"A indicação mostra o nível mínimo recomendado para iniciar cada hunt.\nVocê pode continuar caçando na mesma hunt mesmo em níveis mais altos."},{"key":"voc2","sheetName":"EK (Beta)","icon":"⚔️","label":"Knight","beta":true,"brackets":[{"lvl":"0+","hunts":[["Cyclops Thais","https://www.youtube.com/watch?v=Sb0TqL_TCHg","XP"],["Corym","https://www.youtube.com/watch?v=SARRCqv3Bs8","XP"],["Stonerefiner","https://www.youtube.com/watch?v=T8vcncPxnOc","XP/Profit"],["Orc Fortress (Profit Imbue)","https://www.youtube.com/watch?v=MAp7QMhLt2s","Profit"],["Elfos Yalahar (Profit Imbue)","https://www.youtube.com/watch?v=1E8YKhLMmmQ","Profit"],["Cults Yalahar (Profit Imbue)","https://www.youtube.com/watch?v=jOqPmuK4Xt0","Profit"],["Tarantula (Profit Imbue)","https://www.youtube.com/watch?v=mZMdsVI-uTA","Profit"]]},{"lvl":"100+","hunts":[["Putrid Mummy","https://www.youtube.com/watch?v=thXQ_L_ugC0","XP/Profit"],["Exotic Cave","https://www.youtube.com/watch?v=kYqDUZYQbWA","XP/Profit"],["Boquinha Feyrist","https://www.youtube.com/watch?v=7BWHSzRZHAU","Profit"],["Insectoids","https://www.youtube.com/watch?v=NYVuKQe_1U4","XP/Profit"],["Hero Fortress","https://www.youtube.com/watch?v=GKy9qB0wKhg","XP"],["GS Krailos","https://www.youtube.com/watch?v=Btdtwz92HoY","XP"],["Nightmare Krailos","https://www.youtube.com/watch?v=EkcUWv0FrVw","XP"],["Horestis Tomb","https://www.youtube.com/watch?v=mps62zB4M00","XP/Profit"]]},{"lvl":"200+","hunts":[["Invasão Minos","https://www.youtube.com/watch?v=OvP95nnv-jA","XP"],["Invasão Quaras (Oramond West)","https://www.youtube.com/watch?v=K2aQgXRz92E","XP"],["Wyrm Drefia","https://www.youtube.com/watch?v=GlChAeT9LLg","XP"],["Werehyaenas","https://www.youtube.com/watch?v=G0E2eiQGAlo","XP/Profit"],["Pirats","https://www.youtube.com/watch?v=8kwsJLPuvmQ","XP/Profit"],["Glooth Tower","https://www.youtube.com/watch?v=nU03K9MRi7Q","XP/Profit"],["Glooth Bandit","https://www.youtube.com/watch?v=vOUSZAhGqHI","Profit"],["Medusa Tower","https://www.youtube.com/watch?v=9v5OTRmuOVs","XP/Profit"]]},{"lvl":"300+","hunts":[["Asura Palace","https://www.youtube.com/watch?v=ia30DJXcK54","XP"],["Werelion","https://youtu.be/-nBODgPvX5c?si=ardvCleSGyeZsjF_","XP"],["Grim Reaper Drefia","https://www.youtube.com/watch?v=n-nfv_NnJMs","XP"],["Mino Cult","https://www.youtube.com/watch?v=oE5_8x1RBAQ","XP/Profit"],["Lower Roshamuul","https://www.youtube.com/watch?v=pJVLxvBqNCE","XP"],["Behemoth Invasion (Oramond)","https://www.youtube.com/watch?v=m2seVKsMBkU","XP"],["War Golem Invasion (Oramond)","https://www.youtube.com/watch?v=ieNT5CRITqE","XP/Profit"],["Draken Walls","https://www.youtube.com/watch?v=2ThiEXCLojk","XP/Profit"],["Fury Oramond","https://www.youtube.com/watch?v=c_3g2FbDfjI","Profit"],["MoTA (-1 / -2)","https://www.youtube.com/watch?v=w02oiI0rmmk","XP/Profit"],["Medusa Tower","https://www.youtube.com/watch?v=9v5OTRmuOVs","XP/Profit"]]},{"lvl":"400+","hunts":[["Elfo de Fogo","https://www.youtube.com/watch?v=wFr632Gh4h4","XP/Profit"],["Elfo de Gelo","https://www.youtube.com/watch?v=L68Zi_bDGbs","XP"],["Marapur Turtles","https://www.youtube.com/watch?v=RlfvLs508Jo","Profit"],["Werecrocodiles","https://www.youtube.com/watch?v=h6XILhDCw0E","XP"],["Weretigers","https://www.youtube.com/watch?v=h6XILhDCw0E","XP/Profit"],["Catacombs","https://www.youtube.com/watch?v=f622rcVZ0pE","XP"],["Candia (Bocão Doce)","https://www.youtube.com/watch?v=3KfiNODPXrc","Profit"],["Nightmare Isles","https://www.youtube.com/watch?v=25XX4Lo2_fg","XP/Profit"],["Ripper Spectres","https://www.youtube.com/watch?v=MFVwYrwkIMY","XP"],["Asura Mirror","https://www.youtube.com/watch?v=ia30DJXcK54","XP/Profit"],["GT","https://www.youtube.com/watch?v=-5L27b-Wiy4","Profit"]]},{"lvl":"500+","hunts":[["Deathlings","https://www.youtube.com/watch?v=5FU208gw9nQ","XP"],["North DP Roshamuul","https://www.youtube.com/watch?v=_oLXumhPsOE","XP/Profit"],["Mitmah","https://www.youtube.com/watch?v=woiMt1hDZLE","XP/Profit"],["Undead Dragons (Oramond)","https://www.youtube.com/watch?v=Zw5vFuZmPuM","Profit"],["Tubarão Roshamuul","https://www.youtube.com/watch?v=wT11p7A3yuY","XP/Profit"],["Nagas","https://www.youtube.com/watch?v=iBQ6NAugTWk","XP"],["Roshamuul West (Bocão)","https://www.youtube.com/watch?v=3Au2GIF0MzA","XP/Profit"],["Crypt Warriors","https://www.youtube.com/watch?v=yqWl0V1xj74","XP"]]},{"lvl":"600+","hunts":[["Bueiro Issavi","https://www.youtube.com/watch?v=FeogBQ5JTdw","XP"],["Cachoeira Issavi","https://www.youtube.com/watch?v=8DLdU37w9po","XP"],["Warzone 2","https://www.youtube.com/watch?v=OcpWWh3BsYE","XP/Profit"],["Warzone 3","https://www.youtube.com/watch?v=kuKHMQy14Gk","XP/Profit"],["Falcon Bastion","https://www.youtube.com/watch?v=MEuKHBZ_2z8","XP/Profit"],["Falcon Castelo","https://www.youtube.com/watch?v=y8yNDxTVZTU","XP/Profit"],["Cobra Bastion","https://www.youtube.com/watch?v=pEmITe9o0mY","XP"],["Prision","https://www.youtube.com/watch?v=N-cVPVBV9Dg","XP/Profit"],["Caminho Bazir","https://www.youtube.com/watch?v=Aku0OZOG8nY","XP/Profit"]]},{"lvl":"700+","hunts":[["Escadão Ferumbras","https://www.youtube.com/watch?v=2RRS-hft1Uo","Profit"],["Pumin -1 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["Pumin -3 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["Undead Ferumbras","https://www.youtube.com/watch?v=iPitUipIHcs","XP/Profit"],["Inferniach","https://www.youtube.com/watch?v=Z4DeD6y9dk0","XP"],["Sphinx","https://www.youtube.com/watch?v=yirwcvPxixc","XP"]]},{"lvl":"800+++","hunts":[["Plague Seal Ferumbras","https://www.youtube.com/watch?v=dV4jecLpNzc","XP/Profit"],["Pumin -2 Ferumbras","https://www.youtube.com/watch?v=mIIM7t4zej0","XP/Profit"],["Warzone 9","https://www.youtube.com/watch?v=YXc2-sH36c0","Profit"],["Girtabilu","https://www.youtube.com/watch?v=O-FxAso878s","Profit"],["Bulltaur","https://www.youtube.com/watch?v=LWPRGt9B3f0","XP"],["Warzone 8","https://www.youtube.com/watch?v=YXc2-sH36c0","Profit"],["Norcferatu","https://www.youtube.com/watch?v=JVAMtvtwpCY","XP"]]}],"charms":[["1.","Wound","Vampiric Embrace","EK nivel 1000+ abusa muito da Savage Blow, porém precisa de muitos pontos para variar as opções elementais."],["2.","Freeze","Void's Call","EK Aproveita da Overpower logo cedo, excelente runa para a vocação"],["3.","Zap","Void Inversion","As 3 primeiras runas pode liberar nivel 1, e depois focar em upar nível 2"],["4.","Overpower","Gut","Fatal Hold é totalmente DESNECESSÁRIA no EK, por conta do seu exeta res"],["5.","Divine","Adrenaline Burst",""],["6.","Poison","",""],["7.","Curse","",""],["8.","Enflame","",""],["9.","Low Blow","",""],["10.","Savage Blow","",""]],"configs":[{"title":"🎯 RTC","items":[["Em Breve",null,"Em Breve"]]},{"title":"☸️ RODA","items":[["Em Breve",null,null]]},{"title":"🛡️ Guia Equipamentos RP","items":[["Em Breve",null,null]]}],"attention":"A indicação mostra o nível mínimo recomendado para iniciar cada hunt.\nVocê pode continuar caçando na mesma hunt mesmo em níveis mais altos."}],"videos":[["Otimizar Hunt RP","https://youtu.be/byQ1nVthOhg?si=o-mKlZfh3cCNMiO_"],["Tutorial Bounty Tasks","https://youtu.be/lWbB0Nm06bw?si=sAlZpGpQIuiOlJWF"],["Economizar Supply RP","https://youtu.be/AnnDjTWDpvc?si=3wN1UZyZGV8TrhSY"],["Guia Equipamentos RP","https://youtu.be/8iXsTc8pFhw?si=jnqYIEJWUIX6NLr7"],["RTC + Roda RP","https://youtu.be/_JP8ykNQuMs?si=XlbawjEERyonRpbG"],["Tutorial Como Configurar o RTC","https://youtu.be/ef2lU9r1DvI?si=tzdV6bnyKRjxCxgF"]],"attention":"A indicação mostra o nível mínimo recomendado para iniciar cada hunt.\nVocê pode continuar caçando na mesma hunt mesmo em níveis mais altos."};
927
928/* [KEKE:SHEET-SNAPSHOT:END] — fim da cópia estática de segurança. */
929
930
931const esc=s=>String(s??'').replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
932function safeExternalUrl(value){
933  try{
934    const url=new URL(String(value||''),location.origin);
935    return url.protocol==='https:'?url.href:'';
936  }catch(_){return '';}
937}
938const main=document.getElementById('main');
939main.addEventListener('click',async(e)=>{
940  const btn=e.target.closest('.copy-preset-btn');
941  if(!btn)return;
942  const preset=btn.dataset.preset||'';
943  const orig=btn.textContent;
944  try{
945    if(navigator.clipboard&&window.isSecureContext){
946      await navigator.clipboard.writeText(preset);
947    }else{
948      const ta=document.createElement('textarea');
949      ta.value=preset;ta.style.position='fixed';ta.style.opacity='0';
950      document.body.appendChild(ta);ta.focus();ta.select();
951      document.execCommand('copy');
952      document.body.removeChild(ta);
953    }
954    btn.textContent='✅ Copiado!';
955    btn.classList.add('copied');
956  }catch(err){
957    btn.textContent='❌ Erro ao copiar';
958  }
959  setTimeout(()=>{btn.textContent=orig;btn.classList.remove('copied');},1800);
960});
961const tabsEl=document.getElementById('tabs');
962const toolbar=document.getElementById('toolbar');
963
964let DATA=SNAPSHOT;
965
966/* Mapeia o foco de cada hunt vindo da planilha para o visual do site. */
967function tagHtml(tag){
968  if(!tag)return '';
969  const t=String(tag).trim();
970  if(/^profit\s*imbue$/i.test(t))return `<span class="hunt-tag tag-imbue">Profit Imbuements</span>`;
971  if(/^(xp|experi[êe]ncia)\s*[\/+&]\s*profit$/i.test(t))return `<span class="hunt-tag tag-xpprofit">Exp &amp; Profit</span>`;
972  if(/^profit$/i.test(t))return `<span class="hunt-tag tag-profit">Profit</span>`;
973  if(/^(xp|experi[êe]ncia)$/i.test(t))return `<span class="hunt-tag tag-xp">Experiência</span>`;
974  return `<span class="hunt-tag tag-imbue">${esc(t)}</span>`;
975}
976
977function renderHuntsSection(v){
978  let h=`<div class="voc-panel" id="panel-${v.key}">`;
979  if(DATA.attention){
980    h+=`<div class="warning"><span>⚠️</span><span class="warning-text"><strong>ATENÇÃO:</strong> ${esc(DATA.attention).replace(/\n/g,'<br>')}</span></div>`;
981  }
982  h+=`<div class="section-title">${esc(v.icon)} Hunts por Level — ${esc(v.label)}</div><div class="grid">`;
983  v.brackets.forEach(b=>{
984    h+=`<div class="bracket-card" data-bracket="${esc(b.lvl)}">
985      <div class="bracket-head"><span>${esc(v.icon)}</span><span class="lvl">Level ${esc(b.lvl)}</span><span class="count">${b.hunts.length} hunts</span></div>
986      <ul class="hunt-list">`;
987    b.hunts.forEach(([name,link,tag])=>{
988      const safeLink=safeExternalUrl(link);
989      h+=`<li>
990        <span class="hunt-name">${esc(name)}</span>
991        ${tagHtml(tag)}
992        ${safeLink?`<a class="map-link" href="${esc(safeLink)}" target="_blank" rel="noopener">🗺️ Mapa</a>`:`<span class="no-map">—</span>`}
993      </li>`;
994    });
995    h+=`</ul></div>`;
996  });
997  h+=`</div>`;
998  return h;
999}
1000
1001function renderConfigSection(v){
1002  let h=`<div class="voc-panel" id="panel-${v.key}">`;
1003
1004  if(v.charms.length){
1005    h+=`<div class="section-title" data-section="charms">✨ Charms — Ordem de Prioridade</div>
1006    <div class="table-wrap"><table>
1007      <thead><tr><th>Ordem</th><th>Charm</th><th>Minor Charm</th><th>Observações</th></tr></thead><tbody>`;
1008    v.charms.forEach(c=>{
1009      h+=`<tr><td class="ord">${esc(c[0])}</td><td class="charm-name">${esc(c[1])}</td><td>${esc(c[2]||'—')}</td><td class="obs">${esc(c[3]||'')}</td></tr>`;
1010    });
1011    h+=`</tbody></table></div>`;
1012  }
1013
1014  if(v.configs.length){
1015    h+=`<div class="section-title">⚙️ Configs — RTC &amp; Roda</div><div class="config-grid">`;
1016    v.configs.forEach(cfg=>{
1017      const sec=cfg.title.toLowerCase().includes('rtc')?'rtc':
1018                 cfg.title.toLowerCase().includes('roda')?'roda':
1019                 cfg.title.toLowerCase().includes('equip')?'equipamentos':'';
1020      h+=`<div class="config-card" ${sec?`data-section="${sec}"`:''}><h4>${esc(cfg.title)}</h4><ul>`;
1021      cfg.items.forEach(it=>{
1022        const safeLink=safeExternalUrl(it[1]);
1023        if(safeLink){
1024          const presetBtn=it[2]?`<button type="button" class="map-link copy-preset-btn" data-preset="${esc(it[2])}">📋 Copiar preset</button>`:'';
1025          h+=`<li><span>${esc(it[0])}</span><a class="map-link" href="${esc(safeLink)}" target="_blank" rel="noopener">🔗 Abrir</a>${presetBtn}</li>`;
1026        }else{
1027          h+=`<li style="justify-content:center;text-align:center"><span style="flex:none;width:100%;font-weight:700;color:var(--muted)">Em Breve</span></li>`;
1028        }
1029      });
1030      h+=`</ul></div>`;
1031    });
1032    h+=`</div>`;
1033  }
1034
1035  if(!v.charms.length&&!v.configs.length){
1036    h+=`<div class="empty-msg" style="display:block">Nenhuma configuração cadastrada ainda para essa vocação. 🕵️</div>`;
1037  }
1038
1039  h+=`</div>`;
1040  return h;
1041}
1042
1043function renderVideos(videos){
1044  let h=`<div class="voc-panel" id="panel-videos">
1045  <div class="section-title">🎥 Vídeos Tutoriais</div><div class="video-grid">`;
1046  videos.forEach(v=>{
1047    const safeLink=safeExternalUrl(v[1]);
1048    if(!safeLink)return;
1049    h+=`<a class="video-card" href="${esc(safeLink)}" target="_blank" rel="noopener">
1050      <div class="play">▶</div>
1051      <div><div class="vt">${esc(v[0])}</div><div class="vs">Assistir no YouTube</div></div></a>`;
1052  });
1053  h+=`</div>
1054  <div style="text-align:center;margin-top:30px">
1055    <a class="social-btn youtube" style="display:inline-flex" href="https://www.youtube.com/@KekeDePatinete" target="_blank" rel="noopener">▶ Ver todos os vídeos no canal</a>
1056  </div></div>`;
1057  return h;
1058}
1059
1060function smoothScrollTo(el){
1061  window.scrollTo({top: el.getBoundingClientRect().top + window.scrollY - 90, behavior:'smooth'});
1062}
1063
1064/* ---------------- Estado / navegação ---------------- */
1065let appView='home';       // 'home' | 'guias' | 'soon' | 'mapTask' | 'huntingPlaces' | 'charmCalculator' | 'imbuements' | 'store'
1066let guideMode='hub';      // 'hub' | 'sheet' | 'vocacoes'
1067let currentVoc=null;      // null | vocKey | 'videos'
1068let currentSub=null;      // null | 'hunts' | 'config'
1069let guideVisitLoaded=false;
1070
1071const subnavEl=document.getElementById('subnav');
1072const hintEl=document.getElementById('hint');
1073const soonPanel=document.getElementById('soonPanel');
1074const mapTaskPanel=document.getElementById('mapTaskPanel');
1075const huntingPlacesPanel=document.getElementById('huntingPlacesPanel');
1076const charmCalculatorPanel=document.getElementById('charmCalculatorPanel');
1077const imbuementsPanel=document.getElementById('imbuementsPanel');
1078const homeSection=document.getElementById('homeSection');
1079const homeBtn=document.getElementById('homeBtn');
1080const guiasBtn=document.getElementById('guiasBtn');
1081const toolsBtn=document.getElementById('toolsBtn');
1082const storeBtn=document.getElementById('storeBtn');
1083const channelStore=document.getElementById('channelStore');
1084const guideLoadStatus=document.getElementById('guideLoadStatus');
1085
1086const MAIN_PATHS={home:'/',guias:'/guias',soon:'/ferramentas',mapTask:'/ferramentas/mapa-task',huntingPlaces:'/ferramentas/hunting-places',charmCalculator:'/ferramentas/charm-calculator',imbuements:'/ferramentas/imbuements',store:'/loja/painel'};
1087const GUIDE_VOC_SLUGS={voc0:'paladin',voc1:'monk',voc2:'knight',videos:'videos'};
1088const GUIDE_SLUG_VOC=Object.fromEntries(Object.entries(GUIDE_VOC_SLUGS).map(([key,value])=>[value,key]));
1089function guidePath(){
1090  if(guideMode==='hub')return '/guias';
1091  if(guideMode==='vocacoes')return '/guias/vocacoes';
1092  if(!currentVoc)return '/guias/planilha';
1093  const slug=GUIDE_VOC_SLUGS[currentVoc]||currentVoc;
1094  return currentSub?`/guias/planilha/${slug}/${currentSub}`:`/guias/planilha/${slug}`;
1095}
1096function applyGuidePath(){
1097  const parts=location.pathname.split('/').filter(Boolean);
1098  if(parts[0]!=='guias')return;
1099  if(!parts[1]){guideMode='hub';currentVoc=null;currentSub=null;return;}
1100  if(parts[1]==='vocacoes'){guideMode='vocacoes';currentVoc=null;currentSub=null;return;}
1101  if(parts[1]==='planilha'){
1102    guideMode='sheet';
1103    currentVoc=GUIDE_SLUG_VOC[parts[2]]||'voc0';
1104    currentSub=['hunts','config'].includes(parts[3])?parts[3]:(currentVoc&&currentVoc!=='videos'?'hunts':null);
1105    if(currentVoc==='videos')currentSub=null;
1106    return;
1107  }
1108  guideMode='sheet';
1109  currentVoc=GUIDE_SLUG_VOC[parts[1]]||'voc0';
1110  currentSub=['hunts','config'].includes(parts[2])?parts[2]:(currentVoc&&currentVoc!=='videos'?'hunts':null);
1111  if(currentVoc==='videos')currentSub=null;
1112}
1113function mainViewFromPath(){
1114  if(location.pathname==='/loja'||location.pathname.startsWith('/loja/'))return 'store';
1115  if(location.pathname.startsWith('/guias'))return 'guias';
1116  if(location.pathname.startsWith('/ferramentas/mapa-task'))return 'mapTask';
1117  if(location.pathname.startsWith('/ferramentas/hunting-places'))return 'huntingPlaces';
1118  if(location.pathname.startsWith('/ferramentas/charm-calculator'))return 'charmCalculator';
1119  if(location.pathname.startsWith('/ferramentas/imbuements'))return 'imbuements';
1120  if(location.pathname.startsWith('/ferramentas')||location.pathname.startsWith('/em-breve'))return 'soon';
1121  return 'home';
1122}
1123function setNav(view,{updateUrl=true,replace=false}={}){
1124  const enteringGuides=view==='guias'&&appView!=='guias';
1125  appView=view;
1126  document.documentElement.classList.toggle('route-store',view==='store');
1127  homeBtn.classList.toggle('active',view==='home');
1128  guiasBtn.classList.toggle('active',view==='guias');
1129  toolsBtn.classList.toggle('active',view==='soon'||view==='mapTask'||view==='huntingPlaces'||view==='charmCalculator'||view==='imbuements');
1130  storeBtn.classList.toggle('active',view==='store');
1131  renderShell();
1132  if(updateUrl){
1133    const path=view==='guias'?guidePath():(MAIN_PATHS[view]||'/');
1134    history[replace?'replaceState':'pushState']({view},'',path);
1135  }
1136  if(enteringGuides&&guideMode==='sheet') refreshGuidesForVisit();
1137  if(view!=='guias') guideVisitLoaded=false;
1138  if(view==='mapTask') window.MapTaskTool?.mount();
1139  if(view==='huntingPlaces') window.HuntingPlacesTool?.mount();
1140  if(view==='charmCalculator') window.CharmCalculatorTool?.mount();
1141  if(view==='imbuements') window.KekeImbuementsTool?.mount();
1142}
1143homeBtn.addEventListener('click',(event)=>{if(event.ctrlKey||event.metaKey||event.shiftKey||event.button!==0)return;event.preventDefault();setNav('home');});
1144guiasBtn.addEventListener('click',(event)=>{if(event.ctrlKey||event.metaKey||event.shiftKey||event.button!==0)return;event.preventDefault();guideMode='hub';currentVoc=null;currentSub=null;setNav('guias');});
1145toolsBtn.addEventListener('click',(event)=>{if(event.ctrlKey||event.metaKey||event.shiftKey||event.button!==0)return;event.preventDefault();setNav('soon');});
1146
1147window.addEventListener('popstate',()=>{
1148  const view=mainViewFromPath();
1149  if(view==='store'&&window.ChannelStore){
1150    const storeView=location.pathname.split('/')[2]||'panel';
1151    window.ChannelStore.open(storeView,{updateUrl:false});
1152  }else{
1153    if(view==='guias')applyGuidePath();
1154    setNav(view,{updateUrl:false});
1155  }
1156});
1157
1158function sheetCell(ws,r,c){
1159  return ws[XLSX.utils.encode_cell({r,c})];
1160}
1161function sheetText(ws,r,c){
1162  const cell=sheetCell(ws,r,c);
1163  return cell&&cell.v!=null?String(cell.v).trim():'';
1164}
1165function sheetLink(ws,r,c){
1166  const cell=sheetCell(ws,r,c);
1167  return cell&&cell.l&&cell.l.Target?String(cell.l.Target):null;
1168}
1169function findSheetCell(ws,test){
1170  if(!ws||!ws['!ref'])return null;
1171  const range=XLSX.utils.decode_range(ws['!ref']);
1172  for(let r=range.s.r;r<=range.e.r;r++){
1173    for(let c=range.s.c;c<=range.e.c;c++){
1174      const value=sheetText(ws,r,c);
1175      if(value&&test(value,r,c))return {r,c,value};
1176    }
1177  }
1178  return null;
1179}
1180function parseVocSheet(ws,meta){
1181  if(!ws||!ws['!ref'])throw new Error('aba ausente: '+meta.sheetName);
1182  const range=XLSX.utils.decode_range(ws['!ref']);
1183  const brackets=[];
1184  for(let r=range.s.r;r<=range.e.r;r++){
1185    for(const c of [0,4,8]){
1186      const title=sheetText(ws,r,c);
1187      const match=title.match(/Level\s+(.+)$/i);
1188      if(!match)continue;
1189      const hunts=[];
1190      for(let row=r+2;row<=range.e.r;row++){
1191        const name=sheetText(ws,row,c);
1192        if(!name)break;
1193        hunts.push([name,sheetLink(ws,row,c+1),sheetText(ws,row,c+2)]);
1194      }
1195      brackets.push({lvl:match[1].trim(),hunts});
1196    }
1197  }
1198  const runeHead=findSheetCell(ws,(v)=>/Runas.+Ordem/i.test(v));
1199  const charms=[];
1200  if(runeHead){
1201    for(let row=runeHead.r+2;row<=range.e.r;row++){
1202      const order=sheetText(ws,row,runeHead.c);
1203      if(!order)break;
1204      charms.push([order,sheetText(ws,row,runeHead.c+1),sheetText(ws,row,runeHead.c+2),sheetText(ws,row,runeHead.c+3)]);
1205    }
1206  }
1207  const attentionHead=findSheetCell(ws,(v)=>/ATENÇÃO/i.test(v));
1208  const attention=attentionHead?sheetText(ws,attentionHead.r+1,attentionHead.c):SNAPSHOT.attention;
1209  function configFromHeading(regex,type){
1210    const head=findSheetCell(ws,(v,r,c)=>r>=20&&c>=12&&regex.test(v));
1211    if(!head)return null;
1212    if(type==='equipment'){
1213      const link=sheetLink(ws,head.r+2,head.c);
1214      return {title:head.value,items:[[link?'Ver guia':'Em Breve',link,null]]};
1215    }
1216    const items=[];
1217    for(let row=head.r+2;row<=Math.min(range.e.r,head.r+30);row++){
1218      const name=sheetText(ws,row,head.c);
1219      if(!name)break;
1220      const link=sheetLink(ws,row,head.c+1);
1221      const preset=type==='rtc'?sheetText(ws,row,head.c+2)||null:null;
1222      items.push([name,link,preset]);
1223    }
1224    return {title:head.value,items:items.length?items:[["Em Breve",null,null]]};
1225  }
1226  const configs=[
1227    configFromHeading(/(?:^|\s)RTC(?:$|\s)/i,'rtc'),
1228    configFromHeading(/(?:^|\s)RODA(?:$|\s)/i,'roda'),
1229    configFromHeading(/Guia\s+Equipamentos/i,'equipment')
1230  ].filter(Boolean);
1231  if(!brackets.length)throw new Error('nenhuma hunt encontrada em '+meta.sheetName);
1232  return {...meta,brackets,charms,configs,attention};
1233}
1234function parseVideosSheet(ws){
1235  if(!ws)return [];
1236  const head=findSheetCell(ws,(v)=>/TEMA\s+VÍDEO/i.test(v));
1237  if(!head)return [];
1238  const videos=[];
1239  const range=XLSX.utils.decode_range(ws['!ref']);
1240  for(let row=head.r+1;row<=range.e.r;row++){
1241    const title=sheetText(ws,row,head.c);
1242    if(!title)break;
1243    const link=sheetLink(ws,row,head.c+1);
1244    if(link)videos.push([title,link]);
1245  }
1246  return videos;
1247}
1248function parseWorkbook(workbook){
1249  const vocs=SNAPSHOT.vocs.map(meta=>parseVocSheet(workbook.Sheets[meta.sheetName],{
1250    key:meta.key,sheetName:meta.sheetName,icon:meta.icon,label:meta.label,beta:meta.beta
1251  }));
1252  const videos=parseVideosSheet(workbook.Sheets['Vídeos úteis']);
1253  return {vocs,videos:videos.length?videos:SNAPSHOT.videos,attention:vocs[0]?.attention||SNAPSHOT.attention};
1254}
1255
1256async function refreshGuidesForVisit(){
1257  if(guideVisitLoaded)return;
1258  guideVisitLoaded=true;
1259  if(!LIVE_GUIDES_URL)return;
1260  guideLoadStatus.hidden=false;
1261  guideLoadStatus.className='guide-load-status loading';
1262  guideLoadStatus.textContent='Atualizando os guias pela planilha oficial…';
1263  try{
1264    const [res]=await Promise.all([
1265      fetch(LIVE_GUIDES_URL+(LIVE_GUIDES_URL.includes('?')?'&':'?')+'t='+Date.now(),{cache:'no-store'}),
1266      ensureGuideReader()
1267    ]);
1268    if(!res.ok)throw new Error('HTTP '+res.status);
1269    if(!window.XLSX)throw new Error('leitor de planilhas indisponível');
1270    const bytes=await res.arrayBuffer();
1271    const fresh=parseWorkbook(XLSX.read(bytes,{type:'array'}));
1272    if(!fresh||!Array.isArray(fresh.vocs)||!Array.isArray(fresh.videos))throw new Error('dados inválidos');
1273    DATA=fresh;
1274    renderAll();
1275    if(appView==='guias')renderApp();
1276    guideLoadStatus.className='guide-load-status success';
1277    guideLoadStatus.textContent='Guias atualizados agora pela planilha oficial.';
1278    setTimeout(()=>{if(guideLoadStatus.classList.contains('success'))guideLoadStatus.hidden=true;},2600);
1279  }catch(err){
1280    console.warn('Não foi possível atualizar os guias; mantendo a cópia estática.',err);
1281    guideLoadStatus.className='guide-load-status fallback';
1282    guideLoadStatus.textContent='Exibindo a cópia segura dos guias.';
1283  }
1284}
1285
1286function renderShell(){
1287  const isHome=appView==='home';
1288  const isSoon=appView==='soon';
1289  const isMapTask=appView==='mapTask';
1290  const isHuntingPlaces=appView==='huntingPlaces';
1291  const isCharmCalculator=appView==='charmCalculator';
1292  const isImbuements=appView==='imbuements';
1293  const isGuias=appView==='guias';
1294  const isGuideHub=isGuias&&guideMode==='hub';
1295  const isGuideSheet=isGuias&&guideMode==='sheet';
1296  const isVocationGuide=isGuias&&guideMode==='vocacoes';
1297  const isStore=appView==='store';
1298  document.body.classList.toggle('map-task-route',isMapTask);
1299  document.body.classList.toggle('hunting-places-route',isHuntingPlaces);
1300  document.body.classList.toggle('charm-calculator-route',isCharmCalculator);
1301  document.body.classList.toggle('imbuements-route',isImbuements);
1302  homeSection.style.display=isHome?'block':'none';
1303  soonPanel.style.display=isSoon?'block':'none';
1304  mapTaskPanel.style.display=isMapTask?'block':'none';
1305  huntingPlacesPanel.style.display=isHuntingPlaces?'block':'none';
1306  charmCalculatorPanel.style.display=isCharmCalculator?'block':'none';
1307  imbuementsPanel.style.display=isImbuements?'block':'none';
1308  channelStore.hidden=!isStore;
1309  document.body.classList.toggle('guides-route',isGuias);
1310  document.body.classList.toggle('tools-route',isSoon||isMapTask||appView==='huntingPlaces'||appView==='charmCalculator');
1311  const guidesIntro=document.getElementById('guidesIntro');
1312  const guidesHub=document.getElementById('guidesHub');
1313  const vocationGuidePanel=document.getElementById('vocationGuidePanel');
1314  if(guidesIntro)guidesIntro.style.display=isGuideHub?'block':'none';
1315  if(guidesHub)guidesHub.hidden=!isGuideHub;
1316  if(vocationGuidePanel)vocationGuidePanel.classList.toggle('is-visible',isVocationGuide);
1317  tabsEl.style.display=isGuideSheet?'flex':'none';
1318  if(isGuideSheet){
1319    main.style.display='block';
1320    renderApp();
1321  }else{
1322    guideLoadStatus.hidden=true;
1323    subnavEl.style.display='none';
1324    toolbar.style.display='none';
1325    hintEl.style.display='none';
1326    main.style.display='none';
1327  }
1328  if(isVocationGuide)window.KekeVocationGuide?.mount();
1329}
1330
1331function selectVoc(voc){
1332  guideMode='sheet';
1333  currentVoc=voc;
1334  currentSub=null;
1335  renderApp();
1336  history.pushState({view:'guias',voc:currentVoc},'',guidePath());
1337  smoothScrollTo(currentVoc==='videos'?main:subnavEl);
1338}
1339
1340function selectSub(sub){
1341  guideMode='sheet';
1342  currentSub=sub;
1343  renderApp();
1344  history.pushState({view:'guias',voc:currentVoc,sub:currentSub},'',guidePath());
1345  smoothScrollTo(subnavEl);
1346}
1347
1348function renderApp(){
1349  tabsEl.querySelectorAll('.tab').forEach(t=>t.classList.toggle('active',t.dataset.voc===currentVoc));
1350
1351  if(currentVoc==='videos'){
1352    subnavEl.style.display='none';
1353    toolbar.style.display='none';
1354    hintEl.style.display='none';
1355    main.innerHTML=renderVideos(DATA.videos||[]);
1356    return;
1357  }
1358
1359  const v=DATA.vocs.find(x=>x.key===currentVoc);
1360  if(!v){
1361    subnavEl.style.display='none';
1362    toolbar.style.display='none';
1363    main.innerHTML='';
1364    hintEl.style.display='block';
1365    hintEl.className='hint hint-main';
1366    hintEl.innerHTML='👆 Escolha uma vocação acima para ver hunts e configurações.';
1367    return;
1368  }
1369
1370  subnavEl.style.display='flex';
1371  subnavEl.innerHTML=`
1372    <button type="button" class="sub-btn${currentSub==='hunts'?' active':''}" data-sub="hunts"><span class="nav-pixel-icon icon-guide-hunts" aria-hidden="true"></span>Hunts</button>
1373    <button type="button" class="sub-btn${currentSub==='config'?' active':''}" data-sub="config"><span class="nav-pixel-icon icon-guide-config" aria-hidden="true"></span>Configurações</button>`;
1374  subnavEl.querySelectorAll('.sub-btn').forEach(b=>b.addEventListener('click',()=>selectSub(b.dataset.sub)));
1375
1376  if(currentSub==='hunts'){
1377    hintEl.style.display='none';
1378    main.innerHTML=renderHuntsSection(v);
1379    buildJump(v,'hunts');
1380  }else if(currentSub==='config'){
1381    hintEl.style.display='none';
1382    main.innerHTML=renderConfigSection(v);
1383    buildJump(v,'config');
1384  }else{
1385    toolbar.style.display='none';
1386    main.innerHTML='';
1387    hintEl.style.display='block';
1388    hintEl.className='hint';
1389    hintEl.textContent='👆 Escolha Hunts ou Configurações acima.';
1390  }
1391}
1392
1393function buildJump(v,sub){
1394  toolbar.innerHTML='';
1395  if(sub==='hunts'){
1396    if(!v.brackets.length){toolbar.style.display='none';return;}
1397    toolbar.style.display='flex';
1398    v.brackets.forEach(b=>{
1399      const btn=document.createElement('button');
1400      btn.type='button';
1401      btn.textContent='Lv '+b.lvl;
1402      btn.onclick=()=>{
1403        const card=document.querySelector(`#panel-${v.key} [data-bracket="${CSS.escape(b.lvl)}"]`);
1404        if(card) smoothScrollTo(card);
1405      };
1406      toolbar.appendChild(btn);
1407    });
1408  }
1408else if(sub==='config'){
1409    toolbar.style.display='flex';
1410    [['Charms','charms','icon-guide-charms'],['RTC','rtc','icon-guide-rtc'],['Roda','roda','icon-guide-wheel'],['Equipamentos','equipamentos','icon-guide-equipment']].forEach(([t,id,iconClass])=>{
1411      const b=document.createElement('button');
1412      b.type='button';
1413      b.innerHTML=`<span class="nav-pixel-icon ${iconClass}" aria-hidden="true"></span>${t}`;
1414      b.onclick=()=>{
1415        const panel=document.getElementById('panel-'+v.key);
1416        if(!panel) return;
1417        let el=panel.querySelector(`[data-section="${id}"]`);
1418        if(!el){
1419          const cards=[...panel.querySelectorAll('.config-card')];
1420          el=cards.find(c=>{
1421            const h=c.querySelector('h4');
1422            return h && h.textContent.toLowerCase().includes(id==='equipamentos'?'equip':id);
1423          });
1424        }
1425        if(el) smoothScrollTo(el);
1426      };
1427      toolbar.appendChild(b);
1428    });
1429  }
1430}
1431
1432function renderAll(){
1433  const vocIcons={voc0:'icon-guide-paladin',voc1:'icon-guide-monk',voc2:'icon-guide-knight'};
1434  tabsEl.innerHTML=DATA.vocs.map(v=>
1435    `<div class="tab" data-voc="${v.key}"><span class="nav-pixel-icon ${vocIcons[v.key]||'icon-guides'}" aria-hidden="true"></span>${esc(v.label)}${v.beta?' <span class="beta">BETA</span>':''}</div>`
1436  ).join('')+`<div class="tab" data-voc="videos"><span class="nav-pixel-icon icon-guide-videos" aria-hidden="true"></span>Vídeos e Tutoriais</div>`;
1437  tabsEl.querySelectorAll('.tab').forEach(t=>t.addEventListener('click',()=>selectVoc(t.dataset.voc)));
1438  const validVoc=currentVoc==='videos'||DATA.vocs.some(v=>v.key===currentVoc);
1439  if(!validVoc){currentVoc=null;currentSub=null;}
1440}
1441
1442
1443
1444
1445
1446/* ---------------- Carrossel da Home ---------------- */
1447(function homeCarousel(){
1448  const track=document.getElementById('carTrack');
1449  const dotsWrap=document.getElementById('carDots');
1450  const slides=track.querySelectorAll('.car-slide');
1451  let idx=0,timer=null;
1452
1453  slides.forEach((_,i)=>{
1454    const d=document.createElement('button');
1455    d.type='button';
1456    d.className='car-dot'+(i===0?' active':'');
1457    d.setAttribute('aria-label','Ir para o slide '+(i+1));
1458    d.addEventListener('click',()=>goTo(i));
1459    dotsWrap.appendChild(d);
1460  });
1461
1462  function goTo(i){
1463    idx=(i+slides.length)%slides.length;
1464    track.style.transform=`translateX(-${idx*100}%)`;
1465    dotsWrap.querySelectorAll('.car-dot').forEach((d,j)=>d.classList.toggle('active',j===idx));
1466    resetTimer();
1467  }
1468  function resetTimer(){
1469    clearInterval(timer);
1470    timer=setInterval(()=>goTo(idx+1),6000);
1471  }
1472
1473  document.getElementById('carPrev').addEventListener('click',()=>goTo(idx-1));
1474  document.getElementById('carNext').addEventListener('click',()=>goTo(idx+1));
1475  const carousel=document.getElementById('carousel');
1476  carousel?.addEventListener('mouseenter',()=>clearInterval(timer));
1477  carousel?.addEventListener('mouseleave',resetTimer);
1478  carousel?.addEventListener('focusin',()=>clearInterval(timer));
1479  carousel?.addEventListener('focusout',resetTimer);
1480  resetTimer();
1481})();
1482
1483/* Previews leves da Loja do Canal: somente dados necessários para a Home. */
1484(async function loadStorePreviews(){
1485  try{
1486    const response=await fetch('/api/public/rankings-v2?type=totalHours&page=1&pageSize=10',{cache:'no-store'});
1487    if(response.ok){
1488      let data=await response.json();
1489      const target=document.getElementById('homeRankingPreview');
1490      const top=(data.users||[]).filter(user=>Number(user.total_seconds||0)>0).slice(0,3);
1491      const medals=['🏆','🏆','🏆'];
1492      if(target)target.innerHTML=top.length?top.map((user,index)=>`<a class="home-rank-row rank-${index+1} ${index===0?'champion':''}" href="/loja/perfil/${encodeURIComponent(user.id)}"><span class="home-rank-position"><i>${medals[index]||`${index+1}º`}</i><small>${index+1}º</small></span><span class="home-rank-name">${String(user.display_name||'Usuário').replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]))}</span><strong>${(Number(user.total_seconds||0)/3600).toFixed(1)}h</strong></a>`).join(''):'O ranking começa com as primeiras horas validadas.';
1493    }
1494  }catch(_){const target=document.getElementById('homeRankingPreview');if(target)target.textContent='Acesse o ranking completo da comunidade.';}
1495  try{
1496    const response=await fetch('/api/raffles',{credentials:'include',cache:'no-store'});
1497    if(response.ok){
1498      const data=await response.json();
1499      const featured=(data.raffles||[]).find(item=>
1499item.raffle_type==='monthly_rc')||(data.raffles||[]).find(item=>item.raffle_type==='weekly_rc');
1500      if(featured){
1501        document.getElementById('homeRaffleTitle').textContent=featured.title;
1502        document.getElementById('homeRaffleDescription').textContent=`${featured.description||'Sorteio ativo'} · ${Number(featured.configured_winners||1)} vencedor(es) · ${Number(featured.prize_rubini_amount||0)} Rubini Coins por vencedor.`;
1503      }
1504    }
1505  }catch(_){}
1506})();
1507
1508/* ---------------- Banner do último vídeo (somente vídeos longos do YouTube) ---------------- */
1509async function loadLatestVideo(){
1510  const box=document.getElementById('latestVideo');
1511  const thumb=document.getElementById('lvThumbImg');
1512  box.style.display='none';
1513  box.classList.add('is-loading');
1514  let hasResolvedVideo=false;
1515  let hasCandidateVideo=false;
1516  const cacheKey='keke-latest-video-v4-longform-api';
1517  const feedUrl='https://www.youtube.com/feeds/videos.xml?channel_id='+YT_CHANNEL_ID;
1518  const jsonUrl='https://api.rss2json.com/v1/api.json?rss_url='+encodeURIComponent(feedUrl);
1519  const xmlUrl='https://api.allorigins.win/raw?url='+encodeURIComponent(feedUrl);
1520  const latestLongVideoApi='/api/public/latest-long-video';
1521  const initialHref=(document.getElementById('lvBtn')||{}).href||'';
1522  const initialIdMatch=initialHref.match(/[?&]v=([A-Za-z0-9_-]{11})/)||initialHref.match(/youtu\.be\/([A-Za-z0-9_-]{11})/);
1523  const fallbackVideo={
1524    id:initialIdMatch?initialIdMatch[1]:'sdb25p2Fhbo',
1525    title:(document.getElementById('lvTitle')||{}).textContent||'Último vídeo do canal'
1526  };
1527  const decodeTitle=value=>{
1528    const el=document.createElement('textarea');
1529    el.innerHTML=String(value||'');
1530    return el.value;
1531  };
1532  const isBroadcastTitle=value=>{
1533    const title=decodeTitle(value).toLocaleLowerCase('pt-BR');
1534    return /(^|\s)![a-z0-9_]+\b/i.test(title)||/(^|\W)(ao vivo|live)(\W|$)/i.test(title);
1535  };
1536  const applyVideo=video=>{
1537    if(!video||!video.id)return false;
1538    hasCandidateVideo=true;
1539    thumb.onload=()=>{
1540      hasResolvedVideo=true;
1541      box.classList.remove('is-loading');
1542      box.style.display='flex';
1543    };
1544    thumb.onerror=()=>{
1545      hasResolvedVideo=false;
1546      box.classList.remove('is-loading');
1547      box.style.display='none';
1548      try{localStorage.removeItem(cacheKey);}catch(e){}
1549    };
1550    thumb.src='https://i.ytimg.com/vi/'+video.id+'/hqdefault.jpg';
1551    document.getElementById('lvThumbLink').href='https://youtu.be/'+video.id;
1552    document.getElementById('lvBtn').href='https://youtu.be/'+video.id;
1553    document.getElementById('lvTitle').textContent=decodeTitle(video.title)||'Último vídeo do canal';
1554    return true;
1555  };
1556  const fetchTimed=async(url,timeoutMs=5500)=>{
1557    const controller=new AbortController();
1558    const timeout=setTimeout(()=>controller.abort(),timeoutMs);
1559    try{return await fetch(url,{cache:'no-store',signal:controller.signal});}
1560    finally{clearTimeout(timeout);}
1561  };
1562  const fromJson=async()=>{
1563    const res=await fetchTimed(jsonUrl);
1564    if(!res.ok)throw new Error('JSON HTTP '+res.status);
1565    const data=await res.json();
1566    const item=data&&data.items&&data.items.find(entry=>!isBroadcastTitle(entry.title));
1567    const match=item&&String(item.link||'').match(/[?&]v=([^&]+)/);
1568    if(!match)throw new Error('JSON sem vídeo');
1569    return {id:match[1],title:item.title||''};
1570  };
1571  const fromXml=async()=>{
1572    const res=await fetchTimed(xmlUrl);
1573    if(!res.ok)throw new Error('XML HTTP '+res.status);
1574    const xml=new DOMParser().parseFromString(await res.text(),'application/xml');
1575    const entry=Array.from(xml.querySelectorAll('entry')).find(candidate=>!isBroadcastTitle((candidate.querySelector('title')||{}).textContent||''));
1576    const videoId=entry&&(entry.getElementsByTagNameNS('*','videoId')[0]||{}).textContent;
1577    const title=entry&&(entry.querySelector('title')||{}).textContent||'';
1578    if(!videoId)throw new Error('XML sem vídeo');
1579    return {id:videoId,title};
1580  };
1581  const fromBackend=async()=>{
1582    const res=await fetchTimed(latestLongVideoApi,8000);
1583    if(!res.ok)throw new Error('LATEST VIDEO HTTP '+res.status);
1584    const data=await res.json();
1585    const video=data&&data.video;
1586    if(!video||!video.id)throw new Error('LATEST VIDEO sem vídeo');
1587    return {id:String(video.id),title:video.title||''};
1588  };
1589  try{applyVideo(JSON.parse(localStorage.getItem(cacheKey)||'null'));}catch(e){}
1590  try{
1591    const latest=await fromBackend();
1592    applyVideo(latest);
1593    try{localStorage.setItem(cacheKey,JSON.stringify(latest));}catch(e){}
1594  }catch(err){
1595    console.warn('Não foi possível atualizar o último vídeo longo; mantendo cache/fallback seguro.',err);
1596    if(!hasCandidateVideo)applyVideo(fallbackVideo);
1597  }
1598  box.classList.remove('is-loading');
1599  if(!hasCandidateVideo)applyVideo(fallbackVideo);
1600}
1601
1602/* A cópia estática aparece imediatamente; ao entrar em Guias, a planilha
1603   pública tenta substituí-la pela versão mais recente. */
1604(function boot(){
1605  if(location.pathname.startsWith('/em-breve'))history.replaceState({},'',`/ferramentas${location.search}${location.hash}`);
1606  if(mainViewFromPath()==='guias')applyGuidePath();
1607  renderAll();
1608  setNav(mainViewFromPath(),{updateUrl:false});
1609  loadLatestVideo();
1610})();
1611
1612
1613</script>
1613
1614
1615<div id="twitchFloat" class="off" style="display:none">
1616 <div class="tfHead">
1617   <span class="tfLabel"><span class="tfDot"></span><span id="tfLabelTxt">Verificando…</span></span>
1618   <button class="tfClose" id="tfClose" title="Fechar" aria-label="Fechar">×</button>
1619 </div>
1620 <div id="tfBody"></div>
1621</div>
1622
1623<script>
1624/* ================================================================
1625   POPUP DE LIVE DA TWITCH
1626   Detecta se o canal está AO VIVO usando a API pública decapi.me
1627   (sem login, sem token, sem variável de ambiente).
1628   Ao vivo  -> abre o player embutido + botão "Assistir na Twitch"
1629   Offline  -> some / vira um botãozinho discreto "Seguir na Twitch"
1630================================================================ */
1631(()=>{
1632 const CHANNEL='kekedepatinete';
1633 const box=document.getElementById('twitchFloat');
1634 const body=document.getElementById('tfBody');
1635 const labelTxt=document.getElementById('tfLabelTxt');
1636 const closeBtn=document.getElementById('tfClose');
1637 const parent=location.hostname||'localhost';
1638 const DISMISS_KEY='keke-twitch-float-dismissed-v1';
1639 let state=null, dismissed=false;
1640 try{dismissed=sessionStorage.getItem(DISMISS_KEY)==='1';}catch(_){}
1641
1642 closeBtn.onclick=()=>{box.style.display='none';dismissed=true;try{sessionStorage.setItem(DISMISS_KEY,'1');}catch(_){}};
1643
1644 async function isLive(){
1645   try{
1646     const r=await fetch('https://decapi.me/twitch/uptime/'+CHANNEL+'?t='+Date.now(),{cache:'no-store'});
1647     const t=(await r.text()).toLowerCase();
1648     // Ao vivo: a API devolve o tempo no ar (ex.: "2 hours, 5 minutes").
1649     // Offline: devolve "<canal> is offline".
1650     return /\b(second|minute|hour|day)s?\b/.test(t) && !t.includes('offline');
1651   }catch(e){ return null; } // null = não conseguiu checar; mantém o estado atual
1652 }
1653
1654 async function checkLive(){
1655   const live=await isLive();
1656   if(live===null || live===state) return;   // sem resposta ou sem mudança
1657   state=live;
1658   if(dismissed){ box.style.display='none'; return; } // fechado nesta aba: não reaparece durante a navegação
1659   box.style.display='block';
1660   if(live){
1661     box.classList.remove('off');
1662     labelTxt.textContent='Ao vivo agora';
1663     body.innerHTML=
1664       '<iframe title="Live da Twitch" allowfullscreen '+
1665       'src="https://player.twitch.tv/?channel='+CHANNEL+'&parent='+parent+'&muted=true&autoplay=true"></iframe>'+
1666       '<a class="tfFoot" target="_blank" rel="noopener" href="https://twitch.tv/'+CHANNEL+'">▶ Assistir na Twitch</a>';
1667   }else{
1668     box.classList.add('off');
1669     labelTxt.textContent='Live offline';
1670     body.innerHTML='<a class="tfOffBtn" target="_blank" rel="noopener" href="https://twitch.tv/'+CHANNEL+'"><img src="/assets/icon-twitch.svg" alt="">Seguir na Twitch</a>';
1671   }
1672 }
1673
1674 checkLive();
1675 setInterval(checkLive,120000); // revalida a cada 2 minutos
1676})();
1677</script>
1677
1678
1679  
1679<script src="/assets/hunting-places.js?v=010fd06b7225"></script>
1679
1680  <link rel="stylesheet" href="/assets/vendor/map-task/leaflet.css">
1681  <link rel="stylesheet" href="/assets/vendor/map-task/MarkerCluster.css">
1682  
1682<script src="/assets/vendor/map-task/leaflet.js"></script>
1682
1683  
1683<script src="/assets/vendor/map-task/leaflet.markercluster.js"></script>
1683
1684  
1684<script src="/assets/map-task.js?v=5"></script>
1684
1685  
1685<script src="/assets/inbox-messages.js?v=5"></script>
vendor: 1 bytes, line 1685
1685
1686<script src="/assets/store-critical-actions.js?v=2"></script>
1686
1687
1688  
1688<script src="/assets/channel-store.js?v=34"></script>
1688
1689  
1689<script src="/assets/admin-html-pages.js?v=1"></script>
1689
1690  
1690<script src="/assets/hunting-place-suggestions.js?v=4acae5efffaf"></script>
1690
1691  
1691<script src="/assets/charm-calculator.js?v=8ceb9e72867b"></script>
1691
1692  
1692<script src="/assets/imbuements.js?v=5"></script>
vendor: 1 bytes, line 1692
1692
1693<script src="/assets/bounty-tier-list.js?v=ff5024793d09" defer></script>
1693
1694  
1694<script src="/assets/vocation-guide.js?v=5f272cd5c233-f6bc441a0428"></script>
1694
1695  
1695<script id="keke-wheel-gpt-bridge" src="/assets/vocation-guide/wheel-gpt/bridge.js?v=28921a69bcd1-5f272cd5c233-9ac61b31cf1d-f6bc441a0428"></script>
1695
1696  
1696<script id="keke-rtc-gpt-bridge" src="/assets/vocation-guide/rtc-gpt/bridge.js?v=ebcfc50144b1"></script>
vendor: 1 bytes, line 1696
1696
1697<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"9f7fda65d04d4d71b28844b173842247","r":1,"spa":2}' crossorigin="anonymous"></script>
1697
1698</body>
1699</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.