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