<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil</title>
<meta name="description" content="DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<meta name="author" content="DUNIA77 Official">
<meta name="theme-color" content="#e7dccd">
<meta name="google-site-verification" content="IiwBHIsAUNAb6ZnylC2hBJLyiR-KGcjduZUOZgJXh84" />
<!-- Canonical URL -->
<link rel="canonical" href="https://gametheory.online/"/>
<link rel="amphtml" href="https://jangan-ngambek-donk.pages.dev/">
 <link rel="alternate" hreflang="id-id" href="https://jangan-ngambek-donk.pages.dev/"/>
  <link rel="alternate" href="https://gametheory.online/"/>
  <link rel="alternate" hreflang="id" href="https://jangan-ngambek-donk.pages.dev/"/>
  <link rel="alternate" hreflang="en" href="https://gametheory.online/"/>
  <link rel="alternate" hreflang="x-default" href= "https://gametheory.online/"/>
<!-- Favicon -->
<link rel="icon" href="https://gametheory.online/img/favicondunia77.png" type="image/x-icon"/>
<!-- Dates (Open Graph / Facebook) -->
<meta property="article:published_time" content="2026-04-03T00:00:00+07:00">
<meta property="article:modified_time" content="2026-04-03T13:38:00+07:00">
<!-- Dates (Schema microdata fallback) -->
<meta itemprop="datePublished" content="2026-04-03T00:00:00+07:00">
<meta itemprop="dateModified"  content="2026-04-03T13:38:00+07:00">
<!-- Open Graph -->
<meta property="og:locale" content="id_ID"/>
<meta property="og:type" content="website">
<meta property="og:title" content="DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil">
<meta property="og:description" content="DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.">
<meta property="og:url" content="https://gametheory.online/">
<meta property="og:site_name" content="Game Theory">
<meta property="og:image" content="https://gametheory.online/img/game-amp-dunia77.webp">
<meta property="og:image:alt" content="DUNIA77 — Akses Resmi Platform Digital">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@DUNIA77">
<meta name="twitter:title" content="DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil">
<meta name="twitter:description" content="DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.">
<meta name="twitter:image" content="https://gametheory.online/img/game-amp-dunia77.webp">
<link rel="preload" as="image" href="https://gametheory.online/img/game-amp-dunia77.webp" imagesrcset="" fetchpriority="high">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&family=Oswald:wght@600&display=swap" rel="stylesheet">

<!-- ====== DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil — Schema ====== -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://gametheory.online/#organization",
      "name": "DUNIA77",
      "alternateName": "DUNIA77 Platform Digital",
      "url": "https://gametheory.online/",
      "logo": {
        "@type": "ImageObject",
        "url": "https://gametheory.online/img/game-dunia77.webp",
        "width": 250,
        "height": 60
      },
      "description": "DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten."
    },
    {
      "@type": "WebSite",
      "@id": "https://gametheory.online/#website",
      "url": "https://gametheory.online/",
      "name": "DUNIA77",
      "alternateName": "DUNIA77 — Akses Resmi Platform Digital",
      "description": "Platform digital dengan akses resmi dan sistem yang aman serta stabil",
      "inLanguage": "id-ID",
      "publisher": { "@id": "https://gametheory.online/#organization" },
      "potentialAction": {
        "@type": "SearchAction",
        "target": "https://gametheory.online/?s={search_term_string}",
        "query-input": "required name=search_term_string"
      }
    },
    {
      "@type": "WebPage",
      "@id": "https://gametheory.online/#webpage",
      "url": "https://gametheory.online/",
      "name": "DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil",
      "description": "DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.",
      "isPartOf": { "@id": "https://gametheory.online/#website" },
      "inLanguage": "id-ID",
      "datePublished": "2026-04-03T00:00:00+07:00",
      "dateModified":  "2026-04-03T13:38:00+07:00",
      "primaryImageOfPage": {
        "@type": "ImageObject",
        "url": "https://gametheory.online/img/game-amp-dunia77.webp",
        "width": 1200,
        "height": 630
      },
      "breadcrumb": { "@id": "https://gametheory.online/#breadcrumb" },
      "about": [
        { "@type": "Thing", "name": "DUNIA77" },
        { "@type": "Thing", "name": "Platform Digital" },
        { "@type": "Thing", "name": "Akses Resmi" },
        { "@type": "Thing", "name": "Sistem Aman" },
        { "@type": "Thing", "name": "Layanan Transparan" }
      ]
    },
    {
      "@type": "Article",
      "@id": "https://gametheory.online/#article",
      "mainEntityOfPage": { "@id": "https://gametheory.online/#webpage" },
      "headline": "DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil",
      "description": "DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.",
      "image": {
        "@type": "ImageObject",
        "url": "https://gametheory.online/img/game-amp-dunia77.webp",
        "width": 1200,
        "height": 630
      },
      "author": { "@id": "https://gametheory.online/#organization" },
      "publisher": { "@id": "https://gametheory.online/#organization" },
      "datePublished": "2026-04-03T00:00:00+07:00",
      "dateModified": "2026-04-03T13:38:00+07:00",
      "inLanguage": "id-ID"
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://gametheory.online/#breadcrumb",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Beranda",
          "item": "https://gametheory.online/"
        }
      ]
    },
    {
      "@type": "ItemList",
      "@id": "https://gametheory.online/#nav",
      "name": "Site Navigation",
      "itemListElement": [
        { "@type": "SiteNavigationElement", "name": "Beranda", "url": "https://gametheory.online/" },
        { "@type": "SiteNavigationElement", "name": "Panduan", "url": "https://gametheory.online/#panduan" },
        { "@type": "SiteNavigationElement", "name": "Artikel", "url": "https://gametheory.online/#artikel" },
        { "@type": "SiteNavigationElement", "name": "Masuk", "url": "https://gametheory.online/#masuk" }
      ]
    }
  ]
}
</script>

<style>
/*================= BASE =================*/
:root{
  --bg:#0b0b0d; --panel:#121214; --muted:#c9c9c9; --text:#f5f7fa;
  --accent:#B90000; --accent-2:#FF7A00; --ring:rgba(255,122,0,.28);
  --navH:64px;
}
*{box-sizing:border-box}
html,body{height:100%; max-width:100%; overflow-x:hidden; scroll-behavior: smooth}
body{
  margin:0;
  background:radial-gradient(1200px 600px at 20% -10%,#171013 0%,#0b0b0d 55%) no-repeat fixed var(--bg);
  color:var(--text);
  font:16px/1.6 Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial;
}
a{color:inherit}
.container{max-width:1320px;margin:0 auto;padding:0 20px}
.section{padding:64px 0}
.section h2{font:700 36px/1.2 Oswald,Inter,sans-serif;margin:0 0 28px;color:var(--accent-2)}
img,video,svg{max-width:100%;height:auto;display:block}
.container,*{box-sizing:border-box}
.hero,.marquee,.section,.t-section,header.top,footer{overflow-x:clip}

/* Buttons */
.btn{
  display:inline-flex;gap:.6rem;align-items:center;padding:.9rem 1.25rem;border-radius:999px;
  border:1px solid #8e0000;background:linear-gradient(180deg,#1a1213,#100d0e);
  color:var(--text);text-decoration:none;font-weight:600
}
.btn:hover{outline:2px solid var(--ring)}
.btn.primary{background:linear-gradient(180deg,var(--accent),#8e0000);color:#fff;border-color:transparent;margin-top:20px}
.badge{
  display:inline-flex;align-items:center;gap:.45rem;padding:.3rem .7rem;border-radius:999px;
  background:#141013;border:1px solid #8e0000;font-size:.82rem;color:var(--muted)
}
.badge .dot{width:.45rem;height:.45rem;border-radius:50%;background:var(--accent-2)}

/* Reveal */
.reveal{opacity:0;transform:translateY(40px);transition:opacity .8s cubic-bezier(.21,.8,.45,.99),transform .8s cubic-bezier(.21,.8,.45,.99)}
.reveal.in{opacity:1;transform:translateY(0)}
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}

/*================= NAV =================*/
header.top{
  position:sticky;top:0;z-index:50;background:rgba(11,11,13,.78);
  backdrop-filter: blur(4px);
}
nav.bar{height:var(--navH);display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 20px}
.brand{flex:0 0 auto;display:flex;align-items:center;justify-content:center;text-decoration:none}
.brand img{height:40px;width:auto;display:block;border-radius:8px}
.nav-mid{flex:1 1 auto;display:flex;justify-content:center;align-items:center;gap:28px;min-width:0}
.nav-mid a{color:var(--muted);text-decoration:none;font-weight:600;white-space:nowrap}
.nav-mid a:hover{color:var(--text)}
.nav-right{margin-left:auto;display:flex;align-items:center;justify-content:flex-end;gap:12px}
a.cta{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 1rem;border-radius:999px;font-weight:700;text-decoration:none;background:#000;color:#fbfbfb;border:2px solid #ba0101;overflow:hidden}
a.cta::before,a.cta::after{content:none!important}
.burger{display:none;background:transparent;border:0;cursor:pointer;width:40px;height:40px;color:var(--text);padding:0;margin-left:auto}
.burger span{display:block;width:22px;height:2px;background:currentColor;margin:5px auto;transition:transform .25s,opacity .25s}
.burger.is-open span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.burger.is-open span:nth-child(2){opacity:0}
.burger.is-open span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
@media (max-width:980px){.burger{display:block}.nav-mid{display:none}.nav-right .cta{display:none!important}}
@media (min-width:981px){.nav-mid{display:flex!important;position:static!important}}

/* Drawer */
.nav-backdrop{position:fixed;inset:0;z-index:59;background:rgba(0,0,0,.45);backdrop-filter:blur(2px);opacity:0;transition:opacity .25s}
.nav-backdrop.show{opacity:1}
.nav-drawer{
  position:fixed;top:var(--navH);right:0;z-index:60;width:min(86vw,360px);height:calc(100vh - var(--navH));
  background:#0b0b0d;border-left:.5px solid #8e0000;box-shadow:-20px 0 40px rgba(0,0,0,.35);
  transform:translateX(100%);transition:transform .28s cubic-bezier(.22,.61,.36,1);display:flex;flex-direction:column;overflow:hidden
}
.nav-drawer.open{transform:translateX(0)}
.drawer-menu{flex:0 0 auto;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px;display:flex;flex-direction:column;gap:14px}
.drawer-menu a{color:var(--text);text-decoration:none;font-weight:600;padding:12px 4px;border-bottom:1px solid #8e000059}
.drawer-menu a:last-child{border-bottom:0}
.drawer-actions{flex:0 0 auto;padding:16px;background:linear-gradient(180deg,transparent,#0b0b0d 35%)}
.drawer-actions .cta{display:block;width:100%;height:48px;line-height:48px;text-align:center;border-radius:999px;background:#111;color:#fff;border:1.5px solid #8e0000}
.drawer-menu .cta{display:none!important}
.drawer-close{align-self:start;margin:8px;background:#161616;border:1px solid #8e0000;color:#fff;width:40px;height:40px;border-radius:999px}

/*================= HERO =================*/
.hero{
  position:relative;margin:0;padding:80px 0 0;
  background:
    radial-gradient(1400px 500px at 80% -10%,#1a0e0e00 0%,#0b0b0d65 70%),
    url("https://gametheory.online/img/bkganlp.avif")
    center top/cover no-repeat;
}
.hero::before{content:"";position:absolute;inset:0;background:rgba(0,0,0,.45);z-index:0}
.hero .grid{position:relative;z-index:2;display:grid;grid-template-columns:1.3fr 1fr;gap:44px;align-items:center}
@media (max-width:980px){.hero{padding:56px 0 0}.hero .grid{grid-template-columns:1fr}}
h1{font:clamp(28px,6vw,102px)/1.05 Oswald,Inter,sans-serif;margin:.2rem 0 .8rem;color:var(--accent-2)}
.lead{color:#e5d7d7;max-width:90ch;font-size:clamp(14px,2.5vw,16px)}

/* pills should be visible (previously display:none) */
.pills{display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.8rem}
.pills .pill{border:1px solid #8e0000;background:#140f10;padding:.45rem .8rem;border-radius:999px;color:#f1e6e6;font-weight:600;font-size:.9rem}

.hero-cta{display:flex;gap:.8rem;align-items:center;margin-top:1.7rem;flex-wrap:wrap; margin-bottom:22px}
.hero-cta .btn{width:100%;justify-content:center;font-size:16px;padding:1rem 1.5rem}
.media{position:relative;border-radius:22px;overflow:hidden;border:1px solid #8e0000;background:#100d0e;display:none}
.media img{display:block;width:100%;height:auto;opacity:.97}
.hero{overflow:visible} /* prevent clipping */
@media (min-width:720px){.media{display:block}.hero-cta .btn{width:auto}}

/*================= MARQUEE =================*/
.marquee{--gap:90px;--speed:28s;margin:10px 0 28px;background:#0b0b0d;border-block:1px solid #8e0000;overflow:hidden;position:relative; z-index:1}
.marquee::before,.marquee::after{content:"";position:absolute;inset:0 auto 0 0;width:40px;pointer-events:none;background:linear-gradient(to right,#0b0b0d,transparent);z-index:2}
.marquee::after{left:auto;right:0;transform:scaleX(-1)}
.marquee .row{display:flex;gap:var(--gap);width:max-content;white-space:nowrap;padding-block:12px;will-change:transform;transform:translate3d(0,0,0);animation:marq var(--speed) linear infinite}
@keyframes marq{to{transform:translate3d(calc(-1 * var(--cycle,0px)),0,0)}}
.marquee .tag{display:inline-flex;align-items:center;gap:.5rem;color:#ff2a2a;font-weight:700;text-shadow:0 0 0 currentColor,0 0 8px rgba(255,42,42,.7),0 0 16px rgba(255,42,42,.4);animation:neon 2.1s ease-in-out infinite alternate}
.marquee .tag i{width:.6rem;height:.6rem;border-radius:50%;background:#ff2a2a;box-shadow:0 0 6px #ff2a2a,0 0 12px rgba(255,42,42,.6);animation:dot 1.8s ease-in-out infinite alternate}
.marquee .tag:nth-child(3n){animation-delay:.15s}
.marquee .tag:nth-child(3n+1){animation-delay:.35s}
.marquee .tag:nth-child(3n+2){animation-delay:.55s}
@keyframes neon{0%{opacity:.9}60%{opacity:1}100%{opacity:.95}}
@keyframes dot{from{filter:brightness(1)}to{filter:brightness(1.25)}}
@media (prefers-reduced-motion:reduce){.marquee .row{animation:none;transform:none}.marquee .tag{animation:none}}

/*================= CARDS =================*/
.cards{display:grid;grid-template-columns:repeat(3,minmax(280px,1fr));gap:54px;justify-items:center;align-items:stretch; row-gap:54px}
.card{
  position:relative;background:#121214;border:1px solid #2a0e10;border-radius:14px;min-height:360px;
  padding:52px 36px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;
  box-shadow:0 18px 36px rgba(0,0,0,.35);transition:transform .25s,box-shadow .25s,border-color .25s
}
.card::before{content:"";position:absolute;inset:-1px;border-radius:inherit;background:
  radial-gradient(120% 90% at 50% -20%,rgba(255,0,0,.06) 0%,transparent 60%),
  linear-gradient(180deg,rgba(255,0,0,.04),transparent 60%);pointer-events:none}
.card:hover{transform:translateY(-6px);border-color:#630000;box-shadow:0 26px 56px rgba(0,0,0,.45)}
.card h3{margin:0 0 18px;color:#f5f7fa;font:800 clamp(56px,9vw,140px)/0.9 Oswald,Inter,sans-serif;letter-spacing:.5px;text-shadow:0 1px 0 rgba(0,0,0,.35)}
.card p{margin:0;color:#e7ebf1;font:600 clamp(18px,2.2vw,28px)/1.25 Inter,system-ui,sans-serif;max-width:22ch}
@media (max-width:1200px){.cards{grid-template-columns:repeat(2,minmax(260px,1fr))}.card{min-height:320px;padding:40px 30px}}
@media (max-width:680px){.cards{grid-template-columns:1fr}.card{min-height:300px;padding:36px 28px}.card h3{font-size:clamp(48px,16vw,96px)}.card p{font-size:clamp(16px,4.2vw,22px)}}

/*================= TESTIMONIALS =================*/
.t-section{--edge:var(--accent);--glow:var(--accent-2);--card:#141415;--ink:#f5f7fa;--muted:#a8b0b2;padding:86px 0}
.t-grid{display:grid;grid-template-columns:1.1fr 1.4fr;gap:48px;align-items:center}
@media (max-width:1020px){.t-grid{grid-template-columns:1fr;gap:28px}}
.t-eyebrow{display:inline-flex;gap:8px;align-items:center;color:var(--muted);font-weight:700}
.t-title{font:800 clamp(28px,4vw,54px)/1.05 Oswald,Inter,sans-serif;margin:10px 0 18px}
.t-title span{color:var(--glow)}
.t-score{display:flex;align-items:center;gap:16px;background:#0f1010;border:1px solid #261111;border-radius:16px;padding:18px 22px;max-width:360px}
.t-score-num{font:800 40px/1 Oswald,Inter;color:#fff}
.t-score-meta small{display:block;color:var(--muted)}
.t-stars i{color:var(--glow);font-style:normal;margin-right:4px;filter:drop-shadow(0 0 6px rgba(255,122,0,.35))}
.t-slider{position:relative}
.t-stack{position:relative;height:360px;margin:0 auto;max-width:100%;user-select:none;overflow:hidden}
@media (min-width:1200px){.t-stack{height:420px}}
.t-card{
  position:absolute;inset:0;margin:auto;width:100%;height:100%;background:var(--card);
  border:1.5px solid rgba(185,0,0,.18);border-radius:18px;color:var(--ink);padding:34px 34px 36px;
  box-shadow:0 10px 30px rgba(0,0,0,.55);transform-origin:60% 60%;transition:transform .5s cubic-bezier(.2,.7,.2,1),opacity .45s ease;
  will-change:transform,opacity;contain:paint;backface-visibility:hidden;overflow:hidden
}
.t-card::after{content:"";position:absolute;inset:0;border-radius:18px;box-shadow:0 0 0 1px rgba(185,0,0,.10) inset,0 0 40px rgba(255,122,0,.10) inset;pointer-events:none}
.t-card-head{display:flex;gap:16px;align-items:center;margin-bottom:18px}
.t-card-head img{width:56px;height:56px;border-radius:999px;border:2px solid rgba(255,122,0,.5)}
/* FIX: stack nama & role, beri jarak */
.t-card-head > div{display:flex;flex-direction:column;min-width:0}
.t-card-head strong{display:block;margin:0 0 4px;font:700 18px/1.15 Inter,system-ui}
.t-card-head small{display:block;color:var(--muted);font-size:14px;line-height:1.2}

.t-quote{margin-top:10px;color:#e8ecec;font-weight:600;letter-spacing:.2px;max-width:78ch;font-size:clamp(16px,1.6vw,20px)}
.t-card.is-active{border-color:var(--edge);box-shadow:0 18px 44px rgba(0,0,0,.58),0 0 0 1px rgba(255,122,0,.22) inset,0 0 36px rgba(255,122,0,.18)}
.t-slider:hover .t-card.is-active{box-shadow:0 22px 54px rgba(0,0,0,.62),0 0 0 1px rgba(255,122,0,.26) inset,0 0 46px rgba(255,122,0,.20)}
.t-dots{display:flex;gap:10px;justify-content:center;margin-top:18px}
.t-dot{width:9px;height:9px;border-radius:999px;background:#3a3d3f;cursor:pointer;outline:none;border:0}
.t-dot[aria-current="true"]{background:transparent;box-shadow:0 0 0 2px var(--glow) inset,0 0 10px rgba(255,122,0,.55)}
.t-slider{touch-action:pan-y}
@media (prefers-reduced-motion:reduce){.t-card{transition:none}}

/*================= BLOG =================*/
#blog .grid{
  display:grid;grid-template-columns:1.2fr 1fr;
  grid-template-areas:"head head" "posts faq";
  column-gap:40px;row-gap:18px;align-items:start;
}
#blog .bf-head{grid-area:head}
#blog .bf-posts{grid-area:posts}
#blog .bf-faq{grid-area:faq}
#blog .bf-head h2{margin:0 0 10px}
#blog .bf-head .lead{margin:0}
@media (max-width:900px){
  #blog .grid{
    grid-template-columns:1fr;
    grid-template-areas:"head" "posts" "faq";
    row-gap:20px;
  }
}

/* Posts */
#blog .post-list{margin:16px 0 18px;padding:0;list-style:none;display:grid;gap:14px}
#blog .post{display:flex;flex-direction:column;gap:6px;padding:14px 16px;border:1px solid #2a0e10;border-radius:14px;background:#121214}
#blog .post h4{margin:0;font:800 16px/1.3 Inter,system-ui}
#blog .post small{color:var(--muted)}
#blog .post .row{display:flex;gap:10px;align-items:center;margin-top:6px}
#blog .post .open{padding:8px 12px;border-radius:999px;border:1px solid #8e0000;background:#111;color:#fff;font-weight:700;cursor:pointer}

/* FAQ */
#blog .faq{background:#121214;border:1px solid #2a0e10;border-radius:16px;padding:14px;margin:0}
#blog .faq h3{margin:6px 10px 12px;font:700 20px/1.2 Oswald,Inter;color:var(--accent-2)}
#blog .faq details{border:1px solid #2a0e10;border-radius:12px;background:#0f1010;margin:10px 0}
#blog .faq summary{list-style:none;cursor:pointer;padding:14px 16px;font-weight:700;color:var(--text);position:relative}
#blog .faq summary::-webkit-details-marker{display:none}
#blog .faq summary::after{content:"+";position:absolute;right:14px;top:12px;font-weight:800;color:var(--accent-2)}
#blog .faq details[open] summary::after{content:"–"}
#blog .faq .ans{padding:0 16px 14px;color:#e5d7d7}
#blog .faq details[open]{border-top-color:transparent}
#blog .faq details[open] .ans{padding-top:10px;margin-top:4px}
#blog .faq summary:hover{background:rgba(255,122,0,.05);border-radius:10px}

/*================= MODAL OF BLOG =================*/
.mbackdrop{position:fixed;inset:0;background:rgba(0,0,0,.55);backdrop-filter:blur(2px);display:none;place-items:center;z-index:90}
.mbackdrop.show{display:grid}
.modal{
  width:min(820px,92vw);max-height:min(88vh,1200px);overflow:auto;background:#121214;color:var(--text);
  border:1px solid #8e0000;border-radius:18px;box-shadow:0 24px 80px rgba(0,0,0,.65)
}
.modal header{display:flex;justify-content:space-between;align-items:center;padding:14px 18px;border-bottom:1px solid #2a0e10}
.modal h3{margin:0;font:800 20px/1.2 Oswald,Inter}
.modal .close{border:1px solid #8e0000;background:#161616;color:#fff;border-radius:999px;width:36px;height:36px;cursor:pointer}
.modal .body{padding:18px}
.modal .body p{margin:0 0 12px}

/*================= GAME SHOWCASE =================*/
.showcase .gs-wrap{ padding:28px 0 14px; }
.showcase .gs{
  position:relative; overflow:hidden;
  border-radius:22px; background:#121214;
  border:1.5px solid #2a0e10;
  box-shadow:0 8px 18px rgba(0,0,0,.28);
}
.showcase .gs-progress{
  position:absolute; left:0; top:0; height:4px; width:0;
  background:linear-gradient(90deg,#8e0000,#ff2a2a);
}
.showcase .gs-viewport{ overflow:hidden; }
.showcase .gs-track{
  display:grid; grid-auto-flow:column; grid-auto-columns:100%;
  transition:transform .55s cubic-bezier(.22,.61,.36,1);
}

/* pages + grid */
.showcase .gs-page{ padding:16px; }
.showcase .gs-grid{
  display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:16px; align-items:stretch;
}
@media (max-width:980px){
  .showcase .gs-grid{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:560px){
  .showcase .gs-grid{ grid-template-columns:1fr; }
}

/* cards */
.showcase .gcard{
  display:grid; grid-template-columns:120px 1fr; gap:14px;
  padding:16px; height:100%;
  color:#f0f0f0; background:#0f0f10;
  border:1.5px solid #2a0e10; border-radius:16px;
  transition:.25s; box-shadow:0 8px 22px rgba(0,0,0,.28) inset;
}
.showcase .gcard:hover{
  border-color:#8e0000;
  box-shadow:0 18px 42px rgba(185,0,0,.20),
             0 8px 22px rgba(0,0,0,.28) inset;
}
.showcase .gcard-art{
  width:110px; height:110px; border-radius:14px;
  background:#1a1a1c center/cover no-repeat;
  border:1px solid #2a0e10;
}
.showcase .gcard>div:not(.gcard-art){
  display:flex; flex-direction:column; min-width:0;
}
.showcase .gcard-title{
  margin:0 0 6px; color:#fff;
  font:800 20px/1.25 var(--font-heading,Oswald,Inter);
}
.showcase .gcard-sub{
  margin:0 0 10px; color:#d8d1d1;
  font:600 13px/1.6 Inter,system-ui;
}
.showcase .gcard-stats{ margin-top:auto; display:flex; gap:10px; flex-wrap:wrap; align-items:center; }

/* badges */
.showcase .gs-badge{
  display:inline-flex; align-items:center; gap:6px;
  padding:8px 12px; border-radius:999px;
  font:700 13px/1 Inter,system-ui;
  border:1px solid #2a0e10; background:#1a1a1c; color:#f5eaea;
}
.showcase .gs-badge .dot{ display:inline-block; width:10px; height:10px; border-radius:50%; flex:0 0 10px; vertical-align:middle; }
.showcase .gs-badge.good .dot{ background:#2AD46B; }
.showcase .gs-badge.ok   .dot{ background:#FACC15; }
.showcase .gs-badge.bad  .dot{ background:#EF4444; }
.showcase .gs-badge.rtppill{ background:#1a1a1c; color:#fff; border-color:#2a0e10; }
.showcase .gcard .gs-badge{ position:static; box-shadow:none; }
.showcase .gcard-stats .rtppill{ order:-1; align-self:flex-start; }
.showcase .gs-badge.rtppill .dot{ background:#ef4444; box-shadow:0 0 6px rgba(239,68,68,.45);}

/* nav + dots */
.showcase .gs-nav{
  position:absolute; top:50%; transform:translateY(-50%);
  width:40px; height:40px; border-radius:50%;
  border:1px solid #2a0e10; background:#121214; color:#fff;
  font-weight:800; line-height:0; display:grid; place-items:center;
  cursor:pointer; transition:.2s; box-shadow:0 8px 18px rgba(0,0,0,.38);
}
.showcase .gs-nav:hover{ background:#1c1c1c; border-color:#8e0000; }
.showcase .gs-nav.prev{ left:10px; }
.showcase .gs-nav.next{ right:10px; }

.showcase .gs-dots{ position:absolute; right:18px; bottom:6px; display:flex; gap:8px; }
.showcase .gs-dot{
  width:9px; height:9px; border-radius:999px;
  background:#2a0e10; border:1px solid #3a1111; cursor:pointer;
}
.showcase .gs-dot.active{ background:#ff2a2a; box-shadow:0 0 0 3px rgba(255,42,42,.28); }

@media (max-width:980px){
  .showcase .gcard{ grid-template-columns:100px 1fr; padding:14px; }
  .showcase .gcard-art{ width:96px; height:96px; }
  .showcase .gcard-title{ font-size:18px; }
  .showcase .gs-page{ padding:14px; }
}
@media (max-width:560px){
  .showcase .gcard{ grid-template-columns:88px 1fr; }
  .showcase .gcard-art{ width:88px; height:88px; }
  .showcase .gcard-stats{ flex-direction:column; align-items:flex-start; gap:6px; width:100%; }
  .showcase .gs-badge{ max-width:100%; font-size:12px; padding:7px 10px; }
}

/*================= FOOTER =================*/
.cta{padding:56px 0;background:linear-gradient(180deg,#130e0f,#0b0b0d)}
.footer{padding:28px 0;color:#e9c8c0;border-top:1px solid #8e0000}

/* ===== DNA Helix Background ===== */
.dna-bg{
  position:fixed; inset:-10% -5% -10% -5%;
  z-index:0; pointer-events:none;
  opacity:.18;
  filter:saturate(120%);
  transform:rotate(-90deg) scale(1.15);
  animation:helix-rotate 40s linear infinite, helix-pulse 6s ease-in-out infinite;
}
.dna-bg svg{ width:100%; height:100%; display:block; }
@keyframes helix-rotate{ from{transform:rotate(-90deg) scale(1.15)} to{transform:rotate(270deg) scale(1.15)} }
@keyframes helix-pulse{ 0%,100%{opacity:.14} 50%{opacity:.22} }
.strand{ animation:dash-move 10s linear infinite; }
.strand.s2{ animation-duration: 10s; animation-delay: -5s; }
@keyframes dash-move{ to{ stroke-dashoffset: -320; } }
@media (prefers-reduced-motion:reduce){
  .dna-bg{ animation:none; }
  .strand{ animation:none; }
}
@media (max-width:480px){ .dna-bg{display:none} }
</style>
</head>

<body>
<!-- DNA HELIX BACKDROP -->
<div class="dna-bg" aria-hidden="true">
  <svg viewBox="0 0 1200 1200" preserveAspectRatio="xMidYMid slice">
    <defs>
      <linearGradient id="helixRed" x1="0%" y1="0%" x2="100%" y2="0%">
        <stop offset="0%"  stop-color="#B90000"/>
        <stop offset="100%" stop-color="#FF7A00"/>
      </linearGradient>
      <linearGradient id="helixDim" x1="0%" y1="0%" x2="100%" y2="0%">
        <stop offset="0%"  stop-color="#FF7A00"/>
        <stop offset="100%" stop-color="#B90000"/>
      </linearGradient>
      <filter id="glow">
        <feGaussianBlur stdDeviation="2"/>
        <feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
      </filter>
    </defs>

    <path class="strand s1" filter="url(#glow)"
      d="M0,600 C150,450 300,750 450,600 S750,450 900,600 S1050,750 1200,600"
      fill="none" stroke="url(#helixRed)" stroke-width="6"
      stroke-linecap="round" stroke-dasharray="14 34"/>

    <path class="strand s2" filter="url(#glow)"
      d="M0,600 C150,750 300,450 450,600 S750,750 900,600 S1050,450 1200,600"
      fill="none" stroke="url(#helixDim)" stroke-width="6"
      stroke-linecap="round" stroke-dasharray="14 34"/>

    <g id="rungs" stroke="#ff7a00" stroke-opacity=".18" stroke-width="2">
      <line x1="100" y1="600" x2="100" y2="600"/>
      <line x1="200" y1="600" x2="200" y2="600"/>
      <line x1="300" y1="600" x2="300" y2="600"/>
      <line x1="400" y1="600" x2="400" y2="600"/>
      <line x1="500" y1="600" x2="500" y2="600"/>
      <line x1="600" y1="600" x2="600" y2="600"/>
      <line x1="700" y1="600" x2="700" y2="600"/>
      <line x1="800" y1="600" x2="800" y2="600"/>
      <line x1="900" y1="600" x2="900" y2="600"/>
      <line x1="1000" y1="600" x2="1000" y2="600"/>
      <line x1="1100" y1="600" x2="1100" y2="600"/>
    </g>
  </svg>
</div>

<header class="top">
  <nav class="bar container">
    <a class="brand" href="#">
     <img src="https://gametheory.online/img/logodunia77.png" alt="logo dunia77" />
    </a>

    <div class="nav-mid desktop-only">
      <a href="/">Beranda</a>
      <a href="#situskami">Situs Kami</a>
      <a href="#blog">Panduan & Artikel</a>
      <a href="#game">Game Populer</a>
    </div>

    <div class="nav-right">
      <a href="https://bit.ly/dunia77utm" class="cta desktop-only">Masuk</a>
      <button class="burger" aria-controls="navDrawer" aria-expanded="false" aria-label="Buka menu">
        <span></span><span></span><span></span>
      </button>
    </div>
  </nav>
</header>

<div class="nav-backdrop" id="navBackdrop" hidden></div>

<aside class="nav-drawer" id="navDrawer" aria-hidden="true">
  <div class="drawer-head"></div>

  <nav class="drawer-menu">
    <a href="/">Beranda</a>
    <a href="#situskami">Situs Kami</a>
    <a href="#blog">Panduan & Artikel</a>
    <a href="#game">Game Populer</a>
  </nav>

  <div class="drawer-actions">
    <a class="cta" href="https://bit.ly/dunia77utm">Masuk</a>
  </div>
</aside>

<script>
(()=> {
  const burger   = document.querySelector('.burger');
  const drawer   = document.getElementById('navDrawer');
  const backdrop = document.getElementById('navBackdrop');

  function openNav(){
    drawer.classList.add('open');
    backdrop.hidden = false;
    requestAnimationFrame(()=>backdrop.classList.add('show'));
    burger.classList.add('is-open');
    burger.setAttribute('aria-expanded','true');
    drawer.setAttribute('aria-hidden','false');
    document.body.style.overflow='hidden';
  }
  function closeNav(){
    drawer.classList.remove('open');
    backdrop.classList.remove('show');
    burger.classList.remove('is-open');
    burger.setAttribute('aria-expanded','false');
    drawer.setAttribute('aria-hidden','true');
    document.body.style.overflow='';
    setTimeout(()=>backdrop.hidden=true,250);
  }

  burger.addEventListener('click', ()=> drawer.classList.contains('open') ? closeNav() : openNav());
  backdrop.addEventListener('click', closeNav);
  document.addEventListener('keydown', e=>{ if(e.key==='Escape') closeNav(); });
  drawer.querySelectorAll('a').forEach(a=> a.addEventListener('click', closeNav));
})();
</script>

<main id="hero" class="hero">
  <div class="container grid">
    <div>
      <span class="badge"><span class="dot"></span> DUNIA77 · Akses Resmi Platform Digital 2026</span>
      <h1>DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil</h1>
      <p class="lead">
        <strong>DUNIA77</strong> adalah platform digital dengan <strong>akses resmi</strong> dan sistem yang aman serta stabil. Menyediakan <strong>informasi terverifikasi</strong>, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.
      </p>
      <div class="pills">
        <span class="pill">Akses Resmi</span>
        <span class="pill">Sistem Aman</span>
        <span class="pill">Layanan Transparan</span>
        <span class="pill">Pengalaman Konsisten</span>
      </div>
      <div class="hero-cta">
        <a class="btn primary" href="https://bit.ly/dunia77utm" target="_blank" rel="nofollow noopener">
          Akses Platform Resmi →
        </a>
      </div>
    </div>

    <div class="media">
      <img src="https://gametheory.online/img/game-dunia77.webp" alt="DUNIA77 — Akses Resmi Platform Digital" width="640" height="360" loading="lazy" decoding="async">
    </div>
  </div>

  <div class="marquee" id="marq">
    <div class="row">
      <span class="tag"><i></i> Akses Resmi</span>
      <span class="tag"><i></i> Sistem Aman</span>
      <span class="tag"><i></i> Informasi Terverifikasi</span>
      <span class="tag"><i></i> Layanan Transparan</span>
      <span class="tag"><i></i> Pengalaman Konsisten</span>
      <span class="tag"><i></i> Platform Stabil</span>
      <span class="tag"><i></i> Dukungan 24/7</span>
      <span class="tag"><i></i> Multi-Device Support</span>
    </div>
  </div>
<script>
(function () {
  const root = document.getElementById('marq');
  if (!root) return;
  const row = root.querySelector('.row');
  const ORIGINAL = row.innerHTML.trim();
  const mediaReduce = window.matchMedia('(prefers-reduced-motion: reduce)');
  const clamp = (v, min, max) => Math.max(min, Math.min(max, v));
  function build() {
    if (mediaReduce.matches) {
      row.style.animation = 'none';
      row.innerHTML = ORIGINAL;
      return;
    }
    row.style.animationPlayState = 'paused';
    row.style.animation = 'none';
    row.innerHTML = ORIGINAL;
    const w1 = row.scrollWidth || 1;
    const need = clamp(Math.ceil((root.clientWidth * 1.6) / w1), 1, 3);
    for (let i = 1; i < need; i++) row.insertAdjacentHTML('beforeend', ORIGINAL);
    row.style.setProperty('--cycle', w1 + 'px');
    const PX_PER_SEC = 16;
    const dur = clamp(w1 / PX_PER_SEC, 28, 80);
    row.style.animationDuration = dur + 's';
    void row.offsetWidth;
    row.style.animation = '';
    row.style.animationPlayState = 'running';
  }
  let lastW = root.clientWidth;
  build();
  let t = null;
  window.addEventListener('resize', () => {
    const nowW = root.clientWidth;
    if (Math.abs(nowW - lastW) < 20) return;
    lastW = nowW;
    clearTimeout(t);
    t = setTimeout(build, 500);
  }, { passive: true });
  document.addEventListener('visibilitychange', () => {
    if (document.hidden) row.style.animationPlayState = 'paused';
    else build();
  });
  mediaReduce.addEventListener?.('change', build);
})();
</script>
</main>

<section class="section" id="situskami">
  <div class="container">
    <div class="cards">
      <article class="card reveal" style="transition-delay:0.5s">
        <h3>100%</h3>
        <p>Akses Resmi & Terverifikasi</p>
      </article>
      <article class="card reveal" style="transition-delay:0.8s">
        <h3>24/7</h3>
        <p>Dukungan & Layanan Aktif</p>
      </article>
      <article class="card reveal" style="transition-delay:1s">
        <h3>Multi</h3>
        <p>Device Support Konsisten</p>
      </article>
    </div>
  </div>
</section>
<script>
document.addEventListener("DOMContentLoaded",()=>{
  if(window.matchMedia('(prefers-reduced-motion:reduce)').matches)return;
  const obs=new IntersectionObserver(entries=>{
    entries.forEach(e=>{
      if(e.isIntersecting){e.target.classList.add("in");obs.unobserve(e.target);}
    });
  },{threshold:0.1});
  document.querySelectorAll(".reveal").forEach(el=>obs.observe(el));
});
</script>

<section id="blog" class="cta">
  <div class="container grid">
    <div class="bf-head">
      <h2>DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil</h2>
      <p class="lead">
        DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.
      </p>
    </div>

    <div class="bf-posts">
      <ul class="post-list">
        <li class="post">
          <h4>Akses Resmi: Keamanan dan Verifikasi Platform</h4>
          <small>3 menit baca · Keamanan & Akses</small>
          <div class="row"><button class="open" data-article="a1">Baca Ringkas →</button></div>
        </li>
        <li class="post">
          <h4>Sistem Aman: Perlindungan Data dan Privasi</h4>
          <small>2 menit baca · Sistem & Keamanan</small>
          <div class="row"><button class="open" data-article="a2">Baca Ringkas →</button></div>
        </li>
        <li class="post">
          <h4>Layanan Transparan: Informasi Terverifikasi</h4>
          <small>3 menit baca · Layanan & Informasi</small>
          <div class="row"><button class="open" data-article="a3">Baca Ringkas →</button></div>
        </li>
      </ul>
      <a class="btn primary" href="https://bit.ly/dunia77utm">Akses Platform Resmi →</a>
    </div>

    <aside class="faq bf-faq">
      <h3>FAQ</h3>
      <details>
        <summary>Apa itu DUNIA77?</summary>
        <div class="ans">DUNIA77 adalah platform digital dengan akses resmi dan sistem yang aman serta stabil. Menyediakan informasi terverifikasi, layanan transparan, dan pengalaman pengguna yang konsisten di berbagai perangkat.</div>
      </details>
      <details>
        <summary>Bagaimana cara mengakses platform DUNIA77?</summary>
        <div class="ans">Akses platform DUNIA77 melalui link resmi yang terverifikasi. Pastikan Anda menggunakan tautan yang benar untuk keamanan dan kenyamanan akses ke semua fitur dan informasi terbaru.</div>
      </details>
      <details>
        <summary>Apa saja fitur yang tersedia di DUNIA77?</summary>
        <div class="ans">DUNIA77 menyediakan informasi terverifikasi, layanan transparan, sistem keamanan yang stabil, dukungan multi-device, dan pengalaman pengguna yang konsisten di berbagai perangkat.</div>
      </details>
      <details>
        <summary>Apakah DUNIA77 aman dan terpercaya?</summary>
        <div class="ans">Ya. DUNIA77 menggunakan sistem keamanan terverifikasi dengan enkripsi modern, pembaruan sistem berkala, dan protokol keamanan standar industri untuk melindungi data dan privasi pengguna.</div>
      </details>
    </aside>
  </div>
</section>

<!-- ===== Hidden article sources ===== -->
<template id="a1">
  <h4>Akses Resmi: Keamanan dan Verifikasi Platform</h4>
  <p>DUNIA77 menggunakan sistem akses resmi yang memastikan setiap pengguna mendapatkan pengalaman yang aman dan terpercaya. Proses verifikasi dilakukan dengan standar keamanan tinggi untuk melindungi data dan privasi pengguna.</p>
  <p>Dengan akses resmi, pengguna dapat menggunakan platform dengan tenang tanpa khawatir tentang keamanan informasi pribadi mereka.</p>
</template>

<template id="a2">
  <h4>Sistem Aman: Perlindungan Data dan Privasi</h4>
  <p>Platform DUNIA77 dilengkapi dengan sistem keamanan berlapis yang melindungi data pengguna dengan enkripsi modern. Setiap transaksi dan aktivitas dipantau untuk memastikan keamanan maksimal.</p>
  <p>Sistem kami diperbarui secara berkala untuk menghadapi ancaman keamanan terbaru dan menjaga stabilitas platform.</p>
</template>

<template id="a3">
  <h4>Layanan Transparan: Informasi Terverifikasi</h4>
  <p>DUNIA77 berkomitmen untuk menyediakan informasi yang terverifikasi dan transparan kepada semua pengguna. Setiap layanan dan fitur dijelaskan dengan jelas tanpa informasi yang menyesatkan.</p>
  <p>Pengguna dapat mengakses informasi lengkap tentang platform, kebijakan, dan layanan yang tersedia kapan saja.</p>
</template>

<div class="mbackdrop" id="postModal" aria-hidden="true">
  <article class="modal" role="dialog" aria-modal="true" aria-labelledby="postTitle">
    <header>
      <h3 id="postTitle">Artikel</h3>
      <button class="close" id="mClose" aria-label="Tutup">✕</button>
    </header>
    <div class="body" id="postBody"></div>
  </article>
</div>

<script>
(() => {
  const modal   = document.getElementById('postModal');
  const bodyEl  = document.getElementById('postBody');
  const titleEl = document.getElementById('postTitle');
  const closeBtn= document.getElementById('mClose');

  function open(id){
    const tpl = document.getElementById(id);
    if(!tpl) return;
    bodyEl.innerHTML = tpl.innerHTML;
    const h = bodyEl.querySelector('h4');
    titleEl.textContent = h ? h.textContent : 'Artikel';
    modal.classList.add('show');
    modal.setAttribute('aria-hidden','false');
    document.body.style.overflow='hidden';
    closeBtn.focus();
  }
  function close(){
    modal.classList.remove('show');
    modal.setAttribute('aria-hidden','true');
    document.body.style.overflow='';
  }

  document.querySelectorAll('#blog .open').forEach(b=>{
    b.addEventListener('click', ()=> open(b.dataset.article));
  });
  closeBtn.addEventListener('click', close);
  modal.addEventListener('click', e=>{ if(e.target===modal) close(); });
  document.addEventListener('keydown', e=>{ if(e.key==='Escape' && modal.classList.contains('show')) close(); });
})();
</script>

<section class="section showcase" aria-label="Game Showcase" id="game">
  <div class="container">
    <div class="gs-wrap">
      <div class="gs gs--grid" id="gsGrid">
        <div class="gs-progress" aria-hidden="true"></div>

        <div class="gs-viewport" id="gsViewport">
          <div class="gs-track" id="gsTrack"><!-- pages injected --></div>
        </div>

        <button class="gs-nav prev" aria-label="Sebelumnya">‹</button>
        <button class="gs-nav next" aria-label="Berikutnya">›</button>
        <div class="gs-dots" id="gsDots" role="tablist" aria-label="Pilih halaman"></div>
      </div>
    </div>
  </div>
</section>
<script>
    (function(){
      const GAMES = [
        { id:'Mahjong-Wins-3–Black-Scatter', name:'Mahjong Wins 3 – Black Scatter', provider:'Pragmatic Play', rtp:95.4, hits24h:1122, img:'https://gametheory.online/img/vswaysmahwblck.jpg' },
        { id:'Gates-of-Olympus-1000', name:'Gates of Olympus', provider:'Pragmatic Play', rtp:96.9, hits24h:2410, img:'https://gametheory.online/img/vs20olympgate.jpg' },
        { id:'Starlight-Princess-1000', name:'Starlight Princess™ 1000', provider:'Pragmatic Play', rtp:96.5, hits24h:3214, img:'https://gametheory.online/img/vs20starlightx.jpg' },
        { id:'Gates-of-Gatot-Kaca-1000', name:'Gates of Gatot Kaca 1000', provider:'Pragmatic Play', rtp:98.2, hits24h:942, img:'https://gametheory.online/img/vs20gatotx.jpg' },
        { id:'Sweet-Bonanza-1000', name:'Sweet Bonanza 1000', provider:'Pragmatic Play', rtp:96.1, hits24h:1734, img:'https://gametheory.online/img/vs20fruitswx.jpg' },
        { id:'Mahjong-Ways', name:'Mahjong Ways', provider:'PG Soft', rtp:97.8, hits24h:2890, img:'https://gametheory.online/img/MahjongWays.jpg' },
        { id:'Treasures-of-Aztec', name:'Treasures of Aztec', provider:'PG Soft', rtp:96.0, hits24h:1377, img:'https://gametheory.online/img/TreasuresofAztec.jpg' },
        { id:'Lucky-Neko', name:'Lucky Neko', provider:'PG Soft', rtp:97.2, hits24h:2055, img:'https://gametheory.online/img/LuckyNeko.jpg' },
        { id:'WildApe-3258', name:'WildApe #3258', provider:'PG Soft', rtp:95.9, hits24h:1987, img:'https://gametheory.online/img/WildApe3258.jpg' },
      ];
      function randInt(min, max){ return Math.floor(min + Math.random()*(max - min + 1)); }
      function randomizeGames(arr, {
        rtpMin = 95.0,
        rtpMax = 98.5,
        rtpJitter = 0.8,
        hitsMin = 900,
        hitsMax = 3600,
        shuffle = true
      } = {}){
        const mapped = arr.map(g => {
          const jittered = g.rtp + (Math.random()*2 - 1) * rtpJitter;
          const rtp = Math.min(rtpMax, Math.max(rtpMin, jittered));
          const hits24h = randInt(hitsMin, hitsMax);
          return { ...g, rtp: Number(rtp.toFixed(2)), hits24h };
        });
        return shuffle ? mapped.sort(() => Math.random() - 0.5) : mapped;
      }
      let DATA = randomizeGames(GAMES, {
        rtpMin: 95.0,
        rtpMax: 98.5,
        rtpJitter: 0.8,
        hitsMin: 900,
        hitsMax: 3600,
        shuffle: true
      });
      const el = document.getElementById('gsGrid');
      const track = document.getElementById('gsTrack');
      const viewport = document.getElementById('gsViewport');
      const dotsWrap = document.getElementById('gsDots');
      const progress = el.querySelector('.gs-progress');
      let pages = [];
      let pageIndex = 0;
      const DURATION = 4500;
      let timer = null;
      function itemsPerPage(){
        const w = el.clientWidth;
        if (w < 560) return 1;
        if (w < 900) return 2;
        return 3;
      }
      function build(){
        track.innerHTML = '';
        dotsWrap.innerHTML = '';
        pages = [];
        const n = itemsPerPage();
        for(let i=0; i<DATA.length; i+=n){
          const page = document.createElement('div');
          page.className = 'gs-page';
          const grid = document.createElement('div');
          grid.className = 'gs-grid';
          DATA.slice(i, i+n).forEach(g=>{
            const lvl = g.rtp >= 98 ? 'good' : (g.rtp >= 95 ? 'ok' : 'bad');
            const artStyle = g.img
              ? `style="background-image:url('${g.img}')" `
              : `style="background-image:linear-gradient(135deg,#1a1d24,#0e0f13)" `;
            grid.insertAdjacentHTML('beforeend', `
              <article class="gcard">
                <div class="gcard-art" ${artStyle}></div>
                <div>
                  <h4 class="gcard-title">${g.name}</h4>
                  <p class="gcard-sub">Provider: <strong>${g.provider}</strong></p>
                  <div class="gcard-stats">
                    <span class="gs-badge rtppill"><span class="dot"></span> RTP <strong id="grid-rtp-${g.id}">${g.rtp.toFixed(2)}</strong>%</span>
                    <span class="gs-badge ${lvl}" id="grid-status-${g.id}"><span class="dot"></span> Status: ${lvl==='good'?'Bagus':lvl==='ok'?'Sehat':'Rendah'}</span>
                    <span class="gs-badge"><span class="dot" style="background:#93c5fd"></span> Hits 24 jam: ${g.hits24h.toLocaleString()}</span>
                  </div>
                </div>
              </article>
            `);
          });
          page.appendChild(grid);
          track.appendChild(page);
          pages.push(page);
          const dot = document.createElement('button');
          dot.className = 'gs-dot';
          dot.type='button';
          dot.addEventListener('click', ()=> goTo(pages.indexOf(page)));
          dotsWrap.appendChild(dot);
        }
        setActive(0, false);
      }
      function setActive(i, animate=true){
        pageIndex = (i + pages.length) % pages.length;
        const x = -pageIndex * viewport.clientWidth;
        track.style.transition = animate ? 'transform .55s cubic-bezier(.22,.61,.36,1)' : 'none';
        track.style.transform = `translateX(${x}px)`;
        [...dotsWrap.children].forEach((d,ix)=> d.classList.toggle('active', ix===pageIndex));
        animateProgress();
      }
      function animateProgress(){
        progress.style.transition = 'none';
        progress.style.width = '0%';
        requestAnimationFrame(()=>{
          requestAnimationFrame(()=>{
            progress.style.transition = `width ${DURATION}ms linear`;
            progress.style.width = '100%';
          });
        });
      }
      function next(){ setActive(pageIndex+1); restart(); }
      function prev(){ setActive(pageIndex-1); restart(); }
      function goTo(i){ setActive(i); restart(); }
      function restart(){ clearInterval(timer); timer = setInterval(next, DURATION); }
      el.querySelector('.gs-nav.next').addEventListener('click', next);
      el.querySelector('.gs-nav.prev').addEventListener('click', prev);
      el.addEventListener('mouseenter', ()=> clearInterval(timer));
      el.addEventListener('mouseleave', restart);
      let startX=null;
      viewport.addEventListener('pointerdown', e=>{ startX=e.clientX; });
      viewport.addEventListener('pointerup', e=>{
        if(startX===null) return;
        const dx = e.clientX - startX;
        if(Math.abs(dx)>40) (dx<0 ? next() : prev());
        startX=null;
      });
      const ro = new ResizeObserver(()=> { build(); restart(); });
      ro.observe(el);
      build();
      restart();
      window.updateGameRTPGrid = function(id, value){
        const elVal = document.getElementById(`grid-rtp-${id}`);
        if(!elVal) return;
        const v = Math.max(0, Math.min(100, Number(value)));
        elVal.textContent = v.toFixed(2);
        const status = document.getElementById(`grid-status-${id}`);
        if(status){
          status.classList.remove('good','ok','bad');
          const lvl = v>=98 ? 'good' : (v>=95 ? 'ok' : 'bad');
          status.classList.add(lvl);
          status.innerHTML = `<span class="dot"></span> Status: ${lvl==='good'?'Bagus':lvl==='ok'?'Sehat':'Rendah'}`;
        }
      };
      window.reRollGames = function(){
        DATA = randomizeGames(GAMES, {
          rtpMin: 95.0,
          rtpMax: 98.5,
          rtpJitter: 0.8,
          hitsMin: 900,
          hitsMax: 3600,
          shuffle: true
        });
        build();
        restart();
      };
    })();
</script>

<section id="testimonials" class="t-section">
  <div class="container t-grid">
    <div class="t-copy">
      <span class="t-eyebrow">⭐ TESTIMONI</span>
      <h2 class="t-title">PENGALAMAN ASLI<br><span>PENGGUNA DUNIA77</span></h2>

      <div class="t-score">
        <div class="t-score-num">4.9</div>
        <div class="t-score-meta">
          <div class="t-stars" aria-hidden="true">
            <i>★</i><i>★</i><i>★</i><i>★</i><i>★</i>
          </div>
          <small>190K+ pengguna merasakan akses aman, layanan transparan, dan pengalaman konsisten.</small>
        </div>
      </div>
    </div>

    <div class="t-slider" id="tSlider">
      <div class="t-stack" aria-live="polite">
        <article class="t-card">
          <header class="t-card-head">
            <img src="https://i.pravatar.cc/60?img=18" alt="Aditya Ramdan">
            <div>
              <strong>Aditya Ramdan</strong>
              <small>Pemain Slot Aktif</small>
            </div>
          </header>
          <p class="t-quote">Platform <strong>DUNIA77</strong> sangat aman dan stabil. Akses resmi, informasi terverifikasi, dan layanan yang transparan membuat pengalaman lebih nyaman.</p>
        </article>

        <article class="t-card">
          <header class="t-card-head">
            <img src="https://i.pravatar.cc/60?img=47" alt="Nadia Kusuma">
            <div>
              <strong>Nadia Kusuma</strong>
              <small>VIP Gold Member</small>
            </div>
          </header>
          <p class="t-quote">Sistem keamanan <strong>DUNIA77</strong> sangat terpercaya. Data terlindungi dengan baik dan dukungan 24/7 selalu responsif.</p>
        </article>

        <article class="t-card">
          <header class="t-card-head">
            <img src="https://i.pravatar.cc/60?img=21" alt="Angle Hasibuan">
            <div>
              <strong>Angle Hasibuan</strong>
              <small>Pemain Harian</small>
            </div>
          </header>
          <p class="t-quote">Informasi di <strong>DUNIA77</strong> selalu terverifikasi dan transparan. Tidak ada informasi yang menyesatkan, semua jelas dan mudah dipahami.</p>
        </article>

        <article class="t-card">
          <header class="t-card-head">
            <img src="https://i.pravatar.cc/60?img=14" alt="Cynthia Anggraini">
            <div>
              <strong>Cynthia Anggraini</strong>
              <small>Member Platinum</small>
            </div>
          </header>
          <p class="t-quote">Pengalaman pengguna di <strong>DUNIA77</strong> sangat konsisten di semua perangkat. Multi-device support bekerja dengan sempurna.</p>
        </article>
      </div>

      <div class="t-dots" id="tDots" aria-label="Testimonials pagination"></div>
    </div>
  </div>
</section>
<script>
(() => {
  const root = document.getElementById('tSlider');
  if (!root) return;

  const stack   = root.querySelector('.t-stack');
  const cards   = [...stack.children];
  const dots    = document.getElementById('tDots');

  dots.innerHTML = '';
  cards.forEach((_, i) => {
    const b = document.createElement('button');
    b.className = 't-dot'; b.type = 'button';
    b.setAttribute('aria-label', `Go to slide ${i+1}`);
    b.onclick = () => go(i, true);
    dots.appendChild(b);
  });

  let idx = 0, hovering = false, busy = false, timer = null;

  const AUTO_MS = 2600;
  const ANI_MS  = 320;

  const OFF  = [-28,-12,0,12,24];
  const TILT = [ -6, -3,0, 3, 6];

  const tfm = (i, active, dx=0) => {
    const rel = i - active;
    const c = Math.max(-2, Math.min(2, rel));
    const x = OFF[c+2] + dx;
    const r = TILT[c+2];
    const s = c===0 ? 1 : 0.985;
    return `translate3d(${x}px,0,0) rotate(${r}deg) scale(${s})`;
  };

  function layout(active, dragDX=0){
    cards.forEach((el,i)=>{
      const rel = i - active;
      const c = Math.max(-2, Math.min(2, rel));
      let o = 1 - Math.abs(rel)*0.25;
      if (dragDX && rel===0) o = Math.max(0, 1 - Math.abs(dragDX)/420);
      el.style.zIndex = 100 - Math.abs(c);
      el.style.opacity = o;
      el.classList.toggle('is-active', c===0);
      el.style.transform = tfm(i, active, rel===0 ? dragDX : 0);
    });
    [...dots.children].forEach((d,i)=>
      d.setAttribute('aria-current', i===active ? 'true' : 'false')
    );
  }

  const disableTransition = el => {
    if (!el) return;
    el.dataset._tr = el.style.transition || '';
    el.style.transition = 'none';
  };
  const restoreTransition = el => {
    if (!el) return;
    el.style.transition = el.dataset._tr || '';
    delete el.dataset._tr;
  };

  function animateSwap(from, to) {
    if (from === to) return Promise.resolve();

    const a = cards[from], b = cards[to];
    a.style.zIndex = 101;
    b.style.zIndex = 102;

    disableTransition(a);
    disableTransition(b);

    const ease = 'cubic-bezier(.2,.7,.2,1)';
    const aStart = tfm(from, from);
    const aEnd   = tfm(from, to);
    const bStart = tfm(to, from);
    const bEnd   = tfm(to, to);

    a.style.opacity = 1;
    a.style.transform = aStart;
    b.style.opacity = 0;
    b.style.transform = bStart;
    void a.offsetWidth;

    const out = a.animate(
      [{opacity:1, transform:aStart}, {opacity:0, transform:aEnd}],
      {duration:ANI_MS, easing:ease, fill:'forwards'}
    );
    const inn = b.animate(
      [{opacity:0, transform:bStart}, {opacity:1, transform:bEnd}],
      {duration:ANI_MS, easing:ease, fill:'forwards'}
    );

    return Promise.all([out.finished, inn.finished]).then(() => {
      a.style.opacity = 0;
      a.style.transform = aEnd;
      b.style.opacity = 1;
      b.style.transform = bEnd;
      restoreTransition(a);
      restoreTransition(b);
    });
  }

  function go(n, manual=false){
    if (busy) return;
    const next = (n + cards.length) % cards.length;
    if (next===idx) return;
    busy = true;
    const prev = idx; idx = next;
    layout(prev);
    animateSwap(prev,next).then(()=>{
      layout(next);
      busy = false;
      if (manual) schedule();
    });
  }

  function next(){ go(idx+1); }

  function schedule(){
    clearTimeout(timer);
    timer = setTimeout(() => {
      if (!hovering && !busy) next();
      else schedule();
    }, AUTO_MS);
  }

  root.onmouseenter = () => { hovering = true; };
  root.onmouseleave = () => { hovering = false; schedule(); };

  let startX=0, startY=0, dragging=false, lockX=false, lastX=0, lastT=0, vx=0;
  const HTHRESH=52, VEL=0.42;

  root.addEventListener('pointerdown', e=>{
    if (busy) return;
    startX=lastX=e.clientX; startY=e.clientY; lastT=performance.now();
    dragging=true; lockX=false; vx=0;
    root.setPointerCapture(e.pointerId);
    clearTimeout(timer);
  }, {passive:true});

  root.addEventListener('pointermove', e=>{
    if (!dragging) return;
    const dx = e.clientX - startX;
    const dy = e.clientY - startY;
    if (!lockX){
      if (Math.abs(dx)>8 && Math.abs(dx)>Math.abs(dy)){
        lockX=true; root.style.touchAction='none';
      } else return;
    }
    const now=performance.now(), dt=Math.max(1, now-lastT);
    vx = 0.9*vx + 0.1*((e.clientX - lastX)/dt);
    lastX=e.clientX; lastT=now;
    layout(idx, dx);
    e.preventDefault();
  }, {passive:false});

  root.addEventListener('pointerup', e=>{
    if (!dragging) return;
    dragging=false; root.releasePointerCapture(e.pointerId);
    root.style.touchAction='pan-y';
    const dx = e.clientX - startX, speed=vx;
    const wantNext = dx < -HTHRESH || speed < -VEL;
    const wantPrev = dx >  HTHRESH || speed >  VEL;
    if (wantNext) go(idx+1, true);
    else if (wantPrev) go(idx-1, true);
    else layout(idx);
    schedule();
  }, {passive:true});

  layout(0);
  schedule();
})();
</script>

<footer class="footer">
  <div class="container" style="display:flex;gap:12px;justify-content:space-between;align-items:center;flex-wrap:wrap">
    <div>© <span id="y"></span> DUNIA77 — Akses Resmi Platform Digital dengan Sistem Aman & Stabil. Informasi terverifikasi, layanan transparan, dan pengalaman konsisten.</div>
    <div style="display:flex;gap:10px">
      <a class="btn" href="https://bit.ly/dunia77utm" target="_blank" rel="nofollow noopener">Akses Platform Resmi →</a>
    </div>
  </div>
</footer>

<script>
document.getElementById('y').textContent=new Date().getFullYear();
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"f0eff0c512d142faaf2684622c40b35f","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>
