/* =====================================================================
   SIPeMa — Elegant Blue Theme
   Layer di atas volt.min.css. Semua warna diturunkan dari token di :root
   supaya gampang di-tuning satu tempat.
   ===================================================================== */

:root {
    /* Brand — biru navy ke royal */
    --sp-navy-900: #0A1F44;
    --sp-navy-800: #0E2A5A;
    --sp-navy-700: #13366F;
    --sp-blue-700: #1D4ED8;
    --sp-blue-600: #2563EB;
    --sp-blue-500: #3B82F6;
    --sp-blue-400: #60A5FA;
    --sp-blue-100: #DBEAFE;
    --sp-blue-50:  #EFF6FF;

    /* Netral kebiruan */
    --sp-bg:        #F4F7FC;
    --sp-surface:   #FFFFFF;
    --sp-border:    #E3EAF3;
    --sp-text:      #16233A;
    --sp-text-soft: #5A6B85;
    --sp-muted:     #8A99AF;

    /* Status */
    --sp-success: #0F9D58;
    --sp-warning: #E9A23B;
    --sp-danger:  #DC3545;
    --sp-info:    var(--sp-blue-500);

    /* Elevasi & bentuk */
    --sp-radius:    .75rem;
    --sp-radius-sm: .5rem;
    --sp-shadow-xs: 0 1px 2px rgba(10, 31, 68, .06);
    --sp-shadow-sm: 0 2px 8px rgba(10, 31, 68, .07);
    --sp-shadow-md: 0 6px 20px rgba(10, 31, 68, .09);
    --sp-shadow-lg: 0 14px 40px rgba(10, 31, 68, .14);
    --sp-ring:      0 0 0 .2rem rgba(37, 99, 235, .18);
}

/* ---------------------------------------------------------------------
   Global
   --------------------------------------------------------------------- */

body {
    background-color: var(--sp-bg);
    color: var(--sp-text);
    font-family: Inter, "Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    color: var(--sp-navy-900);
    font-weight: 600;
    letter-spacing: -.01em;
}

a { color: var(--sp-blue-600); }
a:hover { color: var(--sp-blue-700); }

.text-primary { color: var(--sp-blue-600) !important; }
.text-gray-900, .text-dark { color: var(--sp-text) !important; }
.text-gray-500, .text-gray-600, .text-muted { color: var(--sp-text-soft) !important; }

.bg-primary { background-color: var(--sp-blue-600) !important; }
.bg-gray-800 { background-color: var(--sp-navy-900) !important; }
.bg-soft-blue { background-color: var(--sp-blue-50) !important; }

.shadow, .shadow-sm { box-shadow: var(--sp-shadow-sm) !important; }
.shadow-lg { box-shadow: var(--sp-shadow-md) !important; }

::selection { background: var(--sp-blue-100); color: var(--sp-navy-900); }

/* Scrollbar halus */
* { scrollbar-width: thin; scrollbar-color: #C3D2E6 transparent; }
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #C3D2E6; border-radius: 8px; }
::-webkit-scrollbar-thumb:hover { background: var(--sp-blue-400); }

/* ---------------------------------------------------------------------
   Sidebar
   --------------------------------------------------------------------- */

.sidebar {
    background: linear-gradient(180deg, var(--sp-navy-900) 0%, var(--sp-navy-800) 55%, var(--sp-navy-700) 100%) !important;
    box-shadow: 2px 0 24px rgba(10, 31, 68, .18);
    border-right: 1px solid rgba(255, 255, 255, .05);
}

.sidebar .sidebar-inner { padding-bottom: 2rem; }

.sidebar .nav-item { margin-bottom: .15rem; }

.sidebar .nav-link,
.sidebar .nav-item .nav-link {
    color: #C7D6EC;
    font-size: .9rem;
    font-weight: 500;
    border-radius: var(--sp-radius-sm);
    padding: .55rem .8rem;
    transition: background-color .18s ease, color .18s ease, box-shadow .18s ease;
}

.sidebar .nav-link .sidebar-icon,
.sidebar .nav-link .sidebar-icon svg { color: #8FAAD1; transition: color .18s ease; }

.sidebar .nav-item .nav-link:hover,
.sidebar .nav-link:hover {
    background-color: rgba(96, 165, 250, .14);
    color: #FFFFFF;
}

.sidebar .nav-link:hover .sidebar-icon,
.sidebar .nav-link:hover .sidebar-icon svg { color: var(--sp-blue-400); }

.sidebar .nav-item.active > .nav-link,
.sidebar .nav-link.active {
    background: linear-gradient(90deg, var(--sp-blue-600) 0%, var(--sp-blue-500) 100%);
    color: #FFFFFF;
    font-weight: 600;
    box-shadow: 0 6px 16px rgba(37, 99, 235, .35);
}

.sidebar .nav-item.active > .nav-link .sidebar-icon,
.sidebar .nav-item.active > .nav-link .sidebar-icon svg { color: #FFFFFF; }

/* Submenu bertingkat */
.sidebar .multi-level {
    margin: .15rem 0 .35rem .55rem;
    padding-left: .55rem;
    border-left: 1px solid rgba(255, 255, 255, .12);
}

.sidebar .multi-level .nav-link {
    font-size: .84rem;
    color: #A9BEDC;
    padding: .4rem .7rem;
}

.sidebar .multi-level .nav-item.active > .nav-link {
    background: rgba(37, 99, 235, .9);
    box-shadow: none;
}

.sidebar .link-arrow svg { opacity: .7; }

.sidebar .user-card { border-bottom-color: rgba(255, 255, 255, .1); }

.sidebar-heading {
    color: #7E97BE;
    letter-spacing: .08em;
    font-weight: 600;
}

/* ---------------------------------------------------------------------
   Navbar atas
   --------------------------------------------------------------------- */

.navbar-dashboard {
    /* .94, bukan .88: saat hero navy tergulir di baliknya kontras teks
       gelap navbar sempat turun terlalu jauh. */
    background: rgba(255, 255, 255, .94);
    -webkit-backdrop-filter: saturate(180%) blur(12px);
    backdrop-filter: saturate(180%) blur(12px);
    border: 1px solid var(--sp-border);
    border-radius: var(--sp-radius);
    box-shadow: var(--sp-shadow-sm);
    margin-top: .85rem;
    /* !important supaya menang atas kelas ps-0 / pe-2 / pb-0 di markup navbar,
       kalau tidak tombol toggle menempel persis di tepi bar. */
    padding: .5rem .9rem !important;
    position: sticky;
    top: .5rem;
    z-index: 60;
}

.navbar-dashboard .sidebar-text {
    color: var(--sp-navy-900);
    font-weight: 600;
    font-size: .98rem;
    letter-spacing: -.01em;
}

.navbar-dashboard .sidebar-toggle {
    color: var(--sp-blue-600);
    background: var(--sp-blue-50);
    border-radius: var(--sp-radius-sm);
    width: 2.25rem; height: 2.25rem;
    padding: 0;
    flex: 0 0 auto;
    transition: background-color .18s ease, color .18s ease;
}

/* .d-lg-inline-block memakai !important, jadi perlu !important juga supaya
   ikonnya bisa ditengahkan pakai flex. Wajib dikurung media query lg: tanpa
   itu selector ini (0,2,0) mengalahkan .d-none (0,1,0) dan tombolnya ikut
   muncul di mobile, padahal di sana yang dipakai .navbar-toggler. */
@media (min-width: 992px) {
    .navbar-dashboard .sidebar-toggle {
        display: inline-flex !important;
        align-items: center;
        justify-content: center;
    }
}

.navbar-dashboard .sidebar-toggle .toggle-icon {
    display: block;
    width: 1.15rem;
    height: 1.15rem;
}

.navbar-dashboard .sidebar-toggle:hover,
.navbar-dashboard .sidebar-toggle:focus {
    background: var(--sp-blue-100);
    color: var(--sp-blue-700);
    box-shadow: none;
}

.navbar-dashboard .nav-link { color: var(--sp-text) !important; }

.navbar-dashboard .avatar {
    border: 2px solid var(--sp-blue-100);
    box-shadow: var(--sp-shadow-xs);
    /* Tanpa ini avatar tergencet jadi lonjong di layar sempit: lebarnya
       diatur inline (50px) tapi flex boleh menyusutkannya. */
    flex-shrink: 0;
}

/* Navbar mobile (di luar .content) */
.navbar-theme-primary:not(.headroom) {
    background: linear-gradient(90deg, var(--sp-navy-900) 0%, var(--sp-navy-700) 100%) !important;
}

/* ---------------------------------------------------------------------
   Card
   --------------------------------------------------------------------- */

.card {
    background-color: var(--sp-surface);
    border: 1px solid var(--sp-border);
    border-radius: var(--sp-radius);
    box-shadow: var(--sp-shadow-sm);
    transition: box-shadow .2s ease, transform .2s ease;
}

.card.shadow:hover, .card.shadow-lg:hover { box-shadow: var(--sp-shadow-md); }

.card-header {
    background-color: var(--sp-surface);
    border-bottom: 1px solid var(--sp-border);
    color: var(--sp-navy-900);
    font-weight: 600;
    border-top-left-radius: var(--sp-radius);
    border-top-right-radius: var(--sp-radius);
    padding: 1rem 1.5rem;
}

.card-footer {
    background-color: var(--sp-surface);
    border-top: 1px solid var(--sp-border);
    border-bottom-left-radius: var(--sp-radius);
    border-bottom-right-radius: var(--sp-radius);
}

/* Judul kecil di dalam card */
.card .card-title { color: var(--sp-navy-900); }

/* ---------------------------------------------------------------------
   Tombol
   --------------------------------------------------------------------- */

.btn {
    border-radius: var(--sp-radius-sm);
    font-weight: 500;
    transition: background-color .18s ease, border-color .18s ease, box-shadow .18s ease, transform .12s ease;
}

.btn:active { transform: translateY(1px); }

.btn-primary,
.btn-secondary {
    background: linear-gradient(180deg, var(--sp-blue-600) 0%, var(--sp-blue-700) 100%);
    border-color: var(--sp-blue-700);
    color: #fff;
    box-shadow: 0 2px 6px rgba(29, 78, 216, .25);
}

.btn-primary:hover, .btn-primary:focus,
.btn-secondary:hover, .btn-secondary:focus {
    background: linear-gradient(180deg, var(--sp-blue-700) 0%, #1A45C0 100%);
    border-color: #1A45C0;
    color: #fff;
    box-shadow: 0 4px 12px rgba(29, 78, 216, .32);
}

.btn-check:focus + .btn-primary, .btn-primary:focus,
.btn-check:focus + .btn-secondary, .btn-secondary:focus { box-shadow: var(--sp-ring); }

.btn-outline-primary {
    color: var(--sp-blue-600);
    border-color: var(--sp-blue-500);
    background: transparent;
}
.btn-outline-primary:hover {
    background: var(--sp-blue-600);
    border-color: var(--sp-blue-600);
    color: #fff;
}

.btn-info { background-color: var(--sp-blue-500); border-color: var(--sp-blue-500); color: #fff; }
.btn-info:hover { background-color: var(--sp-blue-600); border-color: var(--sp-blue-600); color: #fff; }

.btn-success { background-color: var(--sp-success); border-color: var(--sp-success); color: #fff; }
.btn-success:hover { background-color: #0C8449; border-color: #0C8449; color: #fff; }

.btn-warning { background-color: var(--sp-warning); border-color: var(--sp-warning); color: #fff; }
.btn-warning:hover { background-color: #D08D28; border-color: #D08D28; color: #fff; }

.btn-danger { background-color: var(--sp-danger); border-color: var(--sp-danger); }

.btn-light, .btn-outline-light {
    background-color: #fff;
    border-color: var(--sp-border);
    color: var(--sp-text);
}
.btn-light:hover, .btn-outline-light:hover {
    background-color: var(--sp-blue-50);
    border-color: var(--sp-blue-100);
    color: var(--sp-blue-700);
}

/* ---------------------------------------------------------------------
   Tabel
   --------------------------------------------------------------------- */

.table {
    color: var(--sp-text);
    border-color: var(--sp-border);
}

.table thead th,
.table > thead > tr > th {
    background-color: var(--sp-blue-50);
    color: var(--sp-navy-800);
    font-size: .74rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    border-bottom: 1px solid var(--sp-border);
    vertical-align: middle;
}

.table > :not(caption) > * > * { border-bottom-color: #EDF2F9; }

.table > :not(caption) > * > th,
.table > :not(caption) > * > td { padding: .85rem .9rem; }

.table tbody tr { transition: background-color .15s ease; }
.table-hover > tbody > tr:hover,
.table-hover tbody tr:hover > * { background-color: var(--sp-blue-50); color: var(--sp-text); }

.table-striped > tbody > tr:nth-of-type(odd) > * { background-color: #FAFCFF; color: var(--sp-text); }

/* Card yang membungkus tabel: sudut tabel ikut membulat */
.card > .table-responsive:last-child,
.card > .table:last-child { border-bottom-left-radius: var(--sp-radius); border-bottom-right-radius: var(--sp-radius); overflow: hidden; }

/* Kolom/heading sticky yang sudah dipakai di beberapa halaman */
.sticky-column { background-color: #fff; box-shadow: 2px 0 6px rgba(10, 31, 68, .08); }
.sticky-header { background-color: var(--sp-blue-50); box-shadow: 0 2px 6px rgba(10, 31, 68, .08); }

/* ---------------------------------------------------------------------
   Form
   --------------------------------------------------------------------- */

.form-control, .form-select {
    border: 1px solid #D8E2EF;
    border-radius: var(--sp-radius-sm);
    color: var(--sp-text);
    background-color: #fff;
    transition: border-color .18s ease, box-shadow .18s ease;
}

.form-control::placeholder { color: var(--sp-muted); }

.form-control:focus, .form-select:focus {
    border-color: var(--sp-blue-500);
    box-shadow: var(--sp-ring);
}

.form-control:disabled, .form-control[readonly], .form-select:disabled {
    background-color: #F5F8FC;
    color: var(--sp-text-soft);
}

.form-label, label { color: var(--sp-text); font-weight: 500; }

.input-group-text {
    background-color: var(--sp-blue-50);
    border-color: #D8E2EF;
    color: var(--sp-blue-600);
    border-radius: var(--sp-radius-sm);
}

.form-check-input:checked { background-color: var(--sp-blue-600); border-color: var(--sp-blue-600); }
.form-check-input:focus { border-color: var(--sp-blue-500); box-shadow: var(--sp-ring); }

/* Choices.js */
.choices__inner { border-radius: var(--sp-radius-sm); border-color: #D8E2EF; background-color: #fff; }
.choices__list--dropdown { border-color: #D8E2EF; border-radius: var(--sp-radius-sm); box-shadow: var(--sp-shadow-md); }
.choices__list--dropdown .choices__item--selectable.is-highlighted { background-color: var(--sp-blue-50); }
.choices__list--multiple .choices__item { background-color: var(--sp-blue-600); border-color: var(--sp-blue-700); border-radius: 999px; }

/* ---------------------------------------------------------------------
   Badge, alert, dropdown, modal, tab, pagination
   --------------------------------------------------------------------- */

.badge {
    border-radius: 999px;
    padding: .38em .75em;
    font-weight: 600;
    letter-spacing: .01em;
}

.badge.bg-primary { background-color: var(--sp-blue-600) !important; }
.badge.bg-info { background-color: var(--sp-blue-500) !important; }
.badge.bg-secondary { background-color: var(--sp-navy-700) !important; }

.alert {
    border: 1px solid transparent;
    border-radius: var(--sp-radius-sm);
    box-shadow: var(--sp-shadow-xs);
}
.alert-primary { background-color: var(--sp-blue-50); border-color: var(--sp-blue-100); color: var(--sp-navy-800); }
.alert-success { background-color: #E9F7F0; border-color: #C6EBD9; color: #0B6B3D; }
.alert-danger  { background-color: #FDECEE; border-color: #F8CFD5; color: #9B1C2A; }
.alert-warning { background-color: #FDF5E7; border-color: #F7E3BE; color: #8A5A12; }

.dropdown-menu {
    border: 1px solid var(--sp-border);
    border-radius: var(--sp-radius);
    box-shadow: var(--sp-shadow-md);
    padding: .4rem;
}
.dropdown-item { border-radius: var(--sp-radius-sm); font-size: .9rem; color: var(--sp-text); }
.dropdown-item:hover, .dropdown-item:focus { background-color: var(--sp-blue-50); color: var(--sp-blue-700); }

.modal-content {
    border: 0;
    border-radius: var(--sp-radius);
    box-shadow: var(--sp-shadow-lg);
    overflow: hidden;
}
.modal-header {
    background: linear-gradient(90deg, var(--sp-navy-800) 0%, var(--sp-blue-700) 100%);
    color: #fff;
    border-bottom: 0;
    padding: 1rem 1.5rem;
}
.modal-header .modal-title, .modal-header h1, .modal-header h2,
.modal-header h3, .modal-header h4, .modal-header h5, .modal-header h6 { color: #fff; }
.modal-header .btn-close { filter: invert(1) grayscale(1); opacity: .85; }
.modal-footer { border-top: 1px solid var(--sp-border); background-color: #FBFDFF; }

.nav-tabs { border-bottom: 1px solid var(--sp-border); }
.nav-tabs .nav-link {
    color: var(--sp-text-soft);
    border: 0;
    border-bottom: 2px solid transparent;
    border-radius: 0;
    font-weight: 500;
}
.nav-tabs .nav-link:hover { color: var(--sp-blue-600); border-bottom-color: var(--sp-blue-100); }
.nav-tabs .nav-link.active {
    color: var(--sp-blue-700);
    background: transparent;
    border-bottom-color: var(--sp-blue-600);
    font-weight: 600;
}

.nav-pills .nav-link.active { background-color: var(--sp-blue-600); border-radius: var(--sp-radius-sm); }

.page-link { color: var(--sp-blue-600); border-color: var(--sp-border); }
.page-link:hover { background-color: var(--sp-blue-50); color: var(--sp-blue-700); border-color: var(--sp-blue-100); }
.page-item.active .page-link { background-color: var(--sp-blue-600); border-color: var(--sp-blue-600); color: #fff; }

.progress { background-color: #E8EFF9; border-radius: 999px; }
.progress-bar { background-color: var(--sp-blue-600); }

.list-group-item { border-color: var(--sp-border); color: var(--sp-text); }
.list-group-item.active { background-color: var(--sp-blue-600); border-color: var(--sp-blue-600); }

/* Volt/Bootstrap menggambar <hr> dengan `background-color: currentColor` dan
   `opacity: .25`. Menaikkan opacity saja membuat garisnya sekuat warna teks
   (nyaris hitam), jadi warnanya ikut diganti ke warna garis tema. */
hr {
    border: 0;
    background-color: var(--sp-border);
    color: var(--sp-border);
    opacity: 1;
}

.breadcrumb-item + .breadcrumb-item::before { color: var(--sp-muted); }
.breadcrumb-item a { color: var(--sp-blue-600); }
.breadcrumb-item.active { color: var(--sp-text-soft); }

/* ---------------------------------------------------------------------
   Footer
   --------------------------------------------------------------------- */

footer.bg-white, .footer {
    background-color: var(--sp-surface) !important;
    border: 1px solid var(--sp-border);
    border-radius: var(--sp-radius);
    box-shadow: var(--sp-shadow-xs);
    color: var(--sp-text-soft);
    padding: 1.5rem !important;
}

/* ---------------------------------------------------------------------
   Konten
   --------------------------------------------------------------------- */

.content {
    padding: 0 1.25rem 1.25rem 1.25rem;
    /* Volt memberi .content `overflow:hidden`, dan itu menjadikannya scroll
       container sehingga `position:sticky` pada navbar tidak pernah menempel.
       `overflow:clip` mengunci tampilan yang sama tanpa membuat scroll
       container, jadi sticky-nya bekerja. Deklarasi `hidden` sengaja
       ditinggal di depan sebagai fallback untuk browser lama yang belum
       mengenal `clip` (di sana navbar sekadar tidak sticky, tidak rusak). */
    overflow: hidden;
    overflow: clip;
}

/* .sticky-header (my_css.css) memakai top:0; beri offset supaya kalau nanti
   dipakai, header tabelnya berhenti di bawah navbar, bukan tersembunyi. */
.sticky-header { top: 5.75rem; }

/* Utility tambahan yang dipakai tema */
.text-navy { color: var(--sp-navy-900) !important; }
.bg-navy { background-color: var(--sp-navy-900) !important; }

/* =====================================================================
   Halaman Auth (login / lupa password) — .sipema-auth
   ===================================================================== */

.sipema-auth {
    position: relative;
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 2rem 1rem;
    background:
        radial-gradient(1100px 620px at 12% -10%, rgba(59, 130, 246, .38) 0%, transparent 60%),
        radial-gradient(900px 560px at 92% 108%, rgba(29, 78, 216, .40) 0%, transparent 62%),
        linear-gradient(140deg, #071733 0%, var(--sp-navy-900) 45%, var(--sp-navy-700) 100%);
    overflow: hidden;
}

/* Grid halus sebagai tekstur latar */
.sipema-auth::before {
    content: "";
    position: absolute;
    inset: 0;
    background-image:
        linear-gradient(rgba(255, 255, 255, .045) 1px, transparent 1px),
        linear-gradient(90deg, rgba(255, 255, 255, .045) 1px, transparent 1px);
    background-size: 56px 56px;
    -webkit-mask-image: radial-gradient(circle at 50% 45%, #000 0%, transparent 78%);
    mask-image: radial-gradient(circle at 50% 45%, #000 0%, transparent 78%);
    pointer-events: none;
}

.sipema-auth-card {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 62rem;
    background: var(--sp-surface);
    border-radius: 1.25rem;
    box-shadow: 0 30px 70px rgba(3, 12, 30, .45);
    overflow: hidden;
}

/* --- Panel kiri (branding) --- */

.sipema-auth-brand {
    position: relative;
    background: linear-gradient(160deg, var(--sp-navy-800) 0%, var(--sp-navy-700) 55%, var(--sp-blue-700) 100%);
    color: #E4EDFB;
    padding: 3rem 2.75rem;
    display: flex;
    flex-direction: column;
    justify-content: center;
    overflow: hidden;
}

.sipema-auth-brand::after {
    content: "";
    position: absolute;
    right: -5rem; bottom: -7rem;
    width: 20rem; height: 20rem;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(96, 165, 250, .34) 0%, transparent 68%);
    pointer-events: none;
}

.sipema-auth-brand > * { position: relative; z-index: 1; }

.sipema-auth-logo {
    width: 3.25rem; height: 3.25rem;
    border-radius: .875rem;
    object-fit: cover;
    background: #fff;
    padding: .25rem;
    box-shadow: 0 8px 20px rgba(3, 12, 30, .35);
}

.sipema-auth-brand .sipema-wordmark {
    font-size: 1.9rem;
    font-weight: 700;
    letter-spacing: -.02em;
    color: #fff;
    margin: 1.5rem 0 .4rem;
    line-height: 1.15;
}

.sipema-auth-brand .sipema-tagline {
    font-size: .95rem;
    line-height: 1.65;
    color: #B9CEEC;
    margin-bottom: 2rem;
}

.sipema-auth-points { list-style: none; padding: 0; margin: 0; }

.sipema-auth-points li {
    display: flex;
    align-items: flex-start;
    gap: .7rem;
    font-size: .9rem;
    color: #D5E3F7;
    margin-bottom: .85rem;
}

.sipema-auth-points li:last-child { margin-bottom: 0; }

.sipema-auth-points .tick {
    flex: 0 0 auto;
    width: 1.4rem; height: 1.4rem;
    border-radius: 50%;
    background: rgba(96, 165, 250, .22);
    color: #93C0FF;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-top: .05rem;
}

.sipema-auth-points .tick svg { width: .8rem; height: .8rem; }

/* --- Panel kanan (form) --- */

.sipema-auth-form { padding: 3rem 2.75rem; }

.sipema-auth-form .auth-title {
    font-size: 1.45rem;
    font-weight: 700;
    color: var(--sp-navy-900);
    margin-bottom: .35rem;
    letter-spacing: -.02em;
}

.sipema-auth-form .auth-subtitle {
    color: var(--sp-text-soft);
    font-size: .92rem;
    margin-bottom: 1.9rem;
}

.sipema-auth-form .form-label {
    font-size: .82rem;
    font-weight: 600;
    color: var(--sp-text-soft);
    text-transform: uppercase;
    letter-spacing: .05em;
    margin-bottom: .45rem;
}

.sipema-auth-form .input-group-text {
    background: #fff;
    border-right: 0;
    color: var(--sp-blue-500);
    padding-left: .9rem;
    padding-right: .6rem;
}

.sipema-auth-form .input-group .form-control {
    border-left: 0;
    padding-left: 0;
    height: 3rem;
}

.sipema-auth-form .input-group:focus-within .input-group-text,
.sipema-auth-form .input-group:focus-within .form-control {
    border-color: var(--sp-blue-500);
    box-shadow: none;
}

.sipema-auth-form .input-group:focus-within {
    border-radius: var(--sp-radius-sm);
    box-shadow: var(--sp-ring);
}

.sipema-auth-form .btn-signin {
    height: 3rem;
    font-weight: 600;
    letter-spacing: .01em;
    border-radius: var(--sp-radius-sm);
}

.sipema-auth-form .auth-foot {
    margin-top: 2rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--sp-border);
    text-align: center;
    font-size: .82rem;
    color: var(--sp-muted);
}

/* Header ringkas untuk layar kecil (panel kiri disembunyikan) */
.sipema-auth-mobile-head {
    display: flex;
    align-items: center;
    gap: .85rem;
    margin-bottom: 2rem;
}

.sipema-auth-mobile-head img { width: 2.75rem; height: 2.75rem; border-radius: .75rem; object-fit: cover; }
.sipema-auth-mobile-head .name { font-weight: 700; color: var(--sp-navy-900); line-height: 1.2; }
.sipema-auth-mobile-head .desc { font-size: .78rem; color: var(--sp-text-soft); }

@media (min-width: 992px) { .sipema-auth-mobile-head { display: none; } }

@media (max-width: 575.98px) {
    .sipema-auth { padding: 1rem .75rem; }
    .sipema-auth-form { padding: 2rem 1.5rem; }
    .sipema-auth-card { border-radius: 1rem; }
}

/* Tombol gelap bawaan Volt ikut jadi biru */
.btn-gray-800 {
    background: linear-gradient(180deg, var(--sp-blue-600) 0%, var(--sp-blue-700) 100%);
    border-color: var(--sp-blue-700);
    color: #fff;
}
.btn-gray-800:hover, .btn-gray-800:focus {
    background: linear-gradient(180deg, var(--sp-blue-700) 0%, #1A45C0 100%);
    border-color: #1A45C0;
    color: #fff;
}

/* =====================================================================
   Hero sambutan (dashboard)
   ===================================================================== */

.sipema-hero {
    position: relative;
    border-radius: var(--sp-radius);
    padding: 1.75rem 1.9rem;
    color: #E6EEFB;
    background:
        radial-gradient(700px 380px at 88% -30%, rgba(96, 165, 250, .35) 0%, transparent 62%),
        linear-gradient(120deg, var(--sp-navy-900) 0%, var(--sp-navy-700) 62%, var(--sp-blue-700) 100%);
    box-shadow: var(--sp-shadow-md);
    overflow: hidden;
}

.sipema-hero::after {
    content: "";
    position: absolute;
    right: -3.5rem; top: -6rem;
    width: 15rem; height: 15rem;
    border-radius: 50%;
    border: 1.5rem solid rgba(255, 255, 255, .05);
    pointer-events: none;
}

.sipema-hero > * { position: relative; z-index: 1; }

.sipema-hero .hero-greeting {
    font-size: .82rem;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: #93C0FF;
    font-weight: 600;
    margin-bottom: .35rem;
}

.sipema-hero .hero-name {
    font-size: 1.5rem;
    font-weight: 700;
    color: #fff;
    letter-spacing: -.02em;
    margin-bottom: .6rem;
    line-height: 1.25;
}

.sipema-hero .hero-sub {
    font-size: .9rem;
    color: #B9CEEC;
    margin-bottom: 0;
}

.sipema-hero .hero-chip {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    background: rgba(255, 255, 255, .12);
    border: 1px solid rgba(255, 255, 255, .18);
    color: #E6EEFB;
    border-radius: 999px;
    padding: .3rem .8rem;
    font-size: .8rem;
    font-weight: 600;
}

.sipema-hero .hero-chip svg { width: .9rem; height: .9rem; }

.sipema-hero .hero-avatar {
    width: 4.5rem; height: 4.5rem;
    border-radius: 50%;
    object-fit: cover;
    border: 3px solid rgba(255, 255, 255, .28);
    box-shadow: 0 10px 26px rgba(3, 12, 30, .35);
}

/* =====================================================================
   Carousel dashboard
   ===================================================================== */

.sipema-carousel { border-radius: var(--sp-radius); overflow: hidden; }

/* Rasio dikunci mengikuti gambar banner (±2,48:1) supaya tinggi kartu tidak
   berubah-ubah saat slide berganti. */
.sipema-carousel .carousel-item img {
    width: 100%;
    aspect-ratio: 2.48;
    object-fit: cover;
    display: block;
}

.sipema-carousel .carousel-indicators {
    margin-bottom: .85rem;
}

.sipema-carousel .carousel-indicators [data-bs-target] {
    width: .55rem;
    height: .55rem;
    border-radius: 999px;
    border: 0;
    background-color: rgba(255, 255, 255, .55);
    box-shadow: 0 1px 4px rgba(3, 12, 30, .35);
    opacity: 1;
    transition: width .25s ease, background-color .25s ease;
}

.sipema-carousel .carousel-indicators .active {
    width: 1.6rem;
    background-color: var(--sp-blue-500);
}

.sipema-carousel .carousel-control-prev,
.sipema-carousel .carousel-control-next {
    width: 3.5rem;
    opacity: 0;
    transition: opacity .2s ease;
}

.sipema-carousel:hover .carousel-control-prev,
.sipema-carousel:hover .carousel-control-next,
.sipema-carousel .carousel-control-prev:focus-visible,
.sipema-carousel .carousel-control-next:focus-visible { opacity: 1; }

.sipema-carousel .carousel-control-prev-icon,
.sipema-carousel .carousel-control-next-icon {
    width: 2.2rem; height: 2.2rem;
    background-size: 1rem 1rem;
    background-position: center;
    background-repeat: no-repeat;
    background-color: rgba(10, 31, 68, .55);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    border-radius: 50%;
}

/* Volt mematikan ikon panah bawaan Bootstrap (`background-image: none`) dan
   menggantinya dengan glyph Font Awesome 5 lewat `::before` (U+F060/U+F061).
   Font Awesome tidak pernah dimuat di proyek ini - tidak ada <link> maupun
   berkas fontnya - sehingga yang tampil adalah kotak "missing glyph" setinggi
   32px di dalam lingkaran 35px. Glyph itu dimatikan dan panahnya dikembalikan
   sebagai SVG inline. */
.sipema-carousel .carousel-control-prev-icon::before,
.sipema-carousel .carousel-control-next-icon::before { content: none; }

.sipema-carousel .carousel-control-prev-icon {
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e");
}

.sipema-carousel .carousel-control-next-icon {
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
}

/* Kartu kosong ketika belum ada gambar */
.sipema-empty {
    text-align: center;
    padding: 3.5rem 1.5rem;
    color: var(--sp-text-soft);
}

.sipema-empty svg {
    width: 3rem; height: 3rem;
    color: var(--sp-blue-400);
    margin-bottom: 1rem;
}

@media (max-width: 575.98px) {
    .sipema-hero { padding: 1.35rem 1.25rem; }
    .sipema-hero .hero-name { font-size: 1.2rem; }
}

/* =====================================================================
   Branding — sidebar & navbar mobile
   ===================================================================== */

.sidebar-brand-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    padding: .35rem 0 1.1rem;
    margin-bottom: .9rem;
    border-bottom: 1px solid rgba(255, 255, 255, .1);
}

.sidebar-brand {
    display: flex;
    align-items: center;
    gap: .75rem;
    text-decoration: none;
    overflow: hidden;
    min-width: 0;
}

.sidebar-close {
    flex: 0 0 auto;
    width: 2rem; height: 2rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--sp-radius-sm);
    color: #A9BEDC;
    background: rgba(255, 255, 255, .08);
    transition: background-color .18s ease, color .18s ease;
}

.sidebar-close:hover { background: rgba(255, 255, 255, .16); color: #fff; }

.sidebar-brand:hover { text-decoration: none; }

.sidebar-brand-logo {
    flex: 0 0 auto;
    width: 2.4rem; height: 2.4rem;
    border-radius: .7rem;
    object-fit: cover;
    background: #fff;
    padding: 2px;
    box-shadow: 0 6px 16px rgba(3, 12, 30, .35);
}

.sidebar-brand-copy { display: flex; flex-direction: column; line-height: 1.2; min-width: 0; }

.sidebar-brand-copy .brand-name {
    color: #fff;
    font-weight: 700;
    font-size: 1.05rem;
    letter-spacing: -.01em;
}

.sidebar-brand-copy .brand-desc {
    color: #8FAAD1;
    font-size: .72rem;
    letter-spacing: .02em;
    white-space: nowrap;
}

/* Saat sidebar diciutkan, .sidebar-text sudah di-opacity:0 oleh Volt —
   rapatkan juga jaraknya supaya logo tetap di tengah kolom 95px. */
.sidebar.contracted .sidebar-brand-row { justify-content: center; }
.sidebar.contracted .sidebar-brand { gap: 0; }

/* Navbar mobile (menggantikan logo bawaan template) */
.navbar-brand-sipema {
    display: flex;
    align-items: center;
    gap: .6rem;
    padding-top: .35rem;
    padding-bottom: .35rem;
}

.navbar-brand-logo {
    width: 2.1rem; height: 2.1rem;
    border-radius: .6rem;
    object-fit: cover;
    background: #fff;
    padding: 2px;
}

.navbar-brand-text {
    color: #fff;
    font-weight: 700;
    font-size: 1.1rem;
    letter-spacing: -.01em;
    /* Volt meng-uppercase .navbar-brand; penulisan resminya "SIPeMa". */
    text-transform: none;
}

.navbar-theme-primary .navbar-toggler {
    border: 1px solid rgba(255, 255, 255, .25);
    border-radius: var(--sp-radius-sm);
    padding: .35rem .55rem;
}

.navbar-theme-primary .navbar-toggler:focus { box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .18); }

/* =====================================================================
   Identitas pengguna di navbar
   ===================================================================== */

.navbar-user-name {
    display: block;
    max-width: 14rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    line-height: 1.25;
    color: var(--sp-text);
}

.navbar-user-role {
    display: block;
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--sp-blue-600);
    line-height: 1.2;
}

.navbar-dashboard .dropdown-toggle::after { color: var(--sp-muted); }

.dropdown-user {
    padding: .6rem .75rem;
    margin-bottom: .25rem;
    border-bottom: 1px solid var(--sp-border);
}

.dropdown-user .navbar-user-name { max-width: 12rem; font-weight: 600; font-size: .875rem; }

/* Di bawah lg, judul panjang di navbar putih mengulang brand bar mobile di
   atasnya dan memakan dua baris — sembunyikan, sisakan avatar + dropdown. */
@media (max-width: 991.98px) {
    .navbar-dashboard .sidebar-text { display: none; }
    .navbar-dashboard { justify-content: flex-end; }
    /* nama user menggantikan judul, jadi bar-nya tidak kosong */
    .navbar-dashboard .navbar-user-name { max-width: 11rem; }
}

@media (max-width: 575.98px) {
    .navbar-dashboard { padding-top: .35rem !important; padding-bottom: .35rem !important; }
    .navbar-dashboard .avatar { width: 2.5rem !important; height: 2.5rem !important; }
    .navbar-dashboard .navbar-user-name { max-width: 9.5rem; font-size: .82rem; }
}

/* =====================================================================
   Tabel data + simple-datatables
   ===================================================================== */

/* Scroll horizontal dipindah ke .dataTable-container supaya kotak pencarian,
   pemilih jumlah baris, dan pagination tetap di tempat saat tabel digeser.
   Efek sampingnya .table-responsive tidak lagi perlu menggeser apa pun. */
.dataTable-wrapper .dataTable-container {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/* Bayangan penanda "masih ada kolom di samping". Lapisan putih memakai
   background-attachment:local sehingga ikut tergeser dan menutup bayangan
   begitu sampai di ujung — jadi petunjuknya hilang sendiri saat tidak relevan.
   Cara ini hanya dipakai untuk tabel biasa: latar barisnya transparan
   sehingga bayangan di belakang tabel masih tembus terlihat. */
.table-responsive {
    background-image:
        linear-gradient(to right, var(--sp-surface) 30%, rgba(255, 255, 255, 0)),
        linear-gradient(to left,  var(--sp-surface) 30%, rgba(255, 255, 255, 0)),
        linear-gradient(to right, rgba(10, 31, 68, .14), rgba(10, 31, 68, 0)),
        linear-gradient(to left,  rgba(10, 31, 68, .14), rgba(10, 31, 68, 0));
    background-position: 0 0, 100% 0, 0 0, 100% 0;
    background-repeat: no-repeat;
    background-size: 44px 100%, 44px 100%, 15px 100%, 15px 100%;
    background-attachment: local, local, scroll, scroll;
}

/* Tabel data punya baris berwarna yang menutup bayangan latar, jadi
   petunjuknya dipasang sebagai overlay di pembungkus yang tidak ikut
   tergeser. Kelas ada-geser-* di-toggle oleh sipema.js sesuai posisi scroll,
   supaya bayangan tidak muncul saat tabelnya memang sudah muat. */
.dataTable-wrapper { position: relative; }

.dataTable-wrapper::before,
.dataTable-wrapper::after {
    content: "";
    position: absolute;
    top: var(--tabel-atas, 0);
    height: var(--tabel-tinggi, 100%);
    width: 2rem;
    pointer-events: none;
    opacity: 0;
    transition: opacity .2s ease;
    z-index: 3;
}

.dataTable-wrapper::before {
    left: 0;
    background: linear-gradient(to right, rgba(10, 31, 68, .16), rgba(10, 31, 68, 0));
}

.dataTable-wrapper::after {
    right: 0;
    background: linear-gradient(to left, rgba(10, 31, 68, .16), rgba(10, 31, 68, 0));
}

.dataTable-wrapper.ada-geser-kiri::before,
.dataTable-wrapper.ada-geser-kanan::after { opacity: 1; }

/* Warna baris berstatus: versi lebih lembut dan selaras dengan tema,
   dengan garis kiri sebagai penanda supaya tetap terbaca bagi yang
   kesulitan membedakan warna. */
.table > :not(caption) > tr.table-success > *,
.table > :not(caption) > * > tr.table-success > * { --bs-table-bg: #E8F6EF; }
.table > :not(caption) > tr.table-warning > *,
.table > :not(caption) > * > tr.table-warning > * { --bs-table-bg: #FDF3E2; }
.table > :not(caption) > tr.table-danger > *,
.table > :not(caption) > * > tr.table-danger > * { --bs-table-bg: #FCEDEF; }

.table tr.table-success > td:first-child { box-shadow: inset .25rem 0 0 var(--sp-success); }
.table tr.table-warning > td:first-child { box-shadow: inset .25rem 0 0 var(--sp-warning); }
.table tr.table-danger  > td:first-child { box-shadow: inset .25rem 0 0 var(--sp-danger); }

/* Baris berstatus tetap terbaca saat di-hover */
.table-hover > tbody > tr.table-success:hover > * { --bs-table-accent-bg: #DCF0E5; }
.table-hover > tbody > tr.table-warning:hover > * { --bs-table-accent-bg: #F8EAD2; }
.table-hover > tbody > tr.table-danger:hover  > * { --bs-table-accent-bg: #F8E0E4; }

/* --- Kontrol datatables --- */

.dataTable-top,
.dataTable-bottom {
    align-items: center;
    gap: .75rem;
    color: var(--sp-text-soft);
    font-size: .875rem;
}

.dataTable-top { padding: 0 1.5rem 1rem; }
.dataTable-bottom { padding: 1.25rem 1.5rem 0; }

.dataTable-selector {
    border: 1px solid #D8E2EF;
    border-radius: var(--sp-radius-sm);
    color: var(--sp-text);
    padding: .45rem 2rem .45rem .85rem;
}

.dataTable-selector:focus {
    border-color: var(--sp-blue-500);
    box-shadow: var(--sp-ring);
    outline: 0;
}

.dataTable-input {
    border: 1px solid #D8E2EF;
    border-radius: var(--sp-radius-sm);
    color: var(--sp-text);
    padding: .45rem .85rem;
    min-width: 15rem;
}

.dataTable-input:focus {
    border-color: var(--sp-blue-500);
    box-shadow: var(--sp-ring);
    outline: 0;
}

.dataTable-input::placeholder { color: var(--sp-muted); }

.dataTable-info { color: var(--sp-text-soft); }

.dataTable-pagination a {
    color: var(--sp-blue-600);
    border-color: var(--sp-border);
    background-color: #fff;
}

.dataTable-pagination a:hover {
    background-color: var(--sp-blue-50);
    color: var(--sp-blue-700);
}

.dataTable-pagination > li.active a {
    background-color: var(--sp-blue-600);
    border-color: var(--sp-blue-600);
    color: #fff;
}

.dataTable-pagination > li.disabled a { color: var(--sp-muted); background-color: #F7FAFE; }

/* Kolom yang bisa diurutkan */
.dataTable-sorter { color: inherit; }

/* --- Penyesuaian layar kecil --- */

@media (max-width: 767.98px) {
    .dataTable-top,
    .dataTable-bottom { align-items: stretch; padding-left: 1rem; padding-right: 1rem; }

    /* Volt sudah menumpuk kedua baris ini; lebarkan isinya supaya tidak
       tampak menggantung di kiri. */
    .dataTable-top .dataTable-dropdown,
    .dataTable-top .dataTable-search { width: 100%; }
    .dataTable-top .dataTable-search { margin-top: .75rem; }
    .dataTable-input { width: 100%; min-width: 0; }

    .dataTable-bottom .dataTable-info { margin-bottom: .75rem; text-align: center; }
    .dataTable-pagination { justify-content: center; flex-wrap: wrap; row-gap: .35rem; }

    .table td, .table th { padding: .7rem .75rem; }
}

/* =====================================================================
   Daftar info ringkas — pengganti tabel dua kolom yang tidak muat di ponsel
   ===================================================================== */

.sipema-info-list {
    margin: 0;
    border: 1px solid var(--sp-border);
    border-radius: var(--sp-radius);
    overflow: hidden;
    background: #FBFDFF;
}

.sipema-info-list .info-row {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: .85rem 1.1rem;
}

.sipema-info-list .info-row + .info-row { border-top: 1px solid var(--sp-border); }

.sipema-info-list dt {
    flex: 0 0 16rem;
    font-weight: 600;
    color: var(--sp-text-soft);
    font-size: .875rem;
    margin: 0;
}

.sipema-info-list dd {
    margin: 0;
    color: var(--sp-text);
    font-weight: 500;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
}

@media (max-width: 767.98px) {
    .sipema-info-list .info-row { flex-direction: column; align-items: flex-start; gap: .35rem; }
    .sipema-info-list dt { flex: 1 1 auto; font-size: .78rem; text-transform: uppercase; letter-spacing: .04em; }
}

/* Tombol aksi di kepala halaman: penuh di ponsel supaya mudah disentuh */
@media (max-width: 575.98px) {
    .sipema-page-actions { width: 100%; }
    .sipema-page-actions > div { width: 100%; }
    .sipema-page-actions .btn { width: 100%; }
}

/* =====================================================================
   Halaman profil (data dosen pribadi)
   ===================================================================== */

.sipema-profil-head {
    position: relative;
    display: flex;
    align-items: center;
    gap: 1.5rem;
    padding: 1.75rem 1.9rem;
    border-radius: var(--sp-radius);
    color: #E6EEFB;
    background:
        radial-gradient(620px 340px at 92% -20%, rgba(96, 165, 250, .32) 0%, transparent 62%),
        linear-gradient(120deg, var(--sp-navy-900) 0%, var(--sp-navy-700) 62%, var(--sp-blue-700) 100%);
    box-shadow: var(--sp-shadow-md);
    overflow: hidden;
}

.sipema-profil-head::after {
    content: "";
    position: absolute;
    right: -4rem; bottom: -7rem;
    width: 16rem; height: 16rem;
    border-radius: 50%;
    border: 1.25rem solid rgba(255, 255, 255, .05);
    pointer-events: none;
}

.sipema-profil-head > * { position: relative; z-index: 1; }

.sipema-profil-head .profil-foto {
    flex: 0 0 auto;
    width: 6rem; height: 6rem;
    border-radius: 50%;
    object-fit: cover;
    background: #fff;
    border: 3px solid rgba(255, 255, 255, .3);
    box-shadow: 0 12px 28px rgba(3, 12, 30, .38);
}

.sipema-profil-head .profil-teks { min-width: 0; }

.sipema-profil-head .profil-label {
    font-size: .78rem;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: #93C0FF;
    font-weight: 600;
    margin-bottom: .3rem;
}

.sipema-profil-head .profil-nama {
    font-size: 1.5rem;
    font-weight: 700;
    color: #fff;
    letter-spacing: -.02em;
    line-height: 1.25;
    margin-bottom: .85rem;
}

.sipema-profil-head .profil-chips { display: flex; flex-wrap: wrap; gap: .5rem; }

.sipema-profil-head .profil-chip {
    background: rgba(255, 255, 255, .12);
    border: 1px solid rgba(255, 255, 255, .18);
    color: #E6EEFB;
    border-radius: 999px;
    padding: .28rem .8rem;
    font-size: .78rem;
    font-weight: 600;
}

.sipema-profil-head .profil-chip-kode {
    font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
    letter-spacing: .04em;
}

/* --- Daftar field --- */

.sipema-section-title {
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sp-blue-600);
    /* Jarak atas menggantikan <hr> pemisah antar bagian; judulnya sudah
       membawa garis bawah sendiri, jadi <hr> hanya jadi garis ganda. */
    margin: 1.75rem 0 .9rem;
    padding-bottom: .55rem;
    border-bottom: 1px solid var(--sp-border);
}

/* Bagian pertama di dalam sebuah kartu/modal tidak perlu jarak atas lagi. */
.card-body > .sipema-section-title:first-child,
.modal-body > .sipema-section-title:first-child { margin-top: 0; }

.sipema-subsection-title {
    font-size: .82rem;
    font-weight: 600;
    color: var(--sp-text-soft);
    margin: 1.1rem 0 .75rem;
}

/* Textarea surat pernyataan: teks panjang, dibuat rata kanan-kiri dan tetap
   putih walaupun readonly (nilainya memang bukan untuk diubah, bukan nonaktif). */
.textarea-pernyataan {
    text-align: justify;
    background-color: #fff !important;
    line-height: 1.6;
    font-size: .875rem;
}

/* auto-fit membuat jumlah kolom menyesuaikan lebar sendiri: dua kolom di
   layar lebar, satu kolom begitu ruangnya di bawah ±17rem. */
.sipema-field-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr));
    gap: .35rem 1.75rem;
    margin: 0;
}

.sipema-field-grid .field {
    padding: .7rem 0;
    border-bottom: 1px solid #F0F5FB;
    min-width: 0;
}

.sipema-field-grid .field-lebar { grid-column: 1 / -1; }

.sipema-field-grid dt {
    font-size: .74rem;
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--sp-muted);
    margin-bottom: .2rem;
}

.sipema-field-grid dd {
    margin: 0;
    color: var(--sp-text);
    font-weight: 500;
    overflow-wrap: anywhere;
}

.sipema-field-grid .field-kosong { color: var(--sp-muted); font-weight: 400; }

.sipema-field-catatan {
    margin: 1.75rem 0 0;
    padding-top: 1rem;
    border-top: 1px solid var(--sp-border);
    font-size: .82rem;
    color: var(--sp-text-soft);
}

@media (max-width: 575.98px) {
    .sipema-profil-head {
        flex-direction: column;
        align-items: flex-start;
        gap: 1rem;
        padding: 1.35rem 1.25rem;
    }
    .sipema-profil-head .profil-foto { width: 4.5rem; height: 4.5rem; }
    .sipema-profil-head .profil-nama { font-size: 1.2rem; }
}

/* =====================================================================
   Kepala halaman (judul + status + aksi utama)
   ===================================================================== */

.sipema-page-head {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1.5rem;
    padding: 1.6rem 1.9rem;
    border-radius: var(--sp-radius);
    color: #E6EEFB;
    background:
        radial-gradient(640px 340px at 92% -20%, rgba(96, 165, 250, .32) 0%, transparent 62%),
        linear-gradient(120deg, var(--sp-navy-900) 0%, var(--sp-navy-700) 62%, var(--sp-blue-700) 100%);
    box-shadow: var(--sp-shadow-md);
    overflow: hidden;
}

.sipema-page-head::after {
    content: "";
    position: absolute;
    right: -4rem; top: -6rem;
    width: 15rem; height: 15rem;
    border-radius: 50%;
    border: 1.25rem solid rgba(255, 255, 255, .05);
    pointer-events: none;
}

.sipema-page-head > * { position: relative; z-index: 1; }

.sipema-page-head .page-head-label {
    font-size: .78rem;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: #93C0FF;
    font-weight: 600;
    margin-bottom: .3rem;
}

.sipema-page-head .page-head-judul {
    font-size: 1.45rem;
    font-weight: 700;
    color: #fff;
    letter-spacing: -.02em;
    line-height: 1.25;
    margin-bottom: .85rem;
}

.sipema-page-head .page-head-chips { display: flex; flex-wrap: wrap; gap: .5rem; }

.sipema-page-head .page-head-chip {
    background: rgba(255, 255, 255, .12);
    border: 1px solid rgba(255, 255, 255, .18);
    color: #E6EEFB;
    border-radius: 999px;
    padding: .28rem .8rem;
    font-size: .78rem;
    font-weight: 600;
}

.sipema-page-head .chip-eligible {
    background: rgba(15, 157, 88, .28);
    border-color: rgba(15, 157, 88, .5);
    color: #C7F0DC;
}

.sipema-page-head .chip-tidak-eligible {
    background: rgba(220, 53, 69, .28);
    border-color: rgba(220, 53, 69, .5);
    color: #FBD3D8;
}

.sipema-page-head .page-head-aksi {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    flex: 0 0 auto;
}

/* Tombol garis-luar di atas latar gelap kepala halaman */
.btn-outline-terang {
    background: transparent;
    border: 1px solid rgba(255, 255, 255, .38);
    color: #E6EEFB;
}

.btn-outline-terang:hover,
.btn-outline-terang:focus {
    background: rgba(255, 255, 255, .12);
    border-color: rgba(255, 255, 255, .55);
    color: #fff;
}

@media (max-width: 767.98px) {
    .sipema-page-head {
        flex-direction: column;
        align-items: stretch;
        gap: 1.1rem;
        padding: 1.35rem 1.25rem;
    }
    .sipema-page-head .page-head-judul { font-size: 1.2rem; }
    .sipema-page-head .page-head-aksi .btn { flex: 1 1 100%; }
}

/* =====================================================================
   Legenda warna baris tabel
   ===================================================================== */

.sipema-legenda {
    display: flex;
    flex-wrap: wrap;
    gap: .25rem 1rem;
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: .78rem;
    color: var(--sp-text-soft);
}

.sipema-legenda li { display: inline-flex; align-items: center; gap: .4rem; }

.sipema-legenda .tanda {
    width: .7rem; height: .7rem;
    border-radius: .2rem;
    display: inline-block;
}

.sipema-legenda .tanda-success { background: var(--sp-success); }
.sipema-legenda .tanda-warning { background: var(--sp-warning); }
.sipema-legenda .tanda-danger  { background: var(--sp-danger); }

/* =====================================================================
   Kolom teks panjang di dalam tabel

   Sebelumnya dipatok `style="width: 20rem"` sehingga kolomnya kaku dan ikut
   melebarkan tabel di layar sempit. min/max-width membuatnya masih bisa
   menyusut di ponsel tapi tetap membungkus rapi di layar lebar.
   ===================================================================== */

.kolom-judul, .kolom-skema, .kolom-orang, .kolom-mitra {
    white-space: normal;
    overflow-wrap: anywhere;
}

.kolom-judul { min-width: 12rem; max-width: 22rem; }
.kolom-skema { min-width: 7rem;  max-width: 11rem; }

/* Kelas-kelas di atas biasanya dipasang pada <div> di dalam sel. Bila dipasang
   langsung pada <td>, `white-space: normal`-nya (0,1,0) kalah dari aturan Volt
   `.table td, .table th { white-space: nowrap }` (0,1,1): sel tetap tidak boleh
   turun baris, isinya melewati batas max-width, dan teksnya menumpuk ke kolom
   sebelahnya. Varian ber-`.table td` ini (0,2,1) yang membuatnya berlaku. */
.table td.kolom-judul,
.table td.kolom-skema,
.table td.kolom-orang,
.table td.kolom-mitra {
    white-space: normal;
    overflow-wrap: anywhere;
}

/* Tabel Tel-U Point: tujuh sampai delapan kolom yang isinya teks semua.
   Judul kolom seperti "Kelengkapan Laporan Akhir/Kemajuan" tetap nowrap dari
   Volt dan memakan 328px, sehingga kolom Nama dan Kegiatan tersisa selebar
   min-width-nya saja dan isinya pecah jadi lima baris. Judul kolom dibolehkan
   turun baris, lalu kolom teksnya diberi ruang minimum yang lebih masuk akal. */
.table.tabel-tup th { white-space: normal; }
.table.tabel-tup th.sel-nomor { white-space: nowrap; }
.table.tabel-tup td.kolom-orang { min-width: 11rem; }
.table.tabel-tup td.kolom-judul { min-width: 15rem; }
.table.tabel-tup td.kolom-mitra { min-width: 10rem; }
.table.tabel-tup td.kolom-skema { min-width: 9rem; }
/* Nama & NIP kini bertumpuk dua baris, jadi tak perlu selebar dulu. */
.kolom-orang { min-width: 8rem;  max-width: 12rem; }

@media (max-width: 575.98px) {
    .kolom-judul { min-width: 11rem; }
    .kolom-skema { min-width: 6rem; }
    .kolom-orang { min-width: 8rem; }
}

.sipema-tanpa-data { color: var(--sp-muted); font-style: italic; }

/* =====================================================================
   Formulir panjang — ukuran & irama field

   Volt memakai label seukuran teks isian, jadi pada form dengan puluhan
   field label dan nilai jadi sulit dibedakan sekilas. Label dibuat lebih
   kecil dan agak tebal supaya hierarkinya jelas tanpa perlu huruf kapital.
   ===================================================================== */

.form-label {
    font-size: .82rem;
    font-weight: 600;
    color: var(--sp-text-soft);
    margin-bottom: .35rem;
}

/* Tinggi kontrol seragam supaya select dan input sebaris rata */
.form-control,
.form-select {
    min-height: 2.75rem;
    padding: .55rem .9rem;
    font-size: .9rem;
}

textarea.form-control { min-height: 0; line-height: 1.6; }

.form-check-label { font-weight: 500; color: var(--sp-text); }

/* Field wajib diberi penanda agar terlihat sebelum submit ditolak */
.form-label:has(+ * [required]),
.form-label:has(+ [required]) { position: relative; }

.form-label:has(+ [required])::after,
.form-label:has(+ .input-group [required])::after {
    content: "*";
    color: var(--sp-danger);
    margin-left: .2rem;
    font-weight: 700;
}

/* Tombol "tambah baris" pada daftar anggota tim / mahasiswa.
   Sebelumnya hanya ikon telanjang tanpa nama, mudah terlewat. */
.btn-tambah-baris {
    color: var(--sp-blue-600);
    border-radius: var(--sp-radius-sm);
    padding: .3rem .35rem;
    line-height: 1;
    transition: background-color .18s ease, color .18s ease;
}

.btn-tambah-baris:hover {
    background-color: var(--sp-blue-50);
    color: var(--sp-blue-700);
}

.btn-tambah-baris svg { margin-right: 0 !important; }

/* Di ponsel ikon 31x30px terlalu kecil untuk disentuh; naikkan ke 44px,
   ukuran target sentuh yang sama dengan .btn-ikon di halaman detail. */
@media (max-width: 767.98px) {
    .btn-tambah-baris {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        min-width: 2.75rem;
        min-height: 2.75rem;
    }
}

/* Daftar isian bertumpuk (anggota tim, mahasiswa): rapatkan jaraknya
   supaya terbaca sebagai satu kelompok, bukan field-field terpisah. */
.form-control.no-border + datalist + .btn-tambah-baris { margin-left: .25rem; }

/* Jarak antar isian anggota. Dulu ditulis inline sebagai
   `style="margin-bottom: 10px"` di 23 tempat, bercampur dengan nilai
   `display` yang dipakai JS untuk memunculkan baris berikutnya —
   marginnya dipisah ke sini supaya yang inline tinggal `display` saja. */
.field-anggota { margin-bottom: .625rem; }

/* Ketua tim terisi otomatis dan dikunci. Tanpa ini Bootstrap memberi latar
   abu-abu yang membuatnya terbaca seperti field rusak, bukan field terkunci. */
.field-terkunci:disabled,
.field-terkunci[readonly] {
    background-color: #fff;
    color: var(--sp-text);
    opacity: 1;
}

@media (max-width: 575.98px) {
    .form-control, .form-select { min-height: 2.9rem; font-size: .95rem; }
}

/* =====================================================================
   Isi sel tabel bertingkat — nilai utama + keterangan kecil di bawahnya
   ===================================================================== */

.sel-utama {
    display: block;
    font-weight: 600;
    color: var(--sp-navy-900);
    font-size: .875rem;
    line-height: 1.35;
}

.sel-sub {
    display: block;
    font-size: .74rem;
    color: var(--sp-muted);
    font-weight: 400;
    margin-top: .1rem;
}

.sel-nomor {
    width: 2.5rem;
    padding-left: .6rem !important;
    padding-right: .6rem !important;
    color: var(--sp-muted);
    font-variant-numeric: tabular-nums;
    text-align: center;
}

.sel-periode { white-space: nowrap; }

.sel-aksi { width: 1%; white-space: nowrap; }

/* Skema sebagai pil lembut, bukan blok teks selebar kolom */
.badge-skema {
    display: inline-block;
    background: var(--sp-blue-50);
    border: 1px solid var(--sp-blue-100);
    color: var(--sp-navy-800);
    border-radius: 999px;
    padding: .25rem .7rem;
    font-size: .74rem;
    font-weight: 600;
    line-height: 1.4;
    white-space: normal;
    max-width: 10rem;
    line-height: 1.35;
}

/* Nama skema seperti "Non-Hibah Mandiri" punya tanda hubung yang jadi titik
   putus, sehingga min-content kolomnya kecil dan pil-nya pecah sampai tiga
   baris meski tabel masih punya ruang. Lebar kolom diberi petunjuk persen:
   `min-width` pada pil-nya tidak dipakai karena itu menaikkan min-content
   tabel sampai meluber keluar kartu. */
#datatable th.sel-skema { width: 15%; }

/* =====================================================================
   Badge "halus" — latar tipis + teks pekat.

   Di dalam baris yang sudah berwarna status, pil warna penuh terasa ramai;
   versi ini tetap jelas terbaca tanpa saling berebut perhatian.
   ===================================================================== */

.badge-halus {
    display: inline-block;
    border: 1px solid transparent;
    border-radius: 999px;
    padding: .18rem .6rem;
    font-size: .72rem;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
}

.badge-halus-success { background: #E4F5EC; border-color: #B7E3CC; color: #0A6C3D; }
.badge-halus-warning { background: #FCF2DF; border-color: #F1DCB5; color: #855312; }
.badge-halus-danger  { background: #FBE9EC; border-color: #F3C9D0; color: #96182A; }
.badge-halus-info    { background: var(--sp-blue-50); border-color: var(--sp-blue-100); color: var(--sp-blue-700); }

/* --- Daftar status di dalam sel --- */

.daftar-status {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    gap: .3rem;
}

.daftar-status li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .6rem;
}

.daftar-status .status-nama {
    font-size: .72rem;
    color: var(--sp-text-soft);
    white-space: nowrap;
}

/* --- Tombol aksi di baris tabel --- */

.btn-detail {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: .32rem .7rem;
    font-size: .78rem;
    font-weight: 600;
    white-space: nowrap;
}

.btn-detail svg { width: .95rem; height: .95rem; flex: 0 0 auto; }

/* Di layar sempit teksnya disembunyikan; ikonnya tetap jadi sasaran sentuh
   yang cukup besar. */
@media (max-width: 767.98px) {
    /* Teks disembunyikan (tetap terbaca pembaca layar), tapi ukuran tombolnya
       dijaga >= 2.75rem supaya masih nyaman disentuh. */
    .btn-detail span { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
    .btn-detail {
        padding: 0;
        width: 2.75rem;
        height: 2.75rem;
        justify-content: center;
    }
    .btn-detail svg { width: 1.15rem; height: 1.15rem; }
    .daftar-status li { justify-content: flex-start; }
}

/* =====================================================================
   Tabel detail (label | nilai | aksi) — halaman data kegiatan

   Tabel ini bukan daftar data, melainkan rincian satu kegiatan. Jadi
   ditampilkan seperti daftar rincian: label redup, nilai menonjol, dan
   kolom aksi merapat ke kanan.
   ===================================================================== */

.tabel-detail { margin-bottom: 0; }

.tabel-detail > tbody > tr > td {
    border-bottom: 1px solid #F0F5FB;
    vertical-align: top;
    padding: .8rem .9rem;
    /* Volt memasang `white-space: nowrap` pada semua sel tabel. Pada tabel
       rincian seperti ini akibatnya setiap kolom selebar teks terpanjangnya
       dan tabel meluber keluar kartu. Rincian justru harus boleh turun baris. */
    white-space: normal;
}

.tabel-detail > tbody > tr:last-child > td { border-bottom: 0; }

/* Kolom pertama = label */
.tabel-detail > tbody > tr > td:first-child {
    color: var(--sp-text-soft);
    font-weight: 500;
    width: 12rem;
    min-width: 8rem;
    /* Sebagian label panjang (mis. "Artikel Media Massa & Video Kegiatan")
       memaksa kolom melebar jauh di atas 12rem karena `width` pada tabel
       hanya bersifat anjuran; izinkan pemenggalan agar tetap terkendali. */
    overflow-wrap: anywhere;
}

/* Tabel komponen verifikasi ikut memakai `.tabel-detail` demi padding dan
   pembungkusan barisnya, padahal kolom pertamanya nomor urut, bukan label.
   Lebar label 12rem membuat kolom "#" melar sampai 192px, sementara
   `.sel-nomor` polos (0,1,0) kalah dari aturan di atas (0,3,1). */
.tabel-detail > tbody > tr > td:first-child.sel-nomor {
    width: 2.5rem;
    min-width: 0;
    font-weight: 400;
    color: var(--sp-muted);
}

/* Kolom aksi = sel ke-3 yang sekaligus sel terakhir. Memakai :last-child saja
   akan salah sasaran: baris yang nilainya memakai colspan="2" juga berakhir
   sebagai sel terakhir dan teksnya jadi ikut terdorong ke kanan. */
.tabel-detail > tbody > tr > td:nth-child(3):last-child {
    width: 1%;
    text-align: right;
}

/* Isi kolom aksi (ikon + badge status) dibiarkan turun baris bila sempit;
   dipaksa nowrap membuat badge panjang seperti "BELUM UNGGAH" melebarkan
   tabel sampai terpotong. */
.tabel-detail > tbody > tr > td:nth-child(3):last-child > * { vertical-align: middle; }

.sel-label { color: var(--sp-text-soft); font-weight: 500; }

/* Tabel Proses Evaluasi: labelnya panjang ("Rencana Anggaran Biaya",
   "Anggaran yang Disetujui") dan pada 12rem hampir semuanya pecah dua baris,
   jadi kolom pertamanya diberi ruang lebih. */
.tabel-evaluasi > tbody > tr > td:first-child { width: 16rem; }

/* Ikon aksi dirapatkan ke kanan mengikuti kolomnya */
.tabel-detail > tbody > tr > td:nth-child(3):last-child .d-flex {
    justify-content: flex-end;
    gap: .15rem;
}

/* Sebagian ikon aksi berupa <a> dengan <span> pembungkus di dalamnya;
   netralkan supaya ukurannya sama dengan tombol. */
.btn-ikon > span { display: inline-flex !important; align-items: center; }
.btn-ikon:hover { text-decoration: none; }

.tabel-detail .sel-nilai,
/* Satu sel bisa memuat beberapa .sel-nilai berturut-turut (daftar anggota
   dosen/mahasiswa). Tanpa jarak, nama orang kedua menempel pada NIP orang
   pertama dan daftarnya terbaca sebagai satu blok. */
.tabel-detail .sel-nilai + .sel-nilai { margin-top: .5rem; }

.sel-nilai {
    white-space: normal;
    /* break-word, bukan anywhere: `anywhere` memenggal kata di tengah
       ("Marketplac / e") begitu kolomnya menyempit. */
    overflow-wrap: break-word;
    max-width: 34rem;
    color: var(--sp-text);
}

/* Baris judul bagian di dalam tabel detail.

   Selektornya harus selengkap ini: `.baris-bagian` sendiri (0,1,0) kalah dari
   `.table > :not(caption) > * > *` milik Bootstrap yang menyetel
   background-color, dari `.table td` milik Volt yang menyetel font-size, dan
   dari aturan kolom label di atas yang menyetel font-weight. */
.tabel-detail > tbody > tr > td.baris-bagian {
    background-color: var(--sp-blue-50);
    color: var(--sp-blue-700);
    font-size: .76rem;
    font-weight: 700;
    letter-spacing: .09em;
    text-transform: uppercase;
    border-bottom: 1px solid var(--sp-blue-100);
    /* jangan ikut aturan kolom label / kolom aksi */
    width: auto;
    text-align: left;
    white-space: normal;
}

/* Judul bagian yang punya tombol aksi (mis. "Identitas Tim Pengusul") memakai
   dua sel: teks colspan=2 + sel tombol. Keduanya diberi .baris-bagian supaya
   latar pitanya menyambung, dan sel tombolnya dirapatkan ke kanan. */
.tabel-detail > tbody > tr > td.baris-bagian:last-child:not(:first-child) {
    width: 1%;
    text-align: right;
}

.baris-bagian .btn-ikon:hover { background-color: #fff; }

/* =====================================================================
   Tombol ikon dalam tabel (ubah / simpan / batal)
   Sebelumnya hanya SVG telanjang tanpa nama maupun umpan balik.
   ===================================================================== */

.btn-ikon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    padding: 0;
    /* Tanpa ini tombol ikon yang tidak memakai .coffeeButton tetap membawa
       bingkai dan latar bawaan browser. */
    border: 0;
    background-color: transparent;
    cursor: pointer;
    border-radius: var(--sp-radius-sm);
    color: var(--sp-blue-600);
    transition: background-color .18s ease, color .18s ease;
}

.btn-ikon:hover { background-color: var(--sp-blue-50); color: var(--sp-blue-700); }

.btn-ikon svg { width: 1rem; height: 1rem; margin: 0 !important; }

/* Tombol batal/hapus diberi warna berbeda supaya tidak tertukar */
.btn-ikon[aria-label="Batal"], .btn-ikon[aria-label="Hapus"] { color: var(--sp-danger); }
.btn-ikon[aria-label="Batal"]:hover, .btn-ikon[aria-label="Hapus"]:hover { background-color: #FBE9EC; color: #96182A; }

@media (max-width: 767.98px) {
    .btn-ikon { width: 2.5rem; height: 2.5rem; }

    /* Tiga kolom tidak muat di ponsel; tumpuk jadi label -> nilai -> aksi.
       Hanya <td> dan <tr> yang diubah jadi block, sementara jQuery pada
       halaman ini hanya menyetel `display` pada <tr> tertentu untuk
       membuka/menutup form edit — perilaku itu tetap berjalan. */
    .tabel-detail > tbody > tr {
        display: block;
        border-bottom: 1px solid var(--sp-border);
        padding: .35rem 0;
    }

    .tabel-detail > tbody > tr > td {
        display: block;
        width: auto;
        border-bottom: 0;
        padding: .2rem .75rem;
        white-space: normal;
    }

    .tabel-detail > tbody > tr > td:first-child {
        width: auto;
        min-width: 0;
        font-size: .72rem;
        font-weight: 600;
        letter-spacing: .05em;
        text-transform: uppercase;
        color: var(--sp-muted);
    }

    .tabel-detail > tbody > tr > td:nth-child(3):last-child {
        width: auto;
        text-align: left;
        padding-top: .45rem;
    }

    .tabel-detail > tbody > tr > td.baris-bagian { padding: .55rem .75rem; }

    /* Judul bagian yang punya tombol aksi: karena sel-selnya ditumpuk, pitanya
       akan terbelah dua (judul, lalu kotak biru berisi tombol saja). Baris pita
       dikembalikan jadi satu baris. Browser tanpa dukungan :has() tetap
       mendapat tata letak lama yang masih terbaca, hanya kurang rapi. */
    .tabel-detail > tbody > tr:has(> td.baris-bagian) {
        display: flex;
        /* stretch, bukan center: kalau tinggi kedua sel berbeda, latar pitanya
           bertingkat dan menyisakan notch di salah satu sisi. */
        align-items: stretch;
        justify-content: space-between;
        padding: 0;
        border-bottom: 0;
    }

    .tabel-detail > tbody > tr:has(> td.baris-bagian) > td.baris-bagian {
        display: flex;
        align-items: center;
    }

    .tabel-detail > tbody > tr:has(> td.baris-bagian) > td.baris-bagian:first-child { flex: 1 1 auto; }

    .tabel-detail > tbody > tr > td.baris-bagian:last-child:not(:first-child) {
        flex: 0 0 auto;
        /* width:1% dari aturan desktop harus dibatalkan: sebagai flex item,
           basis 1% membuat sel menyusut sampai tombolnya meluber. */
        width: auto;
        justify-content: flex-end;
        text-align: right;
    }

    .tabel-detail .sel-nilai { max-width: 100%; }
}

/* =====================================================================
   Jaring pengaman lebar kontrol

   Banyak field lama dipatok `style="width: NNrem"` inline. max-width tidak
   bisa dikalahkan oleh width inline, jadi satu aturan ini membuat semuanya
   ikut menyusut di layar sempit tanpa perlu menyentuh puluhan atribut.
   ===================================================================== */

.form-control,
.form-select,
textarea.form-control { max-width: 100%; }

/* =====================================================================
   Daftar tautan luaran di dalam sel tabel

   Volt memasang `.p, ol li, p, ul li { font-size: 1rem }`, jadi ukuran yang
   diset pada <ul> selalu ditimpa dan tiap <li> kembali 16px - lebih besar dari
   teks tabel di sekitarnya (14px). Karena itu ukurannya harus dinyatakan pada
   <li>-nya sendiri, bukan cukup di induknya.
   ===================================================================== */

.daftar-tautan {
    list-style: none;
    margin: .45rem 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: .3rem;
}

.daftar-tautan li { font-size: .8rem; line-height: 1.3; }

/* Tautan tampil sebagai pil dengan ikon jenis di depan dan penanda
   "membuka tab baru" di belakang - lebih mudah dikenali daripada teks
   bergaris bawah, dan tidak lagi menyerupai judul karena ukurannya. */
.pil-tautan {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: .25rem .6rem;
    border: 1px solid var(--sp-blue-100);
    border-radius: 999px;
    background: var(--sp-blue-50);
    color: var(--sp-blue-700);
    font-size: .78rem;
    font-weight: 600;
    text-decoration: none;
    white-space: nowrap;
    transition: background-color .18s ease, border-color .18s ease, color .18s ease;
}

.pil-tautan:hover,
.pil-tautan:focus {
    background: var(--sp-blue-600);
    border-color: var(--sp-blue-600);
    color: #fff;
    text-decoration: none;
}

.pil-tautan .ikon-jenis { width: .95rem; height: .95rem; flex: 0 0 auto; }

.pil-tautan .ikon-keluar {
    width: .7rem; height: .7rem;
    flex: 0 0 auto;
    opacity: .6;
}

.pil-tautan:hover .ikon-keluar { opacity: 1; }

/* Aturan `ul li` milik Volt juga menimpa ukuran pada dua daftar lain ini. */
.sipema-legenda li { font-size: .78rem; }
.daftar-status li { font-size: .78rem; }

/* =====================================================================
   Sel status: badge + tombol ikon dalam satu kolom

   Bagian Proses Evaluasi kini dua kolom saja (label | status+aksi), sama
   seperti baris-baris lain di tabel yang sama yang sejak awal memakai
   colspan="2".
   ===================================================================== */

.sel-status {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .4rem .55rem;
}

/* Rangkaian ikon di dalamnya tetap rapat sebagai satu kelompok */
.sel-status .d-flex { gap: .15rem; }

@media (max-width: 767.98px) {
    .sel-status { gap: .35rem .45rem; }
}

/* =====================================================================
   Baris field berbasis flex (halaman pengajuan Desa Binaan)

   Halaman itu menata field dengan `d-flex` tanpa flex-wrap dan jarak antar
   field memakai `margin-right` inline, sementara lebar field dipatok 27rem.
   Akibatnya di layar sempit field-nya keluar dari kartu. Dibuat boleh turun
   baris dan jaraknya diserahkan ke gap.
   ===================================================================== */

.sipema-baris-field {
    flex-wrap: wrap;
    gap: 0 1rem;
    width: 100%;
}

.sipema-baris-field > * { min-width: 0; }

/* Lebar field diseragamkan lewat basis flex, bukan lewat `style="width: NNrem"`
   per field (halaman ini punya 34 di antaranya dengan 6 nilai berbeda, sehingga
   tiap barisnya tampak tidak rata).

   Basis 13rem dipilih supaya baris berisi tiga field (Provinsi/Kota/Kecamatan)
   tetap muat sebaris — dengan basis lebih besar field ketiga terlempar ke baris
   berikutnya dan susunannya jadi 2+1. Field boleh melebar mengisi sisa baris,
   tapi dibatasi 30rem agar satu field sendirian tidak selebar kartu. */
.sipema-baris-field > .mb-4,
.sipema-baris-field > div {
    flex: 1 1 13rem;
}

/* Batasnya dikenakan pada select-nya, bukan pada pembungkusnya.

   Memakai `max-width` di pembungkus membuat field teks yang sendirian di satu
   baris berhenti di 30rem sehingga tampak menggantung lebih pendek daripada
   field lain di halaman yang sama (yang lebar penuh). Sementara `:only-child`
   tidak bisa dipakai karena baris Lokasi Mitra Sasaran berisi beberapa div
   tersembunyi sebagai saudara. Dropdown tetap dibatasi karena select selebar
   kartu terasa terlalu berat. */
.sipema-baris-field select.form-select { max-width: 30rem; }

@media (max-width: 575.98px) {
    .sipema-baris-field { gap: 0 .75rem; }
    /* field selebar 27rem tidak muat; biarkan mengisi lebar yang ada */
    .sipema-baris-field > .mb-4 { flex: 1 1 100%; }
}

/* =====================================================================
   Pemilih proposal (Desa Binaan)

   Sebelumnya berupa <table> berisi <ul class="nav"> dengan <button> di dalam
   <a> — tombol di dalam tautan, dan semuanya bertanda "active" sehingga tidak
   terlihat proposal mana yang sedang dibuka.
   ===================================================================== */

.sipema-tab-proposal {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    margin-bottom: 1.5rem;
    padding-bottom: 1.25rem;
    border-bottom: 1px solid var(--sp-border);
}

.tab-proposal {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .45rem .9rem;
    border: 1px solid var(--sp-border);
    border-radius: 999px;
    background: #fff;
    color: var(--sp-text-soft);
    font-size: .85rem;
    font-weight: 600;
    text-decoration: none;
    transition: background-color .18s ease, border-color .18s ease, color .18s ease;
}

.tab-proposal:hover {
    border-color: var(--sp-blue-200, var(--sp-blue-100));
    background: var(--sp-blue-50);
    color: var(--sp-blue-700);
    text-decoration: none;
}

/* sudah lengkap */
.tab-proposal.tab-lengkap {
    border-color: #B7E3CC;
    background: #E4F5EC;
    color: #0A6C3D;
}

/* yang sedang dibuka */
.tab-proposal.tab-aktif {
    border-color: var(--sp-blue-600);
    background: var(--sp-blue-600);
    color: #fff;
    box-shadow: 0 4px 12px rgba(37, 99, 235, .28);
}

.tab-proposal .tanda-lengkap { width: .8rem; height: .8rem; }

@media (max-width: 575.98px) {
    .tab-proposal { flex: 1 1 auto; justify-content: center; }
}


/* Keterangan poin verifikasi yang gagal — sebelumnya memakai
   `style="color: red"` inline. */
.teks-tidak-valid { color: var(--sp-danger); font-weight: 500; }


/* Tautan keluar di dalam sel tabel — sebelumnya memakai <u> mentah. */
.tautan-luar {
    color: var(--sp-blue-600);
    text-decoration: none;
    border-bottom: 1px solid var(--sp-blue-100);
    overflow-wrap: anywhere;
}

.tautan-luar:hover { color: var(--sp-blue-700); border-bottom-color: var(--sp-blue-500); }

/* =====================================================================
   Keterangan kecil di bawah label sel (data-editor-jurnal)

   Sebelumnya ditulis `<br><span style="font-size: 12px">`. Jadi kelas agar
   ukuran dan warnanya seragam dengan sel-sub di tabel daftar.
   ===================================================================== */

.tabel-detail .sel-label-sub {
    display: block;
    margin-top: .15rem;
    font-size: .72rem;
    font-weight: 500;
    color: var(--sp-muted);
    letter-spacing: 0;
    text-transform: none;
}

/* =====================================================================
   Baris unggah berkas di dalam sel tabel

   Input file + tombol Unggah + tombol Batal. Dulu `d-flex` tanpa wrap dan
   input-nya diberi `width: 25rem` inline, sehingga menjebol tabel di ponsel.
   ===================================================================== */

.baris-unggah {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
}

.baris-unggah .form-control[type="file"] { flex: 1 1 16rem; min-width: 0; max-width: 26rem; }

@media (max-width: 575.98px) {
    .baris-unggah .form-control[type="file"] { flex: 1 1 100%; max-width: 100%; }
}


/* =====================================================================
   Keterangan kecil di bawah field

   Menggantikan <p style="font-size: 14px"> yang dipakai sebagai catatan
   kaki field. Volt memaksa `p { font-size: 1rem }`, jadi ukurannya harus
   dinyatakan di sini agar tidak kembali jadi 16px.
   ===================================================================== */

.form-teks-bantu {
    margin: .4rem 0 0;
    font-size: .8rem;
    line-height: 1.45;
    color: var(--sp-muted);
}

/* =====================================================================
   Keadaan kosong dan catatan kuota (persetujuan-anggota)
   ===================================================================== */

/* Dulu bila kedua daftar kosong, badan kartunya benar-benar kosong tanpa
   penjelasan apa pun. */
.sipema-kosong {
    margin: 0;
    padding: 2rem 1rem;
    text-align: center;
    font-size: .9rem;
    color: var(--sp-muted);
}

/* Catatan kuota: dulu <div style="margin-bottom: 20px"><small>. Volt memaksa
   `p { font-size: 1rem }`, jadi ukurannya dinyatakan di sini. */
.sipema-catatan-kuota {
    margin: 0 0 1rem;
    padding: .7rem .9rem;
    border-left: 3px solid var(--sp-blue-500);
    border-radius: 0 var(--sp-radius-sm) var(--sp-radius-sm) 0;
    background-color: var(--sp-blue-50);
    font-size: .8rem;
    line-height: 1.5;
    color: var(--sp-text-soft);
}

.sipema-catatan-kuota strong { color: var(--sp-text); }

/* Kolom aksi berisi 2-3 tombol ikon. `.sel-aksi` menyempitkan kolom ke 1%,
   jadi flex-wrap akan menumpuk tombolnya ke bawah; di sini dipaksa sebaris. */
.sel-aksi-ikon {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: .25rem;
}

/* Kolom aksi itu `width: 1%`, jadi flex akan memampatkan tombolnya sampai
   selebar ikonnya saja; ukuran 2rem dari .btn-ikon harus dipertahankan. */
.sel-aksi-ikon > * { flex: 0 0 auto; }

/* Tombol setuju/tolak diberi warna: ikon centang dan silang saja terlalu
   mirip sekilas, apalagi keduanya bersebelahan. */
.btn-ikon-setuju { color: var(--sp-success); }
.btn-ikon-setuju:hover { background-color: rgba(15, 157, 88, .1); color: var(--sp-success); }

.btn-ikon-tolak { color: var(--sp-danger); }
.btn-ikon-tolak:hover { background-color: rgba(220, 53, 69, .1); color: var(--sp-danger); }

/* =====================================================================
   Baris penyaring (tahun / periode) di atas tabel

   Dulu ditulis sebagai `row > d-flex > row > d-flex` dengan
   `margin-right: 10px` dan `width: 10rem` inline pada tiap select —
   empat lapis pembungkus untuk dua dropdown, dan di ponsel keduanya
   tetap 160px berdampingan sehingga label ikut terjepit.
   ===================================================================== */

.sipema-filter {
    display: flex;
    flex-wrap: wrap;
    gap: .75rem 1rem;
    margin-bottom: 1.25rem;
}

.sipema-filter .filter-item {
    display: flex;
    flex-direction: column;
    flex: 0 1 10rem;
}

.sipema-filter .form-label {
    margin-bottom: .3rem;
    font-size: .78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--sp-muted);
}

@media (max-width: 575.98px) {
    .sipema-filter .filter-item { flex: 1 1 100%; }
}

/* =====================================================================
   Tabel komponen penilaian (input-evaluasi-proposal / -presentasi)
   ===================================================================== */

/* Kolom angka: sempit dan rata kanan supaya bobot dan nilai mudah dibaca
   berderet, bukan mengambang di tengah kolom lebar. */
.sel-persen {
    width: 1%;
    white-space: nowrap;
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* Angkanya tidak boleh terpotong, tapi JUDUL kolomnya boleh membungkus.
   Tanpa ini "Usulan Anggaran" memaksa kolomnya selebar 178px dan tabel
   rekap dua-kolom menjebol wadahnya. Ditulis dengan `.table th` (0,2,1)
   supaya menang atas `.table td, .table th` milik Volt. */
.table th.sel-persen { white-space: normal; }

/* Volt memberi `white-space: nowrap` pada SEMUA sel tabel, jadi kalimat
   kriteria yang panjang memaksa kolomnya melebar dan tabelnya menjebol
   kartu. Kolom ini satu-satunya yang isinya kalimat, jadi dibolehkan
   membungkus dan sisanya biar menyesuaikan. */
/* Ditulis sebagai `.table td.sel-kriteria` (0,2,1): aturan Volt-nya
   `.table td, .table th` bernilai (0,1,1), jadi `.sel-kriteria` polos (0,1,0)
   kalah dan white-space-nya tidak pernah berlaku. */
.table td.sel-kriteria,
.table th.sel-kriteria {
    white-space: normal;
    min-width: 14rem;
}

.sel-evaluasi { width: 12rem; }

/* `width` pada <td> hanya anjuran, jadi select-nya menyusut ke lebar
   intrinsiknya (81px) dan pilihan seperti "Sangat Kurang" terpotong.
   min-width pada select-nya yang benar-benar memaksa kolomnya. */
.sel-evaluasi .form-select { width: 100%; min-width: 9.5rem; }

/* Baris total dipisahkan dari daftar kriteria di atasnya. */
.baris-total > td {
    border-top: 2px solid var(--sp-border);
    font-weight: 700;
    color: var(--sp-text);
}

/* Penanda field tidak wajib, dibedakan dari nama labelnya. */
.label-opsional {
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
    color: var(--sp-muted);
}

/* =====================================================================
   Baris pilihan radio/checkbox berdampingan

   Dulu ditulis `row > d-flex` dengan `margin-right: 20px` inline pada
   pilihan pertama; jaraknya jadi tidak berlaku kalau pilihannya turun
   baris di layar sempit.
   ===================================================================== */

.baris-pilihan {
    display: flex;
    flex-wrap: wrap;
    gap: .35rem 1.5rem;
}

.baris-pilihan .form-check { margin-bottom: 0; }

/* Penyaring dengan pilihan panjang (nama skema, "Dengan Skema Khusus")
   perlu lebih lebar daripada Tahun/Periode. */
.sipema-filter .filter-item-lebar { flex: 0 1 16rem; }

/* Penyaring yang dikirim lewat tombol (bukan onchange) butuh satu sel berisi
   tombolnya. Label penyaring lain memakan tinggi di atas kolom, jadi tombolnya
   dirapatkan ke bawah supaya sejajar dengan kotak isian di sebelahnya. */
.sipema-filter .filter-item-tombol {
    flex: 0 0 auto;
    justify-content: flex-end;
}

@media (max-width: 575.98px) {
    .sipema-filter .filter-item-lebar { flex: 1 1 100%; }
}

/* Nama anggota + tombol reset persetujuan dalam satu baris. Dulu tombolnya
   diletakkan begitu saja di dalam <div> nama, jadi tingginya tidak sejajar
   dan tombol turun baris terpisah dari namanya. */
.baris-anggota {
    display: flex;
    align-items: center;
    gap: .35rem;
}

.baris-anggota > span { flex: 1 1 auto; }
.baris-anggota > .btn-ikon { flex: 0 0 auto; }

/* Bilah kemajuan proses cek similarity. Dulu tingginya ditulis inline
   bersama `width` yang memang harus inline karena ditulis ulang oleh JS. */
.bilah-similarity { height: .625rem; }

/* Baris tombol aksi di atas tabel. Dulu jaraknya `margin-right: 10px` inline
   bercampur dengan `display` yang dipakai JS untuk menyembunyikan tombol —
   marginnya dipisah ke sini supaya yang inline tinggal `display`. */
.baris-aksi {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    gap: .5rem;
}

@media (max-width: 575.98px) {
    .baris-aksi { justify-content: stretch; }
    .baris-aksi > .btn { flex: 1 1 100%; }
}

/* Nilai evaluasi yang menautkan ke lembar review. Dulu ikut konstruksi
   `nav-link d-flex` dengan teks bergaris bawah <u>. */
.tautan-nilai {
    display: inline-block;
    padding: .15rem .5rem;
    border-radius: var(--sp-radius-sm);
    background-color: var(--sp-blue-50);
    color: var(--sp-blue-700);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    text-decoration: none;
}

.tautan-nilai:hover { background-color: var(--sp-blue-100); color: var(--sp-blue-700); }

/* Form unduh dokumen: dropdown + tombol sebaris, tombol sejajar dengan
   dasar dropdown (bukan dengan labelnya). */
.baris-unduh {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: .5rem .75rem;
}

@media (max-width: 575.98px) {
    .baris-unduh > .filter-item { flex: 1 1 100%; }
    .baris-unduh > .btn { flex: 1 1 100%; }
}

/* Slot isian anggota tim/mahasiswa yang muncul-hilang. Jaraknya dulu ditulis
   inline bersama `display` bersyarat Jinja; marginnya dipindah ke sini supaya
   yang inline tinggal display-nya saja. */
.slot-anggota { margin-bottom: .625rem; }

/* Dropdown berukuran sedang (mis. pilihan wilayah) — dulu `max-width: 300px`
   inline. */
.field-sedang { max-width: 19rem; }

/* Panel tim di modal "Edit Tim Pengusul": satu kotak per tim, isinya
   dikelompokkan (ketua / anggota dosen / anggota mahasiswa). Sebelumnya
   dua kolom d-flex tanpa jarak sehingga field-nya berdempetan. */
.panel-tim {
    height: 100%;
    padding: 1rem 1.1rem 1.15rem;
    border: 1px solid var(--sp-border);
    border-radius: .6rem;
    background-color: var(--sp-blue-50);
}
.panel-tim-judul {
    margin: 0 0 .9rem;
    padding-bottom: .5rem;
    border-bottom: 1px solid var(--sp-blue-100);
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--sp-blue-600);
}
.panel-tim .form-control { background-color: #fff; }
.grup-tim {
    margin: 0 0 1.15rem;
    padding: 0;
    border: 0;
}
.grup-tim:last-child { margin-bottom: 0; }
/* Reboot Bootstrap membuat <legend> float kiri selebar penuh; dikembalikan
   agar tampil seperti label biasa. */
.grup-tim-judul {
    float: none;
    width: auto;
    margin-bottom: .45rem;
    padding: 0;
    font-size: .8rem;
    font-weight: 600;
    line-height: 1.3;
    color: var(--sp-text);
}
.grup-tim > .slot-anggota:last-of-type { margin-bottom: 0; }
.btn-tambah-slot { margin-top: .55rem; }
/* Saat tidak ada Tim 2, panel melebar penuh; field nama tidak perlu ikut
   selebar itu. */
.grup-tim .form-control { max-width: 26rem; }

/* Kolom kontak (email + nomor telepon) dan tampilan sandi apa adanya
   di /evaluator-eksternal. */
.kolom-kontak { min-width: 10rem; max-width: 15rem; overflow-wrap: anywhere; }
.teks-sandi {
    font-family: var(--bs-font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
    letter-spacing: .02em;
}
/* Tabel dengan sedikit kolom (mis. /evaluator-eksternal) punya ruang lebih;
   nama tidak perlu dipatahkan pada 12rem. */
.kolom-orang.kolom-orang-lebar { max-width: 22rem; }

/* Beberapa nama dalam satu sel (kolom "Anggota Tim" di /emergency-exit). */
.orang-item + .orang-item { margin-top: .45rem; }

/* =====================================================================
   /skema-abdimas — panel ringkas, judul blok, tabel parameter
   ===================================================================== */

.judul-blok {
    margin: 0 0 .6rem;
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--sp-blue-600);
}

.panel-ringkas {
    display: flex;
    align-items: flex-start;
    gap: .75rem;
    padding: .9rem 1rem;
    border: 1px solid var(--sp-border);
    border-left: 3px solid var(--sp-blue-500);
    border-radius: .5rem;
    background-color: var(--sp-blue-50);
}
.panel-ringkas-teks { flex: 1 1 auto; min-width: 0; }
.panel-ringkas-label {
    margin: 0 0 .2rem;
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .03em;
    text-transform: uppercase;
    color: var(--sp-blue-600);
}
.panel-ringkas-nilai {
    margin: 0;
    font-size: .875rem;
    line-height: 1.45;
    color: var(--sp-text);
    overflow-wrap: anywhere;
}
.panel-ringkas .btn-ikon { flex: 0 0 auto; }

.teks-peringatan { color: var(--sp-danger); font-weight: 600; }

/* --- /skema-abdimas: kelas pengganti gaya inline --------------------- */

/* Volt memberi ".table td, .table th { white-space: nowrap }" (spesifisitas
   0,1,1), jadi penimpaannya harus ikut menyebut elemennya. */
.table th.th-tengah { vertical-align: middle; text-align: center; white-space: normal; }
.table th.th-kampus { width: 25%; white-space: normal; }
.table td.sel-kiri { text-align: left; }
.table td.sel-tengah { text-align: center; }
.table td.sel-atas { vertical-align: top; }
.table td.sel-label-tetap { width: 15rem; white-space: normal; }
.table td.sel-teks-sempit, .sel-teks-sempit { width: 10rem; white-space: normal; }

/* Kontrol sunting sebaris di dalam sel tabel: mengikuti lebar sel, tapi
   tidak menyusut sampai tak terbaca. */
.field-inline { width: 100%; }
td .field-inline { min-width: 11rem; }
.field-mini { width: 5rem; }

/* Rentang tanggal "buka ~ tutup" */
.baris-tanggal {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem;
}
.baris-tanggal .field-tanggal { flex: 0 0 10rem; width: 10rem; }

/* Kotak isian biasa yang ikut dibariskan bersama tombol batalnya: tanpa ini
   `.field-inline` (width: 100%) memakan satu baris penuh dan tombolnya
   terlempar ke baris berikutnya. Anak langsung saja, supaya <input> di dalam
   .field-tanggal tidak ikut terkena. */
.baris-tanggal > .form-control:not(.field-mini),
.baris-tanggal > .form-select { flex: 1 1 12rem; width: auto; }
.baris-tanggal > .field-mini { flex: 0 0 auto; }
.pemisah-rentang { color: var(--sp-muted); }

.slot-tersembunyi { margin-bottom: .625rem; }
.teks-patah { overflow-wrap: break-word; white-space: normal; }
/* Sederet kotak centang: dulu d-flex tanpa wrap, sehingga di layar sempit
   kotak terakhir terdorong melewati tepi layar. */
.baris-centang {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem 1.25rem;
}
.baris-centang .form-check { margin-bottom: 0; }
.kotak-centang { margin-right: 0; }
.butir-kecil { font-size: .875rem; }
.baris-rapat { margin-bottom: .625rem; }
/* Judul di atas sekelompok kotak centang (bukan label satu kontrol). */
.judul-grup-centang {
    margin: 0 0 .4rem;
    font-size: .82rem;
    font-weight: 600;
    color: var(--sp-text);
}

/* Volt tidak menetapkan ukuran untuk .form-check-label, jadi di dalam modal
   ia mewarisi 16px dari body sementara di dalam .card ikut 14px - samakan. */
.form-check-label { font-size: .875rem; }
/* Empat kontrol berdampingan, satu per kampus. Grid supaya kolomnya sejajar
   antar kelompok dan bisa diberi baris kepala nama kampus. */
.grid-kampus {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: .5rem;
}
.grid-kampus-kepala {
    margin-bottom: .3rem;
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .02em;
    color: var(--sp-muted);
}
.grid-kampus .field-inline { min-width: 0; }
@media (max-width: 575.98px) {
    .grid-kampus { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* Kolom "Ketua Pengusul Available": nama lengkap + gelar membuat sel melar
   sampai ~357px kalau dibiarkan satu baris. */
.kolom-pengusul { width: 12rem; white-space: normal; }
/* Penanda sel kosong (mis. proposal belum diunggah). */
.sel-kosong { color: var(--sp-muted); }
/* Sel isian evaluator di /pilih-evaluator-kk. min-width, bukan width, supaya
   tata letak tabel otomatis tidak memampatkannya sampai nama tak terbaca. */
.table td.sel-evaluator { min-width: 14rem; white-space: normal; vertical-align: top; }
.sel-evaluator .form-control { width: 100%; }
/* Kolom pilihan radio di tabel aspek (/narsum-eksternal-kk). */
.table th.sel-pilihan, .table td.sel-pilihan { width: 1%; white-space: normal; text-align: center; }
/* Kolom kode dosen: pendek dan tidak perlu membungkus. */
.table td.sel-kode { white-space: nowrap; font-variant-numeric: tabular-nums; }
/* Kotak centang 16px terlalu kecil sebagai sasaran sentuh di layar sempit. */
@media (max-width: 767.98px) {
    .kotak-anggota,
    .table td.sel-pilihan .form-check-input,
    .table th.sel-pilihan .form-check-input {
        width: 1.5rem;
        height: 1.5rem;
    }
    .table td.sel-pilihan, .table th.sel-pilihan { padding-left: .9rem; padding-right: .9rem; }
}

/* --- /data-abdimas-kk ------------------------------------------------ */

/* Anggota tim yang termasuk KK ini; dulu ditandai style="color: blue" saja. */
.anggota-kk { font-weight: 700; color: var(--sp-blue-700); }

.kolom-mitra { min-width: 12rem; max-width: 18rem; }
.table td.sel-uang, .table th.sel-uang {
    white-space: nowrap;
    text-align: right;
    font-variant-numeric: tabular-nums;
}
.table th.sel-uang { white-space: normal; }
.kolom-komentar {
    min-width: 14rem;
    max-width: 24rem;
    white-space: pre-wrap;
    font-size: .82rem;
    color: var(--sp-muted);
}

/* Ringkasan jumlah kegiatan: dulu tabel satu baris. */
.baris-ringkas {
    display: flex;
    flex-wrap: wrap;
    gap: .75rem;
}
.kartu-angka {
    display: flex;
    flex-direction: column;
    flex: 1 1 8rem;
    min-width: 7rem;
    padding: .75rem .9rem;
    border: 1px solid var(--sp-border);
    border-radius: .5rem;
    background-color: #fff;
}
.kartu-angka-nilai {
    font-size: 1.5rem;
    font-weight: 700;
    line-height: 1.15;
    color: var(--sp-navy-900);
    font-variant-numeric: tabular-nums;
}
.kartu-angka-label {
    margin-top: .15rem;
    font-size: .75rem;
    color: var(--sp-muted);
}
.kartu-angka-total {
    border-color: var(--sp-blue-100);
    background-color: var(--sp-blue-50);
}
.kartu-angka-total .kartu-angka-nilai { color: var(--sp-blue-700); }

/* Judul bagian yang menandai kegagalan (mis. daftar job gagal di /daftar-antrian). */
.judul-blok-bahaya { color: var(--sp-danger); }

/* Pilihan presenter di /cosecant-presenter: tiga select bertumpuk dalam satu
   sel, dulu masing-masing dipatok `style="width: 15rem"`. */
/* Kotak cari dosen dengan datalist (mis. /daftar-admin). Dulu dipatok
   `style="width: 10rem"` sehingga "Nama Lengkap (KODE)" terpotong. */
.field-cari-dosen { width: 100%; }

/* Kolom nilai rupiah dirapatkan ke kanan supaya digitnya sejajar.
   Dulu ditambal `style="text-align: end"` per sel. */
.table td.sel-rupiah {
    text-align: right;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

/* Pakta integritas /unduh-data-wadek: dulu tiap <p>/<li> ditambal
   `style="font-size: 14px"` karena teks modal mewarisi 16px. */
.teks-pakta { font-size: .875rem; }
.daftar-pakta { padding-left: 1.15rem; }
.daftar-pakta li { font-size: .875rem; }
.daftar-pakta li + li { margin-top: .25rem; }

.blok-presenter {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: .25rem;
}
.field-presenter {
    width: 100%;
    min-width: 0;
    max-width: 15rem;
}

/* Daftar panitia (session chair / reviewer) di dalam sel tabel rincian.
   <li> tidak mewarisi font-size .table td milik Volt sehingga tampil 16px,
   dulu ditambal `style="font-size: 14px"` per baris. */
.daftar-panitia {
    margin: 0;
    padding-left: 1.1rem;
}
.daftar-panitia li {
    font-size: .875rem;
    color: var(--sp-text);
}
.daftar-panitia li + li { margin-top: .2rem; }

/* Tautan publik yang ditampilkan utuh (sertifikat presenter, kwitansi). */
.tautan-panjang { overflow-wrap: anywhere; }

/* Bearer token 64 karakter di /daftar-api: dibiarkan membungkus, bukan nowrap. */
.table td.kolom-token { white-space: normal; }
.kode-token {
    display: inline-block;
    max-width: 24rem;
    padding: .15rem .4rem;
    border-radius: .3rem;
    background-color: var(--sp-blue-50);
    color: var(--sp-blue-700);
    font-size: .72rem;
    line-height: 1.5;
    overflow-wrap: anywhere;
}

/* Volt mewarnai <code> merah muda; di dalam sel kode tabel dibuat mengikuti palet. */
.sel-kode code {
    padding: .1rem .35rem;
    border-radius: .3rem;
    background-color: var(--sp-blue-50);
    color: var(--sp-blue-700);
}
/* Tombol aksi yang dibungkus <form> (mis. Unduh Data) ikut melebar di ponsel
   seperti tombol aksi lain di kepala halaman. */
@media (max-width: 767.98px) {
    .sipema-page-head .page-head-aksi form { flex: 1 1 100%; }
    .sipema-page-head .page-head-aksi form .btn { width: 100%; }
}

/* --- /abdimas-anggota-kk --------------------------------------------- */

/* Sel "3 (5)": jumlah terverifikasi lalu jumlah seluruh pengajuan. */
.table td.sel-angka, .table th.sel-angka {
    white-space: nowrap;
    text-align: center;
    font-variant-numeric: tabular-nums;
}
.table th.sel-angka { white-space: normal; min-width: 5rem; }
.angka-utama { font-weight: 600; color: var(--sp-navy-900); }
.angka-semua { margin-left: .15rem; font-size: .8rem; color: var(--sp-blue-600); }
.table td.sel-angka-total { background-color: var(--sp-blue-50); }
.table td.sel-angka-total .angka-utama { color: var(--sp-blue-700); }

/* Penghitung kecil di label tab rincian. */
.tab-jumlah {
    display: inline-block;
    margin-left: .35rem;
    padding: 0 .35rem;
    border-radius: .7rem;
    background-color: var(--sp-blue-50);
    font-size: .72rem;
    font-weight: 700;
    color: var(--sp-blue-700);
}
.nav-tabs .nav-link.active .tab-jumlah { background-color: var(--sp-blue-100); }

/* --- /form-feedback: kuesioner publik, dibuka lewat QR di ponsel ------ */

.sipema-page-head-publik { align-items: center; gap: 1rem; }
.sipema-page-head-publik .page-head-logo {
    flex: 0 0 auto;
    padding: .4rem .5rem;
    border-radius: .4rem;
    background-color: #fff;
}

.blok-pernyataan {
    margin: 0 0 .75rem;
    padding: .9rem 1rem;
    border: 1px solid var(--sp-border);
    border-radius: .55rem;
    background-color: #fff;
}
.blok-pernyataan-teks {
    float: none;
    width: auto;
    margin: 0 0 .75rem;
    padding: 0;
    font-size: .9rem;
    font-weight: 600;
    line-height: 1.45;
    color: var(--sp-text);
}
.blok-pernyataan-no {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    margin-right: .5rem;
    border-radius: 50%;
    background-color: var(--sp-blue-50);
    font-size: .78rem;
    color: var(--sp-blue-700);
    vertical-align: middle;
}

.baris-skala {
    display: flex;
    flex-wrap: wrap;
    gap: .4rem;
}
.pilihan-skala { flex: 1 1 7rem; min-width: 6rem; }
.pilihan-skala .form-check-input {
    position: absolute;
    opacity: 0;
    pointer-events: none;
}
.pilihan-skala .form-check-label {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .1rem;
    min-height: 3.25rem;
    padding: .4rem .3rem;
    border: 1px solid var(--sp-border);
    border-radius: .45rem;
    text-align: center;
    cursor: pointer;
    transition: background-color .15s ease, border-color .15s ease, color .15s ease;
}
.pilihan-skala .form-check-label:hover { border-color: var(--sp-blue-500); background-color: var(--sp-blue-50); }
.pilihan-skala .form-check-input:checked + .form-check-label {
    border-color: var(--sp-blue-600);
    background-color: var(--sp-blue-50);
    color: var(--sp-blue-700);
}
.pilihan-skala .form-check-input:focus-visible + .form-check-label {
    outline: 2px solid var(--sp-blue-600);
    outline-offset: 2px;
}
.skala-singkat { font-size: .95rem; font-weight: 700; line-height: 1.1; }
.skala-panjang { font-size: .68rem; line-height: 1.2; color: var(--sp-muted); }
.pilihan-skala .form-check-input:checked + .form-check-label .skala-panjang { color: var(--sp-blue-600); }
/* Blok jawaban pada halaman tanda terima kuesioner. */
.blok-jawaban { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem; }
.blok-jawaban .blok-pernyataan-teks { flex: 1 1 14rem; margin: 0; }
.badge-jawaban { flex: 0 0 auto; }
/* Nama anggota diikuti status persetujuannya (/rekap-non-hibah). */
.baris-anggota-status {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem .5rem;
}
.baris-anggota-status > span:first-child { flex: 1 1 auto; }

/* Galeri gambar dashboard (/gambar-dashboard). Dulu daftarnya dirender dua
   kali - satu tabel untuk melihat, satu lagi untuk mode hapus - sehingga
   setiap gambar punya dua elemen <img> di halaman yang sama. */
.grid-gambar {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
    gap: 1rem;
}

.kartu-gambar {
    position: relative;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    border: 1px solid var(--sp-border);
    border-radius: .6rem;
    background-color: #fff;
}

.kartu-gambar img {
    display: block;
    width: 100%;
    height: 9rem;
    object-fit: cover;
    background-color: var(--sp-blue-50);
}

.nama-gambar {
    padding: .5rem .7rem;
    border-top: 1px solid var(--sp-border);
    font-size: .78rem;
    color: var(--sp-text-soft);
    overflow-wrap: anywhere;
}

/* Kotak centang hanya muncul saat mode hapus dinyalakan. */
.kartu-gambar .kotak-pilih { display: none; }

.grid-gambar.mode-hapus .kartu-gambar .kotak-pilih {
    display: flex;
    position: absolute;
    top: .5rem;
    left: .5rem;
    align-items: center;
    gap: .4rem;
    padding: .3rem .6rem .3rem .5rem;
    border-radius: .4rem;
    background-color: rgba(255, 255, 255, .92);
    box-shadow: 0 1px 3px rgba(16, 30, 54, .18);
}

.grid-gambar.mode-hapus .kotak-pilih .form-check-input { margin: 0; float: none; }
.grid-gambar.mode-hapus .kotak-pilih .form-check-label { font-size: .78rem; cursor: pointer; }
.grid-gambar.mode-hapus .kartu-gambar { border-color: var(--sp-blue-100); }

.grid-gambar.mode-hapus .kartu-gambar:has(.form-check-input:checked) {
    border-color: var(--sp-danger);
    box-shadow: 0 0 0 2px rgba(220, 53, 69, .18);
}

@media (max-width: 575.98px) {
    .grid-gambar { grid-template-columns: 1fr; }
}

/* Nama dosen yang termasuk unit/CoE yang sedang disaring, di /unduh-data.
   Dulu ditulis inline sebagai <span style="color: blue;"><strong>. */
.orang-sorot { color: var(--sp-blue-700); font-weight: 600; }

/* Bilah kemajuan tipis untuk proses latar (/data-dosen). */
.bilah-proses { height: .625rem; }

/* Tabel yang isinya bisa sangat panjang: tinggi dibatasi supaya penyaring di
   atasnya tetap terlihat sambil menggulir. Dulu ditulis inline sebagai
   style="overflow-x: auto; max-height: 500px". */
.tabel-gulir { max-height: 31rem; overflow: auto; }

/* Daftar kotak centang panjang (mis. daftar CoE per Research Institute):
   dua kolom di layar lebar supaya modalnya tidak memanjang ke bawah. */
.grid-centang {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
    gap: .35rem 1.5rem;
}
.grid-centang .form-check-input:disabled + .form-check-label { color: var(--sp-muted); }
