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 & 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 & 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 & 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 & PROFIT | Rubinot</div> 815 <div class="lv-sub">Assista agora e já deixa o like <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=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[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 & 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 & 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&¤tVoc!=='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&¤tVoc!=='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&®ex.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=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[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.