PageSourceSearch

https://okjek21family.com/togel

html okjek21family.com collected 2026-10-10 00:32:59 UTC 121,438 bytes, 3,813 lines download raw bytes

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

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