/* SweetAlert2 harus selalu tampil di atas modal/overlay kustom manapun
           (mis. .admin-modal-backdrop, .auth-modal-backdrop) — beberapa modal
           kustom di situs ini pakai z-index lebih tinggi dari default SweetAlert2
           (1060), jadi tanpa ini alert bisa tampil "terkubur" di belakang modal
           dan tidak bisa diklik. */
        .swal2-container {
            z-index: 20000 !important;
        }

        :root {
            --primary-color: #173350;
            --accent-color: #0C7A6E;
            --coral-color: #E2643B;
            --amber-color: #D98A2B;
            --bg-color: #f8f9fc;
            --text-dark: #5a5c69;
            --transition-speed: 0.4s;
            --transition-curve: cubic-bezier(0.25, 0.8, 0.25, 1);
        }

        html {
            scroll-behavior: smooth;
            /* Selalu sisakan ruang scrollbar, supaya lebar halaman tidak
               "kedip"/geser waktu pindah dari halaman panjang (ada scrollbar)
               ke halaman pendek (belum ada scrollbar) atau sebaliknya --
               misalnya dari dashboard.html ke diagnostik.html.
               Catatan: cukup pakai "overflow-y: scroll" saja untuk ini --
               menambahkan "scrollbar-gutter: stable" di atasnya bikin
               sebagian browser (mis. Chrome di Windows) menyisakan ruang
               scrollbar dua kali lipat, sehingga muncul dua jalur scrollbar
               berdampingan di tepi kanan halaman. */
            overflow-y: scroll;
            /* overflow-x taruh di sini (bukan di body) -- kalau ditaruh di
               body, overflow-y body ikut "berubah" jadi auto (aturan CSS:
               salah satu sumbu di-set non-visible bikin sumbu lain yang
               masih visible ikut jadi auto), sehingga body diam-diam jadi
               scroll container sendiri. Akibatnya elemen position:sticky
               (topbar/navbar) jadi nempel ke body yang tidak pernah betulan
               di-scroll, bukan ke halaman -- jadi terlihat ikut ke-scroll
               ke atas alih-alih tetap terkunci. */
            overflow-x: hidden;
        }

        body {
            font-family: 'Poppins', sans-serif;
            background-color: var(--bg-color);
            color: var(--text-dark);
        }

        /* Scrollbar-nya sudah selalu ditampilkan lewat "overflow-y: scroll"
           di <html> (lihat komentar di atas), jadi kompensasi lebar
           scrollbar yang otomatis ditambahkan Bootstrap ke body
           (padding-right) waktu modal Masuk/Daftar dibuka jadi tidak
           diperlukan -- malah bikin halaman kelihatan geser sedikit ke
           kiri lalu balik lagi waktu modal ditutup.

           "overflow: hidden" bawaan Bootstrap di <body> (dipasang lewat
           inline style oleh JS-nya, bukan class CSS) JUGA perlu dibatalkan
           di sini -- bukan cuma soal double-scrollbar. Situs ini scroll di
           level <html> (bukan <body>, lihat "overflow-y: scroll" di atas),
           sementara <body> sendiri TIDAK PERNAH discroll (scrollTop-nya
           selalu 0). Kalau <body> ikut jadi "overflow: hidden" waktu modal
           dibuka, dia jadi ancestor ber-overflow-non-visible yang PALING
           DEKAT dengan navbar (lebih dekat dari <html>), sehingga
           "position: sticky" pada navbar (lihat .navbar-cakar) jadi
           berpatokan ke scrollTop <body> yang selalu 0 itu, bukan ke
           scrollTop <html> yang sebenarnya sedang discroll peserta --
           navbar-nya jadi lepas dari "nempel" dan balik ke posisi normal
           di dokumen (kelihatan seperti halaman "naik" tiba-tiba waktu
           dialog dibuka, atau navbar-nya malah hilang kalau peserta lagi
           scroll jauh ke bawah). "overflow:visible" di sini mengembalikan
           <html> sebagai satu-satunya ancestor ber-overflow-non-visible,
           supaya sticky-nya kembali berpatokan ke scroll yang benar --
           <html>-nya sendiri tetap terkunci lewat "cn-modal-scroll-lock"
           di bawah, jadi halaman di baliknya tetap tidak bisa ikut
           discroll peserta selama dialog masih terbuka. */
        body.modal-open {
            padding-right: 0 !important;
            overflow: visible !important;
        }

        /* SweetAlert2 melakukan hal yang PERSIS SAMA seperti modal Bootstrap
           di atas begitu dialognya (Swal.fire) terbuka -- diam-diam
           menambahkan "padding-right" ke <body> sendiri (lewat inline
           style, bukan class) untuk "mengompensasi" scrollbar yang dia
           kira baru hilang. Tapi di situs ini scrollbar-nya TIDAK PERNAH
           hilang -- dia selalu ada di <html> ("overflow-y: scroll" di
           atas, dan waktu dialog SweetAlert dibuka pun <html>-nya tidak
           disentuh) -- jadi padding tambahan itu cuma bikin halaman
           kelihatan geser sedikit ke kiri begitu dialognya muncul, lalu
           balik lagi begitu ditutup. "!important" di sini menang lawan
           inline style yang dipasang SweetAlert2, jadi paddingnya
           dipaksa selalu 0 -- konsisten dengan alasan body.modal-open di
           atas. */
        body {
            padding-right: 0 !important;
        }

        /* Ternyata paddingnya bukan satu-satunya biang keladi -- SweetAlert2
           JUGA menambahkan CSS-nya SENDIRI (bukan cuma inline style), yaitu
           aturan "body.swal2-shown { overflow: hidden; }" (dipasang lewat
           <style> yang disuntikkan otomatis begitu library-nya dimuat).
           Ini PERSIS bug yang sama dengan "overflow:hidden" bawaan
           Bootstrap yang sudah dinetralkan di body.modal-open di atas --
           komentar panjang di sana berlaku sama persis di sini: <body> di
           situs ini TIDAK PERNAH jadi tempat scroll (scroll-nya selalu di
           <html>), jadi begitu <body> ikut kena "overflow:hidden", dia jadi
           ancestor ber-overflow-non-visible yang paling dekat dengan
           konten, sehingga lebar/tata-letak halaman goyang sedikit
           (kelihatan "geser ke kiri") pas dialog SweetAlert2 muncul.
           Dilawan lagi di sini dengan cara yang sama -- overflow dipaksa
           balik ke "visible" selama dialog SweetAlert2 terbuka. */
        body.swal2-shown {
            overflow: visible !important;
        }

        /* Waktu form Daftar lebih tinggi dari layar, Bootstrap otomatis
           bikin modal-nya sendiri jadi bisa di-scroll (overflow-y:auto) --
           itu yang seharusnya dipakai untuk men-scroll isi modal. Tapi
           scrollbar bawaan <html> di atas ("overflow-y: scroll", selalu
           tampil) juga masih kelihatan di saat bersamaan, jadi seperti ada
           dua scrollbar berdampingan. Sembunyikan punya <html> selama
           modal terbuka -- lebar yang tadinya dipakai scrollbar
           dikompensasi lewat "padding-right" (dihitung & diisi via JS,
           lihat "initModalScrollLockFix" di main.js) supaya lebar halaman
           tidak berubah. Catatan: sengaja TIDAK pakai "scrollbar-gutter"
           untuk ini -- di sebagian browser itu bikin backdrop/modal
           Bootstrap (position:fixed, lebar 100%) tidak ikut menutupi celah
           yang disisakan, sehingga celahnya malah kelihatan sebagai garis
           terang di tepi kanan, mirip scrollbar kedua. */
        html.cn-modal-scroll-lock {
            overflow-y: hidden;
        }

        /* `.container` bawaan Bootstrap punya max-width TETAP di tiap
           breakpoint (540px / 720px / 960px / 1140px / 1320px), jadi
           begitu masuk suatu rentang lebar layar, lebarnya "mentok" di
           angka itu dan baru melompat lagi begitu lewat breakpoint
           berikutnya -- bukan mengikuti lebar layar secara halus. Ini
           yang bikin navbar/topbar (dan konten section lain yang sama-sama
           pakai .container) terasa "tidak ikut melebar" waktu resize di
           antara dua breakpoint. Di-override di sini jadi fluid (ikut
           lebar layar terus) dengan batas atas 1200px, berlaku di semua
           halaman yang memuat style.css (index, dashboard, diagnostik). */
        .container {
            width: 100%;
            max-width: 1200px;
        }

        /* Di lebar menengah (tablet/laptop kecil, ~768-1199px) container
           masih fluid mengisi hampir seluruh viewport, jadi padding bawaan
           12px terasa terlalu mepet ke kiri-kanan layar. Beri jarak lebih
           lega di rentang ini -- di layar besar (>=1200px) tidak perlu
           karena container sudah mentok di max-width 1200px dan margin
           tengahnya sendiri sudah memberi jarak natural ke tepi layar. */
        @media (min-width: 768px) and (max-width: 1199.98px) {
            .container {
                padding-left: 40px;
                padding-right: 40px;
            }
        }

        /* ===================== TRANSISI ANTAR HALAMAN ===================== */
        /* Halaman fade-in saat dimuat, dan fade-out sebentar sebelum pindah ke
           halaman lain (lihat js/transition.js). Dipakai di semua halaman. */
        @keyframes cnPageFadeIn {
            from {
                opacity: 0;
            }

            to {
                opacity: 1;
            }
        }

        @keyframes cnPageFadeOut {
            from {
                opacity: 1;
            }

            to {
                opacity: 0;
            }
        }

        body {
            /* "backwards" penting -- tanpa ini elemen sempat kelihatan penuh
               (opacity 1) sekilas sebelum animasi mulai dari opacity 0, jadi
               terasa "kedip"/muncul tiba-tiba (paling kentara di elemen kecil
               seperti footer). */
            animation: cnPageFadeIn 0.3s ease backwards;
        }

        body.cn-page-leaving {
            animation: cnPageFadeOut 0.18s ease forwards;
            pointer-events: none;
        }

        /* ===================== ANIMASI ===================== */
        .reveal {
            opacity: 0;
            transform: translateY(28px);
            transition: opacity 0.7s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.7s cubic-bezier(0.25, 0.8, 0.25, 1);
        }

        .reveal.in-view {
            opacity: 1;
            transform: translateY(0);
        }

        @media (prefers-reduced-motion: reduce) {
            .reveal {
                opacity: 1;
                transform: none;
                transition: none;
            }

            .hero-mascot-stack img {
                animation: none !important;
            }

            .pillar-icon,
            .mascot-img-frame {
                animation: none !important;
            }
        }

        @keyframes floaty {

            0%,
            100% {
                transform: translateY(0) rotate(var(--tilt, 0deg));
            }

            50% {
                transform: translateY(-14px) rotate(var(--tilt, 0deg));
            }
        }

        body.mobile-menu-locked {
            overflow: hidden;
        }

        /* ===================== BACK TO TOP ===================== */
        .back-to-top {
            position: fixed;
            right: 18px;
            bottom: 18px;
            width: 40px;
            height: 40px;
            border-radius: 50%;
            background: #fff;
            border: none;
            display: flex;
            align-items: center;
            justify-content: center;
            box-shadow: 0 8px 24px rgba(23, 51, 80, 0.2);
            cursor: pointer;
            z-index: 900;
            opacity: 0;
            visibility: hidden;
            transform: translateY(12px);
            transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s ease;
        }

        .back-to-top.show {
            opacity: 1;
            visibility: visible;
            transform: translateY(0);
        }

        .back-to-top:hover {
            transform: translateY(-3px);
        }

        .back-to-top i {
            color: var(--primary-color);
            font-size: 12px;
            position: relative;
            z-index: 2;
        }

        .back-to-top-ring {
            position: absolute;
            top: 0;
            left: 0;
            transform: rotate(-90deg);
        }

        .back-to-top-ring .ring-bg {
            fill: none;
            stroke: #eef1f6;
            stroke-width: 3;
        }

        .back-to-top-ring .ring-progress {
            fill: none;
            stroke: var(--accent-color);
            stroke-width: 3;
            stroke-linecap: round;
            transition: stroke-dashoffset 0.1s linear;
        }

        @media (prefers-reduced-motion: reduce) {
            .back-to-top {
                transition: none;
            }
        }

        a {
            text-decoration: none;
        }

        section {
            padding: 84px 0;
        }

        #beranda,
        #tentang,
        #landasan,
        #pemandu,
        #cara-belajar {
            scroll-margin-top: 90px;
        }

        .section-label {
            display: inline-flex;
            align-items: center;
            gap: 8px;
            font-size: 12.5px;
            font-weight: 600;
            color: var(--accent-color);
            background: rgba(12, 122, 110, 0.08);
            padding: 6px 14px;
            border-radius: 20px;
            margin-bottom: 16px;
        }

        .section-title {
            font-weight: 700;
            color: var(--primary-color);
            margin-bottom: 14px;
        }

        .section-sub {
            color: #8a8fa3;
            font-size: 15.5px;
            max-width: 640px;
        }

        /* ===================== NAVBAR ===================== */
        .navbar-cakar {
            /* Tinggi navbar FIXED (bukan auto ngikutin konten) supaya logo
               selalu ada di posisi vertikal yang sama persis di semua
               halaman (index.html, dashboard.html, dst), apapun isi
               konten di kanan-kirinya dan berapa pun tinggi teksnya. */
            height: 68px;
            display: flex;
            align-items: center;
            background: #fff;
            box-shadow: 0 2px 14px rgba(23, 51, 80, 0.06);
            padding: 0;
            position: sticky;
            top: 0;
            /* Sengaja LEBIH RENDAH dari z-index modal-backdrop (1050)
               bawaan Bootstrap -- waktu dialog Masuk/Daftar terbuka,
               backdrop-nya harus tetap menutupi & meredupkan navbar ini
               (bukan malah nongol di atas backdrop), supaya tombol
               Masuk/Daftar/menu di navbar TIDAK bisa diklik selama
               dialognya masih terbuka. */
            z-index: 1000;
            transition: box-shadow 0.3s ease, height 0.3s ease;
        }

        .navbar-cakar.scrolled {
            height: 56px;
            box-shadow: 0 6px 22px rgba(23, 51, 80, 0.12);
        }

        .navbar-cakar>.container {
            height: 100%;
        }

        .navbar-cakar .logo-img {
            height: 38px;
        }

        .nav-link-custom {
            color: var(--text-dark);
            font-weight: 500;
            font-size: 14.5px;
            margin: 0 14px;
            transition: color 0.2s ease;
        }

        .nav-link-custom:hover,
        .nav-link-custom.active {
            color: var(--accent-color);
        }

        /* ===================== MOBILE MENU ===================== */
        .navbar-toggler-custom {
            background: #eef1f6;
            border: none;
            font-size: 17px;
            color: var(--primary-color);
            width: 42px;
            height: 42px;
            border-radius: 12px;
            display: flex;
            align-items: center;
            justify-content: center;
            transition: background 0.2s ease;
            flex-shrink: 0;
        }

        .navbar-toggler-custom:hover {
            background: #e2e5ec;
        }

        .navbar-toggler-custom.is-open {
            background: var(--primary-color);
            color: #fff;
        }

        .mobile-menu-backdrop {
            display: none;
            position: fixed;
            inset: 0;
            background: rgba(10, 20, 30, 0.45);
            opacity: 0;
            transition: opacity 0.3s ease;
            z-index: 1040;
        }

        .mobile-menu-backdrop.open {
            display: block;
            opacity: 1;
        }

        .mobile-menu {
            position: fixed;
            top: 70px;
            left: 12px;
            right: 12px;
            background: #fff;
            border-radius: 18px;
            box-shadow: 0 20px 50px rgba(10, 20, 30, 0.28);
            max-height: 0;
            opacity: 0;
            overflow: hidden;
            transform: translateY(-10px);
            transition: max-height 0.35s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.25s ease, transform 0.3s ease;
            z-index: 1050;
        }

        .mobile-menu.open {
            max-height: calc(100vh - 100px);
            opacity: 1;
            transform: translateY(0);
            overflow-y: auto;
        }

        .mobile-menu .container {
            max-width: none;
            width: 100%;
            padding: 16px 18px 22px;
        }

        .mobile-nav-link {
            display: block;
            padding: 13px 16px;
            margin-bottom: 4px;
            border-radius: 12px;
            color: var(--text-dark);
            font-weight: 600;
            font-size: 15px;
            transition: background 0.2s ease, color 0.2s ease;
        }

        .mobile-nav-link:hover {
            background: #f3f6fa;
        }

        .mobile-nav-link.active {
            background: rgba(12, 122, 110, 0.1);
            color: var(--accent-color);
        }

        .mobile-auth-buttons {
            padding-top: 16px;
            margin-top: 8px;
            border-top: 1px solid #eef1f6;
        }

        .mobile-auth-buttons .btn-outline-nav {
            width: 100%;
            margin-bottom: 10px;
            padding: 12px 0;
            font-size: 14.5px;
        }

        .mobile-cta-btn {
            width: 100%;
            background: linear-gradient(90deg, var(--accent-color) 0%, #0a5c53 100%);
            color: #fff;
            font-weight: 700;
            padding: 12px 0;
            font-size: 14.5px;
            border-radius: 14px;
            border: none;
            box-shadow: 0 10px 22px rgba(12, 122, 110, 0.28);
            transition: transform 0.25s ease;
        }

        .mobile-cta-btn:hover {
            transform: translateY(-2px);
            color: #fff;
        }

        .btn-dashboard-nav-mobile {
            background: var(--primary-color);
            color: #fff;
            font-weight: 600;
            font-size: 14px;
            padding: 11px 0;
            border-radius: 10px;
            border: none;
            width: 100%;
        }

        .btn-outline-nav {
            border: 1.5px solid #e2e5ec;
            color: var(--primary-color);
            font-weight: 600;
            font-size: 14px;
            padding: 8px 20px;
            border-radius: 10px;
            transition: all var(--transition-speed) var(--transition-curve);
        }

        .btn-outline-nav:hover {
            border-color: var(--accent-color);
            color: var(--accent-color);
            transform: translateY(-2px);
        }

        .btn-solid-nav {
            background: var(--accent-color);
            color: #fff;
            font-weight: 600;
            font-size: 14px;
            padding: 9px 22px;
            border-radius: 10px;
            border: none;
            transition: all var(--transition-speed) var(--transition-curve);
        }

        .btn-solid-nav:hover {
            background: var(--primary-color);
            color: #fff;
            transform: translateY(-2px);
            box-shadow: 0 8px 18px rgba(23, 51, 80, 0.18);
        }

        .btn-dashboard-nav {
            background: var(--primary-color);
            color: #fff;
            font-weight: 600;
            font-size: 14px;
            padding: 9px 22px;
            border-radius: 10px;
            border: none;
        }

        .btn-dashboard-nav:hover {
            background: var(--accent-color);
            color: #fff;
        }

        /* ===================== HERO ===================== */
        .hero {
            background: linear-gradient(160deg, var(--primary-color) 0%, #0a2036 50%, var(--primary-color) 100%);
            background-size: 220% 220%;
            padding: 90px 0 70px;
            position: relative;
            overflow: hidden;
            animation: heroGradientShift 14s ease-in-out infinite;
        }

        @keyframes heroGradientShift {

            0%,
            100% {
                background-position: 0% 30%;
            }

            50% {
                background-position: 100% 70%;
            }
        }

        .hero::before {
            content: "";
            position: absolute;
            width: 480px;
            height: 480px;
            border-radius: 50%;
            background: rgba(12, 122, 110, 0.18);
            top: -200px;
            right: -160px;
            animation: heroBlobFloat1 9s ease-in-out infinite;
        }

        .hero::after {
            content: "";
            position: absolute;
            width: 340px;
            height: 340px;
            border-radius: 50%;
            background: rgba(226, 100, 59, 0.12);
            bottom: -160px;
            left: -120px;
            animation: heroBlobFloat2 11s ease-in-out infinite;
        }

        @keyframes heroBlobFloat1 {

            0%,
            100% {
                transform: translate(0, 0) scale(1);
            }

            50% {
                transform: translate(-24px, 24px) scale(1.08);
            }
        }

        @keyframes heroBlobFloat2 {

            0%,
            100% {
                transform: translate(0, 0) scale(1);
            }

            50% {
                transform: translate(20px, -18px) scale(1.1);
            }
        }

        @media (prefers-reduced-motion: reduce) {
            .hero {
                animation: none;
            }

            .hero::before,
            .hero::after {
                animation: none;
            }
        }

        .hero-badge {
            display: inline-flex;
            align-items: center;
            gap: 8px;
            background: var(--coral-color);
            color: #fff;
            font-size: 12.5px;
            font-weight: 600;
            padding: 7px 16px;
            border-radius: 20px;
            margin-bottom: 22px;
        }

        .hero h1 {
            color: #fff;
            font-size: 2.6rem;
            font-weight: 700;
            line-height: 1.2;
            margin-bottom: 18px;
        }

        .hero p.lead {
            color: rgba(255, 255, 255, 0.78);
            font-size: 16px;
            max-width: 100%;
            margin-bottom: 30px;
        }

        .hero-cta .btn {
            padding: 13px 26px;
            border-radius: 11px;
            font-weight: 600;
            font-size: 15px;
        }

        /* ===== Animasi masuk hero saat halaman index.html pertama kali
           dimuat -- bagian ini ada di atas layar (above the fold) jadi
           TIDAK memakai animasi scroll-reveal biasa (.reveal, yang baru
           jalan kalau elemennya discroll ke posisi yang kelihatan) --
           tiap elemen di sini langsung animasi begitu halaman siap,
           muncul satu-satu (badge -> judul -> paragraf -> tombol) biar
           kelihatan hidup, bukan langsung nongol semua sekaligus. */
        .hero-badge,
        .hero h1,
        .hero p.lead,
        .hero-cta {
            opacity: 0;
            transform: translateY(24px);
            animation: heroContentIn 0.8s cubic-bezier(0.25, 0.8, 0.25, 1) forwards;
        }

        .hero-badge {
            animation-delay: 0.15s;
        }

        .hero h1 {
            animation-delay: 0.28s;
        }

        .hero p.lead {
            animation-delay: 0.42s;
        }

        .hero-cta {
            animation-delay: 0.56s;
        }

        @keyframes heroContentIn {
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        .hero-mascot-stack {
            position: relative;
            height: 420px;
            opacity: 0;
            transform: translateY(24px) scale(0.94);
            animation: heroMascotStackIn 0.9s cubic-bezier(0.25, 0.8, 0.25, 1) forwards;
            animation-delay: 0.35s;
        }

        @keyframes heroMascotStackIn {
            to {
                opacity: 1;
                transform: translateY(0) scale(1);
            }
        }

        @media (prefers-reduced-motion: reduce) {

            .hero-badge,
            .hero h1,
            .hero p.lead,
            .hero-cta,
            .hero-mascot-stack {
                opacity: 1;
                transform: none;
                animation: none;
            }
        }

        .hero-mascot-stack img {
            position: absolute;
            border-radius: 18px;
            box-shadow: 0 18px 40px rgba(0, 0, 0, 0.35);
        }

        .hero-mascot-stack .m1 {
            width: 190px;
            top: 10px;
            left: 30px;
            --tilt: -6deg;
            transform: rotate(-6deg);
            z-index: 2;
            animation: floaty 4.5s ease-in-out infinite;
            animation-delay: 0s;
        }

        .hero-mascot-stack .m2 {
            width: 210px;
            top: 90px;
            right: 10px;
            --tilt: 5deg;
            transform: rotate(5deg);
            z-index: 3;
            animation: floaty 5.2s ease-in-out infinite;
            animation-delay: 0.6s;
        }

        .hero-mascot-stack .m3 {
            width: 180px;
            bottom: 0;
            left: 110px;
            --tilt: -3deg;
            transform: rotate(-3deg);
            z-index: 1;
            animation: floaty 4.8s ease-in-out infinite;
            animation-delay: 1.1s;
        }

        @media (max-width: 991px) {
            .hero-mascot-stack {
                height: 320px;
                margin-top: 30px;
            }

            .hero-mascot-stack .m1 {
                width: 126px;
                top: 0;
                left: 2px;
            }

            .hero-mascot-stack .m2 {
                width: 146px;
                top: 0;
                right: 2px;
                left: auto;
            }

            .hero-mascot-stack .m3 {
                width: 136px;
                top: auto;
                bottom: 0;
                left: 50%;
                margin-left: -68px;
            }
        }

        /* ===================== ABOUT ===================== */
        .about-card {
            background: #fff;
            border-radius: 16px;
            padding: 30px;
            box-shadow: 0 4px 20px rgba(23, 51, 80, 0.07);
            height: 100%;
            transition: transform 0.35s cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 0.35s ease;
        }

        .about-card:hover {
            transform: translateY(-8px);
            box-shadow: 0 14px 30px rgba(23, 51, 80, 0.12);
        }

        .about-card .icon-badge {
            width: 46px;
            height: 46px;
            border-radius: 12px;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-bottom: 16px;
            font-size: 19px;
            color: #fff;
        }

        .about-card h5 {
            font-weight: 700;
            color: var(--primary-color);
            margin-bottom: 10px;
        }

        .about-card p {
            font-size: 14.5px;
            color: #8a8fa3;
            margin: 0;
        }

        /* ===================== PILLARS ===================== */
        .bg-soft {
            background: #fff;
        }

        .pillar-card {
            background: #fff;
            border-radius: 16px;
            padding: 28px;
            height: 100%;
            border-top: 4px solid var(--accent-color);
            box-shadow: 0 4px 20px rgba(23, 51, 80, 0.06);
            transition: transform 0.35s cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 0.35s ease;
        }

        .pillar-card:hover {
            transform: translateY(-8px);
            box-shadow: 0 14px 30px rgba(23, 51, 80, 0.12);
        }

        .pillar-card:nth-child(2) {
            border-top-color: var(--coral-color);
        }

        .pillar-card:nth-child(3) {
            border-top-color: var(--amber-color);
        }

        .pillar-icon {
            width: 48px;
            height: 48px;
            border-radius: 13px;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-bottom: 16px;
            color: #fff;
            font-size: 19px;
            background: var(--accent-color);
            animation: pillarBreathe 3.4s ease-in-out infinite;
        }

        .pillar-card:nth-child(2) .pillar-icon {
            background: var(--coral-color);
            animation-delay: 0.35s;
        }

        .pillar-card:nth-child(3) .pillar-icon {
            background: var(--amber-color);
            animation-delay: 0.7s;
        }

        @keyframes pillarBreathe {

            0%,
            100% {
                transform: scale(1);
            }

            50% {
                transform: scale(1.1);
            }
        }

        .pillar-card h5 {
            font-weight: 700;
            color: var(--primary-color);
            margin-bottom: 10px;
        }

        .pillar-card p {
            font-size: 14px;
            color: #8a8fa3;
            margin: 0;
        }

        /* ===================== MASCOTS ===================== */
        .mascot-showcase {
            background: #fff;
            border-radius: 18px;
            overflow: hidden;
            box-shadow: 0 6px 26px rgba(23, 51, 80, 0.08);
            height: 100%;
            transition: transform 0.35s cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 0.35s ease;
        }

        .mascot-showcase:hover {
            transform: translateY(-8px);
            box-shadow: 0 16px 34px rgba(23, 51, 80, 0.14);
        }

        .mascot-img-frame {
            overflow: hidden;
            animation: mascotBob 3.6s ease-in-out infinite;
        }

        .mascot-showcase:nth-child(2) .mascot-img-frame {
            animation-delay: 0.3s;
        }

        .mascot-showcase:nth-child(3) .mascot-img-frame {
            animation-delay: 0.6s;
        }

        @keyframes mascotBob {

            0%,
            100% {
                transform: translateY(0);
            }

            50% {
                transform: translateY(-10px);
            }
        }

        .mascot-showcase img {
            width: 100%;
            display: block;
            transition: transform 0.5s ease;
        }

        .mascot-showcase:hover img {
            transform: scale(1.04);
        }

        .mascot-showcase-body {
            padding: 22px 24px 26px;
        }

        .mascot-showcase-body h5 {
            font-weight: 700;
            color: var(--primary-color);
            margin-bottom: 2px;
        }

        .mascot-showcase-body .role {
            font-size: 12.5px;
            font-weight: 600;
            margin-bottom: 10px;
        }

        .mascot-showcase-body p {
            font-size: 14px;
            color: #8a8fa3;
            margin: 0;
        }

        /* ===================== HOW IT WORKS ===================== */
        .step-item {
            display: flex;
            gap: 18px;
            margin-bottom: 30px;
        }

        .step-num {
            width: 42px;
            height: 42px;
            border-radius: 50%;
            background: var(--primary-color);
            color: #fff;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: 700;
            flex-shrink: 0;
        }

        .step-item h6 {
            font-weight: 700;
            color: var(--primary-color);
            margin-bottom: 4px;
        }

        .step-item p {
            font-size: 14px;
            color: #8a8fa3;
            margin: 0;
        }

        /* ===================== CTA ===================== */
        .cta-section {
            background: linear-gradient(135deg, var(--accent-color) 0%, #095c53 100%);
            border-radius: 24px;
            padding: 56px 44px;
            color: #fff;
            text-align: center;
        }

        .cta-section h2 {
            font-weight: 700;
            margin-bottom: 12px;
        }

        .cta-section p {
            color: rgba(255, 255, 255, 0.85);
            max-width: 520px;
            margin: 0 auto 26px;
        }

        .cta-section .btn {
            padding: 13px 30px;
            border-radius: 11px;
            font-weight: 600;
            background: #fff;
            color: var(--accent-color);
            border: none;
        }

        .cta-section .btn:hover {
            background: var(--primary-color);
            color: #fff;
        }

        /* ===================== FOOTER ===================== */
        footer.site-footer {
            background: var(--primary-color);
            color: rgba(255, 255, 255, 0.7);
            padding: 48px 0 26px;
            font-size: 13.5px;
        }

        footer.site-footer a {
            color: rgba(255, 255, 255, 0.75);
        }

        footer.site-footer a:hover {
            color: #fff;
        }

        .footer-brand-row {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 14px;
        }

        .footer-logo-badge {
            width: 46px;
            height: 46px;
            border-radius: 12px;
            background: #fff;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 7px;
            flex-shrink: 0;
        }

        .footer-logo-badge img {
            width: 100%;
            height: 100%;
            object-fit: contain;
        }

        .footer-brand-name {
            font-family: var(--font-display, inherit);
            font-weight: 700;
            font-size: 1.2rem;
            color: #fff;
            line-height: 1.2;
        }

        .footer-tagline {
            color: var(--accent-color);
            font-weight: 600;
            font-size: 12.5px;
        }

        .footer-desc {
            max-width: 460px;
            font-size: 13.5px;
            color: rgba(255, 255, 255, 0.6);
            margin-bottom: 0;
        }

        .footer-heading {
            color: var(--accent-color);
            font-weight: 700;
            font-size: 12px;
            letter-spacing: 0.06em;
            text-transform: uppercase;
            margin-bottom: 14px;
        }

        .footer-links {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .footer-links a {
            font-size: 14px;
            font-weight: 500;
        }

        .footer-divider {
            border: none;
            border-top: 1px solid rgba(255, 255, 255, 0.12);
            margin: 30px 0 18px;
        }

        .footer-bottom {
            color: rgba(255, 255, 255, 0.55);
            font-size: 12.5px;
        }

        /* --- Versi footer minimal (copyright saja), dipakai di halaman selain landing page --- */
        footer.site-footer-minimal {
            padding: 18px 0;
        }

        .site-footer-minimal .footer-bottom {
            text-align: center;
        }

        /* ===================== AUTH MODAL (reuse pola tab) ===================== */
        .auth-modal-dialog {
            max-width: 420px;
            /* Navbar sekarang sengaja ditaruh di atas backdrop modal ini
               (lihat z-index .navbar-cakar) supaya tetap kelihatan
               dimanapun peserta lagi scroll waktu dialog dibuka -- jadi
               dialognya digeser turun sedikit di bawah navbar (bukan nempel
               dari paling atas layar lagi) supaya tidak numpuk/ketiban
               navbar-nya. */
            margin-top: 92px;
        }

        /* Waktu form Daftar (jauh lebih panjang dari Masuk) bikin tinggi
           modal-nya melebihi layar, Bootstrap otomatis bikin elemen
           #authModal sendiri (bukan modal-dialog) yang jadi scrollable
           (overflow-y:auto bawaan). Scrollbar bawaan ini "memakan" sedikit
           lebar dari dalam #authModal, jadi area yang dipakai untuk
           menengahkan modal-dialog secara horizontal jadi sedikit lebih
           sempit -> modal-dialog kelihatan geser dikit ke kiri waktu pindah
           dari Masuk (belum perlu scroll) ke Daftar (perlu scroll).
           Fix: selalu sisakan ruang scrollbar di #authModal, baik lagi
           dibutuhkan atau tidak, supaya lebar area penengahannya konsisten. */
        #authModal {
            scrollbar-gutter: stable;
        }

        /* Pembungkus form Masuk & Daftar -- tingginya dianimasikan lewat JS
           (switchTab() di main.js, set inline style height) waktu pindah
           tab, dan isi form yang masuk/keluar di-crossfade lewat class
           auth-view-entering/auth-view-leaving di bawah.

           "overflow: hidden" di sini WAJIB ada supaya animasi tingginya
           rapi (isi form yang belum "muat" tidak kelihatan meluber ke
           bawah waktu masih dianimasikan). Tapi karena lebar field input
           di dalamnya pas 100% selebar pembungkus ini (tanpa jarak), efek
           "glow" hijau waktu field di-fokus (lihat .form-control:focus,
           box-shadow menyebar sedikit ke kanan-kiri) jadi ikut kepotong
           oleh overflow:hidden ini. Kasih sedikit ruang ekstra kanan-kiri
           lewat margin negatif + padding yang sama besar -- lebar konten
           di dalamnya tetap sama persis (margin negatif "meminjam" ruang,
           padding "mengembalikan"-nya), tapi sekarang ada sedikit jarak
           aman untuk glow itu sebelum kena potong. */
        .auth-views-wrap {
            position: relative;
            overflow: hidden;
            margin: 0 -6px;
            padding: 0 6px;
        }

        .auth-views-wrap.auth-views-animating {
            transition: height 0.32s var(--transition-curve);
        }

        /* Animasi "geser horizontal searah tab": Daftar ada di sebelah
           KANAN Masuk pada tombol tab-nya, jadi waktu pindah Masuk ->
           Daftar, form lama geser & fade keluar ke KIRI sementara form
           baru masuk & fade dari KANAN -- begitu juga sebaliknya. Arahnya
           ditentukan lewat class dari JS (switchTab()/animateAuthTabSwitch
           di main.js): auth-view-entering-from-kanan/kiri dan
           auth-view-leaving-ke-kiri/kanan. */
        .auth-form-view.auth-view-entering-from-kanan {
            animation: authViewSlideInDariKanan 0.32s var(--transition-curve);
        }

        .auth-form-view.auth-view-entering-from-kiri {
            animation: authViewSlideInDariKiri 0.32s var(--transition-curve);
        }

        .auth-form-view.auth-view-leaving-ke-kiri,
        .auth-form-view.auth-view-leaving-ke-kanan {
            display: block;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            pointer-events: none;
        }

        .auth-form-view.auth-view-leaving-ke-kiri {
            animation: authViewSlideOutKeKiri 0.22s ease forwards;
        }

        .auth-form-view.auth-view-leaving-ke-kanan {
            animation: authViewSlideOutKeKanan 0.22s ease forwards;
        }

        @keyframes authViewSlideInDariKanan {
            from {
                opacity: 0;
                transform: translateX(28px);
            }

            to {
                opacity: 1;
                transform: translateX(0);
            }
        }

        @keyframes authViewSlideInDariKiri {
            from {
                opacity: 0;
                transform: translateX(-28px);
            }

            to {
                opacity: 1;
                transform: translateX(0);
            }
        }

        @keyframes authViewSlideOutKeKiri {
            from {
                opacity: 1;
                transform: translateX(0);
            }

            to {
                opacity: 0;
                transform: translateX(-28px);
            }
        }

        @keyframes authViewSlideOutKeKanan {
            from {
                opacity: 1;
                transform: translateX(0);
            }

            to {
                opacity: 0;
                transform: translateX(28px);
            }
        }

        @media (max-width: 575.98px) {
            .auth-modal-dialog {
                margin-left: 18px;
                margin-right: 18px;
            }
        }

        @media (min-width: 992px) {
            .auth-modal-dialog {
                max-width: 480px;
            }
        }

        .auth-tabs {
            display: flex;
            background: #eef1f6;
            border-radius: 12px;
            padding: 4px;
            margin-bottom: 24px;
        }

        .auth-tab-btn {
            flex: 1;
            border: none;
            background: transparent;
            padding: 10px 0;
            font-weight: 600;
            font-size: 14px;
            color: var(--text-dark);
            border-radius: 9px;
            transition: all var(--transition-speed) var(--transition-curve);
        }

        .auth-tab-btn.active {
            background: #fff;
            color: var(--primary-color);
            box-shadow: 0 2px 6px rgba(23, 51, 80, 0.12);
        }

        .form-label {
            font-size: 13px;
            font-weight: 600;
            color: var(--text-dark);
        }

        /* Checkbox "Ingat saya di perangkat ini" di form Masuk -- lihat
           #login-remember di index.html & muatIngatLogin()/
           simpanAtauHapusIngatLogin() di main.js. Ditaruh negatif-margin
           dikit (margin-top) supaya jaraknya ke field Kata Sandi di
           atasnya tidak terlalu lega (field itu sudah punya margin-bottom
           sendiri lewat kelas Bootstrap "mb-4"). */
        .auth-remember-check {
            margin-top: -10px;
        }

        .auth-remember-label {
            display: flex;
            align-items: center;
            gap: 8px;
            font-size: 13.5px;
            color: var(--text-dark);
            cursor: pointer;
            user-select: none;
        }

        .auth-remember-label input[type="checkbox"] {
            width: 16px;
            height: 16px;
            accent-color: var(--accent-color);
            cursor: pointer;
            margin: 0;
        }

        .form-control {
            border-radius: 10px;
            border: 1px solid #e2e5ec;
            padding: 11px 14px;
            font-size: 14.5px;
        }

        .form-control:focus {
            border-color: var(--accent-color);
            box-shadow: 0 0 0 0.2rem rgba(12, 122, 110, 0.15);
        }

        /* Indikator validasi real-time (kata sandi & konfirmasinya) */
        .form-control.cn-input-valid {
            border-color: #0C7A6E;
        }

        .form-control.cn-input-valid:focus {
            box-shadow: 0 0 0 0.2rem rgba(12, 122, 110, 0.15);
        }

        .form-control.cn-input-invalid {
            border-color: #d64550;
        }

        .form-control.cn-input-invalid:focus {
            box-shadow: 0 0 0 0.2rem rgba(214, 69, 80, 0.15);
        }

        .input-icon-group {
            position: relative;
        }

        .input-icon-group i {
            position: absolute;
            top: 50%;
            left: 14px;
            transform: translateY(-50%);
            color: #b4b8c5;
            font-size: 14px;
        }

        .input-icon-group .form-control {
            padding-left: 38px;
        }

        .input-icon-group .form-control.has-check-icon {
            padding-right: 34px;
        }

        .input-icon-group .form-control.has-eye-icon {
            padding-right: 38px;
        }

        .input-icon-group .form-control.has-check-icon.has-eye-icon {
            padding-right: 64px;
        }

        .input-icon-group .cn-input-check-icon {
            position: absolute;
            top: 50%;
            right: 14px;
            left: auto;
            transform: translateY(-50%);
            color: #0C7A6E;
            font-size: 15px;
            opacity: 0;
            transition: opacity 0.15s ease;
            pointer-events: none;
        }

        .input-icon-group .cn-input-check-icon.show {
            opacity: 1;
        }

        .input-icon-group .cn-input-check-icon.with-eye {
            right: 40px;
        }

        .input-icon-group .cn-toggle-eye {
            position: absolute;
            top: 50%;
            right: 14px;
            left: auto;
            transform: translateY(-50%);
            color: #98a0ad;
            font-size: 14px;
            cursor: pointer;
            z-index: 2;
        }

        .input-icon-group .cn-toggle-eye:hover {
            color: #566072;
        }

        /* Ikon mata yang dikunci -- dipakai saat kata sandi login keisi
           otomatis lewat "Ingat saya" (lihat setLoginPasswordEyeLocked()
           di js/main.js), supaya tidak bisa ditampilkan lewat ikon ini. */
        .input-icon-group .cn-toggle-eye.cn-eye-locked {
            cursor: not-allowed;
            opacity: 0.4;
        }

        .input-icon-group .cn-toggle-eye.cn-eye-locked:hover {
            color: #98a0ad;
        }

        /* Penghitung karakter (mis. "12/30") di dalam field, rata kanan --
           dipakai di kolom Nama Lengkap supaya tidak perlu baris terpisah
           di bawah form. */
        .input-icon-group .cn-input-counter {
            position: absolute;
            top: 50%;
            right: 14px;
            transform: translateY(-50%);
            font-size: 11px;
            color: #98a0ad;
            pointer-events: none;
            white-space: nowrap;
            transition: color 0.15s ease;
        }

        .input-icon-group .cn-input-counter.cn-hint-invalid {
            color: #d64550;
        }

        .input-icon-group .form-control.has-counter {
            padding-right: 52px;
        }

        /* Keterangan dinamis di bawah input (mis. status validasi kata sandi) */
        .cn-input-hint {
            font-size: 11.5px;
            min-height: 14px;
            transition: color 0.15s ease;
        }

        /* Selama belum ada pesan (mis. field email sebelum diisi), jangan
           sisakan ruang kosong -- supaya jarak ke field berikutnya sama
           dengan field lain yang tidak punya baris keterangan sama sekali. */
        .cn-input-hint:empty {
            min-height: 0;
            margin-top: 0;
        }

        .cn-input-hint.cn-hint-valid {
            color: #0C7A6E;
        }

        .cn-input-hint.cn-hint-invalid {
            color: #d64550;
        }

        .btn-auth-submit {
            width: 100%;
            background: var(--accent-color);
            border: none;
            color: #fff;
            font-weight: 600;
            padding: 12px 0;
            border-radius: 10px;
            transition: background var(--transition-speed) var(--transition-curve);
        }

        .btn-auth-submit:hover {
            background: var(--primary-color);
            color: #fff;
        }

        .btn-auth-submit:disabled {
            opacity: .7;
        }

        .auth-form-view {
            display: none;
        }

        .auth-form-view.active {
            display: block;
        }

        @media (max-width: 767px) {
            .hero h1 {
                font-size: 2rem;
            }

            section {
                padding: 56px 0;
            }

            .container {
                padding-left: 24px;
                padding-right: 24px;
            }
        }