PageSourceSearch

https://moderntally.com/

html moderntally.com collected 2026-10-10 01:44:44 UTC 315,665 bytes, 7,347 lines download raw bytes

1
2
3
4
5
6<!DOCTYPE html>
7<html lang="id">
8
9<head>
10    <meta charset="UTF-8">
11    <title>RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis</title>
12    <meta name="description"
13        content="RAJAVIP hadir membawa inovasi baru game digital dengan akses mudah dan praktis, serta beragam hiburan populer yang seru untuk dinikmati setiap saat.">
14    <meta name="robots" content="index, follow">
15    <link rel="canonical" href="https://moderntally.com/">
16    <link rel="amphtml" href="https://fabric.moderntally.com/">
17    <link rel="alternate" hreflang="id-id" href="https://fabric.moderntally.com/"/>
18      <link rel="alternate" href="https://fabric.moderntally.com/"/>
19      <link rel="alternate" hreflang="id" href="https://fabric.moderntally.com/"/>
20      <link rel="alternate" hreflang="en" href="https://fabric.moderntally.com/"/>
21      <link rel="alternate" hreflang="x-default" href="https://fabric.moderntally.com/"/>
22    <meta property="og:locale" content="id_ID">
23    <meta property="og:site_name" content="RAJAVIP">
24    <meta property="og:type" content="product">
25    <meta property="og:title" content="RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis">
26    <meta property="og:description"
27        content="RAJAVIP hadir membawa inovasi baru game digital dengan akses mudah dan praktis, serta beragam hiburan populer yang seru untuk dinikmati setiap saat.">
28    <meta property="og:url" content="https://moderntally.com/">
29    <meta property="og:image" content="https://moderntally.com/imagess/inovasi-game-digital.png">
30    <meta property="og:image:alt" content="RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis">
31    <meta property="product:price:amount" content="9000">
32    <meta property="product:price:currency" content="IDR">
33    <meta property="product:availability" content="out of stock">
34    <meta name="twitter:card" content="summary_large_image">
35    <meta name="twitter:title" content="RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis">
36    <meta name="twitter:description"
37        content="RAJAVIP hadir membawa inovasi baru game digital dengan akses mudah dan praktis, serta beragam hiburan populer yang seru untuk dinikmati setiap saat.">
38    <meta name="twitter:image" content="https://moderntally.com/imagess/inovasi-game-digital.png">
39
40    
40<script type="application/ld+json">
41        {
42            "@context": "https://schema.org",
43            "@type": "WebSite",
44            "@id": "https://moderntally.com/#website",
45            "url": "https://moderntally.com/",
46            "name": "RAJAVIP",
47            "inLanguage": "id",
48            "potentialAction": {
49                "@type": "SearchAction",
50                "target": "https://moderntally.com/",
51                "query-input": "required name=search_term_string"
52            }
53        }
54    </script>
54
55
56    
56<script type="application/ld+json">
57        {
58            "@context": "https://schema.org",
59            "@type": "Organization",
60            "@id": "/#organization",
61            "name": "RAJAVIP",
62            "url": "https://moderntally.com/",
63            "logo": "https://moderntally.com/imagess/logo-rajavip.png"
64        }
65    </script>
65
66
67    
67<script type="application/ld+json">
68        {
69            "@context": "https://schema.org",
70            "@type": "Product",
71            "name": "RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis",
72            "sku": "RJ777",
73            "image": [
74                "https://moderntally.com/imagess/inovasi-game-digital.png"
75            ],
76            "url": "https://moderntally.com/",
77            "description": "RAJAVIP hadir membawa inovasi baru game digital dengan akses mudah dan praktis, serta beragam hiburan populer yang seru untuk dinikmati setiap saat.",
78            "category": "Raja Game",
79            "brand": {
80                "@type": "Brand",
81                "name": "RAJAVIP"
82            },
83            "offers": {
84                "@type": "Offer",
85                "url": "https://moderntally.com/",
86                "priceCurrency": "IDR",
87                "price": "10000",
88                "priceValidUntil": "2027-03-01",
89                "availability": "https://schema.org/OutOfStock",
90                "itemCondition": "https://schema.org/NewCondition",
91                "seller": {
92                    "@type": "Organization",
93                    "name": "RAJAVIP",
94                    "url": "https://moderntally.com/"
95                }
96            },
97            "aggregateRating": {
98                "@type": "AggregateRating",
99                "ratingValue": "4.9",
100                "reviewCount": "9888",
101                "bestRating": "5",
102                "worstRating": "1"
103            }
104        }
105    </script>
105
106
107    
107<script type="application/ld+json">
108        {
109            "@context": "https://schema.org",
110            "@type": "BreadcrumbList",
111            "itemListElement": [{
112                    "@type": "ListItem",
113                    "position": 1,
114                    "name": "RAJAVIP",
115                    "item": "https://moderntally.com/"
116                },
117                {
118                    "@type": "ListItem",
119                    "position": 2,
120                    "name": "LINK RAJA GAME",
121                    "item": "https://moderntally.com/"
122                }
123            ]
124        }
125    </script>
125
126
127    
127<script type="application/ld+json">
128        {
129            "@context": "https://schema.org",
130            "@type": "FAQPage",
131            "mainEntity": [{
132                    "@type": "Question",
133                    "name": "Apa itu RAJAVIP?",
134                    "acceptedAnswer": {
135                        "@type": "Answer",
136                        "text": "RAJAVIP hadir membawa inovasi baru game digital dengan akses mudah dan praktis, serta beragam hiburan populer yang seru untuk dinikmati setiap saat."
137                    }
138                },
139                {
140                    "@type": "Question",
141                    "name": "Mengapa RAJAVIP disebut link raja game online terbaik?",
142                    "acceptedAnswer": {
143                        "@type": "Answer",
144                        "text": "Karena RAJAVIP menghadirkan layanan stabil, akses cepat, pilihan permainan lengkap, serta pengalaman bermain yang nyaman bagi para pengguna."
145                    }
146                },
147                {
148                    "@type": "Question",
149                    "name": "Apakah RAJAVIP cocok untuk pemula?",
150                    "acceptedAnswer": {
151                        "@type": "Answer",
152                        "text": "Ya, RAJAVIP sangat cocok untuk pemula karena memiliki tampilan yang ramah pengguna, proses daftar yang mudah, serta berbagai panduan bermain yang membantu pemain baru."
153                    }
154                },
155                {
156                    "@type": "Question",
157                    "name": "Hiburan apa saja yang tersedia di RAJAVIP?",
158                    "acceptedAnswer": {
159                        "@type": "Answer",
160                        "text": "RAJAVIP menyediakan berbagai hiburan digital menarik seperti game online populer, permainan interaktif, dan layanan yang dirancang untuk memberikan pengalaman bermain yang seru setiap hari."
161                    }
162                },
163                {
164                    "@type": "Question",
165                    "name": "Bagaimana cara mengakses RAJAVIP dengan aman?",
166                    "acceptedAnswer": {
167                        "@type": "Answer",
168                        "text": "Untuk mengakses RAJAVIP dengan aman, pastikan menggunakan link resmi terbaru yang telah disediakan oleh platform ini."
169                    }
170                }
171            ]
172        }
173    </script>
173
174    <!-- User Session Data -->
175    <meta name="csrf-token" content="9ce6e4a17f7cc189893df9e47789b13e98829450d516a0cae5ca7b5f43e5dadc">
176    <meta name="user-logged-in" content="false">
177    <meta name="user-id" content="0">
178
179    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
180
181    <link rel="shortcut icon" href="https://moderntally.com/imagess/icon-rajavip.png" type="image/x-icon">
182    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/style.css">
183    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/bottom-nav.css">
184    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/search-suggest.css">
185    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/product-detail.css">
186    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/product-grid.css">
187    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/site-notice.css">
188    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/benchmark.css">
189    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/product-filters.css">
190    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/mega-menu-tiles.css">
191    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/product-compare.css">
192    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/product-card-actions.css">
193    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/modal.css">
194    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/reviews-points.css">
195</head>
196
197<body>
198    <header class="topbar">
199        <div class="container topbar-inner">
200            <div class="topbar-left">
201                RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis
202
203            </div>
204            <div class="topbar-right">
205                <a href="#">RAJAVIP</a>
206                <a href="#">PROMOSI</a>
207                <a href="#">ALTERNATIF</a>
208                <a href="#">DAFTAR</a>
209            </div>
210        </div>
211    </header>
212    <nav class="navbar">
213        <nav class="navbar-logo" style="width: 100%;">
214            <div class="container nav-inner" style="justify-items: center; justify-content: center;">
215                <a href="/" class="logo-mobile">
216                    <img src="https://moderntally.com/imagess/logo-rajavip.png" alt="RAJAVIP" height="40">
217                </a>
218            </div>
219        </nav>
220        <div class="container nav-inner">
221            <a href="/" class="logo">
222                <img src="https://moderntally.com/imagess/logo-rajavip.png" alt="RAJAVIP" height="40">
223            </a>
224
225
226            <form class="search" method="get" action="#">
227                <input type="hidden" name="page" value="produk">
228
229                <!-- Search Icon (Desktop) -->
230                <button type="submit" class="search-icon-btn" id="searchBtn" aria-label="Cari">
231                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"
232                        stroke-linecap="round" stroke-linejoin="round">
233                        <circle cx="11" cy="11" r="8" />
234                        <path d="m21 21-4.35-4.35" />
235                    </svg>
236                </button>
237
238                <input type="text" name="q" id="searchInput" placeholder="Cari RAJAVIP" value="" autocomplete="off">
239
240                <div class="search-suggest" id="searchSuggest" hidden></div>
241            </form>
242
243            <div class="nav-actions">
244                <!--<button class="icon-btn" id="notifBtn" title="Notifikasi">🔔</button>-->
245                <button class="icon-btn cart-indicator" id="cartBtn" title="Keranjang">
246                    🛒 <span id="cartCount" class="badge" data-role="cart-badge" aria-live="polite">0</span>
247                </button>
248
249
250                <span id="compareCount" class="badge" data-role="compare-badge" aria-live="polite">0</span>
251                </button>
252
253                <!-- Dynamic login/logout button -->
254                <button class="login-btn" id="loginBtn" aria-label="Masuk">
255                    <span class="login-text">Masuk</span>
256                    <span class="login-ico" aria-hidden="true">😊</span>
257                </button>
258            </div>
259        </div>
260
261        <div class="container" style="display: flex; align-items: center;">
262
263
264            <div class="mega-cats-wrapper">
265                <div class="mega-cats container" id="megaCatsScroll" style="padding-left: 5px !important;">
266                    <a class="" href="https://moderntally.com/">
267                        RAJAVIP </a>
268                    <a class="" href="https://moderntally.com/">
269                        RAJAVIP LINK </a>
270                    <a class="" href="https://moderntally.com/">
271                        RAJA GAME </a>
272                    <a class="" href="https://moderntally.com/">
273                        LINK RAJA GAME </a>
274                    <a class="" href="https://moderntally.com/">
275                        RAJA GAME ONLINE </a>
276                </div>
277                <div class="mega-cats-fade" id="megaCatsFade"></div>
278            </div>
279        </div>
280    </nav>
281
282    <!-- Panel Mega Menu - Outside navbar for full-screen -->
283    <div class="mm2-panel" data-mm2="panel" role="dialog" aria-label="Kategori">
284        <div class="mm2-view is-active" data-mm2="top"></div>
285        <div class="mm2-view" data-mm2="detail"></div>
286    </div>
287
288    <!-- Backdrop - Outside navbar for full-screen -->
289    <div class="mm2-backdrop" data-mm2="backdrop"></div>
290
291    <!-- Mobile Bottom Navigation -->
292    <nav class="bottom-nav">
293        <div class="bottom-nav-inner">
294            <!-- Home -->
295            <a href="/" class="bottom-nav-item" id="bottomHomeBtn" data-page="home">
296                <div class="bottom-nav-item-icon">
297                    <!-- Outlined icon (default) -->
298                    <svg class="icon-outlined" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
299                        stroke-linecap="round" stroke-linejoin="round">
300                        <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
301                        <polyline points="9 22 9 12 15 12 15 22" />
302                    </svg>
303                    <!-- Filled icon (active) -->
304                    <svg class="icon-filled" viewBox="0 0 24 24" fill="currentColor">
305                        <path
306                            d="M11.47 3.84a.75.75 0 011.06 0l8.69 8.69a.75.75 0 010 1.06l-.03.03a.75.75 0 01-1.06 0l-8.16-8.16-8.16 8.16a.75.75 0 01-1.06 0l-.03-.03a.75.75 0 010-1.06l8.69-8.69z" />
307                        <path
308                            d="M12 5.5l-7.5 7.5v8.25c0 .414.336.75.75.75h3.75v-6h6v6h3.75a.75.75 0 00.75-.75V13l-7.5-7.5z" />
309                    </svg>
310                </div>
311                <span class="bottom-nav-item-label">Home</span>
312            </a>
313
314            <!-- Kategori -->
315            <button class="bottom-nav-item" id="bottomCategoryBtn" data-mm2="trigger" aria-label="Kategori">
316                <div class="bottom-nav-item-icon">
317                    <!-- Outlined icon (default) -->
318                    <svg class="icon-outlined" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
319                        stroke-linecap="round" stroke-linejoin="round">
320                        <line x1="3" y1="12" x2="21" y2="12" />
321                        <line x1="3" y1="6" x2="21" y2="6" />
322                        <line x1="3" y1="18" x2="21" y2="18" />
323                    </svg>
324                    <!-- Filled icon (active) -->
325                    <svg class="icon-filled" viewBox="0 0 24 24" fill="currentColor">
326                        <path
327                            d="M3 5.25A.75.75 0 013.75 4.5h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 5.25zM3 12a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75A.75.75 0 013 12zm0 6.75a.75.75 0 01.75-.75h16.5a.75.75 0 010 1.5H3.75a.75.75 0 01-.75-.75z" />
328                    </svg>
329                </div>
330                <span class="bottom-nav-item-label">Kategori</span>
331            </button>
332
333            <!-- Keranjang -->
334            <button class="bottom-nav-item" id="bottomCartBtn">
335                <div class="bottom-nav-item-icon">
336                    <!-- Outlined icon (default) -->
337                    <svg class="icon-outlined" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
338                        stroke-linecap="round" stroke-linejoin="round">
339                        <circle cx="9" cy="21" r="1" />
340                        <circle cx="20" cy="21" r="1" />
341                        <path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6" />
342                    </svg>
343                    <!-- Filled icon (active) -->
344                    <svg class="icon-filled" viewBox="0 0 24 24" fill="currentColor">
345                        <path
346                            d="M2.25 2.25a.75.75 0 000 1.5h1.386c.17 0 .318.114.362.278l2.558 9.592a3.752 3.752 0 00-2.806 3.63c0 .414.336.75.75.75h15.75a.75.75 0 000-1.5H5.378A2.25 2.25 0 017.5 15h11.218a.75.75 0 00.674-.421 60.358 60.358 0 002.96-7.228.75.75 0 00-.525-.965A60.864 60.864 0 005.68 4.509l-.232-.867A1.875 1.875 0 003.636 2.25H2.25zM3.75 20.25a1.5 1.5 0 113 0 1.5 1.5 0 01-3 0zM16.5 20.25a1.5 1.5 0 113 0 1.5 1.5 0 01-3 0z" />
347                    </svg>
348                    <span class="bottom-nav-item-badge" id="bottomCartCount">0</span>
349                </div>
350                <span class="bottom-nav-item-label">Keranjang</span>
351            </button>
352
353            <!-- Compare -->
354            <button class="bottom-nav-item" id="bottomCompareBtn">
355                <div class="bottom-nav-item-icon">
356                    <!-- Outlined icon (default) -->
357                    <svg class="icon-outlined" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
358                        stroke-linecap="round" stroke-linejoin="round">
359                        <polyline points="17 11 21 7 17 3" />
360                        <path d="M21 7H9" />
361                        <polyline points="7 21 3 17 7 13" />
362                        <path d="M15 17H3" />
363                    </svg>
364                    <!-- Filled icon (active) -->
365                    <svg class="icon-filled" viewBox="0 0 24 24" fill="currentColor">
366                        <path
367                            d="M21.75 6.75a.75.75 0 00-.75-.75H9a.75.75 0 000 1.5h10.19L15.22 11.47a.75.75 0 001.06 1.06l4.5-4.5a.75.75 0 00.22-.53.75.75 0 00-.22-.53l-.03-.03zM8.78 12.47L4.28 16.97a.75.75 0 000 1.06l4.5 4.5a.75.75 0 001.06-1.06L6.06 18H15a.75.75 0 000-1.5H4.81l3.97-3.97a.75.75 0 00-1.06-1.06z" />
368                    </svg>
369                    <span class="bottom-nav-item-badge" id="bottomCompareCount" style="display:none;">0</span>
370                </div>
371                <span class="bottom-nav-item-label">Compare</span>
372            </button>
373
374            <!-- Chat - Always show, check login in JavaScript -->
375            <button class="bottom-nav-item" id="bottomChatBtn" data-page="chat">
376                <div class="bottom-nav-item-icon">
377                    <!-- Outlined icon (default) -->
378                    <svg class="icon-outlined" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
379                        opacity="0.85">
380                        <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
381                    </svg>
382                    <!-- Filled icon (active) -->
383                    <svg class="icon-filled" viewBox="0 0 24 24" fill="currentColor">
384                        <path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z" />
385                    </svg>
386                    <span class="bottom-nav-item-badge" id="bottomChatCount" style="display:none;">0</span>
387                </div>
388                <span class="bottom-nav-item-label">Chat</span>
389            </button>
390
391            <!-- Akun -->
392            <button class="bottom-nav-item" id="bottomLoginBtn">
393                <div class="bottom-nav-item-icon">
394                    <!-- Outlined icon (default) -->
395                    <svg class="icon-outlined" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
396                        stroke-linecap="round" stroke-linejoin="round">
397                        <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" />
398                        <circle cx="12" cy="7" r="4" />
399                    </svg>
400                    <!-- Filled icon (active) -->
401                    <svg class="icon-filled" viewBox="0 0 24 24" fill="currentColor">
402                        <path fill-rule="evenodd"
403                            d="M7.5 6a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM3.751 20.105a8.25 8.25 0 0116.498 0 .75.75 0 01-.437.695A18.683 18.683 0 0112 22.5c-2.786 0-5.433-.608-7.812-1.7a.75.75 0 01-.437-.695z"
404                            clip-rule="evenodd" />
405                    </svg>
406                </div>
407                <span class="bottom-nav-item-label">Login</span>
408            </button>
409            </svg>
410        </div>
411        </button>
412        </div>
413    </nav>
414
415    <!-- Mobile User Menu Bottom Sheet -->
416
417    
417<script nonce="se3iyzEHMc9FQEB4wSyd0w==">
418        (function () {
419            const btn = document.getElementById('megaMoreBtn');
420            const dd = document.getElementById('megaMoreDropdown');
421            if (!btn || !dd) return;
422
423            function openDD() {
424                dd.hidden = false;
425                btn.setAttribute('aria-expanded', 'true');
426                document.addEventListener('click', outside, {
427                    capture: true
428                });
429                document.addEventListener('keydown', esc);
430            }
431
432            function closeDD() {
433                if (dd.hidden) return;
434                dd.hidden = true;
435                btn.setAttribute('aria-expanded', 'false');
436                document.removeEventListener('click', outside, {
437                    capture: true
438                });
439                document.removeEventListener('keydown', esc);
440            }
441
442            function toggle() {
443                dd.hidden ? openDD() : closeDD();
444            }
445
446            function outside(e) {
447                if (!dd.contains(e.target) && e.target !== btn) {
448                    closeDD();
449                }
450            }
451
452            function esc(e) {
453                if (e.key === 'Escape') {
454                    closeDD();
455                    btn.focus();
456                }
457            }
458            btn.addEventListener('click', toggle);
459        })();
460
461        // ========== HORIZONTAL SCROLL FADE INDICATOR ==========
462        (function () {
463            const megaCats = document.getElementById('megaCatsScroll');
464            const fade = document.getElementById('megaCatsFade');
465            if (!megaCats || !fade) return;
466
467            function updateFade() {
468                const scrollLeft = megaCats.scrollLeft;
469                const scrollWidth = megaCats.scrollWidth;
470                const clientWidth = megaCats.clientWidth;
471                const maxScroll = scrollWidth - clientWidth;
472
473                // Hide fade when scrolled to end (within 10px tolerance)
474                if (maxScroll - scrollLeft <= 10) {
475                    fade.style.opacity = '0';
476                } else {
477                    fade.style.opacity = '1';
478                }
479            }
480
481            // Update on scroll
482            megaCats.addEventListener('scroll', updateFade, {
483                passive: true
484            });
485
486            // Update on resize
487            window.addEventListener('resize', updateFade, {
488                passive: true
489            });
490
491            // Initial check
492            setTimeout(updateFade, 100);
493        })();
494
495        document.addEventListener('DOMContentLoaded', function () {
496            var input = document.getElementById('searchInput');
497            if (!input) return;
498            input.addEventListener('keydown', function (e) {
499                if (e.key === 'Enter') {
500                    e.preventDefault();
501                    var form = input.form;
502                    if (!form) return;
503                    if (typeof form.requestSubmit === 'function') form.requestSubmit();
504                    else form.submit();
505                }
506            });
507        });
508
509
510        (function () {
511            const cartBtn = document.getElementById('cartBtn');
512            if (cartBtn) {
513                cartBtn.addEventListener('click', function (e) {
514                    e.preventDefault();
515
516                    const checkLogin = () => {
517                        return window.isUserLoggedIn ? window.isUserLoggedIn() : false;
518                    };
519
520                    if (checkLogin()) {
521                        window.location.href = '/keranjang';
522                    } else {
523                        showCartLoginModal();
524                    }
525                });
526            }
527
528            const loginBtn = document.getElementById('loginBtn');
529            if (loginBtn) {
530                loginBtn.addEventListener('click', function (e) {
531                    e.preventDefault();
532                    window.location.href =
533                        'https://moderntally.com/';
534                });
535            }
536
537            const userMenuBtn = document.getElementById('userMenuBtn');
538            const userDropdown = document.getElementById('userDropdown');
539
540            if (userMenuBtn && userDropdown) {
541                function openDropdown() {
542                    userDropdown.hidden = false;
543                    userMenuBtn.setAttribute('aria-expanded', 'true');
544                    document.addEventListener('click', closeOnOutside, {
545                        capture: true
546                    });
547                    document.addEventListener('keydown', closeOnEscape);
548                }
549
550                function closeDropdown() {
551                    if (userDropdown.hidden) return;
552                    userDropdown.hidden = true;
553                    userMenuBtn.setAttribute('aria-expanded', 'false');
554                    document.removeEventListener('click', closeOnOutside, {
555                        capture: true
556                    });
557                    document.removeEventListener('keydown', closeOnEscape);
558                }
559
560                function closeOnOutside(e) {
561                    if (!userDropdown.contains(e.target) && e.target !== userMenuBtn) {
562                        closeDropdown();
563                    }
564                }
565
566                function closeOnEscape(e) {
567                    if (e.key === 'Escape') {
568                        closeDropdown();
569                        userMenuBtn.focus();
570                    }
571                }
572
573                userMenuBtn.addEventListener('click', function (e) {
574                    e.preventDefault();
575                    userDropdown.hidden ? openDropdown() : closeDropdown();
576                });
577
578                // Close dropdown when clicking profile links
579                userDropdown.querySelectorAll('[data-close-dropdown]').forEach(link => {
580                    link.addEventListener('click', function () {
581                        closeDropdown();
582                    });
583                });
584            }
585
586            // Bottom nav profile button - toggle mobile bottom sheet
587            const bottomProfileBtn = document.getElementById('bottomProfileBtn');
588            const mobileUserSheet = document.getElementById('mobileUserSheet');
589            const mobileUserSheetBackdrop = document.getElementById('mobileUserSheetBackdrop');
590
591            if (bottomProfileBtn && mobileUserSheet) {
592                function openMobileSheet() {
593                    mobileUserSheet.hidden = false;
594                    document.body.style.overflow = 'hidden';
595                    // Trigger animation
596                    requestAnimationFrame(() => {
597                        mobileUserSheet.classList.add('active');
598                    });
599                }
600
601                function closeMobileSheet() {
602                    mobileUserSheet.classList.remove('active');
603                    document.body.style.overflow = '';
604                    setTimeout(() => {
605                        mobileUserSheet.hidden = true;
606                    }, 300);
607                }
608
609                bottomProfileBtn.addEventListener('click', function (e) {
610                    e.preventDefault();
611                    openMobileSheet();
612                });
613
614                if (mobileUserSheetBackdrop) {
615                    mobileUserSheetBackdrop.addEventListener('click', closeMobileSheet);
616                }
617
618                // Close on escape key
619                document.addEventListener('keydown', function (e) {
620                    if (e.key === 'Escape' && !mobileUserSheet.hidden) {
621                        closeMobileSheet();
622                    }
623                });
624
625                // Close sheet when clicking profile links
626                mobileUserSheet.querySelectorAll('[data-close-sheet]').forEach(link => {
627                    link.addEventListener('click', function () {
628                        closeMobileSheet();
629                    });
630                });
631            }
632
633            // Handle Google avatar error in bottom-nav (fallback to initials)
634            const bottomNavAvatar = document.querySelector('.bottom-nav-avatar-img');
635            if (bottomNavAvatar) {
636                bottomNavAvatar.addEventListener('error', function () {
637                    const initials = this.getAttribute('data-fallback-initials') || 'U';
638                    const initialsDiv = document.createElement('div');
639                    initialsDiv.className = 'bottom-nav-avatar-initials';
640                    initialsDiv.textContent = initials;
641                    this.parentNode.replaceChild(initialsDiv, this);
642                });
643            }
644
645            // Mobile logout button
646            const mobileLogoutBtn = document.getElementById('mobileLogoutBtn');
647            if (mobileLogoutBtn) {
648                mobileLogoutBtn.addEventListener('click', async function (e) {
649                    e.preventDefault();
650
651                    // Check push notification before logout
652                    if (window.ChatNotification && typeof window.ChatNotification
653                        .confirmLogoutWithPushNotification === 'function') {
654                        const confirmLogout = await window.ChatNotification
655                            .confirmLogoutWithPushNotification();
656                        if (!confirmLogout) {
657                            return; // User cancelled logout
658                        }
659                    }
660
661                    const getCsrfToken = () => document.querySelector('meta[name="csrf-token"]') ?
662                        .getAttribute('content') || '';
663
664                    try {
665                        const response = await fetch('/auth/logout', {
666                            method: 'POST',
667                            credentials: 'same-origin',
668                            headers: {
669                                'Content-Type': 'application/json',
670                                'X-CSRF-Token': getCsrfToken()
671                            },
672                            body: JSON.stringify({
673                                csrf_token: getCsrfToken()
674                            })
675                        });
676
677                        if (response.ok) {
678                            if (window.guestCart && typeof window.guestCart.clear === 'function') {
679                                window.guestCart.clear();
680                            }
681                            window.location.href = '/login?logged_out=1';
682                        } else {
683                            console.error('Logout failed');
684                            window.location.href = '/logout';
685                        }
686                    } catch (error) {
687                        console.error('Logout error:', error);
688                        window.location.href = '/logout';
689                    }
690                });
691            }
692
693            const logoutBtn = document.getElementById('logoutBtn');
694            if (logoutBtn) {
695                logoutBtn.addEventListener('click', async function (e) {
696                    e.preventDefault();
697
698                    // Check push notification before logout
699                    if (window.ChatNotification && typeof window.ChatNotification
700                        .confirmLogoutWithPushNotification === 'function') {
701                        const confirmLogout = await window.ChatNotification
702                            .confirmLogoutWithPushNotification();
703                        if (!confirmLogout) {
704                            return; // User cancelled logout
705                        }
706                    }
707
708                    const getCsrfToken = () => document.querySelector('meta[name="csrf-token"]') ?
709                        .getAttribute('content') || '';
710
711                    try {
712                        const response = await fetch('/auth/logout', {
713                            method: 'POST',
714                            credentials: 'same-origin',
715                            headers: {
716                                'Content-Type': 'application/json',
717                                'X-CSRF-Token': getCsrfToken()
718                            },
719                            body: JSON.stringify({
720                                csrf_token: getCsrfToken()
721                            })
722                        });
723
724                        if (response.ok) {
725                            if (window.guestCart && typeof window.guestCart.clear === 'function') {
726                                window.guestCart.clear();
727                            }
728
729                            window.location.href = '/login?logged_out=1';
730                        } else {
731                            console.error('Logout failed');
732                            window.location.href = '/logout';
733                        }
734                    } catch (error) {
735                        console.error('Logout error:', error);
736                        window.location.href = '/logout';
737                    }
738                });
739            }
740
741            const wishlistBtn = document.getElementById('wishlistBtn');
742            const notifBtn = document.getElementById('notifBtn');
743
744            if (wishlistBtn) {
745                wishlistBtn.addEventListener('click', function (e) {
746                    e.preventDefault();
747                    alert('Fitur wishlist akan segera tersedia!');
748                });
749            }
750
751            if (notifBtn) {
752                notifBtn.addEventListener('click', function (e) {
753                    e.preventDefault();
754                    alert('Fitur notifikasi akan segera tersedia!');
755                });
756            }
757        })();
758
759        // ========== MOBILE BOTTOM NAVIGATION ==========
760        (function initBottomNav() {
761            // Sync cart badge with bottom nav
762            function syncBottomCartBadge() {
763                const mainBadge = document.getElementById('cartCount');
764                const bottomBadge = document.getElementById('bottomCartCount');
765                if (mainBadge && bottomBadge) {
766                    const count = mainBadge.textContent;
767                    bottomBadge.textContent = count;
768                    bottomBadge.style.display = parseInt(count) > 0 ? 'flex' : 'none';
769                }
770            }
771
772            // Sync compare badge with bottom nav
773            function syncBottomCompareBadge() {
774                const mainBadge = document.getElementById('compareCount');
775                const bottomBadge = document.getElementById('bottomCompareCount');
776                if (mainBadge && bottomBadge) {
777                    const count = mainBadge.textContent;
778                    bottomBadge.textContent = count;
779                    bottomBadge.style.display = parseInt(count) > 0 ? 'flex' : 'none';
780                }
781            }
782
783            // Initial sync
784            syncBottomCartBadge();
785            syncBottomCompareBadge();
786
787            // Observe badge changes
788            const observer = new MutationObserver(function () {
789                syncBottomCartBadge();
790                syncBottomCompareBadge();
791            });
792
793            const cartBadge = document.getElementById('cartCount');
794            const compareBadge = document.getElementById('compareCount');
795
796            if (cartBadge) observer.observe(cartBadge, {
797                childList: true,
798                characterData: true,
799                subtree: true
800            });
801            if (compareBadge) observer.observe(compareBadge, {
802                childList: true,
803                characterData: true,
804                subtree: true
805            });
806
807            // Bottom Cart Button
808            const bottomCartBtn = document.getElementById('bottomCartBtn');
809            if (bottomCartBtn) {
810                bottomCartBtn.addEventListener('click', function (e) {
811                    e.preventDefault();
812
813                    const checkLogin = () => {
814                        r
814eturn window.isUserLoggedIn ? window.isUserLoggedIn() : false;
815                    };
816
817                    if (checkLogin()) {
818                        window.location.href = '/keranjang';
819                    } else {
820                        showCartLoginModal();
821                    }
822                });
823            }
824
825            // Bottom Compare Button
826            const bottomCompareBtn = document.getElementById('bottomCompareBtn');
827            if (bottomCompareBtn) {
828                bottomCompareBtn.addEventListener('click', function (e) {
829                    e.preventDefault();
830
831                    // Close chat widget if open
832                    if (window.plazaChat && window.plazaChat.isWidgetOpen) {
833                        window.plazaChat.closeWidget();
834                    }
835
836                    const mainCompareBtn = document.getElementById('compareBtn');
837                    if (mainCompareBtn) {
838                        mainCompareBtn.click();
839                    }
840                });
841            }
842
843            // Bottom Category Button - triggers mega menu
844            const bottomCategoryBtn = document.getElementById('bottomCategoryBtn');
845            if (bottomCategoryBtn) {
846                bottomCategoryBtn.addEventListener('click', function (e) {
847                    e.preventDefault();
848                    // Trigger desktop mega menu
849                    const desktopTrigger = document.querySelector('.mm2-trigger:not(#bottomCategoryBtn)');
850                    if (desktopTrigger) {
851                        desktopTrigger.click();
852                    }
853                });
854            }
855
856            // Bottom Login Button
857            const bottomLoginBtn = document.getElementById('bottomLoginBtn');
858            if (bottomLoginBtn) {
859                bottomLoginBtn.addEventListener('click', function (e) {
860                    e.preventDefault();
861                    window.location.href = '/login';
862                });
863            }
864
865            // Bottom Chat Button
866            const bottomChatBtn = document.getElementById('bottomChatBtn');
867            if (bottomChatBtn) {
868                bottomChatBtn.addEventListener('click', function (e) {
869                    e.preventDefault();
870
871                    // Trigger chat widget (try multiple times if needed)
872                    const triggerChat = () => {
873                        const chatToggle = document.getElementById('chat-toggle-btn');
874                        if (chatToggle) {
875                            chatToggle.click();
876                            return true;
877                        }
878                        return false;
879                    };
880
881                    // Immediate attempt
882                    if (!triggerChat()) {
883                        // Retry after 100ms if not found
884                        setTimeout(() => {
885                            if (!triggerChat()) {
886                                // Last resort: manually show popup
887                                const popup = document.getElementById('chat-popup');
888                                if (popup) {
889                                    popup.style.display = 'block';
890                                }
891                            }
892                        }, 100);
893                    }
894                });
895            }
896
897            // Sync chat unread badge
898            function syncBottomChatBadge() {
899                const chatBadge = document.getElementById('chat-unread-badge');
900                const bottomChatBadge = document.getElementById('bottomChatCount');
901                if (chatBadge && bottomChatBadge) {
902                    const count = chatBadge.textContent;
903                    bottomChatBadge.textContent = count;
904                    bottomChatBadge.style.display = chatBadge.style.display;
905                }
906            }
907
908            // Observe chat badge changes
909            const chatBadge = document.getElementById('chat-unread-badge');
910            if (chatBadge) {
911                observer.observe(chatBadge, {
912                    attributes: true,
913                    childList: true,
914                    characterData: true,
915                    subtree: true
916                });
917                syncBottomChatBadge();
918            }
919
920            // Active state management based on current page
921            function updateActiveState() {
922                const currentPath = window.location.pathname;
923                const bottomNavItems = document.querySelectorAll('.bottom-nav-item');
924
925                bottomNavItems.forEach(item => {
926                    item.classList.remove('active');
927
928                    const itemId = item.id;
929                    const page = item.getAttribute('data-page');
930                    const href = item.getAttribute('href');
931
932                    // Check by ID for specific pages
933                    if (itemId === 'bottomHomeBtn' && currentPath === '/') {
934                        item.classList.add('active');
935                    } else if (itemId === 'bottomCartBtn' && (currentPath === '/keranjang' ||
936                            currentPath === '/cart')) {
937                        item.classList.add('active');
938                    } else if (itemId === 'bottomProfileBtn' && currentPath.startsWith('/profile')) {
939                        item.classList.add('active');
940                    } else if (itemId === 'bottomCategoryBtn' && currentPath.startsWith('/kategori')) {
941                        item.classList.add('active');
942                    } else if (itemId === 'bottomCompareBtn' && currentPath === '/compare') {
943                        item.classList.add('active');
944                    } else if (itemId === 'bottomChatBtn' && currentPath === '/chat') {
945                        item.classList.add('active');
946                    }
947                    // Fallback: check by data-page attribute
948                    else if (page === 'home' && currentPath === '/') {
949                        item.classList.add('active');
950                    } else if (page === 'profile' && currentPath.startsWith('/profile')) {
951                        item.classList.add('active');
952                    }
953                    // Fallback: check by href
954                    else if (href && currentPath === href) {
955                        item.classList.add('active');
956                    }
957                });
958            }
959
960            // Update active state on load
961            updateActiveState();
962
963            // Bottom nav always visible - auto-hide disabled for better UX
964            // const bottomNav = document.querySelector('.bottom-nav');
965            // if (bottomNav && window.innerWidth <= 640) {
966            //   // Auto-hide feature disabled
967            // }
968        })();
969        // Cart Login Modal Handler (Global scope)
970        function showCartLoginModal() {
971            const modal = document.getElementById('cartLoginModal');
972            if (!modal) return;
973
974            modal.classList.add('show');
975
976            const confirmBtn = document.getElementById('cartLoginConfirm');
977            const registerBtn = document.getElementById('cartRegisterBtn');
978            const cancelBtn = document.getElementById('cartLoginCancel');
979
980            const handleLogin = () => {
981                window.location.href = '/login?return=' + encodeURIComponent('/keranjang');
982            };
983
984            const handleRegister = () => {
985                window.location.href = '/register?return=' + encodeURIComponent('/keranjang');
986            };
987
988            const handleCancel = () => {
989                modal.classList.remove('show');
990                confirmBtn.removeEventListener('click', handleLogin);
991                registerBtn.removeEventListener('click', handleRegister);
992                cancelBtn.removeEventListener('click', handleCancel);
993            };
994
995            confirmBtn.removeEventListener('click', handleLogin);
996            registerBtn.removeEventListener('click', handleRegister);
997            cancelBtn.removeEventListener('click', handleCancel);
998
999            confirmBtn.addEventListener('click', handleLogin);
1000            registerBtn.addEventListener('click', handleRegister);
1001            cancelBtn.addEventListener('click', handleCancel);
1002
1003            modal.addEventListener('click', (e) => {
1004                if (e.target === modal) {
1005                    handleCancel();
1006                }
1007            });
1008        }
1009    </script>
1009
1010    
1010<script src="https://plazaitdotid.pages.dev/assets/js/cart-badge.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w==">
1011    </script>
1011
1012
1013    <!-- Product Compare Sidebar -->
1014    <div class="compare-sidebar" id="compareSidebar">
1015        <div class="compare-header">
1016            <h4 class="compare-title">
1017                <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
1018                    <path
1019                        d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z" />
1020                </svg>
1021                Bandingkan Produk
1022                <span class="compare-count" id="compareCountSidebar">(0)</span>
1023            </h4>
1024            <button class="compare-close" id="compareClose" aria-label="Tutup">
1025                <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
1026                    <path
1027                        d="M18.3 5.7a1 1 0 0 0-1.4 0L12 10.6 7.1 5.7a1 1 0 1 0-1.4 1.4L10.6 12l-4.9 4.9a1 1 0 0 0 1.4 1.4L12 13.4l4.9 4.9a1 1 0 0 0 1.4-1.4L13.4 12l4.9-4.9a1 1 0 0 0 0-1.4z" />
1028                </svg>
1029            </button>
1030        </div>
1031
1032        <div class="compare-content">
1033            <div class="compare-empty" id="compareEmpty">
1034                <div class="empty-icon">
1035                    <svg width="48" height="48" viewBox="0 0 24 24" fill="currentColor" opacity="0.3">
1036                        <path
1037                            d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z" />
1038                    </svg>
1039                </div>
1040                <h5>Belum ada produk dipilih</h5>
1041                <p>Pilih produk yang ingin dibandingkan dengan klik tombol "Bandingkan Produk" di halaman produk.</p>
1042            </div>
1043
1044            <div class="compare-list" id="compareList">
1045                <!-- Products will be populated here -->
1046            </div>
1047        </div>
1048
1049        <div class="compare-actions" id="compareActions">
1050            <button class="btn btn-outline-danger btn-sm" id="compareClearAll">
1051                <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
1052                    <path
1053                        d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" />
1054                </svg>
1055                Hapus Semua
1056            </button>
1057            <button class="btn btn-primary btn-sm" id="compareAnalyze" disabled>
1058                <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
1059                    <path
1060                        d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4M11,16.5L18,9.5L16.59,8.09L11,13.67L7.91,10.59L6.5,12L11,16.5Z" />
1061                </svg>
1062                Analisis AI
1063            </button>
1064        </div>
1065
1066        <!-- AI Disclaimer in Sidebar -->
1067        <div class="compare-disclaimer">
1068            <div class="ai-disclaimer">
1069                <div class="disclaimer-text">
1070                    <strong>💡 Catatan:</strong> Analisis ini dihasilkan oleh AI dan dapat mengalami kesalahan.
1071                    Gunakan sebagai referensi dan tetap pertimbangkan kebutuhan spesifik Anda sebelum membeli.
1072                    Untuk konsultasi lebih lanjut, silakan hubungi tim RAJAVIP.
1073                </div>
1074            </div>
1075        </div>
1076    </div>
1077    <link rel="stylesheet" href="https://plazaitdotid.pages.dev/assets/css/pd-lightbox.css">
1078    <style>
1079        .paylater-promo {
1080            display: inline-flex;
1081            align-items: center;
1082            gap: 8px;
1083            background: linear-gradient(135deg, #f0fdf4 0, #dcfce7 100%);
1084            border: 1px solid #86efac;
1085            border-radius: 8px;
1086            padding: 8px 12px;
1087            font-size: 13px;
1088            line-height: 1.4;
1089            margin: 8px 0
1090        }
1091
1092        .paylater-promo-sm {
1093            padding: 6px 10px;
1094            font-size: 11px;
1095            gap: 6px
1096        }
1097
1098        .paylater-promo-md {
1099            padding: 8px 12px;
1100            font-size: 13px;
1101            gap: 8px
1102        }
1103
1104        .paylater-promo-lg {
1105            padding: 10px 16px;
1106            font-size: 14px;
1107            gap: 10px
1108        }
1109
1110        .paylater-icon {
1111            font-size: 1.2em;
1112            flex-shrink: 0
1113        }
1114
1115        .paylater-text {
1116            display: flex;
1117            flex-direction: column;
1118            gap: 2px
1119        }
1120
1121        .paylater-text strong {
1122            color: #15803d;
1123            font-weight: 600
1124        }
1125
1126        .paylater-text small {
1127            color: #16a34a;
1128            font-size: .85em;
1129            opacity: .9
1130        }
1131
1132        .paylater-desktop-only {
1133            display: none
1134        }
1135
1136        .paylater-mobile-only {
1137            display: flex
1138        }
1139
1140        @media (min-width:641px) {
1141            .paylater-desktop-only {
1142                display: flex
1143            }
1144
1145            .paylater-mobile-only {
1146                display: none
1147            }
1148        }
1149
1150        @media (max-width:640px) {
1151            .paylater-promo {
1152                font-size: 12px;
1153                padding: 7px 10px
1154            }
1155
1156            .paylater-promo-lg {
1157                font-size: 13px;
1158                padding: 8px 12px
1159            }
1160        }
1161
1162        @media print {
1163            .paylater-promo {
1164                display: none !important
1165            }
1166        }
1167
1168        .paylater-compact {
1169            display: inline-block;
1170            font-size: 11px;
1171            font-weight: 600;
1172            color: #059669;
1173            background: #d1fae5;
1174            padding: 3px 8px;
1175            border-radius: 4px;
1176            margin: 6px 0 4px;
1177            line-height: 1.3
1178        }
1179
1180        @media (max-width:640px) {
1181            .paylater-compact {
1182                font-size: 10px;
1183                padding: 2px 6px;
1184                margin: 5px 0 3px
1185            }
1186        }
1187
1188        @media print {
1189            .paylater-compact {
1190                display: none !important
1191            }
1192        }
1193    </style>
1194    <style nonce="se3iyzEHMc9FQEB4wSyd0w==">
1195        .pd-voucher-minimal {
1196            margin: 10px 0;
1197            display: flex;
1198            flex-direction: column;
1199            gap: 6px
1200        }
1201
1202        .pdv-min-item {
1203            display: flex;
1204            align-items: center;
1205            gap: 8px;
1206            padding: 0;
1207            height: 32px;
1208            transition: all .2s ease
1209        }
1210
1211        .pdv-min-hidden {
1212            display: none
1213        }
1214
1215        .pdv-min-disabled {
1216            opacity: .5
1217        }
1218
1219        .pdv-badge-btn {
1220            display: inline-flex;
1221            align-items: center;
1222            gap: 8px;
1223            background: linear-gradient(135deg, #667eea 0, #764ba2 100%);
1224            border: none;
1225            border-radius: 8px;
1226            padding: 3px;
1227            cursor: pointer;
1228            transition: all .2s ease;
1229            width: auto
1230        }
1231
1232        .pdv-badge-btn:hover:not(:disabled) {
1233            transform: translateY(-1px);
1234            box-shadow: 0 4px 12px rgba(102, 126, 234, .3)
1235        }
1236
1237        .pdv-badge-btn:disabled {
1238            opacity: .6;
1239            cursor: not-allowed
1240        }
1241
1242        .pdv-badge-icon {
1243            color: #fff;
1244            flex-shrink: 0
1245        }
1246
1247        .pdv-badge-text {
1248            font-size: 14px;
1249            font-weight: 700;
1250            color: #fff;
1251            white-space: nowrap
1252        }
1253
1254        .pdv-badge-code {
1255            font-family: 'Courier New', monospace;
1256            font-size: 13px;
1257            font-weight: 700;
1258            color: #fff;
1259            background: rgba(255, 255, 255, .2);
1260            padding: 4px 8px;
1261            border-radius: 4px;
1262            border: none;
1263            white-space: nowrap
1264        }
1265
1266        .pdv-min-copy,
1267        .pdv-min-more {
1268            padding: 4px 12px;
1269            font-size: 12px;
1270            font-weight: 600;
1271            border-radius: 5px;
1272            border: 1px solid #e2e8f0;
1273            background: #fff;
1274            color: #667eea;
1275            cursor: pointer;
1276            transition: all .2s ease;
1277            white-space: nowrap
1278        }
1279
1280        .pdv-min-copy:hover:not(:disabled),
1281        .pdv-min-more:hover {
1282            background: #667eea;
1283            color: #fff;
1284            border-color: #667eea
1285        }
1286
1287        .pdv-min-copy:disabled {
1288            opacity: .4;
1289            cursor: not-allowed
1290        }
1291
1292        .pdv-min-copy.copied {
1293            background: #22c55e;
1294            color: #fff;
1295            border-color: #22c55e
1296        }
1297
1298        .pdv-min-more {
1299            margin-left: auto
1300        }
1301
1302        .modal-close {
1303            position: absolute;
1304            top: 20px;
1305            right: 20px;
1306            background: none;
1307            border: none;
1308            cursor: pointer;
1309            color: #64748b;
1310            padding: 4px;
1311            transition: color .2s ease
1312        }
1313
1314        .modal-close:hover {
1315            color: #1e293b
1316        }
1317
1318        .modal-body {
1319            margin-bottom: 8px
1320        }
1321
1322        .voucher-modal-content {
1323            text-align: center
1324        }
1325
1326        .voucher-modal-badge {
1327            display: inline-flex;
1328            flex-direction: row;
1329            align-items: center;
1330            gap: 6px;
1331            background: linear-gradient(135deg, #667eea 0, #764ba2 100%);
1332            border-radius: 10px;
1333            padding: 8px 16px;
1334            margin-bottom: 12px
1335        }
1336
1337        .vmb-value {
1338            font-size: 18px;
1339            font-weight: 700;
1340            color: #fff;
1341            line-height: 1
1342        }
1343
1344        .vmb-label {
1345            font-size: 18px;
1346            font-weight: 700;
1347            color: #fff;
1348            text-transform: uppercase;
1349            letter-spacing: .5px
1350        }
1351
1352        .voucher-modal-code {
1353            font-family: 'Courier New', monospace;
1354            font-size: 14px;
1355            font-weight: 700;
1356            color: #667eea;
1357            background: rgba(102, 126, 234, .1);
1358            padding: 6px 12px;
1359            border-radius: 6px;
1360            border: 2px dashed rgba(102, 126, 234, .3);
1361            display: inline-block;
1362            margin-bottom: 10px
1363        }
1364
1365        .voucher-modal-name {
1366            font-size: 14px;
1367            font-weight: 600;
1368            color: #1e293b;
1369            margin-bottom: 16px
1370        }
1371
1372        .voucher-modal-details {
1373            text-align: left;
1374            background: #f8fafc;
1375            border-radius: 8px;
1376            padding: 12px;
1377            margin-bottom: 16px
1378        }
1379
1380        .vmd-item {
1381            display: flex;
1382            align-items: flex-start;
1383            gap: 8px;
1384            padding: 6px 0;
1385            font-size: 13px;
1386            color: #64748b;
1387            border-bottom: 1px solid #e2e8f0
1388        }
1389
1390        .vmd-item:last-child {
1391            border-bottom: none
1392        }
1393
1394        .vmd-item svg {
1395            color: #667eea;
1396            flex-shrink: 0;
1397            margin-top: 2px
1398        }
1399
1400        .vmd-item strong {
1401            color: #1e293b
1402        }
1403
1404        .modal-actions {
1405            padding: 20px
1406        }
1407
1408        .modal-btn-primary {
1409            background: linear-gradient(135deg, #667eea 0, #764ba2 100%);
1410            color: #fff
1411        }
1412
1413        .modal-btn-primary:hover {
1414            opacity: .9;
1415            transform: translateY(-1px)
1416        }
1417
1418        @media (max-width:640px) {
1419            .pdv-min-item {
1420                gap: 6px
1421            }
1422
1423            .pdv-badge-btn {
1424                padding: 3px;
1425                gap: 6px
1426            }
1427
1428            .pdv-badge-text {
1429                font-size: 13px
1430            }
1431
1432            .pdv-badge-code {
1433                font-size: 12px;
1434                padding: 3px 6px
1435            }
1436
1437            .pdv-min-copy,
1438            .pdv-min-more {
1439                padding: 3px 10px;
1440                font-size: 11px
1441            }
1442
1443            .modal-dialog {
1444                max-width: 95%;
1445                margin: 20px
1446            }
1447
1448            .vmb-value {
1449                font-size: 16px
1450            }
1451
1452            .vmb-label {
1453                font-size: 16px
1454            }
1455
1456            .voucher-modal-code {
1457                font-size: 13px;
1458                padding: 5px 10px
1459            }
1460        }
1461    </style>
1462    <style nonce="se3iyzEHMc9FQEB4wSyd0w==">
1463        .promo-endyear-mini-banner {
1464            display: flex;
1465            align-items: center;
1466            gap: 12px;
1467            padding: 12px 16px;
1468            background: rgba(255, 255, 255, .8);
1469            backdrop-filter: blur(10px);
1470            -webkit-backdrop-filter: blur(10px);
1471            border: 2px solid rgba(242, 140, 26, .2);
1472            border-radius: 12px;
1473            margin: 16px 0;
1474            box-shadow: 0 4px 16px rgba(0, 0, 0, .08);
1475            transition: all .3s ease
1476        }
1477
1478        .promo-endyear-mini-banner:hover {
1479            transform: translateY(-2px);
1480            box-shadow: 0 6px 20px rgba(0, 0, 0, .12);
1481            border-color: rgba(242, 140, 26, .4)
1482        }
1483
1484        .pey-icon {
1485            font-size: 32px;
1486            line-height: 1;
1487            flex-shrink: 0
1488        }
1489
1490        .pey-content {
1491            flex: 1;
1492            min-width: 0
1493        }
1494
1495        .pey-content strong {
1496            display: block;
1497            font-size: 14px;
1498            font-weight: 700;
1499            color: #F28C1A;
1500            margin-bottom: 2px
1501        }
1502
1503        .pey-content span {
1504            display: block;
1505            font-size: 13px;
1506            color: #64748b;
1507            line-height: 1.4
1508        }
1509
1510        .pey-link {
1511            flex-shrink: 0;
1512            padding: 8px 16px;
1513            background: linear-gradient(135deg, #F28C1A, #FFB84D);
1514            color: #fff;
1515            text-decoration: none;
1516            font-size: 13px;
1517            font-weight: 700;
1518            border-radius: 8px;
1519            white-space: nowrap;
1520            transition: all .2s ease;
1521            box-shadow: 0 2px 8px rgba(242, 140, 26, .25)
1522        }
1523
1524        .pey-link:hover {
1525            transform: translateX(2px);
1526            box-shadow: 0 4px 12px rgba(242, 140, 26, .35)
1527        }
1528
1529        @media(max-width:640px) {
1530            .promo-endyear-mini-banner {
1531                flex-wrap: wrap;
1532                gap: 8px;
1533                padding: 10px 12px
1534            }
1535
1536            .pey-icon {
1537                font-size: 28px;
1538                align-self: flex-start
1539            }
1540
1541            .pey-content {
1542                flex: 1;
1543                min-width: 0
1544            }
1545
1546            .pey-content strong {
1547                font-size: 12px
1548            }
1549
1550            .pey-content span {
1551                font-size: 11px;
1552                line-height: 1.3
1553            }
1554
1555            .pey-link {
1556                width: 100%;
1557                flex-basis: 100%;
1558                font-size: 11px;
1559                padding: 6px 12px;
1560                text-align: center
1561            }
1562        }
1563
1564        @media print {
1565            .promo-endyear-mini-banner {
1566                display: none !important
1567            }
1568        }
1569    </style>
1570    <style nonce="se3iyzEHMc9FQEB4wSyd0w==">
1571        .pd-title-row {
1572            position: relative;
1573            margin-bottom: 12px;
1574            padding-right: 52px
1575        }
1576
1577        .pd-title {
1578            margin: 0 !important
1579        }
1580
1581        .pd-share-btn {
1582            position: absolute;
1583            top: 0;
1584            right: 0;
1585            width: 40px;
1586            height: 40px;
1587            display: inline-flex;
1588            align-items: center;
1589            justify-content: center;
1590            border-radius: 10px;
1591            border: 1px solid #e2e8f0;
1592            background: #fff;
1593            color: #64748b;
1594            cursor: pointer;
1595            transition: all .2s ease;
1596            -webkit-tap-highlight-color: transparent
1597        }
1598
1599        .pd-share-btn:hover {
1600            background: #f8fafc;
1601            border-color: #cbd5e1;
1602            color: #0f172a;
1603            transform: translateY(-1px)
1604        }
1605
1606        .pd-share-btn:active {
1607            transform: translateY(0)
1608        }
1609
1610        .pd-share-btn svg {
1611            display: block
1612        }
1613
1614        .pd-share-modal-overlay {
1615            position: fixed;
1616            inset: 0;
1617            background: rgba(15, 23, 42, .75);
1618            backdrop-filter: blur(4px);
1619            z-index: 99999;
1620            display: none;
1621            align-items: center;
1622            justify-content: center;
1623            padding: 0;
1624            animation: fadeIn .2s ease
1625        }
1626
1627        .pd-share-modal-overlay.show {
1628            display: flex
1629        }
1630
1631        .pd-share-modal {
1632            background: #fff;
1633            border-radius: 20px;
1634            box-shadow: 0 25px 50px -12px rgba(0, 0, 0, .25);
1635            max-width: 480px;
1636            width: 100%;
1637            max-height: 90vh;
1638            overflow: hidden;
1639            display: flex;
1640            flex-direction: column;
1641            animation: slideUp .3s cubic-bezier(.16, 1, .3, 1)
1642        }
1643
1644        @keyframes fadeIn {
1645            from {
1646                opacity: 0
1647            }
1648
1649            to {
1650                opacity: 1
1651            }
1652        }
1653
1654        @keyframes slideUp {
1655            from {
1656                opacity: 0;
1657                transform: translateY(20px) scale(.95)
1658            }
1659
1660            to {
1661                opacity: 1;
1662                transform: translateY(0) scale(1)
1663            }
1664        }
1665
1666        .pd-share-header {
1667            display: flex;
1668            align-items: center;
1669            justify-content: space-between;
1670            padding: 20px 24px;
1671            border-bottom: 1px solid #f1f5f9
1672        }
1673
1674        .pd-share-title {
1675            font-size: 18px;
1676            font-weight: 700;
1677            color: #0f172a;
1678            margin: 0
1679        }
1680
1681        .pd-share-close {
1682            width: 32px;
1683            height: 32px;
1684            border-radius: 8px;
1685            border: 0;
1686            background: transparent;
1687            color: #64748b;
1688            display: inline-flex;
1689            align-items: center;
1690            justify-content: center;
1691            cursor: pointer;
1692            transition: all .15s ease
1693        }
1694
1695        .pd-share-close:hover {
1696            background: #f1f5f9;
1697            color: #0f172a
1698        }
1699
1700        .pd-share-body {
1701            padding: 24px;
1702            overflow-y: auto
1703        }
1704
1705        .pd-share-preview {
1706            display: flex;
1707            gap: 12px;
1708            padding: 16px;
1709            background: #f8fafc;
1710            border-radius: 12px;
1711            margin-bottom: 24px
1712        }
1713
1714        .pd-share-preview-img {
1715            width: 64px;
1716            height: 64px;
1717            border-radius: 8px;
1718            object-fit: cover;
1719            flex-shrink: 0;
1720            border: 1px solid #e2e8f0
1721        }
1722
1723        .pd-share-preview-info {
1724            flex: 1;
1725            min-width: 0
1726        }
1727
1728        .pd-share-preview-name {
1729            font-size: 14px;
1730            font-weight: 600;
1731            color: #0f172a;
1732            margin: 0 0 4px 0;
1733            display: -webkit-box;
1734            -webkit-line-clamp: 2;
1735            -webkit-box-orient: vertical;
1736            overflow: hidden
1737        }
1738
1739        .pd-share-preview-price {
1740            font-size: 16px;
1741            font-weight: 700;
1742            color: #0ea5e9;
1743            margin: 0
1744        }
1745
1746        .pd-share-label {
1747            font-size: 13px;
1748            font-weight: 600;
1749            color: #475569;
1750            margin: 0 0 12px 0;
1751            text-transform: uppercase;
1752            letter-spacing: .5px
1753        }
1754
1755        .pd-share-grid {
1756            display: grid;
1757            grid-template-columns: repeat(4, 1fr);
1758            gap: 12px;
1759            margin-bottom: 24px
1760        }
1761
1762        .pd-share-option {
1763            display: flex;
1764            flex-direction: column;
1765            align-items: center;
1766            gap: 8px;
1767            padding: 16px 8px;
1768            border: 1.5px solid #e2e8f0;
1769            border-radius: 12px;
1770            background: #fff;
1771            cursor: pointer;
1772            transition: all .2s ease;
1773            text-decoration: none;
1774            color: inherit
1775        }
1776
1777        .pd-share-option:hover {
1778            border-color: #94a3b8;
1779            background: #f8fafc;
1780            transform: translateY(-2px)
1781        }
1782
1783        .pd-share-option:active {
1784            transform: translateY(0)
1785        }
1786
1787        .pd-share-icon {
1788            width: 40px;
1789            height: 40px;
1790            border-radius: 10px;
1791            display: inline-flex;
1792            align-items: center;
1793            justify-content: center;
1794            position: relative
1795        }
1796
1797        .pd-share-icon svg {
1798            width: 24px;
1799            height: 24px;
1800            display: block
1801        }
1802
1803        .pd-share-icon-whatsapp {
1804            background: linear-gradient(135deg, #25D366 0%, #128C7E 100%);
1805            color: #fff
1806        }
1807
1808        .pd-share-icon-facebook {
1809            background: linear-gradient(135deg, #1877F2 0%, #0c63d4 100%);
1810            color: #fff
1811        }
1812
1813        .pd-share-icon-twitter {
1814            background: linear-gradient(135deg, #1DA1F2 0%, #0d8bd9 100%);
1815            color: #fff
1816        }
1817
1818        .pd-share-icon-telegram {
1819            background: linear-gradient(135deg, #0088cc 0%, #0077b3 100%);
1820            color: #fff
1821        }
1822
1823        .pd-share-icon-email {
1824            background: linear-gradient(135deg, #EA4335 0%, #c5331f 100%);
1825            color: #fff
1826        }
1827
1828        .pd-share-icon-copy {
1829            background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);
1830            color: #fff
1831        }
1832
1833        .pd-share-icon-pdf {
1834            background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
1835            color: #fff
1836        }
1837
1838        .pd-share-name {
1839            font-size: 12px;
1840            font-weight: 600;
1841            color: #475569;
1842            text-align: center
1843        }
1844
1845        .pd-share-copy-section {
1846            background: #f8fafc;
1847            padding: 16px;
1848            border-radius: 12px
1849        }
1850
1851        .pd-share-copy-input-wrap {
1852            display: flex;
1853            gap: 8px
1854        }
1855
1856        .pd-share-copy-input {
1857            flex: 1;
1858            padding: 12px 14px;
1859            border: 1px solid #e2e8f0;
1860            border-radius: 10px;
1861            font-size: 14px;
1862            color: #0f172a;
1863            background: #fff;
1864            font-family: 'Segoe UI', system-ui, sans-serif
1865        }
1866
1867        .pd-share-copy-input:focus {
1868            outline: 0;
1869            border-color: #0ea5e9;
1870            box-shadow: 0 0 0 3px rgba(14, 165, 233, .1)
1871        }
1872
1873        .pd-share-copy-btn {
1874            padding: 12px 20px;
1875            border: 0;
1876            border-radius: 10px;
1877            background: linear-gradient(135deg, #0ea5e9 0%, #0284c7 100%);
1878            color: #fff;
1879            font-size: 14px;
1880            font-weight: 600;
1881            cursor: pointer;
1882            transition: all .2s ease;
1883            white-space: nowrap;
1884            display: inline-flex;
1885            align-items: center;
1886            gap: 6px
1887        }
1888
1889        .pd-share-copy-btn:hover {
1890            background: linear-gradient(135deg, #0284c7 0%, #0369a1 100%);
1891            transform: translateY(-1px);
1892            box-shadow: 0 4px 12px rgba(14, 165, 233, .3)
1893        }
1894
1895        .pd-share-copy-btn:active {
1896            transform: translateY(0)
1897        }
1898
1899        .pd-share-copy-btn svg {
1900            width: 16px;
1901            height: 16px
1902        }
1903
1904        .pd-share-copy-btn.copied {
1905            background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
1906            pointer-events: none
1907        }
1908
1909        @media(max-width:640px) {
1910            .pd-share-modal {
1911                border-radius: 20px 20px 0 0;
1912                margin-top: auto;
1913                max-height: 85vh
1914            }
1915
1916            .pd-share-grid {
1917                grid-template-columns: repeat(3, 1fr)
1918            }
1919
1920            .pd-share-header {
1921                padding: 16px 20px
1922            }
1923
1924            .pd-share-body {
1925                padding: 20px
1926            }
1927
1928            .pd-share-btn {
1929                width: 36px;
1930                height: 36px
1931            }
1932
1933            .pd-share-btn svg {
1934                width: 18px;
1935                height: 18px
1936            }
1937        }
1938
1939        @media(max-width:480px) {
1940            .pd-share-grid {
1941                grid-template-columns: repeat(3, 1fr);
1942                gap: 10px
1943            }
1944
1945            .pd-share-option {
1946                padding: 12px 6px
1947            }
1948
1949            .pd-share-icon {
1950                width: 36px;
1951                height: 36px
1952            }
1953
1954            .pd-share-icon svg {
1955                width: 20px;
1956                height: 20px
1957            }
1958
1959            .pd-share-name {
1960                font-size: 11px
1961            }
1962        }
1963
1964        .mf-share {
1965            background: #fff;
1966            color: #fb923c;
1967            border: 2px solid #fb923c;
1968            display: inline-flex;
1969            align-items: center;
1970            justify-content: center
1971        }
1972
1973        .mf-share:active {
1974            transform: scale(.95)
1975        }
1976
1977        .mf-share svg {
1978            display: block
1979        }
1980
1981        @media(max-width:640px) {
1982            .pd-share-btn {
1983                display: none !important
1984            }
1985        }
1986
1987        .stock-badge.in {
1988            background: #e6f9ec;
1989            color: #15803d;
1990            border-radius: 999px;
1991            padding: 4px 10px;
1992            font-weight: 700
1993        }
1994
1995        .stock-badge.out {
1996            background: #fee2e2;
1997            color: #0080ff;
1998            border-radius: 999px;
1999            padding: 4px 10px;
2000            font-weight: 700
2001        }
2002
2003        .stock-info-btn {
2004            --c: #0ea5e9;
2005            --b: #bae6fd;
2006            --bg: #f0f9ff;
2007            --bg-h: #e0f2fe;
2008            --b-h: #0ea5e9;
2009            margin-left: 0;
2010            display: inline-flex;
2011            align-items: center;
2012            justify-content: center;
2013            gap: 0.5rem;
2014            padding: 4px 10px;
2015            border-radius: 999px;
2016            border: 1.5px solid var(--b);
2017            background: var(--bg);
2018            color: var(--c);
2019            cursor: pointer;
2020            font-size: 12px;
2021            font-weight: 600;
2022            transition: all .2s ease;
2023            -webkit-tap-highlight-color: transparent
2024        }
2025
2026        .stock-info-btn:hover {
2027            background: var(--bg-h);
2028            border-color: var(--b-h);
2029            color: #0284c7;
2030            transform: translateY(-1px);
2031            box-shadow: 0 2px 8px rgba(14, 165, 233, .15)
2032        }
2033
2034        .stock-info-btn:active {
2035            transform: translateY(0)
2036        }
2037
2038        .stock-info-btn:focus-visible {
2039            outline: 0;
2040            box-shadow: 0 0 0 3px rgba(14, 165, 233, .2)
2041        }
2042
2043        .stock-info-btn svg {
2044            width: 14px;
2045            height: 14px;
2046            flex-shrink: 0
2047        }
2048
2049        .stock-info-btn .btn-text {
2050            white-space: nowrap
2051        }
2052
2053        .stock-popover {
2054            position: absolute;
2055            z-index: 9999;
2056            min-width: 280px;
2057            max-width: 92vw;
2058            background: #0b1220;
2059            color: #eef3ff;
2060            border: 1px solid rgba(255, 255, 255, .08);
2061            border-radius: 14px;
2062            box-shadow: 0 20px 40px rgba(12, 12, 20, .45);
2063            padding: 12px 12px 8px;
2064            display: none
2065        }
2066
2067        .stock-popover.show {
2068            display: block
2069        }
2070
2071        .stock-popover::before {
2072            content: "";
2073            position: absolute;
2074            top: -8px;
2075            left: 24px;
2076            width: 14px;
2077            height: 14px;
2078            background: #0b1220;
2079            border-left: 1px solid rgba(255, 255, 255, .08);
2080            border-top: 1px solid rgba(255, 255, 255, .08);
2081            transform: rotate(45deg)
2082        }
2083
2084        .sp-head {
2085            display: flex;
2086            align-items: center;
2087            justify-content: space-between;
2088            margin-bottom: 8px
2089        }
2090
2091        .sp-title {
2092            font-weight: 800;
2093            font-size: 14px
2094        }
2095
2096        .sp-close {
2097            background: transparent;
2098            border: 0;
2099            color: #98a2b3;
2100            cursor: pointer
2101        }
2102
2103        .sp-list {
2104            list-style: none;
2105            margin: 0;
2106            padding: 0;
2107            display: flex;
2108            flex-direction: column;
2109            gap: 8px
2110        }
2111
2112        .sp-item {
2113            display: grid;
2114            grid-template-columns: 1fr auto 32px;
2115            column-gap: 12px;
2116            align-items: center;
2117            padding: 10px 10px;
2118            min-height: 44px;
2119            border-radius: 10px;
2120            background: rgba(255, 255, 255, .03)
2121        }
2122
2123        .sp-left {
2124            display: flex;
2125            align-items: center;
2126            gap: 10px
2127        }
2128
2129        .sp-dot {
2130            width: 10px;
2131            height: 10px;
2132            border-radius: 999px;
2133            background: var(--dot, #60a5fa);
2134            display: inline-block
2135        }
2136
2137        .sp-label {
2138            font-weight: 600;
2139            font-size: 13px
2140        }
2141
2142
2143        .sp-qty {
2144            grid-column: 2;
2145            justify-self: end;
2146            min-width: 40px;
2147            text-align: right;
2148            font-weight: 800;
2149            font-size: 13px;
2150            color: #cfe4ff;
2151            font-variant-numeric: tabular-nums
2152        }
2153
2154        .sp-wa {
2155            grid-column: 3;
2156            justify-self: end;
2157            width: 32px;
2158            height: 32px;
2159            min-width: 32px;
2160            min-height: 32px;
2161            box-sizing: border-box;
2162            padding: 0;
2163            line-height: 0;
2164            text-decoration: none;
2165            outline: 0;
2166            display: inline-flex;
2167            align-items: center;
2168            justify-content: center;
2169            border-radius: 999px;
2170            border: 1px solid rgba(37, 211, 102, .60);
2171            /* 1px untuk hasil “crisp” */
2172            background: rgba(37, 211, 102, .08);
2173            color: #25D366;
2174            transition: background-color .15s ease, border-color .15s ease, transform .05s ease;
2175            -webkit-tap-highlight-color: transparent;
2176        }
2177
2178        .sp-wa:hover {
2179            background: rgba(37, 211, 102, .16);
2180            border-color: rgba(37, 211, 102, .75)
2181        }
2182
2183        .sp-wa:active {
2184            transform: translateY(.5px) scale(.98)
2185        }
2186
2187        .sp-wa svg {
2188            width: 18px;
2189            height: 18px;
2190            display: block;
2191            vertical-align: middle
2192        }
2193
2194        .stock-popover a {
2195            text-decoration: none
2196        }
2197
2198        #deskripsi img {
2199            max-width: 450px !important;
2200            height: unset !important
2201        }
2202
2203        @media(max-width:640px) {
2204            .stock-popover {
2205                position: fixed;
2206                left: 0;
2207                right: 0;
2208                bottom: max(12px, env(safe-area-inset-bottom, 12px));
2209                margin: 0 10px;
2210                padding: 14px 12px 10px;
2211                border-radius: 16px
2212            }
2213
2214            .stock-popover::before {
2215                display: none
2216            }
2217
2218            .stock-info-btn {
2219                padding: 4px 8px;
2220                gap: 4px;
2221                border: 0;
2222                background: transparent
2223            }
2224
2225            .stock-info-btn:hover {
2226                background: transparent;
2227                box-shadow: none;
2228                transform: none
2229            }
2230
2231            .stock-info-btn .btn-text {
2232                display: none
2233            }
2234
2235            .stock-info-btn svg {
2236                width: 16px;
2237                height: 16px
2238            }
2239
2240            .sp-item {
2241                grid-template-columns: 1fr auto 36px
2242            }
2243
2244            .sp-wa {
2245                width: 36px;
2246                height: 36px;
2247                min-width: 36px;
2248                min-height: 36px
2249            }
2250
2251            .sp-wa svg {
2252                width: 19px;
2253                height: 19px
2254            }
2255        }
2256
2257        .stock-dot {
2258            position: absolute;
2259            bottom: 8px;
2260            right: 8px;
2261            width: 8px;
2262            height: 8px;
2263            border-radius: 50%;
2264            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
2265            z-index: 2;
2266            cursor: help
2267        }
2268
2269        .stock-dot.ready {
2270            background: #10b981
2271        }
2272
2273        .stock-dot.low {
2274            background: #f59e0b
2275        }
2276
2277        .stock-dot.out {
2278            background: #ef4444
2279        }
2280
2281        .stock-dot:hover {
2282            transform: scale(1.2);
2283            transition: transform 0.2s ease
2284        }
2285
2286        @media(max-width:640px) {
2287            .stock-dot {
2288                width: 7px;
2289                height: 7px;
2290                bottom: 6px;
2291                right: 6px
2292            }
2293        }
2294
2295        .pd-related-card .spec-chips {
2296            font-size: 11px;
2297            color: #64748b;
2298            margin: 4px 0 6px 0;
2299            line-height: 1.3;
2300            font-weight: 500
2301        }
2302
2303        .pd-related-card .spec-chips .spec-divider {
2304            margin: 0 4px;
2305            opacity: 0.6
2306        }
2307
2308        @media(max-width:640px) {
2309            .pd-related-card .spec-chips {
2310                font-size: 10px;
2311                margin: 3px 0 5px 0
2312            }
2313
2314            #deskripsi img {
2315                max-width: 300px !important;
2316                height: unset !important;
2317                justify-self: center !important
2318            }
2319        }
2320
2321        .pwp-trigger-badge {
2322            display: inline-flex;
2323            align-items: center;
2324            gap: 4px;
2325            padding: 3px 8px 4px;
2326            background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
2327            color: #78350f;
2328            border-radius: 6px;
2329            font-size: .65rem;
2330            font-weight: 600;
2331            border: 0
2332        }
2333
2334        .pwp-trigger-badge svg {
2335            flex-shrink: 0;
2336            width: 12px;
2337            height: 12px
2338        }
2339
2340        .pwp-deals-section {
2341            margin: 0;
2342            padding: 12px;
2343            background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
2344            border-radius: 12px;
2345            border: 2px solid #fbbf24
2346        }
2347
2348        .pwp-deals-header {
2349            display: flex;
2350            gap: 10px;
2351            margin-bottom: 10px
2352        }
2353
2354        .pwp-icon {
2355            flex-shrink: 0;
2356            color: #f59e0b;
2357            width: 18px;
2358            height: 18px
2359        }
2360
2361        .pwp-text .pwp-title {
2362            margin: 0 0 2px 0;
2363            font-size: 14px;
2364            font-weight: 700;
2365            color: #78350f
2366        }
2367
2368        .pwp-text .pwp-subtitle {
2369            margin: 0;
2370            font-size: 11px;
2371            color: #92400e;
2372            opacity: 0.9
2373        }
2374
2375        .pwp-deals-loading {
2376            text-align: center;
2377            padding: 40px 0;
2378            color: #92400e
2379        }
2380
2381        .pwp-spinner {
2382            width: 40px;
2383            height: 40px;
2384            border: 3px solid #fbbf24;
2385            border-top-color: #f59e0b;
2386            border-radius: 50%;
2387            animation: spin 0.8s linear infinite;
2388            margin: 0 auto 12px
2389        }
2390
2391        @keyframes spin {
2392            to {
2393                transform: rotate(360deg)
2394            }
2395        }
2396
2397        .pwp-deals-grid {
2398            display: flex;
2399            flex-direction: column;
2400            gap: 6px
2401        }
2402
2403        .pwp-deal-card {
2404            background: #fff;
2405            border-radius: 6px;
2406            overflow: hidden;
2407            border: 1px solid #fbbf24;
2408            display: flex;
2409            align-items: center;
2410            padding: 8px;
2411            gap: 10px
2412        }
2413
2414        .pwp-deal-card:hover {
2415            background: #fef3c7
2416        }
2417
2418        .pwp-deal-thumb {
2419            flex-shrink: 0;
2420            width: 50px;
2421            height: 50px;
2422            background: #f8fafc;
2423            overflow: hidden;
2424            border-radius: 4px
2425        }
2426
2427        .pwp-deal-thumb img {
2428            width: 100%;
2429            height: 100%;
2430            object-fit: cover
2431        }
2432
2433        .pwp-deal-badge {
2434            background: #dc2626;
2435            color: #fff;
2436            padding: 2px 5px;
2437            border-radius: 3px;
2438            font-size: 9px;
2439            font-weight: 700;
2440            margin-left: auto
2441        }
2442
2443        .pwp-deal-info {
2444            flex: 1;
2445            display: flex;
2446            flex-direction: column;
2447            gap: 4px
2448        }
2449
2450        .pwp-deal-name {
2451            font-size: 12px;
2452            font-weight: 600;
2453            color: #0f172a;
2454            margin: 0;
2455            line-height: 1.2
2456        }
2457
2458        .pwp-deal-prices {
2459            display: flex;
2460            align-items: center;
2461            gap: 6px;
2462            flex-wrap: wrap
2463        }
2464
2465        .pwp-deal-price {
2466            font-size: 14px;
2467            font-weight: 800;
2468            color: #dc2626;
2469            white-space: nowrap
2470        }
2471
2472        .pwp-deal-original {
2473            font-size: 11px;
2474            color: #64748b;
2475            text-decoration: line-through;
2476            white-space: nowrap
2477        }
2478
2479        .pwp-cart-note {
2480            margin-top: 8px;
2481            padding: 6px 10px;
2482            background: #e0f2fe;
2483            border-left: 2px solid#0ea5e9;
2484            font-size: 11px;
2485            color: #0c4a6e;
2486            border-radius: 4px
2487        }
2488
2489        @media(max-width:640px) {
2490            .pwp-deals-section {
2491                margin: 12px 0;
2492                padding: 10px;
2493                border-radius: 10px
2494            }
2495
2496            .pwp-deals-header {
2497                gap: 8px
2498            }
2499
2500            .pwp-text .pwp-title {
2501                font-size: 13px
2502            }
2503
2504            .pwp-text .pwp-subtitle {
2505                font-size: 10px
2506            }
2507
2508            .pwp-deal-card {
2509                padding: 6px;
2510                gap: 8px
2511            }
2512
2513            .pwp-deal-thumb {
2514                width: 45px;
2515                height: 45px
2516            }
2517
2518            .pwp-deal-name {
2519                font-size: 11px
2520            }
2521
2522            .pwp-deal-price {
2523                font-size: 13px
2524            }
2525
2526            .pwp-deal-original {
2527                font-size: 10px
2528            }
2529        }
2530
2531        .preorder-badge {
2532            display: inline-flex;
2533            align-items: center;
2534            gap: 5px;
2535            padding: 6px 12px;
2536            background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
2537            color: #fff;
2538            border-radius: 8px;
2539            font-size: 13px;
2540            font-weight: 700;
2541            border: 0;
2542            box-shadow: 0 2px 8px rgba(139, 92, 246, .25)
2543        }
2544
2545        .preorder-badge svg {
2546            width: 16px;
2547            height: 16px;
2548            flex-shrink: 0
2549        }
2550
2551        .preorder-info {
2552            margin: 12px 0;
2553            padding: 14px;
2554            background: linear-gradient(135deg, #f5f3ff 0%, #ede9fe 100%);
2555            border: 1.5px solid #c4b5fd;
2556            border-radius: 12px
2557        }
2558
2559        .preorder-info-header {
2560            display: flex;
2561            align-items: center;
2562            gap: 8px;
2563            margin-bottom: 10px
2564        }
2565
2566        .preorder-info-icon {
2567            width: 20px;
2568            height: 20px;
2569            color: #7c3aed;
2570            flex-shrink: 0
2571        }
2572
2573        .preorder-info-title {
2574            font-size: 14px;
2575            font-weight: 700;
2576            color: #5b21b6;
2577            margin: 0
2578        }
2579
2580        .preorder-info-items {
2581            display: flex;
2582            flex-direction: column;
2583            gap: 8px
2584        }
2585
2586        .preorder-info-row {
2587            display: flex;
2588            align-items: center;
2589            justify-content: space-between;
2590            font-size: 13px
2591        }
2592
2593        .preorder-info-label {
2594            color: #6b21a8;
2595            font-weight: 600
2596        }
2597
2598        .preorder-info-value {
2599            color: #5b21b6;
2600            font-weight: 700
2601        }
2602
2603        .preorder-info-value.highlight {
2604            color: #dc2626;
2605            font-size: 14px
2606        }
2607
2608        .preorder-info-note {
2609            margin-top: 10px;
2610            padding: 8px 10px;
2611            background: #fef3c7;
2612            border-left: 2px solid #f59e0b;
2613            font-size: 12px;
2614            color: #78350f;
2615            border-radius: 6px;
2616            line-height: 1.4
2617        }
2618
2619        @media(max-width:640px) {
2620            .preorder-badge {
2621                font-size: 12px;
2622                padding: 5px 10px
2623            }
2624
2625            .preorder-info {
2626                margin: 10px 0;
2627                padding: 12px
2628            }
2629
2630            .preorder-info-title {
2631                font-size: 13px
2632            }
2633
2634            .preorder-info-row {
2635                font-size: 12px
2636            }
2637
2638            .preorder-info-note {
2639                font-size: 11px;
2640                padding: 6px 8px
2641            }
2642        }
2643    </style>
2644
2645    <div class="pd-sticky-header" id="pd-sticky-header">
2646        <div class="pd-sticky-header-container">
2647            <div class="pd-sticky-thumb"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" id="pd-sticky-thumb-img"></div>
2648            <div class="pd-sticky-info">
2649                <h2 class="pd-sticky-title" id="pd-sticky-title">RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis
2650                </h2>
2651                <div class="pd-sticky-price-row"><span class="pd-sticky-price" id="pd-sticky-price">Rp
2652                        10.000,-</span><span class="pd-sticky-price-original" id="pd-sticky-price-original">Rp
2653                        1.000.000</span><span class="pd-sticky-discount" id="pd-sticky-discount">-99.0%</span></div>
2654            </div>
2655            <div class="pd-sticky-actions"><button type="button" class="pd-sticky-share-btn" id="pd-sticky-share-btn"
2656                    aria-label="Bagikan produk" title="Bagikan"><svg viewBox="0 0 24 24" width="16" height="16"
2657                        aria-hidden="true">
2658                        <path fill="currentColor"
2659                            d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92z" />
2660                    </svg></button><button type="button" class="pd-sticky-btn pd-sticky-btn-chat"
2661                    id="pd-sticky-chat"><svg viewBox="0 0 640 640" fill="currentColor" aria-hidden="true">
2662                        <path
2663                            d="M320 128C241 128 175.3 185.3 162.3 260.7C171.6 257.7 181.6 256 192 256L208 256C234.5 256 256 277.5 256 304L256 400C256 426.5 234.5 448 208 448L192 448C139 448 96 405 96 352L96 288C96 164.3 196.3 64 320 64C443.7 64 544 164.3 544 288L544 456.1C544 522.4 490.2 576.1 423.9 576.1L336 576L304 576C277.5 576 256 554.5 256 528C256 501.5 277.5 480 304 480L336 480C362.5 480 384 501.5 384 528L384 528L424 528C463.8 528 496 495.8 496 456L496 435.1C481.9 443.3 465.5 447.9 448 447.9L432 447.9C405.5 447.9 384 426.4 384 399.9L384 303.9C384 277.4 405.5 255.9 432 255.9L448 255.9C458.4 255.9 468.3 257.5 477.7 260.6C464.7 185.3 399.1 127.9 320 127.9z" />
2664                    </svg>Tanya</button><button type="button" class="pd-sticky-btn pd-sticky-btn-cart"
2665                    id="pd-sticky-add-cart" disabled>+ Keranjang</button><button type="button"
2666                    class="pd-sticky-btn pd-sticky-btn-buy" id="pd-sticky-buy" disabled>Beli Sekarang</button></div>
2667        </div>
2668    </div>
2669
2670    <main class="product-single product-single--v3">
2671        <nav class="pd-breadcrumb" aria-label="breadcrumb"><a
2672                href="https://moderntally.com/">
2672RAJAVIP</a><span>/</span><a
2673                href="https://moderntally.com/">RAJAVIP LINK</a><span>/</span><a
2674                href="https://moderntally.com/">RAJA GAME</a><span>/</span><a
2675                href="https://moderntally.com/">LINK RAJA GAME</a><span>/</span><a
2676                href="https://moderntally.com/">RAJA GAME ONLINE</a> <span>/</span>
2677                <span class="current">SITUS RAJAVIP</span></nav>
2678
2679        <div class="pd-top-layout">
2680            <section class="pd-media-card">
2681                <figure class="pd-main-image" id="pd-main-figure"><img id="pd-main-img" src="https://moderntally.com/imagess/inovasi-game-digital.png"
2682                        alt="RAJAVIP" data-slug="" loading="eager">
2683                </figure>
2684
2685                <div class="pd-mobile-slider-wrapper">
2686                    <div class="pd-mobile-slider" id="pd-mobile-slider" aria-label="Galeri gambar (geser)">
2687                        <div class="pd-mslide"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" loading="eager"></div>
2688                        <div class="pd-mslide"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" loading="lazy"></div>
2689                        <div class="pd-mslide"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" loading="lazy"></div>
2690                        <div class="pd-mslide"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" loading="lazy"></div>
2691                        <div class="pd-mslide"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" loading="lazy"></div>
2692                        <div class="pd-mslide"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" loading="lazy"></div>
2693                    </div>
2694                    <div class="pd-gallery-counter" id="pd-gallery-counter">1/6</div>
2695                </div>
2696                <div class="pd-thumb-gallery" id="pd-thumb-gallery" aria-label="Galeri gambar produk"><button
2697                        type="button" class="pd-thumb-btn active" data-full="https://moderntally.com/imagess/inovasi-game-digital.png" data-alt="RAJAVIP"
2698                        data-slug="" aria-label="Gambar 1"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP"
2699                            loading="lazy"></button><button type="button" class="pd-thumb-btn "
2700                        data-full="https://moderntally.com/imagess/inovasi-game-digital.png" data-alt="RAJAVIP" data-slug="https://moderntally.com/imagess/inovasi-game-digital.png"
2701                        aria-label="Gambar 2"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP"
2702                            loading="lazy"></button><button type="button" class="pd-thumb-btn "
2703                        data-full="https://moderntally.com/imagess/inovasi-game-digital.png" data-alt="RAJAVIP"
2704                        data-slug="lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-223.webp"
2705                        aria-label="Gambar 3"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP"
2706                            loading="lazy"></button><button type="button" class="pd-thumb-btn "
2707                        data-full="https://moderntally.com/imagess/inovasi-game-digital.png" data-alt="RAJAVIP"
2708                        data-slug="lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-776.webp"
2709                        aria-label="Gambar 4"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP"
2710                            loading="lazy"></button><button type="button" class="pd-thumb-btn "
2711                        data-full="https://moderntally.com/imagess/inovasi-game-digital.png" data-alt="RAJAVIP"
2712                        data-slug="lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-634.webp"
2713                        aria-label="Gambar 5"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP"
2714                            loading="lazy"></button><button type="button" class="pd-thumb-btn "
2715                        data-full="https://moderntally.com/imagess/inovasi-game-digital.png" data-alt
2715="RAJAVIP"
2716                        data-slug="lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-892.webp"
2717                        aria-label="Gambar 6"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP" loading="lazy"></button>
2718                </div>
2719            </section>
2720            <section class="pd-info-card">
2721                <div id="pd-variant-combined" class="pd-variant-combined" hidden></div>
2722                <div class="pd-title-row">
2723                    <h1 class="pd-title" id="pd-title">RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis
2724                    </h1><button type="button" class="pd-share-btn" id="pd-share-btn" aria-label="Bagikan produk"
2725                        title="Bagikan"><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true">
2726                            <path fill="currentColor"
2727                                d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92z" />
2728                        </svg></button>
2729                </div>
2730                <div id="pd-price-anchor">
2731                </div>
2732                <div class="pd-price-qr-container">
2733                    <div class="pd-price-block" id="pd-price-block">
2734                        <div class="pd-price-row">
2735                            <span class="pd-price-current" id="pd-price-current">Rp 10.000</span>
2736                            <span class="pd-price-original" id="pd-price-original">Rp 100.000</span>
2737                            <span class="pd-discount-badge" id="pd-discount-badge">-90%</span></div>
2738                        <div class="pd-meta-row">
2739                            <span class="sold-inline" id="pd-sold-inline" data-role="sold-chip">Terjual Terjual 2</span>
2740                            <span class="pwp-trigger-badge" id="pwp-trigger-badge" hidden>
2741                                <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
2742                                    <path
2743                                        d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z" />
2744                                </svg>Bisa PWP</span></div>
2745                        <div class="pd-meta-inline"><span class="stock-badge out" id="pd-stock-badge">
2745RAJAVIP</span>
2746                            <span class="sku">SKU: <span id="pd-sku">RJ777</span></span></div>
2747                        <div class="paylater-promo paylater-promo-sm paylater-mobile-only">
2748                            <span class="paylater-icon">💳</span>
2749                            <span class="paylater-text">
2750                                <strong>Autorized Game Gacor</strong>
2751                                <small>Link Login RAJAVIP</small>
2752                            </span>
2753                        </div>
2754
2755                        <div class="stock-popover" id="pd-stock-popover" role="dialog" aria-hidden="true"
2756                            aria-label="Informasi stok cabang">
2757                            <div class="sp-head">
2758                                <div class="sp-title">Stok Cabang</div><button type="button" class="sp-close"
2759                                    id="pd-stock-popover-close" aria-label="Tutup"><svg width="18" height="18"
2760                                        viewBox="0 0 24 24">
2761                                        <path fill="currentColor"
2762                                            d="M18.3 5.71L12 12.01l-6.3-6.3-1.4 1.41 6.3 6.3-6.3 6.3 1.4 1.41 6.3-6.3 6.3 6.3 1.41-1.41-6.3-6.3 6.3-6.3z" />
2763                                    </svg></button>
2764                            </div>
2765                            <ul class="sp-list">
2766                                <li class="sp-item">
2767                                    <div class="sp-left"><span class="sp-dot" style="--dot:#60a5fa;"></span><span
2768                                            class="sp-label">Asia Mega Mas</span></div><span class="sp-qty"
2769                                        id="sp-qty-meg">0</span><a class="sp-wa"
2770                                        href="https://wa.me/6281380009898?text=Halo%2C%20saya%20ingin%20tanya%20stok%20di%20Asia%20Mega%20Mas%20untuk%20produk%20https%3A%2F%2Fplazait.co.id%2Fproduct%2Flenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-black"
2771                                        target="_blank" rel="noopener" aria-label="WhatsApp Asia Mega Mas"><svg
2772                                            class="ico-wa" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
2773                                            <path fill="currentColor"
2774                                                d="M17.472 14.382c-.297-.149-1.758-.867-2.029-.967-.273-.099-.471-.148-.669.149-.198.297-.767.966-.94 1.164-.173.198-.347.223-.644.074-.297-.149-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.297-.347.446-.52.149-.173.198-.297.298-.495.099-.198.05-.372-.025-.521-.075-.149-.669-1.612-.916-2.206-.242-.579-.487-.5-.669-.51l-.57-.01c-.198 0-.52.074-.792.372s-1.04 1.016-1.04 2.479 1.065 2.876 1.213 3.074c.149.198 2.095 3.2 5.076 4.487.709.306 1.262.489 1.694.626.712.226 1.36.194 1.872.118.571-.085 1.758-.718 2.006-1.411.248-.694.248-1.29.173-1.411-.074-.123-.272-.198-.57-.347m-5.421 7.403h-.002a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.263c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.887 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.158 11.892c0 2.096.547 4.142 1.588 5.945L0 24l6.305-1.654a11.86 11.86 0 005.67 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.485-8.413" />
2775                                        </svg></a>
2776                                </li>
2777
2778                                <li class="sp-item">
2779                                    <div class="sp-left">
2780                                        <span class="sp-dot" style="--dot:#34d399;"></span>
2781                                        <span class="sp-label">Medan Fair</span>
2782                                    </div>
2783                                    <span class="sp-qty" id="sp-qty-mdf">0</span>
2784                                    <a class="sp-wa"
2785                                        href="https://wa.me/6285388992009?text=Halo%2C%20saya%20ingin%20tanya%20stok%20di%20Medan%20Fair%20untuk%20produk%20https%3A%2F%2Fplazait.co.id%2Fproduct%2Flenovo-legion-go-8as
2785p2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-black"
2786                                        target="_blank" rel="noopener" aria-label="WhatsApp Medan Fair">
2787                                        <svg class="ico-wa" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
2788                                            <path fill="currentColor"
2789                                                d="M17.472 14.382c-.297-.149-1.758-.867-2.029-.967-.273-.099-.471-.148-.669.149-.198.297-.767.966-.94 1.164-.173.198-.347.223-.644.074-.297-.149-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.297-.347.446-.52.149-.173.198-.297.298-.495.099-.198.05-.372-.025-.521-.075-.149-.669-1.612-.916-2.206-.242-.579-.487-.5-.669-.51l-.57-.01c-.198 0-.52.074-.792.372s-1.04 1.016-1.04 2.479 1.065 2.876 1.213 3.074c.149.198 2.095 3.2 5.076 4.487.709.306 1.262.489 1.694.626.712.226 1.36.194 1.872.118.571-.085 1.758-.718 2.006-1.411.248-.694.248-1.29.173-1.411-.074-.123-.272-.198-.57-.347m-5.421 7.403h-.002a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.263c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.887 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.158 11.892c0 2.096.547 4.142 1.588 5.945L0 24l6.305-1.654a11.86 11.86 0 005.67 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.485-8.413" />
2790                                        </svg>
2791                                    </a>
2792                                </li>
2793
2794                                <li class="sp-item">
2795                                    <div class="sp-left">
2796                                        <span class="sp-dot" style="--dot:#f59e0b;"></span>
2797                                        <span class="sp-label">Banda Aceh</span>
2798                                    </div>
2799                                    <span class="sp-qty" id="sp-qty-bda">0</span>
2800                                    <a class="sp-wa"
2801                                        href="https://wa.me/628116833411?text=Halo%2C%20saya%20ingin%20tanya%20stok%20di%20Banda%20Aceh%20untuk%20produk%20https%3A%2F%2Fplazait.co.id%2Fproduct%2Flenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-black"
2802                                        target="_blank" rel="noopener" aria-label="WhatsApp Banda Aceh">
2803                                        <svg class="ico-wa" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
2804                                            <path fill="currentColor"
2805                                                d="M17.472 14.382c-.297-.149-1.758-.867-2.029-.967-.273-.099-.471-.148-.669.149-.198.297-.767.966-.94 1.164-.173.198-.347.223-.644.074-.297-.149-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.297-.347.446-.52.149-.173.198-.297.298-.495.099-.198.05-.372-.025-.521-.075-.149-.669-1.612-.916-2.206-.242-.579-.487-.5-.669-.51l-.57-.01c-.198 0-.52.074-.792.372s-1.04 1.016-1.04 2.479 1.065 2.876 1.213 3.074c.149.198 2.095 3.2 5.076 4.487.709.306 1.262.489 1.694.626.712.226 1.36.194 1.872.118.571-.085 1.758-.718 2.006-1.411.248-.694.248-1.29.173-1.411-.074-.123-.272-.198-.57-.347m-5.421 7.403h-.002a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.263c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.887 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.158 11.892c0 2.096.547 4.142 1.588 5.945L0 24l6.305-1.654a11.86 11.86 0 005.67 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.485-8.413" />
2806                                        </svg>
2807                                    </a>
2808                                </li>
2809                            </ul>
2810                        </div>
2811
2812                    </div>
2813                    <div class="pd-qr-print" style="display:none;">
2814                        <div class="pd-qr-label">Scan untuk lihat produk:</div><img
2815                            src="https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=https%3A%2F%2Fplazait.co.id%2Fproduct%2Flenovo-legion-go-8as
2815p2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-black"
2816                            alt="QR Code" class="pd-qr-image">
2817                    </div>
2818                </div>
2819                <div id="pd-variants-anchor"></div>
2820
2821
2822
2823                <div class="pd-compare-section">
2824                    <button type="button" class="pd-compare-btn" id="pd-compare-btn" data-product-id="325">
2825                        <svg class="compare-icon" width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
2826                            <path d="M21,9L17,5V8H10V10H17V13M7,11L3,15L7,19V16H14V14H7V11Z" />
2827                        </svg>
2828                        <span class="compare-text">Bandingkan Produk</span>
2829                        <span class="compare-remove" hidden>
2830                            <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
2831                                <path
2832                                    d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" />
2833                            </svg>
2834                            Hapus dari Perbandingan
2835                        </span>
2836                    </button>
2837                    <div class="pd-compare-info">
2838                        <small class="compare-note" id="compare-note">Bandingkan hingga 5 produk dengan bantuan
2839                            AI</small>
2840                    </div>
2841                </div>
2842
2843                <style>
2844                    /* Section utama */
2845                    .article-wrapper {
2846                        max-width: 850px;
2847                        margin: 60px auto;
2848                        padding: 40px;
2849                        background: #ffffff;
2850                        border-radius: 10px;
2851                        box-shadow: 0 8px 25px rgba(0, 0, 0, 0.08);
2852                        font-family: Arial, Helvetica, sans-serif;
2853                        color: #333;
2854                        line-height: 1.8;
2855                    }
2856
2857                    /* Judul utama */
2858                    .article-wrapper h1 {
2859                        font-size: 28px;
2860                        margin-bottom: 20px;
2861                        line-height: 1.4;
2862                    }
2863
2864                    /* Subjudul */
2865                    .article-wrapper h2 {
2866                        font-size: 20px;
2867                        margin-top: 35px;
2868                        margin-bottom: 15px;
2869                        padding-left: 12px;
2870                        border-left: 4px solid #555;
2871                    }
2872
2873                    /* Paragraf */
2874                    .article-wrapper p {
2875                        margin-bottom: 18px;
2876                        text-align: justify;
2877                        font-size: 16px;
2878                    }
2879
2880                    /* Highlight box */
2881                    .highlight-box {
2882                        background: #f3f3f3;
2883                        padding: 18px;
2884                        margin: 25px 0;
2885                        border-radius: 6px;
2886                        border-left: 4px solid #888;
2887                        font-size: 15px;
2888                    }
2889
2890                    /* Responsive */
2891                    @media(max-width:768px) {
2892                        .article-wrapper {
2893                            margin: 20px;
2894                            padding: 25px;
2895                        }
2896
2897                        .article-wrapper h1 {
2898                            font-size: 22px;
2899                        }
2900
2901                        .article-wrapper p {
2902                            font-size: 15px;
2903                        }
2904                    }
2905                </style>
2906                <section class="article-wrapper">
2907
2908                    <h1>RAJAVIP: Inovasi Baru Game Digital dengan Akses Mudah & Praktis</h1>
2909
2910                    <p style="text-align: justify;"><a href="https://moderntally.com/">RAJAVIP</a> hadir membawa inovasi baru game digital dengan akses mudah dan praktis, serta beragam hiburan populer yang seru untuk dinikmati setiap saat.</p>
2911
2912                    <style>
2913                        .n-columns-2 {
2914                            display: grid;
2915                            grid-template-columns: repeat(2, 1fr);
2916                            gap: 1rem;
2917                            font-weight: 600;
2918                            margin: 0 auto 0.5rem;
2919                            padding-top: 20px;
2920                            max-width: 1280px;
2921                        }
2922
2923                        .n-columns-2 a {
2924                            text-align: center;
2925                            color: #fff;
2926                            padding: 14px 12px;
2927                            border-radius: 12px;
2928                            text-decoration: none
2929                        }
2930
2931                        .n-columns-2 a:hover {
2932                            transform: translateY(-4px) scale(1.02);
2933                            box-shadow: 0 6px 15px rgba(0, 0, 0, .4)
2934                        }
2935
2936                        .n-columns-2 a span {
2937                            position: relative;
2938                            z-index: 1
2939                        }
2940
2941                        .login {
2942                            overflow: hidden;
2943                            position: relative;
2944                            border: 2px solid gold;
2945                            background: rgb(255, 217, 0)
2946                        }
2947
2948                        .register {
2949                            background: rgb(255, 0, 0);
2950                            border: 2px solid red;
2951                            overflow: hidden;
2952                            position: relative;
2953                        }
2954
2955                        .login::before,
2956                        .register::before,
2957                        .css-1ihqho8::before {
2958                            content: "";
2959                            position: absolute;
2960                            top: 0;
2961                            left: 0;
2962                            right: 0;
2963                            bottom: 0;
2964                            background: radial-gradient(circle at 30% 70%, rgba(246, 92, 92, 0.3) 0%, transparent 50%), radial-gradient(circle at 70% 30%, rgba(255, 0, 0, 0.3) 0%, transparent 50%), radial-gradient(circle at 20% 20%, rgba(0, 0, 0, 0.1) 0%, transparent 40%), radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 40%), black;
2965                            z-index: -2
2966                        }
2967
2968                        .login::after,
2969                        .register::after,
2970                        .css-1ihqho8::after {
2971                            content: "";
2972                            position: absolute;
2973                            top: 0;
2974                            left: 0;
2975                            right: 0;
2976                            bottom: 0;
2977                            background-image: radial-gradient(3px 3px at 20px 30px, white, transparent), radial-gradient(3px 3px at 40px 70px, rgba(255, 255, 255, 0.8), transparent), radial-gradient(2px 2px at 90px 40px, rgba(255, 255, 255, 0.6), transparent), radial-gradient(2px 2px at 130px 80px, rgba(255, 255, 255, 0.4), transparent), radial-gradient(2px 2px at 160px 30px, rgba(255, 255, 255, 0.7), transparent);
2978                            background-repeat: repeat;
2979                            background-size: 200px 100px;
2980                            animation: stars 20s linear infinite;
2981                            z-index: -1;
2982                            opacity: 0.5;
2983                        }
2984
2985                        @keyframes stars {
2986                            from {
2987                                transform: translateX(0);
2988                            }
2989
2990                            to {
2991                                transform: translateX(-200px);
2992                            }
2993                        }
2994                    </style>
2995                    <div class="n-columns-2">
2996                        <a href="https://vpnwarp.win/rajavipslot" class="login"><span>LOGIN</span></a>
2997
2998                        <a href="https://vpnwarp.win/rajavipslot" class="register"><span>DAFTAR</span></a>
2999                    </div>
3000        </div>
3001        <div class="pwp-deals-section" id="pwp-deals-section" hidden data-product-id="325" data-variant-id="0"
3002            data-category-path="Komputer &amp; Laptop/Laptop/Gaming">
3003            <div class="pwp-deals-header"><svg class="pwp-icon" width="20" height="20" viewBox="0 0 24 24"
3004                    fill="currentColor">
3005                    <path
3006                        d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59
3006-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z" />
3007                </svg>
3008                <div class="pwp-text">
3009                    <h3 class="pwp-title">Penawaran Spesial PWP (Purchase with Purchase)</h3>
3010                    <p class="pwp-subtitle">Beli produk ini dan dapatkan produk pilihan dengan harga spesial</p>
3011                </div>
3012            </div>
3013            <div class="pwp-deals-loading">
3014                <div class="pwp-spinner"></div>
3015                <p>Memuat penawaran...</p>
3016            </div>
3017            <div class="pwp-deals-grid" id="pwp-deals-grid"></div>
3018            <p class="pwp-cart-note">💡 Produk PWP dapat ditambahkan di halaman keranjang setelah produk ini dimasukkan
3019            </p>
3020        </div>
3021        </section>
3022
3023        <aside class="pd-sidebar">
3024            <div class="pd-side-card pd-buy-card">
3025                <form class="pd-buy-form" id="pd-buy-form" data-pid="325">
3026                    <input type="hidden" name="variant_id" id="pd-variant-id" value="0">
3027                    <div>
3028                        <label for="qty" class="qty-label">Qty</label>
3029                        <input type="number" id="qty" name="qty" value="0" min="1" max="0" disabled>
3030                    </div>
3031                    <div class="pd-actions">
3032                        <button type="submit" class="btn-add-cart" id="btn-add-cart" disabled>+ Keranjang</button>
3033                        <button type="button" class="btn-buy" id="btn-buy" data-id="278426" disabled>Beli</button>
3034                        <button type="button" class="btn-chat-icon" id="btn-chat-icon" aria-label="Tanya Produk"
3035                            title="Tanya Produk"><svg viewBox="0 0 640 640" fill="currentColor">
3036                                <path
3037                                    d="M320 128C241 128 175.3 185.3 162.3 260.7C171.6 257.7 181.6 256 192 256L208 256C234.5 256 256 277.5 256 304L256 400C256 426.5 234.5 448 208 448L192 448C139 448 96 405 96 352L96 288C96 164.3 196.3 64 320 64C443.7 64 544 164.3 544 288L544 456.1C544 522.4 490.2 576.1 423.9 576.1L336 576L304 576C277.5 576 256 554.5 256 528C256 501.5 277.5 480 304 480L336 480C362.5 480 384 501.5 384 528L384 528L424 528C463.8 528 496 495.8 496 456L496 435.1C481.9 443.3 465.5 447.9 448 447.9L432 447.9C405.5 447.9 384 426.4 384 399.9L384 303.9C384 277.4 405.5 255.9 432 255.9L448 255.9C458.4 255.9 468.3 257.5 477.7 260.6C464.7 185.3 399.1 127.9 320 127.9z" />
3038                            </svg></button>
3039                    </div>
3040                </form>
3041                <div class="paylater-promo paylater-promo-md paylater-desktop-only">
3042                    <span class="paylater-icon">💳</span>
3043                    <span class="paylater-text">
3044                        <strong>Autorized Link Raja Game</strong>
3045                        <small>Link Login RAJAVIP</small>
3046                    </span>
3047                </div>
3048            </div>
3049
3050
3051            <div class="pd-side-card qoala-banner-card">
3052                <div class="qoala-banner">
3053                    <div class="qoala-banner-content">
3054                        <div class="qoala-icon">
3055                            <center><img src="https://moderntally.com/imagess/icon-rajavip.png" alt="RAJAVIP" class="qoala-shield-img"></center>
3056                        </div>
3057                        <div class="qoala-text">
3058                            <div class="qoala-title">Login RAJAVIP</div>
3059                            <div class="qoala-subtitle">Verified</div>
3060                        </div>
3061                    </div>
3062                    <a href="https://moderntally.com/" class="qoala-cta"
3063                        data-ga-event="qoala_banner_click" data-product-id="325" data-product-name="RAJAVIP"
3064                        data-category-path="Komputer &amp; Laptop/Laptop/Gaming" target="_blank">Info</a>
3065                </div>
3066                <style>
3067                    .qoala-banner-card {
3068                        padding: 0;
3069                        overflow: hidden
3070                    }
3071
3072                    .qoala-banner {
3073                        background: linear-gradient(135deg, #b31a1a 0%, #b31a1a 100%);
3074                        padding: 12px 16px;
3075                        display: flex;
3076                        align-items: center;
3077                        justify-content: space-between;
3078                        color: white;
3079                        text-decoration: none;
3080                        min-height: 60px
3081                    }
3082
3083                    .qoala-banner-content {
3084                        display: flex;
3085                        align-items: center;
3086                        gap: 12px
3087                    }
3088
3089                    .qoala-icon {
3090                        display: flex;
3091                        align-items: center;
3092                        justify-content: center
3093                    }
3094
3095                    .qoala-shield-img {
3096                        width: 36px;
3097                        height: 36px;
3098                        object-fit: contain;
3099                        opacity: 0.9
3100                    }
3101
3102                    .qoala-title {
3103                        font-weight: 600;
3104                        font-size: 14px;
3105                        line-height: 1.2
3106                    }
3107
3108                    .qoala-subtitle {
3109                        font-size: 12px;
3110                        opacity: 0.9;
3111                        line-height: 1.2
3112                    }
3113
3114                    .qoala-cta {
3115                        background: rgba(255, 255, 255, 0.2);
3116                        color: white;
3117                        padding: 6px 12px;
3118                        border-radius: 6px;
3119                        font-size: 12px;
3120                        font-weight: 600;
3121                        text-decoration: none;
3122                        transition: background 0.2s ease;
3123                        border: 1px solid rgba(255, 255, 255, 0.3)
3124                    }
3125
3126                    .qoala-cta:hover {
3127                        background: rgba(255, 255, 255, 0.3);
3128                        color: white
3129                    }
3130
3131                    @media(max-width:768px) {
3132                        .qoala-banner {
3133                            padding: 10px 12px
3134                        }
3135
3136                        .qoala-title {
3137                            font-size: 17px
3138                        }
3139
3140                        .qoala-subtitle {
3141                            font-size: 11px
3142                        }
3143                    }
3144                </style>
3145            </div>
3146
3147            <style>
3148                .alex-table-wrapper {
3149                    max-width: 900px;
3150                    margin: 60px auto;
3151                    font-family: Arial, sans-serif;
3152                }
3153
3154                .alex-table-title {
3155                    text-align: center;
3156                    font-size: 26px;
3157                    color: #000000;
3158                    font-weight: bold;
3159                    margin-bottom: 20px;
3160                    text-shadow: 0 0 10px yellow;
3161                }
3162
3163                .alex-table {
3164                    width: 100%;
3165                    border-collapse: collapse;
3166                    background: #000;
3167                    border: 2px solid rgb(64, 0, 255);
3168                    box-shadow: 0 0 15px yellow;
3169                    color: #fff;
3170                }
3171
3172                .alex-table th,
3173                .alex-table td {
3174                    padding: 14px;
3175                    border: 1px solid rgb(179, 26, 26);
3176                    text-align: left;
3177                }
3178
3179                .alex-table th {
3180                    background: #111;
3181                    color: rgb(179, 26, 26);
3182                }
3183
3184                .alex-table tr:nth-child(even) {
3185                    background: #0a0a0a;
3186                }
3187
3188                .alex-table tr:hover {
3189                    background: #111;
3190                }
3191            </style>
3192
3193            <div class="alex-table-wrapper">
3194
3195                <div class="alex-table-title">
3196                    Informasi Situs RAJAVIP
3197                </div>
3198
3199                <table class="alex-table">
3200
3201                    <tr>
3202                        <th>Nama Situs</th>
3203                        <td>
3203RAJAVIP</td>
3204                    </tr>
3205
3206                    <tr>
3207                        <th>Jenis Permainan</th>
3208                        <td>Game Online</td>
3209                    </tr>
3210
3211                    <tr>
3212                        <th>Minimal Deposit</th>
3213                        <td>Rp10.000</td>
3214                    </tr>
3215
3216                    <tr>
3217                        <th>Metode Akses</th>
3218                        <td>Smartphone, Tablet, dan Desktop</td>
3219                    </tr>
3220
3221                    <tr>
3222                        <th>Program Bonus</th>
3223                        <td>Bonus New Member, Bonus Harian, Bonus Mingguan</td>
3224                    </tr>
3225
3226                    <tr>
3227                        <th>Layanan</th>
3228                        <td>Online 24 Jam</td>
3229                    </tr>
3230
3231                    <tr>
3232                        <th>Keunggulan</th>
3233                        <td>Permainan terlengkap, akses cepat, dan dijamin approve pasti seru</td>
3234                    </tr>
3235
3236                </table>
3237
3238            </div>
3239
3240            <style>
3241                .sembunyi {
3242                    display: none;
3243                }
3244            </style>
3245            <div class="sembunyi">
3246                <div class="sembunyi">
3247
3248                </div>
3249                <a href="https://moderntally.com/"
3250                    class="iab-cta iab-cta--compact"
3251                    aria-label="Lihat detail cicilan Kredivo, Home Credit, Indodana">Detail & Syarat</a>
3252                <div class="iab-footnote iab-footnote--compact">*S&K penyedia berlaku</div>
3253            </div>
3254        </aside>
3255        </div>
3256        <style>
3257            .alex-faq-wrapper {
3258                max-width: 900px;
3259                margin: 60px auto;
3260                font-family: Arial, sans-serif;
3261            }
3262
3263            .alex-faq-title {
3264                text-align: center;
3265                font-size: 26px;
3266                color: #000000;
3267                font-weight: bold;
3268                margin-bottom: 30px;
3269                text-shadow: 0 0 10px yellow;
3270            }
3271
3272            .alex-faq-container {
3273                background: #ffffff;
3274                border: 2px solid rgb(0, 200, 255);
3275                border-radius: 10px;
3276                box-shadow: 0 0 15px yellow;
3277                overflow: hidden;
3278            }
3279
3280            .alex-faq-slider {
3281                display: flex;
3282                transition: transform 0.6s ease;
3283            }
3284
3285            .alex-faq-item {
3286                min-width: 100%;
3287                padding: 30px;
3288                color: #000000;
3289            }
3290
3291            .alex-faq-question {
3292                font-size: 18px;
3293                font-weight: bold;
3294                color: #000000;
3295                margin-bottom: 10px;
3296            }
3297
3298            .alex-faq-answer {
3299                font-size: 15px;
3300                line-height: 1.7;
3301                color: #000000;
3302            }
3303        </style>
3304
3305        <section class="alex-faq-wrapper">
3306
3307            <div class="alex-faq-title">
3308                FAQ RAJAVIP Link Raja Game
3309            </div>
3310
3311            <div class="alex-faq-container">
3312
3313                <div class="alex-faq-slider" id="faqSlider">
3314
3315                    <div class="alex-faq-item">
3316                        <div class="alex-faq-question">
3317                            Apa itu RAJAVIP?
3318                        </div>
3319                        <div class="alex-faq-answer">
3320                            RAJAVIP adalah situs hiburan online terbaru yang menyediakan berbagai pilihan game populer dengan sistem yang dirancang untuk memberikan pengalaman bermain yang mudah dan menguntungkan.
3321                        </div>
3322                    </div>
3323
3324                    <div class="alex-faq-item">
3325                        <div class="alex-faq-question">
3326                            Mengapa RAJAVIP disebut link raja game online terbaik?
3327                        </div>
3328                        <div class="alex-faq-answer">
3329                            Karena RAJAVIP menghadirkan layanan stabil, akses cepat, pilihan permainan lengkap, serta pengalaman bermain yang nyaman bagi para pengguna.
3330                        </div>
3331                    </div>
3332
3333                    <div class="alex-faq-item">
3334                        <div class="alex-faq-question">
3335                            Apakah RAJAVIP cocok untuk pemula?
3336                        </div>
3337                        <div class="alex-faq-answer">
3338                            Ya, RAJAVIP sangat cocok untuk pemula karena memiliki tampilan yang ramah pengguna, proses daftar yang mudah, serta berbagai panduan bermain yang membantu pemain baru.
3339                        </div>
3340                    </div>
3341
3342                    <div class="alex-faq-item">
3343                        <div class="alex-faq-question">
3344                            Hiburan apa saja yang tersedia di RAJAVIP?
3345                        </div>
3346                        <div class="alex-faq-answer">
3347                            RAJAVIP menyediakan berbagai hiburan digital menarik seperti game online populer, permainan interaktif, dan layanan yang dirancang untuk memberikan pengalaman bermain yang seru setiap hari.
3348                        </div>
3349                    </div>
3350
3351                    <div class="alex-faq-item">
3352                        <div class="alex-faq-question">
3353                            Bagaimana cara mengakses RAJAVIP dengan aman?
3354                        </div>
3355                        <div class="alex-faq-answer">
3356                            Untuk mengakses RAJAVIP dengan aman, pastikan menggunakan link resmi terbaru, koneksi internet yang stabil, serta menghindari tautan yang tidak terpercaya
3357                        </div>
3358                    </div>
3359
3360                    </div>
3361
3362                </div>
3363            </div>
3364        </section>
3365
3366        
3366<script>
3367            let faqIndex = 0;
3368            const faqSlider = document.getElementById("faqSlider");
3369            const totalFAQ = faqSlider.children.length;
3370
3371            function autoSlideFAQ() {
3372                faqIndex++;
3373                if (faqIndex >= totalFAQ) {
3374                    faqIndex = 0;
3375                }
3376                faqSlider.style.transform = "translateX(-" + faqIndex * 100 + "%)";
3377            }
3378
3379            setInterval(autoSlideFAQ, 4000);
3380        </script>
3380
3381
3382        
3382<script>
3383            const faqItems = document.querySelectorAll(".faq-item");
3384            faqItems.forEach(item => {
3385                item.querySelector(".faq-question").addEventListener("click", () => {
3386                    item.classList.toggle("active");
3387                });
3388            });
3389        </script>
3389
3390
3391
3392
3393
3394        </section>
3395
3396
3397
3398        <section class="pd-related-full">
3399            <h2 class="pd-related-title">Produk Terkait</h2>
3400            <div class="pd-related-grid pd-related-grid--full">
3401                <a class="pd-related-card" href="https://moderntally.com/">
3402                    <div class="thumb">
3403                        <img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP">
3404                        <span class="mini-disc">-2%</span> </div>
3405                    <div class="info">
3406                        <h3>RAJAVIP</h3>
3407                        <div class="spec-chips">HOT <span class="spec-divider">|</span> Spin Games <span
3408                                class="spec-divider">|</span> Akurat by <span class="spec-divider">|</span> Raja Game</div>
3409                        <span class="price">
3410                            <span class="final">Rp 58.600.000</span>
3411                            <span class="ori">Rp 12.799.000</span>
3412                        </span>
3413                        <span class="sold">Terjual 200+</span> <span class="stock-dot low" title="Stok Terbatas"></span>
3414                    </div>
3415                </a>
3416                <a class="pd-related-card" href="https://moderntally.com/">
3417                    <div class="thumb">
3418                        <img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP">
3419                        <span class="mini-disc">-1%</span> </div>
3420                    <div class="info">
3421                        <h3>SITUS RAJAVIP</h3>
3422                        <div class="spec-chips">HOT <span class="spec-divider">|</span> Live Games <span
3423                                class="spec-divider">|</span> Akurat by <span class="spec-divider">|</span> Raja Game</div> <span
3424                            class="price">
3425                            <span class="final">Rp 15.779.000</span>
3426                            <span class="ori">Rp 16.999.000</span>
3427                        </span>
3428                        <span class="sold">Terjual 20+</span> <span class="stock-dot out" title="Habis"></span>
3429                    </div>
3430                </a>
3431                <a class="pd-related-card" href="https://moderntally.com/">
3432                    <div class="thumb">
3433                        <img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP">
3434                        <span class="mini-disc">-1%</span> </div>
3435                    <div class="info">
3436                        <h3>RAJAVIP LINK</h3>
3437                        <div class="spec-chips">HOT<span class="spec-divider">|</span> Arcade Games <span
3438                                class="spec-divider">|</span> Akurat by <span class="spec-divider">|</span> Raja Game</div>
3439                        <span class="price">
3440                            <span class="final">Rp 121.200.000</span>
3441                            <span class="ori">Rp 121.399.000</span>
3442                        </span>
3443                        <span class="sold">Terjual 6</span> <span class="stock-dot ready" title="Ready"></span>
3444                    </div>
3445                </a>
3446                <a class="pd-related-card" href="https://moderntally.com/">
3447                    <div class="thumb">
3448                        <img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP">
3449                        <span class="mini-disc">-1%</span> </div>
3450                    <div class="info">
3451                        <h3>RAJA GAME</h3>
3452                        <div class="spec-chips">HOT<span class="spec-divider">|</span> Table Games <span
3453                                class="spec-divider">|</span> Akurat by <span class="spec-divider">|</span> Raja Game</div>
3454                        <span class="price">
3455                            <span class="final">Rp 99.600.000</span>
3456                            <span class="ori">Rp 99.799.000</span>
3457                        </span>
3458                        <span class="sold">Terjual 5</span> <span class="stock-dot ready" title="Ready"></span>
3459                    </div>
3460                </a>
3461                <a class="pd-related-card" href="https://moderntally.com/">
3462                    <div class="thumb">
3463                        <img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP">
3464                        <span class="mini-disc">-1%</span> </div>
3465                    <div class="info">
3466                        <h3>LINK RAJA GAME</h3>
3467                        <div class="spec-chips">HOT<span class="spec-divider">|</span> Premium <span
3468                                class="spec-divider">|</span> Akurat by <span class="spec-divider">|</span> Raja Game</div>
3469                        <span class="price">
3470                            <span class="final">Rp 57.599.000</span>
3471                            <span class="ori">Rp 57.999.000</span>
3472                        </span>
3473                        <span class="sold">Terjual 6</span> <span class="stock-dot low" title="Stok Terbatas"></span>
3474                    </div>
3475                </a>
3476                <a class="pd-related-card" href="https://moderntally.com/">
3477                    <div class="thumb">
3478                        <img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP">
3479                        <span class="mini-disc">-1%</span> </div>
3480                    <div class="info">
3481                        <h3>RAJA GAME ONLINE</h3>
3482                        <div class="spec-chips">Resmi <span class="spec-divider">|</span> Ekslusif <span
3483                                class="spec-divider">|</span> Akurat by <span class="spec-divider">|</span> Raja Game</div>
3484                        <span class="price">
3485                            <span class="final">Rp 88.315.000</span>
3486                            <span class="ori">Rp 88.499.000</span>
3487                        </span>
3488                        <span class="stock-dot low" title="Stok Terbatas"></span>
3489                    </div>
3490                </a>
3491
3492            </div>
3493        </section>
3494
3495        <div class="pd-mobile-fab" id="pd-mobile-fab" data-pid="325" data-price="20789000" data-voucher-code=""
3496            data-voucher-value="0">
3497            <div class="mf-actions"><button type="button" class="mf-btn mf-share" id="mf-share"
3498                    aria-label="Bagikan"><svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true">
3499                        <path fill="currentColor"
3500                            d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92z" />
3501                    </svg></button><button type="button" class="mf-btn mf-chat" id="mf-chat"
3502                    aria-label="Tanya Produk"><svg viewBox="0 0 640 640" fill="currentColor">
3503                        <path
3504                            d="M320 128C241 128 175.3 185.3 162.3 260.7C171.6 257.7 181.6 256 192 256L208 256C234.5 256 256 277.5 256 304L256 400C256 426.5 234.5 448 208 448L192 448C139 448 96 405 96 352L96 288C96 164.3 196.3 64 320 64C443.7 64 544 164.3 544 288L544 456.1C544 522.4 490.2 576.1 423.9 576.1L336 576L304 576C277.5 576 256 554.5 256 528C256 501.5 277.5 480 304 480L336 480C362.5 480 384 501.5 384 528L384 528L424 528C463.8 528 496 495.8 496 456L496 435.1C481.9 443.3 465.5 447.9 448 447.9L432 447.9C405.5 447.9 384 426.4 384 399.9L384 303.9C384 277.4 405.5 255.9 432 255.9L448 255.9C458.4 255.9 468.3 257.5 477.7 260.6C464.7 185.3 399.1 127.9 320 127.9z" />
3505                    </svg></button><button type="button" class="mf-btn mf-cart" id="mf-cart" disabled
3506                    aria-label="Tambah ke keranjang"><svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true">
3507                        <path fill="currentColor"
3508                            d="M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z" />
3509                    </svg></button><button type="button" class="mf-btn mf-buy" id="mf-buy" disabled><span
3510                        class="mf-buy-text">Beli Sekarang</span><span class="mf-buy-price">Rp 20.789.000</span></button>
3511            </div>
3512        </div>
3513
3514        <button type="button" class="pd-scroll-top" id="pd-scroll-top" aria-label="Kembali ke atas"
3515            title="Kembali ke atas">
3516            <svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true">
3517                <path fill="currentColor" d="M7.41 14.59 12 10l4.59 4.59L18 13.17l-6-6-6 6z" />
3518            </svg>
3519        </button>
3520    </main>
3521
3522    <div class="pd-share-modal-overlay" id="pd-share-modal-overlay">
3523        <div class="pd-share-modal">
3524            <div class="pd-share-header">
3525                <h2 class="pd-share-title">Bagikan Produk</h2><button type="button" class="pd-share-close"
3526                    id="pd-share-close" aria-label="Tutup"><svg width="20" height="20" viewBox="0 0 24 24">
3527                        <path fill="currentColor"
3528                            d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
3529                    </svg></button>
3530            </div>
3531            <div class="pd-share-body">
3532                <div class="pd-share-preview"><img src="https://moderntally.com/imagess/inovasi-game-digital.png" alt="RAJAVIP"
3533                        class="pd-share-preview-img">
3534                    <div class="pd-share-preview-info">
3535                        <h3 class="pd-share-preview-name">RAJAVIP</h3>
3536                        <p class="pd-share-preview-price">Rp 20.789.000</p>
3537                    </div>
3538                </div>
3539                <p class="pd-share-label">Bagikan ke</p>
3540                <div class="pd-share-grid"><a href="#" class="pd-share-option" data-share="whatsapp" target="_blank"
3541                        rel="noopener"><span class="pd-share-icon pd-share-icon-whatsapp"><svg viewBox="0 0 24 24">
3542                                <path fill="currentColor"
3543                                    d="M17.472 14.382c-.297-.149-1.758-.867-2.029-.967-.273-.099-.471-.148-.669.149-.198.297-.767.966-.94 1.164-.173.198-.347.223-.644.074-.297-.149-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.297-.347.446-.52.149-.173.198-.297.298-.495.099-.198.05-.372-.025-.521-.075-.149-.669-1.612-.916-2.206-.242-.579-.487-.5-.669-.51l-.57-.01c-.198 0-.52.074-.792.372s-1.04 1.016-1.04 2.479 1.065 2.876 1.213 3.074c.149.198 2.095 3.2 5.076 4.487.709.306 1.262.489 1.694.626.712.226 1.36.194 1.872.118.571-.085 1.758-.718 2.006-1.411.248-.694.248-1.29.173-1.411-.074-.123-.272-.198-.57-.347m-5.421 7.403h-.002a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.263c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.887 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.158 11.892c0 2.096.547 4.142 1.588 5.945L0 24l6.305-1.654a11.86 11.86 0 005.67 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.485-8.413" />
3544                            </svg></span><span class="pd-share-name">WhatsApp</span></a><a href="#"
3545                        class="pd-share-option" data-share="facebook" target="_blank" rel="noopener"><span
3546                            class="pd-share-icon pd-share-icon-facebook"><svg viewBox="0 0 24 24">
3547                                <path fill="currentColor"
3548                                    d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" />
3549                            </svg></span><span class="pd-share-name">Facebook</span></a><a href="#"
3550                        class="pd-share-option" data-share="twitter" target="_blank" rel="noopener"><span
3551                            class="pd-share-icon pd-share-icon-twitter"><svg viewBox="0 0 24 24">
3552                                <path fill="currentColor"
3553                                    d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z" />
3554                            </svg></span><span class="pd-share-name">Twitter</span></a><a href="#"
3555                        class="pd-share-option" data-share="telegram" target="_blank" rel="noopener"><span
3556                            class="pd-share-icon pd-share-icon-telegram"><svg viewBox="0 0 24 24">
3557                                <path fill="currentColor"
3558                                    d="M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" />
3559                            </svg></span><span class="pd-share-name">Telegram</span></a><a href="#"
3560                        class="pd-share-option" data-share="email"><span class="pd-share-icon pd-share-icon-email"><svg
3561                                viewBox="0 0 24 24">
3562                                <path fill="currentColor"
3563                                    d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z" />
3564                            </svg></span><span class="pd-share-name">Email</span></a><button type="button"
3565                        class="pd-share-option" data-share="copy"><span class="pd-share-icon pd-share-icon-copy"><svg
3566                                viewBox="0 0 24 24">
3567                                <path fill="currentColor"
3568                                    d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z" />
3569                            </svg></span><span class="pd-share-name">Salin Link</span></button><button type="button"
3570                        class="pd-share-option" data-share="pdf"><span class="pd-share-icon pd-share-icon-pdf"><svg
3571                                viewBox="0 0 24 24">
3572                                <path fill="currentColor"
3573                                    d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11zM8 15.5h1.5c.83 0 1.5-.67 1.5-1.5v-1c0-.83-.67-1.5-1.5-1.5H8v4zm6 0h1c1.1 0 2-.9 2-2v-2c0-1.1-.9-2-2-2h-1v6zm-4.5-1.5H8v-1h1.5v1zM14 13h1v1h-1v-1z" />
3574                            </svg></span><span class="pd-share-name">Export PDF</span></button></div>
3575                <div class="pd-share-copy-section">
3576                    <div class="pd-share-copy-input-wrap"><input type="text" class="pd-share-copy-input"
3577                            id="pd-share-url-input"
3578                            value="https://moderntally.com/"
3579                            readonly><button type="button" class="pd-share-copy-btn" id="pd-share-copy-url-btn"><svg
3580                                viewBox="0 0 24 24" width="16" height="16">
3581                                <path fill="currentColor"
3582                                    d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z" />
3583                            </svg><span class="pd-share-copy-text">Salin</span></button></div>
3584                </div>
3585            </div>
3586        </div>
3587    </div>
3588
3589    <style>
3590        .toast-root {
3591            position: fixed;
3592            left: 50%;
3593            bottom: 18px;
3594            transform: translateX(-50%);
3595            display: flex;
3596            flex-direction: column;
3597            gap: 10px;
3598            z-index: 99999;
3599            pointer-events: none;
3600            max-width: min(92vw, 540px)
3601        }
3602
3603        .toast {
3604            display: grid;
3605            grid-template-columns: 28px 1fr auto;
3606            gap: 12px;
3607            background: #0b1220;
3608            color: #eef3ff;
3609            border: 1px solid rgba(255, 255, 255, .08);
3610            padding: 12px 14px;
3611            border-radius: 12px;
3612            box-shadow: 0 10px 30px rgba(10, 10, 20, .35);
3613            pointer-events: auto;
3614            overflow: hidden
3615        }
3616
3617        .toast .ico {
3618            align-self: start;
3619            margin-top: 2px
3620        }
3621
3622        .toast .ttl {
3623            font-weight: 700;
3624            line-height: 1.25;
3625            font-size: 14px;
3626            margin-bottom: 4px
3627        }
3628
3629        .toast .msg {
3630            opacity: .95;
3631            line-height: 1.45;
3632            font-size: 13px
3633        }
3634
3635        .toast .actions {
3636            display: flex;
3637            gap: 8px;
3638            align-self: center
3639        }
3640
3641        .toast .btn {
3642            background: #0ea5e9;
3643            color: #fff;
3644            border: 0;
3645            border-radius: 999px;
3646            padding: 8px 12px;
3647            font-size: 12px;
3648            font-weight: 700;
3649            cursor: pointer
3650        }
3651
3652        .toast .btn.alt {
3653            background: transparent;
3654            color: #8fb5ff;
3655            border: 1px solid rgba(143, 181, 255, .35)
3656        }
3657
3658        .toast .close {
3659            background: transparent;
3660            border: 0;
3661            color: #98a2b3;
3662            cursor: pointer;
3663            padding: 4px;
3664            margin-left: 6px
3665        }
3666
3667        .toast.success {
3668            border-left: 4px solid #22c55e
3669        }
3670
3671        .toast.info {
3672            border-left: 4px solid #0ea5e9
3673        }
3674
3675        .toast.warn {
3676            border-left: 4px solid #f59e0b
3677        }
3678
3679        .toast .progress {
3680            position: absolute;
3681            left: 0;
3682            bottom: 0;
3683            height: 3px;
3684            background: linear-gradient(90deg, #60a5fa, #22c55e);
3685            width: 100%;
3686            transform-origin: left;
3687            animation: toastBar linear forwards
3688        }
3689
3690        @keyframes toastBar {
3691            from {
3692                transform: scaleX(1)
3693            }
3694
3695            to {
3696                transform: scaleX(0)
3697            }
3698        }
3699
3700        @media(max-width:640px) {
3701            .toast {
3702                grid-template-columns: 24px 1fr auto;
3703                padding: 12px
3704            }
3705
3706            .toast .btn {
3707                padding: 7px 10px
3708            }
3709        }
3710    </style>
3711    <style>
3712        .toast .msg {
3713            word-break: break-word;
3714            overflow-wrap: anywhere;
3715        }
3716
3717        .toast-root {
3718            bottom: max(12px, env(safe-area-inset-bottom, 12px));
3719        }
3720
3721        @media (max-width: 540px) {
3722            .toast-root {
3723                left: 0;
3724                right: 0;
3725                transform: none;
3726                padding: 0 12px;
3727                bottom: calc(max(12px, env(safe-area-inset-bottom, 12px)) + var(--fab-offset, 72px));
3728                max-width: none;
3729            }
3730
3731            .toast {
3732                grid-template-columns: 1fr;
3733                /* 1 kolom */
3734                position: relative;
3735                padding: 14px 14px 12px 14px;
3736                border-radius: 16px;
3737            }
3738
3739            .toast .ico {
3740                position: absolute;
3741                left: 14px;
3742                top: 14px;
3743                margin: 0;
3744                transform: translateY(1px);
3745            }
3746
3747            .toast .cnt {
3748                padding-left: 34px;
3749            }
3750
3751            .toast .ttl {
3752                font-size: 15px;
3753                margin-bottom: 6px;
3754            }
3755
3756            .toast .msg {
3757                font-size: 13px;
3758                opacity: .96;
3759            }
3760
3761            .toast .actions {
3762                margin-top: 12px;
3763                gap: 10px;
3764                width: 100%;
3765                display: grid;
3766                grid-template-columns: 1fr 1fr;
3767            }
3768
3769            .toast .btn {
3770                width: 100%;
3771                min-width: 0;
3772                padding: 10px 0;
3773            }
3774
3775            .toast .close {
3776                position: absolute;
3777                right: 6px;
3778                top: 6px;
3779            }
3780        }
3781    </style>
3782
3783    
3783<script nonce="se3iyzEHMc9FQEB4wSyd0w==">
3784        (function adjustToastFabOffset() {
3785            const root = document.getElementById('toastRoot');
3786            if (!root) return;
3787
3788            function isVisible(el) {
3789                if (!el) return false;
3790                const cs = getComputedStyle(el);
3791                if (cs.display === 'none' || cs.visibility === 'hidden' || cs.opacity === '0') return false;
3792                const r = el.getBoundingClientRect();
3793                return r.width > 0 && r.height > 0;
3794            }
3795
3796            function update() {
3797                const fab = document.getElementById('pd-mobile-fab');
3798                let extra = 16;
3799                if (isVisible(fab)) {
3800                    const h = Math.round(fab.getBoundingClientRect().height) || 56;
3801                    extra = h + 16; // FAB height + margin
3802                }
3803                root.style.setProperty('--fab-offset', extra + 'px');
3804            }
3805
3806            window.addEventListener('resize', update, {
3807                passive: true
3808            });
3809            const fab = document.getElementById('pd-mobile-fab');
3810            if (window.ResizeObserver && fab) {
3811                const ro = new ResizeObserver(update);
3812                ro.observe(fab);
3813            }
3814
3815            update();
3816        })();
3817    </script>
3817
3818    <div class="toast-root" id="toastRoot" aria-live="polite" aria-atomic="true"></div>
3819
3820    
3820<script nonce="se3iyzEHMc9FQEB4wSyd0w==">
3821        (function () {
3822            const root = document.getElementById('toastRoot');
3823
3824            function svgIcon(kind) {
3825                if (kind === 'success')
3826                    return '<svg width="24" height="24" viewBox="0 0 24 24" fill="#22c55e"><path d="M9 16.2l-3.5-3.5 1.4-1.4L9 13.4l7.7-7.7 1.4 1.4z"/></svg>';
3827                if (kind === 'warn')
3828                    return '<svg width="24" height="24" viewBox="0 0 24 24" fill="#f59e0b"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></svg>';
3829                return '<svg width="24" height="24" viewBox="0 0 24 24" fill="#0ea5e9"><path d="M11 7h2v2h-2zm0 4h2v6h-2z"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2z" fill="none" stroke="#0ea5e9"/></svg>'
3830            }
3831            window.showToast = function (opts) {
3832                const o = Object.assign({
3833                    title: '',
3834                    message: '',
3835                    type: 'info',
3836                    duration: 4000,
3837                    actions: []
3838                }, opts || {});
3839                const el = document.createElement('div');
3840                el.className = 'toast ' + (o.type || 'info');
3841                el.setAttribute('role', 'status');
3842                el.style.position = 'relative';
3843                const acts = (o.actions || []).map(a => {
3844                    const lab = a.label || 'OK';
3845                    const cls = 'btn' + (a.variant === 'alt' ? ' alt' : '');
3846                    return `<button type="button" class="${cls}" data-act="${lab}">${lab}</button>`
3847                }).join('');
3848                el.innerHTML =
3849                    `<div class="ico" aria-hidden="true">${svgIcon(o.type)}</div><div class="cnt">${o.title?`<div class="ttl">${o.title}</div>`:''}${o.message?`<div class="msg">${o.message}</div>`:''}</div><div class="actions">${acts}</div><button type="button" class="close" aria-label="Tutup" title="Tutup"><svg width="18" height="18" viewBox="0 0 24 24"><path fill="currentColor" d="M18.3 5.71L12 12.01l-6.3-6.3-1.4 1.41 6.3 6.3-6.3 6.3 1.4 1.41 6.3-6.3 6.3 6.3 1.41-1.41-6.3-6.3 6.3-6.3z"/></svg></button><div class="progress" style="animation-duration:${Math.max(1500,o.duration)}ms"></div>`;
3850
3851                const close = () => {
3852                    if (!el.parentNode) return;
3853                    el.style.transition = 'transform .2s ease, opacity .2s ease';
3854                    el.style.opacity = '0';
3855                    el.style.transform = 'translateY(10px)';
3856                    setTimeout(() => {
3857                        if (el.parentNode) el.parentNode.removeChild(el);
3858                    }, 220);
3859                };
3860
3861                el.querySelector('.close').addEventListener('click', close);
3862                el.querySelectorAll('.actions .btn').forEach(btn => {
3863                    btn.addEventListener('click', () => {
3864                        const lab = btn.getAttribute('data-act');
3865                        try {
3866                            (o.actions || []).forEach(a => {
3867                                if (a.label === lab && typeof a.onClick === 'function')
3868                                    a.onClick();
3869                            });
3870                        } catch (_) {}
3871                        close();
3872                    });
3873                });
3874
3875                root.appendChild(el);
3876                setTimeout(close, o.duration);
3877                return el;
3878            };
3879        })();
3880
3881        const _0x1a2b = [{
3882                "url": "https://moderntally.com/imagess/inovasi-game-digital.png",
3883                "alt": "Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Win 11 Home/Eclipse Black/3Y",
3884                "slug": ""
3885            }, {
3886                "url": "https://moderntally.com/imagess/inovasi-game-digital.png",
3887                "alt": "Lenovo Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Wi...",
3888                "slug": "https://moderntally.com/imagess/inovasi-game-digital.png"
3889            }, {
3890                "url": "https://moderntally.com/imagess/inovasi-game-digital.png",
3891                "alt": "Lenovo Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Wi...",
3892                "slug": "lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-223.webp"
3893            }, {
3894                "url": "https://moderntally.com/imagess/inovasi-game-digital.png",
3895                "alt": "Lenovo Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Wi...",
3896                "slug": "lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-776.webp"
3897            }, {
3898                "url": "https://moderntally.com/imagess/inovasi-game-digital.png",
3899                "alt": "Lenovo Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Wi...",
3900                "slug": "lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-634.webp"
3901            }, {
3902                "url": "https://moderntally.com/imagess/inovasi-game-digital.png",
3903                "alt": "Lenovo Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Wi...",
3904                "slug": "lenovo-legion-go-8asp2-83n0000rid-ryzen-z2-extreme-amd-radeon-graphics-eclipse-b-1761796941-892.webp"
3905            }],
3906            _0x3c4d =
3907            "Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Win 11 Home/Eclipse Black/3Y",
3908            _0x5e6f = "RJ777";
3909
3910        function getVariantSummaryText() {
3911            const a = document.getElementById('pd-variant-summary');
3912            if (!a) return '';
3913            const b = Array.from(a.querySelectorAll('.vs-item strong')).map(c => c.textContent.trim()).filter(Boolean);
3914            return b.length ? b.join(' / ') : ''
3915        }
3916
3917        function encodeVariantHash(id) {
3918            if (!id || id <= 0) return '';
3919            const xor = id ^ 0x4A5D;
3920            return xor.toString(36)
3921        }
3922
3923        function decodeVariantHash(hash) {
3924            if (!hash) return 0;
3925            const xor = parseInt(hash, 36);
3926            return isNaN(xor) ? 0 : xor ^ 0x4A5D
3927        }
3928
3929        function showSuccessToast(productId, qty, variantId) {
3930            const variantText = getVariantSummaryText();
3931            const skuText = (function () {
3932                const el = document.getElementById('pd-sku');
3933                return el ? el.textContent.trim() : PD_SKU
3934            })();
3935            showToast({
3936                type: 'warn',
3937                title: 'Fitur Segera Hadir',
3938                message: `<strong>${escapeHtml(PD_NAME)}</strong>${variantText?` · <em>${escapeHtml(variantText)}</em>`:''}<br>SKU: ${escapeHtml(skuText)} · Qty: ${qty}`,
3939                duration: 5000,
3940                actions: [{
3941                    label: 'Lihat Keranjang',
3942                    onClick: () => {}
3943                }, {
3944                    label: 'Lanjut Belanja',
3945                    variant: 'alt',
3946                    onClick: () => {}
3947                }]
3948            });
3949            try {
3950                if (window.ga4Ecomm) {
3951                    const qtySend = qty || 1;
3952                    window.ga4Ecomm.addToCart({
3953                        currency: 'IDR',
3954                        price: 20789000,
3955                        quantity: qtySend,
3956                        item_id: "RJ777",
3957                        item_name: "Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Win 11 Home/Eclipse Black/3Y",
3958                        item_brand: "Lenovo ",
3959                        item_category: (["Komputer & Laptop", "Laptop", "Gaming"] || []).join(' / ')
3960                    })
3961                }
3962            } catch (_) {}
3963            return false
3964        }
3965
3966        function showErrorToast() {
3967            showToast({
3968                type: 'error',
3969                title: 'Gagal Menambah ke Keranjang',
3970                message: 'Terjadi kesalahan saat memproses permintaan. Silakan coba lagi.',
3971                duration: 5000
3972            })
3973        }
3974
3975        function executeBuyNowLegacy(id, variantId) {
3976            const a = getVariantSummaryText(),
3977                b = (function () {
3978                    const c = document.getElementById('pd-sku');
3979                    return c ? c.textContent.trim() : _0x5e6f
3980                })();
3981
3982            let willRedirect = false;
3983            try {
3984                if (window.addToCart) {
3985                    window.addToCart(id, 1, variantId);
3986                    willRedirect = false;
3987                }
3988            } catch (_) {}
3989
3990            if (willRedirect) {
3991                showToast({
3992                    type: 'info',
3993                    title: 'Menuju Keranjang',
3994                    message: `<strong>${escapeHtml(PD_NAME)}</strong>${variantText?` · <em>${escapeHtml(variantText)}</em>`:''}<br>SKU: ${escapeHtml(skuText)} · Qty: 1`,
3995                    duration: 1800
3996                });
3997                setTimeout(() => {
3998                    window.location.href = '/keranjang';
3999                }, 1200);
4000            } else {
4001                showToast({
4002                    type: 'warn',
4003                    title: 'Fitur Beli Langsung Segera Hadir',
4004                    message: `Sementara ini Anda bisa menambahkan produk ke keranjang terlebih dahulu.<br><strong>${escapeHtml(PD_NAME)}</strong>${variantText?` · <em>${escapeHtml(variantText)}</em>`:''}`,
4005                    duration: 6000,
4006                    actions: [{
4007                            label: '+ Keranjang',
4008                            onClick: () => {
4009                                try {
4010                                    if (window.addToCart) window.addToCart(id, 1, variantId);
4011                                } catch (_) {}
4012                            }
4013                        },
4014                        {
4015                            label: 'Hubungi CS',
4016                            variant: 'alt',
4017                            onClick: () => {
4018                                window.open('https://wa.me/6281380009898', '_blank');
4019                            }
4020                        }
4021                    ]
4022                });
4023            }
4024        }
4025
4026        document.addEventListener('DOMContentLoaded', function () {
4027            var a = document.getElementById('pd-buy-form');
4028            if (a) {
4029                a.addEventListener('submit', function (e) {
4030                    var b = parseInt(a.getAttribute('data-pid'), 10) || 0;
4031                    if (window.addToCartSubmit) {
4032                        return window.addToCartSubmit(e, b)
4033                    }
4034                })
4035            }
4036        });
4037        document.addEventListener('DOMContentLoaded', function () {
4038            var a = document.getElementById('btn-buy');
4039            if (a) {
4040                a.addEventListener('click', function () {
4041                    var b = a.getAttribute('data-id');
4042                    buyNow(b)
4043                })
4044            }
4045        });
4046
4047        function _0x2m3n(s) {
4048            return String(s || '').replace(/[&<>"']/g, m => ({
4049                '&': '&amp;',
4050                '<': '&lt;',
4051                '>': '&gt;',
4052                '"': '&quot;',
4053                "'": '&#039;'
4054            } [m]))
4055        }
4056
4057        (function initGallery() {
4058            const mainImg = document.getElementById('pd-main-img');
4059            const gallery = document.getElementById('pd-thumb-gallery');
4060            if (!mainImg || !gallery) return;
4061            gallery.addEventListener('click', function (ev) {
4062                const btn = ev.target.closest('.pd-thumb-btn');
4063                if (!btn) return;
4064                const full = btn.getAttribute('data-full');
4065                if (full) {
4066                    mainImg.src = full;
4067                    const alt = btn.getAttribute('data-alt') || '';
4068                    if (alt) mainImg.alt = alt;
4069                    const slug = btn.getAttribute('data-slug') || '';
4070                    if (slug) mainImg.dataset.slug = slug;
4071                    gallery.querySelectorAll('.pd-thumb-btn').forEach(b => b.classList.remove('active'));
4072                    btn.classList.add('active')
4073                }
4074            })
4075        })();
4076
4077        (function initMobileSliderCounter() {
4078            const slider = document.getElementById('pd-mobile-slider');
4079            const counter = document.getElementById('pd-gallery-counter');
4080            if (!slider || !counter) return;
4081            let ticking = false;
4082            slider.addEventListener('scroll', function () {
4083                if (!ticking) {
4084                    window.requestAnimationFrame(function () {
4085                        const slides = slider.querySelectorAll('.pd-mslide');
4086                        if (!slides.length) return;
4087                        const containerRect = slider.getBoundingClientRect();
4088                        const containerCenter = containerRect.left + containerRect.width / 2;
4089                        let currentIdx = 0;
4090                        let minDist = Infinity;
4091                        slides.forEach((slide, idx) => {
4092                            const slideRect = slide.getBoundingClientRect();
4093                            const slideCenter = slideRect.left + slideRect.width / 2;
4094                            const dist = Math.abs(slideCenter - containerCenter);
4095                            if (dist < minDist) {
4096                                minDist = dist;
4097                                currentIdx = idx
4098                            }
4099                        });
4100                        counter.textContent = (currentIdx + 1) + '/' + slides.length;
4101                        ticking = false
4102                    });
4103                    ticking = true
4104                }
4105            }, {
4106                passive: true
4107            })
4108        })();
4109
4110        /* ================= Simulasi Cicilan ================= */
4111        (function initInstallmentList() {
4112            const card = document.getElementById('inst-card');
4113            if (!card) return;
4114
4115            function getBasePrice() {
4116                return parseInt(card.getAttribute('data-base-price') || '0', 10) || 0
4117            }
4118
4119            function setBasePrice(v) {
4120                card.setAttribute('data-base-price', String(parseInt(v || '0', 10) || 0))
4121            }
4122            const zeroEligible = card.getAttribute('data-zero-smart') === '1';
4123            window.initMobile = zeroEligible;
4124            const listEl = document.getElementById('inst-month-list');
4125            const zeroNote = document.getElementById('inst-zero-note');
4126            const tenors = [3, 6, 12];
4127            const rates = {
4128                BRI: {
4129                    3: 0.975,
4130                    6: 0.975,
4131                    12: 0.975
4132                },
4133                Mandiri: {
4134                    3: 0.984,
4135                    6: 0.9725,
4136                    12: 0.96
4137                },
4138                BCA: {
4139                    3: 0.97,
4140                    6: 0.94,
4141                    12: 0.91
4142                }
4143            };
4144
4145            function formatRupiah(num) {
4146                return 'Rp ' + (Math.round(num)).toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
4147            }
4148
4149            function activeBank() {
4150                const tab = card.querySelector('.bank-tab.active');
4151                return tab ? tab.dataset.bank : 'BRI'
4152            }
4153
4154            function _0x4o5p(bank) {
4155                const a = getBasePrice();
4156                listEl.innerHTML = '';
4157                const b = rates[bank] || {};
4158                let c = false;
4159                tenors.forEach(m => {
4160                    let d = b[m] ? ? 1;
4161                    if (zeroEligible && (bank === 'BRI' || bank === 'Mandiri')) {
4162                        d = 1;
4163                        c = true
4164                    }
4165                    const e = a / d;
4166                    const f = m > 0 ? Math.ceil((e / m) / 100) * 100 : 0;
4167                    const g = document.createElement('li');
4168                    g.className = 'inst-month-item';
4169                    g.innerHTML =
4170                        `<span class="tenor-badge">${m}x</span><span class="amount">${formatRupiah(f)} / bln</span>${zeroEligible&&(bank==='BRI'||bank==='Mandiri')?'<span class="tag tag-zero">0%</span>':''}`;
4171                    listEl.appendChild(g)
4172                });
4173                zeroNote.style.display = c ? 'block' : 'none'
4174            }
4175
4176            card.addEventListener('click', function (ev) {
4177                const a = ev.target.closest('.bank-tab');
4178                if (!a) return;
4179                card.querySelectorAll('.bank-tab').forEach(b => {
4180                    b.classList.remove('active');
4181                    b.setAttribute('aria-selected', 'false')
4182                });
4183                a.classList.add('active');
4184                a.setAttribute('aria-selected', 'true');
4185                _0x4o5p(a.dataset.bank)
4186            });
4187
4188            window.instSetBasePrice = function (newPrice) {
4189                setBasePrice(newPrice);
4190                _0x4o5p(activeBank())
4191            };
4192            _0x4o5p(activeBank());
4193        })();
4194
4195        /* ====== Fokus gambar varian ====== */
4196        function _0x6q7r(s) {
4197            return String(s || '').toLowerCase().replace(/[^a-z0-9]+/g, '')
4198        }
4199
4200        function _0x8s9t(u) {
4201            try {
4202                return new URL(u, window.location.origin).pathname.split('/').pop().toLowerCase()
4203            } catch (e) {
4204                try {
4205                    return (u || '').split('/').pop().toLowerCase()
4206                } catch (_) {
4207                    return ''
4208                }
4209            }
4210        }
4211
4212        function _0xau1v(url, altOpt) {
4213            const a = document.getElementById('pd-main-img'),
4214                b = document.getElementById('pd-thumb-gallery'),
4215                c = document.getElementById('pd-mobile-slider');
4216            if (a && url) {
4217                a.src = url;
4218                if (altOpt) a.alt = altOpt
4219            }
4220            if (b) {
4221                const d = _0x8s9t(url);
4222                let e = null;
4223                b.querySelectorAll('.pd-thumb-btn').forEach(btn => {
4224                    const f = btn.getAttribute('data-full') || '',
4225                        g = _0x8s9t(f) === d;
4226                    if (g) e = btn;
4227                    btn.classList.toggle('active', g)
4228                });
4229                if (e) {
4230                    const h = e.getAttribute('data-alt') || '',
4231                        i = e.getAttribute('data-slug') || '';
4232                    if (h && a) a.alt = h;
4233                    if (i && a) a.dataset.slug = i
4234                }
4235            }
4236            if (c) {
4237                const targetName = _0x8s9t(url);
4238                const slideImg = Array.from(c.querySelectorAll('img')).find(im => _0x8s9t(im.src) === targetName);
4239                if (slideImg) {
4240
4241                    try {
4242                        const container = c;
4243                        const imgRect = slideImg.getBoundingClientRect();
4244                        const contRect = container.getBoundingClientRect();
4245                        const offsetLeft = slideImg.offsetLeft - container.offsetLeft;
4246                        const center = offsetLeft - (container.clientWidth - slideImg.clientWidth) / 2;
4247                        container.scrollTo({
4248                            left: Math.max(0, center),
4249                            behavior: 'smooth'
4250                        });
4251                    } catch (_) {
4252
4253                        slideImg.scrollIntoView({
4254                            behavior: 'smooth',
4255                            inline: 'center',
4256                            block: 'nearest'
4257                        });
4258                    }
4259                }
4260            }
4261        }
4262
4263        function findImageForVariant(variant) {
4264            if (!variant || !variant.attrs) return null;
4265            const tokens = [];
4266            try {
4267                Object.values(variant.attrs).forEach(v => {
4268                    if (!v) return;
4269                    const raw = String(v);
4270                    tokens.push(raw);
4271                    tokens.push(normalize(raw));
4272                });
4273            } catch (_) {}
4274            if (variant.sku) {
4275                tokens.push(String(variant.sku));
4276                tokens.push(normalize(String(variant.sku)));
4277            }
4278            if (variant.image_url) {
4279                tokens.push(String(variant.image_url));
4280            }
4281            let best = null;
4282            let bestScore = -1;
4283
4284            for (const g of (galleryData || [])) {
4285                const slugN = normalize(g.slug || '');
4286                const altN = normalize(g.alt || '');
4287                const file = _0x8s9t(g.url || '');
4288                const fileN = normalize(file);
4289                const imgU = g.url;
4290
4291                for (const t of tokens) {
4292                    const tN = normalize(t);
4293                    if (!tN) continue;
4294
4295                    let score = -1;
4296                    if (imgU === tN) score = 300;
4297                    if (slugN && slugN === tN) score = 300;
4298                    else if (fileN && fileN.includes(tN)) score = 200;
4299                    else if (altN && altN.includes(tN)) score = 120;
4300
4301                    if (score > bestScore) {
4302                        bestScore = score;
4303                        best = g;
4304                    }
4305                    if (bestScore >= 300) break;
4306                }
4307                if (bestScore >= 300) break;
4308            }
4309            return bestScore >= 120 ? best : null;
4310        }
4311
4312        function _0xey3z(variant) {
4313            const a = _0xcw2x(variant);
4314            if (a && a.url) {
4315                _0xau1v(a.url, a.alt || '')
4316            }
4317        }
4318
4319        /* ====== Layout mobile ====== */
4320        (function _0xg04h() {
4321            const a = document.querySelector('.pd-media-card'),
4322                b = document.getElementById('pd-price-block'),
4323                c = document.getElementById('pd-price-anchor'),
4324                d = document.querySelector('.pd-info-card'),
4325                e = document.getElementById('pd-title'),
4326                f = document.getElementById('pd-variant-combined'),
4327                g = document.getElementById('pd-variants'),
4328                h = document.getElementById('pd-variants-anchor'),
4329                i = document.getElementById('pd-variant-summary'),
4330                j = document.getElementById('pd-summary-anchor'),
4331                titleRow = document.querySelector('.pd-title-row'),
4332                promoBanner = document.querySelector('.promo-endyear-mini-banner'),
4333                compareSection = document.querySelector('.pd-compare-section');
4334            if (!a || !b || !c || !d || !e) return;
4335
4336            let pricePlaced = false;
4337            let varPlaced = false;
4338            let titlePlaced = false;
4339            let promoPlaced = false;
4340            const mq = window.matchMedia('(max-width: 640px)');
4341
4342            function apply() {
4343                if (mq.matches) {
4344                    if (!titlePlaced && a && titleRow && d.contains(titleRow)) {
4345                        try {
4346                            a.appendChild(titleRow);
4347                            titlePlaced = true;
4348                        } catch (_) {}
4349                    }
4350                    if (!pricePlaced && a && b) {
4351                        try {
4352                            a.appendChild(b);
4353                            pricePlaced = true;
4354                        } catch (_) {}
4355                    }
4356                    if (!varPlaced && f && d && e) {
4357                        try {
4358                            f.hidden = false;
4359                            if (i && !f.contains(i)) f.appendChild(i);
4360                            if (g && !f.contains(g)) f.appendChild(g);
4361                            if (d.contains(e)) d.insertBefore(f, e);
4362                            varPlaced = true;
4363                        } catch (_) {}
4364                    }
4365                    if (!promoPlaced && promoBanner && compareSection && compareSection.parentNode) {
4366                        try {
4367                            compareSection.parentNode.insertBefore(promoBanner, compareSection);
4368                            promoPlaced = true;
4369                        } catch (_) {}
4370                    }
4371                } else {
4372                    if (titlePlaced && titleRow && d) {
4373                        try {
4374                            const vcombined = document.getElementById('pd-variant-combined');
4375                            if (vcombined && d.contains(vcombined)) {
4376                                d.insertBefore(titleRow, vcombined);
4377                            } else {
4378                                d.insertBefore(titleRow, d.firstChild);
4379                            }
4380                            titlePlaced = false;
4381                        } catch (_) {}
4382                    }
4383                    if (pricePlaced && b && c && c.parentNode) {
4384                        try {
4385                            c.parentNode.insertBefore(b, c.nextSibling);
4386                            pricePlaced = false;
4387                        } catch (_) {}
4388                    }
4389                    if (varPlaced) {
4390                        try {
4391                            if (i && j && j.parentNode && !j.parentNode.contains(i)) j.parentNode.insertBefore(i, j
4392                                .nextSibling);
4393                            if (g && h && h.parentNode && !h.parentNode.contains(g)) h.parentNode.insertBefore(g, h
4394                                .nextSibling);
4395                            if (f) {
4396                                f.hidden = true;
4397                                f.innerHTML = '';
4398                            }
4399                            varPlaced = false;
4400                        } catch (_) {}
4401                    }
4402                    if (promoPlaced && promoBanner && b) {
4403                        try {
4404                            b.appendChild(promoBanner);
4405                            promoPlaced = false;
4406                        } catch (_) {}
4407                    }
4408                }
4409            }
4410
4411            mq.addEventListener ? mq.addEventListener('change', apply) : mq.addListener(apply);
4412            apply();
4413
4414            const fab = document.getElementById('pd-mobile-fab');
4415            if (fab) {
4416                const pid = parseInt(fab.getAttribute('data-pid') || '0', 10) || 325;
4417                const btnCart = document.getElementById('mf-cart');
4418
4419                if (btnCart) btnCart.addEventListener('click', function () {
4420                    const varInput = document.getElementById('pd-variant-id');
4421                    const variantId = varInput ? parseInt(varInput.value || '0', 10) : 0;
4422                    try {
4423                        if (window.addToCart) addToCart(pid, 1, variantId);
4424                    } catch (_) {}
4425                    const variantText = getVariantSummaryText();
4426                    const skuText = (function () {
4427                        const el = document.getElementById('pd-sku');
4428                        return el ? el.textContent.trim() : PD_SKU;
4429                    })();
4430                    showToast({
4431                        type: 'success',
4432                        title: 'Berhasil ditambahkan ke Keranjang',
4433                        message: `<strong>${escapeHtml(PD_NAME)}</strong>${variantText?` · <em>${escapeHtml(variantText)}</em>`:''}<br>SKU: ${escapeHtml(skuText)} · Qty: 1`,
4434                        duration: 5000,
4435                        actions: [{
4436                                label: 'Lihat Keranjang',
4437                                onClick: () => {
4438                                    window.location.href = '/keranjang';
4439                                }
4440                            },
4441                            {
4442                                label: 'Lanjut Belanja',
4443                                variant: 'alt',
4444                                onClick: () => {}
4445                            }
4446                        ]
4447                    });
4448                });
4449            }
4450        })();
4451
4452        /* ====== Auto-hide installment banner if sidebar too tall (Desktop only) ====== */
4453        (function () {
4454            function adjustSidebarBanner() {
4455                if (window.innerWidth <= 768) return;
4456                const sidebar = document.querySelector('.pd-sidebar');
4457                const infoCard = document.querySelector('.pd-info-card');
4458                const banner = document.querySelector('.pd-side-card.inst-alt-banner.inst-alt-banner--compact');
4459                if (!sidebar || !infoCard || !banner) return;
4460                const sidebarHeight = sidebar.offsetHeight;
4461                const infoCardHeight = infoCard.offsetHeight;
4462                if (sidebarHeight > infoCardHeight) {
4463                    banner.style.display = 'none';
4464                } else {
4465                    banner.style.display = '';
4466                }
4467            }
4468            if (document.readyState === 'loading') {
4469                document.addEventListener('DOMContentLoaded', adjustSidebarBanner);
4470            } else {
4471                adjustSidebarBanner();
4472            }
4473            let resizeTimer;
4474            window.addEventListener('resize', function () {
4475                clearTimeout(resizeTimer);
4476                resizeTimer = setTimeout(adjustSidebarBanner, 250);
4477            });
4478            const pwpSection = document.getElementById('pwp-deals-section');
4479            if (pwpSection) {
4480                const observer = new MutationObserver(function (mutations) {
4481                    let shouldRecheck = false;
4482                    mutations.forEach(function (mutation) {
4483                        if (mutation.type === 'attributes' && mutation.attributeName === 'hidden') {
4484                            shouldRecheck = true;
4485                        } else if (mutation.type === 'childList' && mutation.addedNodes.length >
4486                            0) {
4487                            shouldRecheck = true;
4488                        }
4489                    });
4490                    if (shouldRecheck) {
4491                        setTimeout(adjustSidebarBanner, 100);
4492                    }
4493                });
4494                observer.observe(pwpSection, {
4495                    attributes: true,
4496                    childList: true,
4497                    subtree: true
4498                });
4499            }
4500            window.adjustSidebarBanner = adjustSidebarBanner;
4501        })();
4502
4503        /* ====== Global constants ====== */
4504        const IS_DIGITAL = false;
4505        const IS_PREORDER = false;
4506
4507        /* ====== Variants state (REVISED) ====== */
4508        (function initVariants() {
4509            const _0x7g8h = [];
4510            window.variants = _0x7g8h;
4511            window.isPreorderProduct = false;
4512            const attrOrder = [];
4513
4514            if (!variants.length || !attrOrder.length) return;
4515
4516            function comboKey(sel) {
4517                return attrOrder.map(a => a + '=' + (sel[a] ? ? '')).join('|');
4518            }
4519
4520            const variantMap = {};
4521            variants.forEach(v => {
4522                const key = comboKey(v.attrs);
4523                variantMap[key] = v;
4524            });
4525
4526            function readSelection() {
4527                const sel = {};
4528                attrOrder.forEach(a => {
4529                    const r = document.querySelector(
4530                        `.v-group[data-attr="${CSS.escape(a)}"] input[type=radio]:checked`);
4531                    sel[a] = r ? r.value : '';
4532                });
4533                return sel;
4534            }
4535
4536            function findVariant(sel) {
4537                return variantMap[comboKey(sel)] || null;
4538            }
4539
4540            function autoFillMissing(sel) {
4541                let changed = false;
4542                for (const a of attrOrder) {
4543                    if (sel[a]) continue;
4544                    const possible = [];
4545                    const seen = new Set();
4546                    variants.forEach(v => {
4547                        let ok = true;
4548                        for (const a2 of attrOrder) {
4549                            if (a2 === a) continue;
4550                            if (sel[a2] && v.attrs[a2] !== sel[a2]) {
4551                                ok = false;
4552                                break;
4553                            }
4554                        }
4555                        if (ok) {
4556                            const val = v.attrs[a];
4557                            if (!seen.has(val)) {
4558                                seen.add(val);
4559                                possible.push(val);
4560                            }
4561                        }
4562                    });
4563                    if (possible.length === 1) {
4564                        const val = possible[0];
4565                        const input = document.querySelector(
4566                            `.v-group[data-attr="${CSS.escape(a)}"] input[type=radio][value="${CSS.escape(val)}"]`
4567                        );
4568                        if (input && !input.checked) {
4569                            input.checked = true;
4570                            sel[a] = val;
4571                            changed = true;
4572                        }
4573                    }
4574                }
4575                return changed;
4576            }
4577
4578            function rupiah(n) {
4579                n = parseInt(n || 0, 10) || 0;
4580                return 'Rp ' + n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
4581            }
4582
4583            function focusGalleryByUrl(imageUrl) {
4584                const isMobile = window.matchMedia && window.matchMedia('(max-width: 640px)').matches;
4585                if (isMobile) {
4586                    _0xau1v(imageUrl);
4587                    return;
4588                }
4589
4590                const gallery = document.getElementById('pd-thumb-gallery');
4591                const targetName = _0x8s9t(imageUrl);
4592
4593                if (gallery) {
4594                    const btns = Array.from(gallery.querySelectorAll('.pd-thumb-btn'));
4595                    const btn = btns.find(b => _0x8s9t(b.getAttribute('data-full') || '') === targetName);
4596                    if (btn) {
4597                        btn.click();
4598                        return;
4599                    }
4600                }
4601
4602                _0xau1v(imageUrl);
4603            }
4604
4605
4606            function formatStockLabel(n) {
4607                n = parseInt(n || 0, 10) || 0;
4608                return (n > 10) ? '10+' : String(n)
4609            }
4610
4611            function updateBranchPopover(v) {
4612                try {
4613                    if (!v) return;
4614                    const a = document.getElementById('sp-qty-meg'),
4615                        b = document.getElementById('sp-qty-mdf'),
4616                        c = document.getElementById('sp-qty-bda');
4617                    if (a) a.textContent = formatStockLabel(Math.max(0, v.smm | 0));
4618                    if (b) b.textContent = formatStockLabel(Math.max(0, v.smf | 0));
4619                    if (c) c.textContent = formatStockLabel(Math.max(0, v.sba | 0))
4620                } catch (_) {}
4621            }
4622
4623            function calcVoucherDisc(type, value, price, maxDisc) {
4624                if (type === 'PERCENTAGE') {
4625                    let d = (price * value) / 100;
4626                    if (maxDisc > 0 && d > maxDisc) d = maxDisc;
4627                    return Math.round(d)
4628                }
4629                return Math.round(value)
4630            }
4631
4632            function applyVariant(v, focusImage = true) {
4633                const elCur = document.getElementById('pd-price-current');
4634                const elOri = document.getElementById('pd-price-original');
4635                const elDisc = document.getElementById('pd-discount-badge');
4636                const elSku = document.getElementById('pd-sku');
4637                const elStock = document.getElementById('pd-stock-badge');
4638                const elQty = document.getElementById('qty');
4639                const btnAdd = document.getElementById('btn-add-cart');
4640                const btnBuy = document.getElementById('btn-buy');
4641                const hidVar = document.getElementById('pd-variant-id');
4642
4643                const mfCart = document.getElementById('mf-cart');
4644                const mfBuy = document.getElementById('mf-buy');
4645                const fab = document.getElementById('pd-mobile-fab');
4646
4647                if (hidVar) hidVar.value = v ? v.id : 0;
4648                if (elCur) elCur.textContent = rupiah(v ? v.final : 0);
4649                if (elSku && v && v.sku) elSku.textContent = v.sku;
4650
4651                if (v && v.ori > v.final) {
4652                    if (elOri) {
4653                        elOri.style.display = 'inline';
4654                        elOri.textContent = rupiah(v.ori);
4655                    }
4656                    if (elDisc) {
4657                        elDisc.style.display = 'inline';
4658                        elDisc.textContent = '-' + (v.disc || 0) + '%';
4659                    }
4660                } else {
4661                    if (elOri) elOri.style.display = 'none';
4662                    if (elDisc) elDisc.style.display = 'none';
4663                }
4664
4665                const stock = v ? (parseInt(v.stock || 0, 10) || 0) : 0;
4666                let effectiveStock = stock;
4667                let isActivePreorder = false;
4668                if (window.isPreorderProduct && v && 'preorder_remaining' in v && v.preorder_remaining !== null) {
4669                    effectiveStock = parseInt(v.preorder_remaining, 10);
4670                    if (isNaN(effectiveStock)) effectiveStock = 0;
4671                    isActivePreorder = true;
4672                }
4673                if (elStock) {
4674                    elStock.classList.remove('in', 'out');
4675                    if (effectiveStock > 0) {
4676                        elStock.classList.add('in');
4677                        elStock.textContent = IS_DIGITAL ? 'Tersedia' : (isActivePreorder ? 'Sisa Slot: ' +
4678                            effectiveStock : 'Stok: ' + formatStockLabel(effectiveStock));
4679                    } else {
4680                        elStock.classList.add('out');
4681                        elStock.textContent = 'Habis';
4682                    }
4683                }
4684                if (elQty) {
4685                    elQty.max = String(effectiveStock > 0 ? effectiveStock : 0);
4686                    if (effectiveStock <= 0) {
4687                        elQty.value = '0';
4688                        elQty.disabled = true;
4689                    } else {
4690                        if (parseInt(elQty.value || '1', 10) < 1) elQty.value = '1';
4691                        elQty.disabled = false;
4692                    }
4693                }
4694
4695                const shouldDisable = !(v && effectiveStock > 0);
4696                const updateButtons = () => {
4697                    const btnAddCart = document.getElementById('btn-add-cart');
4698                    const btnBuyNow = document.getElementById('btn-buy');
4699                    const mobileCart = document.getElementById('mf-cart');
4700                    const mobileBuy = document.getElementById('mf-buy');
4701                    [btnAddCart, btnBuyNow, mobileCart, mobileBuy].forEach(btn => {
4702                        if (!btn) return;
4703                        if (shouldDisable) {
4704                            btn.disabled = true;
4705                            btn.setAttribute('disabled', 'disabled');
4706                            btn.classList.add('stock-disabled');
4707                            btn.setAttribute('data-stock-blocked', 'true');
4708                            btn.setAttribute('data-stock-reason', window.isPreorderProduct ?
4709                                'Pre-order habis' : 'Stok habis');
4710                        } else {
4711                            btn.disabled = false;
4712                            btn.removeAttribute('disabled');
4713                            btn.classList.remove('stock-disabled');
4714                            btn.removeAttribute('data-stock-blocked');
4715                            btn.removeAttribute('data-stock-reason');
4716                        }
4717                    });
4718                };
4719                updateButtons();
4720                setTimeout(updateButtons, 10);
4721                setTimeout(updateButtons, 50);
4722                setTimeout(updateButtons, 100);
4723                if (mfBuy && v) {
4724                    const voucherBtn = document.getElementById('btn-buy-voucher');
4725                    const voucherCode = fab ? fab.dataset.voucherCode : '';
4726                    let voucherDiscount = 0;
4727
4728                    if (voucherBtn && voucherCode) {
4729                        const vType = voucherBtn.dataset.voucherType;
4730                        const vValue = parseFloat(voucherBtn.dataset.voucherValue) || 0;
4731                        const vMax = parseFloat(voucherBtn.dataset.voucherMax) || 0;
4732                        const finalPrice = v.final || 0;
4733                        if (vType && vValue > 0) {
4734                            voucherDiscount = calcVoucherDisc(vType, vValue, finalPrice, vMax);
4735                            if (fab) fab.dataset.voucherValue = voucherDiscount.toString();
4736                        }
4737                    }
4738
4739                    const finalPrice = v.final || 0;
4740                    const textEl = mfBuy.querySelector('.mf-buy-text');
4741                    const priceEl = mfBuy.querySelector('.mf-buy-price');
4742
4743                    if (effectiveStock > 0) {
4744                        if (IS_PREORDER) {
4745                            if (textEl) textEl.textContent = 'Pre Order Sekarang';
4746                            if (priceEl) priceEl.textContent = rupiah(finalPrice);
4747                        } else if (voucherCode && voucherDiscount > 0) {
4748                            if (textEl) textEl.textContent = 'Beli dengan Voucher';
4749                            if (priceEl) priceEl.textContent = rupiah(Math.max(0, finalPrice - voucherDiscount));
4750                        } else {
4751                            if (textEl) textEl.textContent = 'Beli Sekarang';
4752                            if (priceEl) priceEl.textContent = rupiah(finalPrice);
4753                        }
4754                    } else {
4755                        if (textEl) textEl.textContent = 'Stok Habis';
4756                        if (priceEl) priceEl.textContent = rupiah(finalPrice);
4757                    }
4758                }
4759
4760                const isMobile = window.initMobile ? ? 0;
4761                if (window.instSetBasePrice) window.instSetBasePrice(v ? (isMobile == '1' ? v.ori : v.final) : 0);
4762                if (window.updateSoldBySku) window.updateSoldBySku(v.sku);
4763                updateBranchPopover(v);
4764                if (v && v.image_url && focusImage) focusGalleryByUrl(v.image_url);
4765                if (v) {
4766                    window.dispatchEvent(new CustomEvent('pd-variant-changed', {
4767                        detail: {
4768                            price: v.final,
4769                            originalPrice: v.ori,
4770                            discount: v.disc,
4771                            stock: effectiveStock,
4772                            sku: v.sku,
4773                            variant_id: v.id
4774                        }
4775                    }));
4776
4777                    const encodedHash = encodeVariantHash(v.id);
4778                    if (encodedHash && window.history && window.history.replaceState) {
4779                        const newHash = '#v=' + encodedHash;
4780                        const newUrl = window.location.pathname + window.location.search + newHash;
4781                        window.history.replaceState(null, '', newUrl);
4782                    }
4783                }
4784            }
4785
4786            let sel = readSelection();
4787            if (autoFillMissing(sel)) sel = readSelection();
4788
4789            let v = findVariant(sel);
4790            if (!v) {
4791                const candidates = variants.filter(variant => {
4792                    return attrOrder.every(a => {
4793                        if (!sel[a]) return true;
4794                        return variant.attrs[a] === sel[a];
4795                    });
4796                });
4797                if (candidates.length >= 1) {
4798                    v = candidates[0];
4799                    attrOrder.forEach(a => sel[a] = v.attrs[a]);
4800                    attrOrder.forEach(a => {
4801                        const val = sel[a];
4802                        const input = document.querySelector(
4803                            `.v-group[data-attr="${CSS.escape(a)}"] input[type=radio][value="${CSS.escape(val)}"]`
4804                        );
4805                        if (input) input.checked = true;
4806                    });
4807                }
4808            }
4809
4810            const initSel = readSelection();
4811            const initVar = findVariant(initSel) || variants[0] || null;
4812            if (document.readyState === 'loading') {
4813                document.addEventListener('DOMContentLoaded', () => applyVariant(initVar, false));
4814            } else {
4815                applyVariant(initVar, false);
4816            }
4817
4818            function updateSummary(sel) {
4819                Object.entries(sel).forEach(([a, val]) => {
4820                    const el = document.getElementById('vs-' + a);
4821                    if (el) el.textContent = val || '-'
4822                })
4823            }
4824
4825            function refreshOptions(sel) {
4826                attrOrder.forEach(a => {
4827                    const group = document.querySelector(`.v-group[data-attr="${CSS.escape(a)}"]`);
4828                    if (!group) return;
4829                    const chips = group.querySelectorAll('.v-chip');
4830                    chips.forEach(ch => {
4831                        const val = ch.getAttribute('data-value');
4832                        const possible = variants.some(v => {
4833                            if (v.attrs[a] !== val) return false;
4834                            for (const a2 of attrOrder) {
4835                                if (a2 === a) continue;
4836                                if (sel[a2] && v.attrs[a2] !== sel[a2]) return false;
4837                            }
4838                            return true;
4839                        });
4840                        const input = ch.querySelector('input[type=radio]');
4841                        const disabled = !possible;
4842                        if (input) input.disabled = disabled;
4843                        ch.classList.toggle('disabled', disabled);
4844
4845                        let candidateVariant = null;
4846                        if (possible) {
4847                            candidateVariant = variants.find(v => {
4848                                if (v.attrs[a] !== val) return false;
4849                                for (const a2 of attrOrder) {
4850                                    if (a2 === a) continue;
4851                                    if (sel[a2] && v.attrs[a2] !== sel[a2]) return false;
4852                                }
4853                                return true;
4854                            });
4855                        }
4856                        const outOfStock = candidateVariant ? (window.isPreorderProduct &&
4857                            candidateVariant.preorder_remaining !== null ? candidateVariant
4858                            .preorder_remaining <= 0 : candidateVariant.stock <= 0) : false;
4859                        ch.classList.toggle('out', !disabled && outOfStock);
4860                        const badge = ch.querySelector('.chip-badge');
4861                        if (badge) badge.hidden = !(candidateVariant && outOfStock);
4862                    });
4863                    group.querySelectorAll('.v-chip').forEach(ch => {
4864                        const input = ch.querySelector('input[type=radio]');
4865                        ch.classList.toggle('selected', input && input.checked);
4866                    });
4867                });
4868            }
4869            updateSummary(sel);
4870            refreshOptions(sel);
4871            document.querySelectorAll('.v-chip').forEach(chip => {
4872                const input = chip.querySelector('input[type=radio]');
4873                if (input && input.checked) {
4874                    chip.classList.add('selected');
4875                }
4876            });
4877
4878            const container = document.getElementById('pd-variants');
4879            container && container.addEventListener('change', function (ev) {
4880                const radio = ev.target.closest('input[type=radio]');
4881                if (!radio) return;
4882                sel = readSelection();
4883                if (autoFillMissing(sel)) sel = readSelection();
4884                const chosen = findVariant(sel);
4885                applyVariant(chosen || null, true);
4886
4887                updateSummary(sel);
4888                refreshOptions(sel);
4889            });
4890
4891            window.applyVariant = applyVariant;
4892        })();
4893
4894        (function cleanBrokenDescImages() {
4895            const containers = [
4896                document.querySelector('.pd-full-desc-body'),
4897                document.querySelector('.pd-short-desc')
4898            ].filter(Boolean);
4899
4900            containers.forEach(root => {
4901                const imgs = root.querySelectorAll('img');
4902                imgs.forEach(img => {
4903                    if (img.complete && img.naturalWidth === 0) {
4904                        img.remove();
4905                        return;
4906                    }
4907                    img.addEventListener('error', () => {
4908                        img.remove();
4909                    }, {
4910                        once: true
4911                    });
4912                });
4913            });
4914        })();
4915
4916        /* ====== Scroll To Top ====== */
4917        (function _0xi25j() {
4918            const a = document.getElementById('pd-scroll-top');
4919            if (!a) return;
4920
4921            function b() {
4922                if (window.matchMedia('(max-width:640px)').matches) {
4923                    const d = document.querySelector('.bottom-nav'),
4924                        e = document.querySelector('.pd-mobile-fab');
4925                    if (!d && !e) {
4926                        setTimeout(b, 100);
4927                        return
4928                    }
4929                    const f = d && window.getComputedStyle(d).display !== 'none' && window.getComputedStyle(d)
4930                        .visibility !== 'hidden',
4931                        g = e && window.getComputedStyle(e).display !== 'none' && window.getComputedStyle(e)
4932                        .visibility !== 'hidden';
4933                    let h;
4934                    if (f && g) {
4935                        h = 'calc(68px + 54px + env(safe-area-inset-bottom))'
4936                    } else if (g) {
4937                        h = 'calc(68px + 8px + env(safe-area-inset-bottom))'
4938                    } else if (f) {
4939                        h = 'calc(60px + env(safe-area-inset-bottom))'
4940                    } else {
4941                        h = 'calc(20px + env(safe-area-inset-bottom))'
4942                    }
4943                    a.style.setProperty('--scroll-top-bottom', h)
4944                } else {
4945                    a.style.removeProperty('--scroll-top-bottom')
4946                }
4947            }
4948
4949            function c() {
4950                const d = window.pageYOffset || document.documentElement.scrollTop || 0,
4951                    e = d > 300;
4952                a.classList.toggle('visible', e);
4953                a.setAttribute('aria-hidden', e ? 'false' : 'true');
4954                b()
4955            }
4956            window.addEventListener('scroll', c, {
4957                passive: !0
4958            });
4959            window.addEventListener('resize', b, {
4960                passive: !0
4961            });
4962            setTimeout(b, 100);
4963            c();
4964            a.addEventListener('click', function () {
4965                window.scrollTo({
4966                    top: 0,
4967                    behavior: 'smooth'
4968                })
4969            })
4970        })();
4971
4972        /* Format stok 10+ */
4973        function _0xk67l(n) {
4974            n = parseInt(n || 0, 10) || 0;
4975            return n > 10 ? '10+' : String(n)
4976        }
4977
4978        /* Toggle popover stok per cabang */
4979        (function _0xm89n() {
4980            const a = document.getElementById('pd-stock-info-btn'),
4981                b = document.getElementById('pd-stock-popover'),
4982                c = document.getElementById('pd-stock-popover-close');
4983            if (!a || !b) return;
4984
4985            function d() {
4986                if (window.matchMedia('(min-width: 641px)').matches) {
4987                    const e = document.getElementById('pd-stock-badge');
4988                    if (!e) return;
4989                    const f = e.getBoundingClientRect(),
4990                        g = window.pageXOffset || document.documentElement.scrollLeft || 0,
4991                        h = window.pageYOffset || document.documentElement.scrollTop || 0;
4992                    b.style.left = (f.left + g - 10) + 'px';
4993                    b.style.top = (f.bottom + h + 10) + 'px'
4994                } else {
4995                    b.style.left = '';
4996                    b.style.top = ''
4997                }
4998            }
4999
5000            function e() {
5001                d();
5002                b.classList.add('show');
5003                a.setAttribute('aria-expanded', 'true');
5004                b.setAttribute('aria-hidden', 'false');
5005                document.addEventListener('click', g, {
5006                    capture: true
5007                });
5008                window.addEventListener('resize', d, {
5009                    passive: true
5010                });
5011                window.addEventListener('scroll', d, {
5012                    passive: true
5013                })
5014            }
5015
5016            function f() {
5017                b.classList.remove('show');
5018                a.setAttribute('aria-expanded', 'false');
5019                b.setAttribute('aria-hidden', 'true');
5020                document.removeEventListener('click', g, {
5021                    capture: true
5022                });
5023                window.removeEventListener('resize', d);
5024                window.removeEventListener('scroll', d)
5025            }
5026
5027            function g(h) {
5028                if (b.contains(h.target) || a.contains(h.target)) return;
5029                f()
5030            }
5031            a.addEventListener('click', function (h) {
5032                h.preventDefault();
5033                b.classList.contains('show') ? f() : e()
5034            });
5035            if (c) c.addEventListener('click', f)
5036        })();
5037
5038        /* ===== Share Product Modal ===== */
5039        (function () {
5040            const a = document.getElementById('pd-share-btn'),
5041                z = document.getElementById('mf-share'),
5042                b = document.getElementById('pd-share-modal-overlay'),
5043                c = document.getElementById('pd-share-close'),
5044                d = document.getElementById('pd-share-copy-url-btn'),
5045                e = document.getElementById('pd-share-url-input');
5046            if ((!a && !z) || !b) return;
5047            const f = "https://moderntally.com/",
5048                g =
5049                "Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Win 11 Home/Eclipse Black/3Y",
5050                h = "Rp 20.789.000";
5051            const discountPercent = 1;
5052            let i = '';
5053            if (discountPercent > 0) {
5054                i = `🔥 Lagi Promo Nih! Diskon ${discountPercent}%\n\n✨ ${g}\n💰 Cuma ${h} aja!\n\n🛒 Buruan cek sebelum kehabisan!\n👉 `
5055            } else {
5056                i = `✨ Ada barang bagus nih!\n\n📦 ${g}\n💸 Harga: ${h}\n\n🛍️ Yuk, langsung cek!\n👉 `
5057            }
5058
5059            function j() {
5060                b.classList.add('show');
5061                document.body.style.overflow = 'hidden'
5062            }
5063
5064            function k() {
5065                b.classList.remove('show');
5066                document.body.style.overflow = ''
5067            }
5068            if (a) a.addEventListener('click', j);
5069            if (z) z.addEventListener('click', j);
5070            if (c) c.addEventListener('click', k);
5071            b.addEventListener('click', function (l) {
5072                if (l.target === b) k()
5073            });
5074            document.addEventListener('keydown', function (l) {
5075                if (l.key === 'Escape' && b.classList.contains('show')) k()
5076            });
5077            b.addEventListener('click', function (l) {
5078                const m = l.target.closest('[data-share]');
5079                if (!m) return;
5080                const n = m.getAttribute('data-share'),
5081                    o = encodeURIComponent(f),
5082                    p = encodeURIComponent(i),
5083                    q = encodeURIComponent(g);
5084                let r = '';
5085                switch (n) {
5086                    case 'whatsapp':
5087                        r = `https://wa.me/?text=${p}${o}`;
5088                        break;
5089                    case 'facebook':
5090                        r = `https://www.facebook.com/sharer/sharer.php?u=${o}`;
5091                        break;
5092                    case 'twitter':
5093                        r = `https://twitter.com/intent/tweet?text=${p}${o}`;
5094                        break;
5095                    case 'telegram':
5096                        r = `https://t.me/share/url?url=${o}&text=${p}`;
5097                        break;
5098                    case 'email':
5099                        r =
5100                            `mailto:?subject=${encodeURIComponent('🔥 Cek Produk Keren Ini!')}&body=${p}${o}`;
5101                        window.location.href = r;
5102                        k();
5103                        return;
5104                    case 'copy':
5105                        s();
5106                        return;
5107                    case 'pdf':
5108                        const ps = document.querySelector('.product-single');
5109                        if (ps) {
5110                            ps.setAttribute('data-print-date', new Date().toLocaleDateString('id-ID', {
5111                                year: 'numeric',
5112                                month: 'long',
5113                                day: 'numeric'
5114                            }))
5115                        }
5116                        k();
5117                        setTimeout(function () {
5118                            window.print();
5119                            try {
5120                                if (window.ga4Ecomm && window.ga4Ecomm.trackEvent) window.ga4Ecomm
5121                                    .trackEvent('share', {
5122                                        method: 'pdf_export',
5123                                        content_type: 'product',
5124                                        item_id: "RJ777"
5125                                    })
5126                            } catch (_) {}
5127                        }, 300);
5128                        return
5129                }
5130                if (r) {
5131                    window.open(r, '_blank', 'noopener,noreferrer');
5132                    try {
5133                        if (window.ga4Ecomm && window.ga4Ecomm.trackEvent) window.ga4Ecomm.trackEvent(
5134                            'share', {
5135                                method: n,
5136                                content_type: 'product',
5137                                item_id: "RJ777"
5138                            })
5139                    } catch (_) {}
5140                }
5141            });
5142
5143            function s() {
5144                if (!e) return;
5145                e.select();
5146                e.setSelectionRange(0, 99999);
5147                try {
5148                    if (navigator.clipboard && navigator.clipboard.writeText) {
5149                        navigator.clipboard.writeText(f).then(function () {
5150                            t()
5151                        }).catch(function () {
5152                            document.execCommand('copy');
5153                            t()
5154                        })
5155                    } else {
5156                        document.execCommand('copy');
5157                        t()
5158                    }
5159                } catch (u) {
5160                    console.error('Failed to copy:', u)
5161                }
5162            }
5163
5164            function t() {
5165                if (!d) return;
5166                const v = d.innerHTML;
5167                d.classList.add('copied');
5168                d.innerHTML =
5169                    '<svg viewBox="0 0 24 24" width="16" height="16">
5169<path fill="currentColor" d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg><span class="pd-share-copy-text">Tersalin!</span>';
5170                if (window.showToast) showToast({
5171                    type: 'success',
5172                    title: '✨ Link Tersalin!',
5173                    message: 'Link produk berhasil disalin. Yuk bagikan ke teman!',
5174                    duration: 3000
5175                });
5176                setTimeout(function () {
5177                    d.classList.remove('copied');
5178                    d.innerHTML = v
5179                }, 2000)
5180            }
5181            if (d) d.addEventListener('click', s);
5182            if (navigator.share) {
5183                const shareHandler = function (w) {
5184                    w.preventDefault();
5185                    navigator.share({
5186                        title: g,
5187                        text: i + f,
5188                        url: f
5189                    }).catch(function (x) {
5190                        console.log('Native share cancelled or failed:', x)
5191                    })
5192                };
5193                if (a) a.addEventListener('dblclick', shareHandler);
5194                if (z) z.addEventListener('dblclick', shareHandler)
5195            }
5196        })();
5197
5198        /* ===== Embedding variants (server → client) ===== */
5199        (function () {
5200            window.__PD_VARIANTS_WITH_BRANCH__ = [];
5201        })();
5202
5203        /* ===== Helper: update angka popover ===== */
5204        function updateStockPopoverForVariant(v) {
5205            try {
5206                const elMeg = document.getElementById('sp-qty-meg');
5207                const elMdf = document.getElementById('sp-qty-mdf');
5208                const elBda = document.getElementById('sp-qty-bda');
5209
5210                if (typeof v ? .smm === 'number' && elMeg) elMeg.textContent = formatStockLabel(Math.max(0, v.smm | 0));
5211                if (typeof v ? .smf === 'number' && elMdf) elMdf.textContent = formatStockLabel(Math.max(0, v.smf | 0));
5212                if (typeof v ? .sba === 'number' && elBda) elBda.textContent = formatStockLabel(Math.max(0, v.sba | 0));
5213            } catch (_) {}
5214        }
5215
5216        /* ===== applyVariant: 10+ dan update popover ===== */
5217        (function patchApplyVariant() {
5218            if (typeof applyVariant !== 'function') return;
5219            const original = applyVariant;
5220            window.applyVariant = function (v) {
5221                original(v);
5222
5223                try {
5224                    const elStock = document.getElementById('pd-stock-badge');
5225                    if (elStock) {
5226                        let txt = elStock.textContent || '';
5227                        let m = txt.match(/\d+/);
5228                        if (m) {
5229                            const n = parseInt(m[0] || '0', 10) || 0;
5230                            elStock.textContent = (n > 0) ? ('Stok: ' + formatStockLabel(n)) : 'Habis';
5231                        }
5232                    }
5233                } catch (_) {}
5234                if (window.__PD_VARIANTS_WITH_BRANCH__ && v) {
5235                    const vv = window.__PD_VARIANTS_WITH_BRANCH__.find(x => x.id === v.id) || v;
5236                    updateStockPopoverForVariant(vv)
5237                }
5238            };
5239        })();
5240
5241        (function initCurrentVariantBranch() {
5242            const list = window.__PD_VARIANTS_WITH_BRANCH__ || [];
5243            if (!list.length) return;
5244            const hid = document.getElementById('pd-variant-id');
5245            const vid = hid ? parseInt(hid.value || '0', 10) : 0;
5246            const current = list.find(x => x.id === vid) || list[0] || null;
5247            if (current) updateStockPopoverForVariant(current);
5248        })();
5249
5250        (function () {
5251            if (!window.ga4Ecomm) return;
5252            const catSegs = ["Komputer & Laptop", "Laptop", "Gaming"];
5253            window.ga4Ecomm.viewItem({
5254                currency: 'IDR',
5255                value: 20789000,
5256                item_id: "RJ777",
5257                item_name: "Lenovo Legion Go 8ASP2 - 83N0000RID /AMD Ryzen Z2 Extreme/32GB/1TB SSD/AMD Radeon Graphics/8.8\" WUXGA OLED Touch/Win 11 Home/Eclipse Black/3Y",
5258                item_brand: "Lenovo ",
5259                item_category: catSegs && catSegs.length ? catSegs.join(' / ') : ''
5260            });
5261        })();
5262
5263        (function patchApplyVariantFocus() {
5264            if (typeof applyVariant !== 'function') return;
5265            const original = applyVariant;
5266            window.applyVariant = function (v, focusImage = true) {
5267
5268                original(v, focusImage);
5269
5270                if (focusImage && v && v.image_url) {
5271                    _0xau1v(v.image_url);
5272                }
5273            };
5274        })();
5275
5276        (function () {
5277            var soldMap = [];
5278            var soldTotalLabel = "Terjual 2";
5279
5280            function formatSoldLabel(qty) {
5281                if (qty >= 1000000) {
5282                    var v = Math.floor((qty / 100000)) / 10;
5283                    return 'Terjual ' + (String(v).replace('.', ',')) + 'jt+';
5284                }
5285                if (qty >= 1000) {
5286                    var v2 = Math.floor((qty / 100)) / 10;
5287                    return 'Terjual ' + (String(v2).replace('.', ',')) + 'rb+';
5288                }
5289                if (qty >= 100) {
5290                    var v2 = Math.floor((qty / 100)) * 100;
5291                    return 'Terjual ' + (String(v2).replace('.', ',')) + '+';
5292                }
5293                if (qty >= 10) {
5294                    var v2 = Math.floor((qty / 10)) * 10;
5295                    return 'Terjual ' + (String(v2).replace('.', ',')) + '+';
5296                }
5297                return 'Terjual ' + (qty.toLocaleString('id-ID'));
5298            }
5299
5300            function updateSoldLabel(labelText) {
5301                var el = document.querySelector('#pd-sold-inline, [data-role="sold-chip"]');
5302                if (el) el.textContent = labelText;
5303            }
5304
5305            window.updateSoldBySku = function (sku) {
5306                if (!sku || typeof sku !== 'string') {
5307                    updateSoldLabel(soldTotalLabel);
5308                    return;
5309                }
5310                var qty = soldMap[sku] || 0;
5311                updateSoldLabel(formatSoldLabel(qty));
5312            };
5313
5314            updateSoldLabel(soldTotalLabel);
5315        })();
5316
5317        (function () {
5318            const h = document.getElementById('pd-sticky-header');
5319            if (!h) return;
5320            const p = document.getElementById('pd-price-anchor');
5321            const ac = document.getElementById('pd-sticky-add-cart');
5322            const by = document.getElementById('pd-sticky-buy');
5323            let lt = window.scrollY;
5324            let tk = false;
5325
5326            function u() {
5327                if (!p) return;
5328                const r = p.getBoundingClientRect();
5329                const s = window.scrollY;
5330                if (r.top < 0) {
5331                    h.classList.add('visible')
5332                } else {
5333                    h.classList.remove('visible')
5334                }
5335                lt = s;
5336                tk = false
5337            }
5338
5339            function rt() {
5340                if (!tk) {
5341                    window.requestAnimationFrame(u);
5342                    tk = true
5343                }
5344            }
5345            window.addEventListener('scroll', rt, {
5346                passive: true
5347            });
5348            u();
5349
5350            function sy() {
5351                const ma = document.getElementById('btn-add-cart');
5352                const mb = document.getElementById('btn-buy');
5353                if (ac && ma) {
5354                    ac.disabled = ma.disabled
5355                }
5356                if (by && mb) {
5357                    by.disabled = mb.disabled
5358                }
5359            }
5360            sy();
5361            const ob = new MutationObserver(sy);
5362            const ma = document.getElementById('btn-add-cart');
5363            const mb = document.getElementById('btn-buy');
5364            if (ma) ob.observe(ma, {
5365                attributes: true,
5366                attributeFilter: ['disabled']
5367            });
5368            if (mb) ob.observe(mb, {
5369                attributes: true,
5370                attributeFilter: ['disabled']
5371            });
5372            const ss = document.getElementById('pd-sticky-share-btn');
5373            const ms = document.getElementById('pd-share-btn');
5374            if (ss && ms) {
5375                ss.addEventListener('click', function (e) {
5376                    e.preventDefault();
5377                    ms.click()
5378                })
5379            }
5380            if (ac) {
5381                ac.addEventListener('click', function (e) {
5382                    e.preventDefault();
5383                    if (ac.disabled) return;
5384                    const m = document.getElementById('btn-add-cart');
5385                    if (m && !m.disabled) {
5386                        m.click()
5387                    }
5388                })
5389            }
5390            if (by) {
5391                by.addEventListener('click', function (e) {
5392                    e.preventDefault();
5393                    if (by.disabled) return;
5394                    const m = document.getElementById('btn-buy');
5395                    if (m && !m.disabled && window.buyNow) {
5396                        window.buyNow(e)
5397                    }
5398                })
5399            }
5400
5401            function getChatProductData() {
5402                const varInput = document.getElementById('pd-variant-id');
5403                const variantId = varInput ? parseInt(varInput.value || '0', 10) : 0;
5404                const variantSummary = getVariantSummaryText();
5405                const priceEl = document.getElementById('pd-price-current');
5406                const currentPrice = priceEl ? priceEl.textContent.trim() : 'Rp 20.789.000';
5407                const pd = {
5408                    id: 325,
5409                    name: "Lenovo Legion Go 8ASP2 - 83N0000RID \/AMD Ryzen Z2 Extreme\/32GB\/1TB SSD\/AMD Radeon Graphics\/8.8\" WUXGA OLED Touch\/Win 11 Home\/Ecl
5409ipse Black\/3Y",
5410                    price: currentPrice,
5411                    image: "\/uploads\/products\/lenovo-legion-go-8asp2-83n0000rid.webp",
5412                    url: window.location.href
5413                };
5414                if (variantId > 0) {
5415                    pd.variant_id = variantId
5416                }
5417                if (variantSummary) {
5418                    pd.variant_summary = variantSummary
5419                }
5420                return pd
5421            }
5422            const ch = document.getElementById('pd-sticky-chat');
5423            if (ch) {
5424                ch.addEventListener('click', function (e) {
5425                    e.preventDefault();
5426                    if (!window.plazaChat) {
5427                        console.warn('Chat widget not loaded');
5428                        return
5429                    }
5430                    window.plazaChat.attachProduct(getChatProductData());
5431                    window.plazaChat.openWidget()
5432                })
5433            }
5434            const dch = document.getElementById('btn-chat-icon');
5435            if (dch) {
5436                dch.addEventListener('click', function (e) {
5437                    e.preventDefault();
5438                    if (!window.plazaChat) {
5439                        console.warn('Chat widget not loaded');
5440                        return
5441                    }
5442                    window.plazaChat.attachProduct(getChatProductData());
5443                    window.plazaChat.openWidget()
5444                })
5445            }
5446            const mch = document.getElementById('mf-chat');
5447            if (mch) {
5448                mch.addEventListener('click', function (e) {
5449                    e.preventDefault();
5450                    if (!window.plazaChat) {
5451                        console.warn('Chat widget not loaded');
5452                        return
5453                    }
5454                    window.plazaChat.attachProduct(getChatProductData());
5455                    window.plazaChat.openWidget()
5456                })
5457            }
5458            window.addEventListener('pd-variant-changed', function (e) {
5459                const d = e.detail || {};
5460                if (d.price !== undefined) {
5461                    const sp = document.getElementById('pd-sticky-price');
5462                    if (sp) {
5463                        sp.textContent = formatRupiah(d.price)
5464                    }
5465                }
5466                if (d.originalPrice !== undefined && d.originalPrice > d.price) {
5467                    const so = document.getElementById('pd-sticky-price-original');
5468                    if (so) {
5469                        so.textContent = formatRupiah(d.originalPrice);
5470                        so.style.display = ''
5471                    }
5472                } else {
5473                    const so = document.getElementById('pd-sticky-price-original');
5474                    if (so) {
5475                        so.style.display = 'none'
5476                    }
5477                }
5478                if (d.discount !== undefined && d.discount > 0) {
5479                    const sd = document.getElementById('pd-sticky-discount');
5480                    if (sd) {
5481                        sd.textContent = '-' + d.discount + '%';
5482                        sd.style.display = ''
5483                    }
5484                } else {
5485                    const sd = document.getElementById('pd-sticky-discount');
5486                    if (sd) {
5487                        sd.style.display = 'none'
5488                    }
5489                }
5490                const hs = d.stock > 0;
5491                if (ac) {
5492                    ac.disabled = !hs
5493                }
5494                if (by) {
5495                    by.disabled = !hs
5496                }
5497            });
5498
5499            function formatRupiah(n) {
5500                return 'Rp' + Math.floor(n).toLocaleString('id-ID')
5501            }
5502        })();
5503
5504        (function () {
5505            const t = document.getElementById('pdv-toggle-btn');
5506            const v = document.getElementById('pd-voucher-section');
5507            if (t && v) {
5508                const h = v.querySelectorAll('.pdv-min-hidden');
5509                const n = h.length;
5510                t.addEventListener('click', function () {
5511                    const e = t.classList.toggle('expanded');
5512                    h.forEach(function (i) {
5513                        if (e) {
5514                            i.classList.remove('pdv-min-hidden')
5515                        } else {
5516                            i.classList.add('pdv-min-hidden')
5517                        }
5518                    });
5519                    t.textContent = e ? 'Tutup' : '+' + n
5520                })
5521            }
5522            const m = document.getElementById('voucher-detail-modal');
5523            const mc = document.getElementById('voucher-modal-close');
5524            const ma = document.getElementById('voucher-modal-cancel');
5525            const mcp = document.getElementById('voucher-modal-copy');
5526            if (m) {
5527                const bb = document.querySelectorAll('.pdv-badge-btn');
5528                bb.forEach(function (btn) {
5529                    btn.addEventListener('click', function () {
5530                        if (btn.disabled) return;
5531                        const c = btn.getAttribute('data-voucher-code');
5532                        const nm = btn.getAttribute('data-voucher-name');
5533                        const dl = btn.getAttribute('data-discount-label');
5534                        const bl = btn.getAttribute('data-badge-label');
5535                        const mp = parseInt(btn.getAttribute('data-min-purchase'));
5536                        const md = parseInt(btn.getAttribute('data-max-discount'));
5537                        const vu = btn.getAttribute('data-valid-until');
5538                        document.getElementById('voucher-modal-badge').innerHTML =
5539                            '<span class="vmb-value">' + dl + '</span><span class="vmb-label">' +
5540                            bl + '</span>';
5541                        document.getElementById('voucher-modal-code').textContent = c;
5542                        document.getElementById('voucher-modal-name').textContent = nm;
5543                        const me = document.getElementById('voucher-modal-min');
5544                        if (mp > 0) {
5545                            me.style.display = '';
5546                            document.getElementById('voucher-modal-min-val').textContent = fr(mp)
5547                        } else {
5548                            me.style.display = 'none'
5549                        }
5550                        const xe = document.getElementById('voucher-modal-max');
5551                        if (md > 0) {
5552                            xe.style.display = '';
5553                            document.getElementById('voucher-modal-max-val').textContent = fr(md)
5554                        } else {
5555                            xe.style.display = 'none'
5556                        }
5557                        if (vu) {
5558                            const d = new Date(vu);
5559                            const ft = d.toLocaleDateString('id-ID', {
5560                                day: 'numeric',
5561                                month: 'long',
5562                                year: 'numeric',
5563                                hour: '2-digit',
5564                                minute: '2-digit'
5565                            });
5566                            document.getElementById('voucher-modal-valid-val').textContent = ft
5567                        }
5568                        mcp.setAttribute('data-code', c);
5569                        m.classList.add('show');
5570                        document.body.style.overflow = 'hidden'
5571                    })
5572                });
5573
5574                function cm() {
5575                    m.classList.remove('show');
5576                    document.body.style.overflow = ''
5577                }
5578                if (mc) mc.addEventListener('click', cm);
5579                if (ma) ma.addEventListener('click', cm);
5580                m.addEventListener('click', function (e) {
5581                    if (e.target === m) cm()
5582                });
5583                if (mcp) {
5584                    mcp.addEventListener('click', function () {
5585                        const c = mcp.getAttribute('data-code');
5586                        if (!c) return;
5587                        if (navigator.clipboard && navigator.clipboard.writeText) {
5588                            navigator.clipboard.writeText(c).then(function () {
5589                                smc()
5590                            }).catch(function (err) {
5591                                fc(c)
5592                            })
5593                        } else {
5594                            fc(c)
5595                        }
5596                    })
5597                }
5598            }
5599            const b = document.querySelectorAll('.pdv-min-copy');
5600            b.forEach(function (btn) {
5601                btn.addEventListener('click', function () {
5602                    if (btn.disabled) return;
5603                    const code = btn.getAttribute('data-code');
5604                    if (!code) return;
5605                    if (navigator.clipboard && navigator.clipboard.writeText) {
5606                        navigator.clipboard.writeText(code).then(function () {
5607                            sc(btn)
5608                        }).catch(function (err) {
5609                            fc(code, btn)
5610                        })
5611                    } else {
5612                        fc(code, btn)
5613                    }
5614                })
5615            });
5616
5617            function fc(text, btn) {
5618                const tx = document.createElement('textarea');
5619                tx.value = text;
5620                tx.style.position = 'fixed';
5621                tx.style.opacity = '0';
5622                document.body.appendChild(tx);
5623                tx.select();
5624                try {
5625                    document.execCommand('copy');
5626                    if (btn) sc(btn);
5627                    else smc()
5628                } catch (err) {}
5629                document.body.removeChild(tx)
5630            }
5631
5632            function sc(btn) {
5633                const o = btn.textContent;
5634                btn.classList.add('copied');
5635                btn.textContent = '✓ Tersalin';
5636                setTimeout(function () {
5637                    btn.classList.remove('copied');
5638                    btn.textContent = o
5639                }, 2000)
5640            }
5641
5642            function smc() {
5643                const o = mcp.textContent;
5644                mcp.textContent = '✓ Kode Tersalin';
5645                mcp.style.background = '#22c55e';
5646                setTimeout(function () {
5647                    mcp.textContent = o;
5648                    mcp.style.background = ''
5649                }, 2000)
5650            }
5651
5652            function fr(a) {
5653                return 'Rp' + Math.floor(a).toLocaleString('id-ID')
5654            }
5655        })();
5656    </script>
5656
5657    
5657<script nonce="se3iyzEHMc9FQEB4wSyd0w==">
5658        window.PD_ID = 325;
5659        window.PD_NAME = _0x3c4d;
5660        window.PD_SKU = _0x5e6f;
5661        window.PD_CATEGORY_PATH = "Komputer & Laptop/Laptop/Gaming";
5662        window.PD_BEST_VOUCHER = null;
5663        window.IS_DIGITAL = IS_DIGITAL;
5664        window.isPreorderProduct = false;
5665        window.PD_PREORDER_DATA = null;
5666    </script>
5666
5667
5668    
5668<script src="https://plazaitdotid.pages.dev/assets/js/pd-lightbox.js" nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
5668
5669    
5669<script src="https://plazaitdotid.pages.dev/assets/js/cart.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
5669
5670    
5670<script src="https://plazaitdotid.pages.dev/assets/js/stock-validator-vanilla.js" nonce="se3iyzEHMc9FQEB4wSyd0w==">
5671    </script>
5671
5672    
5672<script src="https://plazaitdotid.pages.dev/assets/js/pd-addtocart.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w==">
5673    </script>
5673
5674    
5674<script src="https://plazaitdotid.pages.dev/assets/js/pd-buynow.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
5674
5675    
5675<script src="https://plazaitdotid.pages.dev/assets/js/pd-voucher-recalc.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w==">
5676    </script>
5676
5677    
5677<script nonce="se3iyzEHMc9FQEB4wSyd0w==">
5678        document.addEventListener('DOMContentLoaded', function () {
5679            if (typeof ProductReviews !== 'undefined') {
5680                ProductReviews.init(325);
5681            }
5682            const r = document.getElementById('pd-rating-inline');
5683            if (r) {
5684                r.addEventListener('click', function (e) {
5685                    e.preventDefault();
5686                    const s = document.getElementById('reviews');
5687                    if (s) {
5688                        s.scrollIntoView({
5689                            behavior: 'smooth',
5690                            block: 'start'
5691                        });
5692                        s.classList.add('highlight-flash');
5693                        setTimeout(() => {
5694                            s.classList.remove('highlight-flash')
5695                        }, 1500)
5696                    }
5697                });
5698            }
5699        });
5700    </script>
5700
5701
5702    
5702<script nonce="se3iyzEHMc9FQEB4wSyd0w==">
5703        (function () {
5704            function _0x9i0j(el) {
5705                if (typeof gtag === 'function') {
5706                    gtag('event', 'qoala_insurance_click', {
5707                        event_category: 'Insurance',
5708                        event_label: 'Qoala Banner Click - Product Detail',
5709                        link_url: '/plazait-protect',
5710                        page_location: window.location.href,
5711                        product_id: parseInt(el.getAttribute('data-product-id')) || 0,
5712                        product_name: el.getAttribute('data-product-name') || '',
5713                        category_path: el.getAttribute('data-category-path') || '',
5714                        custom_map: {
5715                            custom_parameter_1: 'qoala_banner_product_detail'
5716                        }
5717                    })
5718                }
5719            }
5720
5721            function _0x1k2l() {
5722                var a = document.querySelector('.qoala-cta[data-ga-event="qoala_banner_click"]');
5723                if (a) {
5724                    a.addEventListener('click', function (e) {
5725                        _0x9i0j(this)
5726                    })
5727                }
5728            }
5729            if (document.readyState === 'loading') {
5730                document.addEventListener('DOMContentLoaded', _0x1k2l)
5731            } else {
5732                _0x1k2l()
5733            }
5734        })();
5735
5736        (function () {
5737            const pwpSection = document.getElementById('pwp-deals-section');
5738            const pwpBadge = document.getElementById('pwp-trigger-badge');
5739            if (!pwpSection) return;
5740            const productId = parseInt(pwpSection.getAttribute('data-product-id')) || 0;
5741            const variantId = parseInt(pwpSection.getAttribute('data-variant-id')) || 0;
5742            const categoryPath = pwpSection.getAttribute('data-category-path') || '';
5743            if (!productId) return;
5744
5745            function formatRupiah(n) {
5746                return 'Rp' + Math.floor(n).toLocaleString('id-ID')
5747            }
5748
5749            function loadPWPDeals() {
5750                const url =
5751                    `/api/pwp/get_by_product.php?product_id=${productId}${variantId?`&variant_id=${variantId}`:''}${categoryPath?`&category_path=${encodeURIComponent(categoryPath)}`:''}`;
5752                fetch(url).then(r => r.json()).then(data => {
5753                    if (data.success && data.promotions && data.promotions.length > 0) {
5754                        renderPWPDeals(data.promotions);
5755                        pwpSection.hidden = false;
5756                        if (pwpBadge) pwpBadge.hidden = false;
5757                        setTimeout(function () {
5758                            if (typeof window.adjustSidebarBanner === 'function') {
5759                                window.adjustSidebarBanner()
5760                            }
5761                        }, 150)
5762                    } else {
5763                        pwpSection.hidden = true;
5764                        if (pwpBadge) pwpBadge.hidden = true
5765                    }
5766                }).catch(err => {
5767                    console.error('PWP load error:', err);
5768                    pwpSection.hidden = true;
5769                    if (pwpBadge) pwpBadge.hidden = true
5770                })
5771            }
5772
5773            function renderPWPDeals(promotions) {
5774                const loading = pwpSection.querySelector('.pwp-deals-loading');
5775                const grid = document.getElementById('pwp-deals-grid');
5776                if (loading) loading.hidden = true;
5777                if (!grid) return;
5778                grid.innerHTML = '';
5779                promotions.forEach(promo => {
5780                    promo.bundled_products.forEach(product => {
5781                        const card = document.createElement('div');
5782                        card.className = 'pwp-deal-card';
5783                        const discount = product.discount > 0 ? product.discount : 0;
5784                        const discountPercent = product.regular_price > 0 ? Math.round((discount /
5785                            product.regular_price) * 100) : 0;
5786                        const imgUrl = product.image_url ?
5787                            `/uploads/products/${product.image_url}` : '/assetsimg/no-image.png';
5788                        card.innerHTML =
5789                            `<div class="pwp-deal-thumb"><img src="${imgUrl}" alt="${escapeHtml(product.name)}" loading="lazy"></div><div class="pwp-deal-info"><h4 class="pwp-deal-name">${escapeHtml(product.name)}</h4><div class="pwp-deal-prices"><span class="pwp-deal-price">${formatRupiah(product.pwp_price)}</span>${product.regular_price>product.pwp_price?`<span class="pwp-deal-original">${formatRupiah(product.regular_price)}</span>`:''}</div></div>${discountPercent>0?`<span class="pwp-deal-badge">-${discountPercent}%</span>`:''}`;
5790                        grid.appendChild(card)
5791                    })
5792                })
5793            }
5794
5795            function escapeHtml(str) {
5796                const div = document.createElement('div');
5797                div.textContent = str || '';
5798                return div.innerHTML
5799            }
5800            loadPWPDeals();
5801            window.addEventListener('pd-variant-changed', function (e) {
5802                const detail = e.detail || {};
5803                const newVid = detail.variant_id || 0;
5804                const currentVid = parseInt(pwpSection.getAttribute('data-variant-id')) || 0;
5805                if (newVid !== currentVid) {
5806                    pwpSection.setAttribute('data-variant-id', newVid);
5807                    loadPWPDeals()
5808                }
5809            })
5810        })();
5811    </script>
5811
5812    <footer class="site-footer footer-compact variant-stripes" role="contentinfo">
5813        <div class="ft-top ft-collapsible" id="ftTop">
5814            <div class="container ft-grid">
5815
5816                <div class="ft-col ft-help">
5817                    <h4 class="ft-title">Butuh Bantuan?</h4>
5818                    <p class="ft-desc">Hubungi kami melalui Official WhatsApp interaktif sekarang.</p>
5819                    <a class="ft-wa-btn" href="#" target="_blank" rel="nofollow noopener">
5820                        <span class="ico" aria-hidden="true">
5821                            <svg viewBox="0 0 24 24" width="18" height="18">
5822                                <path fill="#25D366"
5823                                    d="M12.04 2c-5.52 0-10 4.43-10 9.9 0 1.75.47 3.45 1.38 4.94L2 22l5.3-1.38c1.43.78 3.05 1.19 4.7 1.19 5.52 0 10-4.43 10-9.9S17.56 2 12.04 2Zm5.86 13.9c-.25.7-1.23 1.28-1.7 1.33-.45.06-1.02.08-1.65-.1-.38-.12-.88-.29-1.52-.56-2.66-1.15-4.4-3.83-4.53-4.01-.13-.18-1.08-1.44-1.08-2.75 0-1.31.68-1.95.92-2.22.25-.27.54-.33.72-.33.18 0 .36.01.52.01.17 0 .39-.06.62.47.25.6.85 2.07.92 2.22.07.15.12.33.02.53-.1.2-.15.33-.3.5-.15.17-.32.39-.46.53-.15.15-.3.31-.13.6.18.3.8 1.31 1.73 2.12 1.19 1.03 2.17 1.36 2.48 1.5.31.14.49.12.67-.07.18-.18.77-.82.98-1.1.21-.27.42-.23.7-.14.27.09 1.72.81 2.02.95.3.14.5.22.58.35.08.13.08.72-.17 1.42Z" />
5824                            </svg>
5825                        </span>
5826                        Kirim Pesan
5827                    </a>
5828
5829                    <p class="ft-desc sm-gap">Ikuti kami:</p>
5830                    <div class="ft-social">
5831                        <a aria-label="Facebook" href="/"><svg viewBox="0 0 24 24" width="18" height="18">
5832                                <path fill="currentColor"
5833                                    d="M13.5 22v-8.2h2.7l.4-3.2h-3.1V8c0-.9.3-1.5 1.6-1.5H17V3.7c-.3 0-1.2-.1-2.2-.1-2.2 0-3.8 1.3-3.8 3.9v2.2H8v3.2h3v8.1h2.5Z" />
5834                            </svg></a>
5835                        <a aria-label="Instagram" href="/"><svg viewBox="0 0 24 24" width="18" height="18">
5836                                <path fill="currentColor"
5837                                    d="M7.8 2h8.4A5.8 5.8 0 0 1 22 7.8v8.4A5.8 5.8 0 0 1 16.2 22H7.8A5.8 5.8 0 0 1 2 16.2V7.8A5.8 5.8 0 0 1 7.8 2Zm0 2A3.8 3.8 0 0 0 4 7.8v8.4A3.8 3.8 0 0 0 7.8 20h8.4a3.8 3.8 0 0 0 3.8-3.8
5837V7.8A3.8 3.8 0 0 0 16.2 4H7.8Zm9.9 1.7a1.1 1.1 0 1 1 0 2.3 1.1 1.1 0 0 1 0-2.3ZM12 7a5 5 0 1 1 0 10 5 5 0 0 1 0-10Zm0 2a3 3 0 1 0 0 6 3 3 0 0 0 0-6Z" />
5838                            </svg></a>
5839                        <a aria-label="TikTok" href="/"><svg viewBox="0 0 24 24" width="18" height="18">
5840                                <path fill="currentColor"
5841                                    d="M18.9 7.4a6.4 6.4 0 0 1-3.2-1.2v6.3a5.47 5.47 0 1 1-5.5-5.5c.2 0 .4 0 .6.02v2.37a2.92 2.92 0 0 0-.6-.07 2.8 2.8 0 1 0 2.8 2.8V2h2.3a4.6 4.6 0 0 0 4.5 4.1v2.3Z" />
5842                            </svg></a>
5843                    </div>
5844                </div>
5845
5846                <!-- Collapsible Content Wrapper (Non-Homepage Only) -->
5847                <div class="ft-collapsible-content" id="ftCollapsible">
5848
5849                    <div class="ft-col">
5850                        <h4 class="ft-title">Tentang RAJAVIP</h4>
5851                        <ul class="ft-links">
5852                            <li><a href="https://moderntally.com/">Tentang
5853                                    Kami</a></li>
5854                            <li><a href="https://moderntally.com/">Kontak
5855                                    Kami</a></li>
5856                            <li><a href="https://moderntally.com/">Lokasi
5857                                    Toko</a></li>
5858                            <li><a href="https://moderntally.com/">FAQ</a>
5859                            </li>
5860                        </ul>
5861                        <div class="ft-address">
5862                            <p class="company">PT Raja Game.</p>
5863                            <p>JL. Raja Game Blok BB No. 12-A, Kel. RAJAVIP II,</p>
5864                            <p>Kec. Medan Area, Kota Medan, Sumatera Utara, 20216</p>
5865                        </div>
5866                    </div>
5867
5868                    <div class="ft-col">
5869                        <h4 class="ft-title">Informasi</h4>
5870                        <ul class="ft-links">
5871                            <li><a href="https://moderntally.com/">Syarat
5872                                    &amp; Ketentuan</a></li>
5873                            <li><a href="https://moderntally.com/">Kebijakan
5874                                    Privasi</a></li>
5875                            <li><a href="https://moderntally.com/">Kebijakan
5876                                    Cookie</a></li>
5877                            <li><a href="https://moderntally.com/">Pengiriman
5878                                    &amp; Pengembalian</a></li>
5879                            <li><a href="https://moderntally.com/">Pembayaran
5880                                    &amp; Cicilan</a></li>
5881                            <li><a href="https://moderntally.com/">Garansi
5882                                    &amp; Layanan</a></li>
5883                        </ul>
5884
5885                        <div class="ft-payments payments-small" aria-label="Metode Pembayaran">
5886                            <div class="pay-row">
5887                                <img src="https://moderntally.com/imagess/icon-rajavip.png" alt="Mandiri"
5888                                    loading="lazy">
5889                                <img src="https://moderntally.com/imagess/icon-rajavip.png" alt="BNI"
5890                                    loading="lazy">
5891                                <img src="https://moderntally.com/imagess/icon-rajavip.png" alt="BRI"
5892                                    loading="lazy">
5893                                <img src="https://moderntally.com/imagess/icon-rajavip.png" alt="BSI"
5894                                    loading="lazy">
5895                                <img src="https://moderntally.com/imagess/icon-rajavip.png"
5896                                    alt="ShopeePay" loading="lazy">
5897                            </div>
5898                        </div>
5899                    </div>
5900
5901                </div>
5902                <!-- End Collapsible Content -->
5903
5904                <!-- Expand Button (Mobile Only) -->
5905                <button class="ft-expand-btn" id="ftExpandBtn" aria-label="Lihat semua informasi footer">
5906                    <span class="expand-text">Selengkapnya</span>
5907                    <svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor">
5908                        <path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z" />
5909                    </svg>
5910                </button>
5911
5912            </div>
5913        </div>
5914        <div class="ft-bottom">
5915            <div class="container ft-bottom-inner">
5916                <div class="ft-copy">
5917                    <span>RAJAVIP &copy; <span id="yearNow">2026</span></span>
5918                    <span>PT RAJAVIP. All rights reserved.</span>
5919                </div>
5920            </div>
5921        </div>
5922
5923        <style nonce="se3iyzEHMc9FQEB4wSyd0w==">
5924            /* Chat Widget Styles - Lightweight & Minimal */
5925            .chat-widget {
5926                position: fixed;
5927                bottom: 20px;
5928                right: 20px;
5929                z-index: 9999;
5930                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5931            }
5932
5933            /* Hide floating button on mobile - use bottom nav instead */
5934            @media (max-width: 640px) {
5935                .chat-toggle-btn {
5936                    display: none !important;
5937                }
5938
5939                /* Ensure popup is still visible on mobile even when button is hidden */
5940                .chat-widget {
5941                    display: block !important;
5942                }
5943
5944                .chat-popup {
5945                    display: none;
5946                    /* Hidden by default, shown via JS */
5947                }
5948
5949                .chat-popup[style*="display: block"],
5950                .chat-popup[style*="display:block"] {
5951                    display: block !important;
5952                }
5953            }
5954
5955            .chat-toggle-btn {
5956                width: 60px;
5957                height: 60px;
5958                border-radius: 50%;
5959                background: linear-gradient(135deg, #F28C1A 0%, #D97809 100%);
5960                border: none;
5961                color: white;
5962                cursor: pointer;
5963                box-shadow: 0 4px 12px rgba(242, 140, 26, 0.3);
5964                position: relative;
5965                transition: transform 0.2s, box-shadow 0.2s;
5966            }
5967
5968            .chat-toggle-btn:hover {
5969                transform: scale(1.05);
5970                box-shadow: 0 6px 20px rgba(242, 140, 26, 0.4);
5971            }
5972
5973            #chat-toggle-btn .chat-icon {
5974                position: absolute;
5975                top: 50%;
5976                left: 50%;
5977                transform: translate(-50%, -50%);
5978                width: 28px !important;
5979                height: 28px !important;
5980            }
5981
5982            .chat-unread-badge {
5983                position: absolute;
5984                top: -5px;
5985                right: -5px;
5986                background: #ef4444;
5987                color: white;
5988                border-radius: 12px;
5989                padding: 2px 6px;
5990                font-size: 11px;
5991                font-weight: 600;
5992                min-width: 20px;
5993                text-align: center;
5994            }
5995
5996            .chat-popup {
5997                position: absolute;
5998                bottom: 80px;
5999                right: 0;
6000                width: 380px;
6001                max-width: calc(100vw - 40px);
6002                height: 500px;
6003                max-height: calc(100vh - 120px);
6004                background: white;
6005                border-radius: 12px;
6006                box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
6007                display: flex;
6008                flex-direction: column;
6009                overflow: hidden;
6010            }
6011
6012            .chat-popup-header {
6013                background: linear-gradient(135deg, #F28C1A 0%, #D97809 100%);
6014                color: white;
6015                padding: 16px 20px;
6016                display: flex;
6017                justify-content: space-between;
6018                align-items: center;
6019                flex-shrink: 0;
6020            }
6021
6022            .chat-header-title {
6023                display: flex;
6024                flex-direction: column;
6025                gap: 2px;
6026                min-height: 0;
6027            }
6028
6029            .chat-popup-header h3 {
6030                margin: 0;
6031                font-size: 18px;
6032                font-weight: 600;
6033                line-height: 1.2;
6034            }
6035
6036            .chat-operating-hours {
6037                font-size: 11px;
6038                opacity: 0.9;
6039                font-weight: 400;
6040                display: flex;
6041                align-items: center;
6042                gap: 4px;
6043                line-height: 1.2;
6044            }
6045
6046            .chat-operating-hours svg {
6047                width: 12px;
6048                height: 12px;
6049                opacity: 0.8;
6050                flex-shrink: 0;
6051            }
6052
6053            .chat-header-actions {
6054                display: flex;
6055                align-items: center;
6056                gap: 8px;
6057            }
6058
6059            /* Notification Toggle Button */
6060            .btn-notif-toggle {
6061                background: none;
6062                border: none;
6063                color: white;
6064                font-size: 18px;
6065                cursor: pointer;
6066                padding: 4px 8px;
6067                transition: all 0.2s;
6068                opacity: 0.8;
6069            }
6070
6071            .btn-notif-toggle:hover {
6072                opacity: 1;
6073                transform: scale(1.1);
6074            }
6075
6076            /* Icon states */
6077            .btn-notif-toggle[data-status="not-subscribed"] svg {
6078                opacity: 0.7;
6079            }
6080
6081            .btn-notif-toggle[data-status="not-subscribed"]:hover svg {
6082                opacity: 1;
6083            }
6084
6085            .btn-notif-toggle[data-status="subscribed"] svg {
6086                opacity: 1;
6087                animation: bellRing 2s ease-in-out;
6088            }
6089
6090            .btn-notif-toggle[data-status="blocked"] svg {
6091                color: #ff6b6b;
6092            }
6093
6094            .btn-notif-toggle[data-status="not-supported"] {
6095                display: none !important;
6096            }
6097
6098            @keyframes bellRing {
6099
6100                0%,
6101                100% {
6102                    transform: rotate(0deg);
6103                }
6104
6105                10%,
6106                30% {
6107                    transform: rotate(-10deg);
6108                }
6109
6110                20%,
6111                40% {
6112                    transform: rotate(10deg);
6113                }
6114            }
6115
6116            /* Notification Info Bar */
6117            .chat-notif-info-bar {
6118                position: absolute;
6119                top: 64px;
6120                left: 0;
6121                right: 0;
6122                background: linear-gradient(to right, #e3f2fd, #f5f5f5);
6123                border-bottom: 1px solid #bbdefb;
6124                padding: 8px 12px;
6125                display: flex;
6126                align-items: center;
6127                gap: 8px;
6128                font-size: 12px;
6129                color: #616161;
6130                z-index: 10;
6131                animation: slideDown 0.3s ease;
6132            }
6133
6134            .chat-notif-info-bar svg {
6135                flex-shrink: 0;
6136            }
6137
6138            .chat-notif-info-bar .small {
6139                flex: 1;
6140                line-height: 1.4;
6141            }
6142
6143            .chat-notif-info-bar .btn-dismiss {
6144                background: none;
6145                border: none;
6146                color: #9e9e9e;
6147                cursor: pointer;
6148                padding: 0 4px;
6149                font-size: 16px;
6150                transition: color 0.2s;
6151            }
6152
6153            .chat-notif-info-bar .btn-dismiss:hover {
6154                color: #616161;
6155            }
6156
6157            @keyframes slideDown {
6158                from {
6159                    max-height: 0;
6160                    opacity: 0;
6161                }
6162
6163                to {
6164                    max-height: 50px;
6165                    opacity: 1;
6166                }
6167            }
6168
6169            .chat-close-btn {
6170                background: none;
6171                border: none;
6172                color: white;
6173                font-size: 28px;
6174                line-height: 1;
6175                cursor: pointer;
6176                padding: 0;
6177                width: 30px;
6178                height: 30px;
6179            }
6180
6181            .chat-popup-body {
6182                flex: 1 1 auto;
6183                display: flex;
6184                flex-direction: column;
6185                min-height: 0;
6186                overflow: hidden;
6187                height: calc(100% - 64px);
6188                position: relative;
6189                transition: padding-top 0.3s ease;
6190            }
6191
6192            /* Add padding when info bar is visible */
6193            .chat-popup-body.has-info-bar {
6194                padding-top: 40px;
6195            }
6196
6197            .chat-view {
6198                flex: 1 1 auto;
6199                display: none;
6200                flex-direction: column;
6201                min-height: 0;
6202                overflow: hidden;
6203            }
6204
6205            #chat-list-view {
6206                display: flex;
6207            }
6208
6209            #chat-messages-view {
6210                display: none;
6211            }
6212
6213            #chat-messages-view.active {
6214                display: flex;
6215                flex-direction: column;
6216            }
6217
6218            #chat-new-view {
6219                display: none;
6220            }
6221
6222            #chat-new-view.active {
6223                display: flex;
6224            }
6225
6226            .chat-conversations-list {
6227                flex: 1;
6228                overflow-y: auto;
6229                padding: 0;
6230                background: white;
6231            }
6232
6233            /* Custom Scrollbar for Conversations List */
6234            .chat-conversations-list::-webkit-scrollbar {
6235                width: 6px;
6236            }
6237
6238            .chat-conversations-list::-webkit-scrollbar-track {
6239                background: #f1f1f1;
6240            }
6241
6242            .chat-conversations-list::-webkit-scrollbar-thumb {
6243                background: #F28C1A;
6244                border-radius: 3px;
6245            }
6246
6247            .chat-conversations-list::-webkit-scrollbar-thumb:hover {
6248                background: #D97809;
6249            }
6250
6251            /* Firefox */
6252            .chat-conversations-list {
6253                scrollbar-width: thin;
6254                scrollbar-color: #F28C1A #f1f1f1;
6255            }
6256
6257            .chat-conversation-item {
6258                padding: 12px 16px;
6259                cursor: pointer;
6260                display: flex;
6261                gap: 12px;
6262                align-items: flex-start;
6263                transition: background 0.15s ease;
6264                color: #1f2937;
6265                border-bottom: 1px solid #f0f0f0;
6266            }
6267
6268            .chat-conversation-item:hover {
6269                background: #f5f5f5;
6270            }
6271
6272            .chat-conversation-item.active {
6273                background: #FFF5EB;
6274            }
6275
6276            /* WhatsApp-like Avatar */
6277            .conversation-avatar {
6278                width: 48px;
6279                height: 48px;
6280                border-radius: 50%;
6281                background: linear-gradient(135deg, #F28C1A 0%, #D97809 100%);
6282                flex-shrink: 0;
6283                display: flex;
6284                align-items: center;
6285                justify-content: center;
6286                color: white;
6287                font-weight: 600;
6288                font-size: 18px;
6289            }
6290
6291            .conversation-avatar svg {
6292                width: 24px;
6293                height: 24px;
6294            }
6295
6296            /* WhatsApp-like Content */
6297            .conversation-content {
6298                flex: 1;
6299                min-width: 0;
6300                display: flex;
6301                flex-direction: column;
6302                gap: 4px;
6303            }
6304
6305            .conversation-header {
6306                display: flex;
6307                justify-content: space-between;
6308                align-items: center;
6309                gap: 8px;
6310            }
6311
6312            .conversation-name {
6313                font-weight: 600;
6314                font-size: 15px;
6315                color: #111;
6316                white-space: nowrap;
6317                overflow: hidden;
6318                text-overflow: ellipsis;
6319            }
6320
6321            .conversation-time {
6322                font-size: 12px;
6323                color: #667781;
6324                flex-shrink: 0;
6325            }
6326
6327            .conversation-preview {
6328                display: flex;
6329                justify-content: space-between;
6330                align-items: center;
6331                gap: 8px;
6332            }
6333
6334            .conversation-message {
6335                font-size: 14px;
6336                color: #667781;
6337                white-space: nowrap;
6338                overflow: hidden;
6339                text-overflow: ellipsis;
6340                margin: 0;
6341                flex: 1;
6342            }
6343
6344            .conversation-unread {
6345                background: #25D366;
6346                color: white;
6347                border-radius: 12px;
6348                padding: 2px 8px;
6349                font-size: 12px;
6350                font-weight: 600;
6351                min-width: 20px;
6352                text-align: center;
6353                flex-shrink: 0;
6354            }
6355
6356            /* Active item styling */
6357            .chat-conversation-item.active .conversation-name {
6358                color: #F28C1A;
6359            }
6360
6361            .chat-conversation-item.active .conversation-time {
6362                color: #F28C1A;
6363            }
6364
6365            .chat-new-btn {
6366                margin: 12px;
6367                padding: 12px;
6368                background: linear-gradient(135deg, #F28C1A 0%, #D97809 100%);
6369                color: white;
6370                border: none;
6371                border-radius: 8px;
6372                cursor: pointer;
6373                font-weight: 500;
6374                font-size: 14px;
6375                display: flex;
6376                align-items: center;
6377                justify-content: center;
6378                gap: 8px;
6379                transition: all 0.2s;
6380                flex-shrink: 0;
6381            }
6382
6383            .chat-new-btn:hover {
6384                transform: translateY(-1px);
6385                box-shadow: 0 4px 8px rgba(242, 140, 26, 0.3);
6386            }
6387
6388            .chat-conversation-title {
6389                flex: 1;
6390                font-weight: 600;
6391                font-size: 16px;
6392                color: #1f2937;
6393            }
6394
6395            .chat-messages-container {
6396                flex: 1;
6397                overflow-y: auto;
6398                padding: 16px;
6399                display: flex;
6400                flex-direction: column;
6401                gap: 8px;
6402                min-height: 0;
6403                background: #E5DDD5;
6404            }
6405
6406            /* Custom Scrollbar for Messages Container */
6407            .chat-messages-container::-webkit-scrollbar {
6408                width: 6px;
6409            }
6410
6411            .chat-messages-container::-webkit-scrollbar-track {
6412                background: rgba(0, 0, 0, 0.05);
6413            }
6414
6415            .chat-messages-container::-webkit-scrollbar-thumb {
6416                background: rgba(242, 140, 26, 0.6);
6417                border-radius: 3px;
6418            }
6419
6420            .chat-messages-container::-webkit-scrollbar-thumb:hover {
6421                background: #F28C1A;
6422            }
6423
6424            /* Firefox */
6425            .chat-messages-container {
6426                scrollbar-width: thin;
6427                scrollbar-color: rgba(242, 140, 26, 0.6) rgba(0, 0, 0, 0.05);
6428            }
6429
6430            /* WhatsApp Group-like Messages */
6431            .chat-message {
6432                display: flex;
6433                margin-bottom: 4px;
6434                animation: fadeIn 0.2s ease;
6435            }
6436
6437            @keyframes fadeIn {
6438                from {
6439                    opacity: 0;
6440                    transform: translateY(10px);
6441                }
6442
6443                to {
6444                    opacity: 1;
6445                    transform: translateY(0);
6446                }
6447            }
6448
6449            .chat-message.mine {
6450                justify-content: flex-end;
6451            }
6452
6453            .chat-message-bubble {
6454                max-width: 80%;
6455                padding: 6px 8px 8px 10px;
6456                border-radius: 8px;
6457                position: relative;
6458                box-shadow: 0 1px 0.5px rgba(0, 0, 0, 0.13);
6459            }
6460
6461            /* Bubble from others (Admin/CS) */
6462            .chat-message:not(.mine) .chat-message-bubble {
6463                background: #FFFFFF;
6464                border-radius: 0 8px 8px 8px;
6465            }
6466
6467            /* Bubble tail for others */
6468            .chat-message:not(.mine) .chat-message-bubble::before {
6469                content: '';
6470                position: absolute;
6471                top: 0;
6472                left: -8px;
6473                width: 0;
6474                height: 0;
6475                border-style: solid;
6476                border-width: 0 8px 13px 0;
6477                border-color: transparent #FFFFFF transparent transparent;
6478            }
6479
6480            /* Bubble from user (mine) */
6481            .chat-message.mine .chat-message-bubble {
6482                background: #D0E8F5;
6483                /* Light blue for user messages */
6484                border-radius: 8px 0 8px 8px;
6485            }
6486
6487            /* Bubble tail for mine */
6488            .chat-message.mine .chat-message-bubble::before {
6489                content: '';
6490                position: absolute;
6491                top: 0;
6492                right: -8px;
6493                width: 0;
6494                height: 0;
6495                border-style: solid;
6496                border-width: 0 0 13px 8px;
6497                border-color: transparent transparent transparent #D0E8F5;
6498            }
6499
6500            .message-sender {
6501                font-size: 12.5px;
6502                font-weight: 600;
6503                color: #F28C1A !important;
6504                margin-bottom: 4px;
6505            }
6506
6507            .chat-message.mine .message-sender {
6508                display: none;
6509            }
6510
6511            /* Message text */
6512            .message-text {
6513                font-size: 14px;
6514                line-height: 19px;
6515                color: #000000 !important;
6516                word-wrap: break-word;
6517                white-space: pre-wrap;
6518                margin-bottom: 4px;
6519            }
6520
6521            /* Message metadata (time + status) */
6522            .message-meta {
6523                display: flex;
6524                align-items: center;
6525                justify-content: flex-end;
6526                gap: 4px;
6527                margin-top: 2px;
6528            }
6529
6530            .message-time {
6531                font-size: 11px;
6532                color: #667781 !important;
6533                line-height: 15px;
6534            }
6535
6536            /* Use multiple selectors to override global styles */
6537            .chat-message-bubble .message-status,
6538            .message-meta .message-status,
6539            .chat-message .message-status {
6540                width: 16px !important;
6541                height: 16px !important;
6542                min-width: 16px !important;
6543                min-height: 16px !important;
6544                max-width: 16px !important;
6545                max-height: 16px !important;
6546                flex-shrink: 0;
6547                color: #667781 !important;
6548                fill: currentColor !important;
6549            }
6550
6551            .chat-message:not(.mine) .message-status {
6552                display: none;
6553            }
6554
6555            /* Loading dots animation */
6556            @keyframes loadingDots {
6557
6558                0%,
6559                20% {
6560                    content: '.';
6561                }
6562
6563                40% {
6564                    content: '..';
6565                }
6566
6567                60%,
6568                100% {
6569                    content: '...';
6570                }
6571            }
6572
6573            .message-status.loading::after {
6574                content: '...';
6575                animation: loadingDots 1.5s infinite;
6576                font-size: 16px;
6577                line-height: 16px;
6578            }
6579
6580            .message-status.loading path {
6581                display: none;
6582            }
6583
6584            .message-status.failed {
6585                color: #ef4444 !important;
6586                cursor: pointer;
6587            }
6588
6589            .message-status.sent {
6590                color: #667781 !important;
6591            }
6592
6593            .chat-new-form {
6594                flex: 1;
6595                overflow-y: auto;
6596                padding: 16px;
6597                display: flex;
6598                flex-direction: column;
6599            }
6600
6601            .chat-new-form form {
6602                display: flex;
6603                flex-direction: column;
6604                gap: 16px;
6605                flex: 1;
6606            }
6607
6608            .chat-new-form .form-group {
6609                display: flex;
6610                flex-direction: column;
6611                gap: 6px;
6612            }
6613
6614            .chat-new-form label {
6615                font-size: 14px;
6616                font-weight: 500;
6617                color: #374151;
6618            }
6619
6620            .chat-new-form .form-control {
6621                width: 100%;
6622                padding: 10px 12px;
6623                border: 1px solid #d1d5db;
6624                border-radius: 8px;
6625                font-size: 14px;
6626                font-family: inherit;
6627                transition: border-color 0.2s;
6628                box-sizing: border-box;
6629            }
6630
6631            .chat-new-form .form-control:focus {
6632                outline: none;
6633                border-color: #F28C1A;
6634                box-shadow: 0 0 0 3px rgba(242, 140, 26, 0.1);
6635            }
6636
6637            .chat-new-form textarea.form-control {
6638                resize: vertical;
6639                min-height: 100px;
6640            }
6641
6642            .chat-new-form .btn {
6643                padding: 12px 20px;
6644                border: none;
6645                border-radius: 8px;
6646                font-size: 15px;
6647                font-weight: 500;
6648                cursor: pointer;
6649                transition: all 0.2s;
6650                text-align: center;
6651            }
6652
6653            .chat-new-form .btn-primary {
6654                background: linear-gradient(135deg, #F28C1A 0%, #D97809 100%);
6655                color: white;
6656            }
6657
6658            .chat-new-form .btn-primary:hover {
6659                transform: translateY(-1px);
6660                box-shadow: 0 4px 8px rgba(242, 140, 26, 0.3);
6661            }
6662
6663            .chat-new-form .btn-primary:active {
6664                transform: scale(0.98);
6665            }
6666
6667            .chat-new-form .btn-block {
6668                width: 100%;
6669                margin-top: auto;
6670            }
6671
6672            .chat-message-form {
6673                padding: 12px;
6674                border-top: 1px solid #e5e7eb;
6675                display: flex;
6676                flex-wrap: wrap;
6677                gap: 8px;
6678                align-items: flex-end;
6679                flex-shrink: 0;
6680                background: white;
6681            }
6682
6683            .chat-product-card {
6684                flex: 1 1 100%;
6685                max-width: 100%;
6686                display: flex;
6687                gap: 12px;
6688                padding: 12px;
6689                background: #f3f4f6;
6690                border-radius: 8px;
6691                margin-bottom: 4px;
6692                border: 1px solid #e5e7eb;
6693            }
6694
6695            .chat-product-card img {
6696                width: 60px;
6697                height: 60px;
6698                object-fit: cover;
6699                border-radius: 6px;
6700                flex-shrink: 0;
6701            }
6702
6703            .chat-product-card-content {
6704                flex: 1;
6705                min-width: 0;
6706            }
6707
6708            .chat-product-card-name {
6709                font-weight: 500;
6710                font-size: 14px;
6711                color: #1f2937;
6712                margin-bottom: 4px;
6713                white-space: nowrap;
6714                overflow: hidden;
6715                text-overflow: ellipsis;
6716            }
6717
6718            .chat-product-card-variant {
6719                font-size: 12px;
6720                color: #6b7280;
6721                margin-bottom: 4px;
6722            }
6723
6724            .chat-product-card-price {
6725                font-size: 13px;
6726                color: #667eea;
6727                font-weight: 600;
6728            }
6729
6730            .chat-product-card-remove {
6731                align-self: flex-start;
6732                background: none;
6733                border: none;
6734                color: #9ca3af;
6735                cursor: pointer;
6736                padding: 4px;
6737                font-size: 18px;
6738                line-height: 1;
6739                transition: color 0.2s;
6740            }
6741
6742            .chat-product-card-remove:hover {
6743                color: #ef4444;
6744            }
6745
6746            /* Product card in messages (read-only display) */
6747            .message-product-card {
6748                display: flex;
6749                gap: 10px;
6750                padding: 10px;
6751                background: rgba(255, 255, 255, 0.5);
6752                border-radius: 8px;
6753                margin-bottom: 6px;
6754                border: 1px solid rgba(0, 0, 0, 0.08);
6755                align-items: center;
6756            }
6757
6758            .chat-message.mine .message-product-card {
6759                background: rgba(255, 255, 255, 0.7);
6760            }
6761
6762            .message-product-card img {
6763                width: 50px;
6764                height: 50px;
6765                object-fit: cover;
6766                border-radius: 6px;
6767                flex-shrink: 0;
6768            }
6769
6770            .message-product-info {
6771                flex: 1;
6772                min-width: 0;
6773            }
6774
6775            .message-product-name {
6776                font-weight: 500;
6777                font-size: 13px;
6778                color: #1f2937;
6779                margin-bottom: 2px;
6780                overflow: hidden;
6781                text-overflow: ellipsis;
6782                display: -webkit-box;
6783                -webkit-line-clamp: 2;
6784                -webkit-box-orient: vertical;
6785                line-height: 1.3;
6786            }
6787
6788            .message-product-variant {
6789                font-size: 11px;
6790                color: #6b7280;
6791                margin-bottom: 2px;
6792            }
6793
6794            .message-product-price {
6795                font-size: 12px;
6796                color: #667eea;
6797                font-weight: 600;
6798            }
6799
6800            .message-product-link {
6801                flex-shrink: 0;
6802                width: 32px;
6803                height: 32px;
6804                display: flex;
6805                align-items: center;
6806                justify-content: center;
6807                background: rgba(102, 126, 234, 0.1);
6808                border-radius: 6px;
6809                color: #667eea;
6810                text-decoration: none;
6811                transition: all 0.2s;
6812            }
6813
6814            .message-product-link:hover {
6815                background: #667eea;
6816                color: white;
6817            }
6818
6819            .message-product-link svg {
6820                width: 16px;
6821                height: 16px;
6822            }
6823
6824            .chat-message-input {
6825                flex: 1;
6826                border: 1px solid #d1d5db;
6827                border-radius: 20px;
6828                padding: 10px 16px;
6829                resize: none;
6830                max-height: 100px;
6831                font-family: inherit;
6832                font-size: 14px;
6833                line-height: 1.5;
6834                box-sizing: border-box;
6835                overflow-y: hidden;
6836            }
6837
6838            .chat-message-input:focus {
6839                outline: none;
6840                border-color: #F28C1A;
6841                box-shadow: 0 0 0 3px rgba(242, 140, 26, 0.1);
6842            }
6843
6844            .chat-send-btn {
6845                width: 40px;
6846                height: 40px;
6847                border-radius: 50%;
6848                background: linear-gradient(135deg, #F28C1A 0%, #D97809 100%);
6849                border: none;
6850                color: white;
6851                cursor: pointer;
6852                flex-shrink: 0;
6853                display: flex;
6854                align-items: center;
6855                justify-content: center;
6856                transition: all 0.2s;
6857            }
6858
6859            .chat-send-btn:hover {
6860                transform: scale(1.05);
6861                box-shadow: 0 2px 8px rgba(242, 140, 26, 0.3);
6862            }
6863
6864            .chat-send-btn:active {
6865                transform: scale(0.95);
6866            }
6867
6868            .chat-loading {
6869                text-align: center;
6870                padding: 20px;
6871                color: #6b7280;
6872            }
6873
6874            /* Date Separator (WhatsApp-style) */
6875            .date-separator {
6876                display: flex;
6877                align-items: center;
6878                gap: 12px;
6879                margin: 24px 0 16px;
6880                opacity: 0;
6881                animation: fadeInSeparator 0.3s ease forwards;
6882            }
6883
6884            @keyframes fadeInSeparator {
6885                from {
6886                    opacity: 0;
6887                    transform: translateY(-10px);
6888                }
6889
6890                to {
6891                    opacity: 1;
6892                    transform: translateY(0);
6893                }
6894            }
6895
6896            .date-separator-line {
6897                flex: 1;
6898                height: 1px;
6899                background: linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.1) 50%, transparent);
6900            }
6901
6902            .date-separator-text {
6903                flex-shrink: 0;
6904                padding: 4px 12px;
6905                background: #e9ecef;
6906                color: #6c757d;
6907                font-size: 11px;
6908                font-weight: 600;
6909                text-transform: uppercase;
6910                letter-spacing: 0.5px;
6911                border-radius: 12px;
6912                box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
6913            }
6914
6915            /* Mobile responsive */
6916            @media (max-width: 640px) {
6917                .chat-popup {
6918                    position: fixed !important;
6919                    /* Override absolute positioning */
6920                    bottom: 45px !important;
6921                    /* Above bottom nav */
6922                    right: 0 !important;
6923                    left: 0 !important;
6924                    width: 100% !important;
6925                    max-width: 100% !important;
6926                    /* Use dvh (dynamic viewport height) for browser UI awareness */
6927                    height: calc(100dvh - 45px) !important;
6928                    max-height: calc(100dvh - 45px) !important;
6929                    /* Fallback for browsers that don't support dvh */
6930                    height: calc(var(--viewport-height, 100vh) - 45px) !important;
6931                    max-height: calc(var(--viewport-height, 100vh) - 45px) !important;
6932                    border-radius: 0 !important;
6933                    z-index: 9999 !important;
6934                }
6935
6936                .chat-popup-header {
6937                    border-radius: 0;
6938                }
6939
6940                .chat-messages-container,
6941                .chat-conversations-list {
6942                    /* Adjust for mobile keyboard using dynamic viewport */
6943                    max-height: calc(100dvh - 190px);
6944                    /* Fallback for browsers that don't support dvh */
6945                    max-height: calc(var(--viewport-height, 100vh) - 190px);
6946                }
6947            }
6948        </style>
6949        <!-- Chat Widget Button -->
6950        <div id="chat-widget" class="chat-widget" data-user-id="" data-is-logged-in="false"
6951            data-csrf-token="df5d776748b1ed8c8dd0d987bae99b1ee3dea6c6dcbe0eedb1bea766c56d569a">
6952
6953            <span id="chat-unread-badge" class="chat-unread-badge" style="display: none;">0</span>
6954            </button>
6955
6956            <div id="chat-popup" class="chat-popup" style="display: none;">
6957                <div class="chat-popup-header">
6958                    <div class="chat-header-title">
6959                        <h3>Bantuan</h3>
6960                        <span id="chatOperatingHours" class="chat-operating-hours" style="display: none;"></span>
6961                    </div>
6962                    <div class="chat-header-actions">
6963                        <button id="chatNotifToggle" class="btn-notif-toggle" data-status="not-supported"
6964                            title="Push notification" style="display: none;">
6965                            <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
6966                                <path
6967                                    d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z" />
6968                            </svg>
6969                        </button>
6970                        <button id="chat-close-btn" class="chat-close-btn" aria-label="Close chat">×</button>
6971                    </div>
6972                </div>
6973
6974                <!-- Notification Info Bar (conditional) -->
6975                <div class="chat-notif-info-bar" id="chatNotifInfoBar" style="display:none;">
6976                    <svg width="14" height="14" viewBox="0 0 24 24" fill="#ffc107">
6977                        <path
6978                            d="M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z" />
6979                    </svg>
6980                    <span class="small">Aktifkan notifikasi untuk pemberitahuan balasan</span>
6981                    <button class="btn-dismiss" onclick="ChatNotification.dismissInfo()">✕</button>
6982                </div>
6983
6984                <div class="chat-popup-body">
6985                    <!-- Conversations List View -->
6986                    <div id="chat-list-view" class="chat-view">
6987                        <div id="chat-conversations-list" class="chat-conversations-list">
6988                            <div class="chat-loading">Memuat...</div>
6989                            <!-- Conversation Item Structure (rendered by JS):
6990                            <div class="chat-conversation-item">
6991                                <div class="conversation-avatar">
6992                                    <svg>...</svg>
6993                                </div>
6994                                <div class="conversation-content">
6995                                    <div class="conversation-header">
6996                                        <span class="conversation-name">Admin Support</span>
6997                                        <span class="conversation-time">10:30</span>
6998                                    </div>
6999                                    <div class="conversation-preview">
7000                                        <p class="conversation-message">Terima kasih telah menghubungi kami...</p>
7001                                        <span class="conversation-unread">2</span>
7002                                    </div>
7003                                </div>
7004                            </div>
7005                            -->
7006                        </div>
7007                        <button id="chat-new-btn" class="chat-new-btn">
7008                            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor"
7009                                stroke-width="2">
7010                                <line x1="12" y1="5" x2="12" y2="19"></line>
7011                                <line x1="5" y1="12" x2="19" y2="12"></line>
7012                            </svg>
7013                            Percakapan Baru
7014                        </button>
7015                    </div>
7016
7017                    <!-- Chat Messages View -->
7018                    <div id="chat-messages-view" class="chat-view" style="display: none;">
7019                        <div id="chat-messages-container" class="chat-messages-container">
7020                            <div class="chat-loading">Memuat pesan...</div>
7021                            <!-- Message Structure (rendered by JS):
7022                            <div class="chat-message"> (or .chat-message.mine)
7023                                <div class="chat-message-bubble">
7024                                    <div class="message-sender">Admin Support</div> (only for non-mine)
7025                                    <div class="message-text">Halo, ada yang bisa dibantu?</div>
7026                                    <div class="message-meta">
7027                                        <span class="message-time">10:30</span>
7028                                        <svg class="message-status">...</svg> (only for mine)
7029                                    </div>
7030                                </div>
7031                            </div>
7032                            -->
7033                        </div>
7034
7035                        <form id="chat-message-form" class="chat-message-form">
7036                            <input type="hidden" id="chat-current-conversation-id" value="">
7037                            <textarea id="chat-message-input" class="chat-message-input" placeholder="Ketik pesan..."
7038                                rows="1" maxlength="5000"></textarea>
7039                            <button type="submit" class="chat-send-btn" aria-label="Send message">
7040                                <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor"
7041                                    stroke-width="2">
7042                                    <line x1="22" y1="2" x2="11" y2="13"></line>
7043                                    <polygon points="22 2 15 22 11 13 2 9 22 2"></polygon>
7044                                </svg>
7045                            </button>
7046                        </form>
7047                    </div>
7048
7049                    <!-- New Chat View -->
7050                    <div id="chat-new-view" class="chat-view" style="display: none;">
7051                        <div class="chat-messages-header">
7052                            <button id="chat-new-back-btn" class="chat-back-btn" aria-label="Back to list">
7053                                <svg width="16" height="16" viewB
7053ox="0 0 24 24" fill="none" stroke="currentColor"
7054                                    stroke-width="2">
7055                                    <path d="M19 12H5M12 19l-7-7 7-7" />
7056                                </svg>
7057                            </button>
7058                            <div class="chat-conversation-title">Percakapan Baru</div>
7059                        </div>
7060
7061                        <div class="chat-new-form">
7062                            <form id="chat-start-form">
7063                                <div class="form-group">
7064                                    <label for="chat-new-subject">Subjek</label>
7065                                    <input type="text" id="chat-new-subject" class="form-control"
7066                                        placeholder="Bantuan Pelanggan" maxlength="255">
7067                                </div>
7068                                <div class="form-group">
7069                                    <label for="chat-new-message">Pesan</label>
7070                                    <textarea id="chat-new-message" class="form-control" rows="4"
7071                                        placeholder="Tulis pertanyaan Anda..." required maxlength="5000"></textarea>
7072                                </div>
7073                                <button type="submit" class="btn btn-primary btn-block">Kirim</button>
7074                            </form>
7075                        </div>
7076                    </div>
7077                </div>
7078            </div>
7079        </div>
7080
7081        <!-- Login Required Modal -->
7082        <div class="modal-overlay" id="chatLoginModal">
7083            <div class="modal-dialog">
7084                <div class="modal-header">
7085                    <h3 class="modal-title">
7086                        <div class="modal-icon info">
7087                            <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7088                                <path
7089                                    d="M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z" />
7090                            </svg>
7091                        </div>
7092                        Login Diperlukan
7093                    </h3>
7094                </div>
7095                <div class="modal-body">
7096                    <p class="modal-message">Anda harus login terlebih dahulu untuk menggunakan fitur chat bantuan
7097                        pelanggan.</p>
7098                    <div class="modal-actions">
7099                        <button class="modal-btn modal-btn-secondary" id="chatLoginCancel">Batal</button>
7100                        <button class="modal-btn modal-btn-primary" id="chatLoginConfirm">Login Sekarang</button>
7101                    </div>
7102                </div>
7103            </div>
7104        </div>
7105        
7105<script src="https://plazaitdotid.pages.dev/assets/js/chat-widget.js" nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
7105
7106        
7106<script src="https://plazaitdotid.pages.dev/assets/js/chat-notification.js" nonce="se3iyzEHMc9FQEB4wSyd0w==">
7107        </script>
7107
7108        <!-- Footer Collapse Toggle Script -->
7109        
7109<script nonce="se3iyzEHMc9FQEB4wSyd0w==">
7110            document.addEventListener('DOMContentLoaded', function () {
7111                const ftTop = document.getElementById('ftTop');
7112                const expandBtn = document.getElementById('ftExpandBtn');
7113
7114                if (ftTop && expandBtn) {
7115                    const expandText = expandBtn.querySelector('.expand-text');
7116
7117                    expandBtn.addEventListener('click', function () {
7118                        ftTop.classList.toggle('expanded');
7119                        const isExpanded = ftTop.classList.contains('expanded');
7120                        if (expandText) {
7121                            expandText.textContent = isExpanded ? 'Sembunyikan' : 'Selengkapnya';
7122                        }
7123                    });
7124                }
7125            });
7126        </script>
7126
7127    </footer>
7128
7129    <!-- Compare Sidebar Overlay -->
7130    <div class="compare-overlay" id="compareOverlay"></div>
7131
7132    <!-- Floating Compare Badge (Sticky) -->
7133    <button class="compare-floating-badge" id="compareFloatingBadge" aria-label="Lihat produk yang dibandingkan"
7134        style="display:none;">
7135        <svg class="cfb-icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
7136            <path d="M9.01 14H2v2h7.01v3L13 15l-3.99-4v3zm5.98-1v-3H22V8h-7.01V5L11 9l3.99 4z" />
7137        </svg>
7138        <span class="cfb-text">Bandingkan</span>
7139        <span class="cfb-count" id="cfbCount">0</span>
7140    </button>
7141
7142    <!-- AI Comparison Modal -->
7143    <div class="ai-compare-modal" id="aiCompareModal">
7144        <div class="modal-backdrop"></div>
7145        <div class="modal-container">
7146            <div class="modal-header">
7147                <h3 class="modal-title">
7148                    <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
7149                        <path
7150                            d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4M11,16.5L18,9.5L16.59,8.09L11,13.67L7.91,10.59L6.5,12L11,16.5Z" />
7151                    </svg>
7152                    Analisis AI: Perbandingan Produk
7153                </h3>
7154                <button class="modal-close" id="aiCompareModalClose" aria-label="Tutup">
7155                    <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7156                        <path
7157                            d="M18.3 5.7a1 1 0 0 0-1.4 0L12 10.6 7.1 5.7a1 1 0 1 0-1.4 1.4L10.6 12l-4.9 4.9a1 1 0 0 0 1.4 1.4L12 13.4l4.9 4.9a1 1 0 0 0 1.4-1.4L13.4 12l4.9-4.9a1 1 0 0 0 0-1.4z" />
7158                    </svg>
7159                </button>
7160            </div>
7161
7162            <div class="modal-content">
7163                <!-- Loading State -->
7164                <div class="ai-loading" id="aiLoading">
7165                    <div class="loading-animation">
7166                        <div class="typing-indicator">
7167                            <span></span>
7168                            <span></span>
7169                            <span></span>
7170                        </div>
7171                        <p>AI sedang menganalisis produk...</p>
7172                        <small>Proses ini membutuhkan waktu 10-30 detik</small>
7173                    </div>
7174                </div>
7175
7176                <!-- Error State -->
7177                <div class="ai-error" id="aiError" hidden>
7178                    <div class="error-icon">
7179                        <svg width="48" height="48" viewBox="0 0 24 24" fill="#ef4444">
7180                            <path
7181                                d="M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z" />
7182                        </svg>
7183                    </div>
7184                    <h4>Analisis AI Gagal</h4>
7185                    <p id="aiErrorMessage">Terjadi kesalahan saat memproses analisis.</p>
7186                    <button class="btn btn-outline-primary" id="aiRetry">Coba Lagi</button>
7187                </div>
7188
7189                <!-- Analysis Results -->
7190                <div class="ai-results" id="aiResults" hidden>
7191                    <!-- Summary Section -->
7192                    <div class="ai-summary-card">
7193                        <h4>
7194                            <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7195                                <path
7196                                    d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z" />
7197                            </svg>
7198                            Ringkasan Analisis
7199                        </h4>
7200                        <p id="aiSummary" class="summary-text"></p>
7201                        <div class="winner-badge" id="winnerBadge">
7202                            <strong>Rekomendasi Terbaik:</strong> <span id="winnerProduct"></span>
7203                            <small id="winnerReason"></small>
7204                        </div>
7205                    </div>
7206
7207                    <!-- Comparison Table -->
7208                    <div class="ai-comparison-table">
7209                        <h4>
7210                            <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7211                                <path d="M3,3H21V5H3V3M3,7H21V9H3V7M3,11H21V13H3V11M3,15H21V17H3V15M3,19H21V21H3V19Z" />
7212                            </svg>
7213                            Perbandingan Detail
7214                        </h4>
7215                        <div id="comparisonTable" class="comparison-grid"></div>
7216                    </div>
7217
7218                    <!-- Detailed Analysis -->
7219                    <div class="ai-detailed-analysis">
7220                        <h4>
7221                            <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7222                                <path
7223                                    d="M14,2A8,8 0 0,1 22,10A8,8 0 0,1 14,18A8,8 0 0,1 6,10A8,8 0 0,1 14,2M14,4A6,6 0 0,0 8,10A6,6 0 0,0 14,16A6,6 0 0,0 20,10A6,6 0 0,0 14,4M14,6A4,4 0 0,1 18,10A4,4 0 0,1 14,14A4,4 0 0,1 10,10A4,4 0 0,1 14,6M14,8A2,2 0 0,0 12,10A2,2 0 0,0 14,12A2,2 0 0,0 16,10A2,2 0 0,0 14,8Z" />
7224                            </svg>
7225                            Analisis Mendalam
7226                        </h4>
7227                        <div id="detailedAnalysis" class="products-analysis"></div>
7228                    </div>
7229
7230                    <!-- Recommendations -->
7231                    <div class="ai-recommendations">
7232                        <h4>
7233                            <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7234                                <path
7235                                    d="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z" />
7236                            </svg>
7237                            Rekomendasi Berdasarkan Kebutuhan
7238                        </h4>
7239                        <div class="recommendations-grid">
7240                            <div class="recommendation-card">
7241                                <h5>💰 Budget Conscious</h5>
7242                                <p id="budgetRecommendation"></p>
7243                            </div>
7244                            <div class="recommendation-card">
7245                                <h5>⚡ Performance Focused</h5>
7246                                <p id="performanceRecommendation"></p>
7247                            </div>
7248                            <div class="recommendation-card">
7249                                <h5>⚖️ Balanced Choice</h5>
7250                                <p id="balancedRecommendation"></p>
7251                            </div>
7252                        </div>
7253                    </div>
7254
7255                    <!-- Buying Tips -->
7256                    <div class="ai-tips">
7257                        <h4>
7258                            <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7259                                <path
7260                                    d="M11,18H13V16H11V18M12,6A4,4 0 0,0 8,10H10A2,2 0 0,1 12,8A2,2 0 0,1 14,10C14,12 11,11.75 11,15H13C13,12.75 16,12.5 16,10A4,4 0 0,0 12,6
7260M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z" />
7261                            </svg>
7262                            Tips Pembelian
7263                        </h4>
7264                        <ul id="buyingTips" class="tips-list"></ul>
7265                    </div>
7266                </div>
7267            </div>
7268        </div>
7269    </div>
7270
7271    <!-- Cart Login Modal -->
7272    <div class="modal-overlay" id="cartLoginModal">
7273        <div class="modal-dialog">
7274            <div class="modal-header">
7275                <h3 class="modal-title">
7276                    <div class="modal-icon info">
7277                        <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
7278                            <path
7279                                d="M17,18A2,2 0 0,1 19,20A2,2 0 0,1 17,22C15.89,22 15,21.1 15,20C15,18.89 15.89,18 17,18M1,2H4.27L5.21,4H20A1,1 0 0,1 21,5C21,5.17 20.95,5.34 20.88,5.5L17.3,11.97C16.96,12.58 16.3,13 15.55,13H8.1L7.2,14.63L7.17,14.75A0.25,0.25 0 0,0 7.42,15H19V17H7C5.89,17 5,16.1 5,15C5,14.65 5.09,14.32 5.24,14.04L6.6,11.59L3,4H1V2M7,18A2,2 0 0,1 9,20A2,2 0 0,1 7,22C5.89,22 5,21.1 5,20C5,18.89 5.89,18 7,18M16,11L18.78,6H6.14L8.5,11H16Z" />
7280                        </svg>
7281                    </div>
7282                    Login untuk Melanjutkan
7283                </h3>
7284            </div>
7285            <div class="modal-body">
7286                <p class="modal-message" style="margin-bottom: 16px;">Silakan login atau daftar untuk mengakses
7287                    keranjang belanja dan menyelesaikan pesanan Anda.</p>
7288                <div style="background: #f8fafc; border-radius: 8px; padding: 12px; margin-bottom: 20px;">
7289                    <p style="font-size: 14px; color: #475569; margin: 0; line-height: 1.6;">
7290                        <strong style="color: #0f172a;">Keuntungan dengan akun:</strong><br>
7291                        ✓ Simpan keranjang belanja Anda<br>
7292                        ✓ Lacak status pesanan secara real-time<br>
7293                        ✓ Checkout lebih cepat dengan data tersimpan<br>
7294                        ✓ Dapatkan notifikasi promo & diskon eksklusif
7295                    </p>
7296                </div>
7297                <div class="modal-actions">
7298                    <button class="modal-btn modal-btn-secondary" id="cartLoginCancel">Batal</button>
7299                    <button class="modal-btn modal-btn-primary" id="cartLoginConfirm"
7300                        style="background: #ff6b35; border-color: #ff6b35;">Login</button>
7301                    <button class="modal-btn modal-btn-primary" id="cartRegisterBtn"
7302                        style="background: #f7931e; border-color: #f7931e;">Daftar</button>
7303                </div>
7304            </div>
7305        </div>
7306    </div>
7307
7308
7309    
7309<script src="https://plazaitdotid.pages.dev/assets/js/app.js" nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
7309
7310    
7310<script src="https://plazaitdotid.pages.dev/assets/js/site-notice.js" nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
7310
7311    
7311<script src="https://plazaitdotid.pages.dev/assets/js/guest-cart.js" nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
7311
7312    
7312<script src="https://plazaitdotid.pages.dev/assets/js/cart.js" nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
7312
7313    
7313<script defer src="https://plazaitdotid.pages.dev/assets/js/mega-menu-tiles.js" nonce="se3iyzEHMc9FQEB4wSyd0w==">
7314    </script>
7314
7315    
7315<script src="https://plazaitdotid.pages.dev/assets/js/benchmark.js" nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
7315
7316    
7316<script src="https://plazaitdotid.pages.dev/assets/js/product-compare.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w==">
7317    </script>
7317
7318    
7318<script src="https://plazaitdotid.pages.dev/assets/js/product-card-actions.js" defer
7319        nonce="se3iyzEHMc9FQEB4wSyd0w=="></script>
7319
7320    
7320<script src="https://plazaitdotid.pages.dev/assets/js/prsementara layanan bantuanoduct-reviews.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w==">
7321    </script>
7321
7322    
7322<script src="https://plazaitdotid.pages.dev/assets/js/review-submission.js" defer nonce="se3iyzEHMc9FQEB4wSyd0w==">
7323    </script>
7323
7324    
7324<script defer
7325        src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516"
7326        integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg=="
7327        data-cf-beacon='{"version":"2024.11.0","token":"c6e2065ed8664545b4545e771552f98c","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}'
7328        crossorigin="anonymous"></script>
vendor: 2 bytes, line 7328
7328
7329<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"294f0486cfc64bde901ddfa41a2cf382","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7329
7329
7330<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"1a260f871e264b7d808bfbfddc3c619b","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7330
7330
7331<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"1a260f871e264b7d808bfbfddc3c619b","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7331
7331
7332<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"1a260f871e264b7d808bfbfddc3c619b","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7332
7332
7333<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"1a260f871e264b7d808bfbfddc3c619b","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7333
7333
7334<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v833ccba57c9e4d2798f2e76cebdd09a11778172276447" integrity="sha512-57MDmcccJXYtNnH+ZiBwzC4jb2rvgVCEokYN+L/nLlmO8rfYT/gIpW2A569iJ/3b+0UEasghjuZH/ma3wIs/EQ==" data-cf-beacon='{"version":"2024.11.0","token":"241daa48cc9e4e698656eb829b6023ac","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7334
7334
7335<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v833ccba57c9e4d2798f2e76cebdd09a11778172276447" integrity="sha512-57MDmcccJXYtNnH+ZiBwzC4jb2rvgVCEokYN+L/nLlmO8rfYT/gIpW2A569iJ/3b+0UEasghjuZH/ma3wIs/EQ==" data-cf-beacon='{"version":"2024.11.0","token":"ab1caf73dcc24051805c9250a712ec79","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7335
7335
7336<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v833ccba57c9e4d2798f2e76cebdd09a11778172276447" integrity="sha512-57MDmcccJXYtNnH+ZiBwzC4jb2rvgVCEokYN+L/nLlmO8rfYT/gIpW2A569iJ/3b+0UEasghjuZH/ma3wIs/EQ==" data-cf-beacon='{"version":"2024.11.0","token":"ab1caf73dcc24051805c9250a712ec79","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7336
7336
7337<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v833ccba57c9e4d2798f2e76cebdd09a11778172276447" integrity="sha512-57MDmcccJXYtNnH+ZiBwzC4jb2rvgVCEokYN+L/nLlmO8rfYT/gIpW2A569iJ/3b+0UEasghjuZH/ma3wIs/EQ==" data-cf-beacon='{"version":"2024.11.0","token":"ab1caf73dcc24051805c9250a712ec79","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7337
7337
7338<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496" integrity="sha512-ZE9pZaUXND66v380QUtch/5sE9tPFh2zg45pR2PB0CVkCtOREv2AJKkSidISWkysEuQ0EH8faUU5du78bx87UQ==" data-cf-beacon='{"version":"2024.11.0","token":"7f34a88a7b3f4212b22e3c454dfec7ae","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7338
7338
7339<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496" integrity="sha512-ZE9pZaUXND66v380QUtch/5sE9tPFh2zg45pR2PB0CVkCtOREv2AJKkSidISWkysEuQ0EH8faUU5du78bx87UQ==" data-cf-beacon='{"version":"2024.11.0","token":"80fe70ba93c24500a78a85be84082267","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7339
7339
7340<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496" integrity="sha512-ZE9pZaUXND66v380QUtch/5sE9tPFh2zg45pR2PB0CVkCtOREv2AJKkSidISWkysEuQ0EH8faUU5du78bx87UQ==" data-cf-beacon='{"version":"2024.11.0","token":"80fe70ba93c24500a78a85be84082267","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7340
7340
7341<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496" integrity="sha512-ZE9pZaUXND66v380QUtch/5sE9tPFh2zg45pR2PB0CVkCtOREv2AJKkSidISWkysEuQ0EH8faUU5du78bx87UQ==" data-cf-beacon='{"version":"2024.11.0","token":"0be3f43d88cf4faaae36ae57bda47803","r":1}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7341
7341
7342<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496" integrity="sha512-ZE9pZaUXND66v380QUtch/5sE9tPFh2zg45pR2PB0CVkCtOREv2AJKkSidISWkysEuQ0EH8faUU5du78bx87UQ==" data-cf-beacon='{"version":"2024.11.0","token":"bf34d461e8e643b0a0c272144f84ed31","r":1}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7342
7342
7343<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"8971552aad264a6594e13e6903c414e0","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 2 bytes, line 7343
7343
7344<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":"15d5674ff9804a069037ce08dd85bdfa","r":1,"spa":2}' crossorigin="anonymous"></script>
7344
7345</body>
7346
7347</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.