1<!doctype html> 2<html lang="id"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 6 7 <!-- Meta-Start --> 8 9 <meta name="description" content="OKJEK21 hadir sebagai pusat informasi agen slot gacor, Slot777, dan RTP slot terbaru 2026. Temukan update permainan, informasi RTP, serta berbagai informasi terbaru OKJEK21."/> 10<meta name="keywords" content=" okjek21,"> 11<link rel="canonical" href="https://okjek21family.com/" /> 12<link rel="amphtml" href="https://okjek21indomie.com/" /> 13<meta name="googlebot" content="index,follow"> 14<meta property="type" content="website" /> 15<meta property="robots" content="index, follow" /> 16<meta property="og:url" content="https://okjek21family.com/" /> 17<meta property="og:title" content="OKJEK21 | Agen Slot Gacor Slot777 & RTP Slot Terbaru 2026" /> 18<meta property="og:description" content="OKJEK21 hadir sebagai pusat informasi agen slot gacor, Slot777, dan RTP slot terbaru 2026. Temukan update permainan, informasi RTP, serta berbagai informasi terbaru OKJEK21." /> 19<meta property="og:image" content="https://okjek21family.com/images/upload-Slides-20250802200502.jpg" /> 20<meta property="twitter:card" content="summary_large_image" /> 21<meta property="twitter:title" content="OKJEK21 | Agen Slot Gacor Slot777 & RTP Slot Terbaru 2026" /> 22<meta property="twitter:description" content="OKJEK21 hadir sebagai pusat informasi agen slot gacor, Slot777, dan RTP slot terbaru 2026. Temukan update permainan, informasi RTP, serta berbagai informasi terbaru OKJEK21." /> 23<meta property="twitter:image" content="https://okjek21family.com/images/upload-Slides-20250802200502.jpg" /> 24<meta name="google-site-verification" content="" /> 25<meta name="google-site-verification" content="qpgLes2L-UpCUGN_YTZdiNdh4UbAEGXzrQjN0dTyhPM" /> 26<meta name="google-site-verification" content="ajMRFv5eREtWl_Vhd015mCf8BxIJVUxLfGEtzAGJ7HQ" /> 27<meta name="google-site-verification" content="twfWWYa_3m01q1AoabGaxlN7Vu7FEL5IjKunMCp6OwI" /> 28<meta name="google-site-verification" content="q5GxPPH9ciYcFXE-FkpjfTgRfk3hjvdURh8DLtBi_CE" /> 29<meta name="google-site-verification" content="9RksfNqNj-hcbH3GC6XdLe3T-AM_oHB_5LSACdb7VOo" /> 30<meta name="google-site-verification" content="-4byNPfn7RN7oz9ORnJ2AB1lzU1P7w6bY1XaypOUIWU" /> 31 32<!-- Meta Pixel Code -->
33<script>
vendor: 408 bytes, lines 33-42
33 34!function(f,b,e,v,n,t,s) 35{if(f.fbq)return;n=f.fbq=function(){n.callMethod? 36n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 37if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 38n.queue=[];t=b.createElement(e);t.async=!0; 39t.src=v;s=b.getElementsByTagName(e)[0]; 40s.parentNode.insertBefore(t,s)}(window, document,'script', 41'https://connect.facebook.net/en_US/fbevents.js'); 42fbq('init', '
421617814793386047
vendor: 32 bytes, lines 42-43
42'); 43fbq('track', 'PageView');
44</script>
44 45<noscript><img height="1" width="1" style="display:none" 46src="https://www.facebook.com/tr?id=1617814793386047&ev=PageView&noscript=1" 47/></noscript> 48<!-- End Meta Pixel Code --> 49 50<meta content="1 days" name="revisit-after"> 51<meta content="general" name="rating"> 52<meta content="id" name="geo.country"> 53<meta content="Indonesia" name="geo.placename"> 54<link rel="icon" type="image/png" href="favicon.png">
55<script type="application/ld+json" data-rh="true"> 56 { 57 "@context": "http://schema.org", 58 "@type": "BreadcrumbList", 59 "itemListElement": [{ 60 "@type": "ListItem", 61 "position": 1, 62 "item": { 63 "@id": "https://okjek21family.com/", 64 "name": "Slot Maxwin" 65 } 66 }, { 67 "@type": "ListItem", 68 "position": 2, 69 "item": { 70 "@id": "https://okjek21family.com/", 71 "name": "Link Slot Maxwin" 72 } 73 }, { 74 "@type": "ListItem", 75 "position": 3, 76 "item": { 77 "@id": "https://okjek21family.com/", 78 "name": "Slot Maxwin Gacor" 79 } 80 }, { 81 "@type": "ListItem", 82 "position": 4, 83 "item": { 84 "@id": "https://okjek21family.com/", 85 "name": "OKJEK21" 86 } 87 }, { 88 "@type": "ListItem", 89 "position": 5, 90 "item": { 91 "@id": "https://okjek21family.com/", 92 "name": "OKJEK21 | Agen Slot Gacor Slot777 & RTP Slot Terbaru 2026" 93 } 94 }] 95 } 96 </script>
96 97
97<script type="application/ld+json"> 98 { 99 "@context": "https://schema.org", 100 "@type": "FAQPage", 101 "mainEntity": [{ 102 "@type": "Question", 103 "name": "Apa Itu OKJEK21?", 104 "acceptedAnswer": { 105 "@type": "Answer", 106 "text": "OKJEK21 adalah situs game online yang menawarkan berbagai jenis permainan taruhan dalam satu platform" 107 } 108 }, { 109 "@type": "Question", 110 "name": "Apakah Aman Bermain di Situs Gampang Menang OKJEK21?", 111 "acceptedAnswer": { 112 "@type": "Answer", 113 "text": "Tentu saja, OKJEK21 tampil sebagai salah satu penyedia layanan Game online terpercaya yang patut diperhitungkan." 114 } 115 }, { 116 "@type": "Question", 117 "name": "Apa Saja Permainan Yang Bisa Dimainkan Di OKJEK21?", 118 "acceptedAnswer": { 119 "@type": "Answer", 120 "text": "OKJEK21 menggandeng banyak penyedia game ternama seperti Pragmatic Play, PG Soft, dan Spadegaming. Pemain dapat memilih game favorit dari ratusan pilihan yang tersedia. Mulai dari game slot dengan fitur unik, hingga taruhan bola dengan odds kompetitif, semuanya tersedia dalam satu akun." 121 } 122 }] 123 } 124 </script>
124 125 126 127 128<!-- Meta Pixel Code -->
129<script>
vendor: 408 bytes, lines 129-138
129 130!function(f,b,e,v,n,t,s) 131{if(f.fbq)return;n=f.fbq=function(){n.callMethod? 132n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 133if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 134n.queue=[];t=b.createElement(e);t.async=!0; 135t.src=v;s=b.getElementsByTagName(e)[0]; 136s.parentNode.insertBefore(t,s)}(window, document,'script', 137'https://connect.facebook.net/en_US/fbevents.js'); 138fbq('init', '
1381736074437675264
vendor: 32 bytes, lines 138-139
138'); 139fbq('track', 'PageView');
140</script>
140 141<noscript><img height="1" width="1" style="display:none" 142src="https://www.facebook.com/tr?id=1736074437675264&ev=PageView&noscript=1" 143/></noscript> 144<!-- End Meta Pixel Code --> 145 146<!-- Meta Pixel Code -->
147<script>
vendor: 408 bytes, lines 147-156
147 148!function(f,b,e,v,n,t,s) 149{if(f.fbq)return;n=f.fbq=function(){n.callMethod? 150n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 151if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 152n.queue=[];t=b.createElement(e);t.async=!0; 153t.src=v;s=b.getElementsByTagName(e)[0]; 154s.parentNode.insertBefore(t,s)}(window, document,'script', 155'https://connect.facebook.net/en_US/fbevents.js'); 156fbq('init', '
1561373351608240520
vendor: 32 bytes, lines 156-157
156'); 157fbq('track', 'PageView');
158</script>
158 159<noscript><img height="1" width="1" style="display:none" 160src="https://www.facebook.com/tr?id=1373351608240520&ev=PageView&noscript=1" 161/></noscript> 162<!-- End Meta Pixel Code --> 163 164<!-- Meta Pixel Code -->
165<script>
vendor: 408 bytes, lines 165-174
165 166!function(f,b,e,v,n,t,s) 167{if(f.fbq)return;n=f.fbq=function(){n.callMethod? 168n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 169if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 170n.queue=[];t=b.createElement(e);t.async=!0; 171t.src=v;s=b.getElementsByTagName(e)[0]; 172s.parentNode.insertBefore(t,s)}(window, document,'script', 173'https://connect.facebook.net/en_US/fbevents.js'); 174fbq('init', '
1741079591621457609
vendor: 32 bytes, lines 174-175
174'); 175fbq('track', 'PageView');
176</script>
176 177<noscript><img height="1" width="1" style="display:none" 178src="https://www.facebook.com/tr?id=1079591621457609&ev=PageView&noscript=1" 179/></noscript> 180<!-- End Meta Pixel Code --> 181 182<!-- Google Tag Manager -->
183<script>
vendor: 331 bytes, lines 183-187
183(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 184new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 185j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 186'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 187})(window,document,'script','dataLayer','
187GTM-K65WP8TW
vendor: 3 bytes, line 187
187');
187</script>
187 188<!-- End Google Tag Manager --> 189 190<!-- Google tag (gtag.js) -->
vendor: 65 bytes, lines 190-191
190 191<script async src="https://www.googletagmanager.com/gtag/js?id=
191G-D6WFYSB3LP
vendor: 13 bytes, line 191
191"></script>
192<script> 193
vendor: 138 bytes, lines 193-197
193window.dataLayer = window.dataLayer || []; 194 function gtag(){dataLayer.push(arguments);} 195 gtag('js', new Date()); 196 197 gtag('config', '
197G-D6WFYSB3LP
vendor: 5 bytes, line 197
197');
198</script>
198 199 200<meta name="facebook-domain-verification" content="8t2qzfe6q5imq9dn5k90vghryu2js3" /> 201 202 <!-- Meta-End --> 203 204 <title>OKJEK21 Adalah Situs Slot Terbaik Di Indonesia,Pasti Gampang Menang Besar</title> 205 206 <link rel="icon" href="/images/favicon.png" type="image/png"> 207 208 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4Q6Gf2aSP4eDXB8Miphtr37CMZZQ5oXLH2yaXMJ2w8e2ZtHTl7GptT4jmndRuHDT" crossorigin="anonymous"> 209 210 211 <link rel="preconnect" href="https://fonts.googleapis.com"> 212 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 213 <link rel="preconnect" href="https://fonts.googleapis.com"> 214 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 215 <link href="https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900&family=Oswald:[email protected]&display=swap" rel="stylesheet"> 216 217
217<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
217 218
218<script src="/js/script.js?6ac987bb27d68"></script>
218 219
219<script src="/js/global.js?1787301696"></script>
219 220
220<script src="/js/toastify.js?1787301696"></script>
220 221
221<script src="/js/masonry.pkgd.min.js?1787301696"></script>
221 222
222<script src="/js/splide.min.js?1787301696"></script>
222 223
223<script src="/js/dataTables.js?1787301696"></script>
223 224
224<script src="/js/dataTables.bootstrap5.js?1787301696"></script>
224 225 226 227 <link rel="stylesheet" href="/css/toastify.css?1787301696"> 228 <link rel="stylesheet" href="/css/splide.min.css?1787301696"> 229 230 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css"> 231 232 233 <link rel="stylesheet" href="/css/template/GRN.css?1787301696"> 234 235 236 <link rel="stylesheet" href="/css/style.css?1787301696"> 237 <link rel="stylesheet" href="/css/logo.css?1787301696"> 238 <link rel="stylesheet" href="https://imgotp.viva88athenae.com//icomoon/style.css?1787301696"> 239 240 <style> 241 242 @font-face { 243 font-family: 'icomoon'; 244 font-display: swap; 245 src: url('https://imgotp.viva88athenae.com//icomoon/fonts/icomoon.ttf?1787301696') format('truetype'); 246 font-weight: normal; 247 font-style: normal; 248 } 249 250 </style> 251 252 253 </head> 254 <body> 255 256 257 258 <div class="wrapper"> 259 260 <aside class="box-sidebar"> 261 <style> 262 .sidebar-menu.active { 263 background-color: var(--bg-hover); 264 /* Or any custom color */ 265 } 266 267 .new-badge { 268 position: absolute; 269 right: 0; 270 top: 50%; 271 transform: translateY(-50%); 272 margin-right: 8px; 273 } 274</style> 275 276 277<div class="sidebar pb-4"> 278 <div class="sidebar-head d-none d-lg-block"> 279 <div class="d-flex justify-content-center align-items-center w-100 my-4"> 280 <a href="/" 281 onclick="event.preventDefault();content(`/`);unsetSidebarMenuActive()"><img 282 src="/images/logo.png?1787301696" 283 class="logo-sidebar" alt="Logo"></a> 284 </div> 285 286 </div> 287 <div class="sidebar-body"> 288 <div class="d-flex flex-column mx-3"> 289 <div class="d-flex flex-column"> 290 <div class="d-block d-lg-none mt-3 mt-lg-0"> 291 <style> 292 /*:root {*/ 293 /* --bg-surface: rgb(15, 25, 35);*/ 294 /* --text-deep: white;*/ 295 /* --text-surface: white;*/ 296 /* --bg-elevated: rgb(40, 50, 60);*/ 297 /* --placeholder-color: rgb(100, 110, 120);*/ 298 /*}*/ 299 300 /* Input Styles */ 301 .search-container { 302 position: relative; 303 z-index: 991; 304 width: 100%; 305 margin: auto; 306 } 307 308 .search-container input[type="text"] { 309 background-color: var(--bg-surface); 310 color: var(--text-deep); 311 border: 2px solid var(--bg-elevated); 312 outline: none; 313 padding: 8px 40px 8px 50px; /* Add padding for the icon */ 314 border-radius: 4px; 315 transition: border-color 0.2s ease; 316 width: 100%; 317 font-weight: 600; 318 font-size: 16px; 319 } 320 321 .search-container input[type="text"]::placeholder { 322 color: var(--placeholder-color); 323 opacity: 0.8; 324 } 325 326 327 .search-icon { 328 position: absolute; 329 top: 50%; 330 left: 16px; 331 transform: translateY(-50%); 332 color: var(--accent-color); 333 font-size: 20px; 334 pointer-events: none; /* Prevent icon from blocking input */ 335 } 336 337 .search-overlay { 338 position: fixed; 339 top: 0; 340 left: 0; 341 width: 100%; 342 height: 100%; 343 background-color: rgba(0, 0, 0, 0.5); 344 z-index: 990; 345 display: none; 346 } 347 348 .search-result { 349 position: absolute; 350 z-index: 991; 351 width: 100%; 352 height: 440px; 353 max-height: 440px; 354 background-color: var(--bg-surface); 355 border-radius: 8px; 356 overflow-y: auto; 357 box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5); 358 display: none; 359 } 360 361 .search-result-item { 362 padding: 12px 16px; 363 color: var(--text-surface); 364 cursor: pointer; 365 transition: background-color 0.2s; 366 } 367 368 .search-result-item:hover { 369 background-color: var(--bg-elevated); 370 } 371</style> 372 373<div class="search-widget"> 374 <div class="search-overlay" onclick="closeSearch(this)"></div> 375 376 <div class="search-container"> 377 <span class="search-icon"><i class="icon-search text-accent fs-xl"></i></span> 378 <input 379 type="text" 380 placeholder="Search" 381 class="form-control" 382 onfocus="openSearch(this)" 383 oninput="debouncedSearch(this)" 384 > 385 386 <div class="search-result rounded mt-3"></div> 387 </div> 388</div> 389
390<script> 391 392 393 // Debounced version of searchGame 394 var debouncedSearch = debounce(function (input) { 395 searchGame(input); 396 }, 300); 397 398 function debounce(func, delay = 300) { 399 let timeout; 400 return function (...args) { 401 clearTimeout(timeout); 402 timeout = setTimeout(() => func.apply(this, args), delay); 403 }; 404 } 405 406 function searchGame(input) { 407 const container = input.closest('.search-widget'); 408 const value = input.value.trim(); 409 const resultBox = container.querySelector('.search-result'); 410 const overlay = container.querySelector('.search-overlay'); 411 412 if (value) { 413 resultBox.style.display = 'block'; 414 overlay.style.display = 'block'; 415 416 resultBox.innerHTML = ` 417 <div class="w-100 h-100 d-flex justify-content-center align-items-center"> 418 <div class="spinner-border text-primary" role="status"></div> 419 </div> 420 `; 421 422 const settings = { 423 url: encodeURI(`/game/search?name=${value}`), 424 method: "GET", 425 timeout: 0, 426 }; 427 428 $.ajax(settings).done(function (response) { 429 resultBox.innerHTML = response; 430 }); 431 } else { 432 resultBox.style.display = 'none'; 433 overlay.style.display = 'none'; 434 } 435 } 436 437 function openSearch(input) { 438 const container = input.closest('.search-widget'); 439 container.querySelector('.search-overlay').style.display = 'block'; 440 document.body.classList.add('search-active'); 441 442 if (window.innerWidth <= 768) { 443 setTimeout(() => { 444 const offset = input.getBoundingClientRect().top + window.scrollY - 16; 445 window.scrollTo({ top: offset, behavior: 'smooth' }); 446 }, 100); 447 } 448 } 449 450 function closeSearch(overlay) { 451 const container = overlay.closest('.search-widget'); 452 container.querySelector('.search-overlay').style.display = 'none'; 453 container.querySelector('.search-result').style.display = 'none'; 454 document.body.classList.remove('search-active'); 455 456 input.blur(); 457 } 458 459 function checkFocus(input) { 460 const container = input.closest('.search-widget'); 461 setTimeout(() => { 462 if (!container.contains(document.activeElement)) { 463 closeSearch(container.querySelector('.search-overlay')); 464 } 465 }, 200); 466 } 467 468 469 470</script>
470 471 </div> 472 473 <div 474 class="d-flex flex-lg-row flex-md-column flex-sm-column gap-2 align-items-center h-100 mt-3 mt-lg-0"> 475 <a class="btn btn-promotion w-100" href="/promosi" 476 onclick="event.preventDefault(); content( `/promosi`);">Promosi</a> 477 <a class="btn btn-event w-100" href="/event" 478 onclick="event.preventDefault(); content( `/event`)">Event</a> 479 </div> 480 </div> 481 482 <div class="d-flex flex-column gap-2 mt-3 mt-lg-2"> 483 484 <!-- Togel --> 485 486 <ul class="menu-group"> 487 <li class="menu-item"> 488 <a id="menu-togel" class="sidebar-menu btn-menu" href="/togel" 489 onclick="event.preventDefault();content( `/togel`);setSidebarMenuActive(this); generateTogelToken();"> 490 <div style="width: 16px"><i class="icon-togel text-accent fs-md"></i></div> 491 <span class="menu-name">Togel</span> 492 </a> 493 </li> 494 </ul> 495 496 <!-- Togel --> 497 498 <!-- Menu Game --> 499 500 <ul class="menu-group"> 501 <li class="menu-item"> 502 <a id="menu-slot" class="sidebar-menu btn-menu" 503 href="/game/slot" 504 onclick="event.preventDefault();content( `/game/slot`);setSidebarMenuActive(this)"> 505 <div style="width: 16px"><i class="icon-slot text-accent fs-md"></i></div> 506 <span class="menu-name">Slot</span> 507 </a> 508 509 </li> 510 </ul> 511 512 <ul class="menu-group"> 513 <li class="menu-item"> 514 <a id="menu-casino" class="sidebar-menu btn-menu" 515 href="/game/casino" 516 onclick="event.preventDefault();content( `/game/casino`);setSidebarMenuActive(this)"> 517 <div style="width: 16px"><i class="icon-live-casino text-accent fs-md"></i></div> 518 <span class="menu-name">Casino</span> 519 </a> 520 521 </li> 522 </ul> 523 524 <ul class="menu-group"> 525 <li class="menu-item"> 526 <a id="menu-sports" class="sidebar-menu btn-menu" 527 href="/game/sports" 528 onclick="event.preventDefault();content( `/game/sports`);setSidebarMenuActive(this)"> 529 <div style="width: 16px"><i class="icon-sports text-accent fs-md"></i></div> 530 <span class="menu-name">Sports</span> 531 </a> 532 533 </li> 534 </ul> 535 536 <ul class="menu-group"> 537 <li class="menu-item"> 538 <a id="menu-sabung" class="sidebar-menu btn-menu" 539 href="/game/sabung" 540 onclick="event.preventDefault();content( `/game/sabung`);setSidebarMenuActive(this)"> 541 <div style="width: 16px"><i class="icon-sabung text-accent fs-md"></i></div> 542 <span class="menu-name">Sabung</span> 543 </a> 544 545 </li> 546 </ul> 547 548 <ul class="menu-group"> 549 <li class="menu-item"> 550 <a id="menu-arcade" class="sidebar-menu btn-menu" 551 href="/game/arcade" 552 onclick="event.preventDefault();content( `/game/arcade`);setSidebarMenuActive(this)"> 553 <div style="width: 16px"><i class="icon-arcade text-accent fs-md"></i></div> 554 <span class="menu-name">
554Arcade</span> 555 </a> 556 557 </li> 558 </ul> 559 560 <ul class="menu-group"> 561 <li class="menu-item"> 562 <a id="menu-interactive" class="sidebar-menu btn-menu" 563 href="/game/interactive" 564 onclick="event.preventDefault();content( `/game/interactive`);setSidebarMenuActive(this)"> 565 <div style="width: 16px"><i class="icon-interactive text-accent fs-md"></i></div> 566 <span class="menu-name">Interactive</span> 567 </a> 568 569 </li> 570 </ul> 571 572 <!-- Kupon --> 573 <ul class="menu-group"> 574 <li class="menu-item"> 575 <a id="menu-kupon" class="sidebar-menu btn-menu" 576 onclick="event.preventDefault();content( `/coupon`);setSidebarMenuActive(this);"> 577 <div style="width: 16px"><i class="icon-kupon text-accent fs-md"></i></div> 578 <span class="menu-name">Kupon</span> 579 </a> 580 581 </li> 582 </ul> 583 <!-- Kupon --> 584 585 <!-- Menu Social Media --> 586 587 <ul class="menu-group"> 588 <li class="menu-item"> 589 <a class="btn-menu" href="https://t.me/Okjek21Official_Bot" target="_blank" 590 aria-label="Visit telegram" rel="noopener noreferrer"> 591 <div style="width: 16px"><i class="icon-telegram text-accent fs-md"></i></div> 592 <span class="menu-name">Telegram</span> 593 </a> 594 </li> 595 596 <li class="menu-item"> 597 <a class="btn-menu" href="http://ppk4d.com/waokjek" target="_blank" 598 aria-label="Visit whatsapp" rel="noopener noreferrer"> 599 <div style="width: 16px"><i class="icon-whatsapp text-accent fs-md"></i></div> 600 <span class="menu-name">Whatsapp</span> 601 </a> 602 </li> 603 604 <li class="menu-item"> 605 <a class="btn-menu" href="https://www.facebook.com/profile.php?id=61578798729259" target="_blank" 606 aria-label="Visit facebook" rel="noopener noreferrer"> 607 <div style="width: 16px"><i class="icon-facebook text-accent fs-md"></i></div> 608 <span class="menu-name">Facebook</span> 609 </a> 610 </li> 611 612 <li class="menu-item"> 613 <a class="btn-menu" href="https://www.instagram.com/" target="_blank" 614 aria-label="Visit instagram" rel="noopener noreferrer"> 615 <div style="width: 16px"><i class="icon-instagram text-accent fs-md"></i></div> 616 <span class="menu-name">Instagram</span> 617 </a> 618 </li> 619 620 </ul> 621 622 <!-- Menu Informasi --> 623 624 <ul class="menu-group"> 625 626 627 628 <li class="menu-item"> 629 <a id="menu-tentang" class="sidebar-menu btn-menu" 630 href="/informasi/tentang" 631 onclick="event.preventDefault();content(`/informasi/tentang`);setSidebarMenuActive(this)"=> 632 <div style="width: 16px"><i class="icon-about-us text-accent fs-md"></i></div> 633 <span class="menu-name">Tentang Kami</span> 634 </a> 635 </li> 636 637 <li class="menu-item"> 638 <a id="menu-bantuan" class="sidebar-menu btn-menu" 639 href="/informasi/bantuan" 640 onclick="event.preventDefault();content(`/informasi/bantuan`);setSidebarMenuActive(this)"> 641 <div style="width: 16px"><i class="icon-help text-accent fs-md"></i></div> 642 <span class="menu-name">FAQ</span> 643 </a> 644 </li> 645 646 <li class="menu-item"> 647 <a id="menu-peraturan" class="sidebar-menu btn-menu" 648 href="/informasi/peraturan" 649 onclick="event.preventDefault();content(`/informasi/peraturan`);setSidebarMenuActive(this)"> 650 <div style="width: 16px"><i class="icon-regulation text-accent fs-md"></i></div> 651 <span class="menu-name">Peraturan</span> 652 </a> 653 </li> 654 655 <li class="menu-item"> 656 <a id="menu-bank" class="sidebar-menu btn-menu" 657 href="/informasi/bank" 658 onclick="event.preventDefault();content(`/informasi/bank`);setSidebarMenuActive(this)"> 659 <div style="width: 16px"><i class="icon-bank-info text-accent fs-md"></i></div> 660 <span class="menu-name">Informasi Bank</span> 661 </a> 662 </li> 663 </ul> 664 665 666 667 </div> 668 669 670 671 </div> 672 </div> 673</div> 674
675<script> 676 677 var sidebarTabs = { 678 "/game/slot": "menu-slot", 679 "/game/casino": "menu-casino", 680 "/game/sports": "menu-sports", 681 "/game/arcade": "menu-arcade", 682 "/game/sabung": "menu-sabung", 683 "/game/interactive": "menu-interactive", 684 "/informasi/tentang": "menu-tentang", 685 "/informasi/bantuan": "menu-bantuan", 686 "/informasi/peraturan": "menu-peraturan", 687 "/informasi/bank": "menu-bank", 688 }; 689 690 document.addEventListener("DOMContentLoaded", function () { 691 const currentURL = window.location.href; 692 693 for (let path in sidebarTabs) { 694 if (currentURL.includes(path)) { 695 const menuId = sidebarTabs[path]; 696 const menuElement = document.getElementById(menuId); 697 if (menuElement) { 698 setSidebarMenuActive(menuElement); 699 } 700 break; 701 } 702 } 703 }); 704 705 function unsetSidebarMenuActive() { 706 // Remove active from all 707 document.querySelectorAll('.sidebar-menu').forEach(menu => { 708 menu.classList.remove('active'); 709 }); 710 } 711 712 713 function setSidebarMenuActive(el) { 714 unsetSidebarMenuActive(); 715 716 // Add active to clicked one 717 el.classList.add('active'); 718 } 719 720 721</script>
721 </aside> 722 723 724 <main class="main"> 725 <div id="box-navbar"> 726 <style> 727 .navbar { 728 height: 60px; 729 max-height: 60px; 730 } 731 732 .dropdown-setting::after { 733 display: none; 734 } 735 736 .flag-icon { 737 width: 22px; 738 height: 16px; 739 object-fit: cover; 740 border-radius: 2px; 741 } 742 743 /* FIXED WIDTH */ 744 .lang-dropdown { 745 width: 72px; /* adjust as needed */ 746 } 747 748 .lang-dropdown .dropdown-menu { 749 width: 100%; 750 } 751 752 .lang-dropdown .dropdown-toggle { 753 width: 100%; 754 text-align: left; 755 } 756 757 .lang-dropdown .dropdown-toggle::after { 758 display: none; /* hides the arrow */ 759 } 760 761 .lang-dropdown .dropdown-menu { 762 width: auto; /* menu auto width */ 763 min-width: 0; /* important: avoid forced minimum */ 764 } 765 766 .lang-dropdown .dropdown-item.active { 767 background-color: var(--btn-accent-background, rgba(76, 175, 80, 0.2)); 768 color: var(--text-accent, #4CAF50); 769 } 770 771 .lang-dropdown .dropdown-item:hover { 772 background-color: rgba(255, 255, 255, 0.1); 773 } 774 775</style> 776 777 778<nav id="navbar" class="navbar shadow w-100" data-bs-theme="dark"> 779 780 <div class="container h-100 flex-nowrap"> 781 <div> 782 <a href="javascript:content('/')" class="navbar-brand d-block d-md-block d-lg-block d-xl-none h-100 p-0 m-0"> 783 <img src="/images/logo.png?1787301696" class="logo-navbar" alt="Logo"> 784 </a> 785 </div> 786 787 788 <div class="d-flex align-items-center gap-3 h-100"> 789 <a class="btn-text fw-semibold"></a> 790 </div> 791 792 793 <div class="d-flex align-items-center gap-3 gap-lg-4"> 794 <a class="btn-text fw-semibold" href="/login" onclick="event.preventDefault();openLoginModal();">Login</a> 795 <a type="button" class="btn btn-accent fw-semibold rounded-1" href="/register" onclick="event.preventDefault();openRegisterModal()">Register</a> 796 </div> 797 798 </div> 799</nav> 800 801 802 803 804 805 <!-- Modal Login --> 806 <div class="modal fade" id="modal-login" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 807 <div class="modal-dialog modal-dialog-centered"> 808 <div class="modal-content bg-surface"> 809 <div class="modal-header bg-base border-0"> 810 <div class="modal-title"><img src='/images/logo.png?1787301696' class="logo-popup"></div> 811 <button type="button" class="text-white ms-auto fw-semibold" data-bs-dismiss="modal" aria-label="Close" style="background: var(--btn-accent-background); border: none; color: white; font-weight: 500; font-size: 0.75rem; padding: 0.3rem 0.8rem; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; cursor: pointer;">CLOSE</button> 812 </div> 813 <div class="modal-body"> 814 <form id="login-form"> 815 <div class="mb-3"> 816 <label for="login-username" class="form-label">Username</label> 817 <input id="login-username" class="form-control" placeholder="Username"> 818 <span id="error-username" class="fs-sm text-danger"></span> 819 </div> 820 <div class="mb-3"> 821 <label for="login-password" class="form-label">Password</label> 822 <input id="login-password" type="password" class="form-control" placeholder="Password"> 823 <span id="error-password" class="fs-sm text-danger"></span> 824 </div> 825 826 <div class="form-check mb-3"> 827 <input class="form-check-input" type="checkbox" id="remember-me" checked> 828 <label class="form-check-label" for="remember-me"> 829 Remember Me 830 </label> 831 </div> 832 833 <button id="login-button" type="submit" class="btn btn-accent mt-3 mt-lg-4 w-100" style="height: 40px">Sign In</button> 834 </form> 835 836 <a href="https://telegram.me/OKJek21_bot" id="login-surface" type="submit" class="btn btn-elevated mt-2 mt-lg-2 w-100" style="height: 40px"><i class="bi bi-telegram me-2" style="color: #24A1DE"></i>Main di Telegram</a> 837 </div> 838 </div> 839 </div> 840</div> 841 842 843
844<script> 845 document.addEventListener("DOMContentLoaded", function() { 846 const loginModal = document.getElementById('modal-login'); 847 loginModal.addEventListener('shown.bs.modal', function () { 848 849 const remember = localStorage.getItem('remember'); 850 851 if (remember === 'true') { 852 document.getElementById('login-username').value = localStorage.getItem('username') || ''; 853 document.getElementById('login-password').value = localStorage.getItem('password') || ''; 854 document.getElementById('remember-me').checked = true; 855 856 if(!localStorage.getItem('username')) document.getElementById('login-username').focus(); 857 858 } else if (remember === 'false') { 859 document.getElementById('login-username').value = ''; 860 document.getElementById('login-password').value = ''; 861 document.getElementById('remember-me').checked = false; 862 863 document.getElementById('login-username').focus(); 864 } 865 }); 866 867 document.getElementById('login-form').addEventListener('submit', function (e) { 868 e.preventDefault(); // prevent default form submission 869 login(); // call your custom login logic 870 }); 871 }); 872 873 874 function login() { 875 876 const username = $('#login-username').val(); 877 const password = $('#login-password').val(); 878 const captcha = $('#login-captcha').val(); 879 const remember = $('#remember-me').prop('checked'); 880 881 $('#login-button').prop('disabled', true); 882 883 const formData = { 884 username: username, 885 password: password, 886 game_data: window.game_data, 887 grand_data: window.grand_data, 888 captcha: captcha 889 }; 890 891 window.api.post("/api/login", formData, { 892 onSuccess: (response) => { 893 if (remember) { 894 localStorage.setItem('username', username); 895 localStorage.setItem('password', password); 896 localStorage.setItem('remember', 'true'); 897 } else { 898 localStorage.removeItem('username'); 899 localStorage.removeItem('password'); 900 localStorage.setItem('remember', 'false'); 901 } 902 903 $('#modal-login').modal('hide'); 904 navbar(); 905 bottomNavbar(); 906 content("/"); 907 toast(response.error.message); 908 $('#login-button').prop('disabled', false).text('Login'); 909 910 openModalSyarat(); 911 if (window.game_data == 'kuponotp' && window.grand_data == 'kpn') { 912 if (window.kupon_type && window.kupon_periode) { 913 window.location.href = "/coupon?type=" + encodeURIComponent(window.kupon_type) + "&periode=" + encodeURIComponent(window.kupon_periode); 914 } else { 915 window.location.href = "/coupon"; 916 } 917 } else if (response.data.game && response.data.game.url) { 918 launch(response.data.game.url, response.data.game.width, response.data.game.height); 919 } 920 }, 921 onError: (response) => { 922 if (response.error && response.error.message) { 923 toast(response.error.message, response.error.code); 924 } else { 925 toast('Terjadi kesalahan, silakan coba lagi'); 926 } 927 refreshCaptcha('captcha-login'); 928 $('#login-button').prop('disabled', false).text('Login'); 929 } 930 }); 931 }; 932</script>
932 933 <!-- Modal Register --> 934 <div class="modal fade" id="modal-register" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> 935 <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable"> 936 <div class="modal-content bg-surface"> 937 <div class="modal-header bg-base border-0"> 938 <div class="modal-title"><img src='/images/logo.png?1787301696' class="logo-popup"></div> 939 <button type="button" class="text-white ms-auto fw-semibold" data-bs-dismiss="modal" aria-label="Close" style="background: var(--btn-accent-background); border: none; color: white; font-weight: 500; font-size: 0.75rem; padding: 0.3rem 0.8rem; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; cursor: pointer;">CLOSE</button> 940 </div> 941 <div class="modal-body"> 942 <form> 943 <div class="row mb-3"> 944 <div class="col-12"> 945 <label for="register-username" class="form-label">Username</label> 946 <input id="register-username" class="form-control" placeholder="Username 6-16 karakter standar (A~Z, a~z, 0~9) dan tanpa spasi"> 947 <span id="error-username_reg" class="fs-sm text-danger"></span> 948 </div> 949 </div> 950 <div class="row mb-3"> 951 <div class="col-6"> 952 <label for="register-password" class="form-label">Password</label> 953 <input id="register-password" type="password" class="form-control" placeholder="Password (6 Karakter atau Lebih)"> 954 <span id="error-register-password" class="fs-sm text-danger"></span> 955 </div> 956 <div class="col-6"> 957 <label for="register-konfirmasi-password" class="form-label">Konfirmasi Password</label> 958 <input id="register-konfirmasi-password" type="password" class="form-control" placeholder="Password Sekali Lagi"> 959 <span id="error-konfirmasi-password" class="fs-sm text-danger"></span> 960 </div> 961 <span id="error-password_reg" class="fs-sm text-danger"></span> 962 </div> 963 <div class="row mb-3"> 964 <div class="col-6"> 965 <label for="register-email" class="form-label">Email</label> 966 <input id="register-email" type="email" class="form-control" placeholder="Email"> 967 <span id="error-email" class="fs-sm text-danger"></span> 968 </div> 969 <div class="col-6"> 970 <label for="register-notelp" class="form-label">Nomor Handphone</label> 971 <input id="register-notelp" type="number" class="form-control" placeholder="Nomor Handphone"> 972 <span id="error-telpon" class="fs-sm text-danger"></span> 973 </div> 974 </div> 975 <div class="row mb-3"> 976 <div class="col-6"> 977 <label for="register-bank" class="form-label">Bank / E-wallet</label> 978 <select id="register-bank" class="form-select"> 979 <option value="">Pilih Bank</option> 980 <option value="BCA">BCA</option> 981 <option value="BJB">BJB</option> 982 <option value="BNI">BNI</option> 983 <option value="BRI">BRI</option> 984 <option value="CIMB">CIMB</option> 985 <option value="DANA">DANA</option> 986 <option value="Danamon">Danamon</option> 987 <option value="DBS">DBS</option> 988 <option value="GOPAY">GOPAY</option> 989 <option value="JAGO">JAGO</option> 990 <option value="Mandiri">Mandiri</option> 991 <option value="Maybank">Maybank</option> 992 <option value="OCBC">OCBC</option> 993 <option value="OVO">OVO</option> 994 <option value="PANIN">PANIN</option> 995 <option value="Permata">Permata</option> 996 <option value="SeaBank">SeaBank</option> 997 </select> 998 <span id="error-bank" class="fs-sm text-danger"></span> 999 </div> 1000 <div class="col-6"> 1001 <label for="register-norek" class="form-label">Nomor Rekening</label> 1002 <input id="register-norek" type="text" class="form-control" placeholder="Nomor Rekening" oninput="this.value = this.value.replace(/[^0-9]/g, '')"> 1003 <span id="error-rekening" class="fs-sm text-danger"></span> 1004 </div> 1005 </div> 1006 <div class="row mb-3"> 1007 <div class="col-6"> 1008 <label for="register-narek" class="form-label">Nama Rekening</label> 1009 <input id="register-narek" class="form-control" placeholder="Nama sesuai Rekening"> 1010 <span id="error-nama" class="fs-sm text-danger"></span> 1011 </div> 1012 <div class="col-6"> 1013 <label for="register-ref" class="form-label">Referal</label> 1014 <input id="register-ref" type="text" class="form-control" placeholder="Username Referal bila ada"> 1015 <span id="error-ref" class="fs-sm text-danger"></span> 1016 </div> 1017 </div> 1018 <div style="margin-top:15px"> 1019 <label class="checkbox-inline" style="display: flex; gap: 4px"> 1020 <input type="checkbox" checked="" disabled=""> 1021 <div>Dengan ini saya menyatakan bahwa saya telah membaca dan menyetujui <a href="javascript:content('/informasi/peraturan')" style="color: cornflowerblue;">Kebijakan Privasi</a>
1021 pada Situs ini.</div> 1022 </label> 1023 </div> 1024 <div class="mb-3"> 1025 <label id="alert" class="form-label text-danger"></label> 1026 </div> 1027 <button type="button" onclick="register()" class="btn btn-accent mt-3 w-100" style="height: 40px" disabled>Daftar</button> 1028 </form> 1029 </div> 1030 </div> 1031 </div> 1032 </div> 1033 1034
1035<script> 1036 1037 1038document.addEventListener("DOMContentLoaded", function () { 1039 const regModal = document.getElementById("modal-register"); 1040 const registerButton = regModal.querySelector("button[onclick='register()']"); 1041 1042 const fields = { 1043 username: { 1044 el: document.getElementById("register-username"), 1045 error: document.getElementById("error-username_reg"), 1046 validate: val => /^[a-zA-Z0-9]{6,16}$/.test(val), 1047 message: "Username harus 6â16 karakter (A-Z, a-z, 0-9)", 1048 touched: false 1049 }, 1050 password: { 1051 el: document.getElementById("register-password"), 1052 error: document.getElementById("error-register-password"), 1053 validate: val => val.length >= 6, 1054 message: "Password minimal 6 karakter", 1055 touched: false 1056 }, 1057 confirmPassword: { 1058 el: document.getElementById("register-konfirmasi-password"), 1059 error: document.getElementById("error-konfirmasi-password"), 1060 validate: () => 1061 fields.password.el.value === fields.confirmPassword.el.value && 1062 fields.confirmPassword.el.value.length >= 6, 1063 message: "Password tidak cocok", 1064 touched: false 1065 }, 1066 email: { 1067 el: document.getElementById("register-email"), 1068 error: document.getElementById("error-email"), 1069 validate: val => /^\S+@\S+\.\S+$/.test(val), 1070 message: "Format email tidak valid", 1071 touched: false 1072 }, 1073 phone: { 1074 el: document.getElementById("register-notelp"), 1075 error: document.getElementById("error-telpon"), 1076 validate: val => /^[0-9]{10,16}$/.test(val), 1077 message: "Nomor telepon 10 - 16 digit", 1078 touched: false 1079 }, 1080 bank: { 1081 el: document.getElementById("register-bank"), 1082 error: document.getElementById("error-bank"), 1083 validate: val => val !== "", 1084 message: "Silakan pilih bank", 1085 touched: false 1086 }, 1087 norek: { 1088 el: document.getElementById("register-norek"), 1089 error: document.getElementById("error-rekening"), 1090 validate: val => val.length > 0, 1091 message: "Nomor rekening wajib diisi", 1092 touched: false 1093 }, 1094 narek: { 1095 el: document.getElementById("register-narek"), 1096 error: document.getElementById("error-nama"), 1097 validate: val => val.length > 0, 1098 message: "Nama rekening wajib diisi", 1099 touched: false 1100 }, 1101 }; 1102 1103 function validateField(field) { 1104 1105 const val = field.el.value.trim(); 1106 const isValid = typeof field.validate === "function" ? field.validate(val) : true; 1107 1108 if (field.touched && field.error) { 1109 field.error.textContent = isValid ? "" : field.message; 1110 } else if (field.error) { 1111 field.error.textContent = ""; 1112 } 1113 1114 return isValid; 1115 } 1116 1117 function checkForm() { 1118 let allValid = true; 1119 for (const key in fields) { 1120 const valid = validateField(fields[key]); 1121 if (!valid) allValid = false; 1122 } 1123 registerButton.disabled = !allValid; 1124 } 1125 1126 for (const key in fields) { 1127 const field = fields[key]; 1128 ["focus", "input", "blur"].forEach(evt => { 1129 field.el.addEventListener(evt, () => { 1130 field.touched = true; 1131 validateField(field); 1132 checkForm(); 1133 }); 1134 }); 1135 } 1136 1137 regModal.addEventListener("shown.bs.modal", function () { 1138 fields.username.el.focus(); 1139 checkForm(); 1140 }); 1141}); 1142 1143function allowOnlyText(inputEl, errorEl) { 1144 inputEl.addEventListener("input", function () { 1145 let original = this.value; 1146 // Keep only letters (AâZ, aâz) and spaces 1147 this.value = this.value.replace(/[^a-zA-Z\s]/g, ""); 1148 1149 // Show error if something was removed 1150 if (original !== this.value) { 1151 errorEl.textContent = "Nama rekening harus alfabet (AâZ, aâz)"; 1152 } else { 1153 errorEl.textContent = ""; 1154 } 1155 }); 1156} 1157 1158document.addEventListener("DOMContentLoaded", function () { 1159 const narekInput = document.getElementById("register-narek"); 1160 const narekError = document.getElementById("error-nama"); 1161 1162 allowOnlyText(narekInput, narekError); 1163}); 1164 1165 function register() { 1166 1167 const formData = { 1168 nama: $('#register-narek').val(), 1169 username_reg: $('#register-username').val(), 1170 bank: $('#register-bank').val(), 1171 telpon: $('#register-notelp').val(), 1172 email: $('#register-email').val(), 1173 rekening: $('#register-norek').val(), 1174 password_reg: $('#register-password').val(), 1175 password_reg_confirmation: $('#register-konfirmasi-password').val(), 1176 ref: $('#register-ref').val(), 1177 captcha_reg: $('#register-captcha').val() 1178 }; 1179 1180 window.api.post("/api/register", formData, { 1181 onSuccess: (response) => { 1182 $('#alert').removeClass('text-danger').addClass('text-success').text('Register berhasil!');
1183 $('#modal-register').modal('hide'); 1184 navbar(); 1185 bottomNavbar(); 1186 content("/welcome"); 1187 1188 toast(response.error.message); 1189 }, 1190 onError: (response) => { 1191 if (response.error && response.error.message) { 1192 toast(response.error.message, response.error.code); 1193 } else { 1194 toast('Terjadi kesalahan, silakan coba lagi'); 1195 } 1196 refreshCaptcha('captcha-register'); 1197 } 1198 }); 1199 }; 1200 1201</script>
1201 1202 1203
1204<script> 1205 var i18nNavs = { 1206 transaction: "Transaksi", 1207 loadingTransaction: "Memuat halaman transaksi...", 1208 failedLoadTransaction: "Gagal memuat halaman transaksi. Silakan coba lagi.", 1209 tryAgain: "Coba Lagi", 1210 memoIncoming: "[Memo] Pesan Masuk.", 1211 error: "Error" 1212 }; 1213 1214 function openTransactionModal() { 1215 if (typeof openTransactionModalWithTab === 'function') { 1216 openTransactionModalWithTab('deposit'); 1217 return; 1218 } 1219 $('.modal').modal('hide'); 1220 $('.modal-backdrop').remove(); 1221 $('#dynamic-modal').remove(); 1222 $('body').removeClass('modal-open').css('padding-right', ''); 1223 1224 setTimeout(function() { 1225 const modalHtml = ` 1226 <div class="modal" id="dynamic-modal" tabindex="-1" aria-hidden="true"> 1227 <div class="modal-dialog modal-dialog-centered modal-fixed"> 1228 <div class="modal-content bg-surface"> 1229 <div class="modal-header bg-base border-0 d-flex justify-content-between align-items-center"> 1230 <h5 class="modal-title">${i18nNavs.transaction}</h5> 1231 <button type="button" 1232 class="close-capsule" 1233 data-bs-dismiss="modal" 1234 aria-label="Close" 1235 style="">CLOSE</button> 1236 </div> 1237 <div class="modal-body p-0" id="modal-content-container"> 1238 <div class="d-flex justify-content-center align-items-center p-5"> 1239 <div class="spinner-border text-primary" role="status"></div> 1240 <span class="ms-3">${i18nNavs.loadingTransaction}</span> 1241 </div> 1242 </div> 1243 </div> 1244 </div> 1245 </div> 1246 `; 1247 1248 $('body').append(modalHtml); 1249 $('#dynamic-modal').modal('show'); 1250 1251 $.ajax({ 1252 url: '/user/transaction', 1253 method: 'GET', 1254 success: function(response) { 1255 $('#modal-content-container').html(response).animate({opacity: 1}, 300); 1256 if (typeof initializeTransactionModal === 'function') { 1257 initializeTransactionModal(); 1258 } 1259 }, 1260 error: function(xhr, status, error) { 1261 console.error('Failed to load transaction content:', error); 1262 $('#modal-content-container').html(` 1263 <div class="container-fluid p-4 text-center"> 1264 <div class="alert alert-danger"> 1265 <h5>Error</h5> 1266 <p>Gagal memuat halaman transaksi. Silakan coba lagi.</p> 1267 <button class="btn btn-accent" onclick="openTransactionModal()">${i18nNavs.tryAgain}</button> 1268 </div> 1269 </div> 1270 `).animate({opacity: 1}, 300); 1271 } 1272 }); 1273 }, 200); 1274 } 1275 1276 function openTransactionTab(tabName) { 1277 if (typeof openTransactionModalWithTab === 'function') { 1278 openTransactionModalWithTab(tabName); 1279 } else { 1280 openTransactionModal(); 1281 setTimeout(function() { 1282 if ($('#dynamic-modal #' + tabName + '-tab').length) { 1283 $('#dynamic-modal #' + tabName + '-tab').click(); 1284 } 1285 }, 1000); 1286 } 1287 } 1288 1289 function logout() { 1290 $.ajax({ 1291 url: '/api/logout', 1292 method: 'GET', 1293 success: function () { 1294 window.location.reload(); 1295 }, 1296 error: function (xhr) { 1297 console.error('Logout failed:', xhr.responseText); 1298 } 1299 }); 1300 } 1301 1302 unreadMemo = 0; 1303 1304 function setMemoBadge(value) { 1305 unreadMemo = value; 1306 if(value < 1) { 1307 $('.unread-memo-badge').html(''); 1308 $('#navbar-profile-badge').hide(); 1309 } else { 1310 1311 badgeValue = unreadMemo > 99 ? "99+" : unreadMemo; 1312 $('.unread-memo-badge').html(`<span class="badge text-bg-secondary">${ badgeValue }</span>`); 1313 1314 $('#navbar-profile-badge').html(badgeValue).show(); 1315 } 1316 1317 } 1318 1319 function decreaseMemo() { 1320 if(unreadMemo > 0) { 1321 unreadMemo--; 1322 setMemoBadge(unreadMemo); 1323 } 1324 } 1325 1326 firstload = true; 1327 1328 function getBalance() { 1329 var settings = { 1330 "url": "/api/user/balance?format=0&symbol=0", 1331 "method": "GET", 1332 "timeout": 0, 1333 }; 1334 1335 $.ajax(settings).done(function (response) { 1336 if(response.error.code == 200) { 1337 1338 credit = parseInt(response.data.credit); 1339 1340 // Pulse Deposit Button 1341 if (credit < 400) { 1342 $('#bottom-navbar-deposit').addClass('halo-effect'); 1343 } else { 1344 $('#bottom-navbar-deposit').removeClass('halo-effect'); 1345 } 1346 1347 $('#balance-value').html(credit.toLocaleString('en-US', { 1348 maximumFractionDigits: 0 1349 })); 1350 1351 1352 1353 if(response.data.unreadMemo > unreadMemo && !firstload) { 1354 toast(i18nNavs.memoIncoming); 1355 } 1356 1357 setMemoBadge(response.data.unreadMemo); 1358 1359 var wpc = parseInt(response.data.wheelPendingCount) || 0; 1360 if (wpc > 0) { 1361 var wpcLabel = wpc > 99 ? '99+' : wpc; 1362 if ($('#spinwheel-badge').length) { 1363 $('#spinwheel-badge').text(wpcLabel).show(); 1364 } else { 1365 $('#openSpinwheelBtn').append('<span id="spinwheel-badge" class="badge text-bg-danger" style="position: absolute; top: 2px; right: 2px; font-size: 9px; min-width: 16px; height: 16px; padding: 2px 4px; border-radius: 8px; line-height: 12px;">' + wpcLabel + '</span>'); 1366 } 1367 } else { 1368 $('#spinwheel-badge').hide(); 1369 } 1370 $('#wheel-chance-spin').text('Chance : ' + wpc); 1371
1372 if(firstload) firstload = false; 1373 1374 1375 } else { 1376 logout(); 1377 } 1378 }).fail(function (jqXHR, textStatus, errorThrown) { 1379 console.error("Failed to load balance:", textStatus, errorThrown); 1380 logout(); 1381 });; 1382 } 1383 1384 1385 function getWheels() { 1386 var settings = { 1387 url: "/api/user/generate-wheel-ticket", 1388 method: "GET", 1389 timeout: 0 1390 }; 1391 1392 $.ajax(settings).done(function (response) { 1393 if (response?.error?.code === 200) { 1394 toastAction( 1395 "ð " + response.error.message, 1396 200, 1397 "SPIN SEKARANG", 1398 "openSpinwheelBtn" 1399 ); 1400 } 1401 }).fail(function (jqXHR, textStatus, errorThrown) { 1402 console.error("Failed to load wheel:", textStatus, errorThrown); 1403 logout(); 1404 }); 1405 } 1406 1407 1408 1409 function refreshCaptcha(element) { 1410 $(`#${element}`).attr('src', "/api/captcha?" + Date.now()); 1411 } 1412 1413 // Language switcher now uses direct links to /set-locale 1414 // No need for JavaScript - handled by server-side redirect 1415 1416 1417 1418</script>
1418 1419 1420<style id="cs-embed-custom-styles"> 1421 /* Generated widget appearance â theme: light */ 1422.cs-embed { 1423 --cs-primary: #16a34a; 1424 --cs-secondary: #06b6d4; 1425 --cs-panel-width: 360px; 1426 --cs-panel-height: 520px; 1427 --cs-footer-bg: #fff; 1428 --cs-footer-border: #f1f5f9; 1429 --cs-input-row-bg: #f1f5f9; 1430 --cs-input-text: #111827; 1431 --cs-input-muted: #64748b; 1432 --cs-upload-bg: #fff; 1433 --cs-upload-border: #cbd5e1; 1434 --cs-upload-icon: #334155; 1435 --cs-image-preview-bg: #eff6ff; 1436 --cs-image-preview-border: #dbeafe; 1437 --cs-closed-notice: #9ca3af; 1438 --cs-scrollbar-track: #eef2f7; 1439 --cs-scrollbar-thumb: #cbd5e1; 1440 --cs-scrollbar-thumb-hover: #94a3b8; 1441 --cs-messages-bg: #f8fafc; 1442 --cs-sticky-banner-bg: #fffbeb; 1443 --cs-sticky-banner-border: #fde68a; 1444 --cs-sticky-banner-inner-bg: #fff; 1445 --cs-sticky-banner-inner-border: #fde68a; 1446 --cs-sticky-banner-text: #92400e; 1447 right: 24px; left: auto; align-items: flex-end; 1448} 1449 1450.cs-embed .cs-panel { 1451 background: #fff; 1452 color: #111827; 1453} 1454 1455.cs-embed .cs-bubble--agent { 1456 background: #fff; 1457 color: #111; 1458 border-color: #e5e7eb; 1459} 1460 1461.cs-toggle:not(.cs-toggle--banner) { 1462 background: var(--cs-primary); 1463 box-shadow: 0 4px 12px rgba(22, 163, 74, 0.4); 1464} 1465 1466.cs-header { 1467 background: linear-gradient(135deg, #16a34a, #06b6d4); 1468} 1469 1470.cs-bubble--customer { 1471 background: #16a34a; 1472 color: #ffffff; 1473} 1474</style>
1475<script src="https://service.lc1001ai.com/embed.js"></script>
1475 1476
1476<script> 1477 (function () { 1478 var chatServiceUrl = "https://service.lc1001ai.com"; 1479 var channelId = "6a87d314498ca8c6baaafb1d"; 1480 var credentials = null; 1481 var showWidget = true; 1482 window.CsChatEmbed 1483 .init({ 1484 chatServiceUrl: chatServiceUrl, 1485 channelId: channelId, 1486 credentials: credentials, 1487 showWidget: showWidget, 1488 fetchAppearance: false, 1489 onError: function (err) { 1490 console.error("Chat error:", err); 1491 }, 1492 onActivity: function (activity) { 1493 console.log("Chat activity:", activity); 1494 }, 1495 }) 1496 .then(function (result) { 1497 console.log("Chat connected, sessionId:", result.sessionId); 1498 }) 1499 .catch(function (err) { 1500 console.error("Chat init failed:", err); 1501 }); 1502 })(); 1503 </script>
1503 1504 </div> 1505 1506 1507 <div id="box-content"> 1508 <div id="content"> 1509 <div> 1510 <div class="bg-elevated page-header position-relative overflow-hidden"> 1511 <div class="container position-relative h-100"> 1512 <!-- Content layer --> 1513 <div class="d-flex align-items-center justify-content-between h-100 position-relative" style="z-index:2;"> 1514 <!-- Left content --> 1515 <h3 class="text-capitalize mb-0">Togel</h3> 1516 1517 <!-- Right content --> 1518 <a href="/wap" class="btn btn-sm btn-accent rounded-pill d-flex align-items-center gap-2 px-3"> 1519 <span>WAP</span> 1520 <i class="bi bi-box-arrow-up-right"></i> 1521 </a> 1522 </div> 1523 1524 <!-- Decorative Image inside container --> 1525 <img 1526 src="https://imgotp.viva88athenae.com//header-togel.png" 1527 alt="Header Togel" 1528 class="position-absolute top-0 end-0 h-100" 1529 style="z-index:1; object-fit:contain; pointer-events:none;" 1530 /> 1531 </div> 1532 </div> 1533 1534 1535 1536 1537 <div class="container mt-3"> 1538 <div class="d-flex flex-column"> 1539 <ul class="nav nav-pills" id="togel-tabs"> 1540 <li class="nav-item"> 1541 <a class="nav-link " id="tab-pasaran" href="javascript:content('/togel/pasaran', 'content-togel')"><i class="icon-pasaran text-secondary"></i><span class="ms-2">Pasaran</span></a> 1542 </li> 1543 <li class="nav-item"> 1544 <a class="nav-link " id="tab-keluaran" href="javascript:content('/togel/keluaran', 'content-togel')"><i class="icon-keluaran text-secondary"></i><span class="ms-2">Keluaran</span></a> 1545 </li> 1546 <li class="nav-item"> 1547 <a class="nav-link " id="tab-mimpi" href="javascript:content('/togel/mimpi', 'content-togel')"><i class="icon-buku-mimpi text-secondary"></i><span class="ms-2">Buku Mimpi</span></a> 1548 </li> 1549 </ul> 1550 </div> 1551 </div> 1552 1553 <div id="content-togel" class="mt-3"> 1554 <style> 1555 .togel-pasaran-grid-desktop { 1556 display: grid; 1557 grid-template-columns: repeat(6, 1fr); 1558 gap: .5rem; 1559 } 1560 1561 .border-elevated { border-color: var(--bg-elevated); } 1562 .border-surface { border-color: var(--bg-surface); } 1563 .card-base { background-color: var(--bg-base); color: var(--text-base); } 1564 1565 .togel-countdown { 1566 font-size: var(--fs-sm); 1567 font-weight: 400; 1568 color: #ffc107; 1569 display: none; 1570 } 1571 1572 .btn-pasaran[disabled] { 1573 background-color: var(--bg-deep) !important; 1574 opacity: 1 !important; 1575 filter: brightness(1.2); 1576 border: 0 solid var(--bg-deep); 1577 color: var(--text-muted, #bbb); 1578 } 1579</style> 1580 1581<!-- Mobile --> 1582<div class="container d-block d-lg-none"> 1583 <section id="splide-pasaran" class="splide"> 1584 <div class="splide__track"> 1585 <ul class="splide__list"> 1586 <li class="splide__slide"> 1587 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" id="bt
1587n-list-pasaran"> 1588 <div class="d-flex gap-2 align-items-center" onclick="content(`/togel/pasaran/list`, 'content-pasaran');selectPasaran()"> 1589 <i class="bi bi-file-spreadsheet-fill subtext-color"></i> 1590 <div>LIST PASARAN</div> 1591 </div> 1592 <em class="togel-countdown" id="countdown-list" style="display:none;"></em> 1593 </button> 1594 </li> 1595 1596 <li class="splide__slide"> 1597 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1598 onclick="openLoginModal();selectPasaran(this)" 1599 > 1600 <div class="d-flex gap-2 align-items-center"> 1601 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1602 <div>TOTO WUHAN</div> 1603 </div> 1604 <em class="togel-countdown" id="countdown-TWH"></em> 1605 </button> 1606 </li> 1607 <li class="splide__slide"> 1608 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1609 onclick="openLoginModal();selectPasaran(this)" 1610 > 1611 <div class="d-flex gap-2 align-items-center"> 1612 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1613 <div>HK SIANG</div> 1614 </div> 1615 <em class="togel-countdown" id="countdown-HKD"></em> 1616 </button> 1617 </li> 1618 <li class="splide__slide"> 1619 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1620 onclick="openLoginModal();selectPasaran(this)" 1621 > 1622 <div class="d-flex gap-2 align-items-center"> 1623 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1624 <div>CAMBODIA</div> 1625 </div> 1626 <em class="togel-countdown" id="countdown-CMB"></em> 1627 </button> 1628 </li> 1629 <li class="splide__slide"> 1630 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1631 onclick="openLoginModal();selectPasaran(this)" 1632 > 1633 <div class="d-flex gap-2 align-items-center"> 1634 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1635 <div>SG METRO</div> 1636 </div> 1637 <em class="togel-countdown" id="countdown-SGM"></em> 1638 </button> 1639 </li> 1640 <li class="splide__slide"> 1641 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1642 onclick="openLoginModal();selectPasaran(this)" 1643 > 1644 <div class="d-flex gap-2 align-items-center"> 1645 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1646 <div>SYDNEY</div> 1647 </div> 1648 <em class="togel-countdown" id="countdown-SYD"></em> 1649 </button> 1650 </li> 1651 <li class="splide__slide"> 1652 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1653 onclick="openLoginModal();selectPasaran(this)" 1654 > 1655 <div class="d-flex gap-2 align-items-center"> 1656 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1657 <div>SYDNEY POOL</div> 1658 </div> 1659 <em class="togel-countdown" id="countdown-SYDP"></em> 1660 </button> 1661 </li> 1662 <li class="splide__slide"> 1663 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1664 onclick="openLoginModal();selectPasaran(this)" 1665 > 1666 <div class="d-flex gap-2 align-items-center"> 1667 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1668 <div>SINGAPORE</div> 1669 </div> 1670 <em class="togel-countdown" id="countdown-SGA"></em> 1671 </button> 1672 </li> 1673 <li class="splide__slide"> 1674 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1675 onclick="openLoginModal();selectPasaran(this)" 1676 > 1677 <div class="d-flex gap-2 align-items-center"> 1678 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1679 <div>MALAYSIA SIANG</div> 1680 </div> 1681 <em class="togel-countdown" id="countdown-MYD"></em> 1682 </button> 1683 </li> 1684 <li class="splide__slide"> 1685 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1686 onclick="openLoginModal();selectPasaran(this)" 1687 > 1688 <div class="d-flex gap-2 align-items-center"> 1689 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1690 <div>MALAYSIA</div> 1691 </div> 1692 <em class="togel-countdown" id="countdown-MY"></em> 1693 </button> 1694 </li> 1695 <li class="splide__slide"> 1696 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1697 onclick="openLoginModal();selectPasaran(this)" 1698 > 1699 <div class="d-flex gap-2 align-items-center"> 1700 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1701 <div>MACAU</div> 1702 </div> 1703 <em class="togel-countdown" id="countdown-MC"></em> 1704 </button> 1705 </li> 1706 <li class="splide__slide"> 1707 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1708 onclick="openLoginModal();selectPasaran(this)" 1709 > 1710 <div class="d-flex gap-2 align-items-center"> 1711 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1712 <div>
1712QATAR</div> 1713 </div> 1714 <em class="togel-countdown" id="countdown-QTR"></em> 1715 </button> 1716 </li> 1717 <li class="splide__slide"> 1718 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1719 onclick="openLoginModal();selectPasaran(this)" 1720 > 1721 <div class="d-flex gap-2 align-items-center"> 1722 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1723 <div>HK MALAM</div> 1724 </div> 1725 <em class="togel-countdown" id="countdown-HKN"></em> 1726 </button> 1727 </li> 1728 <li class="splide__slide"> 1729 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1730 onclick="openLoginModal();selectPasaran(this)" 1731 > 1732 <div class="d-flex gap-2 align-items-center"> 1733 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1734 <div>HONGKONG</div> 1735 </div> 1736 <em class="togel-countdown" id="countdown-HKB"></em> 1737 </button> 1738 </li> 1739 <li class="splide__slide"> 1740 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1741 onclick="openLoginModal();selectPasaran(this)" 1742 > 1743 <div class="d-flex gap-2 align-items-center"> 1744 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1745 <div>TOTOMACAU 0000</div> 1746 </div> 1747 <em class="togel-countdown" id="countdown-TMC00"></em> 1748 </button> 1749 </li> 1750 <li class="splide__slide"> 1751 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1752 onclick="openLoginModal();selectPasaran(this)" 1753 > 1754 <div class="d-flex gap-2 align-items-center"> 1755 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1756 <div>TOTOMACAU 1300</div> 1757 </div> 1758 <em class="togel-countdown" id="countdown-TMC13"></em> 1759 </button> 1760 </li> 1761 <li class="splide__slide"> 1762 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1763 onclick="openLoginModal();selectPasaran(this)" 1764 > 1765 <div class="d-flex gap-2 align-items-center"> 1766 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1767 <div>TOTOMACAU 1600</div> 1768 </div> 1769 <em class="togel-countdown" id="countdown-TMC16"></em> 1770 </button> 1771 </li> 1772 <li class="splide__slide"> 1773 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1774 onclick="openLoginModal();selectPasaran(this)" 1775 > 1776 <div class="d-flex gap-2 align-items-center"> 1777 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1778 <div>TOTOMACAU 1900</div> 1779 </div> 1780 <em class="togel-countdown" id="countdown-TMC19"></em> 1781 </button> 1782 </li> 1783 <li class="splide__slide"> 1784 <button class="btn btn-elevated btn-togel btn-pasaran d-flex justify-content-between align-items-center fs-sm" 1785 onclick="openLoginModal();selectPasaran(this)" 1786 > 1787 <div class="d-flex gap-2 align-items-center"> 1788 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1789 <div>TOTOMACAU 2200</div> 1790 </div> 1791 <em class="togel-countdown" id="countdown-TMC22"></em> 1792 </button> 1793 </li> 1794 </ul> 1795 </div> 1796 </section> 1797</div> 1798 1799<!-- Desktop --> 1800<div class="container d-none d-lg-block"> 1801 <div class="togel-pasaran-grid-desktop"> 1802 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1803 onclick="openLoginModal();selectPasaran(this)"> 1804 <div class="d-flex gap-2 align-items-center"> 1805 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1806 <div>TOTO WUHAN</div> 1807 </div> 1808 <em class="togel-countdown" id="countdown-desktop-TWH"></em> 1809 </button> 1810 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1811 onclick="openLoginModal();selectPasaran(this)"> 1812 <div class="d-flex gap-2 align-items-center"> 1813 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1814 <div>HK SIANG</div> 1815 </div> 1816 <em class="togel-countdown" id="countdown-desktop-HKD"></em> 1817 </button> 1818 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1819 onclick="openLoginModal();selectPasaran(this)"> 1820 <div class="d-flex gap-2 align-items-center"> 1821 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1822 <div>CAMBODIA</div> 1823 </div> 1824 <em class="togel-countdown" id="countdown-desktop-CMB"></em> 1825 </button> 1826 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1827 onclick="openLoginModal();selectPasaran(this)"> 1828 <div class="d-flex gap-2 align-items-center"> 1829 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1830 <div>SG METRO</div> 1831 </div> 1832 <em class="togel-countdown" id="countdown-desktop-SGM"></em> 1833 </button> 1834 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1835 onclick="openLoginModal();selectPasaran(this)"> 1836 <div class="d-flex gap-2 align-items-center"> 1837 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1838 <div>SYDNEY</div> 1839 </div> 1840 <em class="togel-countdown" id="countdown-desktop-SYD"></em> 1841 </button> 1842 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1843 onclick="openLoginModal();selectPasaran(this)"> 1844 <div class="d-flex gap-2 align-items-center"> 1845 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1846 <div>SYDNEY POOL</div> 1847 </div> 1848 <em class="togel-countdown" id="countdown-desktop-SYDP"></em> 1849 </button> 1850 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1851 onclick="openLoginModal();selectPasaran(this)"> 1852 <div class="d-flex gap-2 align-items-center"> 1853 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1854 <div>SINGAPORE</div> 1855 </div> 1856 <em class="togel-countdown" id="countdown-desktop-SGA"></em> 1857 </button> 1858 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1859 onclick="openLoginModal();selectPasaran(this)"> 1860 <div class="d-flex gap-2 align-items-center"> 1861 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1862 <div>MALAYSIA SIANG</div> 1863 </div> 1864 <em class="togel-countdown" id="countdown-desktop-MYD"></em> 1865 </button> 1866 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1867 onclick="openLoginModal();selectPasaran(this)"> 1868 <div class="d-flex gap-2 align-items-center"> 1869 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1870 <div>MALAYSIA</div> 1871 </div> 1872 <em class="togel-countdown" id="countdown-desktop-MY"></em> 1873 </button> 1874 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1875 onclick="openLoginModal();selectPasaran(this)"> 1876 <div class="d-flex gap-2 align-items-center"> 1877 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1878 <div>MACAU</div> 1879 </div> 1880 <em class="togel-countdown" id="countdown-desktop-MC"></em> 1881 </button> 1882 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1883 onclick="openLoginModal();selectPasaran(this)"> 1884 <div class="d-flex gap-2 align-items-center"> 1885 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1886 <div>
1886QATAR</div> 1887 </div> 1888 <em class="togel-countdown" id="countdown-desktop-QTR"></em> 1889 </button> 1890 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1891 onclick="openLoginModal();selectPasaran(this)"> 1892 <div class="d-flex gap-2 align-items-center"> 1893 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1894 <div>HK MALAM</div> 1895 </div> 1896 <em class="togel-countdown" id="countdown-desktop-HKN"></em> 1897 </button> 1898 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1899 onclick="openLoginModal();selectPasaran(this)"> 1900 <div class="d-flex gap-2 align-items-center"> 1901 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1902 <div>HONGKONG</div> 1903 </div> 1904 <em class="togel-countdown" id="countdown-desktop-HKB"></em> 1905 </button> 1906 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1907 onclick="openLoginModal();selectPasaran(this)"> 1908 <div class="d-flex gap-2 align-items-center"> 1909 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1910 <div>TOTOMACAU 0000</div> 1911 </div> 1912 <em class="togel-countdown" id="countdown-desktop-TMC00"></em> 1913 </button> 1914 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1915 onclick="openLoginModal();selectPasaran(this)"> 1916 <div class="d-flex gap-2 align-items-center"> 1917 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1918 <div>TOTOMACAU 1300</div> 1919 </div> 1920 <em class="togel-countdown" id="countdown-desktop-TMC13"></em> 1921 </button> 1922 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1923 onclick="openLoginModal();selectPasaran(this)"> 1924 <div class="d-flex gap-2 align-items-center"> 1925 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1926 <div>TOTOMACAU 1600</div> 1927 </div> 1928 <em class="togel-countdown" id="countdown-desktop-TMC16"></em> 1929 </button> 1930 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1931 onclick="openLoginModal();selectPasaran(this)"> 1932 <div class="d-flex gap-2 align-items-center"> 1933 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1934 <div>TOTOMACAU 1900</div> 1935 </div> 1936 <em class="togel-countdown" id="countdown-desktop-TMC19"></em> 1937 </button> 1938 <button class="btn btn-elevated btn-togel btn-pasaran fs-sm d-flex justify-content-between align-items-center" 1939 onclick="openLoginModal();selectPasaran(this)"> 1940 <div class="d-flex gap-2 align-items-center"> 1941 <i class="bi bi-check-circle-fill text-accent icon-status"></i> 1942 <div>TOTOMACAU 2200</div> 1943 </div> 1944 <em class="togel-countdown" id="countdown-desktop-TMC22"></em> 1945 </button> 1946 </div> 1947</div> 1948 1949<div id="content-pasaran" class="container mt-3"></div> 1950
1951<script> 1952 SHOW_THRESHOLD_MINUTES = 30; 1953 countdownTimers = {}; 1954 finishedCountdowns = {}; // â Prevent multiple onCountdownFinished 1955 selectedPasaranId = null; 1956 1957 // Initialize Splide for mobile 1958 var splidePasaran = new Splide('#splide-pasaran', { 1959 autoWidth: true, 1960 pagination: false, 1961 drag: 'free', 1962 gap: '.5rem', 1963 focus: 'center', 1964 arrows: false, 1965 }); 1966 splidePasaran.mount(); 1967 1968 // Convert "WIB" string to UTC time 1969 function parseWIBTime(datetimeStr) { 1970 if (!datetimeStr) return null; 1971 const clean = datetimeStr.replace(' WIB', '').trim(); 1972 const [datePart, timePart] = clean.split(' '); 1973 const [year, month, day] = datePart.split('-').map(Number); 1974 const [hour, minute, second] = timePart.split(':').map(Number); 1975 return Date.UTC(year, month - 1, day, hour - 7, minute, second); 1976 } 1977 1978 // Countdown handler 1979 function startCountdown(id, targetTime) { 1980 const el = document.getElementById(id); 1981 if (!el) return; 1982 clearInterval(countdownTimers[id]); 1983 1984 countdownTimers[id] = setInterval(() => { 1985 const now = Date.now(); 1986 const diff = targetTime - now; 1987 1988 if (diff <= 0) { 1989 if (!finishedCountdowns[id]) { 1990 finishedCountdowns[id] = true; 1991 el.style.display = 'none'; 1992 clearInterval(countdownTimers[id]); 1993 1994 const pasaranId = id.replace('countdown-desktop-', '').replace('countdown-', ''); 1995 updatePasaranIcon(pasaranId, 'closed'); 1996 onCountdownFinished(pasaranId); 1997 } 1998 return; 1999 } 2000 2001 const totalSeconds = Math.floor(diff / 1000); 2002 const minutes = Math.floor(totalSeconds / 60); 2003 const seconds = totalSeconds % 60; 2004 el.textContent = `${String(minutes).padStart(2, '0')}
2004:${String(seconds).padStart(2, '0')}`; 2005 el.style.display = 'block'; 2006 }, 1000); 2007 } 2008 2009 // Update icon color 2010 function updatePasaranIcon(pasaranId, status = 'active') { 2011 const icons = [ 2012 document.querySelector(`#btn-${pasaranId} .icon-status`), 2013 document.querySelector(`#btn-desktop-${pasaranId} .icon-status`) 2014 ]; 2015 icons.forEach(icon => { 2016 if (!icon) return; 2017 if (status === 'closed') { 2018 icon.className = 'bi bi-dash-circle-fill text-danger icon-status'; 2019 } else if (status === 'active') { 2020 icon.className = 'bi bi-check-circle-fill text-accent icon-status'; 2021 } 2022 }); 2023 } 2024 2025 // Called when countdown finished (only once) 2026 function onCountdownFinished(pasaranId) { 2027 console.log(`â° Countdown finished for ${pasaranId}`); 2028 if (selectedPasaranId === pasaranId) { 2029 content(`/togel/pasaran/closed`, 'content-pasaran'); 2030 } 2031 } 2032 2033 // Fetch and update pasaran list 2034 function pollPasaranData() { 2035 window.api.get(`/togel/get-all-pasaran`, {}, { 2036 onSuccess: (response) => { 2037 if (!response || !Array.isArray(response)) return; 2038 const now = Date.now(); 2039 2040 response.forEach(p => { 2041 const cdm = document.getElementById(`countdown-${p.name_id}`); 2042 const cdd = document.getElementById(`countdown-desktop-${p.name_id}`); 2043 const nextTutup = parseWIBTime(p.next_tutup); 2044 const timeUntilTutup = nextTutup - now; 2045 const shouldShowCountdown = (p.status === 1) && (timeUntilTutup <= SHOW_THRESHOLD_MINUTES * 60 * 1000); 2046 2047 if (finishedCountdowns[`countdown-${p.name_id}`]) return; 2048 2049 if (shouldShowCountdown) { 2050 if (!countdownTimers[`countdown-${p.name_id}`] && cdm) 2051 startCountdown(`countdown-${p.name_id}`, nextTutup); 2052 if (!countdownTimers[`countdown-desktop-${p.name_id}`] && cdd) 2053 startCountdown(`countdown-desktop-${p.name_id}`, nextTutup); 2054 } else { 2055 if (cdm) cdm.style.display = 'none'; 2056 if (cdd) cdd.style.display = 'none'; 2057 } 2058 }); 2059 }, 2060 onError: (err) => console.error("Error fetching pasaran:", err) 2061 }); 2062 } 2063 2064 // Run once on load 2065 pollPasaranData(); 2066 2067 // Button selection handler 2068 function selectPasaran(elem = '') { 2069 $('.btn-pasaran').removeClass('active'); 2070 if (elem !== '') { 2071 $(elem).addClass('active'); 2072 const id = elem.id.replace('btn-desktop-', '').replace('btn-', ''); 2073 selectedPasaranId = id; 2074 console.log(`ð¯ Selected pasaran: ${selectedPasaranId}`); 2075 } 2076 } 2077 2078 // List Pasaran button toggle 2079 $('#btn-list-pasaran').on('click', () => { 2080 $('#btn-list-pasaran').toggleClass('active'); 2081 selectedPasaranId = null; 2082 }); 2083 2084 // Default load list if no pasaran selected 2085 selectedId = $('.btn-pasaran.active').attr('id'); 2086 if (!selectedId) { 2087 $('#btn-list-pasaran').addClass('active'); 2088 content(`/togel/pasaran/list`, 'content-pasaran'); 2089 } 2090 // else, load that pasaran 2091 else { 2092 selectPasaran($(`#${selectedId}`)[0]); 2093 $(`#btn-${selectedPasaranId}`).addClass('active'); 2094 $(`#btn-desktop-${selectedPasaranId}`).addClass('active'); 2095 baseBetRoute = `/togel/pasaran/__PASARAN__/`; 2096 uriBet = baseBetRoute.replace('__PASARAN__', selectedPasaranId); 2097 content(uriBet, 'content-pasaran') 2098 } 2099</script>
2099 2100 2101<div class="footer bg-surface py-5 mt-5"> 2102 <div class="container"> 2103 2104 <div class="d-flex flex-column flex-lg-row justify-content-between align-items-start align-items-lg-center"> 2105 <div class="d-flex flex-column gap-1"> 2106 <div><img src="/images/logo.png?1787301696" class="logo-footer" alt="Logo"></div> 2107 <div class="fs-sm mt-3 text-nowrap">© 2026 Copyright OKJEK21. All Rights Reserved.</div> 2108 </div> 2109 2110 2111 <ul class="d-flex justify-content-evenly justify-content-lg-end align-items-center gap-3 w-100 mt-4 mt-lg-0"> 2112 2113 <li><a href="https://t.me/Okjek21Official_Bot" target="_blank" aria-label="Visit telegram" rel="noopener noreferrer"><i class="icon-telegram text-accent fs-lg"></i></a></li> 2114 <li><a href="http://ppk4d.com/waokjek" target="_blank" aria-label="Visit whatsapp" rel="noopener noreferrer"><i class="icon-whatsapp text-accent fs-lg"></i></a></li> 2115 <li><a href="https://www.facebook.com/profile.php?id=61578798729259" target="_blank" aria-label="Visit facebook" rel="noopener noreferrer"><i class="icon-facebook text-accent fs-lg"></i></a></li> 2116 <li><a href="https://www.instagram.com/" target="_blank" aria-label="Visit instagram" rel="noopener noreferrer"><i class="icon-instagram text-accent fs-lg"></i></a></li> 2117 2118 </ul> 2119 2120 </div> 2121 2122 <hr class="my-3 my-lg-5 w-100" /> 2123 2124 <div class="d-flex justify-content-center align-items-center"> 2125 <img class="w-100 d-none d-lg-block" src="https://imgotp.viva88athenae.com//providers.png" style="width: 100%" alt="Provider"/> 2126 <img class="w-100 d-block d-lg-none" src="https://imgotp.viva88athenae.com//mproviders.png" style="width: 100%" alt="Provider"/> 2127 </div> 2128 2129 <hr class="my-3 my-lg-5 w-100" /> 2130 2131 <div class="d-flex justify-content-center align-items-center py-4"> 2132 <img src="https://imgotp.viva88athenae.com//license.png" style="max-width: 800px; width: 100%" alt="License"/> 2133 </div> 2134 2135 <hr class="my-3 my-lg-5 w-100" /> 2136 2137 <h1 style="text-align: center;"><span style="color: rgb(217, 215, 50);">OKJEK21 | Agen Slot Gacor Slot777 & RTP Slot Terbaru 2026</span></h1> 2138 2139<p style="text-align: center;"><a href="https://okjek21family.com/" style="color: rgb(217, 215, 50);">OKJEK21</a> merupakan pusat informasi yang membahas berbagai hal seputar permainan slot online, termasuk informasi Slot777, perkembangan permainan populer, serta referensi RTP slot terbaru 2026. Halaman ini disusun untuk membantu pengunjung menemukan informasi yang relevan mengenai OKJEK21 secara lebih mudah dalam satu tempat.</p> 2140 2141<p style="text-align: center;">Selain membahas <a href="https://okjek21family.com/" style="color: rgb(217, 215, 50);">slot gacor</a> dan Slot777, OKJEK21 juga menghadirkan informasi mengenai RTP slot yang dapat digunakan sebagai salah satu referensi ketika membandingkan berbagai permainan. Nilai RTP merupakan informasi statistik mengenai persentase pengembalian teoretis dalam jangka panjang dan bukan jaminan hasil pada setiap sesi permainan.</p> 2142 2143<h2 style="text-align: center;">Informasi OKJEK21 Terbaru 2026</h2> 2144 2145<p style="text-align: center;">Perkembangan permainan online membuat informasi mengenai sebuah platform dan pilihan permainan terus berubah. Karena itu, halaman OKJEK21 ini dirancang dengan fokus pada informasi terbaru 2026, mulai dari pembahasan Slot777, istilah slot gacor, hingga referensi RTP slot yang sering dicari oleh pengguna.</p> 2146 2147<p style="text-align: center;">Pengunjung dapat menggunakan halaman ini sebagai titik awal untuk memahami berbagai istilah yang berkaitan dengan permainan slot. Dengan penyajian informasi yang lebih terstruktur, pencarian berdasarkan nama permainan, kategori, maupun data RTP dapat dilakukan dengan lebih praktis.</p> 2148 2149<h2 style="text-align: center;">Slot Gacor dan Cara Memahami Istilahnya</h2> 2150 2151<p style="text-align: center;">Istilah <strong>slot gacor</strong> banyak digunakan di internet untuk menggambarkan permainan yang menurut pengalaman atau pembahasan komunitas dianggap sedang menarik. Namun, istilah tersebut bukan ukuran statistik resmi dan tidak dapat digunakan untuk memastikan bahwa suatu permainan akan memberikan hasil tertentu.</p> 2152 2153<p style="text-align: center;">
2153Karena itu, informasi mengenai slot gacor sebaiknya dipahami sebagai istilah populer dalam komunitas, bukan sebagai jaminan kemenangan. Setiap hasil permainan tetap bersifat tidak pasti dan dapat berbeda pada setiap sesi.</p> 2154 2155<h2 style="text-align: center;">Mengenal Slot777</h2> 2156 2157<p style="text-align: center;"><strong>Slot777</strong> merupakan salah satu istilah yang banyak digunakan ketika pengguna mencari referensi permainan slot online. Pembahasan mengenai Slot777 dapat mencakup kategori permainan, karakteristik fitur, tampilan, mekanisme bonus, hingga informasi statistik yang tersedia.</p> 2158 2159<p style="text-align: center;">Dalam konteks OKJEK21, informasi Slot777 ditempatkan sebagai bagian dari referensi permainan sehingga pengunjung dapat memahami kategori yang sedang dicari tanpa harus berpindah-pindah halaman. Informasi sebaiknya selalu diperiksa kembali karena detail permainan dapat berubah sesuai penyedia dan versi yang tersedia.</p> 2160 2161<h2 style="text-align: center;">RTP Slot Terbaru 2026</h2> 2162 2163<p style="text-align: center;"><strong>RTP slot</strong> atau Return to Player merupakan persentase teoretis yang menggambarkan jumlah pengembalian rata-rata dalam jangka panjang berdasarkan mekanisme permainan. Sebagai contoh, sebuah permainan dengan RTP teoretis 96% berarti secara statistik jangka panjang model permainannya dirancang untuk mengembalikan sekitar 96% dari total taruhan, bukan berarti setiap pemain akan menerima kembali 96% dari dana yang dimainkan.</p> 2164 2165<p style="text-align: center;">Hal penting yang perlu dipahami adalah RTP tidak memprediksi hasil satu putaran atau satu sesi. Hasil aktual dapat mengalami variasi yang sangat besar. Oleh sebab itu, informasi RTP slot sebaiknya digunakan sebagai data pembanding dan bukan sebagai kepastian hasil.</p> 2166 2167<h2 style="text-align: center;">Mengapa Informasi RTP Banyak Dicari?</h2> 2168 2169<p style="text-align: center;">RTP menjadi salah satu informasi yang sering dicari karena memberikan gambaran mengenai karakteristik matematis sebuah permainan. Bersama dengan volatilitas, frekuensi fitur, dan mekanisme permainan, RTP dapat membantu pengguna memahami perbedaan antara satu permainan dengan permainan lainnya.</p> 2170 2171<p style="text-align: center;">Meski demikian, angka RTP saja tidak cukup untuk menentukan pengalaman atau hasil permainan. Permainan dengan RTP yang sama dapat memiliki karakteristik volatilitas berbeda sehingga distribusi hasilnya juga dapat berbeda.</p> 2172 2173<h2 style="text-align: center;">Panduan Membaca Informasi Slot</h2> 2174 2175<p style="text-align: center;">Sebelum menggunakan informasi mengenai sebuah permainan, perhatikan beberapa detail seperti nama permainan, penyedia, RTP yang tercantum, volatilitas, fitur utama, dan aturan permainan. Membaca informasi tersebut secara menyeluruh akan memberikan gambaran yang lebih objektif dibandingkan hanya mengandalkan istilah seperti âgacorâ.</p> 2176 2177<p style="text-align: center;">Informasi yang berasal dari sumber berbeda juga sebaiknya dibandingkan terlebih dahulu. Data RTP dapat ditampilkan dengan format berbeda dan beberapa permainan bahkan dapat memiliki konfigurasi atau versi yang berbeda.</p> 2178 2179<h2 style="text-align: center;">OKJEK21 dan Informasi Slot Terbaru</h2> 2180 2181<p style="text-align: center;">OKJEK21 berfokus pada penyajian informasi yang berkaitan dengan slot online, Slot777, slot gacor sebagai istilah populer, serta referensi RTP slot terbaru 2026. Struktur informasi dibuat agar pengunjung dapat menemukan topik yang dibutuhkan dengan lebih cepat.</p> 2182 2183<p style="text-align: center;">Dengan menggabungkan pembahasan mengenai permainan dan informasi statistik, halaman ini dapat menjadi referensi untuk memahami berbagai istilah yang sering muncul dalam pencarian terkait OKJEK21. Informasi yang tersedia tetap perlu dipahami sebagai referensi dan bukan sebagai jaminan terhadap hasil permainan.</p> 2184 2185<h2 style="text-align: center;">Kesimpulan</h2> 2186 2187<p style="text-align: center;"><a href="https://okjek21family.com/" style="color: rgb(217, 215, 50);">OKJEK21</a> menghadirkan pusat informasi seputar <strong>agen slot gacor, Slot777, dan RTP slot terbaru 2026</strong>. Pembahasan mencakup pengertian istilah slot gacor, informasi mengenai Slot777, serta cara memahami RTP secara lebih tepat.</p> 2188 2189<p style="text-align: center;">Dengan memahami informasi permainan dan statistik secara objektif, pengunjung dapat membedakan antara data teoretis, istilah populer, dan klaim yang belum tentu dapat dibuktikan. Selalu perhatikan aturan permainan, batas usia yang berlaku, serta ketentuan hukum di wilayah masing-masing sebelum menggunakan layanan permainan online.</p> 2190 2191 2192<style> 2193a#menu-slot, a#menu-casino, a#menu-sports, a#menu-sabung, a#menu-arcade, a#menu-interactive { 2194 background: radial-gradient(circle at center, #000000 0%, #000000 50%) !important; 2195 border-left: 6px solid #68ff68; 2196 border-right: 6px solid #68ff68; 2197 border-bottom: 2px solid #68ff68; 2198 border-top: 2px solid #68ff68; 2199 border-radius: 30px !important; 2200 transition: .7s !important; 2201} 2202 2203 a#menu-slot:hover, 2204 a#menu-casino:hover, 2205 a#menu-sports:hover, 2206 a#menu-sabung:hover, 2207 a#menu-arcade:hover, 2208 a#menu-interactive:hover { 2209 border-left: 6px solid #fff; 2210 border-right: 6px solid #fff; 2211 border-bottom: 2px solid #fff; 2212 border-top: 2px solid #fff; 2213 transition: .7s; 2214} 2215 2216.btn-menu { 2217 border-left: 6px solid #68ff68; 2218 border-right: 6px solid #68ff68; 2219 background: radial-gradient(circle at center, #000000 0%, #000000 70%) !important; 2220 border-radius: 30px !important; 2221 border-bottom: 2px solid #68ff68; 2222 border-top: 2px solid #68ff68; 2223 transition: .7s !important; 2224} 2225 2226.btn-menu:hover { 2227 border-left: 6px solid #fff; 2228 border-right: 6px solid #fff; 2229 border-bottom: 2px solid #fff; 2230 border-top: 2px solid #fff; 2231 transition: .7s; 2232} 2233 2234.menu-group { 2235 background: none; 2236 gap: 5px !important; 2237} 2238 2239.menu-item:hover { 2240 background: rgb(20 15 30) !important; 2241} 2242 2243.btn-menu:not(.sidebar-menu) { 2244 background: radial-gradient(circle at center, #000000 0%, #000000 70%); 2245 overflow: hidden; 2246 position: relative; 2247 margin: 2px 0px; 2248} 2249 2250.btn-menu:not(.sidebar-menu)::before { 2251 content: ""; 2252 position: absolute; 2253 inset: 0; 2254 border-radius: inherit;
2255 background: rgba(255,255,255,1.0); 2256 animation: menuBorderSpin 2.2s linear infinite; 2257 z-index: 0; 2258 filter: blur(5px); 2259} 2260 2261.btn-menu:not(.sidebar-menu)::after { 2262 content: ""; 2263 position: absolute; 2264 inset: 2px; 2265 border-radius: inherit; 2266 background: radial-gradient(circle at center, #000000 0%, #000000 70%); 2267 z-index: 1; 2268 position: 2269} 2270 2271.btn-menu:not(.sidebar-menu) > * { 2272 position: relative; 2273 z-index: 2; 2274} 2275 2276.btn-menu:not(.sidebar-menu) .menu-name { 2277 font-size: 14px; 2278 font-weight: 500; 2279} 2280 2281@keyframes menuBorderSpin { 2282 0% { transform: rotate(0deg); } 2283 100% { transform: rotate(360deg); } 2284} 2285 2286.text-accent { 2287 background: linear-gradient(0deg, #00ff40, #00ff40, #00ff40); 2288 background-clip: text !important; 2289 -webkit-text-fill-color: transparent; 2290 background-clip: text; 2291} 2292 2293.box-game { 2294 flex-shrink: 0; 2295 display: flex; 2296 flex-direction: column; 2297 overflow: hidden; 2298 transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1); 2299 cursor: pointer; 2300 position: relative; 2301 width: auto; 2302 max-width: 150px; 2303 border: 2px solid #68ff68; 2304 border-radius: 10px; 2305} 2306 2307.bg-elevated { 2308 background: linear-gradient(0deg, #00d231, #4bfb51); 2309 color: #000000; 2310} 2311 2312.btn-accent { 2313 color: var(--btn-accent-color); 2314 background: linear-gradient(3deg, #68ff68, #68ff68); 2315 border-color: #ffffff; 2316 animation: blinks 1.5s ease infinite; 2317 transition: opacity 0.3s ease; 2318} 2319 2320.game-name { 2321 color: #080808 !important; 2322} 2323 2324.subtext-color { 2325 color: #080808 !important; 2326} 2327 2328.btn-accent:hover { 2329 color: var(--btn-accent-color); 2330 background-color: rgb(0, 255, 64); 2331 border-color: white; 2332 animation-play-state: paused; 2333 opacity: 1 !important; 2334} 2335 2336.navbar { 2337 height: 60px; 2338 max-height: 60px; 2339 border-radius: 0 0 10px 10px; 2340 border-bottom: 1px solid #68ff68 2341} 2342 2343 2344@keyframes shinegradient{ 2345 0% { background-position: 0% 50%; } 2346 50% { background-position: 100% 50%; } 2347 100% { background-position: 0% 50%; } 2348 } 2349 2350@keyframes blinks { 2351 0% { opacity: 1; } 2352 50% { opacity: 0.5; } 2353 100% { opacity: 1; } 2354} 2355 2356@keyframes blinksss { 2357 0% { opacity: 1; } 2358 50% { opacity: 0; } 2359 100% { opacity: 1; } 2360} 2361</style> 2362 2363<style> 2364img.logo-navbar { 2365 height: 47px !important; 2366} 2367 2368.box-togel { 2369 aspect-ratio: 150 / 140; 2370 display: flex; 2371 flex-direction: column; 2372 background: rgb(0, 0, 0); 2373 color: var(--text-surface); 2374 border-radius: 10px; 2375 overflow: hidden; 2376 font-size: var(--fs-xs); 2377 cursor: pointer; 2378 transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1); 2379 border: 2px solid #68ff68; 2380} 2381.togel-name { 2382 margin-top: 0 !important; 2383 width: 100%; 2384 display: flex; 2385 justify-content: center; 2386 align-items: center; 2387 color: rgb(0, 0, 0) !important; 2388 font-weight: bold; 2389 background: linear-gradient(0deg, #00d231, #4bfb51) !important; 2390 padding: 5px; 2391 border-bottom: 2px solid #68ff68; 2392} 2393 2394.togel-result { 2395 color: rgb(255, 255, 255) !important; 2396 font-weight: 500 !important; 2397 font-size: xxx-large !important; 2398 position: relative; 2399 top: 6px; 2400 margin-bottom: 0px !important; 2401 overflow: visible; 2402 animation: fade-blinks 1.7s infinite ease-out; 2403} 2404 2405.togel-result::before { 2406 content: ""; 2407 width: calc(100% + 0px); 2408 height: calc(100% + 0px); 2409 inset: 0; 2410 z-index: 1; 2411 pointer-events: none; 2412 position: absolute; 2413 top: 0px; 2414 background: none; 2415 background-repeat: repeat-x, repeat-x, repeat-y, repeat-y; 2416 background-size: 7px 1px, 7px 1px, 1px 7px, 1px 7px; 2417 display: block; 2418 animation: border-suki 15s infinite linear; 2419 box-sizing: border-box; 2420 border-radius: 2px; 2421} 2422 2423.togel-date { 2424 height: 32px; 2425 width: 100%; 2426 display: grid; 2427 place-items: center; 2428 background: none; 2429 color: #07ff30; 2430 font-size: var(--fs-sm); 2431 position: relative; 2432 bottom: 70px; 2433} 2434 2435 2436</style> 2437 2438<style> 2439/* ===== Toggle Button (pojok kiri bawah) ===== */ 2440.okjek21-toggle-btn { 2441 position: fixed; 2442 left: 12px; 2443 bottom: 75px; 2444 background: linear-gradient(to bottom, #000000 0%, #000000 80%); 2445 color: #ffffff; 2446 padding: 9px 41px; 2447 border-radius: 25px; 2448 cursor: pointer; 2449 font-size: 16px; 2450 border: 2px solid #68ff68; 2451 border-right: 6px solid #68ff68; 2452 border-left: 6px solid #68ff68; 2453 z-index: 10000; 2454 transition: all 0.3s ease; 2455} 2456 2457.okjek21-toggle-btn:hover { 2458 background: #68ff68; 2459} 2460 2461/* ===== Sidebar Panel ===== */ 2462.okjek21-social { 2463 position: fixed; 2464 left: -320px; 2465 bottom: 87px; 2466 width: 294px; 2467 background: linear-gradient(to bottom, #000000 0%, #000000 80%); 2468 box-shadow: 4px 0 20px rgba(0, 0, 0, 0.5); 2469 z-index: 9999; 2470 transition: left 0.4s ease; 2471 padding: 6px; 2472 border-radius: 0 20px 20px 0; 2473 overflow-y: auto; 2474 z-index: 99999; 2475 box-shadow: inset 0 0 0 1px #68ff68, inset 0 2px 0 0 #68ff68, inset 0 4px 4px 2px #68ff68, 3px 3px 3px 1px rgba(0, 0, 0, 0.2); 2476 border-right: 2px solid #68ff68; 2477} 2478.okjek21-social.okjek21-open { 2479 left: 0; 2480} 2481 2482/* ===== Header Sidebar ===== */ 2483.okjek21-social h3 { 2484 color: #ffffff!important; 2485 font-size: 20px; 2486 margin-bottom: 4px;
2487} 2488.okjek21-social p { 2489 color: #68ff68; 2490 font-size: 14px; 2491 margin-bottom: 20px; 2492} 2493 2494/* ===== Menu List ===== */ 2495.okjek21-social ul { 2496 list-style: none; 2497} 2498.okjek21-social ul li { 2499 margin-bottom: 14px; 2500} 2501.okjek21-social ul li a { 2502 display: flex; 2503 align-items: center; 2504 justify-content: space-between; 2505 text-decoration: none; 2506 padding: 10px 14px; 2507 background: rgb(0 0 0); 2508 border: 1px solid rgb(0, 255, 8); 2509 border-radius: 14px; 2510 transition: all 0.3s ease; 2511} 2512.okjek21-social ul li a:hover { 2513 background: rgba(17, 255, 0, 0.1); 2514} 2515.okjek21-info { 2516 flex: 1; 2517 margin-left: 10px; 2518} 2519.okjek21-info span { 2520 color: rgb(0, 255, 51); 2521 font-weight: 500; 2522 font-size: 14px; 2523 display: block; 2524} 2525.okjek21-info small { 2526 color: #ffffff; 2527 font-size: 12px; 2528} 2529 2530/* Gambar ikon */ 2531.okjek21-social ul li img { 2532 width: 50px; 2533 height: 50px; 2534 border-radius: 10px; 2535} 2536 2537/* ===== Footer Close Button ===== */ 2538.okjek21-close-btn { 2539 display: block; 2540 position: unset !important; 2541 margin: 20px auto 0; 2542 padding: 8px 16px; 2543 border: 2px solid #68ff68; 2544 border-radius: 20px; 2545 font-size: 14px; 2546 color: #ffffff!important; 2547 background: transparent; 2548 cursor: pointer; 2549 transition: background 0.3s; 2550} 2551 @media (max-width: 400px) { 2552 .okjek21-toggle-btn { 2553 position: fixed; 2554 left: 1px; 2555 bottom: 87px; 2556 background: linear-gradient(to bottom, #000000 0%, #000000 80%); 2557 color: #fff; 2558 padding: 3px 7px; 2559 border-radius: 30px; 2560 cursor: pointer; 2561 font-size: 16px; 2562 text-transform: uppercase; 2563 border: 2px solid rgb(0, 255, 51); 2564 z-index: 10000; 2565 transition: all 0.3s ease; 2566} 2567 } 2568.okjek21-close-btn:hover { 2569 background: rgba(255,215,0,0.1); 2570} 2571</style> 2572<style> 2573 /* HAPUS @import font agar loading tidak terblokir. Gunakan font sistem. */ 2574 :root { 2575 --accent-color: #68ff68; 2576 --base-color: #000000; 2577 --glow-color: #68ff68; 2578 } 2579 2580 /* Optimasi: Gunakan will-change untuk performa animasi */ 2581 .merah-sosmed ul li a { 2582 display: flex; 2583 width: 55px; 2584 height: 55px; 2585 border: solid 2px var(--glow-color); 2586 border-radius: 5px; 2587 justify-content: center; 2588 align-items: center; 2589 background-color: #000000; 2590 /* Initial shadow static agar tidak berat saat load */ 2591 box-shadow: 0 0 5px var(--glow-color); 2592 transition: transform 0.3s ease, box-shadow 0.3s ease; 2593 will-change: box-shadow; /* Memberitahu browser untuk optimasi GPU */ 2594 animation: flicker-glow 2s infinite; /* Durasi diperlambat dari 1s ke 2s agar lebih hemat CPU */ 2595 } 2596 2597 /* Animasi dibuat lebih simple */ 2598 @keyframes flicker-glow { 2599 0%, 100% { box-shadow: 0 0 8px var(--glow-color); } 2600 50% { box-shadow: 0 0 3px #68ff68; } 2601 } 2602 2603 .hamburg { 2604 position: absolute; 2605 width: 80px; 2606 height: 80px; 2607 padding: 0.6rem; 2608 background-color: var(--base-color); 2609 border-radius: 10px; 2610 z-index: 80; 2611 box-shadow: 0px 0px 8px 1px rgba(53, 205, 68, 0.7); 2612 /* Ganti background-image dengan warna solid/gradient jika gambar gagal load atau berat */ 2613 background-image: url('https://warna-cloudinary.b-cdn.net/emas/Pause-GIF-image--1-.gif'); 2614 background-size: cover; 2615 background-position: center; 2616 cursor: pointer; 2617 } 2618 2619 .merah-sosmed { 2620 display: block; 2621 cursor: pointer; 2622 position: fixed; 2623 bottom: 18%; 2624 left: 10px; 2625 /* Gunakan font sistem yang cepat */ 2626 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; 2627 z-index: 9999; /* Pastikan di atas elemen lain */ 2628 } 2629 2630 .merah-sosmed ul { 2631 margin: 0; 2632 padding: 0; 2633 list-style: none; 2634 } 2635 2636 .merah-sosmed ul li { 2637 position: absolute; 2638 transform: translate(0, 0); 2639 transition: transform .4s cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity .3s ease; /* Easing lebih smooth */ 2640 opacity: 0; 2641 pointer-events: none; /* Mencegah klik saat menu tertutup */ 2642 } 2643 2644 /* Posisi saat terbuka - dioptimalkan */ 2645 .merah-sosmed.open ul li { pointer-events: auto; opacity: 1; } 2646 .merah-sosmed.open ul li:nth-child(1) { transform: translateY(-130px); } 2647 .merah-sosmed.open ul li:nth-child(2) { transform: translateY(-65px); } /* Jarak dirapikan agar tidak tumpang tindih */ 2648 .merah-sosmed.open ul li:nth-child(3) { transform: translateY(-195px); } 2649 .merah-sosmed.open ul li:nth-child(4) { transform: translateY(-260px); } 2650 .merah-sosmed.open ul li:nth-child(5) { transform: translateY(-325px); } 2651 .merah-sosmed.open ul li:nth-child(6) { transform: translateY(-390px); } 2652 2653 .merah-sosmed ul li a img { 2654 width: 100%; 2655 height: auto; 2656 display: block; 2657 } 2658 2659 /* Tooltip text */ 2660 .merah-sosmed ul li div { 2661 position: absolute; 2662 left: 65px; /* Langsung set posisi horizontal */ 2663 top: 50%; 2664 transform: translateY(-50%) scale(0.8); 2665 transition: all .2s ease; 2666 opacity: 0; 2667 font-size: 14px; 2668 font-weight: bold; 2669 background: rgba(0, 0, 0, 0.9); 2670 color: #ffffff; 2671 text-wrap: nowrap; 2672 border: 1px solid var(--glow-color); 2673 padding: 5px 10px; 2674 border-radius: 5px; 2675 pointer-events: none; 2676 } 2677 2678 .merah-sosmed ul li:hover div { 2679 opacity: 1;
2680 transform: translateY(-50%) scale(1); 2681 } 2682 2683 /* Attention Label */ 2684 .attention { 2685 position: relative; 2686 clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 49% 75%, 22% 100%, 22% 75%, 0% 75%); 2687 width: 80px; 2688 height: 30px; 2689 margin-bottom: 5px; 2690 left: 15px; 2691 background-color: #68ff68; 2692 color: #0fb300; 2693 display: flex; 2694 justify-content: center; 2695 align-items: center; 2696 padding-bottom: 8px; 2697 font-size: 12px; 2698 font-weight: bold; 2699 opacity: 0; 2700 transition: opacity 0.3s; 2701 } 2702 2703 .whore { 2704 animation: flicker 1.5s infinite; /* Diperlambat agar tidak sakit mata/berat */ 2705 } 2706 2707 @keyframes flicker { 2708 0%, 100% { opacity: 1; } 2709 50% { opacity: 0.3; } 2710 } 2711 2712 /* Media Queries yang disatukan */ 2713 @media screen and (max-width: 600px) { 2714 .merah-sosmed { bottom: 155px; left: 10px; } 2715 .LcButton { position: fixed; bottom: 55px; right: 14px; z-index: 100; width: 50px; height: 50px; } 2716 } 2717 @media only screen and (min-width: 601px) { 2718 .LcButton { display: none; } 2719 } 2720</style> 2721
2722<script> 2723 // Script lebih efisien dengan caching selector 2724 const menuContainer = document.querySelector('.merah-sosmed'); 2725 const attentionBadge = document.querySelector('.attention'); 2726 2727 function toggleMenu() { 2728 menuContainer.classList.toggle("open"); 2729 // Gunakan classList.toggle untuk logika yang lebih bersih 2730 if (menuContainer.classList.contains("open")) { 2731 attentionBadge.classList.remove("whore"); 2732 attentionBadge.style.opacity = '0'; 2733 } else { 2734 attentionBadge.classList.add("whore"); 2735 attentionBadge.style.opacity = '1'; 2736 } 2737 } 2738</script>
2738 2739 2740 2741 2742 2743 2744 </div> 2745</div> 2746 2747 2748 2749 </div> 2750 2751
2751<script> 2752 document.querySelectorAll('#togel-tabs .nav-link').forEach(tab => { 2753 tab.addEventListener('click', function() { 2754 // remove active from all 2755 document.querySelectorAll('#togel-tabs .nav-link').forEach(link => link.classList.remove('active')); 2756 2757 // add active to clicked one 2758 this.classList.add('active'); 2759 }); 2760 }); 2761 2762 // active menu togel 2763 $('#menu-togel').addClass('active'); 2764 // $('#tab-pasaran').addClass('active'); 2765 2766 // default tab: pasaran 2767 if(!$('#tab-keluaran').hasClass('active') && !$('#tab-mimpi').hasClass('active')) { 2768 $('#tab-pasaran').addClass('active'); 2769 } 2770 2771 // active menu pasaran 2772 if($('#tab-pasaran').hasClass('active')) { 2773 document.querySelectorAll('#togel-tabs .nav-link').forEach(link => link.classList.remove('active')); 2774 $('#tab-pasaran').addClass('active'); 2775 } 2776 2777 // active menu keluaran 2778 if($('#tab-keluaran').hasClass('active')) { 2779 document.querySelectorAll('#togel-tabs .nav-link').forEach(link => link.classList.remove('active')); 2780 $('#tab-keluaran').addClass('active'); 2781 content(`/togel/keluaran`, 'content-togel') 2782 } 2783 2784 // active menu mimpi 2785 if($('#tab-mimpi').hasClass('active')) { 2786 document.querySelectorAll('#togel-tabs .nav-link').forEach(link => link.classList.remove('active')); 2787 $('#tab-mimpi').addClass('active'); 2788 content(`/togel/mimpi`, 'content-togel') 2789 } 2790 </script>
2790 2791</div> 2792 2793 </div> 2794 </div> 2795 </main> 2796 </div> 2797 2798 <style> 2799 .offcanvas { 2800 width: 30%!important; 2801 } 2802 2803 @media (max-width: 768px) { 2804 .offcanvas { 2805 width: 90%!important; 2806 } 2807 2808 } 2809 2810 2811 </style> 2812 2813 <div class="offcanvas offcanvas-end bg-base" tabindex="-1" id="offcanvas" aria-labelledby="offcanvasLabel"> 2814 <div class="offcanvas-header pb-0"> 2815 <h5 class="offcanvas-title" id="offcanvas-title"></h5> 2816 <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button> 2817 </div> 2818 <div class="offcanvas-body" id="offcanvas-body"> 2819 <div id="offcanvas-body-content-1"></div> 2820 <div id="offcanvas-body-content-2"></div> 2821 </div> 2822 </div> 2823 2824 <div id="box-bottom-navbar"> 2825 <!-- Bottom Navigation Bar--> 2826 <style> 2827 #bottom-navbar { 2828 height: 68px; 2829 z-index: 999; 2830 position: fixed; 2831 bottom: 0; 2832 left: 0; 2833 right: 0; 2834 } 2835 2836 #myBox { 2837 position: fixed; 2838 left: 0; 2839 right: 0; 2840 bottom: -100%; /* changed */ 2841 width: 100%; 2842 background: #3498db; 2843 z-index: 998; 2844 overflow: auto; 2845 transition: bottom 0.4s ease; 2846 } 2847 2848 /* Slide up and stop just above the bottom navbar */ 2849 #myBox.show { 2850 bottom: 68px; 2851 } 2852 2853 .halo-effect { 2854 position: relative; 2855 z-index: 1; 2856 } 2857 2858 .halo-effect::after { 2859 content: ''; 2860 position: absolute; 2861 top: 50%; 2862 left: 50%; 2863 width: 72px; /* Bigger size */ 2864 height: 72px; 2865 transform: translate(-50%, -50%); 2866 border-radius: 50%; 2867 background: var(--accent-color); /* Softer glow */ 2868 opacity: .3; 2869 animation: pulse-ring 1.8s infinite; 2870 z-index: -1; 2871 } 2872 2873 @keyframes pulse-ring { 2874 0% { 2875 transform: translate(-50%, -50%) scale(1); 2876 opacity: 0.6; 2877 } 2878 50% { 2879 transform: translate(-50%, -50%) scale(1.6);
2879 /* Bigger expansion */ 2880 opacity: 0.3; 2881 } 2882 100% { 2883 transform: translate(-50%, -50%) scale(1); 2884 opacity: 0.6; 2885 } 2886 } 2887 2888.speed-dial-wrapper { 2889 position: relative; 2890 } 2891 2892 2893.speed-dial-item { 2894 position: absolute; 2895 bottom: 68px; 2896 left: 50%; 2897 transform: translateX(-50%) translateY(0); 2898 opacity: 0; 2899 pointer-events: none; 2900 transition: transform 0.2s ease-out, opacity 0.2s ease-out; 2901} 2902 2903.speed-dial-active .speed-dial-item { 2904 opacity: 1; 2905 pointer-events: auto; 2906} 2907</style> 2908 2909<nav id="bottom-navbar" class="fixed-bottom bg-surface shadow"> 2910 <div class="d-flex h-100"> 2911 <a id="bottom-navbar-menu" class="flex-fill d-flex flex-column justify-content-center align-items-center gap-1" href="javascript:toggleBox()"> 2912 <i class="icon-menu text-accent fs-xl"></i> 2913 <div class="fw-semibold text-surface fs-sm-sm">Menu</div> 2914 </a> 2915 2916 <a id="bottom-navbar-home" href="/" onclick="event.preventDefault();$('.modal').modal('hide');content( '/')" class="flex-fill d-flex flex-column justify-content-center align-items-center gap-1"> 2917 <i class="icon-home text-accent fs-xl"></i> 2918 <div class="fw-semibold text-surface fs-md fs-sm-sm">Home</div> 2919 </a> 2920 2921 2922 2923 <a id="bottom-navbar-promosi" href="/promosi" onclick="event.preventDefault();$('.modal').modal('hide');content( '/promosi')" class="flex-fill d-flex flex-column justify-content-center align-items-center gap-1"> 2924 <i class="icon-promotion text-accent fs-xl"></i> 2925 <div class="fw-semibold text-surface fs-md fs-sm-sm">Promosi</div> 2926 </a> 2927 2928 <a id="bottom-navbar-event" href="/event" onclick="event.preventDefault();content( '/event')" class="flex-fill d-flex flex-column justify-content-center align-items-center gap-1"> 2929 <i class="icon-event text-accent fs-xl"></i> 2930 <div class="fw-semibold text-surface fs-md fs-sm-sm">Event</div> 2931 </a> 2932 2933 2934 2935 <div class="speed-dial-wrapper flex-fill d-flex flex-column justify-content-center align-items-center gap-1"> 2936 <div id="bottom-navbar-chat" 2937 class="speed-dial-btn d-flex flex-column justify-content-center align-items-center gap-1" 2938 onclick="toggleMedia()"> 2939 <i class="icon-livechat text-accent fs-xl"></i> 2940 <div class="fw-semibold text-surface fs-md fs-sm-sm">Chat</div> 2941 </div> 2942 2943 <a href="javascript:void(0)" onclick="CsChatEmbed.openChat()" aria-label="Open Chesatria Chat" class="speed-dial-item"> 2944 <img src="https://imgotp.viva88athenae.com//livechat.png" style="width: 48px; height: 48px;" alt="chesatria"/> 2945 </a> 2946 <a href="https://www.instagram.com/" target="_blank" aria-label="Visit instagram" rel="noopener noreferrer" class="speed-dial-item"> 2947 <img src="https://imgotp.viva88athenae.com//instagram.png" style="width: 48px; height: 48px;" alt="instagram"/> 2948 </a> 2949 <a href="https://www.facebook.com/profile.php?id=61578798729259" target="_blank" aria-label="Visit facebook" rel="noopener noreferrer" class="speed-dial-item"> 2950 <img src="https://imgotp.viva88athenae.com//facebook.png" style="width: 48px; height: 48px;" alt="facebook"/> 2951 </a> 2952 <a href="http://ppk4d.com/waokjek" target="_blank" aria-label="Visit whatsapp" rel="noopener noreferrer" class="speed-dial-item"> 2953 <img src="https://imgotp.viva88athenae.com//whatsapp.png" style="width: 48px; height: 48px;" alt="whatsapp"/> 2954 </a> 2955 <a href="https://t.me/Okjek21Official_Bot" target="_blank" aria-label="Visit telegram" rel="noopener noreferrer" class="speed-dial-item"> 2956 <img src="https://imgotp.viva88athenae.com//telegram.png" style="width: 48px; height: 48px;" alt="telegram"/> 2957 </a> 2958 </div> 2959 </div> 2960</nav> 2961 2962<div id="myBox" class="slide-page d-block d-lg-none"> 2963 <style> 2964 .sidebar-menu.active { 2965 background-color: var(--bg-hover); 2966 /* Or any custom color */ 2967 } 2968 2969 .new-badge { 2970 position: absolute; 2971 right: 0; 2972 top: 50%; 2973 transform: translateY(-50%); 2974 margin-right: 8px; 2975 } 2976</style> 2977 2978 2979<div class="sidebar pb-4"> 2980 <div class="sidebar-head d-none d-lg-block"> 2981 <div class="d-flex justify-content-center align-items-center w-100 my-4"> 2982 <a href="/" 2983 onclick="event.preventDefault();content(`/`);unsetSidebarMenuActive()"><img 2984 src="/images/logo.png?1787301696"
2985 class="logo-sidebar" alt="Logo"></a> 2986 </div> 2987 2988 </div> 2989 <div class="sidebar-body"> 2990 <div class="d-flex flex-column mx-3"> 2991 <div class="d-flex flex-column"> 2992 <div class="d-block d-lg-none mt-3 mt-lg-0"> 2993 <style> 2994 /*:root {*/ 2995 /* --bg-surface: rgb(15, 25, 35);*/ 2996 /* --text-deep: white;*/ 2997 /* --text-surface: white;*/ 2998 /* --bg-elevated: rgb(40, 50, 60);*/ 2999 /* --placeholder-color: rgb(100, 110, 120);*/ 3000 /*}*/ 3001 3002 /* Input Styles */ 3003 .search-container { 3004 position: relative; 3005 z-index: 991; 3006 width: 100%; 3007 margin: auto; 3008 } 3009 3010 .search-container input[type="text"] { 3011 background-color: var(--bg-surface); 3012 color: var(--text-deep); 3013 border: 2px solid var(--bg-elevated); 3014 outline: none; 3015 padding: 8px 40px 8px 50px; /* Add padding for the icon */ 3016 border-radius: 4px; 3017 transition: border-color 0.2s ease; 3018 width: 100%; 3019 font-weight: 600; 3020 font-size: 16px; 3021 } 3022 3023 .search-container input[type="text"]::placeholder { 3024 color: var(--placeholder-color); 3025 opacity: 0.8; 3026 } 3027 3028 3029 .search-icon { 3030 position: absolute; 3031 top: 50%; 3032 left: 16px; 3033 transform: translateY(-50%); 3034 color: var(--accent-color); 3035 font-size: 20px; 3036 pointer-events: none; /* Prevent icon from blocking input */ 3037 } 3038 3039 .search-overlay { 3040 position: fixed; 3041 top: 0; 3042 left: 0; 3043 width: 100%; 3044 height: 100%; 3045 background-color: rgba(0, 0, 0, 0.5); 3046 z-index: 990; 3047 display: none; 3048 } 3049 3050 .search-result { 3051 position: absolute; 3052 z-index: 991; 3053 width: 100%; 3054 height: 440px; 3055 max-height: 440px; 3056 background-color: var(--bg-surface); 3057 border-radius: 8px; 3058 overflow-y: auto; 3059 box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5); 3060 display: none; 3061 } 3062 3063 .search-result-item { 3064 padding: 12px 16px; 3065 color: var(--text-surface); 3066 cursor: pointer; 3067 transition: background-color 0.2s; 3068 } 3069 3070 .search-result-item:hover { 3071 background-color: var(--bg-elevated); 3072 } 3073</style> 3074 3075<div class="search-widget"> 3076 <div class="search-overlay" onclick="closeSearch(this)"></div> 3077 3078 <div class="search-container"> 3079 <span class="search-icon"><i class="icon-search text-accent fs-xl"></i></span> 3080 <input 3081 type="text" 3082 placeholder="Search" 3083 class="form-control" 3084 onfocus="openSearch(this)" 3085 oninput="debouncedSearch(this)" 3086 > 3087 3088 <div class="search-result rounded mt-3"></div> 3089 </div> 3090</div> 3091
3092<script> 3093 3094 3095 // Debounced version of searchGame 3096 var debouncedSearch = debounce(function (input) { 3097 searchGame(input); 3098 }, 300); 3099 3100 function debounce(func, delay = 300) { 3101 let timeout; 3102 return function (...args) { 3103 clearTimeout(timeout); 3104 timeout = setTimeout(() => func.apply(this, args), delay); 3105 }; 3106 } 3107 3108 function searchGame(input) { 3109 const container = input.closest('.search-widget'); 3110 const value = input.value.trim(); 3111 const resultBox = container.querySelector('.search-result'); 3112 const overlay = container.querySelector('.search-overlay'); 3113 3114 if (value) { 3115 resultBox.style.display = 'block'; 3116 overlay.style.display = 'block'; 3117 3118 resultBox.innerHTML = ` 3119 <div class="w-100 h-100 d-flex justify-content-center align-items-center"> 3120 <div class="spinner-border text-primary" role="status"></div> 3121 </div> 3122 `; 3123 3124 const settings = { 3125 url: encodeURI(`/game/search?name=${value}`), 3126 method: "GET", 3127 timeout: 0, 3128 }; 3129 3130 $.ajax(settings).done(function (response) { 3131 resultBox.innerHTML = response; 3132 }); 3133 } else { 3134 resultBox.style.display = 'none'; 3135 overlay.style.display = 'none'; 3136 } 3137 } 3138 3139 function openSearch(input) { 3140 const container = input.closest('.search-widget'); 3141 container.querySelector('.search-overlay').style.display = 'block'; 3142 document.body.classList.add('search-active'); 3143 3144 if (window.innerWidth <= 768) { 3145 setTimeout(() => { 3146 const offset = input.getBoundingClientRect().top + window.scrollY - 16; 3147 window.scrollTo({ top: offset, behavior: 'smooth' }); 3148 }, 100); 3149 } 3150 } 3151 3152 function closeSearch(overlay) { 3153 const container = overlay.closest('.search-widget'); 3154 container.querySelector('.search-overlay').style.display = 'none'; 3155 container.querySelector('.search-result').style.display = 'none'; 3156 document.body.classList.remove('search-active'); 3157 3158 input.blur(); 3159 } 3160 3161 function checkFocus(input) { 3162 const container = input.closest('.search-widget'); 3163 setTimeout(() => { 3164 if (!container.contains(document.activeElement)) { 3165 closeSearch(container.querySelector('.search-overlay')); 3166 } 3167 }, 200); 3168 } 3169 3170 3171 3172</script>
3172 3173 </div> 3174 3175 <div 3176 class="d-flex flex-lg-row flex-md-column flex-sm-column gap-2 align-items-center h-100 mt-3 mt-lg-0"> 3177 <a class="btn btn-promotion w-100" href="/promosi" 3178 onclick="event.preventDefault(); content( `/promosi`);">Promosi</a> 3179 <a class="btn btn-event w-100" href="/event" 3180 onclick="event.preventDefault(); content( `/event`)">Event</a> 3181 </div> 3182 </div> 3183 3184 <div class="d-flex flex-column gap-2 mt-3 mt-lg-2"> 3185 3186 <!-- Togel --> 3187 3188 <ul class="menu-group"> 3189 <li class="menu-item"> 3190 <a id="menu-togel" class="sidebar-menu btn-menu" href="/togel" 3191 onclick="event.preventDefault();content( `/togel`);setSidebarMenuActive(this); generateTogelToken();"> 3192 <div style="width: 16px"><i class="icon-togel text-accent fs-md"></i></div> 3193 <span class="menu-name">Togel</span> 3194 </a> 3195 </li> 3196 </ul> 3197 3198 <!-- Togel --> 3199 3200 <!-- Menu Game --> 3201 3202 <ul class="menu-group"> 3203 <li class="menu-item"> 3204 <a id="menu-slot" class="sidebar-menu btn-menu" 3205 href="/game/slot" 3206 onclick="event.preventDefault();content( `/game/slot`);setSidebarMenuActive(this)"> 3207 <div style="width: 16px"><i class="icon-slot text-accent fs-md"></i></div> 3208 <span class="menu-name">Slot</span> 3209 </a> 3210 3211 </li> 3212 </ul> 3213 3214 <ul class="menu-group"> 3215 <li class="menu-item"> 3216 <a id="menu-casino" class="sidebar-menu btn-menu" 3217 href="/game/casino" 3218 onclick="event.preventDefault();content( `/game/casino`);setSidebarMenuActive(this)"> 3219 <div style="width: 16px"><i class="icon-live-casino text-accent fs-md"></i></div> 3220 <span class="menu-name">Casino</span> 3221 </a> 3222 3223 </li> 3224 </ul> 3225 3226 <ul class="menu-group"> 3227 <li class="menu-item"> 3228 <a id="menu-sports" class="sidebar-menu btn-menu" 3229 href="/game/sports" 3230 onclick="event.preventDefault();content( `/game/sports`);setSidebarMenuActive(this)"> 3231 <div style="width: 16px"><i class="icon-sports text-accent fs-md"></i></div> 3232 <span class="menu-name">Sports</span> 3233 </a> 3234 3235 </li> 3236 </ul> 3237 3238 <ul class="menu-group"> 3239 <li class="menu-item"> 3240 <a id="menu-sabung" class="sidebar-menu btn-menu" 3241 href="/game/sabung" 3242 onclick="event.preventDefault();content( `/game/sabung`);setSidebarMenuActive(this)"> 3243 <div style="width: 16px"><i class="icon-sabung text-accent fs-md"></i></div> 3244 <span class="menu-name">Sabung</span> 3245 </a> 3246 3247 </li> 3248 </ul> 3249 3250 <ul class="menu-group"> 3251 <li class="menu-item"> 3252 <a id="menu-arcade" class="sidebar-menu btn-menu" 3253 href="/game/arcade" 3254 onclick="event.preventDefault();content( `/game/arcade`);setSidebarMenuActive(this)"> 3255 <div style="width: 16px"><i class="icon-arcade text-accent fs-md"></i></div> 3256 <span class="menu-name">
3256Arcade</span> 3257 </a> 3258 3259 </li> 3260 </ul> 3261 3262 <ul class="menu-group"> 3263 <li class="menu-item"> 3264 <a id="menu-interactive" class="sidebar-menu btn-menu" 3265 href="/game/interactive" 3266 onclick="event.preventDefault();content( `/game/interactive`);setSidebarMenuActive(this)"> 3267 <div style="width: 16px"><i class="icon-interactive text-accent fs-md"></i></div> 3268 <span class="menu-name">Interactive</span> 3269 </a> 3270 3271 </li> 3272 </ul> 3273 3274 <!-- Kupon --> 3275 <ul class="menu-group"> 3276 <li class="menu-item"> 3277 <a id="menu-kupon" class="sidebar-menu btn-menu" 3278 onclick="event.preventDefault();content( `/coupon`);setSidebarMenuActive(this);"> 3279 <div style="width: 16px"><i class="icon-kupon text-accent fs-md"></i></div> 3280 <span class="menu-name">Kupon</span> 3281 </a> 3282 3283 </li> 3284 </ul> 3285 <!-- Kupon --> 3286 3287 <!-- Menu Social Media --> 3288 3289 <ul class="menu-group"> 3290 <li class="menu-item"> 3291 <a class="btn-menu" href="https://t.me/Okjek21Official_Bot" target="_blank" 3292 aria-label="Visit telegram" rel="noopener noreferrer"> 3293 <div style="width: 16px"><i class="icon-telegram text-accent fs-md"></i></div> 3294 <span class="menu-name">Telegram</span> 3295 </a> 3296 </li> 3297 3298 <li class="menu-item"> 3299 <a class="btn-menu" href="http://ppk4d.com/waokjek" target="_blank" 3300 aria-label="Visit whatsapp" rel="noopener noreferrer"> 3301 <div style="width: 16px"><i class="icon-whatsapp text-accent fs-md"></i></div> 3302 <span class="menu-name">Whatsapp</span> 3303 </a> 3304 </li> 3305 3306 <li class="menu-item"> 3307 <a class="btn-menu" href="https://www.facebook.com/profile.php?id=61578798729259" target="_blank" 3308 aria-label="Visit facebook" rel="noopener noreferrer"> 3309 <div style="width: 16px"><i class="icon-facebook text-accent fs-md"></i></div> 3310 <span class="menu-name">Facebook</span> 3311 </a> 3312 </li> 3313 3314 <li class="menu-item"> 3315 <a class="btn-menu" href="https://www.instagram.com/" target="_blank" 3316 aria-label="Visit instagram" rel="noopener noreferrer"> 3317 <div style="width: 16px"><i class="icon-instagram text-accent fs-md"></i></div> 3318 <span class="menu-name">Instagram</span> 3319 </a> 3320 </li> 3321 3322 </ul> 3323 3324 <!-- Menu Informasi --> 3325 3326 <ul class="menu-group"> 3327 3328 3329 3330 <li class="menu-item"> 3331 <a id="menu-tentang" class="sidebar-menu btn-menu" 3332 href="/informasi/tentang" 3333 onclick="event.preventDefault();content(`/informasi/tentang`);setSidebarMenuActive(this)"=> 3334 <div style="width: 16px"><i class="icon-about-us text-accent fs-md"></i></div> 3335 <span class="menu-name">Tentang Kami</span> 3336 </a> 3337 </li> 3338 3339 <li class="menu-item"> 3340 <a id="menu-bantuan" class="sidebar-menu btn-menu" 3341 href="/informasi/bantuan" 3342 onclick="event.preventDefault();content(`/informasi/bantuan`);setSidebarMenuActive(this)"> 3343 <div style="width: 16px"><i class="icon-help text-accent fs-md"></i></div> 3344 <span class="menu-name">FAQ</span> 3345 </a> 3346 </li> 3347 3348 <li class="menu-item"> 3349 <a id="menu-peraturan" class="sidebar-menu btn-menu" 3350 href="/informasi/peraturan" 3351 onclick="event.preventDefault();content(`/informasi/peraturan`);setSidebarMenuActive(this)"> 3352 <div style="width: 16px"><i class="icon-regulation text-accent fs-md"></i></div> 3353 <span class="menu-name">Peraturan</span> 3354 </a> 3355 </li> 3356 3357 <li class="menu-item"> 3358 <a id="menu-bank" class="sidebar-menu btn-menu" 3359 href="/informasi/bank" 3360 onclick="event.preventDefault();content(`/informasi/bank`);setSidebarMenuActive(this)"> 3361 <div style="width: 16px"><i class="icon-bank-info text-accent fs-md"></i></div> 3362 <span class="menu-name">Informasi Bank</span> 3363 </a> 3364 </li> 3365 </ul> 3366 3367 3368 3369 </div> 3370 3371 3372 3373 </div> 3374 </div> 3375</div> 3376
3377<script> 3378 3379 var sidebarTabs = { 3380 "/game/slot": "menu-slot", 3381 "/game/casino": "menu-casino", 3382 "/game/sports": "menu-sports", 3383 "/game/arcade": "menu-arcade", 3384 "/game/sabung": "menu-sabung", 3385 "/game/interactive": "menu-interactive", 3386 "/informasi/tentang": "menu-tentang", 3387 "/informasi/bantuan": "menu-bantuan", 3388 "/informasi/peraturan": "menu-peraturan", 3389 "/informasi/bank": "menu-bank", 3390 }; 3391 3392 document.addEventListener("DOMContentLoaded", function () { 3393 const currentURL = window.location.href; 3394 3395 for (let path in sidebarTabs) { 3396 if (currentURL.includes(path)) { 3397 const menuId = sidebarTabs[path]; 3398 const menuElement = document.getElementById(menuId); 3399 if (menuElement) { 3400 setSidebarMenuActive(menuElement); 3401 } 3402 break; 3403 } 3404 } 3405 }); 3406 3407 function unsetSidebarMenuActive() { 3408 // Remove active from all 3409 document.querySelectorAll('.sidebar-menu').forEach(menu => { 3410 menu.classList.remove('active'); 3411 }); 3412 } 3413 3414 3415 function setSidebarMenuActive(el) { 3416 unsetSidebarMenuActive(); 3417 3418 // Add active to clicked one 3419 el.classList.add('active'); 3420 } 3421 3422 3423</script>
3423</div> 3424
3425<script> 3426 3427 function toggleBox() { 3428 const $box = $('#myBox'); 3429 const isVisible = $box.hasClass('show'); 3430 3431 if (isVisible) { 3432 $box.removeClass('show'); 3433 $('body').css('overflow', ''); // restore scroll 3434 } else { 3435 $box.addClass('show'); 3436 $('body').css('overflow', 'hidden'); // disable background scroll 3437 } 3438 } 3439 3440 function updateMyBoxHeight() { 3441 const topNavHeight = 60; 3442 const bottomNavHeight = 68; 3443 const availableHeight = window.innerHeight - topNavHeight - bottomNavHeight; 3444 $('#myBox').css('height', availableHeight + 'px'); 3445 } 3446 3447 // Call on load and resize 3448 $(document).ready(updateMyBoxHeight); 3449 $(window).on('resize', updateMyBoxHeight); 3450 3451 function handleTransactionRoute(route) { 3452 if (route.includes('content=deposit')) { 3453 openTransactionModalWithTab('deposit'); 3454 } else if (route.includes('content=withdraw')) { 3455 openTransactionModalWithTab('withdraw'); 3456 } else if (route.includes('content=rekening')) { 3457 openTransactionModalWithTab('rekening'); 3458 } else { 3459 openTransactionModalWithTab('deposit'); 3460 } 3461 } 3462 3463 function openTransactionModalWithTab(tabName) { 3464 $('.modal').modal('hide'); 3465 $('.modal-backdrop').remove(); 3466 $('#dynamic-modal').remove(); 3467 $('body').removeClass('modal-open').css('padding-right', ''); 3468 $('#myBox').removeClass('show'); 3469 $('body').css('overflow', ''); 3470 3471 setTimeout(function() { 3472 const modalHtml = ` 3473 <div class="modal" id="dynamic-modal" tabindex="-1" aria-hidden="true"> 3474 <div class="modal-dialog modal-dialog-centered modal-fixed"> 3475 <div class="modal-content bg-surface"> 3476 <div class="modal-header bg-base border-0 d-flex justify-content-between align-items-center"> 3477 <h5 class="modal-title">Transaksi</h5> 3478 <button type="button" 3479 class="close-capsule" 3480 data-bs-dismiss="modal" 3481 aria-label="Close" 3482 style="background: var(--btn-accent-background); border: none; color: white; font-weight: 500; font-size: 0.75rem; padding: 0.3rem 0.8rem; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; cursor: pointer;">CLOSE</button> 3483 </div> 3484 <div class="modal-body p-0" id="modal-content-container"> 3485 <div class="d-flex justify-content-center align-items-center p-5"> 3486 <div class="spinner-border text-primary" role="status"></div> 3487 <span class="ms-3">Memuat halaman transaksi...</span> 3488 </div> 3489 </div> 3490 </div> 3491 </div> 3492 </div> 3493 `; 3494 3495 $('body').append(modalHtml); 3496 $('#dynamic-modal').modal('show'); 3497 3498 $.ajax({ 3499 url: '/user/transaction', 3500 method: 'GET', 3501 data: { content: tabName }, 3502 success: function(response) { 3503 $('#modal-content-container').html(response).animate({opacity: 1}, 300); 3504 3505 setTimeout(function() { 3506 if (typeof initializeTransactionModal === 'function') { 3507 initializeTransactionModal(); 3508 } 3509 if (typeof activateTransactionTab === 'function') { 3510 activateTransactionTab(tabName); 3511 } 3512 }, 100); 3513 }, 3514 error: function(xhr, status, error) { 3515 console.error('Failed to load transaction content:', error); 3516 $('#modal-content-container').html(` 3517 <div class="container-fluid p-4 text-center"> 3518 <div class="alert alert-danger"> 3519 <h5>Error</h5> 3520 <p>Gagal memuat halaman transaksi. Silakan coba lagi.</p> 3521 <button class="btn btn-accent" onclick="openTransactionModalWithTab('${tabName}')">Coba Lagi</button> 3522 </div> 3523 </div> 3524 `).animate({opacity: 1}, 300); 3525 } 3526 }); 3527 3528 $('#dynamic-modal').on('hidden.bs.modal', function () { 3529 $(document).off('.transactionModal'); 3530 if (typeof cleanupTransactionModal === 'function') { 3531 cleanupTransactionModal(); 3532 } 3533 $(this).remove(); 3534 $('.modal-backdrop').remove(); 3535 $('body').removeClass('modal-open').css('padding-right', ''); 3536 }); 3537 }, 200); 3538 } 3539 3540function toggleMedia() { 3541 const chatBtn = document.getElementById("bottom-navbar-chat"); 3542 const wrapper = chatBtn.closest(".speed-dial-wrapper"); 3543 const items = wrapper.querySelectorAll(".speed-dial-item"); 3544 3545 const gap = 54; 3546 const start = 8; 3547 3548 wrapper.classList.toggle("speed-dial-active"); 3549 3550 items.forEach((item, i) => { 3551 const offset = wrapper.classList.contains("speed-dial-active") 3552 ? start + (gap * i) 3553 : 0; 3554 3555 item.style.transform = `translateX(-50%) translateY(-${offset}px)`; 3556 }); 3557} 3558 3559 3560</script>
3560 3561 3562 </div> 3563 3564 <!-- Modal Popup --> 3565 <!-- Modal --> 3566 3567<style> 3568 3569 3570 .popup-img { 3571 width: 600px; 3572 aspect-ratio: 600/300; 3573 } 3574 3575 @media (max-width: 768px) { 3576 .popup-dialog { 3577 padding-top: 64px; 3578 } 3579 3580 3581 .popup-img { 3582 width: 100%; 3583 } 3584 } 3585 3586</style> 3587 3588 3589 3590 3591
3592<script> 3593 3594 function openModalPopup() { 3595 if($('#modal-popup').length) $('#modal-popup').modal('show'); 3596 } 3597 3598 function closeModalPopup() { 3599 if($('#modal-popup').length) $('#modal-popup').modal('hide'); 3600 } 3601 3602</script>
3602 3603 <!-- Modal Syarat --> 3604 <!-- Modal --> 3605 3606<style> 3607 3608 .dialog-syarat { 3609 max-width: 600px; 3610 } 3611 3612 .body-syarat { 3613 max-height: 60vh; /* or any value you prefer */ 3614 overflow-y: auto; 3615 } 3616 3617</style> 3618 3619 3620<div class="modal fade" id="modal-syarat" tabindex="-1" aria-labelledby="modal-syarat-label"> 3621 <div class="modal-dialog dialog-syarat h-auto"> 3622 <div class="modal-content bg-surface h-auto"> 3623 3624 <div class="modal-header bg-base border-0"> 3625 <div class="modal-title"><img src='/images/logo.png?1787301696' class="logo-popup"></div> 3626 <em class="modal-title ms-auto" id="modal-syarat-label">Syarat dan Ketentuan</em> 3627 </div> 3628 3629 <div class="modal-body body-syarat fw-normal overflow-y-scroll fs-sm-xs"> 3630 <ol> 3631 <li style="margin-bottom: 15px;">Minimal usia bermain adalah 18 tahun.</li> 3632 <li style="margin-bottom: 15px;">Harap memperhatikan jam buka / tutup di setiap permainan.</li> 3633 <li style="margin-bottom: 15px;">Bet dianggap sah jika terjadi sebelum jam tutup di setiap permainan.</li> 3634 <li style="margin-bottom: 15px;">Bet yang sudah dikonfirmasi tidak bisa dibatalkan.</li> 3635 <li style="margin-bottom: 15px;">Harap mengecek kembali Bet di menu History.</li> 3636 <li style="margin-bottom: 15px;">Bet yang telah dibeli adalah sah dan tidak bisa dibatalkan.</li> 3637 <li style="margin-bottom: 15px;">Setiap Pemain bertanggung jawab pada Akun Anda masing-masing.</li> 3638 <li style="margin-bottom: 15px;">Bet akan dibatalkan oleh provider jika terdeteksi adanya kecurangan.</li> 3639 <li style="margin-bottom: 15px;">Hadiah setiap permainan berbeda-beda dan berubah sewaktu-waktu.</li> 3640 <li style="margin-bottom: 15px;">Harap perhatikan peraturan yang tersedia di setiap permainan.</li> 3641 <li style="margin-bottom: 15px;">Jika terjadi kecurangan dan lain sebagainya, maka kami akan memberikan peringatan, Suspend kepada pemain, hingga sanksi Banned Akun.</li> 3642 <li>Deposit / Withdraw dapat dilakukan kecuali bank Offline / Gangguan.</li> 3643</ol> 3644<br> 3645<p style="text-align: center;"><em>Dengan bergabung di situs ini, Anda menyetujui Syarat dan Ketentuan kami.</em></p> 3646 3647 </div> 3648 3649 <!--<button type="button" class="btn btn-secondary" onclick="logout()"><i class="bi bi-x-circle-fill"></i><span class="ms-2">Tidak Setuju</span></button>--> 3650 <a class="text-accent modal-footer bg-base border-0 justify-content-center" href="javascript:closeModalSyarat()"><i class="bi bi-check-circle-fill"></i><span class="ms-2">Setuju</span></button></a> 3651 3652 </div> 3653 </div> 3654</div> 3655
3656<script> 3657 function openModalSyarat() { 3658 if($('#modal-syarat').length) $('#modal-syarat').modal('show'); 3659 } 3660 3661 function closeModalSyarat() { 3662 if($('#modal-syarat').length) $('#modal-syarat').modal('hide'); 3663 } 3664 3665 3666</script>
3666 3667 <!-- Live Chat --> 3668 3669 3670 3671
3671<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-j1CDi7MgGQ12Z7Qab0qlWQ/Qqz24Gc6BM0thvEMVjHnfYGF0rmFCozFSxQBxwHKO" crossorigin="anonymous"></script>
3671 3672
3672<script> 3673 3674 function generateTogelToken() { 3675 uri = `/api/togel/token`; 3676 window.api.post(uri, {}, { 3677 onSuccess: (response) => { 3678 3679 }, 3680 onError: (response) => { 3681 if (typeof callback === "function") { 3682 callback(); // also call after error if needed 3683 } 3684 } 3685 }); 3686 } 3687 3688 function openLoginModal(game_data, grand_data) { 3689 window.history.pushState({}, '', '/login'); 3690 if(game_data && grand_data) { 3691 window.game_data = game_data; 3692 window.grand_data = grand_data; 3693 } 3694 $('#modal-login').modal('show'); 3695 refreshCaptcha('captcha-login'); 3696 } 3697 3698 function openRegisterModal() { 3699 window.history.pushState({}, '', '/register'); 3700 $('#modal-register').modal('show'); 3701 refreshCaptcha('captcha-register'); 3702 } 3703 3704 function openOffcanvas(pasaran_data) { 3705 3706 title = pasaran_data['name']; 3707 pasaran_id = pasaran_data['pasaran_id']; 3708 3709 $('#offcanvas-title').html(title); 3710 3711 loading('offcanvas-body-content-2'); 3712 uri = `/togel/paito/?pasaran_id=${pasaran_id}&page=1`; 3713 window.api.get(uri, {}, { 3714 onSuccess: (response) => { 3715 $('#offcanvas-body-content-1').html(` 3716 <div class="bg-elevated p-3 rounded fs-sm"> 3717 <div class="d-flex flex-column gap-1"> 3718 <div><span>Website:</span> <a class="text-accent" href="http://${pasaran_data['web']}" target="_blank">${pasaran_data['web']}</a></div> 3719 <div><span>Hari Bukaan:</span> <span class="subtext-color">${pasaran_data['hari']}</span></div> 3720 <div><span>Hari Libur:</span> <span class="subtext-color">${pasaran_data['libur']}</span></div> 3721 <div class="d-flex gap-3"> 3722 <div><span>Jam Tutup:</span> <span class="subtext-color">${pasaran_data['tutup']}</span></div> 3723 <div><span>Jam Undian:</span> <span class="subtext-color">${pasaran_data['jadwal']}</span></div> 3724 </div> 3725 </div> 3726 </div> 3727 3728 <button class="btn btn-accent w-100 mt-3 fs-sm-sm" onclick="pasangAngka('${pasaran_id}'); generateTogelToken()">Pasang Angka</button> 3729 3730 `); 3731 3732 $('#offcanvas-body-content-2').html(response); 3733 }, 3734 onError: (response) => { 3735 if(typeof callback === "function") { 3736 callback(); // also call after error if needed 3737 } 3738 } 3739 }); 3740 // $('#offcanvas-body').html(body); 3741 $('#offcanvas').offcanvas('show'); 3742 } 3743 3744 function pasangAngka(pasaran_id) { 3745 baseBetRoute = `/togel/pasaran/__PASARAN__/`; 3746 uriBet = baseBetRoute.replace('__PASARAN__', pasaran_id); 3747 window.location.href = uriBet; 3748 } 3749 3750 // Core content loader 3751 function navbar() { 3752 $.ajax({ 3753 url: "/component/navbar", 3754 method: 'GET', 3755 timeout: 0, 3756 }).done(function (response) { 3757 $('#box-navbar').html(response); 3758 }).fail(function () { 3759 $('#box-navbar').html('<p>Error loading content</p>'); 3760 }); 3761 } 3762 3763 // Core content loader 3764 function bottomNavbar(uri) { 3765 $.ajax({ 3766 url: "/component/bottom-navbar", 3767 method: 'GET', 3768 timeout: 0, 3769 }).done(function (response) { 3770 $('#box-bottom-navbar').html(response); 3771 }).fail(function () { 3772 $('#box-bottom-navbar').html('<p>Error loading content</p>'); 3773 }); 3774 } 3775 3776 function isMobileScreen() { 3777 return window.innerWidth <= 768; 3778 } 3779 3780 function launch(url, width, height) { 3781 if(isOtpMobileApp()){ 3782 window.open(url, '_blank'); 3783 } 3784 else if (isMobileScreen()) { 3785 3786 // On mobile, open in a new tab (default behavior) 3787 window.location.href = url; 3788 // window.open(url, '_blank'); 3789 } else { 3790 // On desktop, open in a popup window with given dimensions 3791 window.open(url, '_blank', `width=${width},height=${height},top=0,left=0`); 3792 } 3793 } 3794 3795 // Handle browser back/forward buttons 3796 window.onpopstate = function () { 3797 const path = location.pathname; 3798 3799 content(path); 3800 }; 3801 3802 $(document).ready(function() { 3803 openModalPopup(); 3804 }); 3805 3806 3807 3808 </script>
3808 3809 3810 3811
3811<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"5def362424334e6299c6d35ad970c03d","r":1,"spa":2}' crossorigin="anonymous"></script>
3811 3812</body> 3813</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.