/* =====================================================================
 * SIPADU PEMDI — gaya khusus aplikasi
 * =====================================================================
 * Berkas ini HANYA berisi kerangka halaman (topbar, sidebar, navigasi
 * bawah) dan sedikit utilitas yang memang tidak disediakan design system.
 *
 * ATURAN:
 *  - Komponen (tombol, kartu, tabel, input, badge, modal, dsb) TIDAK
 *    digayakan di sini — pakai kelas resmi `.ina-*` dari INA Digital
 *    Design System (public/assets/vendor/idds/idds.min.css).
 *  - Semua warna, jarak, radius, dan ukuran font di bawah WAJIB memakai
 *    token `--ina-*`. Jangan menuliskan nilai hex langsung, supaya saat
 *    design system diperbarui (atau tema brand diganti lewat atribut
 *    data-brand pada <html>) tampilan ikut menyesuaikan otomatis.
 * ===================================================================== */

:root {
    /* Tinggi RENDER sebenarnya .ina-text-field__wrapper--size-sm (terukur di
       peramban): height 40px + padding 8+8 + border 1+1, karena box-sizing-nya
       content-box. Dipakai menyamakan tinggi tombol aksi di sebelah isian. */
    --sipadu-tinggi-isian-sm: 58px;
    --sipadu-sidebar-width: 280px;
    --sipadu-topbar-height: 64px;
    --sipadu-bottom-nav-height: 64px;
}

/* ---------------------------------------------------------------------
 * Kerangka halaman
 * ------------------------------------------------------------------ */
body.sipadu-body {
    margin: 0;
    background: var(--ina-background-secondary);
    color: var(--ina-content-primary);
    font-size: var(--ina-font-sm);
}

.sipadu-shell {
    display: flex;
    align-items: flex-start;
    min-height: calc(100vh - var(--sipadu-topbar-height));
}

.sipadu-main {
    flex: 1 1 auto;
    min-width: 0; /* penting: mencegah tabel lebar mendorong layout */
}

.sipadu-container {
    padding: var(--ina-spacing-4, 1rem);
    max-width: 1440px;
}

@media (min-width: 992px) {
    .sipadu-container { padding: var(--ina-spacing-6, 1.5rem); }
}

/* Ruang ekstra di bawah agar konten tidak tertutup navigasi bawah (mobile) */
.sipadu-main.has-bottom-nav { padding-bottom: calc(var(--sipadu-bottom-nav-height) + 1rem); }
@media (min-width: 992px) {
    .sipadu-main.has-bottom-nav { padding-bottom: 0; }
}

/* ---------------------------------------------------------------------
 * Topbar
 * ------------------------------------------------------------------ */
.sipadu-topbar {
    position: sticky;
    top: 0;
    z-index: 1030;
    height: var(--sipadu-topbar-height);
    background: var(--ina-background-primary);
    border-bottom: 1px solid var(--ina-stroke-primary);
}

.sipadu-topbar__inner {
    height: 100%;
    display: flex;
    align-items: center;
    gap: var(--ina-spacing-3, 0.75rem);
    padding: 0 var(--ina-spacing-4, 1rem);
}

.sipadu-topbar__actions {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
}

/* Tautan yang berperan sebagai tombol.
   IDDS tidak mematikan garis bawah pada .ina-button (komponennya dirancang
   untuk <button>), jadi setiap <a class="ina-button"> tampil bergaris bawah
   seperti tautan biasa — terlihat salah di dalam kotak tombol. Satu baris di
   sini, bukan gaya sebaris di tiap tampilan. */
a.ina-button { text-decoration: none; }

.sipadu-brand {
    display: flex;
    align-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
    text-decoration: none;
    color: inherit;
    min-width: 0;
}

.sipadu-brand__mark {
    display: grid;
    place-items: center;
    width: 36px;
    height: 36px;
    flex: 0 0 36px;
    border-radius: var(--ina-radius-lg);
    background: var(--ina-primary-primary);
    color: var(--ina-base-white);
    font-size: var(--ina-font-lg);
}

/*
 * Varian brand mark yang memakai BERKAS LOGO, bukan ikon font.
 * Latar dan radius dinolkan karena logo sudah membawa warna dan bentuknya
 * sendiri (lingkaran) — kotak biru di belakangnya justru memotong lingkaran.
 * alt="" disengaja pada <img>-nya: teks "SIPADU PEMDI" tepat di sebelahnya
 * sudah dibaca screen reader, jadi logo di sini murni dekoratif.
 */
.sipadu-brand__mark--logo {
    background: transparent;
    border-radius: 0;
    width: 40px;
    height: 40px;
    flex-basis: 40px;
}
.sipadu-brand__mark--logo img { display: block; width: 100%; height: 100%; object-fit: contain; }

.sipadu-brand__text { display: flex; flex-direction: column; line-height: 1.15; min-width: 0; }
.sipadu-brand__name { font-size: var(--ina-font-base); font-weight: var(--ina-font-semibold); letter-spacing: -0.01em; }
.sipadu-brand__name strong { color: var(--ina-primary-primary); font-weight: var(--ina-font-bold); }
.sipadu-brand__sub {
    font-size: var(--ina-font-2xs);
    color: var(--ina-content-secondary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
@media (max-width: 575.98px) { .sipadu-brand__sub { display: none; } }

/* Tombol ikon polos (topbar) */
.sipadu-icon-btn {
    position: relative;
    display: grid;
    place-items: center;
    width: 40px;
    height: 40px;
    border: 1px solid transparent;
    border-radius: var(--ina-radius-lg);
    background: transparent;
    color: var(--ina-content-secondary);
    font-size: var(--ina-font-xl);
    cursor: pointer;
    text-decoration: none;
    transition: background var(--ina-transition-fast, 150ms) ease, color var(--ina-transition-fast, 150ms) ease;
}
.sipadu-icon-btn:hover { background: var(--ina-background-tertiary); color: var(--ina-content-primary); }
.sipadu-icon-btn:focus-visible { outline: 2px solid var(--ina-primary-primary); outline-offset: 2px; }

.sipadu-icon-btn__count {
    position: absolute;
    top: 2px;
    right: 2px;
    min-width: 18px;
    height: 18px;
    padding: 0 4px;
    border-radius: var(--ina-radius-full);
    background: var(--ina-content-negative);
    color: var(--ina-base-white);
    font-size: var(--ina-font-3xs);
    font-weight: var(--ina-font-bold);
    display: grid;
    place-items: center;
}

/* Tombol pengguna + dropdown */
.sipadu-user-btn {
    display: flex;
    align-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
    padding: 4px 8px;
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-full);
    background: var(--ina-background-primary);
    color: var(--ina-content-primary);
    cursor: pointer;
}
.sipadu-user-btn:hover { background: var(--ina-background-secondary); }
.sipadu-user-btn__text { flex-direction: column; align-items: flex-start; line-height: 1.15; }
.sipadu-user-btn__name { font-size: var(--ina-font-sm); font-weight: var(--ina-font-medium); }
.sipadu-user-btn__role { font-size: var(--ina-font-2xs); color: var(--ina-content-secondary); }

.sipadu-dropdown { position: relative; }
.sipadu-dropdown__menu {
    position: absolute;
    right: 0;
    top: calc(100% + 8px);
    min-width: 260px;
    background: var(--ina-background-primary);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-xl);
    box-shadow: var(--ina-shadow-lg, 0 10px 25px rgb(0 0 0 / 10%));
    padding: var(--ina-spacing-2, 0.5rem);
    z-index: 1040;
    display: none;
}
.sipadu-dropdown.is-open .sipadu-dropdown__menu { display: block; }
.sipadu-dropdown__header { padding: var(--ina-spacing-2, 0.5rem); font-size: var(--ina-font-sm); }
.sipadu-dropdown__item {
    display: flex;
    align-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
    padding: 8px 10px;
    border-radius: var(--ina-radius-md);
    color: var(--ina-content-primary);
    text-decoration: none;
    font-size: var(--ina-font-sm);
}
.sipadu-dropdown__item:hover { background: var(--ina-background-tertiary); }
.sipadu-dropdown__item--danger { color: var(--ina-content-negative); }
/* .sipadu-dropdown__item dipakai juga untuk <button> (aksi POST langsung,
   bukan tautan/pembuka modal) — mis. kolom "Kelola" pada tabel Pengguna.
   Elemen <button> punya gaya bawaan browser (lebar konten, latar, garis
   tepi) yang tidak dimiliki <a>; reset di sini supaya ia terlihat identik. */
button.sipadu-dropdown__item {
    width: 100%;
    background: none;
    border: 0;
    text-align: left;
    cursor: pointer;
    font: inherit;
}
.sipadu-dropdown__divider {
    height: 1px;
    background: var(--ina-stroke-primary);
    margin: var(--ina-spacing-2, 0.5rem) 0;
    border: 0;
}
/* Form pembungkus tombol aksi (Aktifkan, Lepas QR, dll) di dalam dropdown
   tidak boleh menambah baris/spasi ekstra pada menu. */
.sipadu-dropdown__menu form { margin: 0; }

/* ---------------------------------------------------------------------
 * Sidebar & navigasi
 * ------------------------------------------------------------------ */
.sipadu-sidebar {
    position: sticky;
    top: var(--sipadu-topbar-height);
    flex: 0 0 var(--sipadu-sidebar-width);
    width: var(--sipadu-sidebar-width);
    height: calc(100vh - var(--sipadu-topbar-height));
    overflow-y: auto;
    background: var(--ina-background-primary);
    border-right: 1px solid var(--ina-stroke-primary);
}

.sipadu-nav { padding: var(--ina-spacing-3, 0.75rem); width: 100%; }
.sipadu-nav__list { list-style: none; margin: 0 0 var(--ina-spacing-2, 0.5rem); padding: 0; }

.sipadu-nav__link {
    display: flex;
    align-items: center;
    gap: var(--ina-spacing-3, 0.75rem);
    padding: 10px 12px;
    margin-bottom: 2px;
    border-radius: var(--ina-radius-lg);
    color: var(--ina-content-secondary);
    text-decoration: none;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-medium);
    transition: background 150ms ease, color 150ms ease;
}
.sipadu-nav__link:hover { background: var(--ina-background-tertiary); color: var(--ina-content-primary); }
.sipadu-nav__link.is-active {
    background: var(--ina-primary-25);
    color: var(--ina-primary-primary);
    font-weight: var(--ina-font-semibold);
}
.sipadu-nav__link:focus-visible { outline: 2px solid var(--ina-primary-primary); outline-offset: 2px; }
.sipadu-nav__icon { font-size: var(--ina-font-xl); flex: 0 0 auto; }

.sipadu-nav__section {
    margin: var(--ina-spacing-4, 1rem) 0 var(--ina-spacing-2, 0.5rem);
    padding: 0 12px;
    font-size: var(--ina-font-2xs);
    font-weight: var(--ina-font-semibold);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--ina-content-tertiary);
}

.sipadu-nav__search { margin-bottom: var(--ina-spacing-2, 0.5rem); }
.sipadu-nav__empty-search {
    padding: 0 12px;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
}

/* Daftar indikator di sidebar */
.sipadu-nav__link--indikator { align-items: flex-start; padding: 8px 12px; font-weight: var(--ina-font-normal); }
.sipadu-nav__indikator-text { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.sipadu-nav__indikator-no { font-size: var(--ina-font-2xs); color: var(--ina-content-tertiary); }
.sipadu-nav__indikator-nama {
    font-size: var(--ina-font-xs);
    line-height: 1.35;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.sipadu-nav__indikator-pct {
    flex: 0 0 auto;
    font-size: var(--ina-font-2xs);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-secondary);
}

/* Titik status — mengikuti aturan skor Bagian 3.9:
   hijau HANYA untuk yang sudah terpenuhi (selesai DAN terverifikasi). */
.sipadu-dot { width: 8px; height: 8px; border-radius: var(--ina-radius-full); flex: 0 0 8px; margin-top: 6px; }
.sipadu-dot.is-done { background: var(--ina-content-positive); }
.sipadu-dot.is-progress { background: var(--ina-sentiment-warning-500, #f79009); }
.sipadu-dot.is-idle { background: var(--ina-stroke-secondary); }

/* ---------------------------------------------------------------------
 * Navigasi bawah (mobile)
 * ------------------------------------------------------------------ */
.sipadu-bottom-nav {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 1035;
    height: var(--sipadu-bottom-nav-height);
    display: flex;
    background: var(--ina-background-primary);
    border-top: 1px solid var(--ina-stroke-primary);
    padding-bottom: env(safe-area-inset-bottom);
}

.sipadu-bottom-nav__item {
    flex: 1 1 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    border: 0;
    background: transparent;
    color: var(--ina-content-tertiary);
    text-decoration: none;
    font-size: var(--ina-font-3xs);
    cursor: pointer;
}
.sipadu-bottom-nav__item i { font-size: var(--ina-font-xl); }
.sipadu-bottom-nav__item.is-active { color: var(--ina-primary-primary); font-weight: var(--ina-font-semibold); }

.sipadu-bottom-nav__icon-wrap { position: relative; display: inline-grid; place-items: center; }
.sipadu-bottom-nav__dot {
    position: absolute;
    top: 0;
    right: -2px;
    width: 8px;
    height: 8px;
    border-radius: var(--ina-radius-full);
    background: var(--ina-content-negative);
}

/* ---------------------------------------------------------------------
 * Utilitas kecil khusus aplikasi
 * ------------------------------------------------------------------ */
.sipadu-text-secondary { color: var(--ina-content-secondary); font-size: var(--ina-font-xs); }
.sipadu-text-tertiary { color: var(--ina-content-tertiary); font-size: var(--ina-font-xs); }

.sipadu-page-header { margin-bottom: var(--ina-spacing-4, 1rem); }
.sipadu-page-header__title {
    margin: 0;
    font-size: var(--ina-font-2xl);
    font-weight: var(--ina-font-semibold);
    letter-spacing: -0.01em;
}
.sipadu-page-header__subtitle { margin: 4px 0 0; color: var(--ina-content-secondary); font-size: var(--ina-font-sm); }

/* Kartu statistik ringkas */
.sipadu-stat {
    background: var(--ina-background-primary);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-xl);
    padding: var(--ina-spacing-4, 1rem);
    height: 100%;
}
.sipadu-stat__label {
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
    display: flex;
    align-items: center;
    gap: 6px;
}
.sipadu-stat__value {
    font-size: var(--ina-font-2xl);
    font-weight: var(--ina-font-bold);
    line-height: 1.2;
    margin-top: 4px;
}
.sipadu-stat__hint { font-size: var(--ina-font-2xs); color: var(--ina-content-tertiary); margin-top: 2px; }

/* Panel/kartu umum (pembungkus, BUKAN pengganti .ina-card) */
.sipadu-panel {
    background: var(--ina-background-primary);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-xl);
    overflow: hidden;
}
.sipadu-panel__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--ina-spacing-3, 0.75rem);
    padding: var(--ina-spacing-4, 1rem);
    border-bottom: 1px solid var(--ina-stroke-primary);
    font-weight: var(--ina-font-semibold);
}
.sipadu-panel__body { padding: var(--ina-spacing-4, 1rem); }
.sipadu-panel__body--flush { padding: 0; }

.sipadu-list { list-style: none; margin: 0; padding: 0; }
.sipadu-list__item {
    padding: var(--ina-spacing-3, 0.75rem) var(--ina-spacing-4, 1rem);
    border-bottom: 1px solid var(--ina-stroke-primary);
    font-size: var(--ina-font-sm);
}
.sipadu-list__item:last-child { border-bottom: 0; }

.sipadu-empty {
    padding: var(--ina-spacing-6, 1.5rem);
    text-align: center;
    color: var(--ina-content-tertiary);
    font-size: var(--ina-font-sm);
}
.sipadu-empty i { font-size: 2rem; display: block; margin-bottom: 8px; color: var(--ina-stroke-secondary); }

/* Modal/drawer: hanya mengatur tampil/sembunyi, gaya visual dari IDDS */
.ina-modal[hidden], .ina-drawer[hidden] { display: none !important; }

/* Atribut `hidden` harus selalu menang atas utilitas tampilan Bootstrap.
   Utilitas seperti .d-flex / .d-block ditulis dengan `!important`, sehingga
   tanpa aturan ini elemen ber-atribut `hidden` (mis. panel bukti dukung yang
   sedang tidak dipilih) tetap terlihat. */
[hidden] { display: none !important; }

/* Akordeon: idds.css menyetel `.ina-accordion-card__content { height: 0 }`
   dan menyerahkan perhitungan tingginya kepada JS milik paket React IDDS.
   Frontend ini server-rendered (tanpa React), sehingga tinggi dikembalikan
   ke auto saat kartu berstatus terbuka. Tanpa aturan ini isi akordeon
   TIDAK AKAN PERNAH terlihat meski kelas --open sudah terpasang. */
.ina-accordion-card--open > .ina-accordion-card__content { height: auto; }

/* Penanda notifikasi belum dibaca. Kelas ini dilepas oleh assets/js/app.js
   saat notifikasi ditandai dibaca, jadi seluruh penandanya digantungkan di
   sini agar hilang bersamaan tanpa perlu memuat ulang halaman. */
.sipadu-notif-unread {
    background: var(--ina-primary-25);
    box-shadow: inset 3px 0 0 0 var(--ina-primary-primary);
}

/* Checkbox IDDS: cadangan bila JS belum sempat menyetel kelas status,
   sehingga kotak tetap terlihat benar saat dicentang. */
.ina-checkbox__input:checked + .ina-checkbox__box {
    background: var(--ina-primary-primary);
    border-color: var(--ina-primary-primary);
    color: var(--ina-base-white);
}
.ina-checkbox__input:focus-visible + .ina-checkbox__box {
    outline: 2px solid var(--ina-primary-primary);
    outline-offset: 2px;
}

/* Cetak: sembunyikan kerangka navigasi */
@media print {
    .sipadu-topbar, .sipadu-sidebar, .sipadu-bottom-nav { display: none !important; }
    .sipadu-main { padding: 0 !important; }
}

/* ---------------------------------------------------------------------------
   Pemilih berkas bukti dukung.
   IDDS belum menyediakan komponen <input type="file">, jadi dibuat di sini
   dengan token warna/radius IDDS supaya tetap sebidang dengan komponen lain.
   --------------------------------------------------------------------------- */
.sipadu-file-input {
    font-size: var(--ina-font-sm, 0.875rem);
    color: var(--ina-content-primary, inherit);
    background: var(--ina-background-primary, #fff);
    border: 1px solid var(--ina-stroke-primary, #d0d5dd);
    border-radius: var(--ina-radius-md, 8px);
    padding: 0.375rem 0.5rem;
    max-width: 100%;
}

.sipadu-file-input::file-selector-button {
    font: inherit;
    margin-right: 0.5rem;
    padding: 0.25rem 0.75rem;
    color: var(--ina-content-primary, inherit);
    background: var(--ina-background-tertiary, #f2f4f7);
    border: 1px solid var(--ina-stroke-primary, #d0d5dd);
    border-radius: var(--ina-radius-sm, 6px);
    cursor: pointer;
}

.sipadu-file-input:focus-visible {
    outline: 2px solid var(--ina-primary-primary, #1570ef);
    outline-offset: 1px;
}

/* Baris "berkas terunggah" pada panel bukti dukung. */
.sipadu-bukti-file {
    padding: 0.375rem 0;
    font-size: var(--ina-font-sm, 0.875rem);
}

/* Tenggat versi baca-saja (OPD & eksekutif): tenggat ditetapkan Sekretariat,
   jadi ditampilkan sebagai teks, bukan input yang dimatikan — input disabled
   terbaca seolah "boleh diisi tapi sedang terkunci", padahal peran ini memang
   tidak pernah berwenang mengubahnya. */
.sipadu-tenggat-readonly {
    min-height: 34px;
    font-size: var(--ina-font-sm, 0.875rem);
    font-weight: var(--ina-font-medium, 500);
    color: var(--ina-content-primary, inherit);
}

/*
 * Status penyimpanan tenggat.
 *
 * Tenggat disimpan otomatis saat isian selesai diubah — tanpa tombol, satu-
 * satunya cara pengguna tahu apakah perubahannya benar-benar tersimpan adalah
 * keterangan kecil ini. Karena itu ia menumpang pada baris helper-text yang
 * memang sudah ada di bawah isian, bukan elemen tambahan yang menggeser tata
 * letak setiap kali muncul dan hilang.
 */
.sipadu-simpan-status--proses { color: var(--ina-content-secondary, #555); }
.sipadu-simpan-status--galat  { color: var(--ina-content-negative, #b42318); }

/*
 * Penanda status kosong tidak boleh menyisakan ruang.
 *
 * Sebagian besar isian yang menyimpan otomatis tidak punya keterangan baku —
 * penandanya hanya terisi sesaat ("Menyimpan…", "Tersimpan."). Tanpa aturan
 * ini, baris kosongnya tetap menyita tinggi dan seluruh formulir jadi renggang
 * tanpa alasan yang terlihat.
 */
.js-autosimpan-status:empty { display: none; }

/*
 * Tombol aksi yang sebaris dengan isian.
 *
 * IDDS menetapkan tinggi .ina-text-field__wrapper--size-sm = 36px sedangkan
 * .ina-button--sm dibatasi max-height 32px. Selisih 4px itu yang membuat
 * tombol seperti "Terapkan" dan "Tambah Tahapan" tampak mengambang terhadap
 * isian di sebelahnya. Kelas ini dipakai HANYA pada tombol yang memang
 * bersebelahan dengan isian --size-sm; tombol yang berdiri sendiri tetap
 * memakai ukuran baku IDDS.
 */
/*
 * Kanvas diagram BPMN (halaman Bisnis Proses).
 *
 * Tingginya DITETAPKAN, bukan mengikuti isi: bpmn-js menggambar ke dalam wadah
 * berukuran tetap dan menghasilkan kanvas setinggi 0 bila wadahnya belum punya
 * tinggi saat importXML dijalankan — halaman akan tampak kosong tanpa galat apa
 * pun. Memakai vh supaya diagram selebar ini tetap terbaca di layar besar dan
 * tidak menelan seluruh layar di perangkat kecil.
 */
.sipadu-bpmn-kanvas {
    position: relative;
    height: 70vh;
    min-height: 420px;
    background: var(--ina-background-primary);
}
@media (max-width: 767.98px) {
    .sipadu-bpmn-kanvas { height: 55vh; min-height: 320px; }
}

.sipadu-bpmn-status {
    position: absolute;
    inset: 0;
    display: grid;
    place-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
    color: var(--ina-content-secondary);
    font-size: var(--ina-font-sm);
    text-align: center;
    padding: 1rem;
    z-index: 1;
}

/* Logo "BPMN.iO" bawaan penampil disembunyikan: di dalam aplikasi ini ia
   terbaca sebagai merek pihak ketiga di tengah layar resmi pemerintah.
   Atribusi tetap ada di assets/vendor/bpmn/README.txt beserta lisensinya. */
.sipadu-bpmn-kanvas .bjs-powered-by { display: none; }

.sipadu-aksi-sejajar {
    height: var(--sipadu-tinggi-isian-sm);
    max-height: var(--sipadu-tinggi-isian-sm);
    white-space: nowrap;
}

/* ---------------------------------------------------------------------------
   Dashboard Eksekutif
   --------------------------------------------------------------------------- */

/* Perubahan capaian antar-siklus. Warna dipakai untuk arah (naik/turun),
   BUKAN untuk baik/buruk — turun bisa saja wajar saat tahapan baru ditambahkan
   di tengah tahun sehingga penyebutnya bertambah. */
.sipadu-delta--naik { color: var(--ina-content-positive, #198754); }
.sipadu-delta--turun { color: var(--ina-content-negative, #dc2626); }

/* Baris capaian per OPD: nama + angka + bilah progres. */
.sipadu-capaian-baris { padding: var(--ina-spacing-2, 0.5rem) 0; }
.sipadu-capaian-baris + .sipadu-capaian-baris {
    border-top: 1px solid var(--ina-stroke-primary, #e5e7eb);
}
.sipadu-capaian-baris__nama {
    font-weight: var(--ina-font-medium, 500);
    overflow-wrap: anywhere;
}
.sipadu-capaian-baris__angka { white-space: nowrap; }

/* Baris siklus yang sedang dirinci di bawah tabel. */
.sipadu-row--aktif > .ina-table__cell {
    background: var(--ina-background-tertiary, #f2f4f7);
}

/* Catatan: .visually-hidden TIDAK didefinisikan di sini — bootstrap-utilities
   yang sudah dimuat di layout memang menyediakannya. Sempat ditambahkan ganda
   di sini karena pemeriksaan yang keliru; jangan ditambahkan lagi. */

/* Baris periode yang siklusnya sedang ditampilkan di panel bawahnya. */
.sipadu-list__item--aktif {
    background: var(--ina-background-tertiary, #f2f4f7);
    box-shadow: inset 3px 0 0 var(--ina-primary-primary, #0d5c8c);
}

.sipadu-periode-tahun {
    color: inherit;
    text-decoration: none;
    font-size: var(--ina-font-base, 1rem);
}
.sipadu-periode-tahun:hover { text-decoration: underline; }

/* Baris pemetaan indikator yang OPD pengampunya diubah tapi belum disimpan.
   Penanda visual saja — yang menentukan baris mana benar-benar dikirim ke API
   tetap perbandingan nilai semula di controller. */
.sipadu-row--berubah > .ina-table__cell {
    background: var(--ina-warning-surface, #fffaeb);
    box-shadow: inset 3px 0 0 var(--ina-content-warning, #d97706);
}

/* ---------------------------------------------------------------------------
   Penyempurna tabel (public/assets/js/sipadu-table.js)

   Gaya di sini HANYA melengkapi apa yang belum ada di IDDS. Ikon urut, kolom
   aksi lengket, dan tampilan header sudah disediakan design system
   (.ina-table__sort-*, .ina-table--sticky-last-column) — jangan ditulis ulang.
   --------------------------------------------------------------------------- */

.sipadu-table-toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
    /* Padding mendatar menyamai .sipadu-panel__header (1rem). Tabel hampir
       selalu berada di dalam .sipadu-panel__body--flush yang padding-nya nol,
       jadi tanpa ini kotak pencarian dan tombol ekspor menempel ke tepi panel. */
    padding: var(--ina-spacing-3, 0.75rem) var(--ina-spacing-4, 1rem);
    border-bottom: 1px solid var(--ina-stroke-primary);
}
.sipadu-table-toolbar__cari { flex: 0 1 280px; }
.sipadu-table-toolbar__hitung {
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
    white-space: nowrap;
}
.sipadu-table-toolbar__aksi { margin-left: auto; }

/* Header kolom yang bisa diurutkan. IDDS sudah menyiapkan kelas
   --sortable tapi tanpa penanda bahwa ia dapat diklik. */
.sipadu-th-sortable { cursor: pointer; }
.sipadu-th-sortable:hover { background: var(--ina-background-tertiary); }
.sipadu-th-sortable:focus-visible {
    outline: 2px solid var(--ina-primary-primary);
    outline-offset: -2px;
}

/* Tabel panjang: badan bergulir vertikal dengan header tetap terlihat.
   IDDS menyembunyikan batang gulir vertikal pada pembungkusnya, jadi di sini
   ia dinyalakan kembali — tanpa itu tabel terpotong tanpa cara menggulirnya. */
.sipadu-table-scroll-y {
    overflow-y: auto;
    max-height: 65vh;
}
.sipadu-table-scroll-y::-webkit-scrollbar:vertical { display: block; width: 8px; }

.sipadu-table-sticky-head .ina-table__header-cell {
    position: sticky;
    top: 0;
    z-index: 12; /* di atas kolom aksi lengket (z-index 10/11 dari IDDS) */
    background: var(--ina-background-primary);
}

/* Gulir mendatar dengan seret. Kursor berubah hanya saat tabel memang lebih
   lebar dari wadahnya — ditentukan JavaScript lewat kelas is-menyeret. */
.ina-table__scroll-wrapper.is-menyeret {
    cursor: grabbing;
    user-select: none;
}

/* Baris hasil pencarian disembunyikan, BUKAN dihapus dari DOM, supaya input di
   dalamnya tetap ikut terkirim. Aturan [hidden] global sudah menanganinya —
   baris ini hanya penegasan terhadap display:table-row bawaan peramban. */
.ina-table__body .ina-table__row[hidden] { display: none !important; }

/* Kolom aksi lengket: beri bayangan tipis di tepi kirinya supaya terbaca
   sebagai kolom yang MENGAMBANG di atas isi yang sedang digulir. Tanpa ini
   teks kolom sebelahnya seperti terpotong begitu saja, bukan tergulir di
   baliknya. IDDS hanya menyetel background-color pada kolom ini. */
.ina-table--sticky-last-column .ina-table__header-cell:last-child,
.ina-table--sticky-last-column .ina-table__cell:last-child {
    box-shadow: -6px 0 6px -6px rgb(0 0 0 / 18%);
}

/* ===================================================================
   TOAST
   Melengkapi .ina-toast IDDS (yang hanya mengurus kotak + warnanya) dengan
   yang tidak disediakannya: gerak masuk/keluar, bilah waktu, dan penghitung
   pesan kembar. Semua penamaan memakai awalan sipadu- supaya jelas mana yang
   milik design system dan mana tambahan aplikasi.
   =================================================================== */

/* Wadah toast: kelas posisi IDDS sudah menaruhnya di kanan bawah; yang
   ditambahkan di sini hanya mengangkatnya di atas navigasi bawah pada layar
   sempit, supaya pesan tidak pernah tertutup menu. */
.sipadu-toast-host {
    z-index: 1100;
    max-width: min(92vw, 420px);
}
@media (max-width: 991.98px) {
    .sipadu-toast-host { bottom: calc(var(--sipadu-bottom-nav-height, 64px) + 0.75rem); }
}

.sipadu-toast {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: var(--ina-spacing-3, 0.75rem);
    overflow: hidden; /* menahan bilah waktu di dalam sudut membulatnya */

    /* Keadaan AWAL (belum diberi kelas --masuk): sedikit tergeser dan
       mengecil. Toast yang langsung muncul jadi terbaca sebagai kedipan
       layar, bukan sebagai sesuatu yang datang. */
    opacity: 0;
    transform: translateY(0.75rem) scale(0.96);
    transition: opacity 0.22s ease-out, transform 0.22s cubic-bezier(0.16, 1, 0.3, 1);
}
.sipadu-toast--masuk { opacity: 1; transform: none; }
.sipadu-toast--keluar {
    opacity: 0;
    transform: translateX(1.5rem) scale(0.98);
    transition: opacity 0.2s ease-in, transform 0.2s ease-in;
}

.sipadu-toast .ina-toast__icon { flex: 0 0 auto; margin-top: 0.1rem; }
.sipadu-toast .ina-toast__content { flex: 1 1 auto; min-width: 0; }
.sipadu-toast .ina-toast__title {
    margin: 0;
    font-weight: var(--ina-font-semibold, 600);
    line-height: 1.35;
}
.sipadu-toast .ina-toast__description {
    margin: 0.1rem 0 0;
    /* Mewarisi warna state (hijau/merah) dari .ina-toast, bukan dipaksa ke abu
       netral: di atas latar bertona --style-outline, abu justru menurunkan
       kontras. Opasitas yang menurunkan penekanannya, bukan warnanya. */
    color: inherit;
    opacity: 0.88;
    line-height: 1.45;
    /* Pesan panjang (mis. galat dari API) dibiarkan membungkus, tetapi dibatasi
       tiga baris: satu paragraf penuh di pojok layar tidak akan dibaca. */
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    overflow-wrap: anywhere;
}
.sipadu-toast__jumlah { flex: 0 0 auto; align-self: center; }
.sipadu-toast .ina-toast__close-button { flex: 0 0 auto; }

/* Bilah waktu: menunjukkan sisa waktu baca, dan BERHENTI saat kursor berada di
   atas toast atau saat tombol tutupnya difokuskan lewat papan ketik. Pesan
   yang lenyap di tengah kalimat adalah alasan orang berhenti membacanya. */
.sipadu-toast__bilah {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 3px;
    background: var(--ina-background-secondary, rgb(0 0 0 / 6%));
}
.sipadu-toast__bilah-isi {
    display: block;
    height: 100%;
    width: 100%;
    transform-origin: left center;
    background: var(--ina-content-positive, #16a34a);
    animation: sipadu-toast-mundur var(--sipadu-toast-durasi, 5000ms) linear forwards;
}
.sipadu-toast.ina-toast--state-destructive .sipadu-toast__bilah-isi {
    background: var(--ina-content-negative, #dc2626);
}
.sipadu-toast:hover .sipadu-toast__bilah-isi,
.sipadu-toast:focus-within .sipadu-toast__bilah-isi { animation-play-state: paused; }

@keyframes sipadu-toast-mundur {
    from { transform: scaleX(1); }
    to   { transform: scaleX(0); }
}

/* Pengguna yang meminta gerak seminimal mungkin tetap mendapat toast yang
   utuh dan tetap tertutup sendiri — yang dihilangkan hanya geraknya. Bilah
   waktunya dipertahankan karena ia informasi, bukan hiasan; hanya saja ia
   tidak lagi bergerak mulus. */
@media (prefers-reduced-motion: reduce) {
    .sipadu-toast,
    .sipadu-toast--keluar { transition: none; transform: none; }
    .sipadu-toast { opacity: 1; }
    .sipadu-toast--keluar { opacity: 0; }
    .sipadu-toast__bilah-isi { animation-timing-function: step-end; }
}

/* ===================================================================
   BERITA HALAMAN LOGIN
   Dua gaya tampilan yang dipilih pengelola (Admin/Sekretariat):
     .sipadu-berita--film  -> gulungan pita film, bergerak mendatar (murni CSS)
     .sipadu-berita--kurva -> kartu melengkung, berputar (butuh berita.js)

   Keduanya hidup DI DALAM .sipadu-auth__aside, dan itu disengaja: panel
   tersebut sudah display:none di bawah 992px, jadi syarat "hanya tampil di
   layar desktop" terpenuhi tanpa satu pun media query tambahan.
   =================================================================== */

.sipadu-berita {
    margin-top: 2rem;
    /* Panel kiri bisa selebar 700px lebih pada layar besar. Tanpa batas ini,
       kartu berita yang dipusatkan (gaya kurva) berdiri sendirian di tengah
       ruang kosong, jauh dari judul "Berita & Pengumuman" yang rata kiri —
       terbaca seperti dua elemen yang tidak berhubungan. Dengan batas ini
       keduanya tetap satu kolom. */
    width: 100%;
    max-width: 480px;
    /* Panel login berlatar foto gelap; seluruh teks di sini putih. */
    color: var(--ina-base-white);
    /* Ikut menahan isi yang lebih lebar dari wadahnya (lihat catatan
       min-width pada .sipadu-auth__aside di app/Views/auth/login.php). */
    min-width: 0;
}
.sipadu-berita__kepala {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.75rem;
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-semibold);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: rgb(255 255 255 / 72%);
}

/* Layar laptop pendek: formulir login dan identitas instansi lebih penting
   daripada berita. Disembunyikan, bukan dipaksa mengecil sampai tak terbaca. */
@media (max-height: 720px) {
    .sipadu-berita { display: none; }
}

/* ---------- Gaya 1: GULUNGAN PITA FILM ---------- */

.sipadu-film {
    position: relative;
    max-width: 100%;
    overflow: hidden;
    border-radius: 10px;
    background: rgb(8 12 24 / 62%);
    /* Perforasi film digambar sebagai dua pita bertitik di tepi atas & bawah.
       repeating-linear-gradient, bukan puluhan elemen kosong: hiasan tidak
       pantas menambah simpul DOM yang harus dibaca teknologi bantu. */
    border-top: 14px solid transparent;
    border-bottom: 14px solid transparent;
    background-image:
        repeating-linear-gradient(to right,
            rgb(255 255 255 / 78%) 0 9px, transparent 9px 22px),
        repeating-linear-gradient(to right,
            rgb(255 255 255 / 78%) 0 9px, transparent 9px 22px),
        linear-gradient(rgb(8 12 24 / 62%), rgb(8 12 24 / 62%));
    background-repeat: repeat-x, repeat-x, no-repeat;
    background-size: 22px 6px, 22px 6px, 100% 100%;
    /* Lubang perforasi berada DI DALAM pita border 14px di atas & bawah.
       Koordinatnya dihitung dari border-box (lihat background-origin), jadi
       4px = tepat di tengah border atas, dan calc(100% - 10px) = tengah border
       bawah. Nilai negatif akan menaruhnya di luar kotak — tidak terlihat. */
    background-position: 6px 4px, 6px calc(100% - 10px), 0 0;
    background-origin: border-box, border-box, padding-box;
    background-clip: border-box, border-box, padding-box;
    backdrop-filter: blur(2px);
}

.sipadu-film__pita {
    display: flex;
    width: max-content;
    /* Bergeser tepat SETENGAH lebar (karena isinya digandakan dua kali), lalu
       kembali ke nol. Di titik itu salinan kedua persis menempati posisi
       salinan pertama, sehingga perulangannya tidak terlihat. */
    animation: sipadu-film-gulir var(--sipadu-film-durasi, 40s) linear infinite;
}
/* Berhenti saat disentuh kursor — pita yang terus berjalan tidak mungkin
   dibaca sampai habis, apalagi diklik. */
.sipadu-film:hover .sipadu-film__pita,
.sipadu-film:focus-within .sipadu-film__pita { animation-play-state: paused; }

@keyframes sipadu-film-gulir {
    from { transform: translateX(0); }
    to   { transform: translateX(-50%); }
}

.sipadu-film__gulung { display: flex; flex: 0 0 auto; }

.sipadu-film__bingkai {
    flex: 0 0 auto;
    width: 208px;
    display: block;
    padding: 8px;
    margin: 8px 4px;
    border-radius: 6px;
    text-decoration: none;
    color: inherit;
    background: rgb(255 255 255 / 8%);
    border: 1px solid rgb(255 255 255 / 12%);
    transition: background 0.2s ease, transform 0.2s ease;
}
a.sipadu-film__bingkai:hover {
    background: rgb(255 255 255 / 16%);
    transform: translateY(-2px);
}

.sipadu-film__gambar {
    display: block;
    aspect-ratio: 16 / 9;
    border-radius: 4px;
    overflow: hidden;
    background: rgb(255 255 255 / 10%);
}
.sipadu-film__gambar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sipadu-film__gambar-kosong {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    font-size: 1.5rem;
    color: rgb(255 255 255 / 45%);
}

.sipadu-film__teks { display: block; margin-top: 0.5rem; }
.sipadu-film__tanggal {
    display: block;
    font-size: 0.68rem;
    color: rgb(255 255 255 / 60%);
}
.sipadu-film__judul {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    line-height: 1.3;
}
.sipadu-film__ringkas {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin-top: 0.15rem;
    font-size: 0.72rem;
    line-height: 1.35;
    color: rgb(255 255 255 / 70%);
}

/* ---------- Gaya 2: KARTU MELENGKUNG (round robin) ---------- */

.sipadu-kurva { position: relative; }

.sipadu-kurva__panggung {
    position: relative;
    /* Dinaikkan dari 190px. Ukuran lama dirancang untuk panel yang jauh lebih
       sempit; di panel login yang sebenarnya, kartunya terbaca sebagai kartu
       nama, bukan sebagai berita — gambarnya terlalu kecil untuk dikenali. */
    height: 268px;
    /* perspective membuat kemiringan kartu terbaca sebagai kedalaman, bukan
       sekadar gambar yang dimiringkan. */
    perspective: 900px;
}

.sipadu-kurva__kartu {
    position: absolute;
    left: 50%;
    top: 0;
    /* Lebar kartu mengikuti panggung (yang sudah dibatasi .sipadu-berita),
       bukan angka tetap 246px — supaya kartunya ikut melebar di layar besar
       tanpa pernah melampaui panel. translateX(-50%) menggantikan margin-left
       negatif yang dulu harus dihitung tangan dari lebar tetap itu. */
    width: min(380px, 86%);
    height: 100%;
    /* border-box WAJIB: tanpa ini `height: 100%` dihitung sebagai tinggi ISI,
       lalu padding 0.75rem dan border ditambahkan DI LUARNYA — kartunya
       menjadi 26px lebih tinggi daripada panggungnya dan menindih keterangan
       di dasar panel. Terlihat saat dirender, tidak saat dibaca. */
    box-sizing: border-box;
    display: flex;
    gap: 0.6rem;
    padding: 0.75rem;
    border-radius: 12px;
    text-decoration: none;
    color: inherit;
    background: rgb(10 16 32 / 72%);
    border: 1px solid rgb(255 255 255 / 16%);
    box-shadow: 0 18px 30px -18px rgb(0 0 0 / 75%);
    backdrop-filter: blur(3px);
    flex-direction: column;

    /* --o = jarak bertanda dari kartu aktif (-2..2), --a = nilai mutlaknya.
       Keduanya disetel berita.js. CSS abs() belum bisa diandalkan di semua
       peramban yang dipakai instansi, jadi nilai mutlaknya dihitung di JS. */
    transform:
        translateX(-50%)
        translateX(calc(var(--o, 0) * 42%))
        translateY(calc(var(--a, 0) * 16px))
        rotate(calc(var(--o, 0) * 7deg))
        scale(calc(1 - var(--a, 0) * 0.13));
    z-index: calc(10 - var(--a, 0));
    opacity: 0;
    pointer-events: none;
    transition:
        transform 0.55s cubic-bezier(0.22, 1, 0.36, 1),
        opacity 0.4s ease;
}

/* Tanpa JavaScript hanya kartu pertama yang tampil — bukan tumpukan kartu
   yang saling menimpa. Halaman login harus tetap masuk akal walau skripnya
   gagal dimuat. */
.sipadu-kurva__kartu.is-aktif { opacity: 1; pointer-events: auto; }
.sipadu-kurva__kartu.is-tampak { opacity: calc(1 - var(--a, 0) * 0.3); }
.sipadu-kurva__kartu.is-tampak.is-aktif { opacity: 1; }

.sipadu-kurva__gambar {
    display: block;
    /* flex:1 1 auto + min-height:0 — gambar mengambil SISA tinggi kartu
       sesudah teksnya, jadi menaikkan tinggi panggung otomatis memperbesar
       gambarnya. Dengan tinggi tetap seperti sebelumnya, kartu yang lebih
       tinggi hanya menambah ruang kosong di bawah gambar. */
    flex: 1 1 auto;
    min-height: 96px;
    border-radius: 8px;
    overflow: hidden;
    background: rgb(255 255 255 / 10%);
}
.sipadu-kurva__gambar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sipadu-kurva__gambar-kosong {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    font-size: 1.6rem;
    color: rgb(255 255 255 / 45%);
}

/* flex:0 0 auto — teks memakai tinggi seperlunya; sisanya milik gambar. */
.sipadu-kurva__teks { display: block; min-width: 0; flex: 0 0 auto; }
.sipadu-kurva__tanggal { display: block; font-size: 0.68rem; color: rgb(255 255 255 / 60%); }
.sipadu-kurva__judul {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    line-height: 1.3;
}
.sipadu-kurva__ringkas {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin-top: 0.15rem;
    font-size: 0.72rem;
    line-height: 1.35;
    color: rgb(255 255 255 / 70%);
}

.sipadu-kurva__titik {
    display: flex;
    justify-content: center;
    gap: 0.4rem;
    margin-top: 0.85rem;
}
.sipadu-kurva__titik-btn {
    width: 7px;
    height: 7px;
    padding: 0;
    border: 0;
    border-radius: 999px;
    cursor: pointer;
    background: rgb(255 255 255 / 35%);
    transition: width 0.3s ease, background 0.3s ease;
}
.sipadu-kurva__titik-btn.is-aktif { width: 20px; background: var(--ina-base-white); }

/* Gerak otomatis dimatikan bagi yang memintanya. Isinya tidak dikurangi: pita
   film berhenti pada posisi awal dan kartu tetap bisa dipindah lewat titiknya,
   jadi seluruh beritanya tetap bisa dibaca — hanya tidak bergerak sendiri.
   berita.js membaca preferensi yang sama dan berhenti memutar otomatis. */
@media (prefers-reduced-motion: reduce) {
    .sipadu-film__pita { animation: none; }
    .sipadu-kurva__kartu { transition: none; }
}

/* ---------- Pemilih gaya tampilan berita (layar pengelolaan) ---------- */
/* Kartu pilihan dengan pratinjau kecil, bukan dua radio bertuliskan "film" dan
   "kurva". Yang dipilih di sini adalah perbedaan VISUAL, jadi bentuknya harus
   ikut terlihat saat memilih — kalau tidak, satu-satunya cara mengetahuinya
   adalah mencoba lalu membuka halaman login di jendela lain. */
.sipadu-pilihan-gaya {
    display: flex;
    gap: 0.9rem;
    align-items: flex-start;
    /* JANGAN kembalikan ke height:100%.
       Kartu ini anak dari kolom grid (flex item ber-align-items:stretch).
       Tinggi kolomnya sendiri baru diketahui SETELAH isinya ditata, sehingga
       height:100% di sini melingkar: peramban memakai tinggi kolom yang
       dihitung dari kartu LAIN yang lebih pendek, kartunya melimpah keluar
       panel, dan overflow:hidden milik .sipadu-panel memotongnya.
       flex:1 membuat kartunya MENGISI kolom tanpa ikut menentukannya. */
    flex: 1 1 auto;
    padding: 0.9rem;
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 12px);
    cursor: pointer;
    background: var(--ina-background-primary);
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.sipadu-pilihan-gaya:hover { border-color: var(--ina-primary-400); }
.sipadu-pilihan-gaya.is-terpilih {
    border-color: var(--ina-primary-600);
    box-shadow: 0 0 0 2px var(--ina-primary-100, rgb(25 107 205 / 18%));
}
/* Radio-nya tetap ADA di DOM (bukan display:none) supaya masih bisa dijangkau
   keyboard dan dibacakan pembaca layar; yang dilakukan hanya memindahkannya
   keluar pandangan. */
.sipadu-pilihan-gaya input {
    position: absolute;
    opacity: 0;
    width: 1px;
    height: 1px;
}
.sipadu-pilihan-gaya:focus-within { border-color: var(--ina-primary-600); }

.sipadu-pilihan-gaya__teks { display: flex; flex-direction: column; gap: 0.2rem; min-width: 0; }
.sipadu-pilihan-gaya__teks .ina-badge { align-self: flex-start; }

.sipadu-pilihan-gaya__pratinjau {
    flex: 0 0 auto;
    position: relative;
    width: 96px;
    height: 62px;
    border-radius: 8px;
    background: linear-gradient(155deg, #0c2860, #041230);
    overflow: hidden;
}
.sipadu-pilihan-gaya__pratinjau span {
    position: absolute;
    background: rgb(255 255 255 / 70%);
    border-radius: 2px;
}
/* Pratinjau "film": tiga bingkai sejajar. */
.sipadu-pilihan-gaya__pratinjau--film span { top: 18px; width: 24px; height: 26px; }
.sipadu-pilihan-gaya__pratinjau--film span:nth-child(1) { left: 6px; }
.sipadu-pilihan-gaya__pratinjau--film span:nth-child(2) { left: 36px; }
.sipadu-pilihan-gaya__pratinjau--film span:nth-child(3) { left: 66px; opacity: 0.5; }
/* Pratinjau "kurva": satu kartu tegak di tengah, dua tetangga miring. */
.sipadu-pilihan-gaya__pratinjau--kurva span { top: 16px; width: 26px; height: 30px; }
.sipadu-pilihan-gaya__pratinjau--kurva span:nth-child(1) { left: 4px; transform: rotate(-12deg) translateY(6px); opacity: 0.45; }
.sipadu-pilihan-gaya__pratinjau--kurva span:nth-child(2) { left: 35px; }
.sipadu-pilihan-gaya__pratinjau--kurva span:nth-child(3) { left: 66px; transform: rotate(12deg) translateY(6px); opacity: 0.45; }

/* Pratinjau gambar berita di layar pengelolaan. */
.sipadu-berita-thumb {
    aspect-ratio: 16 / 9;
    border-radius: 8px;
    overflow: hidden;
    background: var(--ina-background-secondary);
    border: 1px solid var(--ina-stroke-primary);
}
.sipadu-berita-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sipadu-berita-thumb__kosong {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    font-size: 1.6rem;
    color: var(--ina-content-tertiary);
}

/* ---------- Baris daftar berita ---------- */
/* Tiga kolom: gambar (lebar tetap) — isi (melar) — aksi (selebar isinya).
   Gambarnya diberi lebar tetap supaya judul semua baris mulai pada garis yang
   sama; daftar yang judulnya bergeser-geser jauh lebih sulit dipindai. */
.sipadu-berita-baris {
    display: flex;
    align-items: flex-start;
    gap: var(--ina-spacing-4, 1rem);
}
.sipadu-berita-baris__gambar {
    flex: 0 0 96px;
    width: 96px;
    aspect-ratio: 16 / 9;
    border-radius: 6px;
    overflow: hidden;
    background: var(--ina-background-secondary);
    border: 1px solid var(--ina-stroke-primary);
}
.sipadu-berita-baris__gambar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sipadu-berita-baris__kosong {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    color: var(--ina-content-tertiary);
}
/* min-width:0 wajib: tanpa itu kolom isi melebar mengikuti judul terpanjang
   (min-width bawaan flex item = min-content) dan mendorong kolom aksi keluar. */
.sipadu-berita-baris__isi { flex: 1 1 auto; min-width: 0; }
.sipadu-berita-baris__judul {
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-primary);
    margin-top: 2px;
}
/* Kutipan dipangkas dua baris: di daftar yang dicari bentuk beritanya, bukan
   isinya — selengkapnya ada di halaman ubah. */
.sipadu-berita-baris__kutipan {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin-top: 2px;
}
.sipadu-berita-baris__aksi {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.35rem;
    flex: 0 0 auto;
}
.sipadu-berita-baris__urut { display: flex; gap: 0.15rem; margin-right: 0.15rem; }
/* Tombol naik/turun hanya berisi ikon, jadi ukurannya harus dipaksa: bila font
   ikon gagal dimuat (pernah terjadi — Tabler gagal diam-diam tanpa galat),
   tombol tanpa ukuran tetap menyusut jadi sasaran klik 16px yang praktis tidak
   bisa ditekan. Kotak 32px tetap ada isinya atau tidak. */
.sipadu-berita-baris__urut .ina-button {
    width: 32px;
    min-width: 32px;
    height: 32px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

/* Hapus: satu-satunya aksi yang tidak bisa dibatalkan, jadi warnanya baru
   muncul saat kursor benar-benar berada di atasnya. Redup saat diam agar tidak
   menarik tangan lebih dulu daripada Ubah. */
.sipadu-aksi-hapus { color: var(--ina-content-secondary); }
.sipadu-aksi-hapus:hover, .sipadu-aksi-hapus:focus-visible { color: var(--ina-red-600); }

@media (max-width: 767.98px) {
    /* Di layar sempit tiga kolom tidak muat: aksinya turun ke bawah dan
       melebar penuh, sejajar dengan isi (bukan di bawah gambar). */
    .sipadu-berita-baris { flex-wrap: wrap; }
    .sipadu-berita-baris__isi { flex: 1 1 200px; }
    .sipadu-berita-baris__aksi { flex: 1 0 100%; }
}

/* ---------- Penyunting teks kaya (WYSIWYG) ---------- */
/* Dibuat menyatu dengan .ina-text-field IDDS: bingkai, radius dan warna fokus
   mengikuti isian teks lain, supaya tidak terlihat seperti komponen asing yang
   ditempel di tengah formulir. */
.sipadu-wysiwyg {
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-md, 8px);
    background: var(--ina-background-primary);
    overflow: hidden;
}
.sipadu-wysiwyg:focus-within { border-color: var(--ina-primary-600); }

.sipadu-wysiwyg__bar {
    display: flex;
    flex-wrap: wrap;
    gap: 0.15rem;
    padding: 0.3rem;
    border-bottom: 1px solid var(--ina-stroke-primary);
    background: var(--ina-background-secondary);
}
.sipadu-wysiwyg__tombol {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 28px;
    padding: 0;
    border: 0;
    border-radius: 6px;
    background: transparent;
    color: var(--ina-content-secondary);
    cursor: pointer;
    font-size: 1rem;
}
.sipadu-wysiwyg__tombol:hover { background: var(--ina-background-tertiary, rgb(0 0 0 / 6%)); color: var(--ina-content-primary); }

.sipadu-wysiwyg__area {
    min-height: 92px;
    max-height: 320px;
    overflow-y: auto;
    padding: 0.6rem 0.75rem;
    font-size: var(--ina-font-sm);
    line-height: 1.55;
    outline: none;
}
/* Placeholder untuk contenteditable — tidak ada atribut bawaan untuk ini. */
.sipadu-wysiwyg__area:empty::before {
    content: attr(data-placeholder);
    color: var(--ina-content-tertiary);
}
.sipadu-wysiwyg__area p { margin: 0 0 0.5rem; }
.sipadu-wysiwyg__area p:last-child { margin-bottom: 0; }
.sipadu-wysiwyg__area ul,
.sipadu-wysiwyg__area ol { margin: 0 0 0.5rem; padding-left: 1.4rem; }

/* Textarea aslinya tetap ADA di DOM — ia yang dibaca simpan-otomatis dan yang
   ikut terkirim pada form biasa. Yang dilakukan hanya menyembunyikannya. */
.sipadu-wysiwyg__sumber { display: none !important; }

/* Isi berita yang sudah dirender (halaman detail di layar login). */
.sipadu-berita-isi p { margin: 0 0 0.7rem; }
.sipadu-berita-isi p:last-child { margin-bottom: 0; }
.sipadu-berita-isi ul,
.sipadu-berita-isi ol { margin: 0 0 0.7rem; padding-left: 1.3rem; }
.sipadu-berita-isi li { margin-bottom: 0.25rem; }
.sipadu-berita-isi a { color: inherit; text-decoration: underline; }

/* ---------- Halaman detail berita (panel kiri layar login) ---------- */
/* Panel kiri berganti isi; formulir di kanan tidak tersentuh. Gulir sendiri
   diberikan di sini karena isi pengumuman bisa panjang, sedangkan panelnya
   setinggi layar — tanpa ini bagian bawah beritanya terpotong diam-diam. */
.sipadu-berita-detail {
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow-y: auto;
    padding-right: 0.5rem;
}
.sipadu-berita-detail__kembali {
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    margin-bottom: 1.25rem;
    padding: 0.35rem 0.75rem 0.35rem 0.5rem;
    border-radius: 999px;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-base-white);
    text-decoration: none;
    background: rgb(255 255 255 / 12%);
    border: 1px solid rgb(255 255 255 / 20%);
    transition: background 0.15s ease;
}
.sipadu-berita-detail__kembali:hover { background: rgb(255 255 255 / 22%); }
/* Tombol kembali ada DUA KALI — di atas dan di bawah isi. Pada pengumuman
   panjang, yang di atas sudah tergulir hilang justru ketika orang selesai
   membaca dan ingin kembali. */
.sipadu-berita-detail__kembali--bawah { margin: 1.25rem 0 0; }

.sipadu-berita-detail__gambar {
    aspect-ratio: 16 / 9;
    max-height: 230px;
    border-radius: 12px;
    overflow: hidden;
    background: rgb(255 255 255 / 10%);
    margin-bottom: 1rem;
}
.sipadu-berita-detail__gambar img { width: 100%; height: 100%; object-fit: cover; display: block; }

.sipadu-berita-detail__tanggal {
    margin: 0 0 0.35rem;
    font-size: var(--ina-font-xs);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: rgb(255 255 255 / 70%) !important;
}
/* Ukuran judul disetel eksplisit: .sipadu-auth__aside h1 di halaman login
   memakai ukuran 4xl untuk tagline instansi, dan itu terlalu besar untuk judul
   berita yang lazimnya satu kalimat penuh. */
.sipadu-berita-detail__judul {
    font-size: var(--ina-font-xl) !important;
    line-height: 1.3;
    margin: 0 0 0.9rem !important;
}
.sipadu-berita-detail__isi {
    font-size: var(--ina-font-sm);
    color: rgb(255 255 255 / 88%);
}
.sipadu-berita-detail__isi p { color: inherit !important; font-size: inherit !important; }
.sipadu-berita-detail__tautan { align-self: flex-start; margin-top: 1.1rem; }

/* ---------- Capaian per OPD (dashboard) ---------- */
/* Tiga kolom: nama, bilah + rincian, persentase. Bilahnya diberi ruang paling
   besar karena ia yang dibaca sekilas; angka persen diletakkan di ujung kanan
   dengan lebar tetap supaya seluruh baris sejajar dan mudah dibandingkan. */
.sipadu-opd-baris {
    display: flex;
    align-items: center;
    gap: 1rem;
    flex-wrap: wrap;
}
.sipadu-opd-baris__nama {
    flex: 1 1 200px;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}
.sipadu-opd-baris__judul {
    font-weight: var(--ina-font-semibold);
    /* Nama OPD panjang-panjang ("Dinas Komunikasi, Informatika, Persandian
       dan Statistik") — dibiarkan membungkus, bukan dipotong: nama yang
       terpenggal membuat dua OPD yang berawalan sama tak bisa dibedakan. */
    overflow-wrap: anywhere;
}
.sipadu-opd-baris__bar { flex: 2 1 280px; min-width: 0; }
.sipadu-opd-baris__rincian {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem;
    margin-top: 0.35rem;
    font-size: var(--ina-font-xs);
}
.sipadu-opd-baris__persen {
    flex: 0 0 56px;
    text-align: right;
    font-size: var(--ina-font-lg);
    font-weight: var(--ina-font-semibold);
    font-variant-numeric: tabular-nums;
}

.sipadu-tabel-catatan {
    margin: 0;
    padding: var(--ina-spacing-2, 0.5rem) var(--ina-spacing-4, 1rem);
    border-bottom: 1px solid var(--ina-stroke-primary);
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
}

/* Layar sempit: persentase naik menyejajari nama OPD, bilahnya turun sendiri
   selebar penuh. Tanpa ini flex-wrap menjatuhkan angka persennya ke pojok kiri
   bawah baris — jauh dari nama yang dijelaskannya, dan tidak lagi sejajar
   antar-baris sehingga tidak bisa dibandingkan sekilas. */
@media (max-width: 767.98px) {
    .sipadu-opd-baris { gap: 0.5rem 0.75rem; }
    .sipadu-opd-baris__nama { flex: 1 1 auto; order: 1; }
    .sipadu-opd-baris__persen { flex: 0 0 auto; order: 2; font-size: var(--ina-font-base); }
    .sipadu-opd-baris__bar { flex: 1 1 100%; order: 3; }
}

/* ---------- Capaian 7 Aspek PEMDI ---------- */
.sipadu-aspek-nilai {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem 1.25rem;
    padding-bottom: 0.9rem;
    margin-bottom: 0.25rem;
    border-bottom: 1px solid var(--ina-stroke-primary);
}
.sipadu-aspek-nilai__angka {
    font-size: 2.5rem;
    line-height: 1;
    font-weight: var(--ina-font-bold);
    font-variant-numeric: tabular-nums;
    color: var(--ina-content-primary);
}
.sipadu-aspek-nilai__label {
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
    margin-top: 0.2rem;
}
.sipadu-aspek-nilai__ket {
    flex: 1 1 280px;
    margin: 0;
    font-size: var(--ina-font-xs);
    line-height: 1.5;
}

/* Tinggi tetap: Chart.js menggambar mengikuti ukuran wadahnya, dan wadah tanpa
   tinggi pasti menghasilkan kanvas setinggi nol. */
.sipadu-radar {
    position: relative;
    height: 320px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.sipadu-radar canvas { max-height: 320px; }

/* Daftar aspek memakai anatomi yang sama dengan capaian per OPD — dua panel
   yang menjawab pertanyaan sejenis sebaiknya dibaca dengan cara yang sama. */
.sipadu-aspek-daftar { border-top: 1px solid var(--ina-stroke-primary); }
.sipadu-aspek-baris {
    display: flex;
    align-items: center;
    gap: 0.9rem;
    flex-wrap: wrap;
}
.sipadu-aspek-baris__nama {
    flex: 1 1 180px;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}
.sipadu-aspek-baris__judul {
    font-weight: var(--ina-font-semibold);
    overflow-wrap: anywhere;
}
.sipadu-aspek-baris__bar { flex: 1 1 200px; min-width: 0; }
.sipadu-aspek-baris__rincian {
    margin-top: 0.3rem;
    font-size: var(--ina-font-xs);
}
.sipadu-aspek-baris__persen {
    flex: 0 0 48px;
    text-align: right;
    font-weight: var(--ina-font-semibold);
    font-variant-numeric: tabular-nums;
}
@media (max-width: 767.98px) {
    .sipadu-aspek-baris { gap: 0.5rem 0.75rem; }
    .sipadu-aspek-baris__nama { flex: 1 1 auto; order: 1; }
    .sipadu-aspek-baris__persen { flex: 0 0 auto; order: 2; }
    .sipadu-aspek-baris__bar { flex: 1 1 100%; order: 3; }
}

/* Baris prioritas di atas daftar aspek: kesimpulan, bukan sekadar keterangan —
   jadi tintanya lebih tegas daripada .sipadu-tabel-catatan biasa. */
.sipadu-aspek-prioritas {
    color: var(--ina-content-primary);
    font-size: var(--ina-font-sm);
    border-top: 1px solid var(--ina-stroke-primary);
}


/* =====================================================================
 * Beranda — halaman ringkas satu halaman (/beranda)
 * =====================================================================
 * Warna di sini dipakai untuk MENANDAI, bukan menghias. Tiap warna punya
 * arti yang sama dengan warna batang progres di seluruh aplikasi:
 * hijau = sudah terpenuhi, kuning = sedang berjalan/perlu dikerjakan,
 * merah = jauh tertinggal, biru = penanda waktu/informasi. Menambah warna
 * baru berarti menambah arti baru — jangan menambahnya hanya agar ramai.
 * ===================================================================== */

/* ---------- Kepala halaman ---------- */
.sipadu-beranda-hero {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--ina-spacing-3, 0.75rem);
    padding: var(--ina-spacing-5, 1.25rem) var(--ina-spacing-6, 1.5rem);
    margin-bottom: var(--ina-spacing-4, 1rem);
    border-radius: var(--ina-radius-lg, 12px);
    background: linear-gradient(135deg, var(--ina-primary-700) 0%, var(--ina-primary-500) 100%);
    color: var(--ina-base-white);
}
.sipadu-beranda-hero__judul {
    margin: 0;
    font-size: var(--ina-font-2xl);
    font-weight: var(--ina-font-bold);
    color: var(--ina-base-white);
}
.sipadu-beranda-hero__sub {
    margin: 0.25rem 0 0;
    font-size: var(--ina-font-sm);
    /* Putih 82%, bukan token teks sekunder: latarnya gelap, sedangkan token
       sekunder dirancang untuk latar terang dan akan nyaris hilang di sini. */
    color: rgb(255 255 255 / 82%);
}
.sipadu-beranda-hero__lencana {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.35rem 0.75rem;
    border-radius: var(--ina-radius-full, 999px);
    background: rgb(255 255 255 / 16%);
    border: 1px solid rgb(255 255 255 / 28%);
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    white-space: nowrap;
}

/* ---------- Ikon berbingkai pada kepala panel ---------- */
/* Kotak kecil berwarna di kiri judul panel. Tujuh panel putih berturut-turut
   sulit dibedakan saat digulir cepat; penanda warna di kepala tiap panel
   memberi titik pegangan mata tanpa mewarnai seluruh panelnya. */
.sipadu-ikon-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.75rem;
    height: 1.75rem;
    border-radius: 8px;
    margin-right: 0.15rem;
    font-size: 1rem;
    vertical-align: -0.45rem;
}
.sipadu-ikon-chip--brand      { background: var(--ina-primary-50);  color: var(--ina-primary-700); }
.sipadu-ikon-chip--info       { background: var(--ina-blue-50);     color: var(--ina-blue-700); }
.sipadu-ikon-chip--sukses     { background: var(--ina-green-50);    color: var(--ina-green-700); }
.sipadu-ikon-chip--peringatan { background: var(--ina-yellow-50);   color: var(--ina-yellow-700); }
.sipadu-ikon-chip--ungu       { background: var(--ina-purple-50);   color: var(--ina-purple-700); }

/* Panel dengan garis aksen di tepi atas — dipakai pada dua panel yang paling
   sering dituju (Berita dan Kontak), bukan pada semuanya: kalau semua panel
   diberi aksen, aksennya berhenti menandakan apa pun. */
.sipadu-panel--aksen { border-top: 3px solid var(--ina-primary-500); }

/* ---------- Deretan angka utama ---------- */
/* auto-fit + minmax, bukan jumlah kolom tetap: jumlah kartunya berbeda menurut
   peran, dan grid berkolom tetap akan menyisakan lubang di ujung. */
.sipadu-beranda-angka {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
    gap: var(--ina-spacing-3, 0.75rem);
    margin-bottom: var(--ina-spacing-4, 1rem);
}
.sipadu-beranda-angka__kartu {
    position: relative;
    padding: var(--ina-spacing-4, 1rem);
    padding-left: calc(var(--ina-spacing-4, 1rem) + 4px);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 12px);
    background: var(--ina-background-primary);
    overflow: hidden;
}
/* Pita warna di tepi kiri + latar bertinta tipis. Dibuat lewat ::before, bukan
   border-left, supaya sudut membulat kartunya tidak terpotong lurus. */
.sipadu-beranda-angka__kartu::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
    background: var(--sipadu-aksen, var(--ina-stroke-primary));
}
.sipadu-beranda-angka__kartu--brand      { --sipadu-aksen: var(--ina-primary-600); background: var(--ina-primary-50); }
.sipadu-beranda-angka__kartu--info       { --sipadu-aksen: var(--ina-blue-600);    background: var(--ina-blue-50); }
.sipadu-beranda-angka__kartu--sukses     { --sipadu-aksen: var(--ina-green-600);   background: var(--ina-green-50); }
.sipadu-beranda-angka__kartu--peringatan { --sipadu-aksen: var(--ina-yellow-600);  background: var(--ina-yellow-50); }
.sipadu-beranda-angka__kartu--bahaya     { --sipadu-aksen: var(--ina-red-600);     background: var(--ina-red-100); }
.sipadu-beranda-angka__kartu--netral     { --sipadu-aksen: var(--ina-neutral-400); background: var(--ina-neutral-50); }

.sipadu-beranda-angka__label {
    display: block;
    font-size: var(--ina-font-xs);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--ina-content-secondary);
}
.sipadu-beranda-angka__nilai {
    display: block;
    margin-top: 0.15rem;
    font-size: var(--ina-font-3xl);
    font-weight: var(--ina-font-bold);
    line-height: 1.1;
    color: var(--ina-content-primary);
}
/* Penyebut lebih kecil dan redup: yang dibaca lebih dulu adalah pembilangnya,
   penyebut hanya memberi skala. */
.sipadu-beranda-angka__dari {
    font-size: var(--ina-font-lg);
    font-weight: var(--ina-font-normal);
    color: var(--ina-content-tertiary);
}
.sipadu-beranda-angka__ket {
    display: block;
    margin-top: 0.25rem;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
}

/* ---------- Acuan 7 aspek + bobot ---------- */
.sipadu-aspek-acuan {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(270px, 1fr));
    gap: 0.5rem 1rem;
    margin-top: var(--ina-spacing-3, 0.75rem);
}
.sipadu-aspek-acuan__item {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    font-size: var(--ina-font-sm);
}
/* Pil bobot: lebar TETAP supaya ketujuh angkanya berderet lurus dan bisa
   dibandingkan sekali lihat — itulah gunanya bagian ini. Warnanya menandai
   kelas bobot, jadi aspek 25% terbaca lebih berat sebelum angkanya dibaca. */
.sipadu-aspek-acuan__bobot {
    flex: 0 0 3.25rem;
    text-align: center;
    padding: 0.2rem 0;
    border-radius: var(--ina-radius-full, 999px);
    font-weight: var(--ina-font-semibold);
    font-variant-numeric: tabular-nums;
    font-size: var(--ina-font-xs);
}
.sipadu-aspek-acuan__bobot--besar  { background: var(--ina-primary-600); color: var(--ina-base-white); }
.sipadu-aspek-acuan__bobot--sedang { background: var(--ina-primary-100); color: var(--ina-primary-700); }
.sipadu-aspek-acuan__bobot--kecil  { background: var(--ina-neutral-100); color: var(--ina-content-secondary); }
.sipadu-aspek-acuan__nama { color: var(--ina-content-secondary); }

/* Catatan penutup bagian penjelasan: dibedakan dari paragraf biasa supaya
   aturan "selesai DAN terverifikasi" — sumber kebingungan yang paling sering
   ditanyakan — tidak tenggelam di antara teks lain. */
.sipadu-beranda-catatan {
    margin: var(--ina-spacing-3, 0.75rem) 0 0;
    padding: var(--ina-spacing-3, 0.75rem);
    border-left: 3px solid var(--ina-primary-500);
    border-radius: 0 8px 8px 0;
    background: var(--ina-primary-50);
    font-size: var(--ina-font-sm);
    color: var(--ina-content-secondary);
}

/* ---------- Alur verifikasi ---------- */
.sipadu-alur {
    list-style: none;
    counter-reset: alur;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 1rem;
}
.sipadu-alur li {
    counter-increment: alur;
    position: relative;
    padding-left: 2.5rem;
    font-size: var(--ina-font-sm);
    color: var(--ina-content-secondary);
}
.sipadu-alur li::before {
    content: counter(alur);
    position: absolute;
    left: 0;
    top: -0.1rem;
    width: 1.75rem;
    height: 1.75rem;
    display: grid;
    place-items: center;
    border-radius: 50%;
    background: var(--ina-primary-600);
    color: var(--ina-base-white);
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-semibold);
}
/* Garis penghubung antar-langkah: yang dijelaskan di sini adalah URUTAN, dan
   empat lingkaran tanpa penghubung terbaca sebagai empat hal yang setara. */
.sipadu-alur li:not(:last-child)::after {
    content: '';
    position: absolute;
    left: 0.85rem;
    top: 1.75rem;
    bottom: -1rem;
    width: 2px;
    background: var(--ina-primary-100);
}

/* ---------- Siklus monev ---------- */
/* Siklus yang sedang berjalan diberi latar dan pita hijau: dari empat baris
   yang hampir serupa, satu inilah yang menentukan apa yang harus dikerjakan
   sekarang. */
.sipadu-siklus-baris.is-berjalan {
    background: var(--ina-green-50);
    box-shadow: inset 3px 0 0 var(--ina-green-600);
}

/* ---------- Kartu berita ---------- */
/* EMPAT kartu sejajar pada layar lebar, turun bertahap ke 3 / 2 / 1.
 *
 * Jumlah kolomnya ditetapkan per titik henti, BUKAN auto-fit. Dengan auto-fit
 * jumlah kolom bergantung pada lebar sisa panel — dan lebar itu berbeda antara
 * layar dengan sidebar terbuka dan tertutup, sehingga baris berita bisa berisi
 * 3 kartu di satu komputer dan 4 di komputer lain tanpa alasan yang terlihat.
 * Empat kartu adalah bentuk yang memang dirancang: satu baris penuh pengumuman,
 * cukup lebar untuk judul dua baris dan kutipan tiga baris.
 *
 * minmax(0, 1fr), bukan 1fr: lebar minimum baku kolom grid adalah lebar
 * min-content isinya, sehingga judul panjang tanpa spasi akan melebarkan
 * kolomnya dan mendorong kartu terakhir keluar panel. */
.sipadu-beranda-berita {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-3, 0.75rem);
}
@media (min-width: 576px) {
    .sipadu-beranda-berita { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* Titik hentinya dihitung dengan memperhitungkan SIDEBAR, bukan lebar layar
   apa adanya: mulai 992px sidebar selebar 280px muncul dan wadah isinya
   dibatasi 1440px dengan padding 24px, sehingga lebar panel = min(layar, 1440)
   - 280 - 48. Pada layar 1280px itu berarti hanya ~952px — empat kartu di sana
   masing-masing tinggal ~226px dan judulnya patah-patah. Angka 1150 dan 1400
   adalah lebar layar terkecil yang menyisakan ~265px per kartu untuk 3 dan 4
   kolom. */
@media (min-width: 1150px) {
    .sipadu-beranda-berita { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (min-width: 1400px) {
    .sipadu-beranda-berita { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
/* Kartunya adalah <button>: seluruh permukaannya membuka modal. Gaya bawaan
   tombol (border, background, align tengah) karena itu harus dinolkan dulu. */
.sipadu-beranda-berita__kartu {
    display: flex;
    flex-direction: column;
    padding: 0;
    text-align: left;
    font: inherit;
    color: inherit;
    cursor: pointer;
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 12px);
    overflow: hidden;
    background: var(--ina-background-primary);
    transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}
.sipadu-beranda-berita__kartu:hover,
.sipadu-beranda-berita__kartu:focus-visible {
    transform: translateY(-2px);
    border-color: var(--ina-primary-500);
    box-shadow: 0 8px 20px -12px rgb(0 0 0 / 45%);
}
/* Tinggi TETAP, bukan aspect-ratio: kartu berjajar di dalam grid, dan
   aspect-ratio membuat tinggi gambar ikut lebar kolom — sehingga kartu
   bergambar menjulang jauh melebihi kartu tanpa gambar di sebelahnya. */
.sipadu-beranda-berita__gambar {
    display: block;
    height: 140px;
    flex: 0 0 auto;
    background: var(--ina-background-secondary);
}
.sipadu-beranda-berita__gambar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sipadu-beranda-berita__gambar--kosong {
    display: grid;
    place-items: center;
    font-size: 2rem;
    color: var(--ina-primary-600);
    background: linear-gradient(135deg, var(--ina-primary-100) 0%, var(--ina-blue-50) 100%);
}
/* Kolom lentur yang mengisi sisa tinggi kartu, supaya "Baca selengkapnya"
   bisa didorong ke dasar (margin-top:auto di bawah). Tanpa itu, empat kartu
   yang tingginya sudah disamakan grid tetap punya empat posisi tautan yang
   berbeda-beda — mengikuti panjang judulnya — dan barisnya terlihat acak. */
.sipadu-beranda-berita__isi {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    padding: var(--ina-spacing-3, 0.75rem);
}
.sipadu-beranda-berita__tanggal {
    display: block;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
}
.sipadu-beranda-berita__judul {
    display: block;
    margin: 0.2rem 0 0.35rem;
    font-size: var(--ina-font-base);
    font-weight: var(--ina-font-semibold);
    line-height: 1.35;
    color: var(--ina-content-primary);
}
.sipadu-beranda-berita__kutipan {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: var(--ina-font-sm);
    color: var(--ina-content-secondary);
}
.sipadu-beranda-berita__baca {
    display: inline-flex;
    align-items: center;
    align-self: flex-start;
    gap: 0.3rem;
    margin-top: auto;
    padding-top: 0.6rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-primary-600);
}
.sipadu-beranda-berita__kartu:hover .sipadu-beranda-berita__baca { text-decoration: underline; }

/* Gambar di dalam modal berita. */
.sipadu-beranda-modal__gambar {
    height: 200px;
    margin-bottom: var(--ina-spacing-3, 0.75rem);
    border-radius: 8px;
    overflow: hidden;
    background: var(--ina-background-secondary);
}
.sipadu-beranda-modal__gambar img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ---------- Baris pengguna (dashboard Admin) ---------- */
/* Avatar di kiri, lalu nama dan lencana peran BERTUMPUK di kanannya.
   Bukan nama-dan-lencana berdampingan: nama pengguna di aplikasi ini bisa
   belasan kata dan label perannya juga panjang, sehingga dalam satu baris
   keduanya berebut ruang sampai lencananya terpotong tepi panel. */
.sipadu-pengguna {
    display: flex;
    align-items: flex-start;
    gap: var(--ina-spacing-3, 0.75rem);
}
.sipadu-pengguna__avatar {
    flex: 0 0 2rem;
    width: 2rem;
    height: 2rem;
    display: grid;
    place-items: center;
    border-radius: 50%;
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-semibold);
    letter-spacing: 0.02em;
}
/* Warna avatar mengikuti warna lencana perannya (role_badge_variant), supaya
   peran yang sama tidak pernah tampil dengan dua warna berbeda dalam satu baris. */
.sipadu-pengguna__avatar--brand   { background: var(--ina-primary-100); color: var(--ina-primary-700); }
.sipadu-pengguna__avatar--info    { background: var(--ina-blue-50);     color: var(--ina-blue-700); }
.sipadu-pengguna__avatar--success { background: var(--ina-green-50);    color: var(--ina-green-700); }
.sipadu-pengguna__avatar--neutral { background: var(--ina-neutral-100);  color: var(--ina-content-secondary); }

/* min-width:0 — tanpa ini lebar minimum kolom teks adalah lebar kata
   terpanjangnya, sehingga nama panjang mendorong isinya keluar baris. */
.sipadu-pengguna__isi { flex: 1 1 auto; min-width: 0; }
.sipadu-pengguna__nama {
    display: block;
    font-size: var(--ina-font-sm);
    line-height: 1.35;
    color: var(--ina-content-primary);
    /* overflow-wrap: nama instansi bisa memuat kata yang sangat panjang;
       dibiarkan memotong kata daripada melebar keluar panel. */
    overflow-wrap: anywhere;
}
.sipadu-pengguna__peran { margin-top: 0.3rem; }

/* Gembok kecil pada langkah level yang belum boleh diisi (kunci urutan level).
   Sengaja redup dan kecil: langkahnya tetap bisa dibuka untuk dibaca, jadi
   gembok ini penanda, bukan larangan masuk. */
.sipadu-stepper__gembok {
    margin-left: 0.3rem;
    font-size: 0.85em;
    color: var(--ina-content-tertiary);
    vertical-align: baseline;
}

/* ---------------------------------------------------------------------
 * Layar Kelola Pengguna: bilah penyaring, tampilan kartu, daftar aksi
 * ------------------------------------------------------------------ */

/* Bilah penyaring: pencarian + jumlah per halaman + pilihan tampilan.
   Sengaja RINGKAS (ukuran sm, tanpa label terpisah) supaya menyatu dengan
   bilah alat tabel tepat di bawahnya — dua bilah bertumpuk dengan tinggi
   berbeda terbaca sebagai dua hal yang tidak berhubungan. */
.sipadu-filter-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
}
.sipadu-filter-bar__cari { flex: 1 1 16rem; min-width: 10rem; }
.sipadu-filter-bar__grup {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--ina-spacing-2, 0.5rem);
}
/* Pemilih jumlah baris cukup selebar isinya — "25 baris" tidak butuh
   kotak selebar kolom pencarian. */
.sipadu-filter-bar__per { width: auto; min-width: 7.5rem; }

/* Pemilih tampilan (daftar / kartu): dua tombol yang menyatu jadi satu
   kendali, bukan dua tombol lepas — supaya terbaca sebagai SATU pilihan
   dengan dua keadaan, bukan dua aksi berbeda. */
.sipadu-view-toggle {
    display: inline-flex;
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 10px);
    overflow: hidden;
}
.sipadu-view-toggle__item {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.6rem;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
    text-decoration: none;
    background: var(--ina-background-primary);
    border: 0;
    cursor: pointer;
    white-space: nowrap;
}
.sipadu-view-toggle__item + .sipadu-view-toggle__item { border-left: 1px solid var(--ina-stroke-primary); }
.sipadu-view-toggle__item:hover { background: var(--ina-background-secondary); }
.sipadu-view-toggle__item--aktif {
    background: var(--ina-background-brand-subtle, var(--ina-background-secondary));
    color: var(--ina-content-brand, var(--ina-content-primary));
    font-weight: var(--ina-font-medium);
}

/* Tampilan kartu. Kolomnya auto-fill, jadi jumlah kartu per baris mengikuti
   lebar yang tersedia tanpa breakpoint tambahan. */
.sipadu-user-cards {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
    gap: var(--ina-spacing-3, 0.75rem);
}
.sipadu-user-card {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: var(--ina-spacing-3, 0.75rem);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-xl, 12px);
    background: var(--ina-background-primary);
}
.sipadu-user-card__atas { display: flex; align-items: flex-start; gap: 0.6rem; }
.sipadu-user-card__nama {
    font-weight: var(--ina-font-semibold);
    line-height: 1.3;
    /* Nama jabatan koordinator OPD bisa sangat panjang; dibiarkan memotong
       kata daripada melebarkan kartu keluar dari kisinya. */
    overflow-wrap: anywhere;
}
.sipadu-user-card__email {
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
    overflow-wrap: anywhere;
}
.sipadu-user-card__meta { display: flex; flex-wrap: wrap; gap: 0.35rem; align-items: center; }
.sipadu-user-card__opd { font-size: var(--ina-font-xs); color: var(--ina-content-secondary); }
.sipadu-user-card__kaki { margin-top: auto; padding-top: 0.25rem; }

/* Tabel yang isinya BOLEH membungkus ke beberapa baris.
   ---------------------------------------------------------------------
   IDDS memberi SETIAP sel `white-space: nowrap` DAN `min-width: fit-content`
   (lihat .ina-table__cell di idds.css). Gabungan keduanya berarti sel tidak
   pernah boleh memendek dan isinya tidak pernah boleh pindah baris — jadi
   `max-width` pada elemen di dalam sel tidak berpengaruh sama sekali, dan
   nama sepanjang "Koordinator OPD Badan Perencanaan Pembangunan, Penelitian
   dan Pengembangan Daerah Provinsi Sulawesi Barat" meluber menimpa kolom di
   sebelahnya.

   Karena itu KEDUANYA harus dibatalkan, bukan salah satu. Dipasang lewat
   kelas tersendiri (bukan menimpa .ina-table global) supaya tabel lain —
   yang isinya memang pendek dan justru terbantu oleh nowrap — tidak ikut
   berubah. */
.sipadu-table-wrap .ina-table__cell,
.sipadu-table-wrap .ina-table__header-cell {
    white-space: normal;
    min-width: 0;
}
/* Baris yang tingginya berbeda-beda lebih rapi dibaca bila isinya rata
   atas — bukan mengambang di tengah menjauhi barisnya sendiri. */
.sipadu-table-wrap .ina-table__cell { vertical-align: top; }

/* Lebar kolom tabel Pengguna. Pembatasnya di elemen DI DALAM sel: lebar
   <div> itulah yang menentukan lebar max-content kolomnya. */
.sipadu-user-nama {
    max-width: 24rem;
    font-weight: var(--ina-font-semibold);
    line-height: 1.35;
    overflow-wrap: anywhere;
}
.sipadu-user-email {
    max-width: 24rem;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
    overflow-wrap: anywhere;
}
.sipadu-user-opd { max-width: 16rem; line-height: 1.35; overflow-wrap: anywhere; }
/* Badge peran ikut membungkus: "Eksekutif Koordinator PEMDI" sebagai satu
   baris utuh memaksa kolomnya selebar itu di layar sempit. */
.sipadu-user-role { max-width: 11rem; }
.sipadu-user-role .ina-badge { white-space: normal; text-align: left; }

/* Daftar aksi di dalam modal "Kelola".
   Sengaja modal, BUKAN dropdown: dropdown di dalam tabel terjepit dua hal
   sekaligus — .ina-table__scroll-wrapper yang overflow-x:auto (memotong
   apa pun yang melewati tepinya) dan kolom aksi yang dibuat lengket
   (position:sticky, yang membentuk konteks penumpukan sendiri). Hasilnya
   menu yang terpotong dan menimpa baris lain. Modal tidak punya dua masalah
   itu karena ia lapisan tetap di tingkat halaman. */
.sipadu-aksi-list { display: flex; flex-direction: column; gap: 0.15rem; }
.sipadu-aksi-item {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    width: 100%;
    padding: 0.7rem 0.75rem;
    border: 0;
    border-radius: var(--ina-radius-md, 8px);
    background: none;
    color: var(--ina-content-primary);
    font: inherit;
    font-size: var(--ina-font-sm);
    text-align: left;
    text-decoration: none;
    cursor: pointer;
}
.sipadu-aksi-item:hover { background: var(--ina-background-tertiary); }
.sipadu-aksi-item .ti { font-size: 1.1rem; color: var(--ina-content-secondary); }
.sipadu-aksi-item--danger { color: var(--ina-content-negative); }
.sipadu-aksi-item--danger .ti { color: var(--ina-content-negative); }
.sipadu-aksi-list form { margin: 0; }

/* ---------------------------------------------------------------------
 * Stepper level (Bagian 8.1): label yang terpotong — kiri, kanan, dan bawah
 * ---------------------------------------------------------------------
 * GEJALA: "Kurang / Initiate" pada langkah pertama terpotong di tepi kiri,
 * lalu "Sangat Baik / Embedded" dan "Memuaskan / Institutionalized" pada dua
 * langkah terakhir terpotong baris keduanya.
 *
 * SEBAB, dan keduanya berasal dari satu keputusan yang sama di IDDS:
 * .ina-stepper__label memakai position:absolute, sehingga ia TIDAK IKUT
 * menentukan ukuran apa pun —
 *
 *   - lebar: kotak langkahnya hanya selebar ikon (24px), jadi label yang
 *     lebih lebar menjulur ke kiri dan kanan ikonnya. Pada langkah PERTAMA,
 *     julur kirinya jatuh di luar tepi kontainer;
 *   - tinggi: kontainer stepper tingginya dipatok min-height 80px dan tidak
 *     pernah tumbuh mengikuti label. Label satu baris muat; label DUA baris
 *     melewati dasarnya sekitar 9px, dan `overflow-y: hidden` pada varian
 *     horizontal-responsive memotongnya.
 *
 * Versi pertama perbaikan ini hanya menggeser jangkar absolutnya (rata kiri
 * untuk langkah pertama, rata kanan untuk terakhir). Itu menyelesaikan
 * pemotongan mendatar tetapi JUSTRU memunculkan yang tegak: labelnya kini
 * boleh membungkus, dan baris keduanya terpotong.
 *
 * PERBAIKAN SEBENARNYA: kembalikan label ke aliran normal (position: static).
 * Dengan begitu kotak langkah tumbuh selebar dan setinggi labelnya, kontainer
 * ikut tumbuh, dan tidak ada lagi yang bisa menjulur keluar untuk dipotong —
 * baik ke samping maupun ke bawah, berapa pun barisnya.
 *
 * Konsekuensinya dua, dan keduanya ditangani di bawah:
 *   1. align-items harus flex-start, bukan center. Kalau tetap center, tiap
 *      langkah dipusatkan sendiri-sendiri menurut tingginya masing-masing —
 *      dan ikon langkah berlabel dua baris akan turun tidak sejajar dengan
 *      ikon langkah berlabel satu baris.
 *   2. separator ikut naik ke atas, jadi ia digeser turun setengah tinggi
 *      ikon agar tetap menyambung di titik tengah ikon.
 */
.ina-stepper--horizontal {
    align-items: flex-start;
    /* Tinggi mengikuti isi; 80px yang dipatok IDDS justru yang memotong. */
    min-height: 0;
    padding-top: 0.25rem;
    padding-bottom: 0.25rem;
}
.ina-stepper--horizontal .ina-stepper__label {
    position: static;
    transform: none;
    margin-top: 0.5rem;
    max-width: 100%;
    white-space: normal;
    text-align: center;
    line-height: 1.25;
}

/* Langkah BOLEH menyusut, dan ini yang membuat label terakhir tidak pernah
   terpotong di tepi kanan.
   ---------------------------------------------------------------------
   IDDS memberi .ina-stepper__item `flex-shrink: 0`. Dengan label yang kini
   ikut menentukan lebar, lima langkah yang tidak boleh menyusut berarti
   lebar minimum steppernya dipatok oleh panjang teks — dan begitu ruang
   layarnya kurang sedikit saja, seluruh deretan meluber ke kanan lalu
   dipotong `overflow-x: auto`. Yang hilang selalu langkah TERAKHIR, karena
   ia yang paling kanan.
   Dengan boleh menyusut, label yang kepanjangan pecah ke baris berikutnya
   (tingginya sudah aman sejak label keluar dari position:absolute) dan
   kelimanya selalu muat tanpa gulir mendatar sama sekali. */
.ina-stepper--horizontal .ina-stepper__item {
    flex-shrink: 1;
    min-width: 0;
}
/* Garis penghubung tetap terlihat sebagai penghubung walaupun ruangnya
   tersisa sedikit — tanpa batas bawah ini ia bisa menyusut sampai hilang. */
.ina-stepper--horizontal > .ina-stepper__separator {
    min-width: 12px;
}
/* Separator adalah SAUDARA dari .ina-stepper__item (lihat catatan markup di
   partials/stepper.php), jadi ia ikut rata atas — digeser turun setengah
   tinggi ikon supaya garisnya menyambung di tengah ikon.

   Nilainya DIUKUR di peramban pada susunan yang sebenarnya, bukan dihitung
   di atas kertas: markup stepper memakai utilitas `border-0` dari Bootstrap,
   sehingga tinggi luar ikon 24px (tanpa garis tepi) — bukan 26px seperti
   yang tertulis di idds.css. */
.ina-stepper--horizontal > .ina-stepper__separator {
    align-self: flex-start;
    margin-top: 12px;
}

/* =====================================================================
   HALAMAN ARTIKEL (/artikel) — katalog publik + halaman baca
   =====================================================================
   Bentuknya mengikuti katalog Artikel INA Digital Design System: chip
   penyaring di atas, kisi kartu bergambar di bawah. Komponen chip dan badge
   memakai kelas resmi `.ina-*`; yang ditulis di sini hanya tata letaknya —
   sesuatu yang memang tidak disediakan design system.

   Kelasnya bernamespace `sipadu-artikel*` dan TIDAK menumpang
   `.sipadu-beranda-berita*`: kartu beranda adalah <button> pembuka modal
   dengan tinggi gambar 140px untuk empat kolom di dalam sidebar, sedangkan
   ini <a> menuju halaman penuh, selebar layar, tanpa sidebar bagi tamu.
   Berbagi kelas berarti setiap penyetelan pada salah satunya diam-diam
   mengubah yang lain. */

.sipadu-artikel-kepala { margin-bottom: var(--ina-spacing-4, 1rem); }
.sipadu-artikel-kepala__judul {
    margin: 0;
    font-size: var(--ina-font-3xl, 1.75rem);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-primary);
    line-height: 1.25;
}
.sipadu-artikel-kepala__sub {
    margin: 0.35rem 0 0;
    max-width: 62ch;
    color: var(--ina-content-secondary);
    font-size: var(--ina-font-sm);
}

/* Chip-nya <a>, bukan <button>: alamat hasil penyaringan harus bisa
   dibagikan (lihat catatan di kepala view). Dua sifat bawaan tautan karena
   itu perlu dinolkan — garis bawah dan warna kunjungan — supaya bentuknya
   tetap chip dan bukan tautan berbingkai. */
.sipadu-artikel-chips { margin-bottom: var(--ina-spacing-4, 1rem); }
.sipadu-artikel-chips a,
.sipadu-artikel-chips a:visited { text-decoration: none; }
.sipadu-artikel-chips a:hover { text-decoration: none; }

.sipadu-artikel-jumlah {
    margin: 0 0 var(--ina-spacing-3, 0.75rem);
    font-size: var(--ina-font-sm);
    color: var(--ina-content-tertiary);
}

/* minmax(0, 1fr), bukan 1fr: lebar minimum baku kolom grid adalah lebar
   min-content isinya, sehingga satu judul panjang tanpa spasi akan
   melebarkan kolomnya dan mendorong kartu terakhir keluar halaman. */
.sipadu-artikel-kisi {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-4, 1rem);
}
@media (min-width: 576px) {
    .sipadu-artikel-kisi { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1150px) {
    .sipadu-artikel-kisi { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.sipadu-artikel-kartu {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    text-decoration: none;
    color: inherit;
    background: var(--ina-background-primary);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 12px);
    transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}
.sipadu-artikel-kartu:hover,
.sipadu-artikel-kartu:focus-visible {
    transform: translateY(-2px);
    border-color: var(--ina-primary-500);
    box-shadow: 0 10px 24px -14px rgb(0 0 0 / 45%);
    text-decoration: none;
    color: inherit;
}

/* Tinggi TETAP, bukan aspect-ratio: kartu berjajar di dalam grid, dan
   aspect-ratio membuat tinggi gambar ikut lebar kolom — sehingga pada satu
   kolom (layar ponsel) gambarnya menjulang setinggi setengah layar. */
.sipadu-artikel-kartu__gambar {
    display: block;
    height: 168px;
    flex: 0 0 auto;
    background: var(--ina-background-secondary);
}
/* Sama seperti kartu reel: gambar muat utuh, ruang sisanya berwarna dari
   gambar itu sendiri. Kartu ini bertinggi tetap 168px sedangkan gambarnya bisa
   tegak maupun mendatar — dengan `cover`, poster tegak terpotong habis di
   atas-bawah dan yang tersisa hanya bagian tengahnya. */
.sipadu-artikel-kartu__gambar { position: relative; }
.sipadu-artikel-kartu__gambar img {
    position: relative;
    z-index: 1;
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
}
.sipadu-artikel-kartu__gambar .sipadu-kartu-latar {
    position: absolute;
    inset: 0;
    z-index: 0;
    object-fit: cover;
    filter: blur(18px) saturate(1.4) brightness(0.95);
    transform: scale(1.12);
    pointer-events: none;
}
.sipadu-artikel-kartu__gambar--kosong {
    display: grid;
    place-items: center;
    font-size: 2.25rem;
    color: var(--ina-primary-600);
    background: linear-gradient(135deg, var(--ina-primary-100) 0%, var(--ina-blue-50) 100%);
}

/* Kolom lentur yang mengisi sisa tinggi kartu, supaya "Baca selengkapnya"
   bisa didorong ke dasar (margin-top:auto di bawah). Tanpa itu, kartu yang
   tingginya sudah disamakan grid tetap punya posisi tautan berbeda-beda
   mengikuti panjang judulnya, dan barisnya terlihat acak. */
.sipadu-artikel-kartu__isi {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    padding: var(--ina-spacing-4, 1rem);
}
.sipadu-artikel-kartu__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}
.sipadu-artikel-kartu__tanggal {
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
}
.sipadu-artikel-kartu__judul {
    display: block;
    margin-bottom: 0.4rem;
    font-size: var(--ina-font-lg, 1.05rem);
    font-weight: var(--ina-font-semibold);
    line-height: 1.35;
    color: var(--ina-content-primary);
    /* Judul panjang tanpa spasi (mis. alamat yang ditempel jadi judul) akan
       melebihi kolomnya; grid sudah dijaga minmax(0,1fr), ini penjaga
       keduanya di dalam kartu. */
    overflow-wrap: anywhere;
}
.sipadu-artikel-kartu__kutipan {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: var(--ina-font-sm);
    color: var(--ina-content-secondary);
}
.sipadu-artikel-kartu__baca {
    display: inline-flex;
    align-items: center;
    align-self: flex-start;
    gap: 0.35rem;
    margin-top: auto;
    padding-top: 0.75rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-primary-600);
}
.sipadu-artikel-kartu:hover .sipadu-artikel-kartu__baca { text-decoration: underline; }

/* ---- Halaman baca (/artikel/{id}) ---- */

/* Lebar baca dibatasi, bukan selebar layar: baris teks yang melewati ~75
   karakter membuat mata kehilangan awal baris berikutnya. Wadahnya sendiri
   sudah 1440px, jadi tanpa batas ini satu paragraf bisa membentang penuh. */
.sipadu-artikel-baca {
    max-width: 78ch;
    margin: 0 auto;
}
.sipadu-artikel-baca__kembali {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    margin-bottom: var(--ina-spacing-4, 1rem);
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-medium, 500);
    color: var(--ina-content-secondary);
    text-decoration: none;
}
.sipadu-artikel-baca__kembali:hover { color: var(--ina-primary-600); }
.sipadu-artikel-baca__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.6rem;
    margin-bottom: 0.5rem;
}
.sipadu-artikel-baca__kategori { text-decoration: none; }
.sipadu-artikel-baca__tanggal {
    font-size: var(--ina-font-sm);
    color: var(--ina-content-tertiary);
}
.sipadu-artikel-baca__judul {
    margin: 0 0 var(--ina-spacing-4, 1rem);
    font-size: var(--ina-font-3xl, 1.75rem);
    font-weight: var(--ina-font-semibold);
    line-height: 1.25;
    color: var(--ina-content-primary);
    overflow-wrap: anywhere;
}
.sipadu-artikel-baca__gambar {
    margin-bottom: var(--ina-spacing-4, 1rem);
    border-radius: var(--ina-radius-lg, 12px);
    overflow: hidden;
    background: var(--ina-background-secondary);
}
.sipadu-artikel-baca__gambar img {
    display: block;
    width: 100%;
    height: auto;
}
.sipadu-artikel-baca__isi {
    font-size: var(--ina-font-base);
    line-height: 1.7;
    color: var(--ina-content-primary);
}
.sipadu-artikel-baca__tautan { margin-top: var(--ina-spacing-4, 1rem); }

/* Pintasan dari layar masuk ke katalog ini. Layar masuk hanya menampilkan
   lima pengumuman terbaru (service.MaksBeritaTayang); tanpa pintasan,
   selebihnya tidak punya jalan untuk ditemukan sama sekali. */
.sipadu-berita__semua {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    margin-top: 0.6rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-base-white, #fff);
    text-decoration: none;
    opacity: 0.92;
}
.sipadu-berita__semua:hover { opacity: 1; text-decoration: underline; color: var(--ina-base-white, #fff); }

/* =====================================================================
   HALAMAN DEPAN (/) — landing publik
   =====================================================================
   Kelasnya bernamespace `sipadu-lp*` (landing page). Bagian kartu berita
   SENGAJA memakai kembali `.sipadu-artikel-kartu` dari halaman /artikel:
   dua gaya kartu berita berarti dua tempat yang harus ikut disetel setiap
   kali salah satunya diperbaiki. */

/* Melepas padding + batas 1440px milik `.sipadu-container` untuk halaman ini
   saja (dipasang lewat $body_class dari LandingController). Tanpa ini hero
   tidak akan pernah bisa selebar layar, dan pada layar 1920px seluruh isi
   halaman depan menggumpal di sisi kiri — `.sipadu-container` dibatasi
   1440px TANPA margin auto, karena di layar aplikasi ruang kanannya memang
   milik tata letak bersidebar. */
.sipadu-body--lepas .sipadu-container {
    padding: 0;
    max-width: none;
}

/* Lebar baca tiap seksi. Nilainya di bawah 1440px dengan sengaja: baris teks
   selebar itu membuat mata kehilangan awal baris berikutnya, dan kisi kartu
   empat kolom di dalamnya sudah terasa renggang. */
.sipadu-lp__dalam {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 var(--ina-spacing-4, 1rem);
}
@media (min-width: 992px) {
    .sipadu-lp__dalam { padding: 0 var(--ina-spacing-6, 1.5rem); }
}

.sipadu-lp__kepala { margin-bottom: var(--ina-spacing-6, 1.5rem); }
.sipadu-lp__kepala--baris {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: var(--ina-spacing-3, 0.75rem);
}
.sipadu-lp__judul {
    margin: 0;
    font-size: clamp(1.35rem, 1.1rem + 1.1vw, 1.9rem);
    font-weight: var(--ina-font-semibold);
    line-height: 1.25;
    color: var(--ina-content-primary);
}
.sipadu-lp__sub {
    margin: 0.4rem 0 0;
    max-width: 62ch;
    color: var(--ina-content-secondary);
    font-size: var(--ina-font-sm);
}

/* ---------------------------- HERO ---------------------------- */

.sipadu-lp-hero {
    position: relative;
    color: var(--ina-base-white, #fff);
    /* TIGA LAPIS, urutan dari paling ATAS ke paling BAWAH — pola yang sama
       dengan panel kiri halaman masuk, dan karena alasan yang sama:
         1. gradien gelap  -> penjamin kontras teks putih di atasnya
         2. foto auth-bg   -> visual utama
         3. gradien brand  -> jaring pengaman bila fotonya 404
       Lapis ketiga membuat hero tidak pernah menjadi kotak kosong ketika
       fotonya belum diunggah. Jangan mengubah urutannya.
       Alamat fotonya relatif terhadap BERKAS CSS ini (public/assets/css/),
       jadi ../img/ memang arah yang benar dari sini. */
    background-image:
        linear-gradient(135deg, rgb(8 30 76 / 92%) 0%, rgb(12 44 112 / 74%) 52%, rgb(4 16 44 / 92%) 100%),
        url('../img/auth-bg.jpg'),
        radial-gradient(120% 120% at 0% 0%, var(--ina-primary-500) 0%, var(--ina-primary-700) 58%, var(--ina-primary-800) 100%);
    background-size: cover, cover, cover;
    background-position: center, center, center;
    background-repeat: no-repeat, no-repeat, no-repeat;
}

.sipadu-lp-hero__dalam {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-6, 1.5rem);
    align-items: center;
    padding-top: clamp(2.5rem, 1.5rem + 5vw, 5rem);
    padding-bottom: clamp(2.5rem, 1.5rem + 5vw, 5rem);
}
/* Kartu nilai turun ke bawah teks pada layar sempit — bukan menyusut di
   sampingnya. Dua kolom di bawah ~900px menyisakan lebar yang membuat judul
   hero patah tiap dua kata. */
@media (min-width: 900px) {
    .sipadu-lp-hero__dalam { grid-template-columns: minmax(0, 1.6fr) minmax(280px, 0.9fr); }
}

.sipadu-lp-hero__label {
    margin: 0 0 0.6rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: rgb(255 255 255 / 80%);
}
.sipadu-lp-hero__judul {
    margin: 0;
    /* clamp(): satu deklarasi menggantikan tiga media query, dan ukurannya
       naik mulus alih-alih melompat di titik henti. */
    font-size: clamp(1.75rem, 1.2rem + 2.6vw, 3.1rem);
    font-weight: var(--ina-font-bold, 700);
    line-height: 1.15;
    letter-spacing: -0.01em;
    color: var(--ina-base-white, #fff);
    /* Judul panjang tanpa spasi tidak boleh melebarkan kolom grid-nya. */
    overflow-wrap: anywhere;
}
.sipadu-lp-hero__teks {
    margin: 1rem 0 0;
    max-width: 58ch;
    font-size: clamp(0.95rem, 0.9rem + 0.3vw, 1.1rem);
    line-height: 1.65;
    color: rgb(255 255 255 / 88%);
}
.sipadu-lp-hero__aksi {
    display: flex;
    flex-wrap: wrap;
    gap: var(--ina-spacing-3, 0.75rem);
    margin-top: var(--ina-spacing-6, 1.5rem);
}
/* Tombol kedua di atas latar gelap. `.ina-button--secondary` dirancang untuk
   latar terang, sehingga di sini teksnya nyaris tak terbaca — disetel manual
   menjadi tombol bergaris putih. */
.sipadu-lp-hero__tombol-2,
.sipadu-lp-hero__tombol-2:hover {
    background: rgb(255 255 255 / 12%);
    border-color: rgb(255 255 255 / 55%);
    color: var(--ina-base-white, #fff);
}
.sipadu-lp-hero__tombol-2:hover { background: rgb(255 255 255 / 22%); }

/* ------------------------ Kartu nilai ------------------------ */

.sipadu-lp-nilai {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--ina-spacing-3, 0.75rem);
    padding: var(--ina-spacing-6, 1.5rem);
    border-radius: var(--ina-radius-xl, 16px);
    /* SOLID, bukan kaca tembus pandang: kartu transparan di atas foto membuat
       keterbacaan angkanya bergantung pada bagian foto yang kebetulan ada di
       belakangnya — dan fotonya dapat diganti kapan saja tanpa ada yang
       memeriksa ulang kontrasnya. */
    background: var(--ina-background-primary);
    color: var(--ina-content-primary);
    box-shadow: 0 24px 48px -24px rgb(0 0 0 / 55%);
}
.sipadu-lp-nilai__kepala {
    margin: 0;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-secondary);
    text-align: center;
}
.sipadu-lp-nilai__sumber {
    margin: 0;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
    text-align: center;
}

/* Cincin capaian digambar conic-gradient — tanpa pustaka grafik dan tanpa satu
   pun permintaan jaringan tambahan. Lubang tengahnya sebuah lingkaran pejal di
   atasnya, bukan mask: mask masih perlu awalan vendor di sebagian peramban
   yang dipakai di lingkungan pemerintahan, dan kegagalannya berupa lingkaran
   penuh tanpa lubang — rusak, bukan sekadar sederhana. */
.sipadu-lp-ring {
    position: relative;
    width: 168px;
    height: 168px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    background: conic-gradient(
        var(--ina-primary-500) calc(var(--lp-persen, 0) * 1%),
        var(--ina-background-tertiary, #e9edf5) 0
    );
}
.sipadu-lp-ring__isi {
    position: relative;
    display: grid;
    place-items: center;
    width: 132px;
    height: 132px;
    border-radius: 50%;
    background: var(--ina-background-primary);
}
.sipadu-lp-ring__angka {
    font-size: 2.6rem;
    font-weight: var(--ina-font-bold, 700);
    line-height: 1;
    color: var(--ina-content-primary);
    font-variant-numeric: tabular-nums;
}
.sipadu-lp-ring__skala {
    margin-top: 0.15rem;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
}

/* ------------------------ Nilai per aspek ------------------------ */

.sipadu-lp-aspek {
    padding: clamp(2.5rem, 1.5rem + 4vw, 4rem) 0;
    background: var(--ina-background-primary);
}

.sipadu-lp-bar-list {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-4, 1rem) var(--ina-spacing-6, 1.5rem);
    margin: 0;
    padding: 0;
    list-style: none;
}
@media (min-width: 768px) {
    .sipadu-lp-bar-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.sipadu-lp-bar__kepala {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
    margin-bottom: 0.35rem;
}
.sipadu-lp-bar__nama {
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-medium, 500);
    color: var(--ina-content-primary);
    /* Nama resmi aspek panjang-panjang; membungkus lebih baik daripada
       memotongnya dengan elipsis, karena yang terpotong justru kata
       pembedanya ("… Layanan Digital Pemerintah"). */
    overflow-wrap: anywhere;
}
.sipadu-lp-bar__bobot {
    flex: 0 0 auto;
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-tertiary);
    font-variant-numeric: tabular-nums;
}
.sipadu-lp-bar__baris {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}
.sipadu-lp-bar__jalur {
    flex: 1 1 auto;
    min-width: 0;
    height: 10px;
    border-radius: 999px;
    background: var(--ina-background-tertiary, #e9edf5);
    overflow: hidden;
}
/* SATU warna untuk ketujuh batang. Yang dibandingkan di sini adalah besaran,
   dan besaran dibaca dari panjangnya — tujuh warna berbeda hanya menyarankan
   pengelompokan yang tidak ada. */
.sipadu-lp-bar__isi {
    height: 100%;
    border-radius: 999px;
    background: var(--ina-primary-500);
}
.sipadu-lp-bar__nilai {
    flex: 0 0 auto;
    min-width: 4.5rem;
    text-align: right;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-primary);
    font-variant-numeric: tabular-nums;
}
.sipadu-lp-bar__belum {
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-regular, 400);
    font-style: italic;
    color: var(--ina-content-tertiary);
}
.sipadu-lp-bar--kosong .sipadu-lp-bar__nama { color: var(--ina-content-secondary); }

/* ------------------------- Tentang PEMDI ------------------------- */

.sipadu-lp-tentang {
    padding: clamp(2.5rem, 1.5rem + 4vw, 4rem) 0;
    background: var(--ina-background-secondary);
}
.sipadu-lp-tentang__dalam {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-6, 1.5rem);
    align-items: start;
}
@media (min-width: 992px) {
    .sipadu-lp-tentang__dalam { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); }
}
.sipadu-lp-tentang__uraian {
    margin: 0.75rem 0 0;
    font-size: var(--ina-font-base);
    line-height: 1.7;
    color: var(--ina-content-secondary);
}
.sipadu-lp-tentang__tautan {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    margin-top: 1rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-primary-600);
    text-decoration: none;
}
.sipadu-lp-tentang__tautan:hover { text-decoration: underline; }

.sipadu-lp-poin {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-3, 0.75rem);
    margin: 0;
    padding: 0;
    list-style: none;
}
@media (min-width: 576px) {
    .sipadu-lp-poin { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.sipadu-lp-poin__item {
    display: flex;
    gap: 0.75rem;
    padding: var(--ina-spacing-4, 1rem);
    border-radius: var(--ina-radius-lg, 12px);
    border: 1px solid var(--ina-stroke-primary);
    background: var(--ina-background-primary);
}
.sipadu-lp-poin__ikon {
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    width: 40px;
    height: 40px;
    border-radius: var(--ina-radius-md, 8px);
    font-size: 1.25rem;
    color: var(--ina-primary-600);
    background: var(--ina-primary-50, #eef4ff);
}
.sipadu-lp-poin__judul {
    margin: 0 0 0.2rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    line-height: 1.35;
    color: var(--ina-content-primary);
}
.sipadu-lp-poin__teks {
    margin: 0;
    font-size: var(--ina-font-sm);
    line-height: 1.55;
    color: var(--ina-content-secondary);
}

/* --------------------------- Berita --------------------------- */

.sipadu-lp-berita {
    padding: clamp(2.5rem, 1.5rem + 4vw, 4rem) 0;
    background: var(--ina-background-primary);
}

/* ------------------------- Ajakan & kaki ------------------------- */

.sipadu-lp-cta {
    padding: clamp(2rem, 1.2rem + 3vw, 3.25rem) 0;
    color: var(--ina-base-white, #fff);
    background: linear-gradient(120deg, var(--ina-primary-700) 0%, var(--ina-primary-500) 100%);
}
.sipadu-lp-cta__dalam {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--ina-spacing-4, 1rem);
}
.sipadu-lp-cta__judul {
    margin: 0;
    font-size: clamp(1.15rem, 1rem + 0.7vw, 1.5rem);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-base-white, #fff);
}
.sipadu-lp-cta__teks {
    margin: 0.35rem 0 0;
    max-width: 58ch;
    font-size: var(--ina-font-sm);
    color: rgb(255 255 255 / 88%);
}
/* Tombol primer di atas latar brand: tombol biru di atas biru kehilangan
   bentuknya. Dibalik menjadi putih dengan teks brand. */
.sipadu-lp-cta .ina-button--primary,
.sipadu-lp-cta .ina-button--primary:hover {
    background: var(--ina-base-white, #fff);
    border-color: var(--ina-base-white, #fff);
    color: var(--ina-primary-700);
}

.sipadu-lp-kaki {
    padding: var(--ina-spacing-6, 1.5rem) 0;
    background: var(--ina-background-secondary);
    border-top: 1px solid var(--ina-stroke-primary);
    font-size: var(--ina-font-xs);
    color: var(--ina-content-secondary);
}
.sipadu-lp-kaki p { margin: 0; }
.sipadu-lp-kaki__nota { margin-top: 0.3rem; color: var(--ina-content-tertiary); }

/* Formulir halaman depan (/halaman-depan) */
.sipadu-subjudul {
    margin: 0 0 0.35rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-primary);
}

/* Satu butir = satu baris bertiga isian. Menumpuk di layar sempit, berjajar
   begitu ruangnya cukup — tanpa tabel, sehingga label tiap isian tetap
   menempel pada isiannya saat menumpuk. */
.sipadu-poin-baris {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 0.5rem;
    padding: 0.75rem 0;
    border-top: 1px dashed var(--ina-stroke-primary);
}
.sipadu-poin-baris:first-of-type { border-top: 0; padding-top: 0; }
@media (min-width: 768px) {
    .sipadu-poin-baris {
        grid-template-columns: 10.5rem minmax(0, 1fr) minmax(0, 1.4fr);
        align-items: start;
    }
}

/* Kolom ikon bukan lagi .ina-text-field, jadi labelnya (sebuah <span> agar
   tidak mengklaim isian tersembunyi di bawahnya) harus dijadikan blok sendiri. */
.sipadu-poin-baris__ikon > .ina-text-field__label { display: block; margin-bottom: 0.25rem; }

.sipadu-aspek-isian { margin-bottom: 0.6rem; }
.sipadu-aspek-isian .ina-text-field__label {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.4rem;
}
.sipadu-aspek-isian__bobot {
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-regular, 400);
    color: var(--ina-content-tertiary);
}

/* Dua pintasan berdampingan di kaki formulir masuk (halaman depan & artikel). */
.sipadu-auth__artikel { display: flex; flex-wrap: wrap; justify-content: center; gap: 1rem; }

/* ---- Pemilih ikon pada formulir halaman depan ---- */

/* Tombol pengganti isian teks. Dibuat sebidang dengan .ina-text-field__wrapper
   di sebelahnya (tinggi, radius, garis tepi) supaya barisnya tidak terlihat
   seperti dua jenis kontrol yang berbeda. */
.sipadu-ikon-tombol {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    width: 100%;
    min-height: 36px;
    padding: 0.3rem 0.5rem;
    font: inherit;
    font-size: var(--ina-font-sm);
    text-align: left;
    color: var(--ina-content-primary);
    background: var(--ina-background-primary);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-md, 8px);
    cursor: pointer;
}
.sipadu-ikon-tombol:hover { border-color: var(--ina-primary-400); }
.sipadu-ikon-tombol:focus-visible {
    outline: 2px solid var(--ina-primary-600);
    outline-offset: 1px;
}
.sipadu-ikon-tombol > .ti:first-child {
    flex: 0 0 auto;
    font-size: 1.1rem;
    color: var(--ina-primary-600);
}
/* Nama ikon boleh terpotong; yang harus selalu terlihat adalah GAMBARNYA —
   itulah yang dipilih orang, dan itulah yang muncul di halaman depan. */
.sipadu-ikon-tombol__nama {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--ina-content-secondary);
}
.sipadu-ikon-tombol__panah {
    flex: 0 0 auto;
    font-size: 0.9rem;
    color: var(--ina-content-tertiary);
}

/* Daftar di dalam modal. Tinggi dibatasi + gulir sendiri: tanpa itu, modal
   berisi 110 ikon menjadi lebih tinggi dari layar dan tombol tutupnya ikut
   terdorong keluar pandangan. */
.sipadu-ikon-daftar {
    max-height: min(60vh, 26rem);
    overflow-y: auto;
    padding-right: 0.25rem;
}
.sipadu-ikon-kelompok + .sipadu-ikon-kelompok { margin-top: var(--ina-spacing-4, 1rem); }
.sipadu-ikon-kelompok__judul {
    margin: 0 0 0.4rem;
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-semibold);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--ina-content-tertiary);
}

/* auto-fill + minmax: jumlah kolomnya mengikuti lebar modal, sehingga kisi ini
   tetap rapi dari layar ponsel sampai dialog lebar tanpa satu pun media query. */
.sipadu-ikon-kisi {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(5.5rem, 1fr));
    gap: 0.35rem;
}
.sipadu-ikon-opsi {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.2rem;
    padding: 0.5rem 0.25rem;
    font: inherit;
    color: var(--ina-content-primary);
    background: transparent;
    border: 1px solid transparent;
    border-radius: var(--ina-radius-md, 8px);
    cursor: pointer;
}
.sipadu-ikon-opsi:hover,
.sipadu-ikon-opsi:focus-visible {
    background: var(--ina-primary-50, #eef4ff);
    border-color: var(--ina-primary-300);
    outline: none;
}
.sipadu-ikon-opsi .ti { font-size: 1.35rem; color: var(--ina-primary-600); }
.sipadu-ikon-opsi__nama {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 0.65rem;
    color: var(--ina-content-tertiary);
}

/* =====================================================================
   HALAMAN ARTIKEL — tata dua kolom, reel, dan sidebar
   ===================================================================== */

/* Memusatkan wadah isi. `.sipadu-container` dibatasi 1440px TANPA margin auto
   — benar untuk layar aplikasi, yang ruang kanannya memang milik tata letak
   bersidebar, tetapi membuat halaman publik menggumpal di kiri pada layar
   lebar. Dipasang lewat $body_class supaya hanya halaman yang meminta. */
.sipadu-body--tengah .sipadu-container { margin-inline: auto; }

.sipadu-artikel-tata {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-5, 1.25rem);
    align-items: start;
}
/* Kolom sisi baru muncul mulai 1100px. Di bawah itu ia akan menyisakan kolom
   utama yang terlalu sempit untuk dua kartu artikel berdampingan — dan kisi
   satu kolom pada layar selebar tablet terbaca seperti halaman yang rusak.
   Di bawah titik ini keduanya menumpuk, mengikuti urutan markup: artikel dulu,
   baru reel. */
@media (min-width: 1100px) {
    /* :has() menjaga agar kolom kedua tidak pernah dipesan saat kolom sisinya
       tidak dirender. View sudah tidak merendernya saat kosong; aturan ini
       lapis keduanya, untuk pemakaian berikutnya yang lupa. Peramban tanpa
       :has() mengabaikan seluruh aturan ini dan mendapat satu kolom — merosot
       dengan benar, bukan rusak. */
    .sipadu-artikel-tata:has(.sipadu-artikel-sisi) {
        grid-template-columns: minmax(0, 1fr) 20rem;
    }
}

/* Kisi kartu artikel kini hidup di dalam kolom yang lebih sempit, jadi jumlah
   kolomnya dihitung ulang terhadap lebar KOLOM itu, bukan lebar layar. Tanpa
   ini, tiga kartu berdesakan di ruang yang hanya cukup untuk dua. */
@media (min-width: 1100px) {
    .sipadu-artikel-tata:has(.sipadu-artikel-sisi) .sipadu-artikel-kisi {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}
@media (min-width: 1500px) {
    .sipadu-artikel-tata:has(.sipadu-artikel-sisi) .sipadu-artikel-kisi {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

/* Halaman BACA: kisinya mengikuti lebar baca, lalu seluruh kisi itu dipusatkan.
   Bedanya dengan katalog penting — di katalog kolom pertama memang harus
   terisi penuh oleh kisi kartu, sedangkan di sini isinya dibatasi ukuran baca
   yang nyaman. Membiarkan kolom pertama mengambil seluruh sisa lebar membuat
   artikel menempel di kiri, sidebar di kanan, dan lubang ratusan piksel
   menganga di antaranya.

   42rem dipilih sedikit DI BAWAH batas 78ch milik .sipadu-artikel-baca, supaya
   yang menentukan lebarnya adalah kolom ini — bukan dua batas yang saling
   berebut dan menyisakan celah yang tidak pernah bulat. */
.sipadu-artikel-tata .sipadu-artikel-baca { margin-inline: 0; }
@media (min-width: 1100px) {
    .sipadu-artikel-tata--baca:has(.sipadu-artikel-sisi) {
        grid-template-columns: minmax(0, 42rem) 20rem;
        justify-content: center;
    }
}

.sipadu-artikel-sisi { min-width: 0; }
@media (min-width: 1100px) {
    /* Menempel saat digulir — reel dan daftar artikel lain tetap terjangkau
       sepanjang halaman, tanpa harus menggulir kembali ke atas.
       Nilai top mengikuti tinggi topbar yang memang sticky di atasnya. */
    .sipadu-artikel-sisi {
        position: sticky;
        top: calc(var(--sipadu-topbar-height, 64px) + 1rem);
    }
}

/* ---------------------------- REEL ---------------------------- */

.sipadu-reel {
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 12px);
    background: var(--ina-background-primary);
    overflow: hidden;
}
.sipadu-reel__kepala {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.6rem 0.75rem;
    border-bottom: 1px solid var(--ina-stroke-primary);
}
.sipadu-reel__judul {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-primary);
}
.sipadu-reel__judul .ti { color: var(--ina-primary-600); }
.sipadu-reel__jumlah {
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
    font-variant-numeric: tabular-nums;
}

/* Pita yang digeser. Gulir + scroll-snap, BUKAN transform yang digerakkan
   JavaScript: di ponsel ia langsung bisa digeser dengan jari tanpa satu baris
   kode, dan bila reel.js gagal dimuat pitanya MASIH berfungsi — yang hilang
   hanya dua tombol panah. */
.sipadu-reel__pita {
    display: flex;
    gap: 0.5rem;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    /* Bilah gulir disembunyikan karena navigasinya sudah disediakan tombol
       panah + geseran jari; bilah mendatar setipis ini di dalam kartu hanya
       terbaca sebagai cacat tata letak. */
    scrollbar-width: none;
    -ms-overflow-style: none;
    padding: 0.5rem;
}
.sipadu-reel__pita::-webkit-scrollbar { display: none; }
/* Fokus keyboard HARUS tetap terlihat: pitanya tabindex="0" supaya dapat
   digulir dengan panah papan ketik. */
.sipadu-reel__pita:focus-visible { outline: 2px solid var(--ina-primary-600); outline-offset: -2px; }

.sipadu-reel__kartu {
    flex: 0 0 100%;
    scroll-snap-align: center;
    min-width: 0;
}
.sipadu-reel__media {
    position: relative;
    /* 9:16 — rasio reel. Bahan yang tersedia di instansi hampir selalu sudah
       berbentuk begitu karena dibuat lebih dulu untuk Instagram/TikTok. */
    aspect-ratio: 9 / 16;
    border-radius: var(--ina-radius-md, 8px);
    overflow: hidden;
    background: var(--ina-neutral-900, #111);
}
/* MUAT UTUH, bukan dipotong penuh.
   Kartu berasio 9:16 sedangkan bahan yang diunggah sering poster mendatar;
   `cover` memotong sisi kiri-kanannya, dan yang terpotong justru tulisan di
   tepi poster. `contain` membuat seluruh gambar terlihat, dan ruang sisanya
   diisi lapisan kabur di bawah ini. */
.sipadu-reel__gambar,
.sipadu-reel__video {
    position: relative;
    z-index: 1;
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
}

/* Lapisan latar: salinan gambar yang sama, dipotong penuh lalu dikaburkan.
   Warnanya karena itu SELALU berasal dari gambarnya sendiri — bukan satu kotak
   abu-abu yang sama untuk semua media.

   scale(1.12) wajib: blur menarik piksel dari luar tepi elemen, dan tanpa
   diperbesar tepinya menjadi pudar transparan sehingga latar kartu yang gelap
   menyembul sebagai bingkai tipis. */
.sipadu-reel__latar {
    position: absolute;
    inset: 0;
    z-index: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    filter: blur(22px) saturate(1.45) brightness(0.92);
    transform: scale(1.12);
    /* Murni hiasan: tidak boleh ikut menerima klik maupun dibacakan
       pembaca layar (atribut aria-hidden di markup menjaga yang kedua). */
    pointer-events: none;
}

/* Teks di atas media. Gradien gelap di belakangnya, bukan sekadar teks putih:
   media apa pun boleh diunggah, termasuk foto terang, dan keterbacaan judul
   tidak boleh bergantung pada seterang apa gambar yang kebetulan dipasang. */
.sipadu-reel__teks {
    position: absolute;
    inset: auto 0 0 0;
    /* Di atas media (z-index 1) DAN latar kabur (0). Tanpa angka ini, media
       ber-z-index 1 menimpa teks — elemen berposisi tanpa z-index dicat pada
       tingkat 0, berapa pun urutannya di markup. */
    z-index: 2;
    padding: 2.5rem 0.75rem 0.75rem;
    color: var(--ina-base-white, #fff);
    background: linear-gradient(to top, rgb(0 0 0 / 82%) 0%, rgb(0 0 0 / 55%) 45%, rgb(0 0 0 / 0%) 100%);
    /* Kontrol bawaan <video> duduk di dasar elemennya; tanpa ini lapisan teks
       menutupi tombol putarnya dan videonya tidak bisa dijalankan sama sekali. */
    pointer-events: none;
}
.sipadu-reel__teks a { pointer-events: auto; }
/* Pada kartu video, teksnya diangkat di atas bilah kontrol bawaan peramban. */
.sipadu-reel__media:has(.sipadu-reel__video) .sipadu-reel__teks { padding-bottom: 3rem; }

.sipadu-reel__kartu-judul {
    margin: 0;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    line-height: 1.35;
    overflow-wrap: anywhere;
}
.sipadu-reel__kartu-ket {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin: 0.2rem 0 0;
    font-size: var(--ina-font-xs);
    color: rgb(255 255 255 / 85%);
}
.sipadu-reel__tautan {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-top: 0.4rem;
    font-size: var(--ina-font-xs);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-base-white, #fff);
    text-decoration: underline;
}

.sipadu-reel__nav {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    padding: 0 0.75rem 0.75rem;
}
.sipadu-reel__panah {
    display: grid;
    place-items: center;
    width: 32px;
    height: 32px;
    font-size: 1rem;
    color: var(--ina-content-primary);
    background: var(--ina-background-secondary);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: 999px;
    cursor: pointer;
}
.sipadu-reel__panah:hover:not(:disabled) { border-color: var(--ina-primary-500); color: var(--ina-primary-600); }
.sipadu-reel__panah:disabled { opacity: 0.4; cursor: default; }
.sipadu-reel__posisi {
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
    font-variant-numeric: tabular-nums;
    min-width: 3.5rem;
    text-align: center;
}

/* Pada layar sempit reel menumpuk di bawah katalog dan akan melebar penuh.
   Dibatasi supaya kartu 9:16 tidak menjulang setinggi dua layar. */
@media (max-width: 1099.98px) {
    .sipadu-reel { max-width: 22rem; margin-inline: auto; }
}

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

.sipadu-sisi-panel {
    padding: var(--ina-spacing-4, 1rem);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 12px);
    background: var(--ina-background-primary);
}
.sipadu-sisi-panel__judul {
    margin: 0 0 0.75rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-primary);
}
.sipadu-sisi-daftar { margin: 0; padding: 0; list-style: none; }
.sipadu-sisi-daftar > li + li {
    margin-top: 0.6rem;
    padding-top: 0.6rem;
    border-top: 1px solid var(--ina-stroke-secondary, var(--ina-stroke-primary));
}
.sipadu-sisi-item { display: block; text-decoration: none; color: inherit; }
.sipadu-sisi-item__judul {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-medium, 500);
    line-height: 1.4;
    color: var(--ina-content-primary);
    overflow-wrap: anywhere;
}
.sipadu-sisi-item:hover .sipadu-sisi-item__judul { color: var(--ina-primary-600); }
.sipadu-sisi-item__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem;
    margin-top: 0.2rem;
    font-size: var(--ina-font-xs);
    color: var(--ina-content-tertiary);
}
.sipadu-sisi-item__kategori { color: var(--ina-primary-600); font-weight: var(--ina-font-semibold); }
.sipadu-sisi-panel__semua {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin-top: 0.85rem;
    font-size: var(--ina-font-sm);
    font-weight: var(--ina-font-semibold);
    color: var(--ina-primary-600);
    text-decoration: none;
}
.sipadu-sisi-panel__semua:hover { text-decoration: underline; }

/* ---- Layar pengelolaan Reel (/reel) ---- */

.sipadu-reel-kelola {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-3, 0.75rem);
}
.sipadu-reel-kelola__item {
    display: flex;
    gap: var(--ina-spacing-3, 0.75rem);
    padding: var(--ina-spacing-3, 0.75rem);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: var(--ina-radius-lg, 12px);
    background: var(--ina-background-primary);
}
/* Pratinjau kecil dengan rasio yang SAMA dengan tampilan publiknya (9:16):
   pengelola harus melihat bentuk yang benar-benar akan tayang, bukan versi
   yang dipotong lain. */
.sipadu-reel-kelola__media {
    flex: 0 0 auto;
    /* align-self WAJIB. Induknya display:flex dengan align-items:stretch
       (nilai baku), dan peregangan itu MENIMPA aspect-ratio: pratinjau ikut
       setinggi baris, sehingga di layar sempit — tempat kolom teksnya paling
       tinggi — rasionya melenceng jadi 2,12 alih-alih 1,78. Terlihat saat
       diukur di peramban, tidak saat membaca aturannya. */
    align-self: flex-start;
    width: 72px;
    aspect-ratio: 9 / 16;
    border-radius: var(--ina-radius-md, 8px);
    overflow: hidden;
    background: var(--ina-background-tertiary, #e9edf5);
    display: grid;
    place-items: center;
}
.sipadu-reel-kelola__media { position: relative; }
.sipadu-reel-kelola__media img,
.sipadu-reel-kelola__media video {
    position: relative;
    z-index: 1;
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
}
.sipadu-reel-kelola__media .sipadu-reel-kelola__latar {
    position: absolute;
    inset: 0;
    z-index: 0;
    object-fit: cover;
    /* Blur lebih kecil daripada kartu publik — pratinjaunya hanya 72px, dan
       blur 22px di sana meratakan seluruhnya menjadi satu warna. */
    filter: blur(8px) saturate(1.4) brightness(0.95);
    transform: scale(1.15);
    pointer-events: none;
}
.sipadu-reel-kelola__kosong { font-size: 1.25rem; color: var(--ina-content-tertiary); }

.sipadu-reel-kelola__isi { flex: 1 1 auto; min-width: 0; }
.sipadu-reel-kelola__judul {
    margin: 0;
    font-weight: var(--ina-font-semibold);
    color: var(--ina-content-primary);
    overflow-wrap: anywhere;
}
.sipadu-reel-kelola__ket {
    margin: 0.15rem 0 0;
    font-size: var(--ina-font-sm);
    overflow-wrap: anywhere;
}
.sipadu-reel-kelola__aksi {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.35rem;
    margin-top: 0.6rem;
}
.sipadu-reel-kelola__aksi form { margin: 0; }

/* Pemilih jenis media: dua kartu radio, bukan <select>. Pilihannya hanya dua
   dan keduanya menentukan berkas apa yang boleh diunggah di bawahnya — lebih
   baik terlihat sekaligus daripada tersembunyi di dalam daftar. */
.sipadu-reel-jenis {
    display: flex;
    gap: 0.5rem;
    border: 0;
    padding: 0;
    margin: 0;
}
.sipadu-reel-jenis legend { margin-bottom: 0.25rem; }
.sipadu-reel-jenis__opsi {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.4rem 0.7rem;
    font-size: var(--ina-font-sm);
    border: 1px solid var(--ina-stroke-primary);
    border-radius: 999px;
    cursor: pointer;
}
.sipadu-reel-jenis__opsi:has(input:checked) {
    border-color: var(--ina-primary-500);
    background: var(--ina-primary-50, #eef4ff);
    color: var(--ina-primary-700);
    font-weight: var(--ina-font-semibold);
}
/* Radio-nya tetap ADA di DOM dan tetap dapat difokus keyboard — hanya
   digeser keluar pandangan. `display: none` akan mengeluarkannya dari urutan
   fokus sama sekali, sehingga pilihan ini mustahil diubah tanpa tetikus. */
.sipadu-reel-jenis__opsi input {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
}
.sipadu-reel-jenis__opsi:has(input:focus-visible) {
    outline: 2px solid var(--ina-primary-600);
    outline-offset: 2px;
}

/* Nilai aspek + reel berdampingan di halaman depan.
   Kolom reel 20rem, sama dengan di halaman Artikel — satu lebar untuk satu
   komponen, supaya kartunya tidak berubah bentuk antar-halaman. */
.sipadu-lp-aspek__dalam {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--ina-spacing-6, 1.5rem);
    align-items: start;
}
/* Dua kolom HANYA bila keduanya benar-benar dirender. Tanpa :has(), seksi yang
   isinya cuma salah satu akan memesan kolom untuk yang tidak ada — batang
   aspek menyempit sia-sia, atau reel terhimpit di kanan halaman yang kosong.
   Peramban tanpa :has() mendapat satu kolom: merosot dengan benar. */
@media (min-width: 992px) {
    .sipadu-lp-aspek__dalam:has(.sipadu-lp-aspek__nilai):has(.sipadu-lp-aspek__reel) {
        grid-template-columns: minmax(0, 1fr) 20rem;
    }
}
.sipadu-lp-aspek__nilai { min-width: 0; }
.sipadu-lp-aspek__reel { min-width: 0; }

/* SATU kolom batang selama ada reel di sampingnya — pada lebar berapa pun,
   bukan hanya di bawah 1200px seperti percobaan sebelumnya.
   Dua batang berdampingan di samping kolom reel membuat tiap batang tinggal
   separuh sisa lebar, sementara nama aspek resminya panjang-panjang
   ("Keterpaduan Layanan Digital Pemerintah"). Yang terbaca justru satu daftar
   menurun yang sejajar dengan kartu reel di kanannya.
   Tanpa reel, `.sipadu-lp-bar-list` tetap dua kolom seperti semula. */
.sipadu-lp-aspek__dalam:has(.sipadu-lp-aspek__reel) .sipadu-lp-bar-list {
    grid-template-columns: minmax(0, 1fr);
}

/* Lebar kartu reel di halaman depan DIBATASI, apa pun bentuk kisinya.
   Tanpa batas ini, reel yang berdiri sendiri (nilai belum diisi) melar selebar
   seksi — dan kartu berasio 9:16 selebar 1152px menjadi setinggi 2000px, satu
   kartu yang memenuhi dua layar penuh. Terlihat saat diukur: bidikan piksel
   gagal karena kartunya berada di luar viewport. */
.sipadu-lp-aspek__reel .sipadu-reel { max-width: 20rem; }

/* Menumpuk di bawah nilai pada layar sempit — dipusatkan supaya tidak
   menggantung di tepi kiri halaman. */
@media (max-width: 991.98px) {
    .sipadu-lp-aspek__reel .sipadu-reel { max-width: 22rem; margin-inline: auto; }
}
