/* =====================================================================
   Diamondo Web — Apple-style design system
   Ditulis ulang dengan pendekatan gaya Apple: tipografi SF Pro, radius
   besar & konsisten, shadow lembut berlapis (bukan border tebal),
   transisi halus, dan focus ring biru. Semua nama class dipertahankan
   sama seperti sebelumnya supaya tidak ada halaman yang rusak — cuma
   nilai visualnya (warna, radius, shadow, transisi) yang diperhalus.
   ===================================================================== */

:root {
    /* Warna sistem, gaya Apple (biru sistem, merah/hijau/oranye Apple) */
    --primary: #0071e3;
    --primary-dark: #0058b0;
    --danger: #ff3b30;
    --success: #34c759;
    --warning: #ff9500;

    --bg: #f5f5f7;
    --card: #ffffff;
    --text: #1d1d1f;
    --muted: #6e6e73;
    --border: #e5e5ea;
    --sidebar-width: 280px;

    /* Token tambahan supaya warna yang tadinya ditulis langsung (mis.
       rgba(0,0,0,0.05) atau #fff) bisa ikut berubah otomatis saat mode
       gelap aktif, tanpa perlu mengubah tiap aturan satu-satu. */
    --hairline: rgba(0,0,0,0.06);
    --hairline-soft: rgba(0,0,0,0.05);
    --input-bg: #ffffff;
    --surface-tint: rgba(0,0,0,0.02);
    --surface-tint-2: rgba(0,0,0,0.025);
    --scrollbar-thumb: rgba(0,0,0,0.18);
    --scrollbar-thumb-hover: rgba(0,0,0,0.28);

    /* Warna brand sidebar (Diamondo Web) — burgundy dalam, gaya "System
       Preferences" Apple: gradasi halus, tidak pudar jadi pink di bawah */
    --sidebar-color: #7a1226;
    --sidebar-color-light: #9c2438;
    --sidebar-color-dark: #4a0a16;

    /* Token desain: radius & shadow konsisten dipakai di semua komponen */
    --radius-lg: 20px;
    --radius-md: 14px;
    --radius-sm: 10px;
    --ease: cubic-bezier(0.4, 0, 0.2, 1);
    --shadow-xs: 0 1px 2px rgba(0,0,0,0.05);
    --shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
    --shadow-md: 0 8px 24px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.05);
    --shadow-lg: 0 20px 48px rgba(0,0,0,0.14), 0 4px 12px rgba(0,0,0,0.06);

    /* Memberi tahu browser supaya kontrol bawaan (kalender date-picker,
       tombol "Choose File", scrollbar) dirender versi terang -- browser
       otomatis pakai versi gelapnya begitu mode gelap aktif (lihat
       html[data-theme="dark"] di bawah). */
    color-scheme: light;
}

/* =====================================================================
   MODE GELAP
   Diaktifkan lewat atribut data-theme="dark" di elemen <html>, diatur
   oleh tombol toggle (lihat header.php) dan disimpan di localStorage
   supaya pilihan pengguna tetap dipakai tiap buka halaman baru.
   ===================================================================== */
html[data-theme="dark"] {
    color-scheme: dark;

    --bg: #1c1c1e;
    --card: #2c2c2e;
    --text: #f2f2f7;
    --muted: #98989f;
    --border: #3d3d40;

    --hairline: rgba(255,255,255,0.09);
    --hairline-soft: rgba(255,255,255,0.07);
    --input-bg: #3a3a3c;
    --surface-tint: rgba(255,255,255,0.04);
    --surface-tint-2: rgba(255,255,255,0.05);
    --scrollbar-thumb: rgba(255,255,255,0.16);
    --scrollbar-thumb-hover: rgba(255,255,255,0.26);

    --shadow-xs: 0 1px 2px rgba(0,0,0,0.25);
    --shadow-sm: 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.22);
    --shadow-md: 0 8px 24px rgba(0,0,0,0.38), 0 2px 6px rgba(0,0,0,0.22);
    --shadow-lg: 0 20px 48px rgba(0,0,0,0.5), 0 4px 12px rgba(0,0,0,0.3);
}

/* Beberapa warna badge/alert pakai teks gelap di atas latar tipis --
   di mode gelap latarnya digelapkan sedikit & teksnya dicerahkan biar
   kontrasnya tetap enak dibaca. */
html[data-theme="dark"] .badge-ok { background: rgba(52,199,89,0.18); color: #63d67e; }
html[data-theme="dark"] .badge-warn { background: rgba(255,149,0,0.2); color: #ffb84d; }
html[data-theme="dark"] .badge-kuning { background: rgba(255,204,0,0.22); color: #e0c04a; }
html[data-theme="dark"] .badge-danger { background: rgba(255,59,48,0.2); color: #ff6961; }
html[data-theme="dark"] .badge-retur { background: rgba(124,58,237,0.22); color: #a78bfa; }
html[data-theme="dark"] .alert-success { background: rgba(52,199,89,0.16); color: #6fe08a; }
html[data-theme="dark"] .alert-danger { background: rgba(255,59,48,0.16); color: #ff8079; }
html[data-theme="dark"] .alert-warn { background: rgba(255,149,0,0.18); color: #ffb84d; }

/* Elemen yang di mode terang sengaja ditulis putih polos (bukan lewat
   variabel) supaya tetap pas dengan latar birunya sendiri di mode gelap. */
html[data-theme="dark"] input[type=text],
html[data-theme="dark"] input[type=number],
html[data-theme="dark"] input[type=search],
html[data-theme="dark"] input[type=date],
html[data-theme="dark"] input[type=password],
html[data-theme="dark"] input[type=email],
html[data-theme="dark"] input[type=tel],
html[data-theme="dark"] input[type=url],
html[data-theme="dark"] select,
html[data-theme="dark"] textarea,
html[data-theme="dark"] .pick-btn,
html[data-theme="dark"] .qty-adj button {
    background: var(--input-bg);
}
html[data-theme="dark"] th { background: var(--surface-tint); }
html[data-theme="dark"] .camera-modal-inner { background: #000; }

/* =====================================================================
   HALAMAN PENGATURAN -- segmented control, toggle switch, mode padat
   ===================================================================== */

/* Segmented control (mis. pilihan Terang / Gelap / Ikuti Sistem) */
.segmented {
    display: inline-flex;
    gap: 3px;
    padding: 3px;
    background: var(--bg);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
}
.segmented button {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 8px 14px;
    border: none;
    border-radius: 8px;
    background: none;
    color: var(--muted);
    font-size: 13.5px;
    font-weight: 600;
    font-family: inherit;
    cursor: pointer;
    transition: background 0.15s var(--ease), color 0.15s var(--ease);
    white-space: nowrap;
}
.segmented button svg { width: 15px; height: 15px; flex-shrink: 0; }
.segmented button:hover { color: var(--text); }
.segmented button.active {
    background: var(--card);
    color: var(--primary);
    box-shadow: var(--shadow-xs);
}

/* Toggle switch ala iOS, dipakai untuk preferensi on/off */
.switch-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 14px 0;
}
.switch-row + .switch-row { border-top: 1px solid var(--hairline); }
.switch-row-text { display: flex; flex-direction: column; gap: 2px; }
.switch-row-title { font-weight: 600; font-size: 14.5px; color: var(--text); }
.switch-row-desc { font-size: 12.5px; color: var(--muted); }

.switch {
    position: relative;
    display: inline-block;
    width: 46px;
    height: 27px;
    flex-shrink: 0;
}
.switch input { opacity: 0; width: 0; height: 0; }
.switch-track {
    position: absolute;
    inset: 0;
    background: var(--border);
    border-radius: 999px;
    cursor: pointer;
    transition: background 0.2s var(--ease);
}
.switch-track::before {
    content: "";
    position: absolute;
    width: 23px;
    height: 23px;
    left: 2px;
    top: 2px;
    background: #fff;
    border-radius: 50%;
    box-shadow: 0 1px 3px rgba(0,0,0,0.25);
    transition: transform 0.2s var(--ease);
}
.switch input:checked + .switch-track { background: var(--primary); }
.switch input:checked + .switch-track::before { transform: translateX(19px); }
.switch input:focus-visible + .switch-track { box-shadow: 0 0 0 4px rgba(0,113,227,0.2); }

/* Ringkasan akun read-only di kartu Pengaturan */
.settings-account {
    display: flex;
    align-items: center;
    gap: 14px;
    padding-bottom: 16px;
    margin-bottom: 16px;
    border-bottom: 1px solid var(--hairline);
}
.settings-account .user-avatar { width: 52px; height: 52px; font-size: 20px; }
.settings-account-name { font-weight: 700; font-size: 16px; color: var(--text); }
.settings-account-meta { font-size: 13px; color: var(--muted); margin-top: 2px; }
.settings-kv {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px 20px;
    margin-bottom: 16px;
}
.settings-kv-item .k { font-size: 12px; color: var(--muted); margin-bottom: 2px; }
.settings-kv-item .v { font-size: 14px; color: var(--text); font-weight: 600; }
@media (max-width: 560px) { .settings-kv { grid-template-columns: 1fr; } }

/* Mode Tampilan Padat -- kurangi padding di komponen utama supaya lebih
   banyak data kelihatan sekaligus di layar. */
html.compact .card { padding: 16px; }
html.compact .card + .card { margin-top: 12px; }
html.compact th, html.compact td { padding: 8px 12px; }
html.compact .stat-box { padding: 16px; }
html.compact .btn, html.compact .btn.secondary, html.compact .btn.outline { padding: 8px 16px; }
html.compact .field { margin-bottom: 10px; }

/* Swatch pilihan warna (Aksen & Latar Belakang) */
.swatch-row {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 4px;
}
.swatch {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    border: none;
    background: none;
    cursor: pointer;
    padding: 2px;
    font-family: inherit;
}
.swatch-dot {
    width: 34px;
    height: 34px;
    border-radius: 50%;
    border: 2px solid var(--border);
    transition: border-color 0.15s var(--ease), transform 0.1s var(--ease);
}
.swatch:hover .swatch-dot { transform: scale(1.08); }
.swatch.active .swatch-dot { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(0,113,227,0.18); }
.swatch-label { font-size: 11.5px; color: var(--muted); font-weight: 500; }
.swatch.active .swatch-label { color: var(--text); font-weight: 700; }

/* Slider volume suara scan */
input[type=range] {
    -webkit-appearance: none;
    appearance: none;
    width: 100%;
    height: 6px;
    border-radius: 999px;
    background: var(--border);
    outline: none;
    cursor: pointer;
}
input[type=range]::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: var(--primary);
    border: 3px solid var(--card);
    box-shadow: 0 1px 3px rgba(0,0,0,0.3);
    cursor: pointer;
}
input[type=range]::-moz-range-thumb {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: var(--primary);
    border: 3px solid var(--card);
    box-shadow: 0 1px 3px rgba(0,0,0,0.3);
    cursor: pointer;
}
input[type=range]:disabled { opacity: 0.4; cursor: not-allowed; }

* { box-sizing: border-box; }

html { scroll-behavior: smooth; }

body {
    margin: 0;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display",
                 "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    background: var(--bg);
    color: var(--text);
    line-height: 1.47;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    -webkit-tap-highlight-color: transparent;
}

::selection {
    background: rgba(0,113,227,0.25);
    color: inherit;
}

/* Di mode gelap, warna biru tipis di atas kartu/input yang sudah gelap
   jadi susah kelihatan -- dipakein warna aksen yang lebih terang & lebih
   pekat, sekalian teksnya dipastikan putih terang biar tetap kebaca
   persis pas lagi ngeblok angka di form. */
html[data-theme="dark"] ::selection {
    background: rgba(10,132,255,0.55);
    color: #ffffff;
}

/* Scrollbar custom (Webkit) — tipis & bulat, khas macOS/iOS */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
    background: var(--scrollbar-thumb);
    border-radius: 999px;
    border: 2px solid var(--bg);
}
::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-thumb-hover); }

/* Focus ring yang konsisten untuk aksesibilitas keyboard, gaya Apple
   (cincin biru lembut) — dipakai saat elemen difokus lewat keyboard. */
a:focus-visible,
button:focus-visible,
.btn:focus-visible,
.pick-btn:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
    outline: none;
    box-shadow: 0 0 0 4px rgba(0,113,227,0.35);
}

/* Hormati preferensi "reduced motion" pengguna */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* ================= SIDEBAR LAYOUT ================= */

.app-shell {
    display: flex;
    min-height: 100vh;
}

.sidebar-toggle {
    display: none;
    position: fixed;
    top: 14px;
    left: 14px;
    z-index: 30;
    width: 42px;
    height: 42px;
    align-items: center;
    justify-content: center;
    border-radius: var(--radius-sm);
    border: 1px solid rgba(255,255,255,0.5);
    background: rgba(255,255,255,0.35);
    backdrop-filter: blur(12px) saturate(150%);
    -webkit-backdrop-filter: blur(12px) saturate(150%);
    color: var(--text);
    font-size: 20px;
    line-height: 1;
    cursor: pointer;
    box-shadow: var(--shadow-sm);
    transition: transform 0.15s var(--ease), box-shadow 0.15s var(--ease);
}
.sidebar-toggle:active { transform: scale(0.93); }

.sidebar {
    width: var(--sidebar-width);
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    background: linear-gradient(180deg, var(--sidebar-color-dark) 0%, var(--sidebar-color-light) 100%);
    border-right: none;
    box-shadow: inset 0 1px 0 rgba(255,255,255,0.18), 2px 0 24px rgba(0,0,0,0.18);
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    overflow-y: auto;
    z-index: 25;
    padding: 22px 0 16px;
    transition: transform 0.25s var(--ease);
}

.sidebar::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 140px;
    background: linear-gradient(180deg, rgba(255,255,255,0.10), rgba(255,255,255,0));
    pointer-events: none;
}

/* Brand: tanda kotak bulat + wordmark, pengganti emoji — kesan logotype,
   bukan ikon dekoratif */
.sidebar .brand {
    display: flex;
    align-items: center;
    font-weight: 600;
    letter-spacing: -0.01em;
    padding: 4px 22px 24px;
    margin-bottom: 12px;
    border-bottom: 1px solid rgba(255,255,255,0.16);
    color: #fff;
    position: relative;
}
.brand-mark {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    flex-shrink: 0;
    border-radius: 9px;
    background: rgba(255,255,255,0.14);
    box-shadow: inset 0 0 0 1px rgba(255,255,255,0.25), 0 1px 2px rgba(0,0,0,0.15);
    font-weight: 700;
    font-size: 15px;
    letter-spacing: -0.02em;
    color: #fff;
}
.brand-word {
    display: flex;
    flex-direction: column;
    line-height: 1.25;
    font-size: 22px;
    font-weight: 700;
}
.brand-word small {
    font-size: 13px;
    font-weight: 500;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: rgba(255,255,255,0.6);
    margin-top: 2px;
}

/* Kotak Pencarian Global di sidebar. Selector-nya sengaja dibikin lebih
   "berat" -- ".sidebar .sidebar-search input[type=text]" -- karena ada
   rule global lain di file ini (html[data-theme="dark"] input[type=text])
   yang levelnya scara teknis lebih tinggi dari ".sidebar .sidebar-search
   input" biasa, jadi selalu menang & bikin warnanya ke-reset ke abu-abu
   (var(--input-bg)) walau CSS di sini sudah benar. Nambahin [type=text]
   di selector ini menaikkan levelnya biar pasti menang. */
.sidebar-search {
    position: relative;
    margin: 4px 16px 14px;
}
.sidebar-search-icon {
    position: absolute;
    left: 12px;
    top: 50%;
    transform: translateY(-50%);
    width: 15px;
    height: 15px;
    color: rgba(255,255,255,0.5);
    pointer-events: none;
}
.sidebar .sidebar-search input[type=text] {
    width: 100%;
    padding: 9px 12px 9px 36px;
    border-radius: 9px;
    border: 1px solid rgba(255,255,255,0.16);
    /* Merah yang jelas kelihatan merahnya -- --sidebar-color-dark (dipakai
       sebelumnya) ternyata terlalu gelap, kelihatan nyaris hitam di
       banyak layar. Ini di antara --sidebar-color & --sidebar-color-dark,
       lebih pekat/jenuh warnanya tapi tetap gelap & kontras sama teks putih. */
    background: #42000c;
    color: #fff;
    font-size: 13.5px;
    font-family: inherit;
    transition: border-color 0.15s var(--ease);
}
.sidebar .sidebar-search input[type=text]::placeholder { color: rgba(255,255,255,0.55); }
.sidebar .sidebar-search input[type=text]:focus {
    outline: none;
    border-color: rgba(255,255,255,0.4);
    box-shadow: none;
}

.sidebar nav {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 4px 12px;
}

.sidebar nav a,
.nav-group-toggle {
    display: flex;
    align-items: center;
    gap: 11px;
    width: 100%;
    text-align: left;
    text-decoration: none;
    color: rgba(255,255,255,0.72);
    font-weight: 500;
    font-size: 14.5px;
    letter-spacing: -0.005em;
    padding: 9px 12px;
    border-radius: 9px;
    border: none;
    background: none;
    cursor: pointer;
    font-family: inherit;
    position: relative;
    transition: background 0.18s var(--ease), color 0.18s var(--ease), transform 0.15s var(--ease);
}

.nav-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    flex-shrink: 0;
    opacity: 0.85;
}
.nav-icon svg { width: 100%; height: 100%; }

.sidebar nav a:hover,
.nav-group-toggle:hover {
    color: #fff;
    background: rgba(255,255,255,0.12);
    backdrop-filter: blur(10px) saturate(160%);
    -webkit-backdrop-filter: blur(10px) saturate(160%);
}

.sidebar nav a.active,
.nav-group-toggle.active,
.nav-group.active-group > .nav-group-toggle {
    color: #fff;
    background: linear-gradient(155deg, rgba(255,255,255,0.32), rgba(255,255,255,0.14));
    backdrop-filter: blur(20px) saturate(200%);
    -webkit-backdrop-filter: blur(20px) saturate(200%);
    font-weight: 600;
    transform: translateY(-1px);
    box-shadow:
        inset 0 1px 0 rgba(255,255,255,0.55),
        inset 0 0 0 1px rgba(255,255,255,0.28),
        inset 0 -6px 10px -6px rgba(0,0,0,0.18),
        0 6px 16px rgba(0,0,0,0.22),
        0 2px 4px rgba(0,0,0,0.14);
}
.sidebar nav a.active .nav-icon,
.nav-group-toggle.active .nav-icon,
.nav-group.active-group > .nav-group-toggle .nav-icon { opacity: 1; }

.nav-group-toggle .caret {
    margin-left: auto;
    font-size: 10px;
    transition: transform 0.2s var(--ease);
    opacity: 0.6;
}
.nav-group.open .caret { transform: rotate(180deg); }

/* Titik notifikasi kecil di menu sidebar (mis. ada stok menipis, ada
   barang belum di-scan) -- sengaja cuma titik polos, tidak menampilkan
   angka, supaya tetap ringkas walau sumber notifikasinya lebih dari 1. */
.nav-dot {
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #ff453a;
    box-shadow: 0 0 0 2px rgba(255,69,58,0.35);
    flex-shrink: 0;
}
/* .nav-group-toggle sudah punya gap:11px antar flex item, jadi titiknya
   tidak perlu margin tambahan -- tapi di .nav-group-menu a (tidak ber-gap)
   didorong penuh ke kanan biar rapi sejajar dgn ujung kanan menu. */
.nav-group-menu a .nav-dot { margin-left: auto; }

.nav-group-menu {
    display: none;
    flex-direction: column;
    padding-left: 15px;
    margin-top: 2px;
    gap: 1px;
}
.nav-group.open .nav-group-menu { display: flex; }

.nav-group-menu a {
    display: flex;
    align-items: center;
    padding: 8px 12px;
    font-size: 14px;
}
.nav-group-menu a:hover {
    color: #fff;
    background: rgba(255,255,255,0.12);
    backdrop-filter: blur(10px) saturate(160%);
    -webkit-backdrop-filter: blur(10px) saturate(160%);
}
.nav-group-menu a.active {
    color: #fff;
    background: rgba(255,255,255,0.22);
    backdrop-filter: blur(14px) saturate(180%);
    -webkit-backdrop-filter: blur(14px) saturate(180%);
    font-weight: 600;
    box-shadow: inset 0 0 0 1px rgba(255,255,255,0.3), 0 2px 10px rgba(0,0,0,0.12);
}

.sidebar-overlay {
    visibility: hidden;
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.4);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    z-index: 24;
    opacity: 0;
    transition: opacity 0.28s var(--ease), visibility 0s linear 0.28s;
}
.sidebar-overlay.show {
    visibility: visible;
    opacity: 1;
    transition: opacity 0.28s var(--ease), visibility 0s linear 0s;
}

.main-content {
    flex: 1;
    min-width: 0;
    margin-left: var(--sidebar-width);
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

/* Warna Teks Otomatis untuk Latar Belakang Foto -- cuma menyentuh judul
   & paragraf yang duduk LANGSUNG di atas foto (anak langsung dari
   .container), BUKAN teks di dalam .card, karena .card selalu punya
   latar solid sendiri jadi tidak pernah kebaca-samar seperti foto. */
.bg-text-light .container > h1,
.bg-text-light .container > h2,
.bg-text-light .container > h3,
.bg-text-light .container > p,
.bg-text-light .container > .tab-panel > h1,
.bg-text-light .container > .tab-panel > h2,
.bg-text-light .container > .tab-panel > h3,
.bg-text-light .container > .tab-panel > p {
    color: #ffffff;
    text-shadow: 0 1px 3px rgba(0,0,0,0.55), 0 2px 16px rgba(0,0,0,0.35);
}
.bg-text-light .container > p.subtitle a,
.bg-text-light .container > .tab-panel > p.subtitle a { color: #cfe6ff; }

.bg-text-dark .container > h1,
.bg-text-dark .container > h2,
.bg-text-dark .container > h3,
.bg-text-dark .container > p,
.bg-text-dark .container > .tab-panel > h1,
.bg-text-dark .container > .tab-panel > h2,
.bg-text-dark .container > .tab-panel > h3,
.bg-text-dark .container > .tab-panel > p {
    color: #1d1d1f;
    text-shadow: 0 1px 3px rgba(255,255,255,0.7);
}
.bg-text-dark .container > p.subtitle a,
.bg-text-dark .container > .tab-panel > p.subtitle a { color: #0058b0; }

@media (max-width: 768px) {
    .sidebar-toggle { display: flex; }

    .sidebar .brand {
        padding-left: 22px;
        padding-top: 34px;
    }

    .sidebar {
        transform: translateX(-100%);
        box-shadow: 4px 0 24px rgba(0,0,0,0.18);
    }
    .sidebar.open { transform: translateX(0); }

    .sidebar-overlay.show { visibility: visible; }

    .main-content { margin-left: 0; }
}

/* ================= END SIDEBAR LAYOUT ================= */

.container {
    max-width: 1400px;
    width: 100%;
    margin: 24px auto;
    padding: 0 20px;
}

@media (max-width: 768px) {
    .container { margin-top: 60px; }
}

.footer {
    text-align: center;
    color: var(--muted);
    font-size: 12.5px;
    padding: 24px;
}

h1 {
    font-size: 28px;
    font-weight: 700;
    letter-spacing: -0.03em;
    margin-bottom: 4px;
}
h2 {
    font-size: 19px;
    font-weight: 600;
    letter-spacing: -0.02em;
    margin-top: 32px;
}
.subtitle { color: var(--muted); margin-top: 0; margin-bottom: 22px; font-size: 15px; }

.card {
    background: var(--card);
    border: 1px solid var(--hairline-soft);
    border-radius: var(--radius-lg);
    padding: 24px;
    margin-bottom: 20px;
    box-shadow: var(--shadow-sm);
}

/* ---- Section yang bisa dilipat (<details class="card">) -- pola dasar
   "kurangi scroll di HP" dipakai di checkout.php/produk.php/pengaturan.php
   dst (Fase C-F mobile-first). Marker bawaan browser diganti caret kustom
   supaya konsisten dgn ikon lain di app (lihat nav_icon() header.php),
   & <summary> boleh membungkus <h2> tanpa margin aneh. ---- */
details.card {
    padding: 0;
    overflow: hidden;
}
details.card > summary {
    cursor: pointer;
    list-style: none;
    padding: 24px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}
details.card > summary::-webkit-details-marker { display: none; }
details.card > summary h2 { margin: 0; }
details.card > summary::after {
    content: '▾';
    font-size: 13px;
    color: var(--muted);
    transition: transform 0.2s var(--ease);
    flex-shrink: 0;
}
details.card[open] > summary::after { transform: rotate(180deg); }
details.card > summary:hover { background: var(--surface-tint); }
/* Isi selain summary WAJIB dibungkus 1 <div class="details-card-body">
   (bukan padding ditaruh langsung di tiap direct child) supaya beberapa
   elemen (tabel + paginasi, dst) tidak masing-masing dapat padding bawah
   sendiri-sendiri. */
.details-card-body { padding: 0 24px 24px; }
@media (max-width: 768px) {
    details.card > summary { padding: 16px; }
    .details-card-body { padding: 0 16px 16px; }
}

.grid-stats {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 16px;
    margin-bottom: 24px;
}
.stat-box {
    background: var(--card);
    border: 1px solid var(--hairline-soft);
    border-radius: var(--radius-md);
    padding: 20px;
    box-shadow: var(--shadow-sm);
    transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease);
}
.stat-box:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
}
.stat-box .num { font-size: 28px; font-weight: 700; letter-spacing: -0.02em; }
.stat-box .label { color: var(--muted); font-size: 13px; margin-top: 2px; }
.stat-box.warn .num { color: var(--warning); }
.stat-box.danger .num { color: var(--danger); }

/* Kotak ringkasan yang dibuat jadi tautan (mis. "Transaksi Keluar Hari Ini"
   -> Laporan, "Belum Checkout Hari Ini" -> Belum Checkout) tetap tampil
   sama persis seperti kotak biasa, tanpa gaya link bawaan browser. */
a.stat-box {
    display: block;
    text-decoration: none;
    color: inherit;
    cursor: pointer;
}
a.stat-box:hover {
    border-color: rgba(0,113,227,0.35);
}

/* Kartu Stok Menipis/Habis di Dashboard: lebih lebar (2 kolom) supaya nama
   produk yang panjang tetap muat, dan berisi daftar produk singkat. */
.stat-box.stat-list {
    grid-column: span 2;
}
.stat-mini-list {
    list-style: none;
    margin: 12px 0 0;
    padding: 10px 0 0;
    border-top: 1px solid var(--hairline);
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.stat-mini-list li {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 10px;
    font-size: 13px;
}
.stat-mini-list li .nm {
    color: var(--text);
    font-weight: 500;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.stat-mini-list li .qty {
    color: var(--muted);
    white-space: nowrap;
    flex-shrink: 0;
}
.stat-box.stat-list .more {
    color: var(--muted);
    font-size: 12px;
    font-style: italic;
    margin-top: 6px;
}

@media (max-width: 768px) {
    .card { padding: 16px; }
}

/* ---- Kartu KPI (dashboard & halaman lain yang butuh box angka besar) ----
   Dipindah dari inline <style> index.php ke sini (Fase A perombakan mobile-
   first) supaya bisa dipakai bersama tanpa duplikasi -- sebelumnya disalin
   manual ke data_reseller.php (lihat komentar yang dihapus di sana). */
.kpi-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 14px;
    margin-bottom: 18px;
}
.kpi-card {
    background: var(--card);
    border-radius: 16px;
    padding: 18px 20px;
    box-shadow: var(--shadow-sm);
    border: 1px solid var(--border);
}
.kpi-card .kpi-label { font-size: 13px; color: var(--muted); margin-bottom: 6px; }
.kpi-card .kpi-value { font-size: 26px; font-weight: 700; letter-spacing: -0.02em; line-height: 1.15; }
.kpi-card .kpi-sub { font-size: 12.5px; color: var(--muted); margin-top: 6px; }

/* Badge "naik/turun X% vs periode sebelumnya" -- pola umum dashboard
   finansial (mis. FinKami), ditaruh tepat di bawah angka besar KPI. */
.kpi-compare { font-size: 12.5px; font-weight: 600; margin-top: 4px; display: flex; align-items: center; gap: 4px; }
.kpi-compare.up { color: var(--success); }
.kpi-compare.down { color: var(--danger); }
.kpi-compare-label { font-weight: 400; color: var(--muted); }
.kpi-card.accent-omzet .kpi-value { color: var(--primary); }
.kpi-card.accent-omzet-bersih .kpi-value { color: #16a34a; }
.kpi-card.accent-laba .kpi-value { color: var(--success); }
.kpi-card.accent-bersih .kpi-value { color: #7c3aed; }
.kpi-card .mini { width:100% !important; height:40px !important; margin-top:10px; display:block; }

.kpi-percent-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 14px;
    margin-bottom: 18px;
}
.kpi-percent {
    background-color: var(--card);
    background-image: linear-gradient(160deg, rgba(255,149,0,0.08), rgba(255,149,0,0.02));
    border: 1px solid var(--border);
    border-radius: 16px;
    padding: 16px 20px;
}
.kpi-percent .l { font-size: 13px; color: var(--muted); margin-bottom: 6px; }
.kpi-percent .v { font-size: 22px; font-weight: 700; letter-spacing: -0.02em; color: #c93400; }
.kpi-percent .s { font-size: 12px; color: var(--muted); margin-top: 4px; }

/* Varian kartu kpi-percent yang isinya listing vertikal 2 baris (mis. Total
   HPP + Nilai Stok Gudang) alih-alih 1 angka besar -- dipakai supaya 2 kartu
   kpi-mini lama itu bisa sejajar 1 baris dengan ROAS/%Laba tanpa menambah
   lebar grid. */
.kpi-percent-list { display: flex; flex-direction: column; gap: 10px; }
.kpi-percent-list-item + .kpi-percent-list-item { padding-top: 10px; border-top: 1px dashed var(--border); }
.kpi-percent-list-item .l { font-size: 12px; color: var(--muted); margin-bottom: 4px; }
.kpi-percent-list-item .v { font-size: 17px; font-weight: 700; letter-spacing: -0.02em; color: var(--text); }

.kpi-mini-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 12px;
    margin-bottom: 22px;
}
.kpi-mini {
    background: var(--card);
    border-radius: 14px;
    padding: 14px 16px;
    border: 1px solid var(--border);
}
.kpi-mini .l { font-size: 12.5px; color: var(--muted); }
.kpi-mini .v { font-size: 20px; font-weight: 700; margin-top: 4px; }

/* Box KPI yang dijadikan link (Total Omzet, Laba Kotor, ROAS, dst) tetap
   terlihat seperti box biasa -- bukan teks biru bergaris bawah -- dengan
   hover halus sebagai penanda kalau box itu bisa diklik. */
a.kpi-card, a.kpi-percent, a.kpi-mini {
    display: block;
    text-decoration: none;
    color: inherit;
    transition: box-shadow 0.15s var(--ease), transform 0.1s var(--ease);
}
a.kpi-card:hover, a.kpi-percent:hover, a.kpi-mini:hover {
    box-shadow: 0 4px 14px rgba(0,0,0,0.08);
    transform: translateY(-1px);
}

/* Baris tabel yang seluruhnya bisa diklik (mis. Data Reseller) -- BUKAN
   pakai <a> di dalam sel supaya nama reseller tidak tampil sebagai link
   berwarna, tapi tetap bisa diklik/dibuka lewat JS. */
/* Angka stat yang warnanya mengikuti tanda (saldo, selisih, dst). Dulu
   ditulis sebagai inline style="color:..." dari PHP & JS -- yang lalu harus
   dikalahkan pakai selector [style] + !important begitu kartunya jadi
   .stat-hero berlatar gradien. Sebagai class, override-nya cukup aturan CSS
   biasa & tanda saldo tetap 1 sumber (di sini, bukan tersebar di PHP+JS). */
.stat-box .num.positif { color: var(--success); }
.stat-box .num.negatif { color: var(--danger); }

.row-clickable { cursor: pointer; }
.row-clickable:hover { background: var(--hover, rgba(0,0,0,0.03)); }
.row-clickable:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }

.filter-bar { display:flex; flex-wrap:wrap; gap:10px; align-items:end; }
.pill-row { display:flex; gap:8px; flex-wrap:wrap; margin-bottom:14px; }
.pill { padding:7px 14px; border-radius:999px; border:1px solid var(--border); background:var(--card); font-size:13.5px; text-decoration:none; color:var(--text); font-weight:500; font-family:inherit; cursor:pointer; }
.pill.active { background:var(--primary); color:#fff; border-color:var(--primary); }

table {
    width: 100%;
    border-collapse: collapse;
    background: var(--card);
    border-radius: var(--radius-md);
    overflow: hidden;
}
th, td {
    text-align: left;
    padding: 12px 14px;
    border-bottom: 1px solid var(--hairline);
    font-size: 14px;
}

/* Tabel biasa (bukan .responsive-table, mis. "Rincian Lengkap" di Lokasi
   Pelanggan) di layar mobile: perkecil padding & font supaya kolom-kolomnya
   tetap muat, tidak melebar sampai "kepotong"/offside ke luar kartu. */
@media (max-width: 768px) {
    table:not(.responsive-table) th,
    table:not(.responsive-table) td {
        padding: 8px 6px;
        font-size: 12px;
    }
    /* .hide-mobile di tabel HORIZONTAL biasa (bukan responsive-table) --
       dipakai buat Daftar Produk di Stok Barang: sembunyikan kolom HPP,
       Harga Jual, dst di HP, tetap tampil di desktop. Selector sengaja
       generik (bukan cuma th/td) supaya span pembungkus tombol di dalam
       sel juga ikut kesembunyikan. */
    table:not(.responsive-table) .hide-mobile {
        display: none;
    }
}
th {
    background: var(--surface-tint);
    color: var(--muted);
    font-weight: 600;
    font-size: 12.5px;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
tr:last-child td { border-bottom: none; }
tbody tr, table tr:not(:first-child) {
    transition: background 0.15s var(--ease);
}
tbody tr:hover, table tr:not(:first-child):hover {
    background: rgba(0,113,227,0.04);
}

/* Highlight abu-abu untuk baris produk/paket NONAKTIF (Daftar Produk &
   Daftar Bundle) -- background solid, BUKAN opacity dim seluruh baris,
   supaya teks & badge di dalamnya tetap kebaca jelas (opacity dim lama
   bikin teksnya kelihatan pudar/susah dibaca). */
tr.tr-nonaktif {
    background: var(--border);
}
tr.tr-nonaktif:hover {
    background: var(--border);
    filter: brightness(0.96);
}

/* Tabel yang lebih ramping (dipakai di Daftar Produk) supaya tidak terlalu lebar */
.table-compact th, .table-compact td {
    font-size: 13px;
    padding: 9px 11px;
}

.detail-more {
    color: var(--muted);
    font-size: 12.5px;
    font-style: italic;
}

.bullet-list {
    margin: 0;
    padding-left: 18px;
    font-size: 13px;
    line-height: 1.6;
}
.bullet-list li { white-space: normal; }

.pagination-bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 16px;
    padding-top: 14px;
    border-top: 1px solid var(--border);
}
.pagination-info { font-size: 13px; color: var(--muted); }
.pagination-nav { display: flex; gap: 8px; }

/* ================= TAB (Produk & Paket, Scan Sore & Return) ================= */
.tab-bar {
    display:flex;
    gap:8px;
    margin-bottom:18px;
    border-bottom:2px solid var(--border);
    flex-wrap:wrap;
    background: var(--card);
    border-radius: var(--radius-md);
    padding: 6px 8px 0;
    box-shadow: var(--shadow-xs);
}
.tab-btn { background:none; border:none; padding:10px 16px; font-size:14.5px; font-weight:600; cursor:pointer; color:var(--muted); border-bottom:3px solid transparent; margin-bottom:-2px; font-family:inherit; }
.tab-btn.active { color:var(--primary); border-bottom-color:var(--primary); }
.tab-panel { display:none; }
.tab-panel.active { display:block; }

.retur-item-row {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 12px;
    border: 1px solid var(--border);
    border-radius: 10px;
    margin-bottom: 8px;
    cursor: pointer;
    transition: background 0.15s var(--ease), border-color 0.15s var(--ease);
}
.retur-item-row:hover { background: var(--surface-tint); }
.retur-item-row input[type="checkbox"] { width: 18px; height: 18px; flex-shrink: 0; }
.retur-item-row:has(input:checked) { border-color: var(--success); background: rgba(52,199,89,0.08); }
.retur-item-nama { flex: 1; font-size: 14px; }
.retur-item-qty { font-size: 13px; color: var(--muted); font-weight: 600; }

.retur-item-row-wrap { margin-bottom: 8px; }
.retur-item-row-wrap .retur-item-row { margin-bottom: 0; }
.retur-item-popup {
    margin: -1px 0 0;
    padding: 12px 14px;
    border: 1px solid var(--success);
    border-top: none;
    border-radius: 0 0 10px 10px;
    background: rgba(52,199,89,0.06);
    animation: returPopupIn 0.15s var(--ease);
}
.retur-item-popup label {
    display: block;
    font-size: 12.5px;
    color: var(--muted);
    margin-bottom: 6px;
}
.retur-item-popup-row { display: flex; align-items: center; gap: 8px; }
.retur-item-popup-row input[type="number"] {
    width: 90px;
    padding: 8px 10px;
    border: 1px solid var(--border);
    border-radius: 8px;
    font-size: 14px;
}
@keyframes returPopupIn {
    from { opacity: 0; transform: translateY(-4px); }
    to { opacity: 1; transform: translateY(0); }
}

/* Tombol yang cuma muncul di layar mobile */
.show-mobile-only.show-mobile-only {
    display: none;
}
@media (max-width: 768px) {
    .show-mobile-only.show-mobile-only {
        display: inline-block;
    }
}

/* ---- Tabel responsif: jadi tampilan card ringkas di HP ---- */
@media (max-width: 768px) {
    /* baris header (th) disembunyikan total, bukan cuma isinya, biar tidak ada kotak kosong */
    .responsive-table tr.rt-head {
        display: none;
    }
    .responsive-table, .responsive-table tbody, .responsive-table tr, .responsive-table td {
        display: block;
        width: 100%;
    }
    .responsive-table tbody tr,
    .responsive-table tr:not(.rt-head) {
        border: 1px solid var(--hairline);
        border-radius: var(--radius-md);
        margin-bottom: 10px;
        padding: 12px 14px;
        background: var(--card);
        box-shadow: var(--shadow-xs);
    }
    .responsive-table tr:last-child { margin-bottom: 0; }
    .responsive-table td {
        border-bottom: none;
        padding: 4px 0;
        font-size: 13.5px;
    }
    .responsive-table td[data-label]::before {
        content: attr(data-label);
        display: block;
        font-size: 10.5px;
        font-weight: 700;
        color: var(--muted);
        text-transform: uppercase;
        letter-spacing: 0.03em;
        margin-bottom: 2px;
    }
    .responsive-table td.hide-mobile {
        display: none;
    }
    /* Baris tambahan (produk mendekati minimum ke-4 & ke-5) disembunyikan sampai tombol "Tampilkan Lainnya" diklik */
    .responsive-table tr.rt-extra {
        display: none;
    }
    .responsive-table tr.rt-extra.show {
        display: block;
    }
}

.badge {
    display: inline-block;
    padding: 3px 11px;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: -0.01em;
    margin: 2px 4px 2px 0;
}
.badge-ok { background: rgba(52,199,89,0.15); color: #248a3d; }
.badge-warn { background: rgba(255,149,0,0.15); color: #c93400; }
.badge-kuning { background: rgba(255,204,0,0.22); color: #8a6d00; }
.badge-danger { background: rgba(255,59,48,0.14); color: #d70015; }
.badge-info { background: rgba(0,113,227,0.12); color: var(--primary); }
.badge-retur { background: rgba(124,58,237,0.14); color: #7c3aed; }
.badge-muted { background: rgba(110,110,115,0.12); color: var(--muted); }

.btn {
    display: inline-block;
    padding: 10px 18px;
    border-radius: var(--radius-sm);
    border: none;
    background: var(--primary);
    color: #fff;
    cursor: pointer;
    font-size: 14.5px;
    font-weight: 600;
    letter-spacing: -0.01em;
    text-decoration: none;
    box-shadow: var(--shadow-xs);
    transition: background 0.2s var(--ease), transform 0.12s var(--ease), box-shadow 0.2s var(--ease);
}
.btn:hover { background: var(--primary-dark); box-shadow: var(--shadow-sm); }
.btn:active { transform: scale(0.97); }
.btn.small { padding: 6px 12px; font-size: 12.5px; border-radius: 8px; }
.btn.danger { background: var(--danger); }
.btn.danger:hover { background: #d70015; }
.btn.secondary { background: #86868b; }
.btn.secondary:hover { background: #6e6e73; }
.btn.outline {
    background: transparent;
    color: var(--primary);
    border: 1.5px solid var(--primary);
    box-shadow: none;
}
.btn.outline:hover { background: rgba(0,113,227,0.08); }

.pill {
    padding: 7px 14px;
    border-radius: 999px;
    border: 1px solid var(--border);
    background: var(--card);
    font-size: 13.5px;
    text-decoration: none;
    color: var(--text);
    font-weight: 500;
    font-family: inherit;
    cursor: pointer;
}
.pill.active { background: var(--primary); color: #fff; border-color: var(--primary); }

form .field { margin-bottom: 14px; }

.field-password-wrap { position: relative; }
.field-password-wrap input { padding-right: 42px; }
.btn-toggle-password {
    position: absolute;
    right: 4px;
    top: 50%;
    transform: translateY(-50%);
    background: none;
    border: none;
    cursor: pointer;
    padding: 6px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--muted);
    border-radius: 6px;
    transition: color 0.15s var(--ease), background 0.15s var(--ease);
}
.btn-toggle-password:hover { color: var(--text); background: var(--hairline-soft); }
.btn-toggle-password svg { width: 19px; height: 19px; }
label { display: block; font-weight: 600; margin-bottom: 6px; font-size: 13.5px; color: var(--text); }
input[type=text], input[type=number], input[type=search], input[type=date], input[type=password], input[type=email], input[type=tel], input[type=url], select, textarea {
    width: 100%;
    padding: 10px 12px;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    font-size: 14px;
    background: var(--input-bg);
    color: var(--text);
    transition: border-color 0.2s var(--ease), box-shadow 0.2s var(--ease);
}
input:focus, select:focus, textarea:focus {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 4px rgba(0,113,227,0.15);
}

/* Field yang dikunci (mis. HPP/Harga Jual untuk staff) -- tetap terlihat
   jelas isinya, tapi jelas juga kelihatan tidak bisa diketik. */
input:disabled, select:disabled, textarea:disabled {
    background: var(--bg);
    color: var(--muted);
    border-color: var(--border);
    cursor: not-allowed;
    opacity: 1;
}

/* Input file ("Choose File / Pilih Berkas") -- tombolnya dibuat pakai
   kartu & border sesuai tema (bukan diserahkan ke browser sepenuhnya)
   supaya tetap konsisten dgn desain di kedua mode, terang maupun gelap. */
input[type=file] {
    width: 100%;
    padding: 8px 0;
    border: none;
    background: none;
    color: var(--muted);
    font-size: 13.5px;
}
input[type=file]::file-selector-button,
input[type=file]::-webkit-file-upload-button {
    background: var(--card);
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    padding: 8px 16px;
    margin-right: 12px;
    font-size: 13.5px;
    font-weight: 600;
    font-family: inherit;
    cursor: pointer;
    transition: background 0.15s var(--ease), border-color 0.15s var(--ease);
}
input[type=file]::file-selector-button:hover,
input[type=file]::-webkit-file-upload-button:hover {
    background: var(--surface-tint);
    border-color: var(--primary);
    color: var(--primary);
}

/* Kontrol paginasi (Sebelumnya / halaman X dari Y / Selanjutnya) di bawah tabel */
.pagination-bar {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 14px;
    margin-top: 16px;
    flex-wrap: wrap;
}
.pagination-bar .pagination-info {
    font-size: 13.5px;
    color: var(--muted);
    white-space: nowrap;
}

/* Header tabel yang bisa diklik untuk sort */
th.th-sort {
    cursor: pointer;
    user-select: none;
    position: relative;
    padding-right: 18px !important;
}
th.th-sort:hover { color: var(--primary); }
th.th-sort::after {
    content: '↕';
    position: absolute;
    right: 4px;
    opacity: 0.35;
    font-size: 12px;
}
th.th-sort.sort-asc::after { content: '↑'; opacity: 1; color: var(--primary); }
th.th-sort.sort-desc::after { content: '↓'; opacity: 1; color: var(--primary); }

.row { display: flex; gap: 16px; flex-wrap: wrap; }
.row > .field { flex: 1; min-width: 180px; }
/* Fase G mobile-first: halaman yang masih pakai .row/.field manual (belum
   migrasi ke .filter-bar dari Fase A) otomatis ikut full-width & gampang
   dipencet di HP, tanpa perlu sentuh markup halamannya satu-satu. */
@media (max-width: 768px) {
    /* flex-basis dari "flex:1" di atas (baris 1365) menang atas width kalau
       cuma width yang di-override -- flex-basis:100% yang bikin tiap field
       benar-benar penuh 1 baris sendiri saat wrap. */
    .row > .field { min-width: unset; flex-basis: 100%; }
}

.field-half {
    max-width: calc(50% - 8px);
}
@media (max-width: 768px) {
    .field-half {
        max-width: 100%;
    }
}

.alert {
    padding: 13px 16px;
    border-radius: var(--radius-sm);
    margin-bottom: 16px;
    font-size: 14px;
}
.alert-success { background: rgba(52,199,89,0.12); color: #1c6b32; }
.alert-danger { background: rgba(255,59,48,0.1); color: #b50017; }
.alert-warn { background: rgba(255,149,0,0.12); color: #9a4c00; }

/* ---- Halaman scan ---- */
.scan-box {
    text-align: center;
    padding: 44px 20px;
}
.scan-input {
    font-size: 22px;
    text-align: center;
    padding: 16px;
    border: 2px solid var(--border);
    border-radius: var(--radius-md);
    width: 100%;
    max-width: 500px;
    margin: 0 auto;
    transition: border-color 0.2s var(--ease), box-shadow 0.2s var(--ease);
}
.scan-input:focus {
    border-color: var(--primary);
    box-shadow: 0 0 0 5px rgba(0,113,227,0.15);
}
.scan-hint { color: var(--muted); margin-top: 10px; font-size: 14px; }

.product-picker {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 12px;
    margin-top: 16px;
}
.pick-btn {
    border: 1px solid var(--hairline);
    background: var(--input-bg);
    border-radius: var(--radius-md);
    padding: 14px;
    text-align: left;
    cursor: pointer;
    box-shadow: var(--shadow-xs);
    transition: border-color 0.2s var(--ease), background 0.2s var(--ease),
                transform 0.15s var(--ease), box-shadow 0.2s var(--ease);
}
.pick-btn:hover {
    border-color: var(--primary);
    background: rgba(0,113,227,0.04);
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
}
.pick-btn:active { transform: translateY(0) scale(0.98); }
.pick-btn .nm { font-weight: 600; font-size: 14px; }
.pick-btn .st { color: var(--muted); font-size: 12px; margin-top: 2px; }
.pick-btn.paket { border-left: 4px solid var(--primary); }
.pick-btn.produk { border-left: 4px solid var(--success); }

.cart-list { margin-top: 16px; }
.cart-item {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 11px 15px;
    background: var(--surface-tint-2);
    border-radius: var(--radius-sm);
    margin-bottom: 8px;
    transition: background 0.15s var(--ease);
}
.cart-item button {
    background: none;
    border: none;
    color: var(--danger);
    cursor: pointer;
    font-size: 16px;
    transition: transform 0.15s var(--ease);
}
.cart-item button:hover { transform: scale(1.15); }
.qty-adj { display: flex; align-items: center; gap: 8px; }
.qty-adj button {
    width: 28px; height: 28px;
    border-radius: 50%;
    border: 1px solid var(--border);
    background: var(--input-bg);
    cursor: pointer;
    transition: background 0.15s var(--ease), transform 0.1s var(--ease);
}
.qty-adj button:hover { background: rgba(0,113,227,0.08); }
.qty-adj button:active { transform: scale(0.9); }

.tag-row { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.search-box { margin-bottom: 10px; }

.empty-state { text-align: center; color: var(--muted); padding: 32px; }

.paket-item-row {
    display: flex;
    gap: 10px;
    align-items: end;
    margin-bottom: 10px;
}
.paket-item-row .field { margin-bottom: 0; flex: 1; }
.paket-item-row .qty-field { max-width: 90px; }

/* ---- Grafik tren (line chart) responsif ---- */
/* Desktop: tidak diberi tinggi tetap, biar Chart.js pakai aspect ratio bawaan
   seperti semula (sebelum penyesuaian mobile). Hanya di layar sempit yang
   diberi tinggi tetap supaya tidak "terjepit". */
.chart-wrap {
    position: relative;
    width: 100%;
}
@media (max-width: 768px) {
    .chart-wrap {
        height: 320px;
    }
}

/* ---- Badge tren naik/turun harian di kotak ringkasan (khusus mobile) ---- */
.stat-box .trend-badge {
    display: none;
}
@media (max-width: 768px) {
    .stat-box .mini-chart {
        display: none !important;
    }
    .stat-box .trend-badge {
        display: block;
        margin-top: 8px;
        font-size: 13px;
        font-weight: 700;
    }
    .stat-box .trend-badge.up { color: var(--success); }
    .stat-box .trend-badge.down { color: var(--danger); }
    .stat-box .trend-badge.flat { color: var(--muted); font-weight: 500; }

    /* 4 kotak ringkasan (Transaksi, Barang Terjual, Omzet, Profit) disusun
       2x2 di mobile karena mini-chart sudah tidak ditampilkan di sana.
       Dipadatkan lagi ala App Store "Today"/Opsi B (lihat .stat-hero di
       atas untuk kartu tunggal yang dijadikan sorotan). */
    .grid-stats {
        grid-template-columns: repeat(2, 1fr);
        gap: 8px;
    }
    .stat-box {
        padding: 10px 12px;
    }
    .stat-box .num {
        font-size: 18px !important;
        line-height: 1.2;
    }
    .stat-box .label {
        font-size: 11px;
        margin-top: 2px;
    }
    .stat-box .trend-badge {
        font-size: 11px;
        margin-top: 4px;
    }

    /* ---- Kartu KPI & filter bar (Fase A mobile-first, dipadatkan lagi ala
       App Store "Today"/Opsi B -- lihat blok .kpi-hero di bawah) ---- */
    .kpi-grid, .kpi-percent-grid, .kpi-mini-grid {
        grid-template-columns: repeat(2, 1fr);
        gap: 8px;
    }
    .kpi-card, .kpi-percent, .kpi-mini {
        padding: 10px 12px;
    }
    .kpi-card .kpi-value, .kpi-percent .v { font-size: 18px; }
    .kpi-mini .v { font-size: 15px; }
    .kpi-card .kpi-label, .kpi-percent .l, .kpi-mini .l { font-size: 11px; }
    .kpi-card .kpi-sub, .kpi-percent .s { font-size: 10.5px; margin-top: 3px; }
    .kpi-compare { font-size: 11px; margin-top: 2px; }

    /* ---- Kartu "hero" (item paling penting di grid, mis. Total Omzet) --
       gaya App Store "Today": full-lebar, gradien warna aksennya sendiri,
       teks putih, nomor besar. Ditandai lewat class .kpi-hero di markup
       (bukan otomatis :first-child, supaya jelas & tidak gampang salah
       ganti kalau urutan kartu berubah nanti). Warna gradien ikut accent-*
       yang SUDAH ada di kartu itu (accent-omzet/laba/bersih/omzet-bersih),
       jadi cukup 1 aturan generik + override warna per accent. ---- */
    .kpi-hero {
        order: -1;
        grid-column: 1 / -1;
        padding: 16px 18px !important;
        border: none !important;
        color: #fff;
        background: linear-gradient(135deg, var(--primary), #4da3ff);
        box-shadow: 0 8px 20px rgba(0,113,227,0.28);
    }
    .kpi-hero.accent-omzet-bersih { background: linear-gradient(135deg, #16a34a, #4ade80); box-shadow: 0 8px 20px rgba(22,163,74,0.28); }
    .kpi-hero.accent-laba { background: linear-gradient(135deg, #1a9c46, #34c759); box-shadow: 0 8px 20px rgba(52,199,89,0.28); }
    .kpi-hero.accent-bersih { background: linear-gradient(135deg, #7c3aed, #a78bfa); box-shadow: 0 8px 20px rgba(124,58,237,0.28); }
    .kpi-hero.accent-teal { background: linear-gradient(135deg, #0891b2, #22c3e6); box-shadow: 0 8px 20px rgba(8,145,178,0.28); } /* reseller #1 di Data Reseller */
    .kpi-hero .reseller-rank { position: absolute; top: 14px; right: 16px; font-size: 22px; }
    .kpi-hero .badge { background: rgba(255,255,255,0.22); color: #fff; }
    .kpi-hero .kpi-label { color: rgba(255,255,255,0.85); font-size: 12.5px; }
    .kpi-hero .kpi-value { color: #fff !important; font-size: 26px; }
    .kpi-hero .kpi-sub { color: rgba(255,255,255,0.9); font-size: 11.5px; }
    .kpi-hero .kpi-compare.up { color: #d6ffe4; }
    .kpi-hero .kpi-compare.down { color: #ffd9d6; }
    .kpi-hero .kpi-compare-label { color: rgba(255,255,255,0.75); }
    .kpi-hero .mini { filter: brightness(0) invert(1) opacity(0.9); }

    /* Reused di halaman lain (checkout/laporan/biaya/data_reseller) untuk
       kartu tunggal yang jadi sorotan tapi bukan bagian dari .kpi-grid --
       warna netral (abu gelap) sebagai default, dipakai apa adanya. */
    .stat-hero {
        order: -1;
        grid-column: 1 / -1;
        padding: 16px 18px !important;
        border: none !important;
        color: #fff !important;
        background: linear-gradient(135deg, #6e6e73, #8e8e93);
        box-shadow: 0 8px 20px rgba(0,0,0,0.16);
    }
    .stat-hero .num { color: #fff !important; font-size: 26px !important; }
    .stat-hero .label { color: rgba(255,255,255,0.85) !important; font-size: 12.5px !important; }
    .stat-hero.warn { background: linear-gradient(135deg, #ff9500, #ffb347); box-shadow: 0 8px 20px rgba(255,149,0,0.28); }
    .stat-hero.danger { background: linear-gradient(135deg, #ff3b30, #ff6961); box-shadow: 0 8px 20px rgba(255,59,48,0.28); }
    .stat-hero.success { background: linear-gradient(135deg, #16a34a, #4ade80); box-shadow: 0 8px 20px rgba(22,163,74,0.28); }
    /* Angka di dalam .stat-hero selalu putih -- warna positif/negatif sudah
       dibawa gradien latarnya, bukan warna teks lagi. Cukup aturan biasa
       karena .num tidak lagi punya inline style yang harus dikalahkan
       (lihat .num.positif/.negatif di luar media query ini). */
    .stat-hero .num.positif, .stat-hero .num.negatif { color: #fff !important; }
    .stat-hero .trend-badge.up { color: #d6ffe4; }
    .stat-hero .trend-badge.down { color: #ffd9d6; }
    .stat-hero .trend-badge.flat { color: rgba(255,255,255,0.75); }

    /* Filter bar (Dari/Sampai/Channel dst) ditumpuk 1 kolom penuh -- field
       yang tadinya minmax(180px) jadi terlalu sempit/susah dipencet kalau
       cuma wrap biasa di layar ~360-390px. */
    .filter-bar { flex-direction: column; align-items: stretch; }
    .filter-bar .field { width: 100%; }

    /* Baris pill periode (Hari Ini/Kemarin/dst) jadi chip-strip yang bisa
       digeser horizontal, bukan numpuk banyak baris menuh-menuhin layar.
       Font/padding dikecilkan dulu supaya SEBISA MUNGKIN muat tanpa geser;
       scrollbar-nya sendiri disembunyikan (scroll tetap jalan lewat swipe/
       geser jari, cuma bar abu-abunya yang tidak usah kelihatan). */
    .pill-row {
        flex-wrap: nowrap;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        padding-bottom: 4px;
        scrollbar-width: none;
        -ms-overflow-style: none;
    }
    .pill-row::-webkit-scrollbar { display: none; }
    .pill-row .pill { flex-shrink: 0; font-size: 12.5px; padding: 6px 11px; }

    /* Tab bar (Scan Sore/Return/COD, Biaya Iklan/Arus Kas/Solasi, dst) --
       sebelumnya wrap ke banyak baris kalau labelnya kepanjangan (makan
       tinggi layar); sekarang jadi 1 baris yang bisa digeser horizontal,
       font/padding dikecilkan dulu supaya sebisa mungkin muat sendiri,
       scrollbar-nya juga disembunyikan sama seperti .pill-row. */
    .tab-bar {
        flex-wrap: nowrap;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        -ms-overflow-style: none;
    }
    .tab-bar::-webkit-scrollbar { display: none; }
    .tab-btn { font-size: 13px; padding: 8px 11px; white-space: nowrap; flex-shrink: 0; }
}

.btn-x {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background: var(--danger);
    color: #fff;
    text-decoration: none;
    font-weight: 700;
    font-size: 15px;
    line-height: 1;
    transition: transform 0.15s var(--ease), background 0.15s var(--ease);
}
.btn-x:hover { background: #d70015; transform: scale(1.08); }

/* ---- Header tabel yang bisa diklik untuk sort (mis. Persentase di Lokasi Pelanggan) ---- */
.th-sort-link {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    color: inherit;
    text-decoration: none;
    cursor: pointer;
    transition: color 0.15s var(--ease);
}
.th-sort-link:hover { color: var(--primary); }
.th-sort-arrow {
    font-size: 10px;
    color: var(--primary);
}

#toast {
    position: fixed;
    bottom: 24px;
    right: 24px;
    background: rgba(29,29,31,0.92);
    backdrop-filter: blur(20px) saturate(180%);
    -webkit-backdrop-filter: blur(20px) saturate(180%);
    color: #fff;
    padding: 13px 20px;
    border-radius: var(--radius-md);
    display: none;
    font-size: 14px;
    /* Harus di atas .camera-modal (z-index:200) -- toast tetap kelihatan
       walau modal kamera sedang terbuka penuh layar (mis. pesan error saat
       scan gagal dibaca lewat kamera HP). */
    z-index: 300;
    box-shadow: var(--shadow-lg);
}
#toast.success { background: rgba(52,199,89,0.92); }
#toast.error { background: rgba(255,59,48,0.92); }

/* ================= SIDEBAR USER BOX (login) ================= */
.sidebar-user {
    margin-top: auto;
    padding: 14px 18px;
    border-top: 1px solid rgba(255,255,255,0.16);
    flex-shrink: 0;
}
.sidebar-trial-banner {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 10px;
    margin-bottom: 10px;
    border-radius: 9px;
    background: rgba(255,255,255,0.12);
    border: 1px solid rgba(255,255,255,0.18);
    font-size: 12.5px;
    line-height: 1.3;
    color: rgba(255,255,255,0.92);
}
.sidebar-trial-banner .nav-icon { opacity: 1; }
.sidebar-trial-banner-danger {
    background: rgba(255,59,48,0.24);
    border-color: rgba(255,59,48,0.45);
}
.user-info {
    display: flex;
    align-items: center;
    gap: 10px;
    text-decoration: none;
    padding: 6px 8px;
    border-radius: 9px;
    margin: 0 0 2px;
    transition: background 0.15s var(--ease);
}
.user-info:hover,
.user-info.active-link {
    background: rgba(255,255,255,0.12);
    backdrop-filter: blur(10px) saturate(160%);
    -webkit-backdrop-filter: blur(10px) saturate(160%);
}
.user-avatar {
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: rgba(255,255,255,0.18);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 600;
    font-size: 14px;
    flex-shrink: 0;
}
.user-avatar-img {
    object-fit: cover;
    border: 2px solid rgba(255,255,255,0.3);
}
.user-detail { min-width: 0; }
.user-name {
    color: #fff;
    font-weight: 600;
    font-size: 14.5px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.user-logout {
    display: flex;
    align-items: center;
    gap: 10px;
    color: rgba(255,255,255,0.68);
    font-size: 14.5px;
    font-weight: 500;
    text-decoration: none;
    padding: 8px 8px;
    margin: 2px 0 0;
    border-radius: 9px;
    transition: background 0.15s var(--ease), color 0.15s var(--ease);
}
.user-logout .nav-icon { opacity: 0.75; }
.user-logout:hover {
    color: #fff;
    background: rgba(255,255,255,0.12);
    backdrop-filter: blur(10px) saturate(160%);
    -webkit-backdrop-filter: blur(10px) saturate(160%);
    text-decoration: none;
}
.user-logout:hover .nav-icon { opacity: 1; }

/* Baris ikon menu sekunder (Pengaturan, Profil, Data Reseller, Kelola
   Tenant) -- horizontal, cuma simbol, ditaruh di bawah nama user dan di
   atas tombol Logout supaya sidebar utama lebih ringkas. */
.sidebar-icon-row {
    display: flex;
    align-items: center;
    gap: 4px;
    margin: 8px 0 2px;
    padding-top: 8px;
    border-top: 1px solid rgba(255,255,255,0.1);
}
.sidebar-icon-row a {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 9px;
    color: rgba(255,255,255,0.65);
    text-decoration: none;
    transition: background 0.15s var(--ease), color 0.15s var(--ease);
}
.sidebar-icon-row a .nav-icon { margin: 0; }
.sidebar-icon-row a svg { width: 18px; height: 18px; }
.sidebar-icon-row a:hover {
    color: #fff;
    background: rgba(255,255,255,0.12);
}
.sidebar-icon-row a.active {
    color: #fff;
    background: rgba(255,255,255,0.18);
}

/* ================= HALAMAN PROFIL ================= */
.profile-photo {
    width: 160px;
    height: 160px;
    border-radius: 50%;
    object-fit: cover;
    display: block;
    margin: 0 auto;
    border: 3px solid var(--border);
    box-shadow: var(--shadow-md);
}
.profile-photo-placeholder {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--sidebar-color);
    color: #fff;
    font-size: 56px;
    font-weight: 700;
}

/* ================= HALAMAN LOGIN & SETUP ADMIN ================= */
body.login-page {
    background: linear-gradient(160deg, var(--sidebar-color-dark) 0%, var(--sidebar-color) 55%, var(--sidebar-color-light) 100%);
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}
.login-wrap {
    width: 100%;
    padding: 20px;
    display: flex;
    justify-content: center;
    transition: opacity 0.3s ease, transform 0.3s ease;
}
/* Dipasang lewat JS sesaat sebelum form submit, supaya perpindahan ke boot
   screen tidak terasa "patah" -- transisi halus, bukan potong tiba-tiba
   (juga lebih aman untuk pengguna yang sensitif terhadap flash mendadak). */
.login-wrap.leaving {
    opacity: 0;
    transform: scale(0.98);
}
.login-card {
    background: var(--card);
    border-radius: 24px;
    padding: 36px 32px;
    width: 100%;
    max-width: 400px;
    box-shadow: var(--shadow-lg);
}
.login-brand {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    font-size: 19px;
    font-weight: 600;
    letter-spacing: -0.01em;
    color: var(--text);
    margin-bottom: 6px;
}
.login-brand .brand-mark {
    color: #fff;
    font-weight: 700;
    align-items: center;
    justify-content: center;
}
.login-subtitle {
    color: var(--muted);
    font-size: 13.5px;
    text-align: center;
    margin: 0 0 22px;
}
.login-btn {
    width: 100%;
    padding: 12px 16px;
    font-size: 15px;
    background: var(--sidebar-color);
    margin-top: 6px;
}
.login-btn:hover { background: var(--sidebar-color-dark); }

/* ================= BOOT / GREETING SCREEN (setelah login berhasil) ================= */
.boot-screen {
    position: fixed;
    inset: 0;
    z-index: 999;
    overflow: hidden;
    background: linear-gradient(180deg, var(--sidebar-color-dark) 0%, var(--sidebar-color-light) 100%);
    opacity: 1;
    animation: bootScreenIn 0.7s var(--ease);
    transition: opacity 0.8s var(--ease);
    padding: 24px;
    text-align: center;
}
.boot-screen.fade-out { opacity: 0; }

/* Muncul dengan memudar tenang (bukan langsung tampil penuh) supaya
   pergantian dari halaman login ke boot screen tidak terasa seperti
   potongan/flash mendadak -- gaya kalem ala Apple, bukan animasi ramai. */
@keyframes bootScreenIn {
    from { opacity: 0; }
    to { opacity: 1; }
}

/* Langit sesuai jam login (ditentukan lewat JS, lihat login.php) --
   gradasi dipilih supaya tetap lembut/tidak silau, bukan warna jenuh
   penuh, karena ini cuma latar belakang sebentar di belakang teks. */
.boot-screen.boot-pagi {
    background: linear-gradient(180deg, #3d5b82 0%, #7fa6c9 45%, #f4c99a 100%);
}
.boot-screen.boot-siang {
    background: linear-gradient(180deg, #4f8fc7 0%, #86bfe6 55%, #cfe7f5 100%);
}
.boot-screen.boot-sore {
    background: linear-gradient(180deg, #3c3a63 0%, #a4536f 42%, #e6875e 72%, #ffce97 100%);
}
.boot-screen.boot-malam {
    background: linear-gradient(180deg, #05070d 0%, #0f1626 55%, #1c2942 100%);
}
/* Gambar dipasang di layer .boot-scene (bukan langsung di .boot-screen)
   supaya bisa di-zoom pelan tanpa ikut menggeser teks/konten. */
.boot-screen.boot-malam .boot-scene {
    background: url('img/boot-malam-starry.jpg') center center / cover no-repeat;
}
.boot-screen.boot-pagi .boot-scene,
.boot-screen.boot-siang .boot-scene {
    background: url('img/boot-pagi-siang-clouds.jpg') center center / cover no-repeat;
}
.boot-screen.boot-sore .boot-scene {
    background: url('img/boot-sore-sunset.jpg') center center / cover no-repeat;
}
/* Foto awan/senja sudah punya awan sendiri -- blob awan CSS lama dimatikan
   supaya tidak dobel. */
.boot-screen.boot-pagi .boot-cloud,
.boot-screen.boot-siang .boot-cloud,
.boot-screen.boot-sore .boot-cloud {
    display: none;
}

/* Elemen dekoratif (matahari/awan/bintang) -- murni visual, tidak
   mengganggu pembaca layar (aria-hidden di HTML) & tidak menangkap klik.
   Dizoom pelan ("Ken Burns", kalem ala Apple) di keempat tema -- foto malam
   maupun langit awan pagi/siang/sore -- supaya latarnya terasa hidup. */
.boot-scene {
    position: absolute;
    inset: 0;
    z-index: 0;
    overflow: hidden;
    pointer-events: none;
    animation: bootPhotoZoom 26s ease-in-out infinite alternate;
}
@keyframes bootPhotoZoom {
    from { transform: scale(1); }
    to { transform: scale(1.08); }
}

.boot-cloud {
    position: absolute;
    border-radius: 999px;
    background: rgba(255,255,255,0.8);
    opacity: 0;
}
.boot-screen.boot-siang .boot-cloud {
    opacity: 0.85;
    animation: bootCloudDrift 46s ease-in-out infinite;
}
.boot-screen.boot-pagi .boot-cloud {
    opacity: 0.8;
    background: rgba(255,238,216,0.8);
    animation: bootCloudDrift 46s ease-in-out infinite;
}
.boot-screen.boot-sore .boot-cloud {
    opacity: 0.7;
    background: rgba(255,230,214,0.75);
    animation: bootCloudDrift 46s ease-in-out infinite;
}
.boot-cloud.c1 { width: 140px; height: 34px; top: 22%; left: 8%; }
.boot-cloud.c2 { width: 100px; height: 26px; top: 36%; left: 62%; animation-direction: reverse; animation-duration: 58s; }
.boot-cloud.c3 { width: 120px; height: 30px; top: 16%; left: 40%; animation-duration: 52s; }
.boot-cloud.c4 { width: 90px; height: 22px; top: 48%; left: 18%; animation-direction: reverse; animation-duration: 50s; }
.boot-cloud.c5 { width: 110px; height: 28px; top: 10%; left: 70%; animation-duration: 60s; }

.boot-stars {
    position: absolute;
    inset: 0;
    opacity: 0;
    background-image:
        radial-gradient(1.6px 1.6px at 10% 20%, rgba(255,255,255,1), transparent),
        radial-gradient(1.6px 1.6px at 25% 45%, rgba(255,255,255,0.85), transparent),
        radial-gradient(1.2px 1.2px at 40% 15%, rgba(255,255,255,1), transparent),
        radial-gradient(1.6px 1.6px at 55% 62%, rgba(255,255,255,0.8), transparent),
        radial-gradient(1.2px 1.2px at 70% 25%, rgba(255,255,255,1), transparent),
        radial-gradient(1.8px 1.8px at 85% 50%, rgba(255,255,255,0.9), transparent),
        radial-gradient(1.2px 1.2px at 15% 72%, rgba(255,255,255,0.85), transparent),
        radial-gradient(1.6px 1.6px at 33% 82%, rgba(255,255,255,0.95), transparent),
        radial-gradient(1.2px 1.2px at 60% 88%, rgba(255,255,255,0.85), transparent),
        radial-gradient(1.8px 1.8px at 92% 78%, rgba(255,255,255,1), transparent),
        radial-gradient(1.2px 1.2px at 5% 40%, rgba(255,255,255,0.8), transparent),
        radial-gradient(1.6px 1.6px at 47% 30%, rgba(255,255,255,1), transparent),
        radial-gradient(1.2px 1.2px at 78% 10%, rgba(255,255,255,0.9), transparent),
        radial-gradient(1.6px 1.6px at 95% 35%, rgba(255,255,255,0.8), transparent),
        radial-gradient(1.2px 1.2px at 20% 58%, rgba(255,255,255,1), transparent),
        radial-gradient(1.4px 1.4px at 8% 88%, rgba(255,255,255,0.85), transparent),
        radial-gradient(1.2px 1.2px at 30% 8%, rgba(255,255,255,0.9), transparent),
        radial-gradient(1.6px 1.6px at 50% 92%, rgba(255,255,255,0.85), transparent),
        radial-gradient(1.2px 1.2px at 65% 8%, rgba(255,255,255,1), transparent),
        radial-gradient(1.4px 1.4px at 75% 68%, rgba(255,255,255,0.8), transparent),
        radial-gradient(1.2px 1.2px at 88% 20%, rgba(255,255,255,0.9), transparent),
        radial-gradient(1.6px 1.6px at 3% 60%, rgba(255,255,255,0.95), transparent),
        radial-gradient(1.2px 1.2px at 42% 68%, rgba(255,255,255,0.85), transparent),
        radial-gradient(1.4px 1.4px at 98% 58%, rgba(255,255,255,0.9), transparent);
    background-repeat: no-repeat;
}
/* Kerlip tipis di atas foto -- aksen halus, bukan lapisan bintang penuh
   (foto malam sudah punya bintangnya sendiri), jadi rentang opacity-nya
   sengaja dibuat rendah lewat keyframe terpisah dari tema lain.
   opacity statis WAJIB ada: basis .boot-stars itu opacity 0, dan pada
   prefers-reduced-motion animasinya dimatikan -- tanpa nilai statis ini
   bintangnya hilang sama sekali untuk pengguna tersebut. */
.boot-screen.boot-malam .boot-stars {
    opacity: 0.3;
    animation: bootTwinkleSubtle 4.5s ease-in-out infinite;
}
@keyframes bootTwinkleSubtle {
    0%, 100% { opacity: 0.18; }
    50% { opacity: 0.4; }
}

/* Bintang jatuh -- streak yang muncul sekali lalu memudar, cukup untuk
   durasi tampil boot screen (~5 detik), tidak perlu berulang. */
.boot-shooting-star {
    position: absolute;
    width: 2px;
    height: 2px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 8px 1.5px rgba(255,255,255,0.9);
    opacity: 0;
}
.boot-shooting-star::after {
    content: "";
    position: absolute;
    top: 50%;
    right: 0;
    width: 90px;
    height: 1.5px;
    background: linear-gradient(90deg, rgba(255,255,255,0.85), rgba(255,255,255,0));
    transform: translateY(-50%) rotate(-35deg);
    transform-origin: right center;
}
.boot-screen.boot-malam .boot-shooting-star.s1 {
    top: 18%;
    left: 66%;
    animation: bootShootingStar1 1.5s linear 2.5s 1;
}

/* Bayangan lembut di belakang teks supaya tetap gampang dibaca di atas
   langit terang (siang/senja), bukan cuma latar gelap seperti sebelumnya. */
.boot-scrim {
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    background: radial-gradient(ellipse 65% 48% at 50% 50%, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.1) 60%, rgba(0,0,0,0) 85%);
}
/* Ilustrasi malam lebih ramai (banyak pusaran/bintang) -- scrim sedikit
   lebih gelap di tengah supaya teks tetap gampang dibaca. */
.boot-screen.boot-malam .boot-scrim {
    background: radial-gradient(ellipse 62% 46% at 50% 50%, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0.18) 60%, rgba(0,0,0,0) 88%);
}
/* Foto asli jauh lebih terang & detail dari gradasi CSS lama -- scrim
   diperkuat supaya teks putih tetap kebaca. */
.boot-screen.boot-pagi .boot-scrim,
.boot-screen.boot-siang .boot-scrim,
.boot-screen.boot-sore .boot-scrim {
    background: radial-gradient(ellipse 62% 46% at 50% 50%, rgba(0,20,45,0.4) 0%, rgba(0,20,45,0.2) 60%, rgba(0,20,45,0) 88%);
}

.boot-content {
    position: relative;
    z-index: 2;
    height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 18px;
}

/* Font "Hello" ala Apple: bentuk rounded/friendly dari sistem font.
   ui-rounded & -apple-system-rounded adalah nilai khusus yang dikenali
   Safari/WebKit untuk memakai varian SF Pro Rounded milik sistem (tanpa
   perlu mengunggah file font Apple, yang memang tidak boleh didistribusikan
   di luar platform Apple). Di browser lain otomatis jatuh ke system-ui. */
.boot-mark,
.boot-greeting,
.boot-name {
    font-family: -apple-system-rounded, ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
}

.boot-mark {
    width: 56px;
    height: 56px;
    border-radius: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(255,255,255,0.14);
    box-shadow: inset 0 0 0 1px rgba(255,255,255,0.28), 0 4px 18px rgba(0,0,0,0.2);
    color: #fff;
    font-weight: 700;
    font-size: 24px;
    letter-spacing: -0.02em;
    opacity: 0;
    transform: scale(0.85);
    animation: bootMarkIn 0.7s var(--ease) 0.2s forwards;
}
.boot-mark-photo {
    object-fit: cover;
    background: rgba(255,255,255,0.08);
}

.boot-greeting {
    font-size: clamp(30px, 5.4vw, 52px);
    font-weight: 300;
    letter-spacing: -0.01em;
    color: #fff;
    margin: 0;
    opacity: 0;
    transform: translateY(10px);
    animation: bootTextIn 0.9s var(--ease) 0.85s forwards;
}

.boot-name {
    font-size: clamp(22px, 3.4vw, 34px);
    font-weight: 500;
    letter-spacing: -0.01em;
    color: rgba(255,255,255,0.92);
    margin: 2px 0 0;
    opacity: 0;
    transform: translateY(8px);
    animation: bootTextIn 0.9s var(--ease) 1.75s forwards;
}

.boot-track {
    width: 140px;
    height: 3px;
    border-radius: 999px;
    background: rgba(255,255,255,0.18);
    overflow: hidden;
    margin-top: 20px;
    opacity: 0;
    animation: bootTextIn 0.6s var(--ease) 2.65s forwards;
}
.boot-track::after {
    content: "";
    display: block;
    height: 100%;
    width: 100%;
    background: #fff;
    border-radius: 999px;
    transform: translateX(-100%);
    animation: bootProgress 1.9s cubic-bezier(0.65,0,0.35,1) 2.7s forwards;
}

@keyframes bootMarkIn {
    to { opacity: 1; transform: scale(1); }
}
@keyframes bootTextIn {
    to { opacity: 1; transform: translateY(0); }
}
@keyframes bootProgress {
    to { transform: translateX(0); }
}
@keyframes bootCloudDrift {
    0%, 100% { transform: translateX(0); }
    50% { transform: translateX(22px); }
}
@keyframes bootTwinkle {
    0%, 100% { opacity: 0.75; }
    50% { opacity: 1; }
}
@keyframes bootShootingStar1 {
    0% { opacity: 0; transform: translate(0, 0); }
    45% { opacity: 1; }
    68% { opacity: 1; }
    100% { opacity: 0; transform: translate(-170px, 115px); }
}

@media (prefers-reduced-motion: reduce) {
    .boot-mark, .boot-greeting, .boot-name, .boot-track, .boot-track::after {
        animation: none !important;
        opacity: 1 !important;
        transform: none !important;
    }
    .boot-cloud, .boot-stars {
        animation: none !important;
    }
    .boot-shooting-star {
        display: none !important;
    }
    .boot-screen { transition: none; animation: none !important; opacity: 1 !important; }
    .boot-scene { animation: none !important; transform: none !important; }
    .login-wrap { transition: none !important; }
    .login-wrap.leaving { opacity: 1 !important; transform: none !important; }
}

/* ================= MODAL SCAN KAMERA (Checkout Sore, mobile) ================= */
.camera-modal {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 200;
    background: rgba(0,0,0,0.88);
    align-items: center;
    justify-content: center;
    padding: 20px;
}
.camera-modal.show { display: flex; }

.camera-modal-inner {
    position: relative;
    width: 100%;
    max-width: 420px;
    background: #000;
    border-radius: var(--radius-md);
    overflow: hidden;
    box-shadow: var(--shadow-lg);
    box-sizing: border-box;
}

#cameraReader {
    width: 100%;
    min-height: 260px;
    overflow: hidden;
    box-sizing: border-box;
}
/* Library html5-qrcode menyuntikkan elemen <video>/<canvas> sendiri di
   dalam #cameraReader; pastikan videonya memenuhi lebar kotak dan TIDAK
   PERNAH melebihi lebar kontainer (object-fit: cover memotong bagian yang
   kelebihan alih-alih membiarkannya meluber ke luar layar). */
#cameraReader video {
    width: 100% !important;
    height: auto !important;
    max-width: 100% !important;
    object-fit: cover;
    border-radius: 0 !important;
    display: block;
}
#cameraReader canvas {
    max-width: 100% !important;
}

.camera-modal-close {
    position: absolute;
    top: 10px;
    right: 10px;
    z-index: 5;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    border: none;
    background: rgba(255,255,255,0.25);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    color: #fff;
    font-size: 16px;
    cursor: pointer;
    transition: background 0.15s var(--ease), transform 0.15s var(--ease);
}
.camera-modal-close:hover { background: rgba(255,255,255,0.4); }
.camera-modal-close:active { transform: scale(0.9); }

.camera-modal-hint {
    color: rgba(255,255,255,0.85);
    text-align: center;
    font-size: 13px;
    padding: 12px 16px;
    margin: 0;
}

/* Grid 2 kolom kartu Import Manual Penghasilan (index.php/Dashboard) -- stack
   jadi 1 kolom di layar sempit, sama seperti breakpoint lain di file ini. */
@media (max-width: 768px) {
    .grid-import-penghasilan { grid-template-columns: 1fr !important; }
}

/* ===================== Tur Onboarding (assets/tour.js) =====================
   Spotlight pakai trik box-shadow: elemen kosong seukuran+posisi target,
   box-shadow raksasa (9999px) jadi "layar gelap" di sekelilingnya -- tidak
   perlu overlay + clip-path terpisah. pointer-events:none supaya klik ke
   elemen yang disorot (mis. tombol Update Stok) tetap tembus & berfungsi. */
.tour-spotlight {
    position: fixed;
    z-index: 9998;
    border-radius: 10px;
    box-shadow: 0 0 0 9999px rgba(10,10,14,0.62);
    pointer-events: none;
    transition: top 0.25s var(--ease), left 0.25s var(--ease), width 0.25s var(--ease), height 0.25s var(--ease);
}
.tour-popover {
    position: fixed;
    z-index: 9999;
    width: 300px;
    max-width: calc(100vw - 24px);
    background: var(--card);
    border-radius: var(--radius-md);
    box-shadow: 0 12px 32px rgba(0,0,0,0.28);
    padding: 18px 20px;
}
.tour-popover-progress {
    font-size: 11.5px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--primary);
    margin-bottom: 8px;
}
.tour-popover-judul {
    font-size: 16px;
    font-weight: 700;
    color: var(--text);
    margin: 0 0 8px;
}
.tour-popover-isi {
    font-size: 13.5px;
    line-height: 1.55;
    color: var(--muted);
    margin: 0 0 16px;
}
.tour-popover-aksi {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 10px;
}
