/* =====================================================================
   Portal Padma - gaya antarmuka

   Tata letak mengikuti Bitrix24: menu utama vertikal di kiri, submenu
   horizontal di atas. Netral kebiruan dengan aksen teal.
   ===================================================================== */

:root {
  --ground:#f6f8f8; --surface:#fff; --surface-2:#eef3f4; --surface-3:#e6edee;
  --ink:#142126; --ink-soft:#33474f; --muted:#5c7178;
  --line:#dbe4e6; --line-soft:#e9eff0;
  --accent:#0d6e7c; --accent-2:#0a5b67; --accent-w:#e2f0f1;
  /* Tulisan di atas warna peringatan - putih harfiah, dan memang
     TIDAK ikut tema: latarnya var(--crit) di mode terang maupun
     gelap. Dijadikan token supaya gaya di EKOR berkas ini bisa
     memakainya tanpa menulis #hex, yang dilarang dua penjaga
     (uji_web_push, uji_proyek_fitur_nia). 22 Okt 2026. */
  --lencana-teks:#fff;
  --ok:#2f6f4c; --ok-w:#e4f1e8;
  --warn:#93610f; --warn-w:#fbf0da;
  --crit:#9e382b; --crit-w:#fae7e4;
  --radius:4px;
  --sidebar-lebar:240px;
  --sidebar-sempit:62px;
  --topbar-tinggi:56px;
  --subnav-tinggi:41px;
  --rel-lebar:54px; --notif-lebar:320px;
  /* Garis bagan dibuat terpisah dari --line. Garis pembatas tabel boleh
     samar, tapi garis penghubung bagan HARUS terbaca - itu satu-satunya
     yang menjelaskan siapa membawahi siapa. */
  --og-garis:#8fb0b8;
  --shadow:0 1px 2px rgba(20,33,38,.06), 0 8px 24px -18px rgba(20,33,38,.4);
}

@media (prefers-color-scheme: dark) {
  :root {
    /* Memberi tahu peramban bahwa halaman ini gelap. Tanpa ini, semua
       hiasan BAWAAN peramban tetap bergaya terang di atas halaman
       gelap: batang gulir putih dengan tombol panah, kotak pilihan
       bawaan yang menyala, dan bingkai isian bawaan. Satu baris ini
       memperbaiki semuanya sekaligus; tidak ada yang bisa ditambal
       dari sisi CSS kita sendiri. */
    color-scheme: dark;

    --ground:#0f1719; --surface:#162226; --surface-2:#1b2a2f; --surface-3:#213238;
    --ink:#dce7e9; --ink-soft:#b6c8cd; --muted:#8ca3aa;
    --line:#26383e; --line-soft:#1f3036;
    --accent:#4fb0be; --accent-2:#6cc4d0; --accent-w:#16333a;
    --ok:#6fbb8c; --ok-w:#142b1f;
    --warn:#d6a24a; --warn-w:#2e2413;
    --crit:#e0796a; --crit-w:#331714;
    --og-garis:#5c8590;
    --shadow:0 1px 2px rgba(0,0,0,.4), 0 10px 30px -20px rgba(0,0,0,.9);
  }
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--ground);
  color: var(--ink);
  font: 15px/1.6 "Segoe UI", system-ui, -apple-system, Roboto, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  display: flex;
  align-items: flex-start;
  min-height: 100vh;
}

h1,h2,h3,h4 { margin: 0; line-height: 1.25; font-weight: 600; }
h1 { font-size: 1.25rem; }
h2 { font-size: 1.12rem; }
h3 { font-size: .98rem; margin-top: .4rem; }
p  { margin: 0 0 .45rem; }
a  { color: var(--accent); }
hr.rule { border: none; border-top: 1px solid var(--line-soft); margin: 2px 0; width: 100%; }

.mono { font-family: ui-monospace, Consolas, "Cascadia Mono", monospace; }
.small { font-size: .84rem; }
.muted { color: var(--muted); }
.num { text-align: right; font-variant-numeric: tabular-nums; }
.req { color: var(--crit); }
.inline { display: inline; }

/* =====================================================================
   MENU UTAMA - kolom kiri
   ===================================================================== */

.sidebar {
  position: sticky;
  top: 0;
  height: 100vh;
  width: var(--sidebar-lebar);
  flex: 0 0 var(--sidebar-lebar);
  background: var(--surface);
  border-right: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  z-index: 40;
  transition: width .16s ease, flex-basis .16s ease;
}
body.sidebar-kecil .sidebar {
  width: var(--sidebar-sempit);
  flex-basis: var(--sidebar-sempit);
}

.brand {
  display: flex; align-items: center; gap: 10px;
  height: var(--topbar-tinggi);
  padding: 0 16px;
  border-bottom: 1px solid var(--line);
  font-weight: 600; color: var(--ink); text-decoration: none;
  white-space: nowrap; overflow: hidden; flex: 0 0 auto;
}
/* Logo Padmatirta.
   Berkasnya ada dua warna. Yang asli berwarna nyaris putih - dibuat
   untuk latar gelap - dan akan lenyap di tema terang, jadi versi tinta
   teal dipakai di sana. Keduanya dimuat (masing-masing ~3 KB) dan CSS
   yang memilih; ini lebih andal daripada menebak tema di sisi PHP,
   sebab temanya ikut pengaturan sistem pengguna. */
.brand-logo { height: 30px; width: auto; flex: 0 0 auto; display: block; }
.login-logo { height: 88px; width: auto; margin: 0 auto 4px; display: block; }

.utk-gelap  { display: none; }
@media (prefers-color-scheme: dark) {
  .utk-terang { display: none; }
  .utk-gelap  { display: block; }
}

/* Sisa gaya lama, masih dipakai di beberapa tempat. */
.brand-mark {
  width: 15px; height: 15px; flex: 0 0 15px;
  border-radius: 50% 50% 50% 2px;
  background: var(--accent); transform: rotate(45deg);
}
.brand-mark.big { width: 22px; height: 22px; flex-basis: 22px; }

.side-nav { flex: 1 1 auto; overflow-y: auto; padding: 10px 8px; display: flex; flex-direction: column; gap: 2px; }
/* Butir menu TIDAK BOLEH menyusut - menu yang lebih tinggi dari layar
   harus DIGULIR, bukan dijejalkan. .side-item/.side-sub memakai
   overflow:hidden, dan pada anak flex itu menghapus batas tinggi
   minimumnya: begitu isi menu melebihi 100vh, setiap butir dimampatkan
   (42px -> 18px) sampai huruf dan ikonnya berimpit. Paling terasa di
   halaman modul Operasional - cabangnya terbuka dengan empat anak -
   dilaporkan pemilik projek 30 Sep 2026; di halaman lain pun terjadi
   bila layarnya pendek. */
.side-nav > *, .side-anak > * { flex-shrink: 0; }

.side-item {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 11px; border-radius: var(--radius);
  color: var(--ink-soft); text-decoration: none;
  font-size: .93rem; white-space: nowrap; overflow: hidden;
  border-left: 3px solid transparent;
}
.side-item:hover { background: var(--surface-2); color: var(--ink); }
.side-item.aktif {
  background: var(--accent-w); color: var(--accent);
  border-left-color: var(--accent); font-weight: 600;
}
.side-item .ikon { width: 20px; height: 20px; flex: 0 0 20px; }

.side-segera { color: var(--muted); opacity: .55; cursor: default; }
.side-segera:hover { background: transparent; color: var(--muted); }

.side-pemisah {
  margin: 14px 11px 4px;
  font-size: .66rem; text-transform: uppercase; letter-spacing: .11em;
  color: var(--muted); white-space: nowrap; overflow: hidden;
}

.side-kaki { flex: 0 0 auto; border-top: 1px solid var(--line); padding: 8px; }
.side-lipat {
  width: 100%; display: flex; align-items: center; gap: 12px;
  padding: 8px 11px; border: none; border-radius: var(--radius);
  background: transparent; color: var(--muted);
  font: inherit; font-size: .86rem; cursor: pointer;
  white-space: nowrap; overflow: hidden;
}
.side-lipat:hover { background: var(--surface-2); color: var(--ink); }
.side-lipat svg { width: 20px; height: 20px; flex: 0 0 20px; transition: transform .16s ease; }
body.sidebar-kecil .side-lipat svg { transform: rotate(180deg); }

/* Saat menu diperkecil, hanya ikon yang tersisa */
body.sidebar-kecil .side-teks,
body.sidebar-kecil .brand-teks,
body.sidebar-kecil .side-pemisah span { display: none; }
body.sidebar-kecil .side-pemisah { border-top: 1px solid var(--line); margin: 10px 6px 6px; height: 1px; }
body.sidebar-kecil .side-item,
body.sidebar-kecil .side-lipat { justify-content: center; padding-left: 8px; padding-right: 8px; gap: 0; }
body.sidebar-kecil .brand { justify-content: center; padding: 0; }
body.sidebar-kecil .brand-logo { height: 26px; }

/* =====================================================================
   KOLOM ISI
   ===================================================================== */

.utama {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

.topbar {
  position: sticky; top: 0; z-index: 30;
  height: var(--topbar-tinggi);
  display: flex; align-items: center; gap: 14px;
  padding: 0 22px;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}
.topbar-judul { flex: 1 1 auto; min-width: 0; font-size: 1.1rem;
                overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.tombol-menu {
  display: none; border: none; background: transparent; color: var(--ink-soft);
  padding: 6px; border-radius: var(--radius); cursor: pointer;
}
.tombol-menu svg { width: 22px; height: 22px; display: block; }

.me { display: flex; align-items: center; gap: 10px; font-size: .85rem; flex: 0 0 auto; position: relative; }
.me-nama { color: var(--ink-soft); font-weight: 500; }
.me-link { color: var(--accent); text-decoration: none; }
.me-link:hover { text-decoration: underline; }

/* ---- pil jam berjalan ---- */

.absen-pil {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 13px; border-radius: 16px; border: 1px solid transparent;
  font: inherit; font-size: .82rem; font-weight: 600; cursor: pointer;
  background: var(--surface-2); color: var(--ink-soft);
  white-space: nowrap;
}
.absen-pil svg { width: 14px; height: 14px; flex: 0 0 auto; }
.absen-pil .absen-teks { font-variant-numeric: tabular-nums; }

.absen-jalan { background: var(--accent); color: #fff; }
.absen-jalan:hover { filter: brightness(1.07); }
.absen-jeda  { background: var(--warn-w, #fdf3dd); color: var(--warn, #8a6100);
               border-color: var(--warn, #8a6100); }
.absen-tutup { background: var(--ok-w, var(--surface-2)); color: var(--ok, var(--ink-soft)); }
.absen-kosong:hover { background: var(--line); color: var(--ink); }

.me-avatar {
  border: none; background: transparent; padding: 0; cursor: pointer;
  border-radius: 50%; line-height: 0;
}
.me-avatar:hover { box-shadow: 0 0 0 3px var(--accent-w); }

/* ---- panel akun ---- */

.me-panel[hidden] { display: none; }
.me-panel {
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 45;
  width: 320px; max-width: calc(100vw - 24px);
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 10px; box-shadow: 0 10px 34px rgba(10, 22, 26, .22);
  display: flex; flex-direction: column; padding: 12px; gap: 10px;
  text-align: left;
}
.me-kepala { display: flex; align-items: center; gap: 11px; }
.me-kepala-teks { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.me-kepala-teks strong { font-size: .95rem; }
.me-kepala-teks .tag { align-self: flex-start; }

.me-absen {
  border: 1px solid var(--line); border-radius: 8px;
  padding: 11px 12px; display: flex; flex-direction: column; gap: 8px;
}
.me-absen-kepala { margin: 0; font-size: .86rem; }
.me-absen-kepala strong { font-variant-numeric: tabular-nums; }
.me-absen p.muted { margin: 0; }
.me-absen-tombol { display: flex; gap: 8px; }
.me-absen-tombol form { flex: 1 1 0; }
.me-absen-tombol .btn { width: 100%; justify-content: center; }

.me-daftar { display: flex; flex-direction: column; }
.me-baris {
  display: flex; flex-direction: column; gap: 2px;
  padding: 8px 10px; border-radius: 6px;
  color: var(--ink-soft); text-decoration: none; font-size: .87rem;
}
.me-baris small { color: var(--muted); font-size: .76rem; }
.me-baris:hover { background: var(--surface-2); color: var(--ink); }
.me-baris-mati { opacity: .5; cursor: default; }
.me-baris-mati:hover { background: transparent; }

.me-kaki { border-top: 1px solid var(--line); padding-top: 9px; text-align: center; }

/* ---------------- submenu horizontal ---------------- */

.subnav {
  position: sticky; top: var(--topbar-tinggi); z-index: 25;
  display: flex; align-items: stretch; gap: 2px;
  padding: 0 22px;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
  overflow-x: auto;
}
.sub-item {
  display: flex; align-items: center;
  padding: 11px 14px 9px;
  color: var(--muted); text-decoration: none;
  font-size: .89rem; white-space: nowrap;
  border-bottom: 2px solid transparent;
}
.sub-item:hover { color: var(--ink); }
.sub-item.aktif { color: var(--accent); border-bottom-color: var(--accent); font-weight: 600; }

/* Modul yang belum dibangun: tetap terlihat, tidak bisa diklik. */
.sub-segera { color: var(--muted); opacity: .55; cursor: default; }
.sub-segera:hover { color: var(--muted); }

/* --- item yang punya daftar turun --- */

.sub-punya-turun { display: flex; align-items: stretch; position: relative; }
.sub-punya-turun .sub-induk { padding-right: 4px; }

.sub-panah {
  display: flex; align-items: center; justify-content: center;
  padding: 0 8px 2px 2px; border: none; background: transparent;
  color: var(--muted); cursor: pointer;
  border-bottom: 2px solid transparent;
}
.sub-punya-turun:hover > .sub-item,
.sub-punya-turun:hover > .sub-panah { color: var(--ink); }
.sub-panah svg { width: 13px; height: 13px; transition: transform .15s ease; }
.sub-panah:hover { color: var(--ink); }
.sub-panah[aria-expanded="true"] svg { transform: rotate(180deg); }
.sub-punya-turun .sub-induk.aktif + .sub-panah {
  color: var(--accent); border-bottom-color: var(--accent);
}

/* Daftar turunnya dipasang position:fixed oleh app.js supaya tidak
   terpotong oleh bilah submenu yang bisa digeser mendatar. */
/* Penting: kelas ini memasang display:flex, dan itu MENGALAHKAN aturan
   bawaan browser untuk atribut [hidden]. Tanpa baris di bawah, panelnya
   tampil terus dan menutupi menu lain. */
.sub-turun[hidden] { display: none; }

.sub-turun {
  position: fixed; z-index: 40; min-width: 190px;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 6px; box-shadow: var(--shadow-kuat, var(--shadow));
  padding: 5px; display: flex; flex-direction: column;
}
.sub-turun-item {
  display: block; padding: 8px 12px; border-radius: 4px;
  color: var(--ink-soft); text-decoration: none;
  font-size: .86rem; white-space: nowrap;
}
.sub-turun-item:hover { background: var(--surface-2); color: var(--ink); }
.sub-turun-item.aktif { color: var(--accent); font-weight: 600; background: var(--accent-w); }
.sub-turun-item.sub-segera:hover { background: transparent; }

.page { flex: 1 1 auto; padding: 22px; max-width: 1400px; width: 100%; }
.page-title { display: none; }   /* judul sudah tampil di topbar */

.foot {
  padding: 16px 22px 30px;
  color: var(--muted); font-size: .8rem;
  border-top: 1px solid var(--line);
}

/* ---------------- tirai untuk layar kecil ---------------- */

.tirai {
  position: fixed; inset: 0; z-index: 35;
  background: rgba(10, 22, 26, .45);
}

/* =====================================================================
   KOMPONEN
   ===================================================================== */

.grid { display: grid; gap: 18px; }
.grid-2 { grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); }

.card {
  background: var(--ground); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 20px; margin-bottom: 18px; box-shadow: var(--shadow);
  display: flex; flex-direction: column; gap: 12px;
}
.card-lead { border-top: 3px solid var(--accent); }
.card-narrow { max-width: 460px; }
.card-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; flex-wrap: wrap; }

.bar {
  display: flex; align-items: flex-end; gap: 12px; flex-wrap: wrap;
  margin-bottom: 16px; padding: 12px 16px;
  background: var(--ground); border: 1px solid var(--line); border-radius: var(--radius);
}
.bar label { display: flex; flex-direction: column; gap: 3px; font-size: .8rem; color: var(--muted); }

/* ---------------- pesan ---------------- */

.alert { padding: 11px 15px; border-radius: var(--radius); margin-bottom: 13px; border: 1px solid transparent; font-size: .92rem; }
.alert-ok    { background: var(--ok-w);     border-color: var(--ok);     color: var(--ok); }
.alert-error { background: var(--crit-w);   border-color: var(--crit);   color: var(--crit); }
.alert-warn  { background: var(--warn-w);   border-color: var(--warn);   color: var(--warn); }
.alert-info  { background: var(--accent-w); border-color: var(--accent); color: var(--accent); }
.alert a { color: inherit; }

/* ---------------- toast ----------------
   Kabar sekilas yang muncul SESUDAH sebuah perbuatan selesai, lalu
   hilang sendiri - 12 Okt 2026.

   Sebelum ini satu-satunya cara memberi kabar dari JavaScript adalah
   window.alert(), dan itu MENGHENTIKAN halaman sampai orangnya menekan
   OK. Untuk kabar baik - "berhasil" - itu salah bentuknya: yang berhasil
   tidak menuntut jawaban siapa pun.

   Warnanya dari token .alert yang sudah ada, bukan pasangan baru: satu
   kabar berhasil harus terlihat sama di mana pun ia muncul.

   aria-live di markupnya, bukan di sini - pembaca layar mengumumkannya
   tanpa memindahkan fokus, jadi orang yang sedang mengetik tidak
   terlempar. */
.toast-wadah {
  position: fixed; left: 50%; bottom: 26px; z-index: 90;
  transform: translateX(-50%);
  display: flex; flex-direction: column; gap: 8px;
  align-items: center;
  pointer-events: none;
}
.toast {
  max-width: min(420px, 92vw);
  padding: 10px 16px;
  border-radius: 999px;
  border: 1px solid transparent;
  font-size: .9rem;
  box-shadow: var(--shadow);
  background: var(--ok-w); border-color: var(--ok); color: var(--ok);
  animation: toast-masuk .18s ease-out;
}
.toast-buruk { background: var(--crit-w); border-color: var(--crit); color: var(--crit); }

@keyframes toast-masuk {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Yang menyetel "kurangi gerak" di sistemnya tetap melihat toastnya -
   yang dibuang hanya geraknya. */
@media (prefers-reduced-motion: reduce) {
  .toast { animation: none; }
}

.callout {
  padding: 12px 16px; background: var(--surface); border-left: 3px solid var(--accent);
  border-radius: 0 var(--radius) var(--radius) 0; margin-bottom: 16px;
  font-size: .92rem; color: var(--ink-soft);
}
.callout-warn { border-left-color: var(--warn); }

/* ---------------- form ---------------- */

.form, form.card { gap: 14px; }
.field { display: flex; flex-direction: column; gap: 5px; font-size: .85rem; color: var(--ink-soft); }
.field > span { font-weight: 500; }
.field-check { flex-direction: row; align-items: center; gap: 8px; }

input[type=text], input[type=email], input[type=password], input[type=number],
input[type=date], input[type=month], input[type=search], select, textarea {
  font: inherit; color: var(--ink); background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius); padding: 8px 10px; width: 100%;
}
input:focus, select:focus, textarea:focus { outline: 2px solid var(--accent); outline-offset: 1px; border-color: var(--accent); }

.actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 4px; }

.btn {
  font: inherit; font-size: .89rem; cursor: pointer; padding: 8px 15px;
  border-radius: var(--radius); border: 1px solid var(--line);
  background: var(--surface); color: var(--ink); text-decoration: none;
  display: inline-block; white-space: nowrap;
}
.btn:hover { background: var(--surface-2); }
.btn-primary { background: var(--accent); border-color: var(--accent); color: #fff; }
.btn-primary:hover { background: var(--accent-2); border-color: var(--accent-2); }
.btn-danger { background: var(--crit); border-color: var(--crit); color: #fff; }
.btn-ghost { background: transparent; }
.btn-mini { padding: 3px 9px; font-size: .77rem; }
.btn-block { width: 100%; }
.btn:disabled { opacity: .5; cursor: default; }

/* ---------------- avatar & profil ---------------- */

.avatar {
  width: 30px; height: 30px; border-radius: 50%; flex: 0 0 30px;
  background: var(--accent-w); color: var(--accent);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: .74rem; font-weight: 600;
}
.avatar-lg { width: 58px; height: 58px; flex-basis: 58px; font-size: 1.25rem; }
.avatar-sm { width: 22px; height: 22px; flex-basis: 22px; font-size: .62rem; }

/* Avatar berfoto. Inisial tetap ada di bawah fotonya sebagai lapisan
   cadangan - kalau gambarnya gagal dimuat, yang terlihat inisial, bukan
   bulatan kosong. Itu sebabnya <b> di dalamnya tidak disembunyikan
   dengan display:none, melainkan ditumpuk di belakang. */
.avatar-foto { position: relative; overflow: hidden; padding: 0; }
.avatar-foto > b {
  position: absolute; inset: 0; z-index: 0;
  display: flex; align-items: center; justify-content: center;
  font-weight: 600;
}
.avatar-foto > img {
  position: relative; z-index: 1;
  width: 100%; height: 100%; object-fit: cover; display: block;
  border-radius: 50%;
}

.profil { display: flex; gap: 16px; align-items: flex-start; }
.profil-teks { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.jalur { font-size: .82rem; color: var(--accent); }

.detail { display: grid; grid-template-columns: minmax(110px, auto) 1fr; gap: 6px 16px; margin: 0; font-size: .89rem; }
.detail dt { color: var(--muted); font-size: .8rem; }
.detail dd { margin: 0; color: var(--ink-soft); }

.orang-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.orang-list-rapat { gap: 6px; }
.orang-list li { display: flex; gap: 10px; align-items: center; }
.orang-teks { display: flex; flex-direction: column; line-height: 1.35; min-width: 0; }
.orang-teks a { text-decoration: none; font-size: .92rem; }
.orang-teks a:hover { text-decoration: underline; }
.orang-teks small { color: var(--muted); font-size: .78rem; }

/* ---------------- angka & batang ---------------- */

.tiles {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: 1px; background: var(--line); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.tile { background: var(--surface); padding: 12px 14px; display: flex; flex-direction: column; gap: 2px; }
.tile .k { font-size: .68rem; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); }
.tile .v { font-size: 1.5rem; font-weight: 600; font-variant-numeric: tabular-nums; }
.tile.is-warn .v { color: var(--warn); }

.bars { display: flex; flex-direction: column; gap: 6px; }
.bar-row { display: grid; grid-template-columns: minmax(90px, 1.4fr) 3fr 34px; gap: 10px; align-items: center; font-size: .82rem; }
.bar-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink-soft); }
.bar-track { background: var(--surface-2); border-radius: 2px; height: 9px; overflow: hidden; }
.bar-fill { display: block; height: 100%; background: var(--accent); border-radius: 2px; }
.bar-num { text-align: right; font-variant-numeric: tabular-nums; color: var(--muted); }

/* ---------------- tabel ---------------- */

.tbl-wrap { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); }
.tbl { width: 100%; border-collapse: collapse; font-size: .87rem; }
.tbl th, .tbl td { padding: 9px 12px; text-align: left; border-bottom: 1px solid var(--line-soft); vertical-align: top; }
.tbl thead th {
  background: var(--surface-2); color: var(--muted); font-weight: 500;
  font-size: .68rem; text-transform: uppercase; letter-spacing: .07em;
  border-bottom: 1px solid var(--line); white-space: nowrap;
}
.tbl tbody tr:last-child td { border-bottom: none; }
.tbl-hover tbody tr:hover { background: var(--surface-2); }
.row-off { opacity: .55; }
.tbl a { text-decoration: none; font-weight: 500; }
.tbl a:hover { text-decoration: underline; }

.pager { display: flex; gap: 8px; align-items: center; justify-content: center; margin-top: 16px; flex-wrap: wrap; }
.pager-info { font-size: .82rem; color: var(--muted); }

/* Penavigasi DI ATAS tabel.
   ----------------------------------------------------------------------
   Kisi jam kerja jauh lebih tinggi daripada satu layar, dan tombol yang
   hanya ada di bawahnya memaksa orang menggulung sampai dasar untuk
   pindah halaman lalu menggulung kembali ke atas untuk membacanya -
   setiap halaman, dua kali. Yang di atas ini jaraknya dibalik: rapat ke
   tabel di bawahnya, longgar dari penyaring di atasnya. */
.pager-atas {
  margin: 0 0 10px;
  justify-content: flex-end;
  padding: 0 2px;
}

/* Tombol yang tidak bisa ditekan TETAP TERGAMBAR, tidak dihilangkan.
   Kalau "Sebelumnya" lenyap di halaman 1, "Berikutnya" bergeser tempat
   setiap kali orang pindah halaman - dan yang menekan berturut-turut
   akan meleset. Tempatnya tetap; yang berubah cuma bisa tidaknya. */
.btn-mati {
  opacity: .4;
  cursor: default;
  pointer-events: none;
}

/* ---------------- label ---------------- */

.tag {
  display: inline-block; font-size: .67rem; text-transform: uppercase; letter-spacing: .05em;
  padding: 1px 6px; border-radius: 2px; border: 1px solid currentColor;
  white-space: nowrap; color: var(--muted);
}
.tag-ok   { color: var(--ok); }
.tag-warn { color: var(--warn); }
.tag-crit { color: var(--crit); }

/* ---------------- kepala halaman & chip penyaring ---------------- */

.page-head {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin-bottom: 14px;
}
.page-head-judul { font-family: inherit; font-size: 1.45rem; font-weight: 600; margin: 0; }

.cari-bar {
  display: flex; align-items: center; gap: 6px;
  margin-left: auto; flex: 1 1 260px; max-width: 460px;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 20px; padding: 3px 5px 3px 14px;
}
.cari-bar input[type=search] { border: none; background: transparent; padding: 5px 0; }
.cari-bar input[type=search]:focus { outline: none; }
.cari-bar .btn { border-radius: 16px; }

.chip-baris { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }
.chip-saring { padding: 0; background: none; border: none; }

.chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 11px; border-radius: 14px;
  background: var(--surface-2); color: var(--ink-soft);
  font-size: .8rem; white-space: nowrap; text-decoration: none;
  border: 1px solid transparent;
}
.chip b { font-weight: 600; color: var(--accent); }
.chip-aktif { background: var(--accent-w); color: var(--accent); border-color: var(--accent); font-weight: 600; }
.chip-aktif b { color: inherit; }
.chip-sepi { opacity: .5; }
.chip-samar { background: transparent; border-color: var(--line); color: var(--muted); }
.chip-buang:hover { background: var(--crit-w); color: var(--crit); }
.chip-hitung { margin-left: auto; font-size: .82rem; color: var(--muted); }

.chip-select {
  width: auto; min-width: 130px; padding: 5px 10px;
  border-radius: 14px; font-size: .82rem;
  background: var(--surface-2); border-color: transparent; color: var(--ink-soft);
}

input.chip-select { min-width: 200px; }
input.chip-select:focus {
  outline: none; border-color: var(--accent); background: var(--surface);
}

/* Label yang terlihat di depan .chip-select. Dibuat samar dan kecil agar
   tidak bersaing dengan chip di sebelahnya, tapi tetap terbaca - tanpa
   dia, pemilih "berapa baris" tersamar jadi penyaring ketiga. */
.chip-label {
  font-size: .8rem; color: var(--muted);
  white-space: nowrap; margin-right: -2px;
}

/* ---------------- struktur organisasi: bagan mendatar ---------------- */

.og-atas { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }

.og-bingkai { position: relative; }

.og-kanvas {
  overflow: auto;
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 22px 44px 64px;
  min-height: 420px;
  max-height: calc(100vh - var(--topbar-tinggi) - var(--subnav-tinggi) - 150px);
}
.og-panggung {
  width: max-content; margin: 0 auto;
  transform: scale(var(--zoom, 1));
  transform-origin: top center;
  transition: transform .12s ease;
}
.og-kanvas { cursor: grab; }
.og-kanvas.sedang-seret { cursor: grabbing; user-select: none; }
.og-kanvas a, .og-kanvas button { cursor: pointer; }

/* --- pohon: garis penghubung murni CSS, tanpa SVG --- */

ul.og {
  display: flex; justify-content: center; align-items: flex-start;
  list-style: none; margin: 0; padding: 0; position: relative;
}
ul.og:not(.og-akar) { padding-top: 26px; }
ul.og:not(.og-akar)::before {
  content: ''; position: absolute; top: 0; left: 50%;
  height: 30px; border-left: 2px solid var(--og-garis);
  margin-left: -1px;
}

.og > li {
  position: relative; display: flex; flex-direction: column; align-items: center;
  padding: 30px 9px 0;
}
.og > li::before, .og > li::after {
  content: ''; position: absolute; top: 0; right: 50%;
  width: 50%; height: 30px; border-top: 2px solid var(--og-garis);
}
.og > li::after { right: auto; left: 50%; border-left: 2px solid var(--og-garis); margin-left: -1px; }
.og > li:first-child::before, .og > li:last-child::after { border: 0 none; }
.og > li:last-child::before  { border-right: 2px solid var(--og-garis); border-radius: 0 8px 0 0; }
.og > li:first-child::after  { border-radius: 8px 0 0 0; }

/* Anak tunggal: cukup satu garis lurus, tanpa batang mendatar */
.og > li:only-child { padding-top: 0; }
.og > li:only-child::before, .og > li:only-child::after { display: none; }

/* Akar tidak punya induk, jadi tidak menggambar apa pun di atasnya */
.og-akar > li { padding-top: 0; }
.og-akar > li::before, .og-akar > li::after { display: none; }

.og li.og-tutup > ul.og { display: none; }

/* --- kartu departemen --- */

.og-kartu {
  position: relative; width: 216px;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 8px; display: flex; flex-direction: column;
  box-shadow: 0 1px 2px rgba(20,33,38,.05);
}
.og-kartu.terpilih  { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent); }
.og-kartu.milik-saya { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-w); }

.og-lencana {
  position: absolute; top: -9px; right: 8px;
  background: var(--accent); color: #fff;
  font-size: .58rem; text-transform: uppercase; letter-spacing: .06em;
  padding: 2px 8px; border-radius: 9px; white-space: nowrap;
}

.og-judul {
  display: block; padding: 11px 12px 7px;
  font-weight: 600; font-size: .87rem; color: var(--ink); text-decoration: none;
}
.og-judul:hover { color: var(--accent); text-decoration: underline; }

.og-isi { padding: 0 12px 11px; display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
.og-kepala { display: flex; align-items: center; gap: 7px; width: 100%; }
.og-kepala-teks { display: flex; flex-direction: column; line-height: 1.28; min-width: 0; }
.og-kepala-teks b { font-size: .8rem; font-weight: 500; color: var(--ink-soft);
                    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.og-kepala-teks small { font-size: .71rem; color: var(--muted);
                        overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.og-kepala.kosong { font-size: .74rem; color: var(--muted); font-style: italic; }

.og-label { font-size: .63rem; text-transform: uppercase; letter-spacing: .09em; color: var(--muted); }
.og-isi .chip { font-size: .73rem; padding: 2px 9px; }

.og-kaki {
  width: 100%; border: none; border-top: 1px solid var(--line-soft);
  background: transparent; color: var(--accent);
  font: inherit; font-size: .74rem; cursor: pointer;
  padding: 7px 10px; border-radius: 0 0 8px 8px;
  display: flex; align-items: center; justify-content: center; gap: 5px;
}
.og-kaki:hover { background: var(--accent-w); }
.og-kaki svg { width: 13px; height: 13px; transition: transform .15s ease; }
li.og-buka > .og-kartu .og-kaki svg { transform: rotate(180deg); }
.og-kaki-mati { color: var(--muted); cursor: default; }
.og-kaki-mati:hover { background: transparent; }


/* --- kartu yang cocok dengan pencarian --- */

.og-kartu.og-cocok {
  border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-w);
}
.og-kartu.og-cocok .og-judul { color: var(--accent); }

.og-kanvas { border-radius: 0 0 6px 6px; }

/* --- alat geser & zoom --- */

.og-alat {
  position: absolute; left: 12px; bottom: 12px;
  display: flex; align-items: center; gap: 6px;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 20px; padding: 4px 6px; box-shadow: var(--shadow);
}
.og-tombol {
  border: none; background: transparent; color: var(--ink-soft);
  font: inherit; font-size: .8rem; cursor: pointer;
  padding: 4px 10px; border-radius: 14px; line-height: 1.4;
}
.og-tombol:hover { background: var(--surface-2); color: var(--ink); }
.og-zoom { display: flex; align-items: center; gap: 2px; font-size: .77rem;
           color: var(--muted); font-variant-numeric: tabular-nums; }
.og-zoom #og-persen { min-width: 46px; text-align: center; }

/* --- panel kanan, melayang seperti di Bitrix --- */

.og-panel {
  position: fixed; right: 0; z-index: 28;
  top: calc(var(--topbar-tinggi) + var(--subnav-tinggi));
  bottom: 0; width: 330px;
  background: var(--surface); border-left: 1px solid var(--line);
  padding: 16px; overflow-y: auto;
  display: flex; flex-direction: column; gap: 14px;
  box-shadow: -10px 0 30px -24px rgba(20,33,38,.8);
}
.panel-kepala { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.panel-kepala h2 { font-size: 1.05rem; }
.panel-chip { display: flex; gap: 6px; flex-wrap: wrap; }
.panel-bagian { display: flex; flex-direction: column; gap: 8px; }
.panel-bagian h4 {
  font-size: .7rem; text-transform: uppercase; letter-spacing: .09em;
  color: var(--muted); font-weight: 600; margin: 0;
  padding-bottom: 6px; border-bottom: 1px solid var(--line-soft);
}
.panel-bagian .orang-list li { align-items: center; }
.panel-bagian .orang-list .tag { margin-left: auto; }

/* ---------------- ulang tahun ---------------- */

.ultah {
  display: flex; align-items: center; gap: 12px;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 12px 14px;
}
.ultah-ini { border-color: var(--accent); background: var(--accent-w); }
.ultah-tgl {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  width: 44px; height: 44px; flex: 0 0 44px;
  border-radius: var(--radius); background: var(--surface-2); color: var(--ink-soft);
}
.ultah-ini .ultah-tgl { background: var(--accent); color: #fff; }
.ultah-angka { font-size: 1.05rem; font-weight: 600; line-height: 1; }
.ultah-bulan { font-size: .62rem; text-transform: uppercase; letter-spacing: .06em; }
.ultah-tanda { color: var(--accent); font-weight: 600; }

/* ---------------- sel tabel karyawan ---------------- */

.sel-avatar { width: 42px; padding-right: 0; }
.sel-nama { min-width: 190px; }
.sel-nama a { font-size: .92rem; }
.sel-nama small { display: block; color: var(--muted); font-size: .77rem; margin-top: 1px; }

/* ---------------- login ---------------- */

.login-body { display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 24px; background: var(--ground); }
.login-card {
  width: 100%; max-width: 380px; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius);
  padding: 32px 28px; box-shadow: var(--shadow);
}
.login-head { text-align: center; margin-bottom: 20px; }
.login-head .brand-mark { display: inline-block; }
.login-head h1 { font-size: 1.2rem; margin: 10px 0 4px; }
.login-head p { color: var(--muted); font-size: .85rem; }
.login-note { margin: 18px 0 0; text-align: center; color: var(--muted); font-size: .79rem; }
.login-note + .login-note { margin-top: 8px; }

/* Keterangan di halaman Lupa kata sandi. Sengaja lebih terbaca
   daripada .login-note: yang ditulis di sana bukan catatan kaki,
   melainkan hal yang harus dibaca SEBELUM tombolnya ditekan - bahwa
   tautannya berumur pendek dan suratnya tidak tiba seketika. */
.login-terang {
  margin: 0 0 18px; font-size: .85rem; line-height: 1.6;
  color: var(--ink-soft);
}



/* =====================================================================
   KOTAK - panel dengan bilah perkecil / perbesar / tutup
   Bilahnya dipasang oleh app.js; di sini hanya tampilannya.
   ===================================================================== */

.kotak {
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 6px; margin-bottom: 18px;
  display: flex; flex-direction: column; overflow: hidden;
  box-shadow: var(--shadow);
}
.kotak-bar {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 8px 7px 14px;
  background: var(--surface); border-bottom: 1px solid var(--line);
  flex: 0 0 auto;
}
.kotak-judul { flex: 1 1 auto; font-size: .85rem; font-weight: 600;
               overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kotak-info  { font-size: .78rem; color: var(--muted); white-space: nowrap; }

.kotak-jendela { display: flex; gap: 3px; flex: 0 0 auto; }
.kotak-jendela button {
  width: 30px; height: 28px; border: none; background: transparent;
  border-radius: 4px; cursor: pointer; color: var(--muted);
  display: flex; align-items: center; justify-content: center; padding: 0;
}
.kotak-jendela button:hover { background: var(--surface-2); color: var(--ink); }
.kotak-jendela button svg { width: 15px; height: 15px; }
.kotak-jendela .kotak-btn-tutup:hover { background: var(--crit-w); color: var(--crit); }

.kotak-isi {
  padding: 14px 16px; min-width: 0;
  display: flex; flex-direction: column; gap: 12px;
}
.card-form { display: flex; flex-direction: column; gap: 12px; }
.kotak-isi > .tbl-wrap:only-child,
.kotak-isi > .og-bingkai:only-child { margin: -14px -16px; border: none; border-radius: 0; }

.kotak.kotak-minim .kotak-isi { display: none; }
.kotak.kotak-minim .kotak-bar { border-bottom: none; }

.kotak.kotak-maks {
  position: fixed; inset: 0; z-index: 60; margin: 0;
  border-radius: 0; border: none; box-shadow: none;
}
.kotak.kotak-maks .kotak-isi { flex: 1 1 auto; overflow: auto; }
.kotak.kotak-maks .wt-wrap,
.kotak.kotak-maks .og-kanvas { max-height: none; height: 100%; }

/* Gantt di layar penuh: kotak isinya dijadikan kolom lentur supaya
   grafiknya mengambil SISA tinggi yang benar-benar ada - bukan 100%
   yang mengabaikan keterangan dan peringatan di atasnya, lalu
   menyembunyikan baris terbawah di luar layar. min-height:0 wajib,
   tanpa itu flex menolak memperkecil anak yang isinya lebih tinggi. */
.kotak.kotak-maks[data-kotak="tugas-gantt"] .kotak-isi {
  display: flex; flex-direction: column;
}
.kotak.kotak-maks[data-kotak="tugas-gantt"] .tg-gantt {
  flex: 1 1 auto; min-height: 0; max-height: none;
}
body.ada-kotak-maks { overflow: hidden; }

.kotak.kotak-tutup { display: none; }
.kotak-lead { border-top: 3px solid var(--accent); }
.kotak-isi > .grid:only-child { margin: 0; }
.kotak-pulih { display: none; margin-bottom: 16px; }
.kotak-pulih.tampil { display: inline-block; }

/* =====================================================================
   WAKTU & LAPORAN
   ===================================================================== */

.periode { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.periode-teks { font-weight: 600; font-size: .95rem; min-width: 160px; text-align: center; }

.tiles-rapat { margin-left: auto; max-width: 420px; }
.tiles-rapat .tile { padding: 8px 12px; }
.tiles-rapat .tile .v { font-size: 1.15rem; }

/* ---------------- kisi jam kerja ---------------- */

.wt-wrap { max-height: calc(100vh - var(--topbar-tinggi) - var(--subnav-tinggi) - 240px); overflow: auto; }
.wt { border-collapse: separate; border-spacing: 0; min-width: 940px; }

.wt thead th {
  position: sticky; top: 0; z-index: 3;
  background: var(--surface-2);
  padding: 6px 8px; text-align: center;
}
.wt th.wt-nama {
  position: sticky; left: 0; z-index: 4;
  text-align: left; min-width: 230px; width: 230px;
}

.wt td { padding: 0; border-bottom: 1px solid var(--line-soft); }

.wt td.wt-nama {
  position: sticky; left: 0; z-index: 2;
  background: var(--surface);
  padding: 7px 10px; min-width: 230px; width: 230px;
  display: table-cell; vertical-align: middle; text-align: left;
  border-right: 1px solid var(--line);
}
.wt td.wt-nama .avatar { float: left; margin-right: 9px; }
.wt-nama-teks { display: block; overflow: hidden; }
.wt-nama-teks a { font-size: .87rem; text-decoration: none; font-weight: 500; }
.wt-nama-teks a:hover { text-decoration: underline; }
.wt-nama-teks small { display: block; color: var(--muted); font-size: .74rem;
                      overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.wt th.wt-hari { font-size: .68rem; line-height: 1.25; min-width: 88px;
                 text-align: center; vertical-align: middle; }
.wt-hari-nama { display: block; text-transform: uppercase; letter-spacing: .06em; }
.wt-hari-tgl  { display: block; font-size: .78rem; color: var(--ink-soft); font-weight: 600; }

/* Ditulis sebagai ".wt td.wt-sel", bukan ".wt-sel" saja.
   Aturan umum tabel ".tbl th, .tbl td" memakai rata kiri dan rata atas,
   dan kekhususannya (0,1,1) LEBIH TINGGI daripada satu kelas (0,1,0) -
   jadi ".wt-sel { text-align: center }" selama ini kalah dan tidak
   pernah berlaku. Baris jam masuk-pulang terlihat di tengah hanya
   karena ia memasang text-align pada dirinya sendiri. */
.wt td.wt-sel {
  text-align: center; vertical-align: middle;
  font-size: .8rem; padding: 6px 5px;
  font-variant-numeric: tabular-nums; color: var(--ink-soft);
  border-left: 1px solid var(--line-soft);
  position: relative; white-space: nowrap;
}
.jm-u { font-size: .68em; color: var(--muted); margin: 0 1px 0 1px; }

/* Jam masuk - jam pulang, satu baris kecil di bawah lama kerja. */
.wt-io {
  display: block; margin-top: 2px; text-align: center;
  font-size: .63rem; letter-spacing: 0; color: var(--muted);
}
.wt-io-pisah { margin: 0 2px; opacity: .7; }
.wt-janggal .wt-io, .wt-pendek .wt-io,
.wt-jeda .wt-io, .wt-buka .wt-io { color: inherit; opacity: .78; }

.wt-libur { background: var(--surface-2); }
.wt-kini  { box-shadow: inset 0 0 0 1px var(--accent); }
.wt th.wt-kini { background: var(--accent-w); color: var(--accent); }

.wt-janggal { background: var(--crit-w); color: var(--crit); font-weight: 600; }
.wt-pendek  { background: var(--warn-w); color: var(--warn); }
.wt-jeda    { background: var(--warn-w); color: var(--warn); }
.wt-tanda-jalan { color: var(--accent); font-size: .6rem; }
.wt-buka    { background: var(--accent-w); color: var(--accent); }

.wt-tanda {
  display: inline-flex; align-items: center; justify-content: center;
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--crit); color: #fff;
  font-size: .62rem; font-weight: 700; margin-left: 3px; vertical-align: middle;
}
.wt-tanda-info { background: var(--accent); }

.wt td.wt-total, .wt th.wt-total {
  text-align: center; vertical-align: middle;
  font-weight: 600; font-variant-numeric: tabular-nums;
  padding: 8px 10px; background: var(--surface-2); white-space: nowrap;
  border-left: 1px solid var(--line);
}

.wt-grup td {
  background: var(--surface-3); font-size: .72rem; font-weight: 600;
  text-transform: uppercase; letter-spacing: .07em; color: var(--muted);
  padding: 6px 10px; position: sticky; left: 0;
}

.wt-kaki { display: flex; gap: 18px; flex-wrap: wrap; align-items: center;
           margin-top: 12px; font-size: .78rem; color: var(--muted); }
.wt-kunci { display: flex; align-items: center; gap: 6px; }
.wt-kunci .wt-warna { width: 14px; height: 14px; border-radius: 3px; display: inline-block;
                   border: 1px solid var(--line); }

/* ---------------- daftar laporan kerja ---------------- */

.lap-daftar { display: flex; flex-direction: column; gap: 12px; }

.lap {
  background: var(--ground); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 14px 16px;
  display: flex; flex-direction: column; gap: 9px;
}
.lap-kepala { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.lap-orang { display: flex; flex-direction: column; line-height: 1.3; min-width: 0; }
.lap-orang a { font-weight: 500; font-size: .92rem; text-decoration: none; }
.lap-orang a:hover { text-decoration: underline; }
.lap-orang small { color: var(--muted); font-size: .76rem; }
.lap-meta { margin-left: auto; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

.lap-isi { font-size: .9rem; color: var(--ink-soft); margin: 0; }
.lap-rencana { border-left: 2px solid var(--line); padding-left: 12px; }
.lap-rencana h4 {
  font-size: .66rem; text-transform: uppercase; letter-spacing: .09em;
  color: var(--muted); margin: 0 0 2px;
}
.lap-rencana p { font-size: .85rem; color: var(--ink-soft); margin: 0; }
.lap-kaki { padding-top: 8px; border-top: 1px solid var(--line-soft); }

.tag-status-0 { color: var(--muted); }
.tag-status-1 { color: var(--accent); }
.tag-status-2 { color: var(--ok); }
.tag-status-3 { color: var(--warn); }
.tag-status-4 { color: var(--crit); }

/* =====================================================================
   LAYAR KECIL - menu utama menjadi laci yang digeser
   ===================================================================== */

@media (max-width: 900px) {
  .sidebar {
    position: fixed; left: 0; top: 0;
    width: var(--sidebar-lebar); flex-basis: var(--sidebar-lebar);
    transform: translateX(-100%);
    transition: transform .18s ease;
    box-shadow: var(--shadow);
  }
  body.sidebar-buka .sidebar { transform: translateX(0); }
  body.sidebar-kecil .sidebar { width: var(--sidebar-lebar); flex-basis: var(--sidebar-lebar); }
  body.sidebar-kecil .side-teks,
  body.sidebar-kecil .brand-teks,
  body.sidebar-kecil .side-pemisah span { display: inline; }
  body.sidebar-kecil .side-item, body.sidebar-kecil .side-lipat { justify-content: flex-start; gap: 12px; }

  .tombol-menu { display: block; }
  .side-kaki { display: none; }

  .topbar, .subnav, .page, .foot { padding-left: 14px; padding-right: 14px; }
  .me-nama, .me .tag { display: none; }
  .detail { grid-template-columns: 1fr; gap: 2px 0; }
  .detail dt { margin-top: 8px; }

  /* Panel struktur pindah ke bawah bagan */
  .struktur { flex-direction: column; }
  .struktur-panel { position: static; width: 100%; flex-basis: auto; max-height: none; }

  .page-head { gap: 10px; }
  .cari-bar { margin-left: 0; max-width: none; }
  .chip-hitung { margin-left: 0; }
}

@media (min-width: 901px) {
  .tirai { display: none !important; }
}


/* =====================================================================
   LAPORAN KERJA
   ===================================================================== */

/* --- kisi karyawan x tanggal --- */

.lap-kisi th.lap-persen, .lap-kisi td.lap-persen {
  min-width: 74px; width: 74px; text-align: center;
  font-size: .78rem; white-space: nowrap;
}
.lap-kisi td.lap-persen { font-variant-numeric: tabular-nums; color: var(--ink-soft); }
.lap-kisi td.lap-persen.is-warn { color: var(--warn); font-weight: 600; }
.lap-kisi thead th.lap-persen { color: var(--muted); font-weight: 600; line-height: 1.25; }

.wt.lap-kisi th.wt-hari { min-width: 58px; width: 58px; }

/* Kolom nama sedikit lebih lebar: barisnya menjorok mengikuti garis
   komando, jadi nama di tingkat dalam butuh ruang tambahan. */
.wt.lap-kisi th.wt-nama, .wt.lap-kisi td.wt-nama { min-width: 264px; width: 264px; }

/* Tanda cabang kecil di kiri avatar, penanda "ini bawahan baris di atas". */
.lap-kisi .og-cabang {
  float: left; width: 7px; height: 9px; margin: 6px 4px 0 -9px;
  border-left: 1px solid var(--og-garis); border-bottom: 1px solid var(--og-garis);
  border-bottom-left-radius: 3px; opacity: .75;
}
.lap-kisi .wt-hari-tgl { display: block; font-size: .84rem; font-weight: 600; }
.lap-kisi .wt-hari-nama { display: block; font-size: .68rem; color: var(--muted); }

.lap-kisi td.lap-sel { padding: 3px 4px; text-align: center; vertical-align: middle; }

.lap-chip {
  display: block; padding: 4px 2px; border-radius: 4px;
  font-size: .72rem; font-weight: 600; text-decoration: none;
  color: #fff; background: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lap-chip:hover { filter: brightness(1.08); }

.lap-positif { background: #55a06b; color: #fff; }
.lap-negatif { background: #c4574f; color: #fff; }
.lap-tanpa   { background: #7f93a0; color: #fff; }
.lap-kirim   { background: #b9c3c9; color: #33454d; }
.lap-draf    { background: transparent; color: var(--muted);
               border: 1px dashed var(--line); }
.lap-kosong  { background: transparent; color: var(--muted);
               border: 1px dashed var(--line); font-weight: 400; }
.lap-kosong:hover { border-color: var(--accent); color: var(--accent); }

/* --- kepala "dari - kepada" --- */

.lap-kepala-kotak {
  display: flex; flex-wrap: wrap; gap: 10px;
  background: var(--surface-2); border-radius: 8px; padding: 11px 13px;
}
.lap-pihak {
  display: flex; align-items: center; gap: 8px; flex: 1 1 240px;
  font-size: .88rem; min-width: 0;
}
.lap-pihak .k {
  font-size: .68rem; text-transform: uppercase; letter-spacing: .08em;
  color: var(--muted); flex: 0 0 auto;
}
.lap-pihak strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* --- bagian isi laporan --- */

.lap-bagian h4 {
  margin: 0 0 6px; font-size: .74rem; text-transform: uppercase;
  letter-spacing: .08em; color: var(--muted);
}
.lap-bagian p { margin: 0; }
.prewrap { white-space: pre-wrap; word-break: break-word; }

.lap-nilai {
  border: 1px solid var(--line); border-radius: 8px; padding: 12px 13px;
  display: flex; flex-direction: column; gap: 9px;
}
.lap-nilai h4 {
  margin: 0; font-size: .74rem; text-transform: uppercase;
  letter-spacing: .08em; color: var(--muted);
}
.lap-nilai p { margin: 0; }
.lap-nilai-form { display: flex; flex-wrap: wrap; gap: 8px; }

.btn-ok   { background: var(--ok-w);   border-color: var(--ok);   color: var(--ok); }
.btn-crit { background: var(--crit-w); border-color: var(--crit); color: var(--crit); }

/* --- komentar --- */

.komentar-list { list-style: none; margin: 0 0 10px; padding: 0;
                 display: flex; flex-direction: column; gap: 10px; }
.komentar-list li { display: flex; gap: 9px; }
.komentar-isi { min-width: 0; flex: 1 1 auto; }
.komentar-kepala { display: flex; gap: 8px; align-items: baseline; margin-bottom: 2px; }
.komentar-kepala strong { font-size: .86rem; }
.komentar-isi p { margin: 0; font-size: .88rem; }

.komentar-form { display: flex; gap: 8px; align-items: flex-start; }
.komentar-form textarea { flex: 1 1 auto; min-height: 42px; }

/* --- pita peringatan dengan tombol --- */

.callout-aksi { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.callout-aksi .btn { margin-left: auto; }


/* =====================================================================
   LAMPIRAN
   ===================================================================== */

.lampiran { display: flex; flex-direction: column; gap: 9px; }
.lampiran-kepala { display: flex; flex-direction: column; gap: 2px; }
.lampiran-kepala > span:first-child {
  font-size: .74rem; text-transform: uppercase; letter-spacing: .08em; color: var(--muted);
}

.lampiran-zona {
  border: 1px dashed var(--line); border-radius: 8px;
  padding: 12px 14px; display: flex; flex-direction: column; gap: 7px;
  background: var(--surface-2);
}
.lampiran-zona.lampiran-siap { border-color: var(--accent); background: var(--accent-w); }
.lampiran-zona.sibuk { opacity: .6; pointer-events: none; }
.lampiran-zona input[type=file] { font-size: .84rem; }

.lampiran-daftar {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
}
.lampiran-item {
  position: relative; border: 1px solid var(--line); border-radius: 8px;
  padding: 8px; display: flex; flex-direction: column; gap: 5px;
  background: var(--surface); min-width: 0;
}
.lampiran-gambar { display: block; line-height: 0; }
.lampiran-gambar img {
  width: 100%; height: 84px; object-fit: cover; border-radius: 5px; display: block;
}
.lampiran-nama {
  font-size: .78rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lampiran-ukuran { font-size: .72rem; color: var(--muted); }

.lampiran-buang {
  position: absolute; top: 4px; right: 4px;
  width: 22px; height: 22px; border: none; border-radius: 50%;
  background: rgba(10, 22, 26, .62); color: #fff;
  font-size: 1rem; line-height: 1; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.lampiran-buang:hover { background: var(--crit); }

/* Ikon berkas: label pendek berwarna, supaya Excel dan Word langsung
   terbeda tanpa perlu membaca nama berkasnya. */
.lampiran-ikon {
  display: flex; align-items: center; justify-content: center;
  height: 84px; border-radius: 5px; text-decoration: none;
  font-size: .82rem; font-weight: 700; letter-spacing: .04em;
  color: #fff; background: #7f93a0;
}
li .lampiran-ikon { height: 38px; width: 46px; flex: 0 0 auto; font-size: .7rem; }

.golongan-excel  { background: #217346; }
.golongan-word   { background: #2b579a; }
.golongan-ppt    { background: #c04a26; }
.golongan-pdf    { background: #b02a25; }
.golongan-arsip  { background: #6b5b45; }
.golongan-gambar { background: #4f7f8c; }
.golongan-lain   { background: #7f93a0; }

.lampiran-pesan { margin: 0; font-size: .82rem; color: var(--muted); }
.lampiran-pesan.buruk { color: var(--crit); }

/* --- tampilan lampiran pada laporan yang sudah jadi --- */

.lampiran-galeri {
  display: grid; gap: 8px; margin-bottom: 10px;
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
}
.lampiran-galeri a { line-height: 0; }
.lampiran-galeri img {
  width: 100%; height: 108px; object-fit: cover;
  border-radius: 6px; border: 1px solid var(--line); display: block;
}

.berkas-list { list-style: none; margin: 0; padding: 0;
               display: flex; flex-direction: column; gap: 8px; }
.berkas-list li { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.berkas-teks { display: flex; flex-direction: column; min-width: 0; }
.berkas-teks a { font-size: .88rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.berkas-teks small { color: var(--muted); font-size: .75rem; }


/* =====================================================================
   REL KANAN + PEMBERITAHUAN
   Letaknya mengikuti Bitrix: satu kolom sempit menempel di tepi kanan,
   lonceng di paling atas.
   ===================================================================== */

/* Rel menempel tepat di bawah topbar dan memenuhi tepi kanan layar.
   Lajur selebar --rel-lebar memang sudah disisakan untuknya di .utama;
   sebelumnya rel mengambang di tengah lajur itu sehingga yang terlihat
   justru ruang kosong dengan tiga tombol menggantung di dalamnya. */
.rel {
  position: fixed; top: 0; right: 0; bottom: 0;
  width: var(--rel-lebar); z-index: 30;
  display: flex; flex-direction: column; align-items: center;
  gap: 6px;
  /* Rel dimulai dari paling atas, bukan dari bawah topbar. Topbar sudah
     menyisakan lajur selebar ini di kanannya; kalau rel baru mulai di
     bawah topbar, sisa lajur setinggi topbar itu menganga kosong tanpa
     ada isinya. Ikon pertamanya tetap sejajar di bawah garis topbar
     lewat padding, jadi tampilannya tidak berubah - yang hilang hanya
     kotak kosong di pojok kanan atas. */
  padding: calc(var(--topbar-tinggi) + 9px) 0 9px;
  background: var(--surface); border-left: 1px solid var(--line);
}
.rel-tombol {
  position: relative; width: 38px; height: 38px; border-radius: 50%;
  border: none; background: transparent;
  color: var(--muted); cursor: pointer;
  display: flex; align-items: center; justify-content: center; padding: 0;
}
.rel-tombol svg { width: 19px; height: 19px; }
.rel-tombol:hover { background: var(--surface-2); color: var(--ink); }
.rel-mati { opacity: .45; cursor: default; }
.rel-mati:hover { background: transparent; color: var(--muted); }

.rel-nyala { color: var(--accent); background: var(--accent-w); }
.rel-nyala:hover { background: var(--accent-w); color: var(--accent); }
.rel-angka {
  position: absolute; top: -4px; right: -4px; min-width: 18px; height: 18px;
  padding: 0 5px; border-radius: 9px;
  background: var(--crit); color: #fff;
  font-size: .66rem; font-weight: 700; line-height: 18px; text-align: center;
}
/* Angkanya kini SELALU tergambar dan disembunyikan saat nol, supaya
   lencana.js bisa mengubahnya tanpa memuat ulang halaman.

   JUJURNYA: hari ini baris ini tidak menanggung apa-apa - .rel-angka
   tidak menyetel display sama sekali, jadi [hidden] bawaan peramban
   sudah cukup. Ia ditulis karena .side-lencana dan .dok-lencana
   memikulnya juga, dan karena hari pertama seseorang menambahkan
   display:flex ke .rel-angka adalah hari lencana merah KOSONG menempel
   di lonceng setiap orang yang tidak punya satu pun kabar - tanpa satu
   pun galat yang menunjuk ke sini. */
.rel-angka[hidden] { display: none !important; }

/* Panel melabuh di lajur kanan, bukan mengambang menutupi isi halaman.
   Saat dibuka, isi halaman menggeser ke kiri sebanyak lebar panel -
   dengan begitu laporan atau kisi yang sedang dibaca tetap utuh, dan
   lajur yang tadinya kosong di sebelah rel jadi ada gunanya. */
.notif-panel[hidden] { display: none; }
.notif-panel {
  position: fixed; top: var(--topbar-tinggi); right: var(--rel-lebar); bottom: 0; z-index: 46;
  width: var(--notif-lebar); max-width: 100vw;
  background: var(--surface); border-left: 1px solid var(--line);
  box-shadow: -8px 0 24px rgba(10, 22, 26, .10);
  display: flex; flex-direction: column; overflow: hidden;
}
.notif-kepala {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 11px 14px; border-bottom: 1px solid var(--line);
}
.notif-tandai {
  border: none; background: transparent; color: var(--accent);
  font: inherit; font-size: .78rem; cursor: pointer; padding: 0;
}
.notif-tandai:hover { text-decoration: underline; }

.notif-tutup {
  width: 26px; height: 26px; border: none; background: transparent;
  border-radius: 5px; color: var(--muted); cursor: pointer;
  display: flex; align-items: center; justify-content: center; padding: 0;
  flex: 0 0 auto;
}
.notif-tutup svg { width: 15px; height: 15px; }
.notif-tutup:hover { background: var(--surface-2); color: var(--ink); }

.notif-isi { display: flex; flex-direction: column; flex: 1 1 auto; overflow-y: auto; }
.notif-halaman { flex: none; overflow: visible; }

.notif-baris {
  display: flex; gap: 10px; padding: 11px 14px;
  border-bottom: 1px solid var(--line-soft); text-decoration: none;
  color: var(--ink-soft);
}
.notif-baris:last-child { border-bottom: none; }
.notif-baris:hover { background: var(--surface-2); }
.notif-belum { background: var(--accent-w); }
.notif-belum:hover { background: var(--accent-w); }

.notif-ikon {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--surface-2); color: var(--muted);
}
.notif-ikon svg { width: 16px; height: 16px; }
/* Panel "Yang menunggu Anda" di bilah kanan. Warnanya mengikuti
   artinya, sama dengan pemberitahuan: rapat yang sedang berjalan
   menuntut tindakan SEKARANG, pesan bisa dibaca sesudahnya. */
.notif-rapat { background: var(--warn-w);   color: var(--warn); }
.notif-pesan { background: var(--accent-w); color: var(--accent); }

.notif-laporan_baru    { background: var(--accent-w); color: var(--accent); }
.notif-laporan_dinilai { background: var(--ok-w);     color: var(--ok); }
.notif-komentar        { background: var(--warn-w);   color: var(--warn); }

/* Automation. Warnanya mengikuti arti, bukan urutan: yang menuntut
   tindakan berwarna peringatan, yang sekadar kabar berwarna netral,
   selesai hijau, batal merah. Orang mengenali warna sebelum membaca
   tulisannya - jadi warnanya harus jujur. */
.notif-auto_baru       { background: var(--warn-w);   color: var(--warn); }
.notif-auto_terkait    { background: var(--surface-3); color: var(--muted); }
.notif-auto_putus      { background: var(--accent-w); color: var(--accent); }
.notif-auto_selesai    { background: var(--ok-w);     color: var(--ok); }
.notif-auto_batal      { background: var(--crit-w);   color: var(--crit); }

.notif-teks { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.notif-teks strong { font-size: .85rem; color: var(--ink); }
.notif-teks small {
  font-size: .78rem; color: var(--muted);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.notif-teks em { font-size: .72rem; color: var(--muted); font-style: normal; }

.notif-kosong { margin: 0; padding: 22px 14px; text-align: center; color: var(--muted); font-size: .85rem; }
.notif-kaki {
  padding: 9px 14px; border-top: 1px solid var(--line);
  text-align: center; font-size: .82rem;
}

/* --- pencarian --- */

/* Kotak ketik di panel rel kanan. */
.cari-rel { display: flex; gap: 7px; padding: 12px 14px 4px; }
.cari-rel input {
  flex: 1 1 auto; min-width: 0;
  padding: 7px 10px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--surface);
  color: var(--ink); font: inherit; font-size: .86rem;
}
.cari-rel input:focus { outline: none; border-color: var(--accent); }

/* Kotak ketik di halaman /cari. */
.cari-form { display: flex; gap: 9px; margin-bottom: 14px; max-width: 620px; }
.cari-form input {
  flex: 1 1 auto; min-width: 0;
  padding: 10px 13px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--surface);
  color: var(--ink); font: inherit;
}
.cari-form input:focus { outline: none; border-color: var(--accent); }

.cari-ringkas { margin: 0 0 9px; }
.cari-tapis { margin-bottom: 16px; }

.cari-blok { margin-bottom: 22px; }
.cari-judul {
  display: flex; align-items: baseline; gap: 8px;
  font-size: .95rem; margin-bottom: 8px;
}
.cari-judul .muted { font-size: .8rem; font-weight: 400; }

.cari-daftar {
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface); overflow: hidden;
}
.cari-baris {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 13px; border-bottom: 1px solid var(--line);
  color: inherit; text-decoration: none;
}
.cari-baris:last-child { border-bottom: none; }
.cari-baris:hover { background: var(--surface-2); }
.cari-teks { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }
.cari-teks strong { font-size: .88rem; color: var(--ink); }
.cari-teks small {
  color: var(--ink-soft); font-size: .79rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cari-waktu { flex: 0 0 auto; font-size: .75rem; color: var(--muted); font-style: normal; }
.cari-lagi { display: inline-block; margin-top: 7px; font-size: .82rem; }

/* --- rincian absensi dari aplikasi ILP --- */

/* Sel kisi yang bisa diklik. Tanda titik kecil di pojok, bukan garis
   bawah: kisi ini padat, dan garis bawah pada tiap sel membuat seluruh
   tabel terlihat berkerut. Titiknya muncul tetap - yang hanya muncul
   saat disentuh mouse tidak pernah ditemukan orang yang tidak
   kebetulan melewatinya. */
.wt-sel-tautan {
  display: block; color: inherit; text-decoration: none;
  margin: -6px -7px; padding: 6px 7px;
}
.wt-sel-tautan:hover { text-decoration: none; }
.wt-ilp { position: relative; }
.wt-ilp::after {
  content: ''; position: absolute; top: 3px; right: 3px;
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--accent); opacity: .65;
}
.wt-ilp:hover { background: var(--accent-w); }
.wt-ilp:hover::after { opacity: 1; }

/* Halaman rinciannya. */
.ilp-sesi { display: flex; gap: 18px; flex-wrap: wrap; align-items: flex-start; }
.ilp-foto { flex: 0 0 auto; display: flex; flex-direction: column; gap: 5px; max-width: 220px; }
.ilp-foto img {
  display: block; width: 220px; max-width: 100%; height: auto;
  border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface-2);
}
.ilp-tanpa-foto {
  width: 220px; max-width: 100%; aspect-ratio: 3 / 4;
  border: 1px dashed var(--line); border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  background: var(--surface-2);
}
.ilp-rinci { flex: 1 1 260px; min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.ilp-titik {
  border-left: 3px solid var(--line); padding-left: 11px;
}
.ilp-titik-kepala { display: flex; align-items: baseline; gap: 9px; margin-bottom: 3px; }
.ilp-jam { font-variant-numeric: tabular-nums; font-size: 1.05rem; font-weight: 600; }
.ilp-alamat { font-size: .86rem; line-height: 1.5; }
.ilp-koordinat { font-variant-numeric: tabular-nums; margin-top: 2px; }

@media (max-width: 560px) {
  .ilp-foto, .ilp-foto img, .ilp-tanpa-foto { width: 100%; max-width: none; }
}

/* --- laporan absensi HRIS (tab HRIS di halaman Waktu) --- */

.tengah { text-align: center; }

.wt-tab { margin-bottom: 14px; }

/* Penyaringnya. Satu kisi yang melipat sendiri di layar sempit - bukan
   deretan mendatar yang memaksa orang menggulung ke samping di ponsel. */
.hris-saring { margin-bottom: 16px; }
.hris-kisi {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  margin-bottom: 10px;
}
.hris-kisi label { display: flex; flex-direction: column; gap: 4px; }
.hris-kisi label > span {
  font-size: .72rem; text-transform: uppercase; letter-spacing: .06em; color: var(--muted);
}
.hris-kisi input, .hris-kisi select {
  padding: 7px 10px; border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface); color: var(--ink); font: inherit; font-size: .86rem;
  min-width: 0;
}
.hris-kisi input:focus, .hris-kisi select:focus { outline: none; border-color: var(--accent); }
.hris-tombol { display: flex; gap: 8px; flex-wrap: wrap; }

.hris-meta { margin: 10px 0 12px; }
.hris-kunci { line-height: 1.9; }
.hris-kunci-butir { display: inline-block; margin-right: 14px; white-space: nowrap; }
.hris-kunci-butir strong { color: var(--accent); }

/* Sorot kolom kategori.
   ---------------------------------------------------------------------
   Sumbernya memakai warna tetap (#fff3cd dan #fde2e1) langsung di
   atributnya. Di sini dipakai lencana warna portal: warna tetap yang
   dituliskan di HTML tidak ikut berubah saat peramban orangnya dalam
   mode gelap - yang terjadi teks gelap di atas latar terang di tengah
   tabel gelap, dan itu justru tidak terbaca. */
.hris-izin  { background: var(--warn-w); }
.hris-telat { background: var(--crit-w); }
.hris-telat-teks { color: var(--crit); font-weight: 600; }
.hris-libur  td { background: var(--crit-w); }
.hris-minggu td { background: var(--surface-2); }

/* Lencana status - dipakai tabel HRIS dan halaman rinciannya. */
.pill {
  display: inline-block; padding: 1px 8px; border-radius: 999px;
  font-size: .75rem; font-weight: 500; white-space: nowrap;
  border: 1px solid transparent;
}
.pill-ok    { background: var(--ok-w);     color: var(--ok);     border-color: var(--ok); }
.pill-no    { background: var(--crit-w);   color: var(--crit);   border-color: var(--crit); }
.pill-libur { background: var(--warn-w);   color: var(--warn);   border-color: var(--warn); }
.pill-diam  { background: var(--surface-2); color: var(--muted); border-color: var(--line); }

/* Tabel kunci-nilai pada satu baris absensi. */
.hris-kv th { width: 200px; color: var(--muted); font-weight: 500; }
@media (max-width: 640px) {
  .hris-kv th { width: 130px; }
}

/* --- kotak laporan masuk di beranda --- */

.masuk-list { list-style: none; margin: 0; padding: 0;
              display: flex; flex-direction: column; gap: 11px; }
.masuk-list li { display: flex; align-items: flex-start; gap: 10px; }
.masuk-teks { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }
.masuk-teks > a { font-size: .89rem; font-weight: 600; }
.masuk-cuplik { color: var(--ink-soft); font-size: .8rem; }
.masuk-list .btn { flex: 0 0 auto; }

/* Beri ruang di kanan supaya isi halaman tidak tertimpa rel, dan tambah
   ruangnya saat panel notif terbuka. */
@media (min-width: 900px) {
  .utama { padding-right: var(--rel-lebar); transition: padding-right .18s ease; }
  body.notif-buka .utama { padding-right: calc(var(--rel-lebar) + var(--notif-lebar)); }
}

/* Layar sempit: melabuh tidak masuk akal - panelnya menutup penuh dan
   isi halaman tidak digeser, sebab tidak ada ruang untuk digeser. */
@media (max-width: 899px) {
  .rel {
    top: auto; bottom: 14px; right: 12px; width: auto; height: auto;
    flex-direction: row-reverse; gap: 8px; padding: 6px !important;
    background: var(--ground); border: 1px solid var(--line);
    border-radius: 24px; box-shadow: var(--shadow);
  }
  .notif-panel { top: auto; bottom: 0; right: 0; width: 100%; max-height: 76vh;
                 border-left: none; border-top: 1px solid var(--line);
                 border-radius: 12px 12px 0 0; }
}


/* =====================================================================
   PITA KEADAAN HARI INI DI BERANDA
   Tiga hal yang harus terlihat begitu portal dibuka: sudah absen belum,
   laporan hari ini sudah dikirim belum, dan berapa laporan orang lain
   yang menunggu keputusan saya.
   ===================================================================== */

.hari-ini {
  display: grid; gap: 1px; margin-bottom: 18px;
  grid-template-columns: repeat(auto-fit, minmax(228px, 1fr));
  background: var(--line); border: 1px solid var(--line);
  border-radius: 8px; overflow: hidden;
}
.hari-bagian {
  background: var(--surface); padding: 12px 15px;
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
}
.hari-bagian .k {
  flex: 1 0 100%; font-size: .68rem; text-transform: uppercase;
  letter-spacing: .08em; color: var(--muted);
}
.hari-bagian strong { font-size: .95rem; }
.hari-bagian strong .muted { font-weight: 400; font-size: .82rem; }
.hari-bagian form { display: contents; }

/* Sebagian ubin ringkas adalah TAUTAN ke daftar tugas yang sudah
   tersaring - lihat tugas_proyek_lihat.php dan grup_lihat.php.

   Bentuknya harus tetap sama persis dengan ubin biasa di sebelahnya.
   Begitu yang satu bergaris bawah dan berwarna tautan sementara yang
   lain tidak, orang menyimpulkan keduanya berjenis berbeda - padahal
   bedanya cuma ada-tidaknya halaman tujuan. Yang membedakan cukup
   kursor dan latar saat disentuh. */
a.hari-bagian { color: inherit; text-decoration: none; cursor: pointer; }
a.hari-bagian:hover,
a.hari-bagian:focus-visible { background: var(--surface-2); }
a.hari-bagian:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }


/* =====================================================================
   PENGATURAN PRIBADI
   ===================================================================== */

.sub-gir {
  display: flex; align-items: center; justify-content: center;
  margin-left: auto; padding: 0 12px;
  color: var(--muted); text-decoration: none;
  border-bottom: 2px solid transparent; flex: 0 0 auto;
}
.sub-gir svg { width: 17px; height: 17px; }
.sub-gir:hover { color: var(--ink); }

.pref-daftar { display: flex; flex-direction: column; }
.pref-baris {
  display: flex; align-items: flex-start; gap: 11px;
  padding: 12px 2px; border-bottom: 1px solid var(--line-soft);
  cursor: pointer;
}
.pref-baris:last-child { border-bottom: none; }
.pref-baris input[type=checkbox] { margin-top: 3px; flex: 0 0 auto; }
.pref-teks { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1 1 auto; }
.pref-teks strong { font-weight: 500; font-size: .9rem; }
.pref-teks small { color: var(--muted); font-size: .8rem; }
.pref-baris-pilihan { cursor: default; align-items: center; }
.pref-baris-pilihan select { width: auto; min-width: 190px; flex: 0 0 auto; }

/* Skor pada kotak beranda, menggantikan tombol Nilai. */
.masuk-skor { flex: 0 0 auto; text-decoration: none; }
.masuk-skor:hover { filter: brightness(1.1); }

/* Tombol ubah penilaian yang terlipat. */
.lap-ubah-nilai > summary {
  cursor: pointer; font-size: .82rem; color: var(--accent);
  list-style: none; display: inline-block; padding: 2px 0;
}
.lap-ubah-nilai > summary::-webkit-details-marker { display: none; }
.lap-ubah-nilai > summary:hover { text-decoration: underline; }
.lap-ubah-nilai[open] > summary { margin-bottom: 9px; }


/* =====================================================================
   PENAMPIL LAMPIRAN (ONLYOFFICE)
   ===================================================================== */

/* Editornya butuh tinggi yang pasti - ia memakai 100% dari induknya,
   dan 100% dari induk yang tingginya mengikuti isi berarti nol. */
.oo-wadah {
  height: calc(100vh - var(--topbar-tinggi) - var(--subnav-tinggi) - 190px);
  min-height: 420px;
  margin: -14px -16px;
  border: none;
  background: var(--surface-2);
}
.oo-wadah > div { width: 100%; height: 100%; }
.kotak.kotak-maks .oo-wadah { height: 100%; }

.oo-gagal {
  margin: 0; padding: 14px 16px;
  color: var(--crit); background: var(--crit-w);
  font-size: .86rem; border-radius: 6px;
}
.oo-gagal[hidden] { display: none; }

.berkas-aksi { display: flex; gap: 6px; margin-left: auto; flex: 0 0 auto; }


/* =====================================================================
   AUTOMATION
   ===================================================================== */

.form-kisi {
  display: grid; gap: 12px;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
.form-kartu {
  border: 1px solid var(--line); border-radius: 8px; padding: 13px 14px;
  display: flex; flex-direction: column; gap: 7px; background: var(--surface);
}
.form-kartu:hover { border-color: var(--accent); }
.form-judul { font-size: .93rem; font-weight: 600; text-decoration: none; }
.form-judul:hover { text-decoration: underline; }
.form-kartu small { font-size: .79rem; line-height: 1.4; }
.form-angka { display: flex; flex-wrap: wrap; gap: 6px; align-items: center;
              font-size: .78rem; color: var(--muted); margin-top: auto; }
.form-angka .tag { text-decoration: none; }
.form-kartu > .btn { align-self: flex-start; }

/* --- rantai persetujuan --- */

.rantai { list-style: none; margin: 0; padding: 0;
          display: flex; flex-direction: column; gap: 0; }
.rantai-baris { display: flex; gap: 12px; padding: 11px 0; position: relative; }
.rantai-baris + .rantai-baris { border-top: 1px solid var(--line-soft); }

/* Garis penyambung antar langkah: yang menjelaskan bahwa ini satu
   rantai berurutan, bukan daftar orang yang kebetulan berdampingan. */
.rantai-baris::before {
  content: ''; position: absolute; left: 13px; top: 34px; bottom: -11px;
  width: 1px; background: var(--line);
}
.rantai-baris:last-child::before { display: none; }

.rantai-no {
  flex: 0 0 auto; width: 27px; height: 27px; border-radius: 50%;
  background: var(--surface-2); color: var(--muted);
  display: flex; align-items: center; justify-content: center;
  font-size: .78rem; font-weight: 600; z-index: 1;
}
.rantai-kini .rantai-no { background: var(--accent); color: #fff; }
.rantai-isi { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1 1 auto; }
.rantai-kepala { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
.rantai-kepala strong { font-size: .89rem; }
.rantai-isi small { color: var(--muted); font-size: .78rem; }
.rantai-catatan {
  margin: 4px 0 0; padding: 8px 11px; border-radius: 6px;
  background: var(--surface-2); font-size: .85rem;
}

/* Nama langkah dan catatan penyetuju tampil berdampingan, dan dulu
   keduanya terlihat sama. Sebutan kecil di depan catatannya memutus
   kekeliruan itu: yang berlabel "Catatan Andrew:" jelas ditulis
   orangnya, yang tanpa label jelas nama langkah dari perancang alur. */
.rantai-catatan-cap {
  font-weight: 600; color: var(--muted);
  margin-right: 4px; font-size: .8rem;
}

/* ================= kolom komentar pengajuan ================= */

.pk-daftar { list-style: none; margin: 0 0 14px; padding: 0; }

.pk-butir {
  padding: 9px 0; border-bottom: 1px solid var(--line);
}
.pk-butir:last-child { border-bottom: 0; }

/* Alasan keputusan yang langkahnya sudah dihapus Bitrix. Diberi garis
   di sisi kiri supaya tidak terbaca sebagai obrolan biasa - ia bukan
   pendapat, ia keputusan yang pernah diambil. */
.pk-putusan {
  border-left: 3px solid var(--warn, #d08700);
  padding-left: 10px; background: var(--surface-2);
  border-radius: 0 6px 6px 0;
}

.pk-kepala {
  display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline;
}
.pk-kepala strong { font-size: .88rem; }
.pk-hapus { margin-left: auto; }

.pk-isi { margin: 4px 0 0; font-size: .88rem; line-height: 1.5; }

.pk-berkas { list-style: none; margin: 6px 0 0; padding: 0; }
.pk-berkas > li {
  display: flex; flex-wrap: wrap; gap: 7px; align-items: baseline;
  padding: 2px 0; font-size: .84rem;
}

.pk-tulis { margin-top: 4px; }

/* ================= perancang formulir Automation ================= */

/* Angka dirapatkan ke kanan. Ditulis dengan td/th di depan karena
   ".tbl th, .tbl td { text-align: left }" punya kekhususan (0,1,1) -
   ".num" sendirian akan kalah dan diam-diam tidak berlaku. */
.tbl td.num, .tbl th.num { text-align: right; }

.rc-baris {
  display: flex; flex-wrap: wrap; gap: 10px 18px; align-items: flex-end;
}
.field-kecil { flex: 0 0 auto; width: 120px; }

/* Pembantu & Pengamat pada formulir tugas.
   ---------------------------------------------------------------------
   Sebelumnya dua <select multiple size="6"> yang lebarnya ditentukan
   sendiri oleh nama terpanjang di dalamnya. Penggantinya - pemilih
   berkeping - isinya cuma sebuah kotak ketik, jadi tanpa basis lebar di
   sini kedua kolomnya menyusut ke selebar kursor. */
.tf-orang { flex: 1 1 260px; min-width: 0; }

.cek {
  display: flex; align-items: center; gap: 7px; cursor: pointer;
  font-size: .85rem; padding-bottom: 6px;
}
.cek input[type=checkbox] { flex: 0 0 auto; margin: 0; }

.rc-aksi { white-space: nowrap; }
.rc-aksi .btn + .btn { margin-left: 6px; }

/* Tombol yang perlu POST harus dibungkus <form>, dan <form> adalah blok.
   Tanpa dua baris ini ia turun ke baris sendiri dan kolom aksinya
   melar - bukan salah tombolnya, salah jenis elemennya. */
.rc-aksi form { display: inline-block; margin: 0; vertical-align: middle; }
.rc-aksi .btn + form, .rc-aksi form + form { margin-left: 6px; }
.rc-sebaris { display: inline-flex; margin: 0; }

/* Ubah/tambah dilipat, bukan dibentangkan semua sekaligus: satu
   formulir bisa punya belasan kolom, dan semuanya terbuka membuat
   halaman ini mustahil dibaca. */
.rc-ubah > summary,
.rc-tambah > summary {
  cursor: pointer; font-size: .83rem; color: var(--accent);
  list-style: none; user-select: none;
}
.rc-ubah > summary::-webkit-details-marker,
.rc-tambah > summary::-webkit-details-marker { display: none; }
.rc-ubah > summary:hover,
.rc-tambah > summary:hover { text-decoration: underline; }

.rc-tambah {
  margin-top: 14px; padding: 12px 14px;
  border: 1px dashed var(--line); border-radius: 8px;
  background: var(--surface-2);
}
.rc-tambah[open] > summary { margin-bottom: 12px; font-weight: 500; }

.rc-form {
  display: flex; flex-direction: column; gap: 11px;
  margin-top: 10px; max-width: 560px;
}
.rc-ubah[open] {
  display: block; padding: 12px 14px; margin-top: 8px;
  border: 1px solid var(--line); border-radius: 8px;
  background: var(--surface-2); white-space: normal;
}
.rc-ubah .rc-form + .rc-form {
  margin-top: 4px; padding-top: 11px;
  border-top: 1px solid var(--line-soft);
  flex-direction: row; align-items: center; gap: 10px;
}

.rc-kolom td { vertical-align: top; }
.rc-kolom .tag + .tag { margin-left: 5px; }

.rantai-aksi { flex: 0 0 auto; align-self: center; margin: 0; }

/* Lampiran warisan yang keterangannya sudah ada tetapi isinya belum
   dipindahkan dari Bitrix. Sengaja tetap ditampilkan, bukan
   disembunyikan: orang perlu tahu bahwa laporan itu MEMANG punya
   lampiran, meski belum bisa dibuka. */
.lampiran-belum {
  display: flex; flex-direction: column; gap: 4px; justify-content: center;
  padding: 10px 12px; border: 1px dashed var(--line); border-radius: 8px;
  background: var(--surface-2); color: var(--muted);
  font-size: .8rem; min-height: 78px; max-width: 200px;
}
.lampiran-belum small { font-size: .72rem; opacity: .8; }

/* Pratinjau lampiran di dalam halaman. Sengaja terlipat, bukan
   terbentang: satu pengajuan bisa memuat beberapa berkas, dan
   membentangkan semuanya membuat rantai persetujuan di bawahnya
   terdorong jauh ke luar layar - padahal itulah yang paling sering
   dicari orang saat membuka halaman ini. */
/* flex-basis 100% memaksa pratinjau turun ke barisnya sendiri di
   dalam .berkas-list li yang berupa flexbox. Tanpa ini ia terjepit
   di samping tombol Unduh dan lebarnya tinggal beberapa piksel. */
.pratinjau { flex: 0 0 100%; margin-top: 8px; }
.pratinjau > summary {
  cursor: pointer; font-size: .8rem; color: var(--accent);
  list-style: none; user-select: none; display: inline-block;
}
.pratinjau > summary::-webkit-details-marker { display: none; }
.pratinjau > summary::before { content: '▸ '; }
.pratinjau[open] > summary::before { content: '▾ '; }
.pratinjau > summary:hover { text-decoration: underline; }

.pratinjau-isi {
  margin-top: 8px; border: 1px solid var(--line); border-radius: 8px;
  overflow: hidden; background: var(--surface-2);
}
.pratinjau-isi iframe { display: block; width: 100%; height: 70vh; border: 0; }
.pratinjau-isi img { display: block; width: 100%; height: auto; }

@media (max-width: 700px) {
  .pratinjau-isi iframe { height: 55vh; }
}

/* Pemberitahuan baca-saja di atas penampil dokumen. Nadanya sengaja
   tenang - biru keterangan, bukan kuning peringatan - sebab tidak ada
   yang salah; ini sekadar menjelaskan aturan sebelum orang menabraknya. */
.callout-baca {
  border-left-color: var(--accent);
  font-size: .85rem; line-height: 1.55;
}
.callout-baca strong { color: var(--ink); }

/* =====================================================================
   PENAMPIL GAMBAR (zoom)
   ===================================================================== */

/* [hidden] ditulis dengan !important dan pemilih kelas di depannya.
   ".zoom-tirai { display: flex }" punya kekhususan yang mengalahkan
   aturan bawaan peramban "[hidden] { display: none }" - tanpa baris
   ini, tirainya tampil terus menutupi seluruh halaman. Kekeliruan yang
   sama pernah terjadi pada menu turun. */
.zoom-tirai[hidden] { display: none !important; }

.zoom-tirai {
  position: fixed; inset: 0; z-index: 200;
  display: flex; align-items: center; justify-content: center;
  background: rgba(8, 14, 16, .965);
  overflow: hidden;
}
body.ada-zoom { overflow: hidden; }

.zoom-bar {
  position: absolute; top: 0; left: 0; right: 0; z-index: 2;
  display: flex; align-items: center; gap: 12px;
  padding: 10px 14px;
  background: linear-gradient(rgba(8, 14, 16, .85), rgba(8, 14, 16, 0));
  color: #e8f0f1; font-size: .82rem;
}
.zoom-nama {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  flex: 1 1 auto; min-width: 0;
}
.zoom-urut { color: #9fb4b9; flex: 0 0 auto; font-size: .76rem; }
.zoom-alat { display: flex; gap: 6px; flex: 0 0 auto; }

.zoom-alat button {
  min-width: 32px; height: 30px; padding: 0 9px;
  border: 1px solid rgba(232, 240, 241, .25); border-radius: 5px;
  background: rgba(232, 240, 241, .10); color: #e8f0f1;
  font-size: .95rem; line-height: 1; cursor: pointer;
}
.zoom-alat button:hover { background: rgba(232, 240, 241, .22); }
.zoom-nilai { font-size: .76rem !important; min-width: 54px !important; }

.zoom-panggung {
  width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
}
.zoom-tirai img {
  max-width: 94vw; max-height: 88vh;
  transform-origin: center center;
  transition: transform .08s linear;
  user-select: none; -webkit-user-drag: none;
}

.zoom-nav {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
  width: 42px; height: 62px;
  border: none; border-radius: 6px;
  background: rgba(232, 240, 241, .12); color: #e8f0f1;
  font-size: 1.7rem; line-height: 1; cursor: pointer;
}
.zoom-nav:hover { background: rgba(232, 240, 241, .25); }
.zoom-prev { left: 10px; }
.zoom-next { right: 10px; }
.zoom-nav[hidden] { display: none !important; }

/* Thumbnail memberi tanda bahwa ia bisa diklik. */
.lampiran-galeri a { cursor: zoom-in; }

@media (max-width: 700px) {
  .zoom-nav { width: 34px; height: 52px; font-size: 1.4rem; }
  .zoom-nama { font-size: .76rem; }
}

/* =====================================================================
   PESAN (Messenger)

   Dua panel seperti Bitrix: daftar percakapan di kiri, isi percakapan
   di kanan. Tingginya dipatok ke tinggi layar - bukan mengikuti isi -
   supaya kotak tulis SELALU terlihat di bawah dan yang menggulir hanya
   kumpulan pesannya. Kalau tingginya dibiarkan mengikuti isi, halaman
   yang panjang akan mendorong kotak tulis ke luar layar dan orang harus
   menggulir ke bawah dulu setiap kali mau membalas.
   ===================================================================== */

/* TINGGINYA WAJIB PASTI, dan pitanya ikut dihitung.
   ---------------------------------------------------------------------
   Tinggi pasti di sini bukan selera - seluruh rantai di dalamnya
   bergantung padanya:

       .chat        tinggi PASTI  <- di sini
       .chat-ruang  flex column, min-height: 0, overflow: hidden
       .chat-pesan  flex: 1, overflow-y: auto   <- menggulir di DALAM
       .chat-tulis  flex: 0 0 auto              <- terpaku di dasar

   Begitu tingginya dijadikan auto, .chat-ruang tumbuh mengikuti isinya,
   .chat-pesan tidak pernah menggulir sendiri, dan kotak tulis terdorong
   jauh ke bawah layar. Itu benar-benar terjadi 27 September 2026 saat
   cacat di bawah dicoba diperbaiki dengan flex - dan halamannya justru
   rusak lebih parah daripada cacat yang hendak diperbaiki.

   Yang sebenarnya kurang cuma satu: .alert lahir DI ATAS .chat setiap
   kali sebuah tindakan meninggalkan pesan, dan angka 96px tidak
   menghitungnya. Diukur dengan Chrome headless pada berkas ini juga:
   satu pita berharga 60,5 piksel, dan kotak tulis mulai hilang dari
   layar pada jendela 660px ke bawah.

   --pita-tinggi diisi app.js dari pita yang BENAR-BENAR tergambar,
   berikut margin bawahnya - jadi pita dua baris, atau dua pita
   sekaligus, terhitung apa adanya tanpa satu angka tetap pun. Tanpa
   JavaScript nilainya 0px dan perilakunya persis seperti sebelum ini. */
.chat {
  display: grid;
  grid-template-columns: 300px minmax(0, 1fr);
  gap: 14px;
  height: calc(100vh - var(--topbar-tinggi) - var(--subnav-tinggi) - 96px
               - var(--pita-tinggi, 0px));
  min-height: 420px;
}

/* ---------------- panel kiri ---------------- */

.chat-daftar {
  display: flex; flex-direction: column; min-height: 0;
  background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius);
  overflow: hidden;
}

/* KOTAK CARI - satu baris untuk cari + tombol tambah, lalu tautan
   "Baca nanti" berdiri sendiri di bawahnya.
   ---------------------------------------------------------------------
   Sampai 27 September 2026 .chat-cari sendiri yang jadi barisnya, dan
   tautan Baca nanti disisipkan sebagai anak ketiga. Akibatnya kotak
   carinya menyempit dan label tautannya patah jadi dua baris. Barisnya
   sekarang punya wadah sendiri; .chat-cari tinggal menumpuk keduanya.

   position: relative TETAP DI SINI, bukan pindah ke .chat-cari-baris -
   .chat-baru-isi berjangkar padanya. */
.chat-cari {
  padding: 9px; border-bottom: 1px solid var(--line-soft);
  position: relative;
}
.chat-cari-baris { display: flex; align-items: flex-start; gap: 6px; }
.chat-cari-baris > form { flex: 1 1 auto; min-width: 0; }
/* ---- Saring All / Unread di kiri kotak cari (7 Okt 2026, meniru corong
   Bitrix24). app/Views/chat_saring.php, dipakai tab Percakapan & Obrolan
   tugas. Menunya berjangkar pada tombol corongnya sendiri. ---- */
.chat-saring { flex: 0 0 auto; position: relative; }
.chat-saring > summary {
  list-style: none; cursor: pointer;
  width: 32px; height: 32px; border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  color: var(--muted); border: 1px solid transparent;
}
.chat-saring > summary::-webkit-details-marker { display: none; }
.chat-saring > summary:hover,
.chat-saring[open] > summary { background: var(--surface-2); color: var(--ink); }
.chat-saring.chat-saring-aktif > summary { color: var(--accent); background: var(--accent-w); border-color: var(--accent); }
.chat-saring-menu {
  position: absolute; z-index: 21; top: calc(100% + 6px); left: 0;
  min-width: 260px; padding: 6px; white-space: nowrap;
  background: var(--surface); color: var(--ink);
  border: 1px solid var(--line); border-radius: 10px;
  box-shadow: var(--shadow);
}
.chat-saring-menu a,
.chat-saring-menu button {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  width: 100%; padding: 9px 12px; border: 0; border-radius: 7px;
  background: transparent; color: var(--ink); text-decoration: none;
  font: inherit; font-size: .88rem; text-align: left; cursor: pointer;
}
.chat-saring-menu a:hover,
.chat-saring-menu button:hover { background: var(--surface-2); }
.chat-saring-menu a.aktif { font-weight: 600; }
.chat-saring-centang { color: var(--accent); flex: 0 0 auto; }
.chat-saring-menu hr { border: 0; border-top: 1px solid var(--line-soft); margin: 5px 4px; }
.chat-saring-menu form { margin: 0; }
.chat-saring-menu button svg { color: var(--muted); flex: 0 0 auto; }
.chat-cari input[type=search] {
  width: 100%; padding: 7px 10px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--ground); color: var(--ink);
  font: inherit; font-size: .86rem;
}

.chat-baru { flex: 0 0 auto; }
.chat-baru > summary {
  list-style: none; cursor: pointer;
  width: 32px; height: 32px; border-radius: var(--radius);
  display: flex; align-items: center; justify-content: center;
  background: var(--accent); color: #fff;
  font-size: 1.15rem; line-height: 1; font-weight: 600;
}
.chat-baru > summary::-webkit-details-marker { display: none; }
.chat-baru > summary:hover { background: var(--accent-2); }

.chat-baru-isi {
  position: absolute; z-index: 20; top: calc(100% - 4px); right: 9px;
  width: 288px; padding: 12px;
  background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.chat-baru-isi select,
.chat-baru-isi input[type=text] {
  width: 100%; padding: 6px 8px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--ground); color: var(--ink);
  font: inherit; font-size: .84rem;
}
.chat-baru-isi .field { display: block; margin-bottom: 9px; }
.chat-baru-isi .field > span { display: block; font-size: .8rem; color: var(--muted); margin-bottom: 3px; }

/* =====================================================================
   PANEL PERCAKAPAN BARU - dua tab tanpa JavaScript
   =====================================================================
   Radio disembunyikan, labelnya jadi tab, dan ~ memilih panel mana yang
   tampil. Tanpa satu baris skrip pun - dan karena itu ia tetap bekerja
   pada halaman yang skripnya gagal dimuat.

   Dipasang 21 September 2026. Sebelumnya kedua kontrol tampil sekaligus:
   dropdown yang MELOMPAT saat dipilih, tepat di atas form bertombol.
   Yang mengira dropdown itu pemilih anggota grup kehilangan seluruh
   panelnya pada sentuhan pertama.
   ===================================================================== */
.cb-radio { position: absolute; opacity: 0; pointer-events: none; }

.cb-tab { display: flex; gap: 4px; margin-bottom: 10px; }
.cb-tab label {
  flex: 1 1 0; text-align: center; cursor: pointer;
  padding: 6px 8px; font-size: .8rem; font-weight: 600;
  border: 1px solid var(--line); border-radius: 6px;
  color: var(--muted); background: var(--surface-2);
  user-select: none;
}
.cb-tab label:hover { color: var(--ink); }

/* Kotak ketik nama - selebar panelnya. */
.chat-baru-isi .chat-ketik-orang { width: 100%; }

/* Kotak kepingan peserta dipakai ulang di sini; di panel yang sempit ia
   perlu dibatasi tingginya, sebab dua puluh nama akan membuat panelnya
   lebih panjang daripada layar. */
.chat-baru-isi .po { max-height: 150px; overflow-y: auto; }

/* Tanda silang bawaan <input type=search> di Chrome menempel pada
   tepinya dan bertabrakan dengan panah datalist. Disingkirkan: yang
   mengosongkannya cukup menghapus teksnya. */
.chat-baru-isi input[type=search]::-webkit-search-cancel-button {
  -webkit-appearance: none; appearance: none;
}

/* Panel disembunyikan lebih dulu, lalu yang terpilih dimunculkan. */
.cb-panel { display: none; }
#cb-orang:checked ~ .cb-panel-orang,
#cb-grup:checked  ~ .cb-panel-grup { display: block; }

#cb-orang:checked ~ .cb-tab label[for="cb-orang"],
#cb-grup:checked  ~ .cb-tab label[for="cb-grup"] {
  color: var(--accent-2); background: var(--accent-w); border-color: var(--accent);
}

/* Papan ketik harus tetap bisa memilih tabnya - radio yang benar-benar
   tersembunyi tidak bisa difokus, jadi yang ditandai labelnya. */
.cb-radio:focus-visible ~ .cb-tab label[for="cb-orang"],
.cb-radio:focus-visible ~ .cb-tab label[for="cb-grup"] {
  outline: 2px solid var(--accent); outline-offset: 2px;
}

/* =====================================================================
   SARAN ORANG di atas hasil pencarian
   =====================================================================
   "Mulai percakapan dengan ..." - baris yang membuat kotak pencarian
   akhirnya mengerjakan apa yang dijanjikan namanya. Sengaja dibedakan
   dari baris percakapan biasa: yang satu membuka yang sudah ada, yang
   ini MEMBUAT yang belum ada, dan keduanya tidak boleh terlihat sama.
   ===================================================================== */
.chat-saran-judul {
  padding: 8px 12px 4px; text-transform: uppercase;
  letter-spacing: .4px; font-size: .68rem;
}
.chat-saran a {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 12px; text-decoration: none; color: var(--ink);
  border-left: 3px solid transparent;
}
.chat-saran a:hover { background: var(--accent-w); border-left-color: var(--accent); }
.chat-saran-ikon {
  flex: 0 0 26px; width: 26px; height: 26px; line-height: 24px;
  text-align: center; border-radius: 50%;
  border: 1px dashed var(--accent); color: var(--accent);
  font-size: .95rem;
}
.chat-saran-teks { display: flex; flex-direction: column; min-width: 0; }
.chat-saran-teks strong { font-size: .86rem; font-weight: 600; }
.chat-saran-teks small { font-size: .74rem; }

.chat-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; list-style: none; margin: 0; padding: 0; }
.chat-list > li { border-bottom: 1px solid var(--line-soft); }
.chat-list > li > a {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 11px; text-decoration: none; color: inherit;
}
.chat-list > li > a:hover { background: var(--surface-2); }
.chat-list > li.chat-aktif > a { background: var(--accent-w); }

.chat-list-teks { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.chat-list-atas,
.chat-list-bawah { display: flex; align-items: baseline; gap: 8px; }
.chat-list-atas > strong {
  flex: 1 1 auto; min-width: 0; font-size: .88rem; font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.chat-list-atas > small { flex: 0 0 auto; font-size: .72rem; color: var(--muted); }
.chat-list-bawah > small {
  flex: 1 1 auto; min-width: 0; font-size: .78rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.chat-lencana {
  flex: 0 0 auto; min-width: 19px; height: 19px; padding: 0 5px;
  border-radius: 10px; background: var(--crit); color: #fff;
  font-size: .68rem; font-weight: 700; line-height: 19px; text-align: center;
}

.chat-kosong { padding: 16px 12px; }

/* Avatar grup memakai angka jumlah anggota, bukan inisial - sebuah grup
   tidak punya nama orang, dan angka anggota justru yang paling sering
   ingin diketahui. */
.chat-grup {
  background: var(--surface-3); color: var(--ink-soft);
  font-size: .7rem; font-weight: 700;
}

/* ---------------- panel kanan ---------------- */

.chat-ruang {
  display: flex; flex-direction: column; min-height: 0; min-width: 0;
  background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius);
  overflow: hidden;
}

.chat-hampa {
  flex: 1 1 auto; display: flex; align-items: center; justify-content: center;
  padding: 24px; text-align: center; font-size: .9rem;
}

.chat-kepala {
  flex: 0 0 auto;
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px; border-bottom: 1px solid var(--line);
  background: var(--surface);
}
.chat-kepala-teks { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.chat-kepala-teks > strong { font-size: .95rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chat-kepala-teks > small { font-size: .76rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.chat-pesan {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  padding: 14px 16px;
  display: flex; flex-direction: column; gap: 6px;
  background: var(--ground);
}

/* Pintu ke riwayat lama, di puncak aliran pesan.
   [hidden] ditegaskan dengan !important: aturan sekelas di sekitarnya
   sudah cukup untuk mengalahkan bawaan peramban, dan kotak ini akan
   tetap terlihat setelah dinyatakan tersembunyi. */
.chat-lawas-kotak { align-self: center; margin: 4px 0 8px; }
.chat-lawas-kotak[hidden] { display: none !important; }

.chat-hari { align-self: center; margin: 8px 0 4px; }
.chat-hari > span {
  padding: 2px 10px; border-radius: 10px;
  background: var(--surface-3); color: var(--muted);
  font-size: .72rem;
}

/* Pesan sistem obrolan tugas (TaskLog) - 29 Sep 2026. Di tengah, lebih
   tenang daripada gelembung: ia kabar tentang tugasnya, bukan ucapan
   seseorang. Nama pelaku ditebalkan seperti Bitrix24. */
.chat-sistem { align-self: center; max-width: 78%; margin: 4px 0; text-align: center; }
.chat-sistem > span {
  display: inline-block; padding: 5px 12px; border-radius: 12px;
  background: var(--surface-2); color: var(--ink-soft);
  font-size: .8rem; line-height: 1.45;
}
.chat-sistem b { color: var(--accent); font-weight: 600; }
.chat-sistem time { margin-left: 6px; color: var(--muted); font-size: .7rem; }

/* position: relative supaya menu dan pemetik berlabuh pada BARISNYA.
   Keduanya dulu berlabuh pada tombolnya sendiri, dan tombol itu kini
   tinggal di .chat-alat yang lebarnya hanya dua ikon - kotak selebar
   268px yang berlabuh di sana menjulur keluar layar. */
.chat-baris {
  position: relative;
  display: flex; align-items: flex-end; gap: 7px; max-width: 76%;
}

/* Gelembung dan keripiknya satu KOLOM, supaya keripik berdiri di bawah
   gelembung - bukan di sampingnya. Sampai 27 Sep 2026 .chat-reaksi
   adalah saudara langsung .chat-gelembung di dalam baris yang flex
   mendatar, jadi keripiknya berdiri sejajar gelembung; pada pesan
   sendiri (row-reverse) ia bahkan melompat ke sisi kiri. */
.chat-isi { display: flex; flex-direction: column; min-width: 0; }
.chat-saya .chat-isi { align-items: flex-end; }
.chat-baris.chat-saya { align-self: flex-end; flex-direction: row-reverse; }
.chat-baris > .avatar { margin-bottom: 2px; }

.chat-gelembung {
  position: relative; min-width: 0;
  padding: 7px 46px 7px 11px;
  border-radius: 10px 10px 10px 2px;
  background: var(--ground); border: 1px solid var(--line);
  font-size: .89rem;
}
.chat-saya .chat-gelembung {
  border-radius: 10px 10px 2px 10px;
  background: var(--accent-w); border-color: var(--accent-w);
}
.chat-gelembung p { margin: 0; }
.chat-gelembung p + .chat-berkas { margin-top: 6px; }

.chat-penulis {
  display: block; margin-bottom: 2px;
  font-size: .74rem; font-weight: 700; color: var(--accent);
}

/* Jamnya disandarkan ke pojok kanan bawah gelembung dan ruangnya sudah
   disisakan lewat padding-right, supaya tidak menimpa huruf terakhir. */
.chat-jam {
  position: absolute; right: 9px; bottom: 5px;
  font-size: .68rem; color: var(--muted); white-space: nowrap;
}

/* PESAN YANG SUDAH DISUNTING butuh ruang lebih di kanan.
   ---------------------------------------------------------------------
   .chat-jam berposisi ABSOLUT, jadi ia tidak mendorong apa pun: lebar
   yang disediakan gelembunglah yang menentukan. Padding 46px di atas
   dihitung untuk "12:39" saja. Begitu " - disunting" ikut menempel,
   kotaknya melebar ke KIRI dan menimpa teks pesannya.

   Diukur dengan Chrome headless pada font yang sama persis
   (15px "Segoe UI", .68rem):

       "12:39"               25,8 px
       "12:39 - disunting"   79,0 px

   79 + 9 (jarak kanan) = 88 px yang sebenarnya dibutuhkan, sedangkan
   yang ada 46 - jadi teksnya tertimpa 42 piksel. Itu yang dilaporkan
   pemilik projek 27 September 2026: "tampilannya malah tidak bisa
   dibaca dengan baik saat pesan selesai disunting".

   92, bukan 88: font cadangan pada mesin tanpa Segoe UI sedikit lebih
   lebar, dan empat piksel jauh lebih murah daripada mengukur ulang di
   setiap mesin. */
.chat-gelembung.disunting { padding-right: 92px; }

.chat-berkas { display: flex; flex-direction: column; gap: 5px; }
.chat-berkas img {
  max-width: 260px; max-height: 260px;
  border-radius: 6px; display: block; cursor: zoom-in;
}
.chat-berkas-tautan {
  display: flex; align-items: center; gap: 8px;
  padding: 5px 8px; border-radius: var(--radius);
  background: var(--surface-2); color: inherit; text-decoration: none;
  font-size: .82rem;
}
.chat-berkas-tautan:hover { background: var(--surface-3); }
.chat-berkas-tautan small { display: block; color: var(--muted); font-size: .72rem; }

/* Berkas warisan Bitrix yang fisiknya belum ikut dipindahkan. Namanya
   tetap ditampilkan - menghilangkannya membuat orang mengira lampiran
   itu tidak pernah ada. */
/* Kutipan balasan di dalam gelembung chat.
   ---------------------------------------------------------------------
   Nilainya mengikuti .tg-kartu dan .ci-* yang sudah ada: memakai
   peubah tema, bukan hex telanjang, supaya tema gelap ikut benar tanpa
   aturan kedua. */
/* Penanda "Diteruskan" di kepala gelembung. Kecil dan redup - ia
   keterangan tentang pesannya, bukan bagian isinya. */
/* Penanda "Disematkan" di kepala gelembung. Sewarna biru portal supaya
   terbaca sebagai penanda ruang, bukan sebagai keadaan pesannya
   sendiri - beda dengan "Diteruskan" yang redup. */
/* Tombol sematkan pada gelembung. Samar sampai gelembungnya disentuh
   tetikus - BUKAN tersembunyi, sebab layar sentuh tidak punya hover. */
.chat-pin-tombol{
  border:0; background:none; cursor:pointer; padding:0 3px;
  font-size:11px; line-height:1; opacity:.28;
  transition:opacity .12s;
}
.chat-gelembung:hover .chat-pin-tombol{ opacity:.7; }
.chat-pin-tombol.aktif{ opacity:1; }
.chat-pin-tombol:hover{ opacity:1; }

/* Sorot sesaat sesudah melompat ke sebuah pesan. */
.chat-sorot{ animation:chatSorot 1.6s ease-out; }
@keyframes chatSorot{
  0%{ background:rgba(43,125,233,.22); }
  100%{ background:transparent; }
}

.chat-tersemat{
  font-size:11px; font-weight:700; letter-spacing:.2px;
  color:var(--biru,#12509b); margin-bottom:3px;
}

/* Pita sematan di kepala ruang. */
.chat-pin-bar{
  display:flex; align-items:center; gap:8px;
  padding:6px 8px 6px 11px;
  background:var(--permukaan,#fff);
  border-bottom:1px solid var(--garis,#e3e9f2);
  border-left:3px solid var(--biru,#12509b);
  cursor:pointer;
}
.chat-pin-bar .jd{
  font-size:10.5px; font-weight:800; color:var(--biru,#12509b);
}
.chat-pin-bar .is{
  font-size:11.5px; color:var(--tinta-2,#33415c);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.chat-pin-bar .tk{ flex:1; min-width:0; }
/* Sedang menaiki riwayat untuk menemukan pesannya. Bisa perlu beberapa
   putaran - sematan biasanya jauh di atas jendela 40 pesan - dan tanpa
   penanda ini pitanya terlihat seperti tidak menanggapi, yang persis
   gejala yang dilaporkan sebelum cacatnya diperbaiki. */
.chat-pin-bar[data-memuat]{ opacity:.6; cursor:progress; }
.chat-pin-bar .x{
  border:0; background:none; cursor:pointer;
  color:var(--redup,#5d6b82); font-size:15px; line-height:1; padding:2px 6px;
}

.chat-teruskan{
  font-size:11px; font-weight:700; letter-spacing:.2px;
  color:var(--redup,#5d6b82); margin-bottom:3px; opacity:.9;
}

.chat-kutip{
  border-left:3px solid var(--biru-tepi,#2b7de9);
  background:rgba(43,125,233,.09);
  border-radius:5px; padding:4px 8px; margin-bottom:5px;
  font-size:12px; line-height:1.4; cursor:pointer;
}
.chat-kutip b{ display:block; font-size:11px; color:var(--biru,#12509b); }
.chat-kutip span{ color:var(--redup,#5d6b82); }
.chat-kutip i{ opacity:.75; }
@media (prefers-color-scheme: dark){
  .chat-kutip{ background:rgba(43,125,233,.16); }
}

.chat-berkas-belum {
  display: block; padding: 5px 8px; border-radius: var(--radius);
  background: var(--surface-2); color: var(--muted);
  font-size: .82rem; font-style: italic;
}
.chat-berkas-belum small { display: block; font-size: .7rem; font-style: normal; }

/* ---------------- kotak tulis ---------------- */

.chat-tulis {
  flex: 0 0 auto;
  display: flex; align-items: flex-end; gap: 8px;
  padding: 9px 12px; border-top: 1px solid var(--line);
  background: var(--surface);
}
.chat-tulis textarea {
  flex: 1 1 auto; min-width: 0;
  min-height: 38px; max-height: 140px; resize: none;
  padding: 8px 11px; border: 1px solid var(--line); border-radius: 18px;
  background: var(--ground); color: var(--ink);
  font: inherit; font-size: .89rem; line-height: 1.4;
}
.chat-tulis .btn { flex: 0 0 auto; }

.chat-klip {
  flex: 0 0 auto; cursor: pointer;
  width: 34px; height: 34px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--surface-2); color: var(--ink-soft);
  font-size: 1.2rem; line-height: 1;
}
.chat-klip:hover { background: var(--surface-3); }
.chat-klip input[type=file] {
  position: absolute; width: 1px; height: 1px;
  opacity: 0; overflow: hidden; clip: rect(0 0 0 0);
}

.chat-berkas-terpilih { padding: 0 12px 8px; word-break: break-word; }
/* Aturan tunggal .x { display:flex } akan MENGALAHKAN [hidden] bawaan
   peramban, jadi keadaan tersembunyinya harus ditulis tegas. */
.chat-berkas-terpilih[hidden] { display: none !important; }

/* ---------------- lencana pesan di menu kiri ---------------- */

.side-item { position: relative; }
.side-lencana {
  margin-left: auto; flex: 0 0 auto;
  min-width: 19px; height: 19px; padding: 0 5px;
  border-radius: 10px; background: var(--crit); color: #fff;
  font-size: .68rem; font-weight: 700; line-height: 19px; text-align: center;
}
.side-lencana[hidden] { display: none !important; }
body.sidebar-kecil .side-lencana {
  position: absolute; top: 4px; right: 4px; margin-left: 0;
  min-width: 16px; height: 16px; line-height: 16px; padding: 0 3px; font-size: .62rem;
}

@media (max-width: 1000px) {
  .chat { grid-template-columns: 1fr; height: auto; min-height: 0; }
  .chat-daftar { max-height: 320px; }
  .chat-ruang { height: calc(100vh - var(--topbar-tinggi) - 180px); min-height: 380px; }
  .chat-baris { max-width: 92%; }
  .chat-baru-isi { width: min(288px, calc(100vw - 60px)); }
}

/* =====================================================================
   DOK PESAN - jendela mengambang di kanan bawah

   Melayang di atas halaman dengan position:fixed, jadi ia tidak ikut
   menggulir bersama isi dan tidak menggeser tata letak apa pun di
   bawahnya. Lajur kanan (--rel-lebar) dihindari supaya tidak menutupi
   lonceng pemberitahuan.

   Tiga bentuk, satu jendela:
     biasa - 320 x 420, bertumpuk dari kanan ke kiri
     mini  - hanya bilah judulnya (dok-mini)
     besar - panel lebar setinggi hampir seluruh layar (dok-maks)
   ===================================================================== */

.dok {
  position: fixed; right: calc(var(--rel-lebar) + 14px); bottom: 0; z-index: 60;
  display: flex; align-items: flex-end; gap: 12px;
  pointer-events: none;                 /* halaman di belakang tetap bisa diklik */
}
.dok > * { pointer-events: auto; }

.dok-jendela-wadah { display: flex; align-items: flex-end; gap: 10px; }

/* ---------------- tombol peluncur ---------------- */

.dok-peluncur { position: relative; margin-bottom: 16px; }

.dok-tombol {
  position: relative;
  width: 48px; height: 48px; border-radius: 50%;
  border: 1px solid var(--accent-2);
  background: var(--accent); color: #fff;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; box-shadow: var(--shadow);
}
.dok-tombol:hover { background: var(--accent-2); }
.dok-tombol svg { width: 23px; height: 23px; display: block; }

.dok-lencana {
  position: absolute; top: -3px; right: -3px;
  min-width: 19px; height: 19px; padding: 0 5px;
  border-radius: 10px; background: var(--crit); color: #fff;
  font-size: .68rem; font-weight: 700; line-height: 19px; text-align: center;
  border: 2px solid var(--surface);
}
.dok-lencana[hidden] { display: none !important; }

.dok-panel {
  position: absolute; right: 0; bottom: 58px;
  width: 300px; max-height: 60vh; overflow: hidden;
  display: flex; flex-direction: column;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 6px; box-shadow: var(--shadow);
}
.dok-panel[hidden] { display: none !important; }

.dok-panel-kepala {
  flex: 0 0 auto;
  display: flex; align-items: center; justify-content: space-between;
  padding: 9px 12px; border-bottom: 1px solid var(--line-soft);
}
.dok-panel-kepala a { font-size: .78rem; color: var(--accent); text-decoration: none; }
.dok-panel-kepala a:hover { text-decoration: underline; }

.dok-daftar { flex: 1 1 auto; overflow-y: auto; list-style: none; margin: 0; padding: 0; }
.dok-daftar > li { border-bottom: 1px solid var(--line-soft); }
.dok-daftar > li > button {
  width: 100%; border: none; background: transparent; cursor: pointer;
  display: flex; align-items: center; gap: 9px; text-align: left;
  padding: 8px 11px; color: inherit; font: inherit;
}
.dok-daftar > li > button:hover { background: var(--surface-2); }
.dok-daftar-teks { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.dok-daftar-teks > strong,
.dok-daftar-teks > small {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dok-daftar-teks > strong { font-size: .85rem; font-weight: 600; }
.dok-daftar-teks > small { font-size: .76rem; }
.dok-tunggu { padding: 14px 12px; }

/* ---------------- jendela ---------------- */

.dok-jendela {
  width: 320px; height: 420px;
  display: flex; flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--line); border-bottom: none;
  border-radius: 6px 6px 0 0;
  box-shadow: var(--shadow);
  overflow: hidden;
}

.dok-kepala {
  flex: 0 0 auto; cursor: pointer;
  display: flex; align-items: center; gap: 8px;
  padding: 7px 8px 7px 10px;
  background: var(--accent); color: #fff;
}
.dok-kepala .avatar { background: rgba(255,255,255,.22); color: #fff; }
.dok-kepala-judul {
  flex: 1 1 auto; min-width: 0; font-size: .85rem; font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dok-kepala-lencana {
  flex: 0 0 auto; min-width: 19px; height: 19px; padding: 0 5px;
  border-radius: 10px; background: var(--crit); color: #fff;
  font-size: .68rem; font-weight: 700; line-height: 19px; text-align: center;
}
.dok-kepala-lencana[hidden] { display: none !important; }

.dok-alat { flex: 0 0 auto; display: flex; align-items: center; gap: 1px; }
.dok-alat button {
  width: 24px; height: 24px; padding: 0;
  border: none; border-radius: 4px; cursor: pointer;
  background: transparent; color: #fff;
  font-size: 1rem; line-height: 1;
  display: flex; align-items: center; justify-content: center;
}
.dok-alat button:hover { background: rgba(255,255,255,.22); }
.dok-alat svg { width: 15px; height: 15px; display: block; }

.dok-isi {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  padding: 10px 11px;
  display: flex; flex-direction: column; gap: 5px;
  background: var(--ground);
}
/* Gelembung di jendela sempit dibiarkan lebih lebar daripada di halaman
   penuh - pada lebar 320 px, batas 76% menyisakan lajur kosong yang
   tidak dipakai apa pun. */
.dok-isi .chat-baris { max-width: 88%; }
.dok-isi .chat-gelembung { font-size: .84rem; padding-right: 46px; }
.dok-isi .chat-berkas img { max-width: 190px; max-height: 190px; }

.dok-tulis {
  flex: 0 0 auto;
  display: flex; align-items: flex-end; gap: 6px;
  padding: 7px 9px; border-top: 1px solid var(--line);
  background: var(--surface);
}
.dok-tulis textarea {
  flex: 1 1 auto; min-width: 0;
  min-height: 32px; max-height: 90px; resize: none;
  padding: 6px 10px; border: 1px solid var(--line); border-radius: 16px;
  background: var(--ground); color: var(--ink);
  font: inherit; font-size: .84rem; line-height: 1.35;
}
.dok-tulis .chat-klip { width: 28px; height: 28px; font-size: 1rem; }

.dok-berkas { flex: 0 0 auto; padding: 0 10px 7px; word-break: break-word; }
.dok-berkas[hidden] { display: none !important; }

/* ---------------- bentuk mini ---------------- */

.dok-jendela.dok-mini { height: auto; }
.dok-mini .dok-isi,
.dok-mini .dok-tulis,
.dok-mini .dok-berkas { display: none !important; }

/* ---------------- bentuk besar ---------------- */

.dok-jendela.dok-maks {
  width: min(640px, calc(100vw - var(--rel-lebar) - 40px));
  height: min(78vh, 720px);
}
.dok-maks .dok-isi .chat-baris { max-width: 76%; }
.dok-maks .dok-isi .chat-gelembung { font-size: .89rem; }
.dok-maks .dok-isi .chat-berkas img { max-width: 260px; max-height: 260px; }

/* ---------------- arsip di halaman Pesan ---------------- */

.chat-arsip { flex: 0 0 auto; border-top: 1px solid var(--line); }
.chat-arsip > summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; gap: 8px;
  padding: 9px 11px; font-size: .82rem; color: var(--muted);
  background: var(--surface-2);
}
.chat-arsip > summary::-webkit-details-marker { display: none; }
.chat-arsip > summary:hover { background: var(--surface-3); color: var(--ink); }
.chat-arsip > summary svg { width: 15px; height: 15px; flex: 0 0 15px; }
.chat-arsip > summary .chat-arsip-jml { margin-left: auto; font-variant-numeric: tabular-nums; }
.chat-arsip[open] > summary { border-bottom: 1px solid var(--line-soft); }
.chat-arsip .chat-list { max-height: 260px; }

/* =====================================================================
   TAB "OBROLAN TUGAS"  (padanan Task Chats di Bitrix)

   Kerangkanya MEMINJAM .chat, .chat-daftar, .chat-ruang, .chat-pesan
   dan .chat-tulis apa adanya - dua kolom yang sama persis dengan tab
   Percakapan. Yang ditambahkan di sini hanya yang benar-benar berbeda:
   daftar kirinya tanpa avatar, dan aliran kanannya berisi komentar
   tugas, bukan gelembung pesan.
   ===================================================================== */

.ot-jml {
  flex: 0 0 auto; margin-left: auto;
  font-size: .74rem; padding: 1px 7px; border-radius: 9px;
  background: var(--surface-3); color: var(--ink-soft);
  white-space: nowrap; font-variant-numeric: tabular-nums;
}

.ot-form-alat { display: inline; }

/* .ot-aliran DIBUANG 28 September 2026.
   ---------------------------------------------------------------------
   Ia melayani markup lama panel kanan Obrolan tugas - <ol
   class="tg-komentar"> - dan isinya `display: block`, yang membatalkan
   `display: flex` milik .chat-pesan. Sejak aliran itu memakai
   .chat-baris seperti tab Percakapan, aturan ini berubah dari tidak
   berguna menjadi merusak: baris milik sendiri kehilangan rata
   kanannya, tombol "muat sebelumnya" kehilangan rata tengahnya, dan
   menu melayang berlabuh pada baris yang geometrinya sudah lain.

   Dibuang, bukan disempitkan cakupannya: kelas yang tidak dipakai satu
   pun halaman adalah kelas yang suatu hari dipakai lagi oleh yang
   mengira ia masih berarti. */

.chat-kepala-alat { flex: 0 0 auto; display: flex; align-items: center; gap: 6px; }

@media (max-width: 700px) {
  .dok { right: 10px; left: 10px; justify-content: flex-end; }
  .dok-jendela { width: calc(100vw - 20px); height: 60vh; }
  .dok-jendela.dok-maks { width: calc(100vw - 20px); height: 78vh; }
  /* Di layar sempit hanya jendela terakhir yang ditampilkan - dua
     jendela selebar layar akan saling menutupi seluruhnya. */
  .dok-jendela-wadah > .dok-jendela:not(:last-child) { display: none; }
}

/* ---- Blok "Kotak bawaan" di perancang formulir ----
   Dibingkai supaya jelas ia mengatur kotak yang DISEDIAKAN SISTEM, bukan
   kolom buatan sendiri yang diatur di bagian bawah halaman. Tanpa batas
   yang terlihat, dua hal berbeda itu terbaca sebagai satu daftar. */
.rc-set {
  margin: 4px 0 14px;
  padding: 12px 14px 6px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-2);
}
.rc-set > legend {
  padding: 0 6px;
  font-size: .78rem; font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; color: var(--muted);
}
.rc-set .cek { margin-top: 8px; }
.rc-catatan { margin: 3px 0 10px 26px; line-height: 1.5; }

/* =====================================================================
   PENGATURAN GRUP

   Aturan tunggal berkelas seperti .chat-pesan { display: flex }
   MENGALAHKAN [hidden] bawaan peramban, karena keduanya sama-sama
   spesifisitas (0,1,0) dan yang ditulis belakangan menang. Jadi keadaan
   tersembunyinya harus ditulis tegas - kalau tidak, panel pengaturan
   dan daftar pesan tergambar bertumpuk.
   ===================================================================== */

.chat-pesan[hidden],
.chat-tulis[hidden],
.chat-atur[hidden] { display: none !important; }

.chat-gear { display: inline-flex; align-items: center; gap: 5px; }
.chat-gear svg { width: 15px; height: 15px; }
.chat-gear.aktif { background: var(--accent-w); color: var(--accent); }

.chat-atur {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  padding: 14px 16px;
  background: var(--ground);
}

/* Dua lajur di layar lapang, satu lajur di layar sempit. Anggota di
   kiri karena itulah yang paling sering dibuka - menambah orang jauh
   lebih sering daripada mengubah hak akses. */
.chat-atur-kolom {
  display: grid; gap: 18px;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  align-items: start;
}
.chat-atur-kolom h3 {
  margin: 0 0 8px; font-size: .9rem;
  padding-bottom: 6px; border-bottom: 1px solid var(--line);
}

.chat-anggota { list-style: none; margin: 0 0 12px; padding: 0; }
.chat-anggota > li {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 0; border-bottom: 1px solid var(--line-soft);
  font-size: .85rem;
}
.chat-anggota-teks { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.chat-anggota-teks > strong,
.chat-anggota-teks > small {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.chat-anggota-teks > small { font-size: .74rem; }
.chat-anggota-alat { flex: 0 0 auto; display: flex; gap: 4px; }

.chat-atur-form {
  padding: 12px; border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface);
}
.chat-atur-form .field { display: block; margin-bottom: 10px; }
.chat-atur-form .field > span { display: block; font-size: .8rem; color: var(--muted); margin-bottom: 3px; }
.chat-atur-form input[type=text],
.chat-atur-form select {
  width: 100%; padding: 7px 9px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--ground); color: var(--ink); font: inherit; font-size: .85rem;
}
.chat-atur-form .cek { margin: 4px 0 10px; }
.chat-atur-form .actions { margin: 0; }

/* Kotak tulis yang terkunci diberi keterangan, bukan dihilangkan
   diam-diam. Kotak yang hilang tanpa penjelasan terbaca sebagai
   kerusakan; keterangan yang menyebut sebabnya tidak. */
.chat-terkunci {
  flex: 0 0 auto;
  padding: 12px 16px; border-top: 1px solid var(--line);
  background: var(--surface-2); text-align: center; line-height: 1.5;
}

/* ---- Lampiran Office di chat: buka di tempat, plus tombol unduh ----
   Dua tindakan yang berbeda dipisahkan menjadi dua sasaran klik.
   Kalau kartu lampirannya hanya punya satu tautan, orang yang ingin
   menyimpan berkasnya harus membuka ONLYOFFICE dulu lalu mengunduh dari
   sana - dua langkah untuk sesuatu yang seharusnya satu. */
.chat-berkas-baris { display: flex; align-items: stretch; gap: 3px; }
.chat-berkas-baris > .chat-berkas-tautan { flex: 1 1 auto; min-width: 0; }

.chat-berkas-unduh {
  flex: 0 0 auto;
  display: flex; align-items: center; justify-content: center;
  width: 28px; border-radius: var(--radius);
  background: var(--surface-2); color: var(--muted);
  text-decoration: none; font-size: 1rem; line-height: 1;
}
.chat-berkas-unduh:hover { background: var(--surface-3); color: var(--ink); }

/* =====================================================================
   TIGA TOMBOL JENDELA DI HALAMAN PESAN
   ===================================================================== */

.chat-jendela { display: inline-flex; align-items: center; gap: 1px; margin-left: 2px; }

.chat-win {
  width: 26px; height: 24px; padding: 0;
  border: none; border-radius: 4px; cursor: pointer;
  background: transparent; color: var(--muted);
  font-size: .95rem; line-height: 1; text-decoration: none;
  display: flex; align-items: center; justify-content: center;
}
.chat-win:hover { background: var(--surface-2); color: var(--ink); }
/* Tutup diberi warna berbeda saat disentuh - ia satu-satunya dari
   ketiganya yang benar-benar meninggalkan percakapan. */
.chat-win-tutup:hover { background: var(--crit-w); color: var(--crit); }

/* ---------------- perkecil ---------------- */

/* Ruang percakapan tidak lagi memenuhi tinggi kisi, jadi tinggal
   bilah judulnya. Daftar di kiri tetap penuh. */
.chat.chat-kecil .chat-ruang { align-self: start; }
.chat.chat-kecil .chat-pesan,
.chat.chat-kecil .chat-tulis,
.chat.chat-kecil .chat-atur,
.chat.chat-kecil .chat-terkunci,
.chat.chat-kecil .chat-berkas-terpilih { display: none !important; }

/* ---------------- perbesar ---------------- */

/* Yang dilepas hanya PEMBATAS HALAMAN: jarak tepi 22 px, batas lebar
   1400 px, sisa tinggi 96 px, dan baris kaki. Menu kiri dan daftar
   percakapan tetap di tempatnya.
                                                                       
   Versi pertama menutupi keduanya dengan lapisan melayang. Itu keliru:
   daftar percakapan bukan hiasan yang mengganggu, ia alat kerja - orang
   membaca satu percakapan sambil melihat mana lagi yang menunggu
   dijawab. Menyembunyikannya memaksa keluar-masuk mode penuh setiap
   kali ingin berpindah, dan itu lebih merepotkan daripada ruang baca
   yang didapat. */
body.chat-penuh .page { padding: 0; max-width: none; }
body.chat-penuh .foot { display: none; }

body.chat-penuh .chat {
  height: calc(100vh - var(--topbar-tinggi) - var(--subnav-tinggi));
  min-height: 0;
  gap: 0;
}

/* Sudut dan garis luar dihilangkan supaya kedua panel benar-benar
   menempel ke tepi jendela, bukan mengambang dengan celah tipis. */
body.chat-penuh .chat-daftar { border-radius: 0; border-left: none; }
body.chat-penuh .chat-ruang  { border-radius: 0; border-right: none; }

/* Halaman di belakangnya dikunci supaya tidak ikut tergulir saat
   percakapan digulir sampai ujung. */
body.chat-penuh { overflow: hidden; }

/* Dok pesan disembunyikan selagi mode penuh - ia melayang di kanan
   bawah, tepat di atas kotak tulis. */
body.chat-penuh .dok { display: none; }

/* ---- Kepala percakapan kini memuat banyak tombol ----
   Tiga tombol jendela, gear grup, arsip, hapus, dan hapus total. Pada
   layar sempit deretan itu tidak muat dalam satu baris, dan tanpa izin
   membungkus ia akan mendorong nama percakapan sampai tidak terbaca -
   nama itu satu-satunya yang memberi tahu sedang membuka percakapan
   siapa. */
.chat-kepala { flex-wrap: wrap; row-gap: 6px; }
.chat-kepala-alat { flex-wrap: wrap; row-gap: 4px; margin-left: auto; }
.chat-kepala-teks { flex: 1 1 180px; }

/* Hapus total diberi warna bahaya penuh, bukan sekadar garis tepi.
   Ia satu-satunya tombol di halaman ini yang menghapus milik orang
   lain, dan itu harus terlihat sebelum diklik, bukan sesudah. */
.chat-kepala-alat .btn-danger { font-weight: 600; }

/* Keterangan saat riwayat sudah dibersihkan. Kotak pesan yang kosong
   melompong terbaca sebagai kerusakan; satu kalimat yang menyebut
   sebabnya tidak. */
.chat-bersih {
  align-self: center; max-width: 420px; margin: auto 0;
  padding: 14px 16px; text-align: center; line-height: 1.6;
  border: 1px dashed var(--line); border-radius: var(--radius);
  background: var(--surface);
}

/* Syarat langkah persetujuan. Diberi warna sendiri supaya terbaca
   sebagai keterangan tambahan, bukan bagian dari nama langkah - kalau
   warnanya sama, "Persetujuan Vera hanya bila Diajukan kepada kosong"
   terbaca sebagai satu nama panjang yang membingungkan. */
.rantai-syarat {
  display: block; margin-top: 2px;
  font-size: .76rem; color: var(--warn);
}
.rantai-syarat::before { content: "\\21B3\\00A0"; opacity: .7; }

/* =====================================================================
   TUGAS & PROYEK
   ===================================================================== */

/* ---- angka ringkas di puncak setiap tampilan ---- */
.tg-ringkas {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 1px; background: var(--line); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden; margin-bottom: 14px;
}
.tg-angka {
  background: var(--surface); padding: 11px 14px; text-decoration: none;
  display: flex; flex-direction: column; gap: 1px; color: inherit;
}
.tg-angka:hover { background: var(--surface-2); }
.tg-angka b { font-size: 1.5rem; line-height: 1.1; font-variant-numeric: tabular-nums; }
.tg-angka span { font-size: .78rem; color: var(--muted); }
.tg-angka-bahaya b { color: var(--crit); }

.tg-bar { align-items: flex-end; }
.tg-bar select, .tg-bar input[type=search] { min-width: 130px; }
.tg-cari input { min-width: 190px; }
.tg-bar-mode { margin-top: -6px; }
.tg-bulan-nav { display: inline-flex; align-items: center; gap: 8px; margin-left: auto; }

/* ---- daftar ---- */
.tg-alat { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }
.tg-urut { font-size: .8rem; color: var(--muted); }
.tg-urut a { color: var(--muted); text-decoration: none; margin-left: 8px; }
.tg-urut a:hover { color: var(--accent); }
.tg-urut-aktif { color: var(--accent) !important; font-weight: 600; text-decoration: underline !important; }

.tg-grup {
  display: flex; align-items: baseline; gap: 8px;
  margin: 16px 0 4px; padding-bottom: 4px; border-bottom: 1px solid var(--line);
  font-weight: 600; font-size: .9rem;
}
.tg-grup:first-child { margin-top: 0; }
.tg-grup a { color: var(--ink); text-decoration: none; }
.tg-grup a:hover { color: var(--accent); }

.tg-tabel td { vertical-align: top; }
.tg-judul { font-weight: 500; color: var(--ink); text-decoration: none; }
.tg-judul:hover { color: var(--accent); text-decoration: underline; }
.tg-baris-selesai .tg-judul { color: var(--muted); text-decoration: line-through; }
.tg-nama { font-size: .85rem; }
.tg-tgl { white-space: nowrap; }
.tg-lewat { color: var(--crit); font-weight: 600; }

/* Prioritas tinggi ditandai bentuk DAN warna, bukan warna saja: satu dari
   dua belas laki-laki tidak bisa membedakan merah dari abu-abu. */
.tg-prio {
  display: inline-block; width: 15px; height: 15px; line-height: 15px;
  text-align: center; border-radius: 3px; font-weight: 700; font-size: .72rem;
  background: var(--crit-w); color: var(--crit); margin-right: 4px;
}

.tg-halaman { display: flex; align-items: center; gap: 12px; margin-top: 14px; }

.tg-selesai { color: var(--ok); }
.tg-jalan   { color: var(--accent); }
.tg-tinjau  { color: var(--warn); }
.tg-tunda   { color: var(--muted); }
.tg-tolak   { color: var(--crit); }
.tg-tunggu  { color: var(--ink-soft); }

/* ---- papan kanban ---- */
.tg-catatan-papan { margin: -4px 0 10px; }

.tg-papan {
  display: flex; gap: 12px; align-items: flex-start;
  overflow-x: auto; padding-bottom: 12px;
}
.tg-kolom {
  flex: 0 0 265px; background: var(--surface-2);
  border: 1px solid var(--line); border-radius: var(--radius);
  display: flex; flex-direction: column; max-height: 74vh;
}
.tg-kolom-kepala {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 9px 12px; border-top: 3px solid var(--muted);
  border-radius: var(--radius) var(--radius) 0 0;
  background: var(--surface); font-size: .85rem;
}
.tg-kolom-nama { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tg-kolom-jml {
  flex: 0 0 auto; background: var(--surface-3); color: var(--muted);
  border-radius: 9px; padding: 0 7px; font-size: .75rem;
}
.tg-kolom-isi { padding: 8px; display: flex; flex-direction: column; gap: 8px; overflow-y: auto; }
.tg-kolom-kosong { text-align: center; padding: 14px 0; }
.tg-kolom-sasaran { outline: 2px dashed var(--accent); outline-offset: -3px; }

.tg-kartu {
  background: var(--ground); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 9px 10px; cursor: grab;
  display: flex; flex-direction: column; gap: 6px;
}
.tg-kartu:active { cursor: grabbing; }
.tg-kartu-seret { opacity: .4; }
.tg-kartu-judul { font-size: .87rem; color: var(--ink); text-decoration: none; line-height: 1.35; }
.tg-kartu-judul:hover { color: var(--accent); }
.tg-kartu-proyek { font-size: .73rem; color: var(--muted); }
.tg-kartu-kaki { display: flex; align-items: center; gap: 7px; font-size: .74rem; color: var(--muted); }
.tg-kartu-tgl { margin-left: auto; }
.tg-kartu-tanda { white-space: nowrap; }

/* =====================================================================
   WARNA KARTU DI PAPAN
   =====================================================================

   SELURUH kartu yang berwarna, bukan pita di tepinya.

   Versi pertama memakai pita 4 piksel di tepi kiri, dengan alasan yang
   terdengar masuk akal: pita tidak menyentuh teks, jadi keterbacaannya
   pasti aman. Di papan sungguhan alasan itu runtuh - pita setipis itu
   hilang di antara enam puluh kartu, dan warna yang harus dicari
   dengan mata menyipit tidak menjawab pertanyaan yang membuat orang
   mewarnai kartunya: "mana yang merah?"

   Keterbacaan tetap dijaga, hanya dengan cara lain: yang diwarnai
   LATARNYA dengan nada sangat muda, dan warna teks tidak disentuh sama
   sekali. Tiap warna punya dua nilai - muda untuk tema terang, tua
   untuk tema gelap - sebab satu nilai yang sama tidak bisa benar di
   keduanya: yang nyaman di kertas putih menyilaukan di layar gelap,
   dan yang pas di layar gelap tidak terlihat sama sekali di terang.

   Nilainya ditulis di sini, bukan di basis data. Yang disimpan cuma
   namanya - 'merah', 'hijau' - jadi kartu yang diwarnai hari ini ikut
   menyesuaikan diri kalau palet ini dirapikan tahun depan, dan ikut
   berganti nada sendiri saat orangnya berpindah tema. */
.tg-kartu { position: relative; }

.tg-kartu.tg-warna-merah  { background: #fdeaea; border-color: #f0b4b4; }
.tg-kartu.tg-warna-jingga { background: #fdf0e0; border-color: #efc794; }
.tg-kartu.tg-warna-kuning { background: #fbf6d8; border-color: #e3d183; }
.tg-kartu.tg-warna-hijau  { background: #e6f5ec; border-color: #a5d7bb; }
.tg-kartu.tg-warna-biru   { background: #e7f0fb; border-color: #a8c6e9; }
.tg-kartu.tg-warna-ungu   { background: #f0eafa; border-color: #c2addf; }

@media (prefers-color-scheme: dark) {
  .tg-kartu.tg-warna-merah  { background: #3a2222; border-color: #6d3b3b; }
  .tg-kartu.tg-warna-jingga { background: #3a2d1d; border-color: #6d5227; }
  .tg-kartu.tg-warna-kuning { background: #36331c; border-color: #665e26; }
  .tg-kartu.tg-warna-hijau  { background: #1e3329; border-color: #2f6048; }
  .tg-kartu.tg-warna-biru   { background: #1f2c3b; border-color: #315170; }
  .tg-kartu.tg-warna-ungu   { background: #2b2438; border-color: #4d3f6b; }
}

/* Tombol titik tiga. Samar sampai kartunya disentuh - papan dengan enam
   puluh kartu yang masing-masing memamerkan tombolnya sendiri sudah
   penuh sebelum satu tugas pun dibaca. Tetap terlihat penuh saat
   menunya terbuka atau saat ia yang sedang difokus papan ketik, supaya
   tidak lenyap di bawah jari orang yang sedang memakainya. */
.tg-kartu-menu { position: absolute; right: 5px; bottom: 4px; }

.tg-kartu-titik {
  border: none; background: none; cursor: pointer; padding: 0 4px;
  line-height: 1; font-size: 1rem; color: var(--muted);
  opacity: 0; transition: opacity .12s;
}
.tg-kartu:hover .tg-kartu-titik,
.tg-kartu-titik:focus-visible,
.tg-kartu-titik[aria-expanded="true"] { opacity: 1; }
.tg-kartu-titik:hover { color: var(--ink); }

/* ATURAN INI WAJIB ADA, DAN URUTANNYA SESUDAH .tg-warna-pilih.
   ------------------------------------------------------------------
   Atribut `hidden` disembunyikan peramban lewat `display: none` di
   lembar gaya bawaannya - dan lembar gaya bawaan kalah oleh kelas apa
   pun yang menyebut display. Jadi `.tg-warna-pilih { display: flex }`
   sendirian membuat menunya TIDAK PERNAH tersembunyi: enam bulatan
   warna menempel di tiap kartu sepanjang waktu, dan JavaScript yang
   dengan rajin memasang `hidden` tampak seolah tidak bekerja.

   Persis itu yang terjadi pada versi pertama fitur ini. */
.tg-warna-pilih {
  position: absolute; right: 0; bottom: 20px; z-index: 30;
  display: flex; gap: 5px; padding: 6px;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: 0 6px 18px rgba(0,0,0,.18);
}
.tg-warna-pilih[hidden] { display: none; }

.tg-warna-satu {
  width: 17px; height: 17px; border-radius: 50%; cursor: pointer;
  border: 1px solid rgba(0,0,0,.18); padding: 0;
  line-height: 1; font-size: .7rem; color: var(--muted);
}
.tg-warna-satu:hover, .tg-warna-satu:focus-visible { transform: scale(1.18); }

.tg-warna-pilih .tg-warna-merah  { background: #e05252; }
.tg-warna-pilih .tg-warna-jingga { background: #e08a3c; }
.tg-warna-pilih .tg-warna-kuning { background: #d6b429; }
.tg-warna-pilih .tg-warna-hijau  { background: #3fa96b; }
.tg-warna-pilih .tg-warna-biru   { background: #3d86d0; }
.tg-warna-pilih .tg-warna-ungu   { background: #8a63cc; }
.tg-warna-kosong { background: var(--surface-2); }
.tg-kartu-periksa { display: flex; align-items: center; gap: 6px; font-size: .72rem; color: var(--muted); }

.tg-bilah {
  flex: 1 1 auto; display: block; height: 5px; min-width: 40px;
  background: var(--surface-3); border-radius: 3px; overflow: hidden;
}
.tg-bilah i { display: block; height: 100%; background: var(--accent); }

/* ---- tenggat & kalender ---- */
.tg-jt-tgl { white-space: nowrap; width: 78px; }
.tg-jt-orang { white-space: nowrap; }

.tg-kal {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 1px; background: var(--line); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.tg-kal-kepala {
  background: var(--surface-2); padding: 6px 8px;
  font-size: .74rem; font-weight: 600; color: var(--muted); text-align: center;
}
.tg-kal-sel {
  background: var(--surface); min-height: 92px; padding: 5px 6px;
  display: flex; flex-direction: column; gap: 3px;
}
.tg-kal-kosong { background: var(--surface-2); }
.tg-kal-ini { box-shadow: inset 0 0 0 2px var(--accent); }
.tg-kal-nomor { font-size: .76rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.tg-kal-tugas {
  font-size: .73rem; line-height: 1.3; text-decoration: none;
  background: var(--accent-w); color: var(--accent);
  border-radius: 3px; padding: 2px 5px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.tg-kal-lewat { background: var(--crit-w); color: var(--crit); }
.tg-kal-lagi { font-size: .7rem; color: var(--muted); text-decoration: none; }

/* ---- gantt ---- */
/* Gantt digulir SEBAGAI SATU WADAH - ini penting, dan dulu tidak begitu.
   Sebelumnya kolom nama dan kisi tanggal punya wadah gulirnya
   masing-masing: nama ber-overflow:hidden, kisi ber-overflow-x:auto.
   Yang tidak terlihat dari CSS itu, satu aturan CSS mengubah overflow-y
   kisi menjadi auto juga begitu overflow-x-nya bukan visible - jadi
   kisinya bisa digulir tegak sementara kolom nama TIDAK BISA SAMA
   SEKALI. Di layar penuh akibatnya terlihat jelas: batangnya bergerak,
   namanya diam, dan baris di bawah lipatan tidak pernah bisa dicapai.

   Sekarang hanya .tg-gantt yang menggulir, dua arah. Kolom nama
   menempel ke kiri dan kepala tabel menempel ke atas dengan position:
   sticky, jadi keduanya tetap terlihat tanpa pernah bisa lepas dari
   barisnya - kesejajaran bukan lagi sesuatu yang harus dijaga, sebab
   keduanya digulir oleh wadah yang sama. */
.tg-gantt {
  display: flex; border: 1px solid var(--line); border-radius: var(--radius);
  overflow: auto; max-height: 70vh;
  /* flex-start, BUKAN stretch. Dengan stretch kedua kolom diregangkan
     setinggi jendela gulirnya saja, bukan setinggi isinya - dan kepala
     tabel yang menempel di dalamnya ikut hanyut begitu kotak induknya
     tergulir keluar layar. Dengan flex-start keduanya setinggi isi
     sebenarnya, sehingga yang menempel benar-benar menempel. */
  align-items: flex-start;
}
.tg-gantt-nama {
  flex: 0 0 210px; border-right: 1px solid var(--line);
  background: var(--surface);
  /* Di ATAS kepala tanggal (z 3). Kolom nama membuat konteks tumpuknya
     sendiri, jadi z-index anaknya tidak bisa menembus keluar - kalau
     nilainya lebih rendah, kepala tanggal menutupi kata "Tugas" di
     sudut kiri atas. */
  position: sticky; left: 0; z-index: 5;
}
.tg-gantt-kepala {
  height: 30px; display: flex; align-items: center; padding: 0 10px;
  background: var(--surface-2); border-bottom: 1px solid var(--line);
  font-size: .74rem; font-weight: 600; color: var(--muted);
  position: sticky; top: 0; z-index: 3;
}
/* Sudut kiri atas menempel dua arah sekaligus - tegak oleh aturan di
   atas, mendatar oleh kolom namanya. */
.tg-gantt-baris {
  display: flex; align-items: center; padding: 0 10px;
  border-bottom: 1px solid var(--line-soft); font-size: .8rem;
}
.tg-gantt-baris a {
  color: var(--ink); text-decoration: none;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.tg-gantt-baris a:hover { color: var(--accent); }

/* Tanpa wadah gulir sendiri. flex-shrink 0 supaya kisi selebar
   rentang waktunya tidak diperas masuk ke dalam lebar layar - yang
   diperas itulah yang dulu memaksanya menggulir sendiri. */
.tg-gantt-kisi { flex: 1 0 auto; }
.tg-gantt-dalam { position: relative; }
/* Tanpa position sendiri - ia mewarisi sticky dari .tg-gantt-kepala,
   dan sticky sudah cukup jadi jangkar bagi label minggu yang
   berposisi mutlak di dalamnya. Menulis position:relative di sini
   dulu diam-diam membatalkan sticky-nya, sebab aturannya datang
   belakangan dengan kekhususan yang sama. */
.tg-gantt-waktu { padding: 0; }
.tg-gantt-minggu {
  position: absolute; top: 0; height: 30px; line-height: 30px;
  padding-left: 5px; font-size: .7rem; color: var(--muted);
  border-left: 1px solid var(--line); white-space: nowrap; overflow: hidden;
}
.tg-gantt-bulan-awal { color: var(--ink-soft); font-weight: 600; }

.tg-gantt-badan { position: relative; background: var(--surface); color: var(--ink-soft); }
.tg-gantt-garis { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--line-soft); }
.tg-gantt-hariini { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--crit); opacity: .55; }
.tg-gantt-tali { position: absolute; top: 0; left: 0; pointer-events: none; }

.tg-gantt-batang {
  position: absolute; height: 20px; border-radius: 3px;
  background: var(--accent-w); border: 1px solid currentColor;
  display: flex; align-items: center; padding: 0 6px;
  font-size: .72rem; text-decoration: none; overflow: hidden;
}
.tg-gantt-batang span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tg-gantt-batang.tg-selesai { background: var(--ok-w); }
.tg-gantt-batang.tg-tinjau  { background: var(--warn-w); }
.tg-gantt-lewat { background: var(--crit-w); }

/* ---- detail tugas ---- */
.tg-detil { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: 20px; }
@media (max-width: 820px) { .tg-detil { grid-template-columns: minmax(0, 1fr); } }
.tg-detil-sisi { border-left: 1px solid var(--line); padding-left: 16px; }
@media (max-width: 820px) { .tg-detil-sisi { border-left: none; padding-left: 0; border-top: 1px solid var(--line); padding-top: 12px; } }

.tg-fakta { margin: 0; display: grid; grid-template-columns: auto; gap: 2px; font-size: .85rem; }
.tg-fakta dt { color: var(--muted); font-size: .74rem; text-transform: uppercase; letter-spacing: .04em; margin-top: 9px; }
.tg-fakta dd { margin: 0; }
.tg-orang { display: inline-block; margin-right: 6px; }
.tg-status-form { margin-top: 14px; }
.tg-tag-baris { margin-top: 10px; }

.tg-daftar-ringkas { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
.tg-daftar-ringkas li { display: flex; align-items: center; gap: 8px; font-size: .87rem; }

/* ---- daftar periksa ---- */
.tg-periksa { list-style: none; margin: 0 0 10px; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.tg-periksa li { display: flex; align-items: center; gap: 8px; font-size: .88rem; }
.tg-periksa-form { display: inline-flex; margin: 0; }
.tg-periksa-kotak {
  width: 18px; height: 18px; flex: 0 0 18px; border: 1px solid var(--line);
  background: var(--surface); border-radius: 3px; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: .78rem; color: var(--ok); padding: 0;
}
.tg-periksa-mati { cursor: default; }
.tg-periksa-selesai .tg-periksa-teks { color: var(--muted); text-decoration: line-through; }
.tg-periksa-teks { flex: 1 1 auto; }
.tg-periksa-buang { border: none; background: transparent; color: var(--muted); cursor: pointer; font-size: 1rem; padding: 0 3px; }
.tg-periksa-buang:hover { color: var(--crit); }
.tg-periksa-tambah { display: flex; gap: 7px; }
.tg-periksa-tambah input { flex: 1 1 auto; }

/* ---- lampiran & komentar ---- */
.tg-berkas { list-style: none; margin: 0 0 10px; padding: 0; display: flex; flex-direction: column; gap: 5px; font-size: .88rem; }
.tg-berkas li { display: flex; align-items: center; gap: 8px; }
.tg-berkas-unduh { text-decoration: none; color: var(--muted); }
.tg-unggah { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }

.tg-komentar { list-style: none; margin: 0 0 14px; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.tg-komentar > li { display: flex; gap: 9px; }
.tg-komentar-isi { flex: 1 1 auto; min-width: 0; }
.tg-komentar-kepala { display: flex; align-items: baseline; gap: 8px; font-size: .85rem; }
.tg-komentar-isi p { margin: 3px 0 0; font-size: .89rem; }
.tg-komentar-berkas { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; align-items: flex-start; }
.tg-komentar-berkas img { max-width: 180px; max-height: 140px; border-radius: var(--radius); display: block; }
.tg-komentar-tulis { display: flex; flex-direction: column; gap: 7px; }
.tg-komentar-tulis textarea { width: 100%; }
.tg-komentar-alat { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

/* ---- proyek ---- */
.tg-proyek-kisi { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 12px; }
.tg-proyek-kartu {
  border: 1px solid var(--line); border-radius: var(--radius); padding: 13px 14px;
  background: var(--surface); text-decoration: none; color: inherit;
  display: flex; flex-direction: column; gap: 8px;
}
.tg-proyek-kartu:hover { border-color: var(--accent); }
.tg-proyek-tutup { opacity: .62; }
.tg-proyek-kepala { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap; }
.tg-proyek-bilah { display: flex; align-items: center; gap: 8px; }
.tg-proyek-angka { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 10px; margin: 0; font-size: .78rem; }
.tg-proyek-angka dt { color: var(--muted); display: inline; }
.tg-proyek-angka dd { margin: 0; display: inline; font-weight: 600; }
.tg-proyek-angka > div { display: flex; justify-content: space-between; gap: 6px; }

.tg-anggota { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; }
.tg-anggota-satu { display: flex; align-items: center; gap: 7px; font-size: .85rem; }
.tg-anggota-satu small { display: block; font-size: .72rem; }
.tg-anggota-mati { opacity: .55; }
.tg-lingkup { margin: -2px 0 10px; }
.side-lencana-lewat { background: var(--crit); color: #fff; }

.tg-putus { display: flex; flex-direction: column; gap: 9px; }
.tg-putus-form { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.tg-putus-form input[type=text] { flex: 1 1 220px; }

.tg-riwayat { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; font-size: .84rem; }
.tg-riwayat li { display: grid; grid-template-columns: 118px 118px minmax(0, 1fr); gap: 10px; align-items: baseline; }
@media (max-width: 640px) { .tg-riwayat li { grid-template-columns: minmax(0, 1fr); gap: 1px; } }
.tg-riwayat-waktu { color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tg-riwayat-bidang { color: var(--ink-soft); font-weight: 600; }

.tg-hari-pilih { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin: 6px 0 4px; }
.tg-hari-pilih[hidden] { display: none !important; }
.tg-hari-pilih .field-label { font-size: .8rem; color: var(--muted); }
#brl-tanggal[hidden] { display: none !important; }

.tg-form-tersembunyi { display: none; }
.tg-tambah-kolom { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-top: 10px; }
.tg-tambah-kolom input[type=text] { flex: 1 1 200px; }
.tg-tambah-anggota { margin-top: 14px; border-top: 1px solid var(--line); padding-top: 12px; }

.tg-hapus:hover { color: var(--crit); border-color: var(--crit); }
.tg-tag-baris { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 10px; }
.tg-tag-satu { display: inline-flex; align-items: center; gap: 3px; }
.tg-tag-lepas { border: none; background: transparent; color: inherit; cursor: pointer; padding: 0 1px; font-size: .9em; opacity: .6; }
.tg-tag-lepas:hover { opacity: 1; color: var(--crit); }
.tg-tag-tambah { display: inline-flex; gap: 5px; align-items: center; margin: 0; }
.tg-tag-tambah input { width: 120px; }
.tg-gantung-tambah { display: flex; gap: 8px; align-items: center; margin-top: 10px; flex-wrap: wrap; }
.tg-gantung-tambah select { flex: 1 1 260px; max-width: 100%; }
.tg-daftar-ringkas form { display: inline-flex; margin: 0; }

/* =====================================================================
   KALENDER
   ===================================================================== */

.kal-bar { align-items: center; gap: 14px; flex-wrap: wrap; }
.kal-tampilan { display: inline-flex; gap: 5px; }
/* .kal-baru DIGANTIKAN .kal-kanan sejak tombol Google Calendar masuk
   ke bilah: sekarang ada DUA tombol di ujung kanan, dan yang harus
   didorong ke kanan adalah wadahnya, bukan salah satu tombolnya.
   Aturannya dibiarkan ada supaya salinan lama kal_bilah.php yang belum
   terunggah tidak berubah tata letaknya di tengah pemasangan. */
.kal-baru { margin-left: auto; }

.kal-lapis { display: inline-flex; flex-wrap: wrap; gap: 6px; }
.kal-cip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 9px; border-radius: 12px; font-size: .76rem;
  border: 1px solid var(--line); background: var(--surface);
  color: var(--muted); text-decoration: none;
}
/* Lapis yang mati ditandai warna DAN teks pudar, bukan warna saja - satu
   dari dua belas laki-laki tidak bisa membedakan merah dari abu-abu. */
.kal-cip i { width: 8px; height: 8px; border-radius: 50%; opacity: .3; flex: 0 0 8px; }
.kal-cip-nyala { color: var(--ink); border-color: var(--ink-soft); }
.kal-cip-nyala i { opacity: 1; }

.kal-nav {
  display: flex; gap: 7px; align-items: center; flex-wrap: wrap; margin-bottom: 12px;
}
/* Kedua sisi diberi lebar yang sama - flex-basis 0 dengan grow 1 -
   supaya tajuk di antaranya jatuh tepat di tengah lebar kotak, bukan
   di tengah ruang yang tersisa sesudah tombol. */
.kal-nav-sisi { flex: 1 1 0; display: flex; gap: 7px; align-items: center; min-width: 0; }
.kal-nav-kanan { justify-content: flex-end; }

.kal-tajuk {
  flex: 0 0 auto; padding: 0 14px;
  font-size: 1.4rem; font-weight: 700; line-height: 1.2;
  color: var(--accent); letter-spacing: .2px; white-space: nowrap;
}
.kal-tajuk-kanan { margin-left: auto; }

/* Di layar sempit tombolnya sudah membungkus sendiri; tajuknya
   diberi baris penuh supaya tidak terjepit di antara dua tombol. */
@media (max-width: 720px) {
  .kal-nav-sisi { flex: 1 1 100%; }
  .kal-nav-kanan { display: none; }
  .kal-tajuk { flex: 1 1 100%; padding: 4px 0 0; text-align: center; }
  .kal-tajuk-kanan { margin-left: 0; }
}

/* Lambang kue di depan nama yang berulang tahun. Sejajar dengan garis
   dasar teks, bukan menggantung di tengah - kalau di tengah, ia
   terlihat melompat pada butir yang judulnya dua baris. */
.kal-ikon {
  vertical-align: -2px; margin-right: 3px; flex: 0 0 auto;
}
.kal-ultah .kal-ikon { color: #a8557a; }
.kal-judul .kal-ikon { color: #a8557a; }

/* ---- kisi bulan ---- */
.kal-kisi {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 1px; background: var(--line); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.kal-kepala {
  background: var(--surface-2); padding: 6px 8px; text-align: center;
  font-size: .74rem; font-weight: 600; color: var(--muted);
}
.kal-sel {
  background: var(--surface); min-height: 104px; padding: 4px 5px;
  display: flex; flex-direction: column; gap: 2px; overflow: hidden;
}
.kal-luar  { background: var(--surface-2); }
.kal-merah { background: var(--crit-w); }
.kal-luar.kal-merah { background: var(--surface-2); }
.kal-ini { box-shadow: inset 0 0 0 2px var(--accent); }

.kal-nomor { display: flex; align-items: baseline; gap: 6px; justify-content: space-between; }
.kal-nomor > a {
  font-size: .8rem; color: var(--ink-soft); text-decoration: none;
  font-variant-numeric: tabular-nums; padding: 0 2px; border-radius: 3px;
}
.kal-nomor > a:hover { background: var(--accent-w); color: var(--accent); }
.kal-luar .kal-nomor > a { color: var(--muted); }
.kal-libur-nama {
  font-size: .66rem; color: var(--crit); overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; max-width: 62%;
}

.kal-butir {
  display: block; font-size: .71rem; line-height: 1.35; text-decoration: none;
  padding: 1px 4px; border-left: 3px solid var(--accent);
  background: var(--surface-2); color: var(--ink-soft); border-radius: 0 2px 2px 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.kal-butir:hover { background: var(--surface-3); color: var(--ink); }
.kal-butir b { font-variant-numeric: tabular-nums; }
.kal-lagi { font-size: .68rem; color: var(--muted); text-decoration: none; padding-left: 4px; }

/* ---- minggu ---- */
.kal-minggu {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 1px; background: var(--line); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
@media (max-width: 900px) { .kal-minggu { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .kal-minggu { grid-template-columns: minmax(0, 1fr); } }

.kal-hari { background: var(--surface); padding: 7px 8px; min-height: 130px;
            display: flex; flex-direction: column; gap: 4px; }
.kal-hari > header { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap;
                     border-bottom: 1px solid var(--line-soft); padding-bottom: 4px; }
.kal-hari-nama { font-size: .78rem; font-weight: 600; }
.kal-hari-tgl { font-size: 1.05rem; color: var(--ink); text-decoration: none;
                font-variant-numeric: tabular-nums; }
.kal-hari-tgl:hover { color: var(--accent); }
.kal-hari .kal-butir { white-space: normal; padding: 3px 5px; }
.kal-hari .kal-butir small { display: block; }
.kal-kosong { text-align: center; padding: 8px 0; }

/* ---- agenda ---- */
.kal-agenda { display: flex; flex-direction: column; gap: 1px;
              background: var(--line); border: 1px solid var(--line);
              border-radius: var(--radius); overflow: hidden; }
.kal-agenda-hari { background: var(--surface); display: grid;
                   grid-template-columns: 66px minmax(0, 1fr); gap: 12px; padding: 9px 12px; }
.kal-agenda-tgl { text-align: center; display: flex; flex-direction: column; line-height: 1.15; }
.kal-agenda-tgl b { font-size: 1.4rem; font-variant-numeric: tabular-nums; }
.kal-agenda-tgl span { font-size: .74rem; color: var(--muted); }
.kal-agenda-tgl small { font-size: .68rem; color: var(--muted); }
.kal-agenda-tgl em { font-size: .64rem; color: var(--accent); font-style: normal; font-weight: 600; }
.kal-agenda-isi { display: flex; flex-direction: column; gap: 4px; min-width: 0; }

.kal-baris { display: flex; align-items: baseline; gap: 8px; font-size: .87rem;
             text-decoration: none; color: var(--ink); padding: 2px 0; flex-wrap: wrap; }
.kal-baris:hover .kal-judul { color: var(--accent); text-decoration: underline; }
.kal-titik { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 8px; }
.kal-jam { font-size: .78rem; color: var(--muted); font-variant-numeric: tabular-nums;
           min-width: 48px; }
.kal-judul { min-width: 0; }

/* ---- acara & undangan ---- */
.kal-jawab { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.kal-jawab-form { display: inline-flex; gap: 6px; margin: 0; margin-left: auto; }
.kal-jam[hidden] { display: none !important; }
.kal-ulang[hidden] { display: none !important; }

/* ---- ruang rapat ---- */
.kal-ruang-kisi { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
.kal-ruang { border: 1px solid var(--line); border-radius: var(--radius);
             background: var(--surface); display: flex; flex-direction: column; }
.kal-ruang-mati { opacity: .55; }
.kal-ruang > header { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap;
                      padding: 8px 11px; border-top: 3px solid var(--muted);
                      border-radius: var(--radius) var(--radius) 0 0; }
.kal-ruang-jadwal { list-style: none; margin: 0; padding: 6px 11px 10px;
                    display: flex; flex-direction: column; gap: 6px; font-size: .84rem; }
.kal-ruang-jadwal li { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
.kal-ruang-jadwal a { color: var(--ink); text-decoration: none; }
.kal-ruang-jadwal a:hover { color: var(--accent); text-decoration: underline; }

.kal-ruang-baris { display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
                   padding: 7px 0; border-bottom: 1px solid var(--line-soft); }
.kal-ruang-baris input[type=text] { flex: 1 1 200px; }
.kal-ruang-baru { border-bottom: none; margin-top: 8px; }

.kal-libur-tambah { margin-top: 16px; border-top: 1px solid var(--line); padding-top: 14px; }

/* =====================================================================
   DRIVE
   ===================================================================== */

.dr-angka {
  display: grid; gap: 10px; margin-bottom: 14px;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
}
.dr-kotak {
  display: block; padding: 10px 14px; text-decoration: none;
  background: var(--ground); border: 1px solid var(--line);
  border-top: 3px solid var(--line); border-radius: var(--radius);
  color: var(--ink);
}
.dr-kotak:hover { background: var(--surface-2); }
.dr-kotak.dr-aktif { border-color: var(--accent); background: var(--surface-2); }
.dr-kotak b { display: block; font-size: 1.35rem; line-height: 1.2; }
.dr-kotak span { display: block; font-size: .8rem; color: var(--ink-soft); }
.dr-kotak small { display: block; font-size: .74rem; color: var(--muted); margin-top: 2px; }

.dr-bar .dr-cari { flex: 1 1 260px; min-width: 200px; }
.dr-kanan { text-align: right; white-space: nowrap; }

/* Titik warna sumber di depan nama berkas. Warna saja tidak cukup bagi
   yang sulit membedakan warna - karena itu label sumbernya tetap
   ditulis di kolom sebelahnya, dan titik ini hanya mempercepat
   penyapuan mata. */
.dr-titik {
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  margin-right: 7px; vertical-align: 1px; flex: 0 0 auto;
}
.dr-induk {
  display: inline-block; max-width: 30ch; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; vertical-align: -4px;
  margin-left: 4px; font-size: .82rem;
}
.dr-tabel td:first-child a { word-break: break-all; }

/* Baris yang berkasnya belum ada - dipudarkan, bukan disembunyikan.
   Yang mengurus perpindahan berkas justru perlu melihatnya. */
.dr-hilang td { opacity: .55; }
.dr-hilang td:first-child span[title] { font-style: italic; }

.dr-catatan { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--line-soft); }

.dr-total { margin: 0 0 10px; font-size: .92rem; }
.dr-total strong { font-variant-numeric: tabular-nums; }
.dr-pisah { margin: 0 6px; color: var(--muted); }

/* Angka ukuran disejajarkan supaya besar-kecilnya terbaca dari
   panjangnya, bukan dari membaca satu per satu. Tidak dipudarkan:
   ini kolom yang justru dicari orang saat membereskan penyimpanan. */
.dr-ukuran { font-variant-numeric: tabular-nums; white-space: nowrap; font-size: .84rem; }

/* ---- pratinjau PDF berbingkai portal ---- */

.dv-bar { align-items: center; gap: 8px; }
.dv-judul {
  font-weight: 600; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; max-width: 46ch;
}
.dv-sisi { margin-left: auto; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }

.dv-kotak .kotak-isi { display: flex; flex-direction: column; }
.dv-bingkai {
  width: 100%; height: 74vh; min-height: 380px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface-2);
}
/* Diperbesar ke layar penuh, bingkainya ikut mengambil sisa tinggi -
   PDF portrait di layar lebar jauh lebih terbaca begitu. min-height
   dilepas, kalau tidak ia menolak mengecil dan bilah bawahnya
   terdorong keluar layar. */
.kotak.kotak-maks[data-kotak="drive-pdf"] .dv-bingkai {
  flex: 1 1 auto; height: auto; min-height: 0;
}
.dv-catatan { margin: 8px 0 0; }

/* ---- agenda di beranda ---- */

.bd-agenda { list-style: none; margin: 0; padding: 0; }
.bd-agenda-hari { display: flex; gap: 12px; padding: 7px 0; }
.bd-agenda-hari + .bd-agenda-hari { border-top: 1px solid var(--line-soft); }
.bd-agenda-tgl {
  flex: 0 0 108px; font-size: .8rem; font-weight: 600; color: var(--ink-soft);
  padding-top: 1px;
}
.bd-agenda-kini .bd-agenda-tgl { color: var(--accent); }
.bd-agenda-isi { list-style: none; margin: 0; padding: 0; flex: 1 1 auto; min-width: 0; }
.bd-agenda-isi li {
  display: flex; align-items: baseline; gap: 6px;
  font-size: .86rem; padding: 1px 0;
}
.bd-agenda-isi li > a,
.bd-agenda-isi li > span:not(.bd-agenda-titik):not(.muted) {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bd-agenda-titik {
  flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%;
  align-self: center;
}
.bd-agenda-jam { font-variant-numeric: tabular-nums; flex: 0 0 auto; font-size: .8rem; }


/* =====================================================================
   WORKGROUP - grup kerja

   Halaman daftar memakai tabel, halaman satu grup memakai kisi kotak.
   Bedanya disengaja: daftar dibaca untuk MEMBANDINGKAN grup (kolom
   membuat angka berbaris), halaman grup dibaca untuk MENGENALI satu
   grup (kotak memisahkan urusan yang berbeda).
   ===================================================================== */

.gr-bar .bar-isi { flex: 1 1 auto; }

.gr-bar .gr-jml {
  display: inline-block; margin-left: 5px; padding: 0 5px;
  border-radius: 8px; background: var(--surface-2); color: var(--muted);
  font-size: .72rem; font-variant-numeric: tabular-nums;
}
.btn-primary .gr-jml { background: rgba(255, 255, 255, .22); color: inherit; }

.gr-saring .gr-cari { flex: 1 1 260px; min-width: 200px; }
.gr-centang { flex-direction: row !important; align-items: center; gap: 6px !important; }
.gr-centang input { margin: 0; }

.gr-tabel .gr-id     { width: 56px; font-variant-numeric: tabular-nums; }
.gr-tabel .gr-tengah { text-align: center; font-variant-numeric: tabular-nums; }
.gr-nama { font-weight: 600; }
.gr-tutup td { opacity: .6; }
.gr-catatan { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--line-soft); }

.tag-mini { font-size: .62rem; padding: 0 4px; }
.gr-tag-proyek { color: var(--accent); }
.gr-tag-peran  { color: var(--ok); }

/* ---- kepala halaman satu grup ---- */

.gr-judul { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.gr-judul h2 { margin: 0; font-size: 1.2rem; }
.gr-ket { margin: 10px 0 0; font-size: .9rem; }

.gr-meta {
  display: flex; flex-wrap: wrap; gap: 6px 22px; margin: 12px 0 0;
}
.gr-meta > div { display: flex; flex-direction: column; gap: 1px; }
.gr-meta dt { font-size: .72rem; color: var(--muted); text-transform: uppercase;
              letter-spacing: .04em; }
.gr-meta dd { margin: 0; font-size: .86rem; }

.gr-kunci { margin: 10px 0 0; display: flex; flex-wrap: wrap; gap: 4px; }

.gr-rentang { margin-top: 14px; }
.gr-rentang-tgl {
  display: flex; justify-content: space-between; gap: 10px;
  font-size: .78rem; margin-bottom: 4px;
}
.tg-bilah-lewat i { background: var(--crit); }

/* ---- kisi kotak isi grup ----
   Dua kolom di layar lebar, satu di layar sempit. Kotak yang isinya
   panjang (tugas mendesak, anggota) tidak dipaksa setinggi tetangganya:
   grid baris otomatis membuat tiap baris setinggi kotak tertingginya,
   dan itu meninggalkan ruang kosong besar di bawah kotak yang pendek. */

.gr-kisi {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: 12px; align-items: start;
}

.gr-lanjut { margin: 10px 0 0; font-size: .84rem; }

.gr-anggota { display: flex; flex-direction: column; gap: 1px; max-height: 340px;
              overflow-y: auto; }
.gr-anggota-satu {
  display: flex; align-items: center; gap: 8px; padding: 5px 4px;
  border-radius: 3px; color: inherit; text-decoration: none;
}
.gr-anggota-satu:hover { background: var(--surface-2); }
.gr-anggota-mati { opacity: .55; }
.gr-anggota-teks { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.gr-anggota-teks strong { font-size: .86rem; font-weight: 600;
                          overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gr-anggota-teks small { font-size: .74rem;
                         overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gr-anggota-jml {
  flex: 0 0 auto; min-width: 20px; text-align: center; padding: 1px 5px;
  border-radius: 8px; background: var(--surface-2); color: var(--ink-soft);
  font-size: .74rem; font-variant-numeric: tabular-nums;
}

.gr-berkas, .gr-agenda, .gr-selesai, .gr-kegiatan {
  list-style: none; margin: 0; padding: 0;
}
.gr-berkas li, .gr-agenda li, .gr-selesai li {
  display: flex; flex-direction: column; gap: 1px; padding: 5px 0;
  font-size: .86rem;
}
.gr-berkas li + li, .gr-agenda li + li, .gr-selesai li + li {
  border-top: 1px solid var(--line-soft);
}
.gr-berkas li > a, .gr-agenda li > a, .gr-selesai li > a {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.gr-berkas small, .gr-agenda small, .gr-selesai small { font-size: .74rem; }

.gr-kegiatan li {
  display: flex; gap: 8px; padding: 4px 0; font-size: .84rem;
  align-items: baseline;
}
.gr-kegiatan li + li { border-top: 1px solid var(--line-soft); }
.gr-keg-waktu { flex: 0 0 84px; font-variant-numeric: tabular-nums; }

/* ---- lingkup grup di halaman Drive ---- */

.dr-lingkup {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding: 8px 10px; margin-bottom: 12px;
  border: 1px solid var(--line); border-left: 3px solid var(--accent);
  border-radius: 3px; background: var(--surface-2);
}
.dr-lingkup > .muted { flex: 1 1 240px; }

/* ---- kotak grup kerja di beranda ---- */

.bd-grup { list-style: none; margin: 0; padding: 0; }
.bd-grup li {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 6px 0; font-size: .88rem;
}
.bd-grup li + li { border-top: 1px solid var(--line-soft); }
.bd-grup li > a { font-weight: 600; }
.bd-grup-angka { margin-left: auto; display: flex; gap: 10px; align-items: baseline; }

/* ---- diskusi grup ---- */

.gr-diskusi-kotak { margin-bottom: 12px; }

.gr-diskusi { list-style: none; margin: 0 0 12px; padding: 0;
              max-height: 420px; overflow-y: auto; }
.gr-diskusi li { display: flex; gap: 9px; padding: 8px 0; }
.gr-diskusi li + li { border-top: 1px solid var(--line-soft); }
.gr-diskusi-isi { min-width: 0; flex: 1 1 auto; }
.gr-diskusi-kepala { display: flex; flex-wrap: wrap; align-items: baseline;
                     gap: 7px; margin-bottom: 2px; }
.gr-diskusi-kepala strong { font-size: .86rem; }
.gr-diskusi-teks { margin: 0; font-size: .88rem; line-height: 1.5; }
.gr-diskusi-saya .gr-diskusi-isi { background: var(--surface-2);
                                   border-radius: 4px; padding: 6px 9px; }

.gr-tulis { display: flex; flex-direction: column; gap: 7px; }
.gr-tulis textarea {
  width: 100%; resize: vertical; font: inherit; font-size: .9rem;
  padding: 8px 10px; border: 1px solid var(--line); border-radius: 4px;
  background: var(--surface); color: inherit;
}
.gr-tulis-kaki { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.gr-tulis-berkas { flex: 1 1 auto; font-size: .8rem; color: var(--muted); }
.gr-tulis-berkas input { font-size: .8rem; }

.bd-grup-baru {
  font-size: .76rem; padding: 1px 7px; border-radius: 9px;
  background: var(--accent); color: #fff; text-decoration: none;
  white-space: nowrap;
}
.bd-grup-baru:hover { opacity: .88; }

/* =====================================================================
   DRIVE NEXTCLOUD
   ===================================================================== */

.aw-bar .bar-isi { flex: 1 1 auto; }

.aw-remah {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px;
  margin: 0 0 12px; font-size: .9rem;
}
.aw-pisah { color: var(--muted); }

.aw-alat {
  display: flex; flex-wrap: wrap; gap: 18px; align-items: center;
  padding-bottom: 12px; margin-bottom: 12px;
  border-bottom: 1px solid var(--line-soft);
}
.aw-unggah, .aw-folder { display: flex; gap: 7px; align-items: center; flex-wrap: wrap; }
.aw-unggah input[type=file] { font-size: .8rem; max-width: 260px; }
.aw-folder input[type=text] {
  font: inherit; font-size: .85rem; padding: 5px 9px;
  border: 1px solid var(--line); border-radius: 3px;
  background: var(--surface); color: inherit; width: 170px;
}

.aw-tabel .aw-kanan { text-align: right; white-space: nowrap; }
.aw-ikon  { margin-right: 5px; }
.aw-nama  { word-break: break-all; }
.aw-ukuran { font-variant-numeric: tabular-nums; font-size: .84rem; }
.aw-catatan { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--line-soft); }

/* Daftar tindakan per baris - dibuka sendiri, supaya tombol Hapus
   tidak berjejer terus-menerus di tiap baris menunggu salah klik. */
.aw-menu { display: inline-block; position: relative; }
.aw-menu > summary { list-style: none; cursor: pointer; }
.aw-menu > summary::-webkit-details-marker { display: none; }
.aw-menu-isi {
  position: absolute; right: 0; top: 100%; z-index: 20;
  min-width: 220px; padding: 10px;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 4px; box-shadow: 0 6px 18px rgba(0,0,0,.22);
  display: flex; flex-direction: column; gap: 9px; text-align: left;
}
.aw-menu-isi form { display: flex; gap: 6px; align-items: center; }
.aw-menu-isi input[type=text] {
  font: inherit; font-size: .84rem; padding: 4px 7px; flex: 1 1 auto; min-width: 0;
  border: 1px solid var(--line); border-radius: 3px;
  background: var(--surface-2); color: inherit;
}
.btn-bahaya { color: var(--crit); border-color: var(--crit); }
.btn-bahaya:hover { background: var(--crit-w); }

.aw-langkah { margin: 12px 0; padding-left: 22px; font-size: .9rem; line-height: 1.7; }
.aw-langkah code {
  background: var(--surface-2); padding: 1px 5px; border-radius: 3px; font-size: .86rem;
}

.aw-sambung {
  display: flex; flex-direction: column; gap: 12px;
  max-width: 420px; margin: 16px 0;
}
.aw-sambung label { display: flex; flex-direction: column; gap: 4px; }
.aw-sambung label > span { font-size: .82rem; color: var(--muted); }
.aw-sambung input {
  font: inherit; padding: 8px 10px;
  border: 1px solid var(--line); border-radius: 4px;
  background: var(--surface); color: inherit;
}

/* =====================================================================
   SURAT MASUK DI BERANDA

   Judul memakai lebar sisa dan dipotong dengan elipsis, bukan
   dibungkus ke baris berikutnya: judul surat sering panjang sekali
   (rantai balasan "RE: RE: FW: ..."), dan satu judul yang memakan
   tiga baris mendorong empat surat lain keluar dari pandangan.
   ===================================================================== */

/* ---- kotak "Obrolan tugas" di beranda ----
   Tiga bagian per baris: judul, kalimat terakhir, lalu waktu dan jumlah.
   Kalimat terakhirlah yang membuat kotak ini layak dilihat tiap pagi -
   tanpa itu yang terbaca cuma daftar judul tugas, dan itu sudah ada di
   menu Tugas. */

.bd-obrolan { list-style: none; margin: 0; padding: 0; }
.bd-obrolan li {
  display: flex; align-items: baseline; gap: 9px;
  padding: 6px 0; font-size: .88rem; min-width: 0;
}
.bd-obrolan li + li { border-top: 1px solid var(--line-soft); }

.bd-obrolan-judul {
  flex: 0 1 auto; max-width: 46%; font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bd-obrolan-kata {
  flex: 1 1 auto; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bd-obrolan-angka {
  flex: 0 0 auto; display: flex; align-items: baseline; gap: 8px;
  white-space: nowrap;
}

@media (max-width: 700px) {
  /* Di layar sempit judul dan kalimatnya bertumpuk, bukan berdesakan
     sampai keduanya tinggal beberapa huruf. */
  .bd-obrolan li { flex-wrap: wrap; }
  .bd-obrolan-judul { max-width: 100%; flex: 1 1 100%; }
}

.bd-surat { list-style: none; margin: 0; padding: 0; }
.bd-surat li {
  display: flex; align-items: baseline; gap: 10px;
  padding: 6px 0; font-size: .88rem; min-width: 0;
}
.bd-surat li + li { border-top: 1px solid var(--line-soft); }

.bd-surat-judul {
  flex: 1 1 auto; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bd-surat-dari {
  flex: 0 1 auto; max-width: 34%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--muted); font-size: .82rem;
}
.bd-surat-jam { flex: 0 0 auto; white-space: nowrap; }

/* Yang belum dibaca ditebalkan DAN diberi garis di tepi kiri. Tebal
   saja tidak terbaca oleh orang yang tidak bisa membedakan berat
   huruf pada layar kecil; garisnya yang menjawab "mana yang baru"
   dari jarak sekilas. */
.bd-surat-belum .bd-surat-judul { font-weight: 600; }
.bd-surat-belum {
  border-left: 2px solid var(--accent);
  margin-left: -8px; padding-left: 6px;
}

.bd-surat-galat { color: var(--crit); }

/* =====================================================================
   PEMISAH KOLOM YANG BISA DIGESER  (Pesan + Obrolan tugas)

   Kelas .chat-bisa-geser dipasang JS bersamaan dengan pegangannya.
   Tanpa JS, kelas ini tidak pernah ada dan tata letaknya tetap dua
   kolom seperti semula - tidak ada kolom ketiga kosong yang membuat
   panel kanan melompat ke tempat pegangan.
   ===================================================================== */

.chat.chat-bisa-geser {
  grid-template-columns: var(--chat-kiri, 300px) 8px minmax(0, 1fr);
  gap: 6px;
}

/* Mode layar penuh menempelkan kedua panel ke tepi jendela dengan
   gap 0. Aturan itu ditulis ulang di sini karena kekhususannya sama
   dengan aturan di atas - yang menang cuma yang belakangan. */
body.chat-penuh .chat.chat-bisa-geser { gap: 0; }

.chat-pemisah {
  align-self: stretch;
  cursor: col-resize;
  border-radius: 4px;
  background: transparent;
  position: relative;
  touch-action: none;      /* tanpa ini, layar sentuh menggulir halaman
                              alih-alih menggeser pemisahnya */
}

/* Garis pegangan digambar di tengah, tidak memenuhi seluruh lebar
   elemen: bidang tangkapnya perlu lebar supaya mudah dikenai, tetapi
   yang terlihat harus tipis supaya tidak menjadi garis tebal yang
   membelah halaman. */
.chat-pemisah::before {
  content: "";
  position: absolute; top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 3px; height: 34px; border-radius: 3px;
  background: var(--line);
  transition: background .12s, height .12s;
}
.chat-pemisah:hover::before,
.chat-pemisah:focus-visible::before { background: var(--accent); height: 60px; }
.chat-pemisah:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }

/* Selama menggeser, seluruh halaman memakai kursor col-resize dan
   berhenti memilih teks. Tanpa ini, tarikan yang melewati daftar
   percakapan akan menyorot judul-judulnya seperti menyeret teks. */
body.sedang-geser { user-select: none; cursor: col-resize; }
body.sedang-geser .chat-pemisah::before { background: var(--accent); height: 60px; }

@media (max-width: 1000px) {
  /* Di bawah 1000px kedua panel bertumpuk atas-bawah, jadi tidak ada
     batas kiri-kanan untuk digeser. Pegangannya disembunyikan, dan
     lebar tersimpan diabaikan - bukan dihapus, supaya kembali utuh
     saat dibuka lagi di layar lebar. */
  .chat.chat-bisa-geser { grid-template-columns: 1fr; gap: 14px; }
  .chat-pemisah { display: none; }
}

/* =====================================================================
   BATANG GULUNG: SATU DI KIRI, SATU DI KANAN

   Sebelumnya keduanya berada di sisi kanan panelnya masing-masing -
   artinya batang gulung daftar kiri berdiri tepat di sebelah pemisah
   yang baru bisa ditarik. Dua benda tipis bersebelahan yang keduanya
   diseret dengan tetikus, dan keduanya mengerjakan hal yang berbeda:
   yang satu menggulir, yang lain melebarkan kolom. Salah pegang di
   situ bukan kemungkinan, melainkan kepastian.

   Maka batang gulung daftar kiri dipindah ke TEPI KIRI layar, dan
   batang gulung percakapan tetap di tepi kanan. Keduanya kini berada
   di ujung terluar, dan yang ada di antara kedua panel hanya satu
   benda: pemisahnya.

   Caranya lewat direction: rtl pada wadah yang menggulir - satu-satunya
   cara yang dikenal semua peramban untuk memindahkan batang gulung.
   Isinya dikembalikan ke ltr supaya teksnya tetap rata kiri seperti
   biasa; tanpa itu, angka dan tanda baca di ujung kalimat akan
   melompat ke sisi yang salah.
   ===================================================================== */

.chat-daftar .chat-list { direction: rtl; }
.chat-daftar .chat-list > li { direction: ltr; }

/* Batang gulung dibuat cukup terlihat untuk dipegang, tanpa menjadi
   pita tebal. Bawaan Chromium pada tema gelap nyaris tidak terlihat -
   dan batang gulung yang tidak terlihat membuat orang menyangka
   daftarnya memang hanya sepanjang itu. */
/* HANYA scrollbar-color, TANPA scrollbar-width: thin.
   Yang diminta adalah letaknya, bukan ketebalannya - dan batang gulung
   yang dikuruskan justru lebih sulit dipegang. Yang diperbaiki di sini
   cuma kontrasnya pada tema gelap.

   Peramban yang mengenal scrollbar-color akan MENGABAIKAN aturan
   ::-webkit-scrollbar di bawah; itu memang perilakunya, dan aturan itu
   sengaja tetap ada sebagai cadangan untuk peramban lama. */
.chat-daftar .chat-list,
.chat-pesan { scrollbar-color: var(--line) transparent; }

.chat-daftar .chat-list::-webkit-scrollbar,
.chat-pesan::-webkit-scrollbar { width: 10px; }

.chat-daftar .chat-list::-webkit-scrollbar-track,
.chat-pesan::-webkit-scrollbar-track { background: transparent; }

.chat-daftar .chat-list::-webkit-scrollbar-thumb,
.chat-pesan::-webkit-scrollbar-thumb {
  background: var(--line);
  border-radius: 6px;
  border: 2px solid transparent;
  background-clip: content-box;
}
.chat-daftar .chat-list::-webkit-scrollbar-thumb:hover,
.chat-pesan::-webkit-scrollbar-thumb:hover { background: var(--muted); background-clip: content-box; }

/* =====================================================================
   FEED

   Satu aliran, lima jenis butir. Yang membedakan jenisnya hanya label
   kecil dan warna garis kiri - bukan bentuk kartu yang berbeda-beda.
   Aliran yang tiap barisnya berbeda rupa tidak terbaca sebagai aliran,
   melainkan sebagai tumpukan kotak.
   ===================================================================== */

.fd-bar {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-bottom: 10px;
}
.fd-cari { display: flex; gap: 7px; align-items: center; flex: 1 1 auto; }
.fd-cari input {
  flex: 0 1 340px; font: inherit; font-size: .88rem; padding: 7px 10px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface); color: inherit;
}

.fd-saring {
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  margin-bottom: 14px;
}
.fd-tag {
  font-size: .78rem; padding: 3px 10px; border-radius: 12px;
  border: 1px solid var(--line); color: var(--muted);
  text-decoration: none; white-space: nowrap;
}
.fd-tag:hover { border-color: var(--accent); color: var(--ink); }
.fd-tag-nyala {
  background: var(--accent-w); border-color: var(--accent); color: var(--accent-2);
  font-weight: 600;
}
/* Yang terakhir menyala tidak bisa dimatikan - dan itu harus terlihat,
   bukan baru terasa setelah diklik tanpa hasil. */
.fd-tag-mati { opacity: .65; cursor: default; }

.fd-list { list-style: none; margin: 0; padding: 0; }

.fd-butir {
  display: flex; gap: 11px;
  padding: 12px 14px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-left: 3px solid var(--line);
  border-radius: var(--radius);
  margin-bottom: 9px;
}
.fd-butir-pos       { border-left-color: var(--accent); }
.fd-butir-laporan   { border-left-color: var(--ok); }
.fd-butir-absen     { border-left-color: var(--line); }
.fd-butir-tugas     { border-left-color: var(--warn); }
.fd-butir-pengajuan { border-left-color: var(--accent-2); }

.fd-isi { flex: 1 1 auto; min-width: 0; }

.fd-kepala {
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
  margin-bottom: 3px;
}
.fd-kepala > strong { font-size: .89rem; }

.fd-jenis {
  font-size: .7rem; text-transform: uppercase; letter-spacing: .04em;
  padding: 1px 7px; border-radius: 9px;
  background: var(--surface-2); color: var(--muted);
}
.fd-pos  { background: var(--accent-w); color: var(--accent-2); }
.fd-lap  { background: var(--ok-w);     color: var(--ok); }
.fd-tgs  { background: var(--warn-w);   color: var(--warn); }
.fd-auto { background: var(--accent-w); color: var(--accent-2); }

.fd-judul { margin: 2px 0; font-size: .93rem; font-weight: 600; line-height: 1.45; }
.fd-judul a { text-decoration: none; }
.fd-judul a:hover { text-decoration: underline; }

.fd-teks { margin: 2px 0 0; font-size: .87rem; line-height: 1.55; color: var(--ink-soft); }
.fd-kaki { margin: 6px 0 0; font-size: .82rem; }

.fd-berkas { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 8px; }
.fd-berkas > a,
.fd-berkas > span {
  display: inline-flex; align-items: baseline; gap: 6px;
  font-size: .8rem; padding: 3px 9px; border-radius: 4px;
  background: var(--surface-2); color: var(--ink-soft); text-decoration: none;
  max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fd-berkas > a:hover { background: var(--surface-3); color: var(--ink); }
.fd-berkas small { color: var(--muted); }
.fd-berkas-besar img { max-width: 240px; max-height: 180px; border-radius: var(--radius); display: block; }

.fd-halaman { display: flex; align-items: center; gap: 9px; margin: 16px 0 4px; }

/* ---- satu pos ---- */
.fd-pos-kepala { display: flex; align-items: center; gap: 11px; flex-wrap: wrap; margin-bottom: 12px; }
.fd-pos-kepala > div { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.fd-pos-judul { margin: 0 0 10px; font-size: 1.05rem; line-height: 1.4; }
.fd-pos-isi { font-size: .92rem; line-height: 1.65; }
.fd-sub { margin: 16px 0 7px; font-size: .86rem; color: var(--muted); font-weight: 600; }
.fd-sasaran { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--line-soft); }

/* ---- tulis pos ---- */
.fd-tulis { display: flex; flex-direction: column; gap: 12px; }
.fd-sasaran-pilih { border: 1px solid var(--line); border-radius: var(--radius); padding: 12px 14px; }
.fd-sasaran-pilih > legend { padding: 0 6px; font-size: .85rem; font-weight: 600; }
.fd-kolom { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }
.fd-semua { display: flex; align-items: center; gap: 8px; font-size: .89rem; margin: 8px 0; }
.fd-tulis-kaki { display: flex; gap: 9px; align-items: center; }

@media (max-width: 700px) {
  .fd-berkas > a, .fd-berkas > span { max-width: 100%; }
  .fd-kolom { grid-template-columns: 1fr; }
}

/* ==================================================================
   Rapat daring (Pesan -> Daring)
   ------------------------------------------------------------------
   Seluruh warna memakai token portal (--surface, --line, --accent
   dan seterusnya), tidak satu pun angka warna ditulis langsung. Itu
   yang membuat modul ini ikut tema gelap dengan benar tanpa satu
   baris tambahan: yang berganti nilainya token-nya, bukan aturan
   di sini.
   ================================================================== */

/* ---------------- pemilih orang yang diketik ---------------- */

.po { display: block; position: relative; }
.po-data { display: none; }

.po-kotak {
  display: flex; flex-wrap: wrap; align-items: center; gap: 5px;
  min-height: 34px; padding: 4px 6px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface); cursor: text;
}
.po-kotak:focus-within { border-color: var(--accent); }

.po-kepingan {
  display: flex; flex-wrap: wrap; align-items: center; gap: 5px;
  flex: 0 1 auto; min-width: 0;
}

.po-keping {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 2px 4px 2px 8px; font-size: .8rem;
  border: 1px solid var(--accent); border-radius: 999px;
  background: var(--accent-w); color: var(--accent-2);
  max-width: 100%;
}
.po-keping > span:first-child {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.po-buang {
  border: 0; background: none; cursor: pointer; line-height: 1;
  font-size: 1rem; padding: 0 2px; color: var(--accent-2); opacity: .75;
}
.po-buang:hover { opacity: 1; }

.po-medan {
  flex: 1 1 120px; min-width: 90px;
  border: 0; outline: 0; background: none; color: inherit;
  font: inherit; font-size: .87rem; padding: 3px 2px;
}

/* Daftar saran menggantung dari .po (position:relative di atas) supaya
   ia tetap tepat di bawah kotaknya walau kotaknya sudah dua baris. */
.po-daftar {
  /* Melayang terhadap LAYAR, bukan terhadap panelnya - panel portal
     memakai overflow:hidden dan akan memotongnya ke arah mana pun ia
     digantungkan, ke bawah maupun ke atas. Letak dan tingginya
     dihitung arahkan() di app.js dari posisi kotak isiannya.

     .po-atas tidak ada lagi: membalik arah adalah jawaban untuk daftar
     yang TERIKAT pada panelnya, dan daftar ini tidak lagi terikat. */
  position: fixed; z-index: 120;
  margin: 0; padding: 4px; list-style: none;
  max-height: 232px; overflow-y: auto;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface); color: var(--ink);
  box-shadow: var(--shadow);
}

.po-saran {
  padding: 6px 9px; font-size: .87rem; border-radius: 3px; cursor: pointer;
}
.po-saran:hover, .po-saran.aktif { background: var(--accent-w); color: var(--accent-2); }

.po-bantu kbd {
  font: inherit; font-size: .78rem; padding: 1px 5px;
  border: 1px solid var(--line); border-radius: 3px; background: var(--surface-2);
}

/* ---------------- daftar ruang ---------------- */

.rp-baru { align-items: flex-end; flex-wrap: wrap; gap: 12px; }
.rp-baru label, .rp-baru .rp-orang { display: flex; flex-direction: column; gap: 4px; }
.rp-baru label > span, .rp-orang > span { font-size: .82rem; color: var(--muted); }
.rp-judul { flex: 1 1 220px; min-width: 180px; }
.rp-judul input { width: 100%; }
.rp-orang { flex: 2 1 320px; min-width: 220px; }

/* Tamu dari luar di formulir buat rapat.
   ----------------------------------------------------------------------
   flex-basis 100% supaya ia mengambil BARIS SENDIRI di bawah judul,
   peserta, dan tombolnya - bukan menyempil sebagai kolom keempat yang
   kotaknya tinggal selebar dua jari. */
.rp-tamu-baru { flex: 1 1 100%; margin-top: 2px; }
.rp-tamu-baru > summary {
  cursor: pointer; font-size: .82rem; color: var(--muted);
  padding: 4px 0; user-select: none;
}
.rp-tamu-baru > summary:hover { color: var(--text); }
.rp-tamu-isi { padding: 6px 0 2px; }
.rp-tamu-isi textarea {
  width: 100%; min-height: 64px; resize: vertical;
  font-family: inherit; font-size: .9rem;
}

.rp-tabel .rp-nama { font-weight: 500; }
.rp-tengah { text-align: center; }
.rp-aksi, .rp-aksi-th { text-align: right; white-space: nowrap; }
.rp-aksi > * { vertical-align: middle; }
.rp-tutup-form { display: inline; }

.rp-tag-jalan { border-color: var(--ok); color: var(--ok); background: var(--ok-w); }

/* Kolom peserta yang bisa dibuka. Penanda bawaan <details> dibuang dan
   diganti angka yang terlihat seperti tautan - yang dicari orang di
   kolom ini "berapa", dan "siapa" hanya satu klik di belakangnya. */
.rp-peserta-buka > summary {
  cursor: pointer; list-style: none; display: inline-block;
  border-bottom: 1px dotted var(--line);
}
.rp-peserta-buka > summary::-webkit-details-marker { display: none; }
.rp-peserta-buka[open] > summary { border-bottom-color: var(--accent); }
.rp-peserta-isi {
  margin-top: 5px; text-align: left; font-size: .82rem; line-height: 1.5;
  max-width: 260px; white-space: normal;
}
.rp-peserta-cap {
  display: block; font-size: .74rem; text-transform: uppercase;
  letter-spacing: .04em; color: var(--muted);
}

/* ---------------- satu ruang rapat ---------------- */

.rp-kepala { flex-wrap: wrap; gap: 8px; }
.rp-kepala-judul { font-size: .98rem; }
.rp-catatan-hak { white-space: normal; }

/* Panggung bingkai Jitsi. Tingginya dipatok pada tinggi layar, bukan
   pada isinya: bingkai video tanpa tinggi pasti akan runtuh menjadi
   nol - iframe tidak punya ukuran alami. */
.rp-panggung {
  position: relative;
  height: calc(100vh - var(--topbar-tinggi) - var(--subnav-tinggi) - 150px);
  min-height: 380px;
  margin: 12px 0;
  border: 1px solid var(--line); border-radius: var(--radius);
  overflow: hidden; background: var(--surface-3);
}
.rp-panggung iframe { display: block; width: 100%; height: 100%; border: 0; }
.rp-panggung:fullscreen { height: 100%; min-height: 0; border: 0; border-radius: 0; }

/* pointer-events: none - penahan, bukan kosmetik.
   ----------------------------------------------------------------------
   Lapisan ini menutupi seluruh panggung, tepat di atas bingkai Jitsi.
   Selama ia ada, setiap klik mendarat di sini dan bukan di bingkainya.

   Di halaman karyawan hal itu tidak pernah terasa karena layar pratinjau
   dimatikan - rapat tersambung sendiri, peristiwanya datang, lapisannya
   dibuang. Di halaman tamu pratinjaunya menyala, dan akibatnya terlihat
   pada 15 September 2026: tombol "Join meeting" tidak bisa ditekan sama
   sekali, sebab lapisan yang menunggu sambungan justru menghalangi klik
   yang akan menyambungkannya.

   Baris ini ada supaya kebuntuan yang sama tidak lahir lagi di sini pada
   hari seseorang menyalakan pratinjau untuk karyawan juga. */
.rp-tunggu {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  padding: 24px; text-align: center; font-size: .9rem; color: var(--muted);
  pointer-events: none;
}
/* Isinya tetap bisa ditekan - layar galat memuat tautan dan kode yang
   perlu bisa disalin. */
.rp-tunggu > div { pointer-events: auto; }
.rp-tunggu.rp-gagal { color: var(--ink-soft); }
.rp-tunggu.rp-gagal strong { color: var(--crit); }
.rp-tunggu code {
  background: var(--surface-2); padding: 1px 5px; border-radius: 3px;
  font-size: .86rem;
}
.rp-tunggu > div { max-width: 460px; line-height: 1.6; }

.rp-tabel-peserta td:first-child { display: flex; align-items: center; gap: 8px; }
/* Nama peserta jadi dua baris: namanya, lalu siapa yang mengundangnya.
   Sel-nya sendiri tetap baris mendatar (avatar + nama), jadi kolomnya
   dipasang di dalam span, bukan di sel. */
.rp-peserta-nama { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.rp-peserta-oleh { font-size: .74rem; line-height: 1.25; }

.rp-undang {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px;
  margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--line-soft);
}
.rp-undang > p { flex: 1 1 100%; margin: 0; }

/* ---------------- kotak panggilan melayang ---------------- */

/* Di atas dok pesan, bukan di sebelahnya: keduanya di sudut yang sama,
   dan panggilan rapat lebih menuntut waktu daripada pesan masuk. */
.rp-panggilan {
  position: fixed; right: 18px; bottom: 84px; z-index: 60;
  display: flex; flex-direction: column-reverse; gap: 10px;
  max-width: 320px;
}
.rp-panggilan:empty { display: none; }

.rp-panggil {
  border: 1px solid var(--accent); border-left-width: 3px;
  border-radius: var(--radius);
  background: var(--surface); box-shadow: var(--shadow);
  padding: 11px 13px; font-size: .87rem;
}
.rp-panggil-kepala {
  display: flex; align-items: center; gap: 7px;
  font-size: .74rem; text-transform: uppercase; letter-spacing: .04em;
  color: var(--accent-2); margin-bottom: 4px;
}
.rp-panggil-judul { display: block; font-weight: 600; line-height: 1.35; }
.rp-panggil-oleh { display: block; color: var(--muted); font-size: .82rem; margin-top: 1px; }
.rp-panggil-aksi { display: flex; gap: 7px; margin-top: 10px; }

/* Yang sudah berakhir kehilangan warna aksennya - kotak yang tidak lagi
   menuntut apa pun tidak pantas berteriak sekeras yang menuntut. */
.rp-panggil-selesai { border-color: var(--line); }
.rp-panggil-selesai .rp-panggil-kepala { color: var(--muted); }
.rp-panggil-selesai .rp-ikon-telp { animation: none; opacity: .5; }

.rp-btn-masuk { display: inline-flex; align-items: center; gap: 6px; }

/* Gagang telepon bergoyang. Animasinya CSS, bukan JavaScript, supaya
   setelan "kurangi gerakan" milik sistem operasi dihormati - lihat
   @media di bawah. */
.rp-ikon-telp {
  width: 15px; height: 15px; flex: none;
  transform-origin: 50% 60%;
  animation: rp-goyang 1.6s ease-in-out infinite;
}
@keyframes rp-goyang {
  0%, 62%, 100% { transform: rotate(0deg); }
  68%  { transform: rotate(-14deg); }
  74%  { transform: rotate(12deg); }
  80%  { transform: rotate(-9deg); }
  86%  { transform: rotate(6deg); }
  92%  { transform: rotate(-3deg); }
}
@media (prefers-reduced-motion: reduce) {
  .rp-ikon-telp { animation: none; }
}

@media (max-width: 640px) {
  .rp-panggilan { right: 10px; left: 10px; bottom: 78px; max-width: none; }
  .rp-panggung { height: 62vh; }
}

/* ------------------------------------------------------------------
   Kaitan Google Calendar (kal_google.php)
   ------------------------------------------------------------------ */

.kal-kanan { margin-left: auto; display: inline-flex; gap: 8px; align-items: center; }

.kal-g-catatan { margin-top: 12px; }

.kal-g-label {
  display: block; margin: 18px 0 6px;
  font-size: .8rem; font-weight: 600; color: var(--muted);
  text-transform: uppercase; letter-spacing: .04em;
}

.kal-g-alamat { display: flex; gap: 8px; align-items: stretch; }

/* Alamatnya panjang dan HARUS bisa dipilih seluruhnya sekali klik,
   jadi ia sebuah input - bukan <code> yang teksnya terpotong di ujung
   dan menyisakan setengah token saat orang menyalinnya dengan tangan. */
.kal-g-alamat input {
  flex: 1 1 auto; min-width: 0;
  font-size: .82rem; padding: 9px 11px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface-2); color: var(--ink);
}
.kal-g-alamat input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.kal-g-alamat .btn { flex: 0 0 auto; }

.kal-g-rahasia { margin-bottom: 4px; }
.kal-g-rahasia em { display: block; margin: 6px 0; font-style: normal; font-weight: 600; }

.kal-g-dalam { margin-top: 14px; }

.kal-g-judul { margin: 26px 0 10px; font-size: .95rem; }

.kal-g-langkah { margin: 0 0 18px; padding-left: 22px; line-height: 1.75; }
.kal-g-langkah li { margin-bottom: 5px; }
.kal-g-langkah .muted { display: block; font-size: .84rem; }

.kal-g-sabar { margin-bottom: 20px; }

.kal-g-fakta { margin-bottom: 16px; }

.kal-g-aksi { gap: 10px; flex-wrap: wrap; }

@media (max-width: 640px) {
  .kal-kanan { margin-left: 0; width: 100%; }
  .kal-g-alamat { flex-direction: column; }
  .kal-g-alamat .btn { align-self: flex-start; }
}

/* ------------------------------------------------------------------
   Data diri dari HRIS (employee_detail.php)

   Hanya tergambar di halaman milik orang itu sendiri - lihat penjaga
   di Hris::bolehLihatDiri(). Bagian ini memuat nomor identitas,
   alamat rumah, keluarga, dan nomor rekening, jadi ia sengaja diberi
   garis tepi yang berbeda: orang harus SADAR sedang melihat sesuatu
   yang tidak biasa, bukan mengira ini bagian profil yang umum.
   ------------------------------------------------------------------ */

.hris-diri { margin-top: 18px; border-left: 3px solid var(--accent); }

.hris-catatan { margin: 0 0 16px; line-height: 1.65; }
.hris-kaki    { margin: 18px 0 0; padding-top: 12px; border-top: 1px solid var(--line-soft); }

.hris-blok { margin-bottom: 18px; }
.hris-blok:last-of-type { margin-bottom: 0; }
.hris-blok h3 {
  margin: 0 0 8px; font-size: .8rem; font-weight: 600;
  color: var(--muted); text-transform: uppercase; letter-spacing: .05em;
}

/* Dua kolom di layar lebar, satu di ponsel. Nilai seperti alamat dan
   nomor rekening panjang, jadi ia boleh membungkus - tanpa ini nomor
   rekening mendorong seluruh kotak melebar dan halaman ikut bergeser. */
.hris-blok .detail dd { word-break: break-word; }

@media (min-width: 720px) {
  .hris-diri .hris-blok .detail {
    display: grid; grid-template-columns: minmax(150px, auto) 1fr;
    column-gap: 18px;
  }
}

/* ------------------------------------------------------------------
   Butir kalender yang diredupkan

   Sejauh ini hanya cuti panjang. Lima cuti melahirkan - 61 sampai 92
   hari - menghasilkan 397 kotak hari, lebih banyak daripada 253
   pengajuan lain digabung. Butirnya benar dan tetap digambar tiap
   hari; yang salah adalah ia duduk di baris teratas dan mendorong
   rapat pukul 14:00 ke bawah "+3 lagi".

   Diredupkan, BUKAN disembunyikan. Orang yang mencari "siapa tidak
   masuk hari ini" tetap menemukannya; orang yang mencari "rapat apa
   hari ini" tidak lagi harus melewatinya lebih dulu.
   ------------------------------------------------------------------ */

.kal-redup { opacity: .55; }
.kal-redup:hover { opacity: 1; }

/* Garis tepinya ikut menipis supaya deretan cuti panjang tidak
   membentuk pita warna yang justru menarik mata lebih dulu. */
.kal-butir.kal-redup { border-left-style: dotted; }

@media (prefers-contrast: more) {
  .kal-redup { opacity: .8; }
}

/* ==================================================================
   Bantuan AI

   Kotak hasilnya sengaja TIDAK menyerupai isi halaman. Ia berbingkai
   putus-putus dan berlatar beda supaya tidak ada yang salah mengira
   kalimat buatan mesin adalah tulisannya sendiri yang sudah
   tersimpan - terutama sesudah menggulir ke bawah dan kembali lagi.
   ================================================================== */

.ai-aksi { display: flex; gap: .4rem; align-items: center; flex-wrap: wrap;
           margin: .35rem 0 0; }

.ai-kotak { margin: .5rem 0 .25rem; padding: .6rem .7rem;
            background: var(--surface-2); border: 1px dashed var(--line);
            border-radius: var(--radius); }

.ai-hasil { white-space: pre-wrap; line-height: 1.55; }

.ai-pesan { margin: 0; color: var(--muted); font-size: .92em; }
.ai-pesan.ai-warn { color: var(--warn); }
.ai-pesan.ai-tunggu::after {
  content: ''; display: inline-block; width: .6em; text-align: left;
  animation: ai-titik 1.2s steps(4, end) infinite;
}
@keyframes ai-titik {
  0%   { content: ''; }
  25%  { content: '.'; }
  50%  { content: '..'; }
  75%  { content: '...'; }
}

.ai-bar { display: flex; gap: .4rem; align-items: center; flex-wrap: wrap;
          margin-top: .55rem; }
.ai-ket { margin-left: auto; }

@media (max-width: 640px) {
  .ai-ket { margin-left: 0; flex-basis: 100%; }
}

@media (prefers-reduced-motion: reduce) {
  .ai-pesan.ai-tunggu::after { animation: none; content: '…'; }
}

/* ==================================================================
   Kotak obrolan AI

   Gelembung AI dan gelembung orangnya dibedakan warna DAN sisi, bukan
   warna saja. Satu pembeda tidak cukup: layar yang disetel kontras
   rendah dan mata yang tidak membedakan warna sama-sama membuat
   percakapan berubah jadi satu blok teks tanpa pemilik.
   ================================================================== */

/* Lebar kolom daftar disimpan di --aio-sisi oleh app.js, dengan 230px
   sebagai lebar bawaan bila belum pernah digeser. Kolom tengah 6px
   adalah pemisah yang bisa ditarik. */
/* align-items: start supaya kolom daftar HANYA setinggi isinya.
   Bawaan grid adalah stretch, dan itu meregangkan kolom kiri setinggi
   kotak percakapan - meninggalkan bidang kosong sepanjang setengah
   layar di bawah daftar yang isinya cuma sembilan baris. */
.aio { display: grid; grid-template-columns: var(--aio-sisi, 230px) 6px 1fr;
       gap: .5rem; margin-bottom: 1rem; align-items: start; }

.aio-geser { cursor: col-resize; border-radius: 3px; align-self: stretch;
             background: var(--line-soft); }
.aio-geser:hover, .aio-geser:focus-visible { background: var(--accent); outline: none; }
.aio-geser.aio-sedang { background: var(--accent); }
body.aio-menggeser { cursor: col-resize; user-select: none; }

/* Dua tab bersebelahan, selalu keduanya. Yang sedang dibuka diberi
   latar penuh - pembeda yang terbaca tanpa warna sekalipun, sebab
   ketebalan huruf dan latar bekerja juga pada layar kontras rendah. */
.aio-tab { display: flex; gap: 2px; background: var(--surface-2);
           border: 1px solid var(--line); border-radius: var(--radius);
           padding: 2px; }

.aio-tab-btn { flex: 1; text-align: center; padding: .3rem .2rem;
               font-size: .88em; color: var(--muted); text-decoration: none;
               border-radius: calc(var(--radius) - 2px); white-space: nowrap; }
.aio-tab-btn:hover { color: var(--ink); background: var(--surface); }
.aio-tab-kini { background: var(--surface); color: var(--ink); font-weight: 600; }

.aio-petunjuk { margin-bottom: .2rem; }

/* Titik-tiga yang dikutip di dalam kalimat petunjuk. Dibuat menyerupai
   tombolnya supaya orang mencari bentuk yang sama, bukan menebak. */
.aio-contoh { display: inline-block; border: 1px solid var(--line);
              border-radius: var(--radius); padding: 0 .3rem;
              background: var(--surface-2); color: var(--ink);
              line-height: 1.4; }

/* Menu titik-tiga pada setiap baris percakapan. */
.aio-alat { position: relative; flex: 0 0 auto; }

.aio-titik { background: none; border: 0; color: var(--muted); cursor: pointer;
             font-size: 1.1em; line-height: 1; padding: .2rem .35rem;
             border-radius: var(--radius); opacity: 0; }
.aio-baris:hover .aio-titik,
.aio-titik:focus-visible,
.aio-titik[aria-expanded="true"] { opacity: 1; }
.aio-titik:hover { background: var(--surface); color: var(--ink); }

.aio-menu { position: absolute; right: 0; top: 100%; z-index: 30; min-width: 172px;
            background: var(--ground); border: 1px solid var(--line);
            border-radius: var(--radius); box-shadow: var(--shadow);
            padding: .25rem; }
.aio-menu form { margin: 0; }
.aio-menu button { display: block; width: 100%; text-align: left; background: none;
                   border: 0; color: var(--ink); cursor: pointer;
                   padding: .4rem .55rem; border-radius: var(--radius);
                   font-size: .92em; }
.aio-menu button:hover { background: var(--surface-2); }
.aio-menu-hapus { color: var(--crit); }
.aio-menu-hapus:hover { background: var(--crit-w); }

.aio-sisi { display: flex; flex-direction: column; gap: .5rem; min-width: 0; }
.aio-baru { text-align: center; }

/* Tingginya mengikuti layar, bukan angka tetap. 320px menyisakan
   ruang kosong pada layar tinggi sementara daftarnya sendiri sudah
   bergulir - dua kerugian sekaligus. 46vh kira-kira sepadan dengan
   tinggi kotak percakapan di sebelahnya, jadi kedua kolom berakhir
   pada garis yang mirip. */
.aio-daftar { list-style: none; margin: 0; padding: 0;
              max-height: 46vh; overflow-y: auto; }

.aio-baris { display: flex; align-items: center; gap: .25rem;
             border-radius: var(--radius); }
.aio-baris > a { flex: 1; min-width: 0; padding: .35rem .5rem;
                 color: var(--ink-soft); text-decoration: none;
                 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.aio-baris:hover { background: var(--surface-2); }
.aio-aktif { background: var(--surface-3); }
.aio-aktif > a { color: var(--ink); font-weight: 600; }

.aio-utama { display: flex; flex-direction: column; min-width: 0; }

.aio-gulung { background: var(--ground); border: 1px solid var(--line);
              border-radius: var(--radius); padding: .8rem;
              height: 52vh; min-height: 280px; overflow-y: auto; }

.aio-kosong h3 { margin-top: 0; }
.aio-kosong ul { padding-left: 1.1rem; }

.aio-giliran { margin-bottom: .7rem; display: flex; }
.aio-saya { justify-content: flex-end; }
.aio-ai   { justify-content: flex-start; }

.aio-isi { max-width: 85%; padding: .5rem .7rem; border-radius: var(--radius);
           white-space: pre-wrap; line-height: 1.55; overflow-wrap: anywhere; }

.aio-saya .aio-isi { background: var(--accent); color: #fff;
                     border-bottom-right-radius: 3px; }
.aio-ai   .aio-isi { background: var(--surface-2); border: 1px solid var(--line-soft);
                     border-bottom-left-radius: 3px; }

.aio-tunggu .aio-isi { color: var(--muted); font-style: italic; }
.aio-galat  .aio-isi { border-color: var(--warn-w); color: var(--warn); }
.aio-pintas .aio-isi { border-left: 3px solid var(--accent-2); }

.aio-giliran { flex-wrap: wrap; }
.aio-tanda { flex-basis: 100%; margin-top: .2rem; }

.aio-tulis { display: flex; gap: .5rem; align-items: flex-end; margin-top: .6rem; }
.aio-tulis textarea { flex: 1; resize: none; min-height: 2.6rem; }

.aio-ingat { margin-top: .4rem; }

@media (max-width: 760px) {
  /* Satu kolom di layar sempit - pemisahnya disembunyikan, sebab tidak
     ada yang bisa digeser lagi. Tombol titik-tiga dibuat selalu tampak:
     di layar sentuh tidak ada "hover" yang memunculkannya. */
  .aio { grid-template-columns: 1fr; }
  .aio-geser { display: none; }
  .aio-daftar { max-height: 150px; }
  .aio-gulung { height: 44vh; }
  .aio-isi { max-width: 92%; }
  .aio-titik { opacity: 1; }
}

/* =====================================================================
   Tentang Perusahaan - company profile di dalam bingkai
   =====================================================================
   Bingkai dipakai supaya CSS profil tidak bercampur dengan app.css ini.
   Keduanya memakai nama yang sama untuk hal yang berbeda - .btn, .card,
   .grid, .muted, --ink, --line, --radius, dan sederet pemilih polos
   seperti body dan p - jadi memuat keduanya di satu dokumen akan
   mengubah tampilan SELURUH portal. Lihat TentangController.
   ================================================================== */
.tentang-panel { display: flex; flex-direction: column; }

.tentang-bilah {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-bottom: 10px; min-height: 30px;
}
.tentang-kendali { display: flex; align-items: center; gap: 2px; }
.tentang-pisah {
  width: 1px; height: 18px; background: var(--line); margin: 0 6px;
}

.tentang-tbl {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 28px; padding: 0;
  border: 1px solid transparent; border-radius: var(--radius);
  background: none; color: var(--muted); cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.tentang-tbl svg { width: 15px; height: 15px; }
.tentang-tbl:hover { background: var(--surface-2); color: var(--ink); border-color: var(--line); }
.tentang-tbl:disabled { opacity: .35; cursor: default; }
.tentang-tbl:disabled:hover { background: none; color: var(--muted); border-color: transparent; }

/* Tutup meninggalkan halaman. Warnanya baru muncul saat disentuh -
   kalau merah sejak awal, ia menarik perhatian lebih besar daripada
   perannya, dan tombol yang paling sering ditekan orang justru
   tombol yang paling tidak mereka maksud. */
.tentang-tbl--tutup:hover { background: var(--crit); border-color: var(--crit); color: #fff; }

.tentang-bingkai {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  background: #fff;

  /* Tinggi dihitung, bukan ditebak: satu layar penuh dikurangi topbar,
     bilah di atas bingkai, padding .page, dan footer portal. Kalau
     dibiarkan setinggi isinya, bingkai akan runtuh jadi 150px - iframe
     tanpa tinggi eksplisit tidak ikut tumbuh mengikuti isinya. */
  height: calc(100vh - var(--topbar-tinggi) - 190px);
  min-height: 420px;
}
.tentang-bingkai iframe { display: block; width: 100%; height: 100%; border: 0; }

/* Disembunyikan dengan CSS, bukan dengan [hidden] atau display:none -
   iframe yang di-display:none dimuat ulang oleh sebagian peramban saat
   ditampilkan kembali, dan halaman yang sedang dibaca orangnya hilang. */
.tentang-panel.is-kecil .tentang-bingkai {
  height: 0; min-height: 0; border-color: transparent;
}

/* Satu layar penuh: hamparan di dalam halaman, bukan fullscreen asli.
   z-index 210 - di atas tirai sidebar (60) dan panel kanan (200). */
.tentang-panel.is-penuh {
  position: fixed; inset: 0; z-index: 210;
  background: var(--ground); padding: 10px 12px 12px;
}
.tentang-panel.is-penuh .tentang-bingkai {
  height: calc(100vh - 52px); min-height: 0;
}
body.tentang-terkunci { overflow: hidden; }

.tentang-gagal {
  border: 1px solid var(--line); border-radius: var(--radius);
  background: #fff; padding: 28px; text-align: center;
}
.tentang-gagal p { margin: 0 0 10px; }
.tentang-gagal p:last-child { margin-bottom: 0; margin-top: 18px; }

@media (max-width: 700px) {
  /* Di ponsel, gulir bersarang adalah ongkos bingkai yang paling terasa.
     Bingkainya dibuat lebih tinggi supaya gulir dalamnya lebih jarang
     diperlukan - dan tombol "buka di tab baru" tetap ada di atasnya
     untuk yang memilih layar penuh. */
  .tentang-bingkai { height: calc(100vh - var(--topbar-tinggi) - 150px); }
  .tentang-judul { display: none; }
  .tentang-bilah { justify-content: flex-end; }
}

/* =====================================================================
   SIDEBAR BERCABANG
   =====================================================================

   Dipakai item menu yang memuat beberapa fitur sekaligus - hari ini
   hanya Activity. Bentuknya mengikuti pola yang sudah dikenal karyawan
   dari ilv_web: induk berikon dengan panah di kanan, anak menjorok ke
   dalam dengan penanda ">>".

   Ditulis di atas <details>/<summary>, jadi seluruh buka-tutupnya
   dikerjakan peramban. Tidak ada satu baris JavaScript yang terlibat,
   dan tidak ada keadaan yang bisa tertinggal tidak sinkron.
   ===================================================================== */

.side-grup { display: block; }

/* Penanda bawaan <summary> dibuang di ketiga mesin peramban - bentuk
   segitiga kecilnya tidak bisa digayakan dan letaknya berbeda-beda. */
.side-induk { list-style: none; cursor: pointer; }
.side-induk::-webkit-details-marker { display: none; }
.side-induk::marker { content: ''; }

/* Panah menunjuk ke kiri saat tertutup dan ke bawah saat terbuka -
   arah yang sama dengan gambar acuan. */
.side-panah {
  margin-left: auto; flex: 0 0 auto; line-height: 0;
  color: var(--muted); transition: transform .18s ease;
}
.side-panah svg { width: 15px; height: 15px; display: block; }
.side-grup[open] > .side-induk .side-panah { transform: rotate(-90deg); }

/* Induk yang bagiannya sedang dibuka: ditandai lembut saja. Yang
   disorot penuh adalah ANAKNYA - dua baris yang sama-sama menyala
   membuat orang tidak tahu mana yang sedang ia buka. */
.side-induk.aktif-induk { color: var(--ink); font-weight: 600; }
.side-induk.aktif-induk .side-panah { color: var(--accent); }

.side-anak {
  display: flex; flex-direction: column; gap: 2px;
  margin: 2px 0 4px;
}

.side-sub {
  display: flex; align-items: center; gap: 7px;
  padding: 7px 11px 7px 30px;
  border-radius: var(--radius); border-left: 3px solid transparent;
  color: var(--ink-soft); text-decoration: none;
  font-size: .875rem; white-space: nowrap; overflow: hidden;
}
.side-sub:hover { background: var(--surface-2); color: var(--ink); }
.side-sub.aktif {
  background: var(--accent-w); color: var(--accent);
  border-left-color: var(--accent); font-weight: 600;
}
.side-sub-tanda { flex: 0 0 auto; opacity: .5; font-size: .8rem; }
.side-sub.aktif .side-sub-tanda { opacity: 1; }

/* ---- sidebar yang diperkecil ----

   Anaknya tidak digambar sama sekali: lebarnya 62px, dan teks menjorok
   di dalamnya hanya menghasilkan potongan huruf. Induknya dibiarkan
   sebagai ikon, dan orang yang mengkliknya membuka cabangnya - yang
   pada lebar itu berarti dua baris ikon tanpa nama, jadi panahnya pun
   disembunyikan supaya tidak menjanjikan sesuatu yang tidak berguna.

   Cabang tetap bisa dijangkau: perkecil dimatikan satu klik, dan
   submenu horizontal di atas halaman tetap memuat seluruh tampilan
   fiturnya. */
body.sidebar-kecil .side-anak { display: none; }
body.sidebar-kecil .side-panah { display: none; }
body.sidebar-kecil .side-induk { justify-content: center; padding-left: 8px; padding-right: 8px; gap: 0; }

@media (max-width: 1000px) {
  /* Di layar sempit sidebar-nya menggeser masuk dengan lebar penuh,
     jadi anaknya kembali digambar - aturan di atas hanya berlaku untuk
     perkecil yang disengaja di layar lebar. */
  body.sidebar-kecil .side-anak { display: flex; }
  body.sidebar-kecil .side-panah { display: block; }
  body.sidebar-kecil .side-induk { justify-content: flex-start; padding-left: 11px; gap: 12px; }
}

/* =====================================================================
   ATUR MENU  (menu/atur)
   =====================================================================
   Halaman itu memakai tbl-wrap/tbl/tag/btn-mini yang sudah ada. Yang
   tersisa cuma tiga hal yang memang tidak ada padanannya: perataan
   pohon, kerapatan tombol aksi, dan lebar kolom yang masuk akal. */

/* Nama menu dan penanda cabangnya dirapatkan jadi satu baris supaya
   label yang panjang tidak turun ke bawah penanda. */
.mn-jorok { display: inline-flex; align-items: baseline; gap: 6px; }
.mn-cabang { color: var(--muted); font-size: .8rem; line-height: 1; }
.mn-nama { font-weight: 500; color: var(--ink); }
/* Label bahasa Inggris di daftar Atur menu. Sengaja di baris yang sama,
   bukan baris sendiri: tujuh puluh lima baris menu yang masing-masing
   setinggi dua baris membuat tabelnya tidak bisa dilihat sekali pandang. */
.mn-en { margin-left: 6px; font-style: italic; }
.mn-en::before { content: "EN "; font-style: normal; opacity: .65; }

/* Tombolnya berupa <form> sendiri-sendiri - POST, bukan tautan GET.
   Tanpa flex, tiap form jadi blok dan tombolnya berjejer ke bawah. */
.mn-aksi { white-space: nowrap; }
.mn-aksi form { display: inline; }
.mn-aksi > * { margin-right: 4px; }
.mn-aksi > *:last-child { margin-right: 0; }

/* Kolom alamat memakai huruf lebar-tetap: yang dibandingkan orang di
   kolom itu adalah potongan jalurnya, dan itu jauh lebih mudah dilihat
   kalau huruf-hurufnya sejajar ke bawah. */
.mn-tabel td:nth-child(2) { font-family: var(--mono, ui-monospace, "Cascadia Mono", Consolas, monospace); font-size: .82rem; }
.mn-tabel td:nth-child(4) { color: var(--muted); }
.mn-tabel .tag { margin-left: 5px; vertical-align: middle; }

.mn-catatan { max-width: 78ch; margin: 12px 0; }

/* Baris yang disembunyikan sudah diredupkan .row-off; namanya dicoret
   supaya bedanya tetap terbaca orang yang sukar membedakan kepekatan. */
.tbl tr.row-off .mn-nama { text-decoration: line-through; }

/* Formulir menu: satu panel .kotak berisi .grid.grid-2.
   Isian yang isinya panjang - Alamat dan Awalan - melintang penuh;
   terjepit setengah kolom, jalur seperti "waktu/laporan/tulis" terpotong
   di tengah dan tidak bisa dibandingkan dengan yang lain. */
.mn-form { max-width: 940px; }
.mn-form .grid-2 { gap: 16px 20px; }
.mn-penuh { grid-column: 1 / -1; }

/* Penjelasan di bawah isian dibatasi lebarnya. Baris teks yang
   melintang penuh layar lebar membuat mata kehilangan barisnya saat
   kembali ke kiri - dan justru penjelasan inilah yang perlu terbaca. */
.mn-form .field > small { line-height: 1.55; max-width: 68ch; }
.mn-form .cek { padding-bottom: 2px; }

/* Kotak centang "Tetap masuk" di halaman login.
   Peringatannya menempel pada kotaknya, bukan di tempat lain - orang
   membaca yang ada di bawah jarinya, bukan yang ada di bawah tombol. */
.login-ingat {
  display: flex; align-items: flex-start; gap: 9px;
  margin: -2px 0 4px; cursor: pointer; user-select: none;
}
.login-ingat input { margin: 3px 0 0; flex: 0 0 auto; }
.login-ingat span { font-size: .88rem; line-height: 1.45; }
.login-ingat small {
  display: block; color: var(--muted); font-size: .78rem; margin-top: 1px;
}

/* =====================================================================
   Perangkat saya
   =====================================================================
   Daftar, bukan tabel. Isinya satu nama, beberapa keterangan kecil, dan
   satu tombol - tabel tiga kolom untuk itu lebih banyak menuntut
   perataan daripada menjelaskan apa pun, dan di ponsel ia harus digulir
   ke samping.
   ================================================================== */
.pr-daftar { list-style: none; margin: 0; padding: 0; }

.pr-baris {
  display: flex; align-items: center; gap: 14px;
  padding: 12px 14px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface);
}
.pr-baris + .pr-baris { margin-top: 8px; }

/* Perangkat yang sedang dipakai diberi garis aksen di tepi kiri - tanda
   yang terbaca sekilas, tanpa menambah satu kata pun ke barisnya. */
.pr-ini { border-left: 3px solid var(--accent); }

.pr-teks { flex: 1 1 auto; min-width: 0; }
.pr-nama {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-weight: 600; margin-bottom: 2px;
}
.pr-rinci { line-height: 1.5; }
.pr-aksi { flex: 0 0 auto; margin: 0; }

@media (max-width: 560px) {
  /* Di ponsel tombolnya turun ke bawah keterangannya, bukan berdesakan
     di sampingnya sampai namanya terpotong. */
  .pr-baris { flex-direction: column; align-items: stretch; gap: 10px; }
  .pr-aksi .btn { width: 100%; }
}

/* ===================================================================
   UNDUH APLIKASI - kartu di Beranda
   ===================================================================
   Lima lencana, satu yang hidup. Yang mati dibuat BEDA SECARA BENTUK,
   bukan cuma lebih pucat: warnanya diredupkan DAN kursornya default DAN
   ia bukan <a>. Kalau pembedanya hanya warna, orang yang layarnya
   terang atau matanya kurang membedakan warna akan mengklik-klik
   sesuatu yang tidak akan pernah menjawab, lalu mengira portalnya
   rusak.
   =================================================================== */
.unduh-kartu {
  background: var(--ground); border: 1px solid var(--line);
  border-radius: 6px; box-shadow: var(--shadow);
  padding: 14px 16px 12px; margin-bottom: 18px;
}
.unduh-kepala h2 {
  font-size: 1rem; font-weight: 600; margin: 0 0 2px;
}
.unduh-kepala p { margin: 0; }

.unduh-daftar {
  list-style: none; margin: 12px 0 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: 8px;

  /* flex-start, bukan stretch bawaannya: saat panel keterangan
     dibuka, butir itu menjadi tinggi - dan dengan stretch, lencana
     Windows di sebelahnya ikut memanjang menjadi kotak tinggi kosong. */
  align-items: flex-start;
}
.unduh-daftar li { margin: 0; }

.unduh-lencana {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 14px 8px 10px;
  border: 1px solid var(--line); border-radius: 6px;
  background: var(--surface-2); color: var(--ink);
  text-decoration: none; font-size: .86rem; font-weight: 600;
  transition: border-color .12s, background .12s;
}
a.unduh-lencana:hover, a.unduh-lencana:focus-visible {
  border-color: var(--accent); background: var(--accent-w); color: var(--accent-2);
}

.unduh-ikon {
  display: flex; width: 22px; height: 22px; flex: 0 0 22px;
  color: var(--accent);
}
.unduh-ikon svg { width: 100%; height: 100%; }

.unduh-mati {
  background: transparent; color: var(--muted);
  border-style: dashed; cursor: default;
}
.unduh-mati .unduh-ikon { color: var(--muted); opacity: .7; }

.unduh-rinci { margin: 10px 0 0; }

/* =====================================================================
   PANEL KETERANGAN - muncul saat lencananya disorot
   =====================================================================
   Permintaan penggunanya, 16 September 2026: nama berkas, ukuran,
   tanggal, dan peringatan SmartScreen tidak perlu berdiri terus di
   bawah kartu; cukup muncul ketika lencananya disorot.

   YANG MEMBUATNYA AMAN: seluruh sifat "melayang dan tersembunyi" itu
   tinggal DI DALAM @media (hover: hover). Peranti tanpa tetikus -
   ponsel dan tablet - tidak pernah membaca aturan itu sama sekali,
   jadi di sana panelnya tetap mengalir di bawah lencananya, terlihat
   apa adanya.

   Itu bukan kehati-hatian yang berlebihan. Menyembunyikan sesuatu di
   balik sorotan pada peranti yang tidak punya sorotan berarti
   menghilangkannya - dan di antara yang akan hilang ada peringatan
   "Windows protected your PC", satu-satunya alinea di kartu ini yang
   ada semata-mata supaya orang tidak menelepon IT. Cacat yang sama
   pernah terjadi di lencana ponsel: dulu ia <span> ber-title, dan di
   ponsel title tidak pernah muncul. */

.unduh-butir { position: relative; }

/* Bawaan - dipakai peranti sentuh. Mengalir, terlihat. */
.unduh-tip { padding-top: 6px; }
.unduh-tip .unduh-rinci { margin: 0 0 6px; }
.unduh-tip .unduh-catat { margin: 0; }

/* Yang punya tombol <details>: tersembunyi sampai ditekan. Di ponsel
   ini yang membuat empat alinea cara memasang tidak ikut memanjangkan
   kartu sebelum ada yang menanyakannya. */

@media (hover: hover) and (pointer: fine) {
  .unduh-tip {
    display: block;
    position: absolute; top: 100%; left: 0; z-index: 40;
    width: 440px; max-width: calc(100vw - 48px);

    /* TANPA jarak ke lencananya - dan itu disengaja. Jarak beberapa
       piksel di antara keduanya adalah lorong mati: tetikus yang
       turun untuk membaca panelnya melewatinya, :hover lepas, dan
       panelnya menutup tepat saat orang hendak membacanya. */
    margin: 0;

    padding: 10px 12px;
    background: var(--surface);
    border: 1px solid var(--line); border-radius: 6px;
    box-shadow: var(--shadow);

    opacity: 0; visibility: hidden; transform: translateY(-4px);
    transition: opacity .12s ease, transform .12s ease, visibility .12s;
  }

  /* Dua keadaan, bukan satu. :focus-within untuk yang memakai papan
     ketik - tanpa itu, Tab sampai ke tombol Windows dan keterangannya
     tidak pernah muncul. */
  .unduh-butir:hover > .unduh-tip,
  .unduh-butir:focus-within > .unduh-tip {
    opacity: 1; visibility: visible; transform: none;
  }
}

.unduh-catat {
  margin: 8px 0 0; padding: 8px 10px;
  border-left: 3px solid var(--warn); border-radius: 0 4px 4px 0;
  background: var(--warn-w); color: var(--warn);
}

/* Di ponsel lima lencana menjadi dua baris yang rapi, bukan satu baris
   yang digulir ke samping. */
@media (max-width: 560px) {
  .unduh-daftar { gap: 6px; }
  .unduh-lencana { padding: 7px 11px 7px 9px; font-size: .8rem; }
}

/* ===================================================================
   TAMU RAPAT - kotak tautan tamu di halaman ruang
   ===================================================================
   Bentuknya daftar, bukan tabel: isinya satu nama, beberapa keterangan
   kecil, dan dua tombol. Tabel empat kolom untuk itu lebih banyak
   menuntut perataan daripada menjelaskan apa pun - dan di layar ponsel
   ia harus digulir ke samping.

   Baris yang dicabut TIDAK dihapus dari layar. Tuan rumah perlu bisa
   melihat bahwa ia memang sudah mencabutnya; daftar yang barisnya
   lenyap membuat orang bertanya-tanya apakah tombolnya bekerja.
   =================================================================== */
/* Tamu luar TIDAK punya daftarnya sendiri lagi.
   ----------------------------------------------------------------------
   Barisnya kini ikut masuk ke tabel peserta - satu tabel untuk satu
   pertanyaan, "siapa saja yang ada di rapat ini". Gaya daftar bertumpuk
   yang dulu (.tm-daftar, .tm-teks, .tm-nama, .tm-rinci) sudah dibuang
   bersama daftarnya; menyimpannya hanya membuat orang berikutnya
   menyalinnya kembali karena mengira ia masih dipakai.

   .tm-baris juga dibuang dengan sengaja, dan ini penting: isinya
   display:flex, dan nama yang sama dipasang pada sebuah <tr> akan
   MERUNTUHKAN barisnya - sel-selnya berhenti sejajar dengan kolom
   tabelnya, tanpa satu pun galat. */
.tm-tamu-baris td:first-child { font-weight: 500; }

/* Dicabut: diredupkan DAN namanya dicoret. Warna saja tidak cukup -
   pembeda yang hanya warna hilang di layar terang dan bagi yang
   membedakan warna dengan susah payah. */
.tm-cabut { opacity: .62; }
.tm-cabut .rp-peserta-nama { text-decoration: line-through; }

.tm-tambah { margin-top: 12px; }
.tm-tambah textarea {
  width: 100%; min-height: 74px; resize: vertical;
  font: inherit; font-size: .9rem;
}
.tm-tambah .actions {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-top: 8px;
}

@media (max-width: 560px) {
  /* Tombol di sel aksi ditumpuk, bukan dipaksa berjajar - tiga tombol
     berdampingan di layar 360 piksel membuat tabelnya menggulung
     mendatar, dan yang menggulung tidak pernah ditemukan orang. */
  .tm-tamu-baris .rp-aksi { white-space: normal; }
  .tm-tamu-baris .rp-aksi > * { display: block; margin: 2px 0 0 auto; }
}

/* ===================================================================
   BILAH TAHUN DI HALAMAN HARI LIBUR
   ===================================================================
   Bilah ini memuat tiga jenis kontrol yang tingginya berbeda-beda:

     .btn         "« Kalender"        padding 8px 15px, .89rem
     .btn-mini    "2026 (25)"         padding 3px 9px,  .77rem
     input        kotak tahun         padding bawaan borang

   .bar merapatkan isinya ke DASAR (align-items: flex-end), jadi
   selisih itu muncul sebagai puncak yang bergerigi. Dilaporkan
   penggunanya 22 September 2026.

   Yang disamakan TINGGINYA, bukan paddingnya. Padding yang sama masih
   menghasilkan tinggi yang berbeda begitu ukuran hurufnya berbeda -
   dan ukuran huruf .btn dan .btn-mini memang berbeda. Tinggi tetap
   membuat ketiganya rata berapa pun isinya.

   Dibatasi .kl-bar, bukan diubah di .bar: bilah yang sama dipakai
   belasan halaman lain, dan sebagian memang sengaja menaruh tombol
   besar di sebelah tombol kecil.
   =================================================================== */
.kl-bar { align-items: center; }

.kl-bar .btn,
.kl-bar input[type=number] {
  height: 32px;
  padding: 0 12px;
  font-size: .8rem;
  line-height: 1;
}

/* inline-flex supaya tulisannya tetap di tengah sesudah paddingnya
   dibuang - <a> tidak memusatkan isinya sendiri seperti <button>. */
.kl-bar .btn { display: inline-flex; align-items: center; gap: 5px; }

/* Kotak unduh hari libur di bilah tahun. */
.kl-unduh { display: flex; align-items: center; gap: 7px; margin: 0; }
.kl-unduh input[type=number] { width: 6.5em; }

/* ===================================================================
   PANEL KONTROL
   =================================================================== */
.me-baris-admin { border-top: 1px solid var(--line-soft); margin-top: 4px; padding-top: 8px; }

/* Ringkasan paling atas. Bukan lampu hijau/merah melainkan kalimat:
   yang ingin diketahui Administrator saat membuka panel adalah "ada
   yang perlu saya kerjakan atau tidak", dan titik warna tidak pernah
   menjawab itu. */
.pk-kepala {
  border-radius: 6px; padding: 11px 14px; margin-bottom: 18px;
  border: 1px solid var(--line); background: var(--surface);
  box-shadow: var(--shadow);
}
.pk-aman { border-left: 4px solid var(--ok); }
.pk-perlu { border-left: 4px solid var(--warn); background: var(--warn-w); color: var(--warn); }

/* Tiga kolom yang BERBARIS, bukan tujuh baris yang masing-masing
   menyusun dirinya sendiri.
   ---------------------------------------------------------------------
   Susunan sebelumnya flex per baris dengan min-width 170px pada nama
   modulnya. Selama seluruh namanya lebih pendek dari itu, hasilnya
   kebetulan terlihat rapi; begitu "Editor dokumen (ONLYOFFICE)"
   melewatinya, lencana dan alamat pada baris ITU bergeser sendiri
   sementara baris lain tidak - dan daftar yang kolomnya bergeser harus
   dibaca satu per satu, bukan dipindai sekali lihat.

   Kisi dipasang pada DAFTARNYA, dan tiap barisnya display:contents
   supaya ketiga isinya menjadi sel pada kisi yang sama. Itu satu-satunya
   cara membuat kolom berbaris antar-baris tanpa menebak lebar mana pun:
   max-content mengambil lebar dari nama terpanjang yang benar-benar ada,
   jadi nama baru sepanjang apa pun tetap berbaris.

   Garis pemisahnya pindah ke tiap sel - baris yang display:contents
   tidak menggambar apa-apa sendiri, termasuk bingkainya. */
.pk-modul {
  list-style: none; margin: 0; padding: 0;
  display: grid; align-items: baseline;
  grid-template-columns: minmax(150px, max-content) max-content minmax(0, 1fr);
  column-gap: 12px;
}
.pk-mod { display: contents; }
.pk-mod > * { padding: 7px 0; border-top: 1px solid var(--line-soft); }
.pk-mod:first-child > * { border-top: 0; }

.pk-mod-nama { font-weight: 600; }
.pk-mod-tag {
  /* justify-self WAJIB: sel kisi merentang penuh secara bawaan, dan
     lencana yang merentang akan menggambar latar sepanjang kolomnya -
     "AKTIF" dengan pita hijau selebar "TIDAK AKTIF". */
  justify-self: start;
  font-size: .72rem; font-weight: 700; letter-spacing: .03em;
  text-transform: uppercase; padding: 1px 8px; border-radius: 999px;
}
.pk-hidup .pk-mod-tag { background: var(--ok-w); color: var(--ok); }
.pk-mati  .pk-mod-tag { background: var(--warn-w); color: var(--warn); }

/* Kolom ketiga: alamat layanannya, dan alasan bila ia mati. Keduanya
   di dalam satu wadah supaya alamat tetap rata kiri pada baris yang
   sama walau alasannya panjang dan membungkus. */
.pk-mod-ket { min-width: 0; }

/* Di layar sempit tiga kolom tidak muat, dan kisi yang tidak muat
   mendorong alamatnya keluar kartu. Di bawah lebar ini ia kembali
   menumpuk - nama dan lencana sebaris, alamat di bawahnya. */
@media (max-width: 560px) {
  .pk-modul { display: block; }
  .pk-mod {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: 3px 10px;
    padding: 8px 0; border-top: 1px solid var(--line-soft);
  }
  .pk-mod:first-child { border-top: 0; }
  .pk-mod > * { padding: 0; border-top: 0; }
  .pk-mod-ket { flex: 1 1 100%; }
}

/* Alamat server bukan kalimat: monospace membuat titik dan garis
   miringnya terbaca satu per satu, yang justru gunanya saat seseorang
   menyalinnya ke bilah alamat. */
.pk-mod-alamat {
  display: block; font-family: var(--mono, ui-monospace, Consolas, monospace);
  font-size: .8rem; color: var(--ink-soft); overflow-wrap: anywhere;
}
.pk-mod-alasan { display: block; margin-top: 2px; }

/* Angka besar dulu, labelnya kecil di bawahnya - yang dibaca sekilas
   adalah angkanya, dan label yang sejajar membuat mata harus memilih. */
.pk-angka { display: flex; flex-wrap: wrap; gap: 20px; }
.pk-satu { display: flex; flex-direction: column; min-width: 78px; }
.pk-satu strong { font-size: 1.5rem; line-height: 1.15; font-weight: 600; }
.pk-buruk strong { color: var(--crit); }

.pk-teratas { list-style: none; margin: 0; padding: 0; }
.pk-teratas li {
  display: flex; justify-content: space-between; gap: 12px;
  padding: 3px 0; font-size: .88rem;
}
.pk-teratas li + li { border-top: 1px solid var(--line-soft); }

/* Kartu pintasan: SEMUANYA setinggi yang sama.
   ---------------------------------------------------------------------
   Kisinya memang sudah berkolom sama lebar, tetapi kotak yang terlihat
   di layar bukan sel kisinya melainkan <a> DI DALAM sel itu - dan <a>
   setinggi isinya sendiri. Keterangan yang membungkus jadi dua baris
   membuat kartunya lebih tinggi daripada tetangganya, jadi tepi
   bawahnya bergerigi walaupun kolomnya rapi.

   Dua hal yang memperbaikinya, dan keduanya perlu:
     grid-auto-rows: 1fr   - tiap BARIS kisi setinggi baris tertinggi,
                             bukan setinggi isinya masing-masing;
     <a> mengisi selnya    - lewat li yang flex dan a yang flex:1.

   Tanpa yang kedua, barisnya memang sama tinggi tetapi kotaknya tetap
   pendek dan mengambang di dalamnya. */
.pk-pintasan {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  grid-auto-rows: 1fr;
}
.pk-pintasan li { display: flex; }
.pk-pintasan a {
  flex: 1 1 auto;
  display: flex; flex-direction: column; gap: 3px;
  padding: 11px 13px; border: 1px solid var(--line); border-radius: 6px;
  background: var(--surface-2); color: var(--ink); text-decoration: none;
  transition: border-color .12s, background .12s;
}
.pk-pintasan a:hover, .pk-pintasan a:focus-visible {
  border-color: var(--accent); background: var(--accent-w); color: var(--accent-2);
}

@media (max-width: 560px) {
  /* .pk-mod-nama TIDAK lagi dipaksa selebar penuh di sini.
     -------------------------------------------------------------------
     Aturan itu ditulis untuk susunan lama, ketika nama modul diberi
     min-width 170px dan harus dilepas di layar sempit. Susunan itu sudah
     tidak ada, tetapi aturannya tertinggal - dan ia melempar lencana
     AKTIF ke barisnya sendiri, sehingga tiap modul memakan tiga baris di
     ponsel. Aturan yatim di app.css tidak menimbulkan galat apa pun; ia
     hanya menunggu sampai ada yang mengira tampilannya memang begitu. */
  .pk-angka { gap: 14px; }
}

/* =====================================================================
   BASIS PENGETAHUAN - 17 September 2026
   =====================================================================
   Yang diatur di sini hanya bentuk BACAAN. Artikel SOP dibaca sambil
   dikerjakan, sering di layar kecil, dan yang menentukan enak-tidaknya
   dibaca cuma tiga hal: lebar baris yang tidak terlalu panjang, jarak
   antar-baris yang lega, dan judul yang benar-benar terlihat sebagai
   judul. Sisanya memakai kelas yang sudah ada di portal ini.
   ===================================================================== */

.kb-daftar { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }

.kb-baris {
  padding: 10px 12px; border: 1px solid var(--line); border-radius: 6px;
  background: var(--surface-2);
  transition: border-color .12s;
}
.kb-baris:hover { border-color: var(--accent); }

.kb-judul { font-size: .98rem; font-weight: 600; text-decoration: none; color: var(--ink); }
.kb-judul:hover { text-decoration: underline; }

.kb-cuplik { margin-top: 4px; font-size: .85rem; color: var(--muted); line-height: 1.5; }

.kb-h { margin: 0 0 4px; font-size: 1.25rem; line-height: 1.3; }
.kb-kepala { margin-bottom: 14px; }

/* Lebar baca dibatasi. Baris sepanjang layar lebar memaksa mata
   melompat kembali ke awal baris dan kehilangan tempatnya - yang
   membuat orang berhenti membaca SOP di tengah jalan. */
.kb-isi { max-width: 68ch; line-height: 1.65; font-size: .93rem; }
.kb-isi h3 { font-size: 1.08rem; margin: 20px 0 6px; }
.kb-isi h4 { font-size: .98rem; margin: 18px 0 6px; }
.kb-isi h5 { font-size: .92rem; margin: 16px 0 6px; color: var(--muted); }
.kb-isi p { margin: 0 0 10px; }
.kb-isi ul, .kb-isi ol { margin: 0 0 10px; padding-left: 22px; }
.kb-isi li { margin: 2px 0; }
.kb-isi hr { border: 0; border-top: 1px solid var(--line); margin: 18px 0; }
.kb-isi blockquote {
  margin: 0 0 10px; padding: 2px 0 2px 12px;
  border-left: 3px solid var(--line); color: var(--muted);
}
.kb-isi blockquote p { margin: 4px 0; }
.kb-isi code {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: .86em; padding: 1px 4px; border-radius: 4px;
  background: var(--surface-3, var(--surface-2)); border: 1px solid var(--line);
}
.kb-kode {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: .84rem; line-height: 1.5; margin: 0 0 12px;
  padding: 10px 12px; border: 1px solid var(--line); border-radius: 6px;
  background: var(--surface-2); overflow-x: auto; white-space: pre;
}
.kb-isi a { color: var(--accent-2); }

.kb-bantuan { margin: 4px 0 10px; font-size: .85rem; color: var(--muted); }
.kb-bantuan summary { cursor: pointer; }
.kb-bantuan ul { margin: 6px 0 0; padding-left: 20px; }
.kb-bantuan li { margin: 3px 0; }

.kb-kat + .kb-kat { margin-top: 8px; }
.kb-kat-ket { flex: 1 1 260px; }
.kb-kat-aktif { display: inline-flex; align-items: center; gap: 4px; }

@media (max-width: 560px) {
  .kb-isi { max-width: none; }
}

/* ---------------- kolom banyak-pilihan di Automation ---------------- */

/* Kotak centang untuk kolom "pilihan" yang boleh banyak. Membungkus
   ke bawah, bukan satu kolom panjang: daftar tujuh pilihan tidak perlu
   mendorong tombol Kirim keluar layar. */
.auto-centang {
  display: flex; flex-wrap: wrap; gap: 2px 18px;
  padding: 6px 8px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--surface);
}
.auto-centang .cek { padding: 3px 0; font-size: .87rem; }

.auto-orang { display: block; }

/* Kolom wajib yang dibiarkan kosong. Warnanya dipakai bersama pesan di
   bawahnya - warna sendirian bukan penanda yang bisa diandalkan. */
.perlu-isi .po-kotak,
.auto-centang.perlu-isi { border-color: var(--crit); }

.perlu-pesan {
  margin: 4px 0 0; font-size: .8rem; color: var(--crit);
}
.perlu-pesan:empty { display: none; }

/* ---------------- daftar berkas pemasang di Panel Kontrol ---------------- */

/* Kisi dua kolom: nama platform selalu rata kiri pada lebar yang sama,
   keterangannya di kolom kedua. Susunan flex-wrap sebelumnya membuat
   ukuran berkas berpindah-pindah baris tergantung panjang namanya. */
.pk-aplikasi { list-style: none; margin: 0; padding: 0; font-size: .82rem; }
.pk-aplikasi li {
  display: grid; grid-template-columns: 74px minmax(0, 1fr); gap: 10px;
  padding: 5px 0; border-bottom: 1px solid var(--line-soft);
}
.pk-aplikasi li:last-child { border-bottom: 0; }

.pk-ap-nama { font-weight: 600; color: var(--ink-soft); }

/* minmax(0, 1fr) di atas DAN min-width:0 di sini. Keduanya perlu:
   tanpa itu isi kisi memakai ukuran isinya sebagai lebar minimum, dan
   nama berkas panjang tanpa spasi akan melebarkan kolomnya sampai
   keluar kartu - lalu terpotong oleh overflow:hidden milik panel. */
.pk-ap-isi { display: block; min-width: 0; }

.pk-ap-berkas { display: block; overflow-wrap: anywhere; }
.pk-ap-meta   { display: block; margin-top: 1px; font-size: .78rem; }

.pk-ap-tanda {
  display: inline-block; margin-left: 4px;
  font-size: .72rem; padding: 0 6px; border-radius: 999px;
  background: var(--warn-w); color: var(--warn);
}

/* Jalur folder Windows tidak punya satu pun spasi, jadi peramban tidak
   punya tempat mematahkannya - dan panel ini overflow:hidden. Tanpa
   aturan ini jalurnya terpotong di tepi kartu, dan yang terbaca adalah
   alamat yang salah tanpa satu pun tanda bahwa ia terpenggal. */
/* overflow-wrap: anywhere, BUKAN word-break: break-all.
   ---------------------------------------------------------------------
   Keduanya sama-sama mencegah jalurnya terpotong di tepi kartu, tetapi
   break-all mematahkannya di huruf mana pun - "...\storage_padm" lalu
   "a" sendirian di baris berikutnya, yang terbaca seperti salah ketik.
   Yang ini hanya memakai tempat patah yang ada, dan <wbr> di tampilannya
   menaruh tempat patah itu tepat sesudah setiap pemisah folder. */
.pk-jalur {
  display: inline-block; max-width: 100%;
  overflow-wrap: anywhere; white-space: normal;
}

/* ---------------- swafoto absen di rincian /waktu ---------------- */

.wi-foto { display: flex; flex-wrap: wrap; gap: 14px; }
.wi-foto figure { margin: 0; }

/* Tinggi tetap, lebar mengikuti - swafoto potret dan lanskap berdiri
   berdampingan, dan baris yang tingginya berbeda-beda terbaca sebagai
   halaman yang rusak. object-fit: contain, BUKAN cover: cap airnya ada
   di bagian bawah foto, dan cover memotongnya justru di situ. */
.wi-foto img {
  display: block; height: 190px; width: auto; max-width: 100%;
  object-fit: contain; background: var(--surface-2);
  border: 1px solid var(--line); border-radius: 6px;
}
.wi-foto figcaption { margin-top: 4px; text-align: center; }

/* =====================================================================
   PRATINJAU LAMPIRAN DI TEMPAT
   =====================================================================

   Satu kotak untuk gambar, PDF, dan dokumen ONLYOFFICE - lihat
   Lampiran::pratinjau() yang memutuskan mana yang mana.

   Ukurannya besar dengan sengaja: 92% lebar dan 88% tinggi layar.
   Spreadsheet di dalam kotak 800 piksel tidak lebih berguna daripada
   tidak dibuka sama sekali, dan itulah keberatan yang wajar terhadap
   memasukkan ONLYOFFICE ke dalam lightbox. Yang menjawabnya bukan
   memindahkannya keluar, melainkan memberinya hampir seluruh layar. */
.lp-tirai {
  position: fixed; inset: 0; z-index: 3000;
  display: flex; align-items: center; justify-content: center;
  padding: 2vh 2vw;
  background: rgba(0, 0, 0, .66);
}
.lp-tirai[hidden] { display: none; }

/* Halaman di belakangnya tidak ikut bergulir saat kotak terbuka -
   menggulir yang salah lapis adalah cara tercepat membuat orang
   mengira kotaknya macet. */
body.lp-terkunci { overflow: hidden; }

.lp-kotak {
  display: flex; flex-direction: column;
  width: 92vw; height: 88vh;
  background: var(--ground); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
  box-shadow: 0 18px 50px rgba(0, 0, 0, .4);
}

.lp-kepala {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 10px; border-bottom: 1px solid var(--line);
  background: var(--surface-2);
}
.lp-judul {
  flex: 1; min-width: 0; font-size: .9rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lp-tutup {
  border: none; background: none; cursor: pointer;
  font-size: 1.4rem; line-height: 1; padding: 0 6px; color: var(--muted);
}
.lp-tutup:hover { color: var(--ink); }

.lp-isi {
  flex: 1; min-height: 0;
  display: flex; align-items: center; justify-content: center;
  background: var(--ground);
}

/* Gambar dimuat apa adanya, tidak dipaksa memenuhi kotak: swafoto absen
   yang ditarik melebar akan menyembunyikan cap air di bawahnya, dan
   justru cap itu yang membuat fotonya berarti. */
.lp-gambar { max-width: 100%; max-height: 100%; object-fit: contain; }

.lp-bingkai { width: 100%; height: 100%; border: none; background: #fff; }

/* Di layar sempit kotaknya memenuhi layar - sisa 4% di tiap sisi hanya
   menyisakan celah yang tidak cukup untuk apa pun dan membuat isinya
   makin sempit. */
@media (max-width: 640px) {
  .lp-tirai { padding: 0; }
  .lp-kotak { width: 100vw; height: 100vh; border: none; border-radius: 0; }
}

/* ---------------------------------------------------------------------
   REAKSI PESAN (27 Sep 2026)

   Dua hal yang gampang salah di sini, dan keduanya diam:

   1. Keripik berdiri DI LUAR gelembung, jadi warnanya tidak boleh
      bergantung pada .chat-saya - satu rupa untuk kedua sisi. Di dalam
      gelembung sendiri yang berlatar --accent-w, keripik putih nyaris
      tidak terlihat.

   2. Tidak ada satu pun warna tetap di bawah ini. Berkas ini punya tema
      gelap (baris 39), dan #fff yang ditulis langsung akan menyala putih
      di tengah halaman gelap - tanpa satu pun galat, dan hanya terlihat
      oleh yang memakainya.
   --------------------------------------------------------------------- */
.chat-reaksi { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 3px; }
.chat-reaksi:empty { display: none; }
.chat-saya .chat-reaksi { justify-content: flex-end; }

.chat-keripik {
  display: inline-flex; align-items: center; gap: 3px;
  padding: 1px 7px 2px; font-size: 12px; line-height: 1.5;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 11px; cursor: pointer;
}
.chat-keripik i {
  font-style: normal; font-size: 10.5px; font-weight: 800;
  color: var(--muted);
}
.chat-keripik.aktif { background: var(--accent-w); border-color: var(--accent); }
.chat-keripik.aktif i { color: var(--accent); }

/* Pemetik emoji - MELAYANG di atas gelembung, bukan mendorongnya.
   Kalau ia menyisip sebagai baris biasa, seluruh percakapan di bawahnya
   bergeser saat dibuka, dan yang sedang dibaca orang berpindah tempat. */
.chat-pemetik {
  /* Berlabuh pada BARIS, bukan pada gelembung: sejak tombolnya pindah
     ke .chat-alat, jangkar lamanya tinggal selebar dua ikon. */
  position: absolute; z-index: 46; bottom: 100%; left: 0;
  display: flex; flex-wrap: wrap; max-width: 268px; gap: 2px;
  padding: 5px 6px; margin-bottom: 4px;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 12px; box-shadow: var(--shadow);
}
.chat-pemetik button {
  width: 30px; height: 30px; font-size: 17px; line-height: 1;
  background: none; border: 0; border-radius: 15px; cursor: pointer;
}
.chat-pemetik button:hover { background: var(--surface-2); }
.chat-pemetik button.lagi { font-size: 13px; color: var(--muted); }

/* .chat-gelembung sudah position: relative sejak semula (baris 2228),
   jadi pemetiknya berlabuh dengan benar tanpa aturan tambahan. Ditulis
   sebagai catatan, bukan sebagai aturan: mengulanginya di sini akan
   menimpa yang di atas kalau suatu hari yang di atas berubah, dan yang
   menimpa tidak kelihatan. */

/* ---------------------------------------------------------------------
   MENU SATU PESAN (27 Sep 2026)

   Menggantikan tiga tombol kecil yang dulu berjejer di dalam gelembung.
   Bentuk lama itu tidak bisa tumbuh: tujuh butir seperti di aplikasi
   ponsel akan lebih lebar daripada sebagian pesannya sendiri.

   Tidak ada satu pun warna tetap di bawah - berkas ini punya tema gelap.
   --------------------------------------------------------------------- */

/* ALAT - dua tombol yang muncul saat tetikus mendekat.
   Tempatnya SELALU disediakan (opacity, bukan display): kalau ia lahir
   dan mati, isi percakapan bergeser setiap kali tetikus lewat, dan
   pergeseran itu membuat orang menekan pesan yang salah. */
.chat-alat {
  display: flex; align-items: center; gap: 1px;
  opacity: 0; transition: opacity .12s;
}
.chat-baris:hover .chat-alat,
.chat-alat:focus-within { opacity: 1; }

.chat-alat-tombol {
  width: 24px; height: 24px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border: 0; border-radius: 12px; cursor: pointer;
  background: none; color: var(--muted); font-size: 14px; line-height: 1;
}
.chat-alat-tombol:hover { background: var(--surface-2); color: var(--ink); }

/* MENU - berlabuh pada barisnya, membuka ke sisi LUAR gelembung. */
/* Berlabuh sama persis dengan pemetik emoji - permintaan pemilik
   projek 27 Sep 2026, sesudah menu muncul jauh di kanan layar.

   Sebab yang lama: `left: 100%` dihitung terhadap .chat-baris, dan
   baris untuk pesan ORANG LAIN merentang sampai max-width 76% - hanya
   .chat-saya yang diberi align-self: flex-end. Jadi "100% dari kiri
   baris" mendarat di ujung kanan ruang kosongnya, jauh dari pesannya.
   Pemetik tidak kena karena ia memakai `left: 0`. */
.chat-menu {
  position: absolute; z-index: 45; bottom: 100%; left: 0;
  margin-bottom: 4px;
  min-width: 168px; padding: 4px;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 10px; box-shadow: var(--shadow);
}
.chat-saya .chat-menu { left: auto; right: 0; }

/* Dibalik ke bawah saat ruang di atasnya tidak cukup.
   ---------------------------------------------------------------------
   Menu tujuh butir tingginya sekitar 250px, dan .chat-pesan memotong
   apa pun yang keluar dari kotaknya (overflow-y: auto). Pesan di dekat
   tepi atas karena itu akan kehilangan separuh menunya. Pemetik emoji
   tidak pernah memperlihatkan gejalanya - tingginya cuma 50px. */
.chat-menu.ke-bawah,
.chat-pemetik.ke-bawah {
  bottom: auto; top: 100%;
  margin-bottom: 0; margin-top: 4px;
}

.chat-menu-butir {
  display: block; width: 100%; padding: 7px 10px;
  border: 0; background: none; cursor: pointer;
  font-size: .85rem; text-align: left; color: var(--ink);
  border-radius: 6px;
}
.chat-menu-butir:hover { background: var(--surface-2); }
.chat-menu-butir.bahaya { color: var(--crit); }
/* Panah kecil menandai butir yang MEMBUKA sesuatu, bukan yang
   mengerjakan sesuatu - tanpa itu Lainnya terbaca seperti tindakan yang
   gagal saat menunya cuma berganti isi. */
.chat-menu-butir.punya-anak::after { content: ' \203A'; float: right; }

/* PITA BALAS / SUNTING - di atas kotak tulis. */
/* ATRIBUT hidden HARUS MENANG.
   ---------------------------------------------------------------------
   `hidden` cuma berarti `display: none` dari lembar gaya BAWAAN
   peramban, dan aturan kelas apa pun mengalahkannya. Begitu .chat-pita
   menyebut `display: flex`, atribut hidden-nya tidak berarti apa-apa -
   dan itu yang terjadi: pita balas, pita sunting, serta bilah pilih
   semuanya tampil begitu ruang dibuka (dilaporkan 27 Sep 2026).

   Ditulis untuk SETIAP elemen yang punya display sendiri DAN dikendali
   atribut hidden. Yang lupa diberi pengecualian akan tampil selamanya,
   tanpa satu pun galat. */
.chat-pita[hidden],
.chat-pilih-bar[hidden] { display: none; }

.chat-pita {
  display: flex; align-items: center; gap: 8px;
  margin: 0 10px 4px; padding: 6px 9px;
  background: var(--surface-2); border-left: 3px solid var(--accent);
  border-radius: 6px; font-size: .82rem;
}
.chat-pita-sunting { border-left-color: var(--warn); }
.chat-pita-ikon { color: var(--muted); }
.chat-pita-isi { flex: 1 1 auto; min-width: 0; }
.chat-pita-isi b { display: block; font-size: .78rem; color: var(--accent); }
.chat-pita-sunting .chat-pita-isi b { color: var(--warn); }
.chat-pita-isi span {
  display: block; color: var(--muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.chat-pita-tutup {
  border: 0; background: none; cursor: pointer;
  font-size: 17px; line-height: 1; color: var(--muted);
}

/* MODE PILIH.
   Warna latar SAJA tidak cukup - pelajaran dari aplikasi ponsel 27 Sep
   2026, saat tint birunya berselisih di bawah dua persen dari latar dan
   tidak ada yang bisa melihatnya. Di sini warnanya lebih tegas DAN ada
   garis tepi di sisi gelembungnya. */
.chat-baris.terpilih .chat-gelembung {
  outline: 2px solid var(--accent);
  outline-offset: 1px;
}
.chat-pesan.mode-pilih .chat-baris { cursor: pointer; }

.chat-pilih-bar {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 12px;
  background: var(--accent); color: #fff; font-size: .85rem;
}
.chat-pilih-bar button {
  border: 0; background: none; cursor: pointer;
  color: #fff; font-size: .85rem; padding: 3px 7px; border-radius: 5px;
}
.chat-pilih-bar button:hover { background: rgba(255, 255, 255, .18); }
.chat-pilih-batal { font-size: 18px !important; line-height: 1; }
.chat-pilih-aksi { margin-left: auto; display: flex; gap: 2px; }

/* LEMBAR TERUSKAN. */
.chat-modal {
  position: fixed; inset: 0; z-index: 60;
  display: flex; align-items: center; justify-content: center;
  background: rgba(15, 23, 42, .42);
}
.chat-modal[hidden] { display: none; }
.chat-modal-kotak {
  width: min(420px, 92vw); max-height: 78vh;
  display: flex; flex-direction: column;
  background: var(--surface); border-radius: 12px;
  box-shadow: var(--shadow);
}
.chat-modal-kepala,
.chat-modal-kaki {
  display: flex; align-items: center; gap: 10px;
  padding: 11px 14px;
}
.chat-modal-kepala { border-bottom: 1px solid var(--line); }
.chat-modal-kaki { border-top: 1px solid var(--line); }
.chat-modal-kepala button {
  margin-left: auto; border: 0; background: none; cursor: pointer;
  font-size: 19px; line-height: 1; color: var(--muted);
}
.chat-modal-kaki .btn { margin-left: auto; }
.chat-modal-isi { flex: 1 1 auto; overflow-y: auto; padding: 6px; }
.chat-modal-baris {
  display: flex; align-items: center; gap: 9px;
  padding: 7px 9px; border-radius: 6px; cursor: pointer;
}
.chat-modal-baris:hover { background: var(--surface-2); }
.chat-modal-baris[hidden] { display: none; }

/* Kotak cari lembar Teruskan - 12 Okt 2026.
   -------------------------------------------------------------------
   Seluruh warnanya dari token: dua belas pasangan warna yang ditulis
   tangan adalah dua belas tempat yang harus diingat saat tema gelap
   digeser. Bentuknya menyamai kotak cari percakapan di bilah kiri -
   orang yang baru saja memakai yang itu sudah tahu yang ini apa. */
.chat-modal-cari {
  padding: 9px 12px 3px;
}
.chat-modal-cari input {
  width: 100%;
  box-sizing: border-box;
  padding: 7px 10px;
  font: inherit;
  font-size: 13.5px;
  color: var(--ink);
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: 8px;
}
.chat-modal-cari input::placeholder { color: var(--muted); }
.chat-modal-cari input:focus {
  outline: none;
  border-color: var(--accent);
  background: var(--surface);
}

/* Kalimat "tidak ada yang cocok" - rata tengah, tanpa ikon. Lembar
   sesempit ini tidak punya ruang untuk keadaan kosong yang bergambar. */
.chat-modal-kosong {
  margin: 14px 8px;
  text-align: center;
}

/* Pemetik mengikuti sisi gelembungnya, sama seperti menunya. */
.chat-saya .chat-pemetik { left: auto; right: 0; }

/* Daftar "Baca nanti" - satu baris = satu pesan yang ditandai. */
.nanti-daftar { list-style: none; margin: 0; padding: 0; }
.nanti-baris + .nanti-baris { border-top: 1px solid var(--line-soft); }
.nanti-baris a {
  display: grid; grid-template-columns: 1fr auto; gap: 2px 12px;
  padding: 9px 6px; text-decoration: none; color: inherit;
  border-radius: 6px;
}
.nanti-baris a:hover { background: var(--surface-2); }
.nanti-judul { font-weight: 700; font-size: .88rem; }
.nanti-isi {
  grid-column: 1; color: var(--muted); font-size: .84rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nanti-waktu { grid-column: 2; grid-row: 1; white-space: nowrap; }
/* Berdiri sendiri di bawah barisnya - selebar panel, tidak berebut
   tempat dengan kotak cari. */
.chat-nanti-tautan {
  display: block; margin-top: 7px; font-size: .8rem;
  color: var(--muted); text-decoration: none; white-space: nowrap;
}
.chat-nanti-tautan:hover { color: var(--accent); }

/* =====================================================================
   PESAN GAYA BITRIX24 - 29 September 2026
   ---------------------------------------------------------------------
   Rencana: docs/pesan_revisi_plan.md. Prototipe yang disetujui:
   https://claude.ai/artifact/JWYFLCegikfVuE746eY7U5
   Warna: biru palet aplikasi Flutter (lib/kerangka/palet.dart), BUKAN
   --accent tosca portal - keputusan pemilik projek 28 Sep. Gelembung
   sendiri hijau muda seperti Bitrix24 (29 Sep).

   Blok ini hanya MENIMPA aturan di atasnya. Menghapusnya mengembalikan
   tampilan lama; _backup_chat_20260929/ mengembalikan seluruh fitur.
   ===================================================================== */
body.halaman-pesan, .chat {
  --pb-grad-a: #12509B; --pb-grad-b: #1A63C4;
  --pb-av0: #1A63C4; --pb-av1: #2F6F4C; --pb-av2: #6B4A9E; --pb-av3: #A8501A;
  --pb-av4: #1F5F99; --pb-av5: #9E382B; --pb-av6: #4B6B1E; --pb-av7: #7A3F6B;
  --pb-pil: rgba(16, 28, 48, .42);
  --pb-biru: #1A63C4; --pb-biru-tua: #12509B;
  --pb-biru-w: #EEF5FF; --pb-biru-w2: #D7E6FF;
  --pb-latar: #E9F0FA; --pb-kartu: #FFFFFF;
  --pb-saya: #E0F2DF; --pb-lain: #FFFFFF;
  --pb-garis: #E3E9F2; --pb-garis2: #EEF2F8;
  --pb-tinta2: #33415C; --pb-redup: #5D6B82;
  --pb-kaca: rgba(255, 255, 255, .82);
}
.chat { gap: 10px; }
@media (prefers-color-scheme: dark) {
  body.halaman-pesan, .chat {
    --pb-biru: #5B9BEA; --pb-biru-tua: #2E63AE;
    --pb-biru-w: #15243A; --pb-biru-w2: #1D3354;
    --pb-latar: #0E1826; --pb-kartu: #131D2A;
    --pb-saya: #1B3526; --pb-lain: #17222F;
    --pb-garis: #243449; --pb-garis2: #1C2A3B;
    --pb-tinta2: #B8C6D8; --pb-redup: #94A3B8;
    --pb-kaca: rgba(23, 34, 47, .88);
  }
}

/* Bilah tab halaman pesan - gradien seperti kotak "Absen hari ini" di
   aplikasi. Kelas body.halaman-pesan dipasang layout.php, bukan pemilih
   induk "has" - uji_chat_tanpa_muat_ulang.php melarang bentuk itu di
   sekitar kerangka pesan (merusak tingginya 27 Sep 2026). */
body.halaman-pesan .subnav { background: linear-gradient(90deg, var(--pb-grad-a) 0%, var(--pb-grad-b) 100%); border-bottom: 0; }
body.halaman-pesan .subnav .sub-item {
  color: #fff; opacity: .88; border-bottom: 0;
  margin: 7px 0; padding: 6px 14px; border-radius: 10px;
}
body.halaman-pesan .subnav .sub-item:hover { opacity: 1; color: #fff; background: rgba(255, 255, 255, .12); }
body.halaman-pesan .subnav .sub-item.aktif { opacity: 1; color: #fff; background: rgba(255, 255, 255, .2); font-weight: 600; }
body.halaman-pesan .subnav .sub-panah,
body.halaman-pesan .subnav .sub-punya-turun .sub-induk.aktif + .sub-panah { color: #fff; border-bottom: 0; }

.chat-daftar, .chat-ruang { background: var(--pb-kartu); border-color: var(--pb-garis); border-radius: 12px; }

/* ---- daftar ---- */
.chat-list > li { border-bottom: 0; padding: 0 6px; }
.chat-list > li > a { gap: 12px; padding: 10px 12px; margin: 2px 0; border-radius: 10px; }
.chat-list > li > a:hover { background: var(--pb-biru-w); }
.chat-list > li.chat-aktif > a { background: var(--pb-biru); color: #fff; }
.chat-list > li.chat-aktif small,
.chat-list > li.chat-aktif .muted { color: #EEF5FF !important; }
.chat-list > li > a > .avatar { width: 48px; height: 48px; flex-basis: 48px; font-size: .95rem; }
.chat-list-atas > strong { font-size: .94rem; }
.chat-list-bawah { align-items: flex-start; }
.chat-list-bawah > small {
  white-space: normal; line-height: 1.35;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.chat-lencana {
  background: var(--pb-biru); min-width: 20px; height: 20px;
  line-height: 20px; border-radius: 10px; font-size: .72rem;
}
.chat-list > li.chat-aktif .chat-lencana { background: var(--pb-kartu); color: var(--pb-biru); }

/* Avatar tugas: inisial berwarna, 8 warna - putih di atas semuanya >= 4.5:1. */
.ot-av { color: #fff; font-weight: 600; }
.ot-av-0 { background: var(--pb-av0); } .ot-av-1 { background: var(--pb-av1); }
.ot-av-2 { background: var(--pb-av2); } .ot-av-3 { background: var(--pb-av3); }
.ot-av-4 { background: var(--pb-av4); } .ot-av-5 { background: var(--pb-av5); }
.ot-av-6 { background: var(--pb-av6); } .ot-av-7 { background: var(--pb-av7); }

/* ---- kepala ---- */
.chat-kepala {
  min-height: 64px; box-sizing: border-box; padding: 10px 16px;
  background: var(--pb-kartu); border-bottom-color: var(--pb-garis2);
}
.chat-kepala > .avatar { width: 42px; height: 42px; flex-basis: 42px; font-size: .85rem; }
.chat-kepala-teks > strong { font-size: 1rem; }
.ot-kepala-sub { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; white-space: normal !important; }
.ot-kepala-sub a { color: var(--pb-biru); font-weight: 600; text-decoration: none; }
.ot-kepala-sub a:hover { text-decoration: underline; }
.ot-tahap {
  padding: 1px 8px; border-radius: 10px;
  background: var(--warn-w); color: var(--warn); font-size: .72rem; font-weight: 600;
}

/* ---- aliran pesan ---- */
.chat-pesan { background: var(--pb-latar); }
.chat-gelembung {
  background: var(--pb-lain); border: 0;
  border-radius: 14px 14px 14px 4px;
  box-shadow: 0 1px 1px rgba(16, 28, 48, .08);
}
.chat-saya .chat-gelembung { background: var(--pb-saya); border-radius: 14px 14px 4px 14px; }
.chat-hari > span {
  padding: 3px 12px; border-radius: 12px;
  background: var(--pb-pil); color: #fff; font-weight: 600;
}
.chat-sistem > span { background: var(--pb-kaca); color: var(--pb-tinta2); }
.chat-sistem b { color: var(--pb-biru); }
.chat-baru-garis {
  align-self: stretch; margin: 8px -16px; padding: 6px 0;
  text-align: center; background: var(--pb-kaca);
  color: var(--pb-tinta2); font-size: .8rem; font-weight: 600;
}

/* ---- penyusun ---- */
.chat-tulis { background: var(--pb-latar); border-top: 0; padding: 10px 16px 14px; }
.chat-tulis textarea { background: var(--pb-kartu); border-color: var(--pb-garis); border-radius: 16px; }
.chat-tulis textarea:focus { border-color: var(--pb-biru); outline: 2px solid var(--pb-biru-w2); outline-offset: 0; }
.chat-tulis button[type=submit] {
  min-width: 44px; height: 44px; border-radius: 22px;
  background: var(--pb-biru); border-color: var(--pb-biru); color: #fff;
}

/* Sedang berpindah percakapan (bukaRuangLunak). */
.chat-ruang.chat-memuat { opacity: .55; pointer-events: none; transition: opacity .12s; }

/* ---- kepala: panggilan, tambah orang, cari (29 Sep 2026) ---- */
.pb-alat { display: inline-flex; align-items: center; gap: 4px; margin-right: 6px; }
.pb-panggil { position: relative; display: inline-flex; height: 34px; border-radius: 17px; overflow: visible; margin: 0 4px 0 0; }
.pb-panggil-utama, .pb-panggil-panah {
  border: 0; cursor: pointer; color: #fff; background: var(--pb-biru);
  display: inline-flex; align-items: center; justify-content: center;
}
.pb-panggil-utama { width: 46px; border-radius: 17px 0 0 17px; }
.pb-panggil-panah { width: 30px; border-radius: 0 17px 17px 0; border-left: 1px solid var(--pb-kaca); }
.pb-panggil-utama:hover, .pb-panggil-panah:hover { background: var(--pb-biru-tua); }
.pb-panggil-utama svg { width: 18px; height: 18px; }
.pb-panggil-panah svg { width: 12px; height: 12px; }
.pb-panggil-menu {
  position: absolute; z-index: 50; top: calc(100% + 6px); right: 0;
  min-width: 210px; padding: 6px 0;
  background: var(--pb-kartu); border: 1px solid var(--pb-garis); border-radius: 14px;
  box-shadow: var(--shadow);
}
.pb-panggil-menu[hidden] { display: none; }
.pb-panggil-menu button {
  width: 100%; display: flex; align-items: center; gap: 12px; padding: 9px 16px;
  border: 0; background: transparent; color: var(--ink); font: inherit; font-size: .9rem;
  text-align: left; cursor: pointer;
}
.pb-panggil-menu button:hover { background: var(--pb-biru-w); }
.pb-panggil-menu svg { width: 18px; height: 18px; color: var(--pb-biru); flex: 0 0 auto; }

.pb-ikon {
  width: 36px; height: 36px; border: 0; border-radius: 18px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; color: var(--pb-redup); cursor: pointer; text-decoration: none;
}
.pb-ikon:hover, .pb-ikon.aktif { background: var(--pb-biru-w); color: var(--pb-biru); }
.pb-ikon svg { width: 20px; height: 20px; }

/* bilah cari di bawah kepala */
.pb-cari { flex: 0 0 auto; padding: 8px 16px 10px; background: var(--pb-kartu); border-bottom: 1px solid var(--pb-garis2); }
.pb-cari[hidden] { display: none; }
.pb-cari-kotak {
  display: flex; align-items: center; gap: 8px; height: 38px; padding: 0 6px 0 12px;
  background: var(--pb-latar); border-radius: 19px; color: var(--pb-redup);
}
.pb-cari-kotak svg { width: 16px; height: 16px; flex: 0 0 auto; }
.pb-cari-kotak input { flex: 1 1 auto; min-width: 0; border: 0; background: transparent; color: var(--ink); font: inherit; font-size: .9rem; outline: none; }
.pb-cari-tutup { width: 28px; height: 28px; border: 0; border-radius: 14px; background: transparent; color: var(--pb-redup); font-size: 1.1rem; cursor: pointer; }
.pb-cari-tutup:hover { background: var(--pb-biru-w2); }
.pb-cari-ket { margin: 6px 4px 0; }
.pb-cari-ket:empty { display: none; }
.pb-cari-hasil { list-style: none; margin: 4px 0 0; padding: 0; max-height: 40vh; overflow-y: auto; }
.pb-cari-hasil a { display: block; padding: 8px 10px; border-radius: 10px; color: inherit; text-decoration: none; }
.pb-cari-hasil a:hover { background: var(--pb-biru-w); }
.pb-cari-atas { display: flex; gap: 8px; align-items: baseline; font-size: .8rem; }
.pb-cari-atas time { color: var(--pb-redup); font-size: .74rem; }
.pb-cari-isi { display: block; font-size: .86rem; color: var(--pb-tinta2); }
.pb-cari-isi mark { background: var(--pb-biru-w2); color: inherit; padding: 0 1px; border-radius: 2px; }

/* ---- kotak ketik gaya Bitrix24 (29 Sep 2026) ---- */
.chat-tulis.pb-tulis { display: block; padding: 10px 16px 14px; background: var(--pb-latar); border-top: 0; }
.pb-tulis-kartu {
  position: relative; display: flex; flex-direction: column; gap: 2px;
  padding: 8px 10px 8px 8px; background: var(--pb-kartu);
  border: 1px solid var(--pb-garis); border-radius: 16px;
}
.pb-tulis-kartu:focus-within { border-color: var(--pb-biru); }
.pb-tulis-atas { display: flex; align-items: flex-start; gap: 4px; }
.chat-tulis.pb-tulis textarea {
  flex: 1 1 auto; min-width: 0; min-height: 44px; max-height: 140px;
  padding: 6px 4px; border: 0; border-radius: 0; background: transparent;
  color: var(--ink); resize: none; outline: none;
}
.chat-tulis.pb-tulis textarea:focus { outline: none; border: 0; }
.pb-tulis-bawah { display: flex; align-items: center; justify-content: flex-end; gap: 4px; }
.pb-klip { position: relative; overflow: hidden; }
.pb-klip-input { position: absolute; inset: 0; opacity: 0; cursor: pointer; font-size: 0; }
.pb-klip:focus-within { outline: 2px solid var(--pb-biru-w2); }
.pb-kirim {
  width: 44px; height: 44px; flex: 0 0 44px; border: 0; border-radius: 22px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pb-biru); color: #fff; cursor: pointer;
}
.pb-kirim:hover { background: var(--pb-biru-tua); }
.pb-kirim:disabled { opacity: .5; cursor: default; }
.pb-kirim svg { width: 20px; height: 20px; }
.pb-tersembunyi { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ---- pemilih "@" sebut anggota (13 Okt 2026) ----
   Melayang DI ATAS kartu ketik, bukan di bawahnya: kotak tulis duduk di
   dasar layar, dan panel yang membuka ke bawah akan keluar dari jendela.
   Induknya .pb-tulis-kartu yang sudah position:relative. */
.sebut-panel {
  position: absolute; left: 0; right: 0; bottom: calc(100% + 8px);
  z-index: 40; max-height: 236px; overflow-y: auto; padding: 4px;
  background: var(--pb-kartu); border: 1px solid var(--pb-garis);
  border-radius: 14px; box-shadow: 0 10px 28px rgba(16, 28, 48, .16);
}
.sebut-baris {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 6px 8px; border: 0; border-radius: 10px;
  background: transparent; cursor: pointer; text-align: left;
}
.sebut-baris:hover,
.sebut-baris.aktif { background: var(--pb-biru-w2); }
.sebut-av {
  width: 28px; height: 28px; flex: 0 0 28px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pb-biru); color: #fff; font-size: .7rem; font-weight: 600;
}
.sebut-teks { display: flex; flex-direction: column; min-width: 0; }
.sebut-nama {
  font-size: .88rem; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sebut-jabatan {
  font-size: .76rem; color: var(--pb-tinta2);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* pemetik emoji */
.pb-emoji {
  position: absolute; z-index: 45; right: 8px; bottom: calc(100% + 6px);
  width: 312px; max-height: 220px; overflow-y: auto; padding: 8px;
  display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 2px;
  background: var(--pb-kartu); border: 1px solid var(--pb-garis); border-radius: 14px; box-shadow: var(--shadow);
}
.pb-emoji[hidden] { display: none; }
.pb-emoji button { height: 36px; border: 0; border-radius: 10px; background: transparent; font-size: 1.3rem; cursor: pointer; }
.pb-emoji button:hover { background: var(--pb-biru-w); }

/* seret berkas ke obrolan */
.chat-ruang.pb-seret { outline: 2px dashed var(--pb-biru); outline-offset: -6px; }

/* jendela lampiran "Terpilih: N" */
.pb-lampir {
  position: fixed; inset: 0; z-index: 2500; display: flex; align-items: center; justify-content: center;
  padding: 16px; background: var(--pb-pil);
}
.pb-lampir[hidden] { display: none; }
.pb-lampir-kotak {
  position: relative; width: 440px; max-width: 100%; max-height: calc(100vh - 32px);
  display: flex; flex-direction: column; padding: 20px 18px 16px;
  background: var(--pb-kartu); border-radius: 18px; box-shadow: var(--shadow);
}
.pb-lampir-tutup {
  position: absolute; top: 10px; right: 10px; width: 36px; height: 36px; border: 0; border-radius: 18px;
  background: transparent; color: var(--pb-redup); font-size: 1.4rem; cursor: pointer;
}
.pb-lampir-tutup:hover { background: var(--pb-biru-w); }
.pb-lampir-judul { margin: 0 0 14px; text-align: center; font-size: 1.05rem; font-weight: 600; }
.pb-lampir-daftar { list-style: none; margin: 0; padding: 0; overflow-y: auto; flex: 1 1 auto; }
.pb-lampir-daftar li { display: flex; align-items: center; gap: 12px; padding: 8px 4px; }
.pb-lampir-ikon {
  width: 40px; height: 48px; flex: 0 0 40px; border-radius: 6px; object-fit: cover;
  display: flex; align-items: flex-end; justify-content: center; padding-bottom: 5px; box-sizing: border-box;
  background: var(--pb-av4); color: #fff; font-size: .62rem; font-weight: 700;
}
.pb-jenis-pdf { background: var(--pb-av5); } .pb-jenis-xls, .pb-jenis-csv { background: var(--pb-av1); }
.pb-jenis-ppt { background: var(--pb-av3); } .pb-jenis-zip, .pb-jenis-rar, .pb-jenis-7z { background: var(--pb-av2); }
.pb-jenis-txt, .pb-jenis-rtf { background: var(--pb-redup); }
.pb-lampir-nama { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.pb-lampir-nama b { font-size: .92rem; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pb-lampir-nama small { font-size: .78rem; color: var(--pb-redup); }
.pb-lampir-buang { width: 30px; height: 30px; border: 0; border-radius: 15px; background: transparent; color: var(--pb-redup); font-size: 1.1rem; cursor: pointer; }
.pb-lampir-buang:hover { background: var(--pb-biru-w); color: var(--crit); }
.pb-lampir-peringatan { margin: 8px 4px 0; font-size: .82rem; color: var(--pb-tinta2); }
.pb-lampir-bawah { display: flex; align-items: flex-end; gap: 10px; margin-top: 14px; }
.pb-lampir-teks { flex: 1 1 auto; display: flex; }
.pb-lampir-teks textarea {
  flex: 1 1 auto; min-height: 56px; max-height: 140px; resize: vertical;
  padding: 10px 12px; border: 1px solid var(--pb-garis); border-radius: 12px;
  background: var(--pb-kartu); color: var(--ink); font: inherit; font-size: .9rem;
}
.pb-lampir-teks textarea:focus { outline: none; border-color: var(--pb-biru); }

/* Daftar percakapan TERKUNCI rata kiri (29 Sep 2026). .chat-list memakai
   direction: rtl untuk memindah batang gulir ke kiri; setiap <li>
   dikembalikan ke ltr. Di satu peramban pengguna barisnya tetap tampil
   rata kanan - arah & perataannya kini ditulis eksplisit di setiap lapis,
   dan kata tanpa spasi (token, tautan) boleh patah supaya tidak
   melebarkan baris. */
.chat-daftar .chat-list > li > a,
.chat-list-teks, .chat-list-atas, .chat-list-bawah { direction: ltr; text-align: left; }
.chat-list-teks { flex: 1 1 0; width: 0; }
.chat-list-bawah > small { overflow-wrap: anywhere; word-break: break-word; }

/* =====================================================================
   TAHAP 2 - hover pesan, menu, pemetik, sematan 1/N, panel (29 Sep 2026)
   ===================================================================== */

/* Tombol hover: bulat, bertumpuk, di luar gelembung - titik tiga di
   atas, jempol di bawah (urutan lewat `order`, markup tidak berubah). */
.chat-alat { flex-direction: column; gap: 6px; align-self: center; }
.chat-alat-tombol {
  width: 30px; height: 30px; border-radius: 15px;
  background: var(--pb-kartu); color: var(--pb-redup);
  box-shadow: 0 1px 2px rgba(16, 28, 48, .18);
}
.chat-alat-tombol[data-menu] { order: -1; }
.chat-alat-tombol svg { width: 16px; height: 16px; }
.chat-alat-tombol:hover { background: var(--pb-biru-w); color: var(--pb-biru); }

/* Menu titik tiga gaya Bitrix24: label di kiri, ikon di kanan. */
.chat-menu {
  min-width: 240px; padding: 8px 0; border-radius: 16px;
  background: var(--pb-kartu); border-color: var(--pb-garis);
}
.chat-menu-butir {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 9px 18px; border-radius: 0; font-size: .93rem;
}
.chat-menu-butir:hover { background: var(--pb-biru-w); }
.chat-menu-butir::after,
.chat-menu-butir.punya-anak::after {
  content: ''; float: none; flex: 0 0 18px; width: 18px; height: 18px;
  background: currentColor; opacity: .45;
  -webkit-mask: var(--pb-ikon) center / contain no-repeat;
          mask: var(--pb-ikon) center / contain no-repeat;
}
.chat-menu-butir.bahaya::after { opacity: .9; }
.chat-menu-butir[data-aksi="pilih"] { margin-top: 6px; padding-top: 12px; border-top: 1px solid var(--pb-garis2); }
.chat-menu-butir[data-aksi="balas"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 14L4 9l5-5M4 9h10a6 6 0 0 1 6 6v5'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="salin"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 9h11v11H9zM5 15H4V4h11v1'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="teruskan"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 5l6 6-6 6M21 11H10a7 7 0 0 0-7 7v1'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="sunting"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h4L19 9l-4-4L4 16zM13 7l4 4'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="lainnya"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="kembali"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 6l-6 6 6 6'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="pilih"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM8 12l3 3 5-6'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="hapus"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="semat"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 4h6l-1 6 4 3H6l4-3zM12 13v7'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="tautan"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1'/%3E%3C/svg%3E"); }
.chat-menu-butir[data-aksi="nanti"] { --pb-ikon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 4h12v17l-6-4-6 4z'/%3E%3C/svg%3E"); }

/* Pemetik reaksi: baris enam reaksi cepat, daftar lengkap sesudah panah. */
.chat-pemetik {
  flex-wrap: nowrap; max-width: none; gap: 2px; padding: 6px 8px;
  border-radius: 24px; background: var(--pb-kartu); border-color: var(--pb-garis);
}
.chat-pemetik button { width: 40px; height: 40px; border-radius: 20px; font-size: 24px; }
.chat-pemetik button:hover { background: var(--pb-biru-w); }
.chat-pemetik button.lagi {
  width: 34px; height: 34px; align-self: center; margin-left: 4px;
  background: var(--pb-garis2); color: var(--pb-redup); font-size: 13px;
}
.chat-pemetik.chat-pemetik-penuh {
  flex-wrap: wrap; width: 320px; max-height: 240px; overflow-y: auto; border-radius: 18px;
}
.chat-pemetik.chat-pemetik-penuh button { width: 36px; height: 36px; font-size: 21px; }
.chat-pemetik.chat-pemetik-penuh button.lagi { margin: 0 0 4px; flex-basis: 100%; height: 26px; border-radius: 13px; }

/* Bilah sematan 1/N */
.pb-pin-urut {
  display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto;
  height: 34px; padding: 0 10px; margin-right: 4px;
  border: 1px solid var(--pb-garis); border-radius: 10px;
  background: var(--pb-kartu); color: var(--pb-tinta2); font: inherit; font-size: .78rem; cursor: pointer;
}
.pb-pin-urut:hover { background: var(--pb-biru-w); }
.pb-pin-urut svg { width: 14px; height: 14px; }

/* Panel "Tentang obrolan" - kolom kanan di dalam ruang obrolan. */
.chat-ruang { position: relative; }
.chat-ruang.pb-panel-buka { padding-right: 360px; }
.pb-panel {
  position: absolute; top: 0; right: 0; bottom: 0; width: 360px; z-index: 5;
  display: flex; flex-direction: column; background: var(--pb-latar);
  border-left: 1px solid var(--pb-garis);
}
.pb-panel-kepala {
  flex: 0 0 auto; display: flex; align-items: center; gap: 8px; height: 64px; box-sizing: border-box;
  padding: 0 12px 0 8px; background: var(--pb-kartu); border-bottom: 1px solid var(--pb-garis2);
}
.pb-panel-kepala h2 { margin: 0; font-size: 1.05rem; font-weight: 600; }
.pb-panel-isi { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 8px; }
.pb-kartu { background: var(--pb-kartu); border-radius: 12px; padding: 12px 14px; }
.pb-kartu h3 { margin: 0 0 8px; font-size: .95rem; font-weight: 600; display: flex; justify-content: space-between; }
.pb-kartu h3 small { color: var(--pb-redup); font-weight: 400; }
.pb-profil { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 20px 14px 16px; text-align: center; }
.pb-profil-av .avatar { width: 88px; height: 88px; flex-basis: 88px; font-size: 1.6rem; }
.pb-profil-nama { font-size: 1.05rem; margin-top: 6px; }
.pb-profil-sub { color: var(--pb-redup); font-size: .82rem; white-space: normal; }
.pb-pil {
  margin-top: 8px; height: 28px; padding: 0 12px; border: 0; border-radius: 14px;
  display: inline-flex; align-items: center;
  background: var(--pb-biru-w); color: var(--pb-biru); font: inherit; font-size: .82rem; font-weight: 600;
  text-decoration: none; cursor: pointer;
}
.pb-pil:hover { background: var(--pb-biru-w2); }
.pb-info-baris { display: flex; justify-content: space-between; gap: 12px; padding: 7px 0; border-bottom: 1px solid var(--pb-garis2); font-size: .85rem; }
.pb-info-baris span { color: var(--pb-redup); }
.pb-info-baris b { font-weight: 600; text-align: right; overflow-wrap: anywhere; }
.pb-baris {
  width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 9px 0;
  border: 0; background: transparent; color: var(--pb-biru); font: inherit; font-size: .88rem; font-weight: 600;
  text-decoration: none; cursor: pointer; text-align: left;
}
.pb-angka {
  min-width: 22px; height: 20px; padding: 0 7px; box-sizing: border-box; border-radius: 10px;
  background: var(--pb-garis2); color: var(--pb-tinta2); font-size: .74rem; line-height: 20px; text-align: center;
}
.pb-orang { list-style: none; margin: 0; padding: 0; }
.pb-orang li { display: flex; align-items: center; gap: 10px; padding: 6px 0; }
.pb-orang .avatar { width: 32px; height: 32px; flex-basis: 32px; font-size: .72rem; }
.pb-orang-nama { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; font-size: .88rem; }
.pb-orang-nama small { color: var(--pb-redup); font-size: .74rem; }
.pb-peran { font-size: .72rem; color: var(--pb-redup); }
.pb-ubin { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.pb-ubin-butir { display: flex; flex-direction: column; align-items: center; gap: 6px; color: inherit; text-decoration: none; font-size: .74rem; text-align: center; }
.pb-ubin-butir img, .pb-ubin-butir .pb-lampir-ikon { width: 100%; height: 64px; border-radius: 10px; object-fit: cover; }
.pb-ubin-butir > span:last-child { width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pb-ubin-belum { opacity: .6; }
.pb-rapat { list-style: none; margin: 0; padding: 0; }
.pb-rapat a { display: flex; flex-direction: column; padding: 7px 0; color: inherit; text-decoration: none; border-bottom: 1px solid var(--pb-garis2); }
.pb-rapat a:hover b { color: var(--pb-biru); }
.pb-rapat small { color: var(--pb-redup); font-size: .76rem; }
.pb-berlangsung { color: var(--ok); font-weight: 600; }
.pb-kosong { margin: 4px 0; color: var(--pb-redup); font-size: .84rem; }
.pb-panel > .pb-kosong { padding: 16px; }
@media (max-width: 1100px) {
  .chat-ruang.pb-panel-buka { padding-right: 0; }
  .pb-panel { width: 100%; }
}

/* =====================================================================
   TAHAP 3 - daring, centang, "Dilihat", bisukan (29 Sep 2026)
   ===================================================================== */
.pb-av-wadah { position: relative; display: inline-flex; flex: 0 0 auto; }
.chat-list .pb-av-wadah > .avatar { width: 48px; height: 48px; flex-basis: 48px; font-size: .95rem; }
.pb-titik-daring {
  position: absolute; right: 1px; bottom: 1px; width: 12px; height: 12px; border-radius: 6px;
  background: var(--ok); border: 2px solid var(--pb-kartu);
}
.chat-list > li.chat-aktif .pb-titik-daring { border-color: var(--pb-biru); }
.pb-bisu { width: 14px; height: 14px; flex: 0 0 14px; color: var(--pb-redup); }
.chat-list > li.chat-aktif .pb-bisu { color: #fff; }
.pb-status { margin-left: 8px; font-size: .8rem; font-weight: 400; font-style: italic; color: var(--pb-redup); }
.pb-status.daring { color: var(--ok); }
/* centang: ruang di kanan jam pada pesan sendiri */
.chat-saya .chat-gelembung { padding-right: 64px; }
.chat-saya .chat-gelembung.disunting { padding-right: 110px; }
.chat-saya .chat-jam { right: 26px; }
.pb-centang { position: absolute; right: 8px; bottom: 4px; display: inline-flex; color: var(--pb-redup); }
.pb-centang svg { width: 15px; height: 15px; }
/* DUA centang sejak terkirim, biru begitu dibaca - 22 Okt 2026.
   Sebelumnya centang kedua disembunyikan sampai dibaca, jadi
   terkirim tergambar satu centang. Diubah atas keputusan pemilik
   projek, dan sengaja untuk KEDUA halaman (Percakapan dan obrolan
   tugas): ikon yang sama persis tidak boleh punya dua arti.
   Bentuk SVG-nya sudah memuat kedua goresnya di tiga tempat ia
   digambar - chat.php, chat_tugas.php, dan gambarPesan() di
   app.js - jadi yang berubah hanya gaya ini. */
.pb-centang.dibaca { color: var(--pb-biru); }
/* Keterangan arti jam di panel "sudah/belum membaca" - 23 Okt 2026.
   Dipakai BERSAMA oleh Percakapan dan obrolan tugas; panelnya memang
   satu. */
.pbd-pop .pbd-ket { padding: 2px 12px 8px; font-size: 11px; color: var(--pb-redup); }
.pb-dilihat {
  align-self: flex-end; margin: 2px 0 6px; padding: 3px 10px; border-radius: 11px;
  background: var(--pb-pil); color: #fff; font-size: .74rem;
}
/* sakelar suara di panel */
.pb-sakelar-baris { align-self: stretch; display: flex; align-items: center; justify-content: space-between; margin-top: 12px; font-size: .88rem; font-weight: 600; color: var(--pb-biru); }
.pb-sakelar {
  position: relative; width: 38px; height: 22px; flex: 0 0 38px; padding: 0; border: 0; border-radius: 11px;
  background: var(--pb-garis); cursor: pointer;
}
.pb-sakelar span {
  position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 8px;
  background: var(--pb-kartu); box-shadow: 0 1px 2px rgba(16, 28, 48, .3); transition: left .12s;
}
.pb-sakelar[aria-checked="true"] { background: var(--pb-biru); }
.pb-sakelar[aria-checked="true"] span { left: 19px; }
.pb-sakelar:disabled { opacity: .6; }

/* =====================================================================
   PANEL ANGGOTA - "N anggota" di kepala obrolan tugas (29 Sep 2026)
   ===================================================================== */
.ot-anggota {
  padding: 0; border: 0; background: transparent; font: inherit; cursor: pointer;
  color: var(--pb-biru); font-weight: 600;
}
.ot-anggota:hover, .ot-anggota[aria-expanded="true"] { text-decoration: underline; }
.pb-panel-alat { margin-left: auto; display: inline-flex; gap: 2px; }
.pb-anggota-cari { flex: 0 0 auto; padding: 8px 12px; background: var(--pb-kartu); border-bottom: 1px solid var(--pb-garis2); }
.pb-anggota-cari[hidden] { display: none; }
.pb-anggota-cari input {
  width: 100%; box-sizing: border-box; height: 34px; padding: 0 12px;
  border: 1px solid var(--pb-garis); border-radius: 17px; background: var(--pb-latar); color: inherit; font: inherit; font-size: .88rem;
}
.pb-anggota-isi { background: var(--pb-kartu); gap: 0; padding: 14px 0 8px; }
.pb-salin {
  align-self: center; gap: 6px; margin: 0 0 10px; background: transparent;
  border: 1px solid var(--pb-biru); color: var(--pb-biru);
}
.pb-salin svg { width: 14px; height: 14px; }
.pb-salin.tersalin { background: var(--pb-biru-w); }
.pb-anggota { list-style: none; margin: 0; padding: 0; }
.pb-anggota > li { display: flex; align-items: center; gap: 12px; margin: 0 16px; padding: 10px 0; border-bottom: 1px solid var(--pb-garis2); }
.pb-anggota > li[hidden] { display: none; }
.pb-anggota-av { position: relative; flex: 0 0 auto; display: inline-flex; }
.pb-anggota-av > .avatar { width: 44px; height: 44px; flex-basis: 44px; font-size: .9rem; }
.pb-mahkota { position: absolute; top: -4px; right: -4px; width: 16px; height: 16px; color: #f5a623; filter: drop-shadow(0 0 1px #fff); }
.pb-anggota-teks { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pb-anggota-teks b { font-weight: 600; font-size: .94rem; overflow-wrap: anywhere; }
.pb-anggota-teks i { font-weight: 400; color: var(--pb-redup); }
.pb-anggota-teks small { color: var(--pb-redup); font-size: .8rem; }
.pb-anggota-nihil[hidden] { display: none; }
.pb-anggota-nihil { padding: 12px 16px; }

/* ---- panggilan: tombol di penyusun & kartu riwayat (30 Sep 2026) ----
   Tombol telepon/video di kiri emoji (app/Views/chat.php); kartu digambar
   app/Panggilan.php untuk pesan "Memulai panggilan ..." dan
   "Panggilan ... selesai". */
.pb-panggil-ikon { color: var(--pb-biru); }
.pb-panggil-ikon svg { width: 20px; height: 20px; }
.pb-panggil-ikon:hover { background: var(--pb-biru-w); }

.pc-kartu {
  display: flex; align-items: center; gap: 12px;
  min-width: 230px; max-width: 340px; padding: 4px 2px 14px 0;
}
.pc-ikon {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: 20px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pb-biru-w); color: var(--pb-biru);
}
.pc-ikon svg { width: 20px; height: 20px; }
.pc-hidup .pc-ikon { background: var(--pb-biru); color: #fff; animation: pc-denyut 1.6s ease-in-out infinite; }
.pc-tak .pc-ikon { background: var(--crit-w); color: var(--crit); }
.pc-teks { flex: 1 1 auto; display: flex; flex-direction: column; min-width: 0; }
.pc-teks b { font-weight: 600; font-size: .92rem; }
.pc-teks small { color: var(--pb-redup); font-size: .8rem; }
.pc-tak .pc-teks small { color: var(--crit); }
.pc-lagi { margin: 0; display: inline; }
.pc-tombol {
  flex: 0 0 auto; border: 0; border-radius: 14px; padding: 5px 12px;
  background: var(--pb-biru); color: #fff; font: inherit; font-size: .8rem; font-weight: 600;
  cursor: pointer; text-decoration: none; white-space: nowrap;
}
.pc-tombol:hover { background: var(--pb-biru-tua); color: #fff; }
.pc-tombol-lagi { background: transparent; color: var(--pb-biru); border: 1px solid var(--pb-biru); }
.pc-tombol-lagi:hover { background: var(--pb-biru-w); color: var(--pb-biru); }
@keyframes pc-denyut { 0%, 100% { box-shadow: 0 0 0 0 var(--pb-biru-w2); } 50% { box-shadow: 0 0 0 6px var(--pb-biru-w2); } }
@media (prefers-reduced-motion: reduce) { .pc-hidup .pc-ikon { animation: none; } }

/* Balon [data-pop] - status daring yang terpotong di kepala obrolan (30 Sep 2026). */
.pb-status[data-pop] { cursor: help; }
.pb-pop {
  position: fixed; z-index: 9999; max-width: 320px; padding: 6px 10px;
  background: var(--pb-kartu); color: var(--ink); border: 1px solid var(--pb-garis);
  border-radius: 8px; box-shadow: var(--shadow); font-size: .82rem; line-height: 1.35;
  pointer-events: none; white-space: normal;
}

/* Panel "+ Percakapan baru": tombol x dan Batal (30 Sep 2026). */
.chat-baru-isi { padding-top: 30px; }
.cb-tutup {
  position: absolute; top: 4px; right: 6px; width: 26px; height: 26px;
  border: 0; border-radius: 13px; background: transparent; color: var(--pb-redup, var(--muted));
  font-size: 1.2rem; line-height: 1; cursor: pointer;
}
.cb-tutup:hover { background: var(--pb-kaca, rgba(127,127,127,.15)); color: var(--ink); }
.cb-aksi { display: flex; gap: 8px; }
.cb-aksi .btn { flex: 1 1 0; }

/* Tombol panggilan di kepala + kotak pilihan Suara/Video/Batal
   (30 Sep 2026, gaya WhatsApp). */
.pb-panggil-buka {
  height: 34px; padding: 0 8px 0 10px; margin-right: 4px; border: 0; border-radius: 17px;
  display: inline-flex; align-items: center; gap: 2px; cursor: pointer;
  /* Diisi biru penuh (1 Okt 2026, permintaan pemilik projek): ikon abu
     tipis tenggelam di antara ikon kepala lain. Warnanya sama dengan
     tombol Kirim, jadi terbaca sebagai tombol aksi utama. */
  background: var(--pb-biru); color: #fff;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .25);
}
.pb-panggil-buka svg { width: 20px; height: 20px; }
.pb-panggil-buka .pb-panah { width: 16px; height: 16px; }
.pb-panggil-buka:hover, .pb-panggil-buka[aria-expanded="true"] { background: var(--pb-biru-tua); color: #fff; }
.pb-panggil-buka:focus-visible { outline: 2px solid var(--pb-biru-w2); outline-offset: 2px; }
.pb-konfirm {
  position: fixed; z-index: 9999; width: 340px; max-width: calc(100vw - 16px); padding: 16px;
  background: var(--pb-kartu); color: var(--ink); border: 1px solid var(--pb-garis);
  border-radius: 16px; box-shadow: var(--shadow);
}
.pb-konfirm-kepala { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.pb-konfirm-av {
  flex: 0 0 auto; width: 42px; height: 42px; border-radius: 21px; overflow: hidden;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pb-biru-w); color: var(--pb-biru); font-weight: 600;
}
.pb-konfirm-av img { width: 100%; height: 100%; object-fit: cover; }
.pb-konfirm-av svg { width: 22px; height: 22px; }
.pb-konfirm-nama { display: flex; flex-direction: column; min-width: 0; }
.pb-konfirm-nama b { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pb-konfirm-nama small { color: var(--pb-redup); font-size: .8rem; }
.pb-konfirm-aksi { display: flex; gap: 10px; }
.pb-konfirm-mode {
  flex: 1 1 0; height: 40px; border: 0; border-radius: 20px; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  background: var(--pb-biru); color: #fff; font: inherit; font-weight: 600; font-size: .92rem;
}
.pb-konfirm-mode:hover, .pb-konfirm-mode:focus-visible { background: var(--pb-biru-tua); }
.pb-konfirm-mode svg { width: 18px; height: 18px; }
.pb-konfirm-batal {
  width: 100%; margin-top: 12px; padding: 10px 4px 0; border: 0; border-top: 1px solid var(--pb-garis);
  display: flex; align-items: center; gap: 10px; background: transparent; cursor: pointer;
  color: var(--pb-redup); font: inherit; font-size: .9rem; text-align: left;
}
.pb-konfirm-batal:hover { color: var(--ink); }
.pb-konfirm-batal svg { width: 18px; height: 18px; }

/* =====================================================================
   HALAMAN RAPAT (Pesan -> Online) - nuansa warna sama dengan Pesan
   (1 Okt 2026, permintaan pemilik projek). layout.php memasang
   body.halaman-pesan + body.halaman-rapat untuk rute rapat*, jadi bilah
   tab biru dan token --pb-* ikut. Di sini token dasar portal dipetakan
   ke token --pb-* HANYA di dalam isi halaman rapat: panel .kotak,
   tabel, tag dan tombol utama ikut biru-navy tanpa menyunting satu pun
   aturan komponen. Sidebar & bilah atas tidak tersentuh.
   2 Okt 2026: body.halaman-biru memakai pemetaan yang sama untuk SELURUH
   seksi Karyawan (Menu::seksiAktif = 'karyawan') - permintaan pemilik
   projek: warnanya seperti Pesan -> Task Chats.
   Hari yang sama diperluas ke SEMUA menu (layout.php memasangnya di
   setiap halaman).
   ===================================================================== */
body.halaman-rapat main.page,
body.halaman-biru main.page {
  --ground: var(--pb-latar);
  --surface: var(--pb-kartu);
  --surface-2: var(--pb-biru-w);
  --surface-3: var(--pb-garis2);
  --line: var(--pb-garis);
  --line-soft: var(--pb-garis2);
  --accent: var(--pb-biru);
  --accent-2: var(--pb-biru-tua);
  --accent-w: var(--pb-biru-w);
  --muted: var(--pb-redup);
  --ink-soft: var(--pb-tinta2);
}
body.halaman-rapat main.page .kotak,
body.halaman-rapat main.page .tbl-wrap,
body.halaman-biru main.page .kotak,
body.halaman-biru main.page .tbl-wrap { border-radius: 12px; }
body.halaman-rapat main.page .tbl thead th,
body.halaman-biru main.page .tbl thead th { background: var(--pb-biru-w); color: var(--pb-tinta2); }
body.halaman-rapat main.page .btn-primary,
body.halaman-biru main.page .btn-primary { border-radius: 8px; }

/* =====================================================================
   RINGKASAN CUTI - karyawan/cuti/ringkasan (1 Okt 2026)
   Matriks orang x tanggal. Tiga warna dari contoh pemilik projek:
   cuti hijau tua, ijin kuning, sakit biru. Di setiap sel tetap ada
   title (jenisnya ditulis) - warna saja tidak cukup bagi yang sulit
   membedakan warna.
   ===================================================================== */
.rc-bar { align-items: center; }
.rc-legenda { display: inline-flex; gap: 14px; margin-right: 8px; flex-wrap: wrap; }
.rc-leg { display: inline-flex; align-items: center; gap: 6px; font-size: .85rem; }
.rc-leg b { font-weight: 600; color: var(--muted); }
.rc-leg .rc-sel { display: inline-block; width: 22px; height: 14px; border-radius: 3px; border: 1px solid var(--line); }
.rc-bulan { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 12px; }
.rc-judul { font-size: 1.05rem; margin: 0 8px; }
.rc-wrap { margin: 0 12px 12px; }
.rc-tabel { font-size: .8rem; width: auto; min-width: 100%; }
.rc-tabel th, .rc-tabel td { padding: 4px 6px; border: 1px solid var(--line-soft); vertical-align: middle; }
.rc-tabel .rc-kiri { white-space: nowrap; max-width: 180px; overflow: hidden; text-overflow: ellipsis; }
.rc-tabel .rc-nama { min-width: 150px; }
.rc-tabel .rc-nama a { font-weight: 500; }
.rc-tabel th.rc-hari { width: 24px; min-width: 24px; padding: 3px 0; text-align: center; font-weight: 600; }
.rc-tabel th.rc-hari small { display: block; font-weight: 400; color: var(--muted); font-size: .66rem; }
.rc-tabel td.rc-sel { width: 24px; min-width: 24px; height: 22px; padding: 0; }
.rc-tabel .rc-minggu, .rc-tabel .rc-libur { background: var(--crit-w); }
.rc-tabel th.rc-libur { color: var(--crit); }
.rc-tabel th.rc-hariini { outline: 2px solid var(--accent); outline-offset: -2px; }
.rc-tabel td.rc-cuti,  .rc-leg .rc-cuti  { background: #1E5631; }
.rc-tabel td.rc-ijin,  .rc-leg .rc-ijin  { background: #F2C200; }
.rc-tabel td.rc-sakit, .rc-leg .rc-sakit { background: #4A90D9; }
.rc-tabel .rc-jml { width: 28px; text-align: center; font-weight: 600; }
.rc-tabel tfoot th { background: var(--surface-2); font-weight: 600; }
.rc-tabel tbody tr:hover td.rc-kiri { background: var(--surface-2); }
/* Rencana cuti dari portal (1 Okt 2026): ungu penuh = disetujui,
   ungu bergaris = masih menunggu persetujuan. Kotaknya tautan ke
   pengajuannya (automation/lihat). */
.rc-tabel td.rc-rencana,  .rc-leg .rc-rencana  { background: #8E5BB5; }
.rc-tabel td.rc-menunggu, .rc-leg .rc-menunggu {
  background: repeating-linear-gradient(45deg, #8E5BB5 0 3px, transparent 3px 7px);
  box-shadow: inset 0 0 0 1px #8E5BB5;
}
.rc-tabel td.rc-sel .rc-tautan { display: block; width: 100%; height: 22px; }
.rc-tabel td.rc-sel .rc-tautan:hover { box-shadow: inset 0 0 0 2px var(--ink); }

/* Ringkasan cuti - grup per PT yang bisa dibuka (1 Okt 2026). */
.rc-grup:not(.rc-buka) .rc-anggota { display: none; }
.rc-kepala-grup { cursor: pointer; }
.rc-kepala-grup th, .rc-kepala-grup td { background: var(--surface-2); border-top: 2px solid var(--line); }
.rc-kepala-grup:hover th { background: var(--accent-w); }
.rc-buka-tutup {
  border: 0; background: transparent; color: var(--ink); font: inherit; font-weight: 600;
  cursor: pointer; display: inline-flex; align-items: center; gap: 8px; padding: 2px 0;
}
.rc-buka-tutup small { font-weight: 400; color: var(--muted); }
.rc-tanda {
  width: 18px; height: 18px; border-radius: 4px; flex: 0 0 auto;
  border: 1px solid var(--line); display: inline-flex; align-items: center; justify-content: center;
}
.rc-tanda::before { content: '+'; font-weight: 700; line-height: 1; }
.rc-buka .rc-tanda::before { content: '\2212'; }
.rc-tabel td.rc-ring { text-align: center; padding: 0; font-weight: 600; font-size: .74rem; height: 24px; }
.rc-tabel td.rc-panas1 { background: rgba(30, 86, 49, .25); }
.rc-tabel td.rc-panas2 { background: rgba(30, 86, 49, .5); }
.rc-tabel td.rc-panas3 { background: rgba(30, 86, 49, .75); color: #fff; }
.rc-tabel td.rc-panas4 { background: #1E5631; color: #fff; }
.rc-tabel td.rc-inden { border-left: 3px solid var(--accent-w); }
/* Nama bulan di Ringkasan cuti - kuning menonjol (1 Okt 2026). Latar
   kuning + teks gelap, bukan teks kuning: terbaca di tema terang dan gelap. */
.rc-bulan .rc-judul {
  background: #F2C200; color: #1A1A1A;
  padding: 4px 12px; border-radius: 8px; font-weight: 700;
}

/* Ringkasan cuti - penyaring rapi satu baris berkisi (1 Okt 2026). */
.rc-saring {
  display: grid; gap: 10px 12px; align-items: end; margin-bottom: 10px;
  grid-template-columns: repeat(4, minmax(140px, 1fr)) minmax(180px, 1.4fr) auto;
  padding: 12px 14px; background: var(--surface); border: 1px solid var(--line); border-radius: 10px;
}
.rc-medan { display: flex; flex-direction: column; gap: 4px; min-width: 0; margin: 0; }
.rc-medan > span { font-size: .72rem; font-weight: 600; letter-spacing: .03em; text-transform: uppercase; color: var(--muted); }
.rc-medan select, .rc-medan input {
  width: 100%; min-width: 0; height: 34px; box-sizing: border-box; padding: 0 10px;
  border: 1px solid var(--line); border-radius: 8px; background: var(--ground); color: var(--ink); font: inherit; font-size: .85rem;
}
.rc-aksi { display: flex; gap: 6px; align-items: center; height: 34px; }
.rc-aksi .btn { height: 34px; display: inline-flex; align-items: center; }
@media (max-width: 1100px) { .rc-saring { grid-template-columns: repeat(3, minmax(140px, 1fr)); } }
@media (max-width: 640px)  { .rc-saring { grid-template-columns: 1fr 1fr; } .rc-medan-cari { grid-column: 1 / -1; } }
div.rc-legenda { display: flex; gap: 18px; flex-wrap: wrap; margin: 0 2px 12px; }

/* Ringkasan cuti: kolom hari ini dibingkai dari kepala sampai kaki, dan
   kolom C/I/S/R berlatar warna jenisnya sendiri (1 Okt 2026). */
.rc-tabel th.rc-hariini { outline: 0; }
.rc-tabel .rc-hariini {
  box-shadow: inset 2px 0 0 #F2C200, inset -2px 0 0 #F2C200;
}
.rc-tabel thead th.rc-hariini { box-shadow: inset 2px 0 0 #F2C200, inset -2px 0 0 #F2C200, inset 0 2px 0 #F2C200; background: rgba(242, 194, 0, .18); }
.rc-tabel tfoot th.rc-hariini { box-shadow: inset 2px 0 0 #F2C200, inset -2px 0 0 #F2C200, inset 0 -2px 0 #F2C200; }
.rc-tabel .rc-jml { cursor: help; }
.rc-tabel .rc-jml-c { background: rgba(30, 86, 49, .28); }
.rc-tabel .rc-jml-i { background: rgba(242, 194, 0, .20); }
.rc-tabel .rc-jml-s { background: rgba(74, 144, 217, .22); }
.rc-tabel .rc-jml-r { background: rgba(142, 91, 181, .26); }
.rc-tabel .rc-jml-c:first-of-type, .rc-tabel .rc-jml-c { border-left: 2px solid var(--line); }

/* Basis pengetahuan - daftar dirapikan (2 Okt 2026). */
.kb-cari { align-items: flex-end; }
.kb-cari-medan { flex: 1 1 320px; max-width: 520px; }
.kb-cari-tombol { height: 34px; }
.kotak[data-kotak="kb-daftar"] .kb-daftar { padding: 12px; }
.kotak[data-kotak="kb-daftar"] .kb-kosong { padding: 16px; margin: 0; }
.kb-baris { background: var(--surface); }

/* =====================================================================
   Automation - warna kartu formulir pilihan pribadi (2 Okt 2026).
   SELURUH kartu berubah (latar + garis), bukan hanya satu sisi.
   Latar ditulis rgba supaya terbaca di tema gelap maupun terang.
   ===================================================================== */
.form-kartu { position: relative; }
.form-kartu .form-judul { padding-right: 26px; }
.form-titik {
  position: absolute; top: 8px; right: 8px; width: 26px; height: 26px; padding: 0;
  border: 0; border-radius: 13px; background: transparent; color: var(--muted); cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; opacity: .55;
}
.form-kartu:hover .form-titik, .form-titik:focus-visible { opacity: 1; }
.form-titik:hover { background: var(--surface-2); color: var(--ink); }
.form-titik svg { width: 16px; height: 16px; }

.form-kartu.form-warna-1, .form-bulat.form-warna-1 { --fw: 74, 144, 217; }
.form-kartu.form-warna-2, .form-bulat.form-warna-2 { --fw: 46, 160, 90; }
.form-kartu.form-warna-3, .form-bulat.form-warna-3 { --fw: 242, 194, 0; }
.form-kartu.form-warna-4, .form-bulat.form-warna-4 { --fw: 240, 128, 40; }
.form-kartu.form-warna-5, .form-bulat.form-warna-5 { --fw: 220, 70, 60; }
.form-kartu.form-warna-6, .form-bulat.form-warna-6 { --fw: 142, 91, 181; }
.form-kartu.form-warna-7, .form-bulat.form-warna-7 { --fw: 232, 100, 160; }
.form-kartu.form-warna-8, .form-bulat.form-warna-8 { --fw: 140, 150, 165; }
.form-kartu[class*="form-warna-"] {
  background: rgba(var(--fw), .20);
  border-color: rgba(var(--fw), .75);
}
.form-kartu[class*="form-warna-"]:hover { border-color: rgb(var(--fw)); }
.form-kartu[class*="form-warna-"] .form-judul { color: var(--ink); }

.form-menu-warna {
  position: fixed; z-index: 9999; width: 200px; padding: 10px;
  background: var(--pb-kartu, var(--surface)); color: var(--ink);
  border: 1px solid var(--pb-garis, var(--line)); border-radius: 12px; box-shadow: var(--shadow);
}
.form-menu-judul { font-size: .78rem; font-weight: 600; color: var(--muted); margin: 0 2px 8px; }
.form-menu-kisi { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.form-bulat {
  width: 100%; aspect-ratio: 1; border-radius: 50%; cursor: pointer;
  border: 2px solid transparent; background: rgb(var(--fw));
}
.form-bulat:hover, .form-bulat:focus-visible { border-color: var(--ink); }
.form-menu-bawaan {
  width: 100%; margin-top: 10px; padding: 6px; border: 1px solid var(--line); border-radius: 8px;
  background: transparent; color: var(--ink); font: inherit; font-size: .82rem; cursor: pointer;
}
.form-menu-bawaan:hover { background: var(--surface-2); }
/* Menu warna: dua bagian untuk admin (saya / semua orang) - 2 Okt 2026. */
.form-menu-warna { width: 230px; }
.form-menu-bagian + .form-menu-bagian { margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--line); }
.form-menu-ket { font-size: .72rem; color: var(--muted); margin: -4px 2px 8px; line-height: 1.35; }
.form-bulat.terpilih { border-color: var(--ink); box-shadow: 0 0 0 2px var(--pb-kartu, var(--surface)) inset; }
/* Pemilih warna kartu di perancang formulir (2 Okt 2026). */
.rc-warna-pilih { display: flex; flex-wrap: wrap; gap: 10px; }
.rc-warna-opsi { display: flex; flex-direction: column; align-items: center; gap: 4px; cursor: pointer; width: 64px; }
.rc-warna-opsi input { position: absolute; opacity: 0; pointer-events: none; }
.rc-warna-opsi .form-bulat { width: 30px; height: 30px; display: block; }
.rc-warna-opsi small { font-size: .72rem; color: var(--muted); text-align: center; }
.rc-warna-opsi input:checked + .form-bulat { border-color: var(--ink); box-shadow: 0 0 0 3px var(--accent-w); }
.rc-warna-opsi input:focus-visible + .form-bulat { outline: 2px solid var(--accent); outline-offset: 2px; }
.rc-warna-bawaan { background: var(--surface-2) !important; border: 2px dashed var(--line) !important; }
.rc-warna-opsi input:checked + .rc-warna-bawaan { border-style: solid !important; border-color: var(--ink) !important; }

/* ===== AWAL: gaya Tugas & Proyek dari develop_nia (5 Okt 2026) ===== */

/* ---------------------------------------------------------------
   Token warna milik gaya di bawah - 26 di antaranya tidak ada di
   app.css portal, dan tanpa blok ini aturan yang memakainya
   (var(--text-tinta), var(--bg-permukaan), ...) tidak menghasilkan
   apa pun. Yang punya nilai cadangan masih selamat; yang tidak,
   tata letaknya berantakan TANPA satu pun pesan galat.

   HANYA yang belum ada di portal yang disalin. Token portal tidak
   disentuh - menimpanya berarti mengubah warna seluruh aplikasi,
   bukan halaman tugas saja.
   --------------------------------------------------------------- */
:root {
  --bg-kertas: #F4F7FB;
  --bg-permukaan: #FFFFFF;
  --text-tinta: #101C30;
  --text-tinta-2: #33415C;
  --text-redup: #5D6B82;
  --border-garis: #E3E9F2;
  --border-garis-2: #EEF2F8;
  --color-biru: #12509B;
  --color-biru-2: #1A63C4;
  --color-biru-tepi: #2B7DE9;
  --btn-primary-bg: #1A63C4;
  --btn-primary-hover: #12509B;
  --btn-create-bg: #00A86B;
  --btn-create-hover: #008f5b;
  --badge-biru-bg: #EEF5FF;
  --badge-biru-border: #D7E6FF;
  --status-hijau: #0F7A43;
  --status-hijau-bg: #E6F5EC;
  --status-kuning: #B45309;
  --status-kuning-bg: #FDF3E3;
  --status-kuning-border: #F6DFBA;
  --status-merah: #B42318;
  --status-merah-bg: #FDECEB;
  --shadow-card-modern: 0 4px 20px rgba(11, 47, 107, 0.08), 0 1px 3px rgba(0, 0, 0, 0.04);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --bg-kertas: #0A1120;
    --bg-permukaan: #131C2E;
    --text-tinta: #E6ECF7;
    --text-tinta-2: #C2CDE0;
    --text-redup: #8E9DB5;
    --border-garis: #26334D;
    --border-garis-2: #1C2739;
    --color-biru: #6BA6F5;
    --color-biru-2: #5B9CF0;
    --color-biru-tepi: #8CBCF8;
    --btn-primary-bg: #1A63C4;
    --btn-primary-hover: #2A76D8;
    --btn-create-bg: #10B981;
    --btn-create-hover: #059669;
    --badge-biru-bg: #15243F;
    --badge-biru-border: #1E3358;
    --status-hijau: #4ADE80;
    --status-hijau-bg: #10281D;
    --status-kuning: #FBBF24;
    --status-kuning-bg: #2A1F0C;
    --status-kuning-border: #F6DFBA;
    --status-merah: #F87171;
    --status-merah-bg: #2C1414;
    --shadow-card-modern: 0 4px 20px rgba(0, 0, 0, 0.4);
  }
}


/* ---------------------------------------------------------------
   7 Okt 2026 - TUGAS MENGIKUTI TEMA PORTAL.
   Token develop_nia di atas kini diarahkan ke token portal, dan warna
   heks harfiah di bawah sudah diganti var(--...) yang setara. Hasilnya
   Tugas/Tenggat/Gantt/Proyek memakai warna yang sama dengan menu lain
   - termasuk tema gelap (dulu kotak putih di tengah halaman gelap).
   Salinan sebelum perubahan: _tmp/app_sebelum_tugas_tema.css.
   --------------------------------------------------------------- */
body, main.page {
  --bg-kertas: var(--ground);
  --bg-permukaan: var(--surface);
  --text-tinta: var(--ink);
  --text-tinta-2: var(--ink-soft);
  --text-redup: var(--muted);
  --border-garis: var(--line);
  --border-garis-2: var(--line-soft);
  --color-biru: var(--accent);
  --color-biru-2: var(--accent);
  --color-biru-tepi: var(--accent);
  --btn-primary-bg: var(--accent);
  --btn-primary-hover: var(--accent-2);
  --badge-biru-bg: var(--accent-w);
  --badge-biru-border: var(--pb-biru-w2, #D7E6FF);
}

/*
   Ditarik utuh bersama tampilan tugas_*.php dari develop_nia.
   Ditambahkan DI UJUNG dengan sengaja: aturan di sini menang lewat
   urutan cascade, dan seluruh bagian ini bisa dicabut kembali dalam
   satu potongan di antara dua penanda.

   CATATAN YANG BELUM DIBERESKAN: warna di bagian ini ditulis sebagai
   hex harfiah, bukan token var(--...). app.css punya tema gelap lewat
   prefers-color-scheme, jadi latar var(--surface) dengan teks gelap di sini
   akan sulit dibaca di tema gelap. Dibiarkan apa adanya supaya
   tampilannya persis sama dengan yang sudah diuji pembuatnya;
   menerjemahkannya ke token adalah pekerjaan tersendiri.
*/

.kotak.kotak-maks[data-kotak="tugas-gantt"] .tg-gantt {
  flex: 1 1 auto; min-height: 0; max-height: none;
}

/* Berkas warisan Bitrix yang fisiknya belum ikut dipindahkan. Namanya
   tetap ditampilkan - menghilangkannya membuat orang mengira lampiran
   itu tidak pernah ada. */
/* Kutipan balasan di dalam gelembung chat.
   ---------------------------------------------------------------------
   Nilainya mengikuti .tg-kartu dan .ci-* yang sudah ada: memakai
   peubah tema, bukan hex telanjang, supaya tema gelap ikut benar tanpa
   aturan kedua. */
/* Penanda "Diteruskan" di kepala gelembung. Kecil dan redup - ia
   keterangan tentang pesannya, bukan bagian isinya. */
/* Penanda "Disematkan" di kepala gelembung. Sewarna biru portal supaya
   terbaca sebagai penanda ruang, bukan sebagai keadaan pesannya
   sendiri - beda dengan "Diteruskan" yang redup. */
/* Tombol sematkan pada gelembung. Samar sampai gelembungnya disentuh
   tetikus - BUKAN tersembunyi, sebab layar sentuh tidak punya hover. */
.chat-pin-tombol{
  border:0; background:none; cursor:pointer; padding:0 3px;
  font-size:11px; line-height:1; opacity:.28;
  transition:opacity .12s;
}

/* ---- Bitrix Hero Header (Depth Background) ---- */
.tg-hero-header {
  background: linear-gradient(135deg, #12509B 0%, #1860B8 52%, #0C3674 100%);
  margin: -22px -22px 20px -22px;
  padding: 20px 22px 18px 22px;
  color: #FFFFFF;
  box-shadow: 0 6px 20px -8px rgba(11, 47, 107, 0.3);
}

.tg-header-top {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
  margin-bottom: 16px;
}

/* Judul halaman "My tasks": 26px, bold */
.tg-hero-title {
  font-size: 26px;
  font-weight: 700;
  color: #FFFFFF;
  line-height: 1.15;
  margin: 0;
  letter-spacing: -0.02em;
}

/* Tinggi tombol dan input ±34px */
.tg-btn-create {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  height: 34px;
  padding: 0 16px;
  white-space: nowrap;
  flex-shrink: 0;
  background: var(--btn-create-bg, #00A86B);
  color: #FFFFFF !important;
  font-size: 14px;
  font-weight: 600;
  line-height: 1;
  border-radius: 6px;
  border: none;
  cursor: pointer;
  text-decoration: none;
  box-shadow: 0 2px 6px rgba(0, 168, 107, 0.25);
  transition: background-color .15s ease, transform .1s ease;
}

.tg-btn-create:hover {
  background: var(--btn-create-hover, #008f5b);
}

/* Form Cepat & Dropdown All Roles: Terang & Kontras Tinggi */
.tg-quick-form {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  flex: 1 1 auto;
}

.tg-pill-select {
  height: 34px;
  background-color: var(--surface) !important;
  color: var(--ink) !important;
  border: 1px solid rgba(0, 0, 0, 0.15) !important;
  border-radius: 17px;
  padding: 0 32px 0 14px;
  font-size: 13.5px;
  font-weight: 600;
  outline: none;
  cursor: pointer;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2333415C' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  appearance: none;
  -webkit-appearance: none;
  min-width: 140px;
  max-width: 220px;
  flex: 0 0 auto;
}

.tg-pill-select:hover {
  background-color: var(--line-soft) !important;
}

.tg-pill-select option {
  background: var(--surface) !important;
  color: var(--ink) !important;
  font-weight: normal;
}

.tg-search-box {
  display: inline-flex;
  align-items: center;
  height: 34px;
  background: rgba(255, 255, 255, 0.95);
  border: 1px solid rgba(255, 255, 255, 0.3);
  border-radius: 17px;
  padding: 0 14px;
  gap: 8px;
  flex: 1 1 240px;
  max-width: 380px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}

.tg-search-box svg {
  width: 16px;
  height: 16px;
  color: var(--muted);
  flex: 0 0 16px;
}

.tg-search-box input {
  border: none;
  background: transparent;
  outline: none;
  font-size: 13.5px;
  color: var(--ink);
  width: 100%;
}

.tg-search-box input::placeholder {
  color: var(--muted);
}

/* ==========================================================================
   Bitrix24 Filter and Search Interactive Popover Dropdown
   ========================================================================== */
.tg-search-popover-wrap {
  position: relative;
  display: inline-flex;
  align-items: center;
  flex: 1 1 260px;
  max-width: 380px;
}

.tg-search-popover {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  width: 580px;
  max-width: calc(100vw - 32px);
  background: #ffffff;
  border: 1px solid #dce1e6;
  border-radius: 10px;
  box-shadow: 0 12px 36px rgba(0, 0, 0, 0.16), 0 2px 8px rgba(0, 0, 0, 0.08);
  z-index: 1200;
  display: flex;
  text-align: left;
  user-select: none;
  overflow: hidden;
  animation: tgPopoverFadeIn 0.18s cubic-bezier(0.16, 1, 0.3, 1);
}

@keyframes tgPopoverFadeIn {
  from {
    opacity: 0;
    transform: translateY(-6px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* Kolom Kiri: Preset Saringan */
.tg-popover-sidebar {
  width: 190px;
  flex: 0 0 190px;
  background: #fbfcfd;
  border-right: 1px solid #eef1f4;
  padding: 12px 0 10px 0;
  display: flex;
  flex-direction: column;
}

.tg-popover-preset-list {
  display: flex;
  flex-direction: column;
  gap: 1px;
}

.tg-popover-preset {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 9px 18px;
  font-size: 13.5px;
  font-weight: 400;
  color: #333333;
  cursor: pointer;
  transition: background 0.12s ease, color 0.12s ease;
}

.tg-popover-preset:hover {
  background: #f0f4f8;
  color: #111111;
}

.tg-popover-preset.aktif {
  background: #f4f7fb;
  color: #0075ff;
  font-weight: 600;
}

.tg-popover-preset .tg-preset-pin {
  width: 14px;
  height: 14px;
  color: #8c959f;
  opacity: 0;
  transition: opacity 0.12s ease;
}

.tg-popover-preset.aktif .tg-preset-pin,
.tg-popover-preset:hover .tg-preset-pin {
  opacity: 1;
}

.tg-popover-preset.aktif .tg-preset-pin {
  color: #0075ff;
}

.tg-popover-sidebar-footer {
  margin-top: 36px;
  padding: 12px 18px 4px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-top: 1px solid #f1f4f7;
}

.tg-popover-save-btn {
  background: none;
  border: none;
  padding: 0;
  font-size: 13px;
  color: #6a737d;
  cursor: pointer;
  font-weight: 500;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  transition: color 0.12s ease;
}

.tg-popover-save-btn:hover {
  color: #0075ff;
}

.tg-popover-gear-btn {
  background: none;
  border: none;
  padding: 0;
  color: #6a737d;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: color 0.12s ease;
}

.tg-popover-gear-btn:hover {
  color: #24292e;
}

/* Kolom Kanan: Bidang Filter & Aksi */
.tg-popover-content {
  flex: 1 1 auto;
  padding: 18px 22px 16px 22px;
  display: flex;
  flex-direction: column;
  background: #ffffff;
}

.tg-popover-field {
  margin-bottom: 14px;
}

.tg-popover-label {
  display: block;
  font-size: 12px;
  color: #6a737d;
  font-weight: 500;
  margin-bottom: 6px;
}

.tg-popover-select {
  width: 100%;
  height: 38px;
  background: #ffffff;
  border: 1px solid #cfd5dc;
  border-radius: 6px;
  padding: 0 34px 0 12px;
  font-size: 13.5px;
  color: #24292e;
  outline: none;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236a737d' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.tg-popover-select:focus {
  border-color: #0075ff;
  box-shadow: 0 0 0 3px rgba(0, 117, 255, 0.15);
}

.tg-popover-aux {
  display: flex;
  align-items: center;
  gap: 16px;
  margin-top: 4px;
  margin-bottom: 22px;
}

.tg-popover-link-blue {
  background: none;
  border: none;
  padding: 0;
  color: #0075ff;
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  text-decoration: none;
}

.tg-popover-link-blue:hover {
  text-decoration: underline;
}

.tg-popover-link-gray {
  background: none;
  border: none;
  padding: 0;
  color: #76808a;
  font-size: 13px;
  cursor: pointer;
  text-decoration: none;
}

.tg-popover-link-gray:hover {
  color: #24292e;
}

.tg-popover-footer {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 20px;
  margin-top: auto;
  padding-top: 8px;
}

.tg-btn-popover-search {
  background: #0075ff;
  color: #ffffff;
  border: none;
  border-radius: 20px;
  height: 38px;
  padding: 0 26px;
  font-size: 14px;
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(0, 117, 255, 0.35);
  transition: background 0.15s ease, transform 0.1s ease;
}

.tg-btn-popover-search:hover {
  background: #0064db;
  transform: translateY(-1px);
}

.tg-btn-popover-search svg {
  width: 15px;
  height: 15px;
  stroke-width: 2.6;
}

.tg-btn-popover-reset {
  background: none;
  border: none;
  color: #535c69;
  font-size: 14px;
  font-weight: 500;
  cursor: pointer;
  padding: 6px 12px;
  transition: color 0.12s ease;
}

.tg-btn-popover-reset:hover {
  color: #111111;
  text-decoration: underline;
}

.tg-header-extra {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

/* Tombol Saringan di Header (Warna Terang & Elegan) */
.tg-btn-filter-toggle {
  height: 34px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 14px;
  background: var(--surface) !important;
  color: var(--color-biru, var(--accent)) !important;
  border: 1px solid rgba(255, 255, 255, 0.3) !important;
  border-radius: 6px;
  font-size: 13.5px;
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
  transition: background .15s ease;
}

.tg-btn-filter-toggle:hover {
  background: var(--badge-biru-bg, var(--accent-w)) !important;
}

.tg-btn-filter-toggle svg {
  color: var(--color-biru, var(--accent));
}

.tg-btn-ghost-light {
  height: 34px;
  display: inline-flex;
  align-items: center;
  padding: 0 14px;
  background: rgba(255, 255, 255, 0.15);
  color: #FFFFFF;
  border: 1px solid rgba(255, 255, 255, 0.28);
  border-radius: 6px;
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  cursor: pointer;
  transition: background .15s ease;
}

.tg-btn-ghost-light:hover {
  background: rgba(255, 255, 255, 0.28);
  color: #FFFFFF;
}

/* Sub-tab tampilan: 13-14px */
.tg-header-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}

.tg-subtabs {
  display: flex;
  align-items: center;
  gap: 4px;
}

.tg-subtab {
  font-size: 13.5px;
  color: rgba(255, 255, 255, 0.85);
  text-decoration: none;
  padding: 6px 12px;
  border-radius: 6px;
  font-weight: 500;
  transition: all .15s ease;
}

.tg-subtab:hover {
  color: #FFFFFF;
  background: rgba(255, 255, 255, 0.14);
}

.tg-subtab.aktif {
  background: rgba(0, 0, 0, 0.28);
  color: #FFFFFF;
  font-weight: 600;
}

/* Pill/chip: 13px */
.tg-quick-chips {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.tg-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 26px;
  padding: 0 10px;
  border-radius: 9999px;
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  background: rgba(255, 255, 255, 0.18);
  color: #FFFFFF;
  border: 1px solid rgba(255, 255, 255, 0.25);
  transition: background .15s ease;
}

.tg-chip:hover {
  background: rgba(255, 255, 255, 0.28);
}

.tg-chip-danger {
  background: rgba(180, 35, 24, 0.88);
  border-color: rgba(255, 255, 255, 0.3);
}

.tg-chip-danger:hover {
  background: rgba(180, 35, 24, 1);
}

.tg-chip-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  border-radius: 9px;
  font-size: 11px;
  font-weight: 700;
  background: rgba(0, 0, 0, 0.25);
  padding: 0 4px;
}

/* Panel Saringan Lanjutan (Collapsible) */
.tg-filter-panel {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 10px;
  padding: 14px 18px;
  margin-bottom: 16px;
  box-shadow: var(--shadow-card-modern);
}

.tg-filter-panel form {
  display: flex;
  align-items: flex-end;
  gap: 12px;
  flex-wrap: wrap;
}

.tg-filter-panel label {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 13px;
  color: var(--text-tinta-2, var(--ink-soft));
  font-weight: 500;
}

.tg-filter-panel select, .tg-filter-panel input {
  height: 34px;
  padding: 0 10px;
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 6px;
  background: var(--bg-permukaan, var(--surface));
  color: var(--text-tinta, var(--ink));
  font-size: 13.5px;
}

/* Saringan Terapkan & Bersihkan Buttons (palet_warna_bitrix.md) */
.tg-btn-apply {
  height: 34px;
  background-color: var(--btn-primary-bg, var(--accent)) !important;
  color: #FFFFFF !important;
  font-size: 13.5px;
  font-weight: 700;
  border-radius: 6px;
  padding: 0 18px;
  border: none;
  cursor: pointer;
  box-shadow: 0 2px 6px rgba(26, 99, 196, 0.25);
  transition: background-color .15s ease;
}

.tg-btn-apply:hover {
  background-color: var(--btn-primary-hover, var(--accent-2)) !important;
}

.tg-btn-reset {
  height: 34px;
  background-color: var(--badge-biru-bg, var(--accent-w)) !important;
  color: var(--color-biru, var(--accent)) !important;
  border: 1px solid var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF)) !important;
  font-size: 13.5px;
  font-weight: 600;
  border-radius: 6px;
  padding: 0 16px;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  transition: background-color .15s ease;
}

.tg-btn-reset:hover {
  background-color: var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF)) !important;
}

/* ---- Floating Content Card & Modern Dashboard Table ---- */
.tg-card-wrapper {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  box-shadow: 0 4px 24px rgba(11, 47, 107, 0.08), 0 1px 3px rgba(0, 0, 0, 0.04);
  overflow: hidden;
  margin-bottom: 24px;
}

.tg-card-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 18px;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  font-size: 13.5px;
}

.tg-sort-links {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  color: var(--text-redup, var(--muted));
}

.tg-sort-links a {
  color: var(--text-tinta-2, var(--ink-soft));
  text-decoration: none;
  font-weight: 500;
}

.tg-sort-links a:hover {
  color: var(--color-biru-2, var(--accent));
}

.tg-sort-links a.aktif {
  color: var(--color-biru-2, var(--accent));
  font-weight: 700;
  text-decoration: underline;
}

/* Dashboard Table Grid */
.tg-table-responsive {
  width: 100%;
  overflow-x: auto;
  overflow-y: auto;
  max-height: calc(100vh - 220px);
  position: relative;
}

.tg-table-responsive::-webkit-scrollbar {
  width: 7px;
  height: 7px;
}

.tg-table-responsive::-webkit-scrollbar-track {
  background: var(--ground);
}

.tg-table-responsive::-webkit-scrollbar-thumb {
  background: var(--line);
  border-radius: 4px;
}

.tg-table-responsive::-webkit-scrollbar-thumb:hover {
  background: var(--muted);
}

.tg-dashboard-tbl {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  text-align: left;
  font-size: 14.5px;
}

/* Label kolom: 14px, abu, tanpa uppercase & FREEZE (Sticky Header) */
.tg-dashboard-tbl thead th {
  position: sticky;
  top: 0;
  z-index: 20;
  padding: 12px 16px;
  font-size: 14px;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
  text-transform: none;
  letter-spacing: normal;
  border-bottom: 1px solid var(--border-garis, var(--line));
  background: var(--line-soft);
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
  white-space: nowrap;
  vertical-align: middle;
}

/* Kolom berukuran tetap */
.tg-col-ctrl { width: 44px; text-align: center; }

.tg-col-name { min-width: 280px; width: auto; }

.tg-col-active { width: 165px; }

.tg-col-deadline { width: 145px; }

.tg-col-created { width: 165px; }

.tg-col-assignee { width: 165px; }

.tg-col-project { width: 155px; }

.tg-col-status { width: 130px; }

/* Group Row (e.g. IT PROJECT 2025) */
.tg-row-group td {
  background: var(--ground);
  border-top: 1px solid var(--border-garis, var(--line));
  border-bottom: 1px solid var(--border-garis, var(--line));
  padding: 8px 16px;
}

.tg-group-band {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 13px;
  font-weight: 700;
  color: var(--text-tinta-2, var(--ink-soft));
  letter-spacing: 0.03em;
  text-transform: uppercase;
}

.tg-group-band a {
  color: var(--text-tinta, var(--ink));
  text-decoration: none;
}

.tg-group-band a:hover {
  color: var(--color-biru-2, var(--accent));
}

.tg-group-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 1px 7px;
  border-radius: 10px;
  background: var(--border-garis, var(--line));
  color: var(--text-redup, var(--muted));
  font-size: 11px;
  font-weight: 600;
}

/* Tinggi baris tabel ±50px dan padding sel tabel ±16px horizontal */
.tg-row {
  height: 50px;
  min-height: 50px;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  transition: background-color .15s ease;
}

.tg-row:hover {
  background-color: var(--badge-biru-bg, var(--accent-w));
}

.tg-row.tg-row-terpilih {
  background-color: #F6FBE9 !important; /* Soft yellow-green tint like Bitrix24 */
}

.tg-row.tg-row-terpilih:hover {
  background-color: #EFF8DC !important;
}

.tg-dashboard-tbl td {
  padding: 12px 16px;
  vertical-align: middle;
  color: var(--text-tinta, var(--ink));
  font-size: 14.5px;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
}

/* Floating Bottom Bulk Action Bar (Bitrix24 Design) */
.tg-bulk-bar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background: var(--surface);
  border-top: 1px solid #D0D7DE;
  box-shadow: 0 -6px 24px rgba(16, 28, 48, 0.12), 0 -1px 3px rgba(0, 0, 0, 0.05);
  padding: 12px 24px;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
  animation: tgBulkSlideUp 0.22s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-bulk-container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  max-width: 1300px;
  gap: 16px;
}

.tg-bulk-left {
  display: flex;
  align-items: center;
  gap: 12px;
}

.tg-btn-bulk-delete {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 38px;
  padding: 0 18px;
  background: #EF4444;
  color: #FFFFFF;
  border: none;
  border-radius: 6px;
  font-size: 13.5px;
  font-weight: 700;
  cursor: pointer;
  transition: background-color 0.15s ease, transform 0.1s ease, box-shadow 0.15s ease;
  box-shadow: 0 2px 6px rgba(239, 68, 68, 0.3);
}

.tg-btn-bulk-delete:hover {
  background: #DC2626;
  box-shadow: 0 4px 12px rgba(220, 38, 38, 0.4);
}

.tg-btn-bulk-delete:active {
  transform: scale(0.98);
}

.tg-btn-bulk-cancel {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 38px;
  padding: 0 16px;
  background: var(--line-soft);
  color: #475569;
  border: 1px solid var(--line);
  border-radius: 6px;
  font-size: 13.5px;
  font-weight: 600;
  cursor: pointer;
  transition: all 0.15s ease;
}

.tg-btn-bulk-cancel:hover {
  background: var(--line);
  color: var(--ink);
  border-color: var(--muted);
}

.tg-bulk-right {
  display: flex;
  align-items: center;
}

.tg-bulk-counter-label {
  font-size: 13px;
  font-weight: 700;
  color: var(--muted);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.tg-bulk-counter-label strong {
  color: var(--ink);
  font-size: 15px;
}

/* Member Chips for Participants & Observers */
.tg-member-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: var(--accent-w);
  color: var(--accent);
  border: 1px solid var(--pb-biru-w2, #D7E6FF);
  border-radius: 20px;
  padding: 3px 10px 3px 4px;
  font-size: 13px;
  font-weight: 500;
  transition: all .15s ease;
}

.tg-member-chip:hover {
  background: #E0EEFF;
  border-color: #BBD7FF;
}

.tg-chip-del {
  border: none;
  background: none;
  color: var(--muted);
  font-size: 15px;
  cursor: pointer;
  padding: 0 2px;
  line-height: 1;
  display: flex;
  align-items: center;
}

.tg-chip-del:hover {
  color: #EF4444;
}

/* Affordance: handle & checkbox */
.tg-handle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: #B0BCCB;
  cursor: grab;
  font-size: 16px;
  user-select: none;
  opacity: 0.35;
  transition: opacity .15s ease, color .15s ease;
}

.tg-row:hover .tg-handle {
  opacity: 1;
  color: var(--color-biru-2, var(--accent));
}

/* Title link & badges */
.tg-title-wrap {
  display: flex;
  flex-direction: column;
  gap: 3px;
}

.tg-title-row {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.tg-title-link {
  font-size: 14.5px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  text-decoration: none;
  line-height: 1.35;
}

.tg-title-link:hover {
  color: var(--color-biru-2, var(--accent));
  text-decoration: underline;
}

.tg-row-done .tg-title-link {
  color: var(--text-redup, var(--muted));
  text-decoration: line-through;
}

.tg-meta-badges {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--text-redup, var(--muted));
}

.tg-meta-chip {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 1px 6px;
  border-radius: 4px;
  background: var(--border-garis-2, var(--line-soft));
  color: var(--text-tinta-2, var(--ink-soft));
  font-size: 11.5px;
}

/* Active column */
.tg-active-cell {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 13.5px;
  color: var(--text-tinta-2, var(--ink-soft));
  white-space: nowrap;
}

.tg-active-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #00A86B;
  flex: 0 0 8px;
}

.tg-active-dot.tg-dot-gray {
  background: #A0AEC0;
}

/* Deadline with Urgency Signals */
.tg-deadline-cell {
  font-size: 13.5px;
  white-space: nowrap;
}

.tg-dl-lewat {
  display: inline-flex;
  align-items: center;
  padding: 3px 8px;
  border-radius: 4px;
  background: var(--status-merah-bg, var(--status-merah-bg));
  color: var(--status-merah, var(--status-merah));
  font-weight: 700;
  font-size: 13px;
}

.tg-dl-selesai {
  display: inline-flex;
  align-items: center;
  padding: 3px 8px;
  border-radius: 4px;
  background: var(--status-hijau-bg, var(--status-hijau-bg));
  color: var(--status-hijau, var(--status-hijau));
  font-weight: 500;
  font-size: 13px;
}

.tg-dl-none {
  color: var(--text-redup, var(--muted));
  font-size: 13px;
}

.tg-dl-normal {
  color: var(--text-tinta-2, var(--ink-soft));
  font-size: 13.5px;
}

/* Avatar + Nama Selalu Berpasangan */
.tg-user-pair {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  color: var(--text-tinta, var(--ink));
  white-space: nowrap;
}

.tg-user-pair .avatar-sm {
  width: 26px;
  height: 26px;
  flex: 0 0 26px;
  border-radius: 50%;
  object-fit: cover;
}

.tg-user-pair .avatar-inisial {
  width: 26px;
  height: 26px;
  flex: 0 0 26px;
  border-radius: 50%;
  font-size: 11px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-weight: 600;
}

/* Project column */
.tg-project-tag {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 13px;
  color: var(--text-tinta-2, var(--ink-soft));
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 145px;
}

.tg-project-tag svg {
  width: 14px;
  height: 14px;
  color: var(--color-biru, var(--accent));
  flex: 0 0 14px;
}

/* Status & Tags */
.tg-status-pill {
  display: inline-flex;
  align-items: center;
  padding: 3px 9px;
  border-radius: 9999px;
  font-size: 12.5px;
  font-weight: 600;
  white-space: nowrap;
}

.tg-status-jalan {
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru-2, var(--accent));
  border: 1px solid var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
}

.tg-status-selesai {
  background: var(--status-hijau-bg, var(--status-hijau-bg));
  color: var(--status-hijau, var(--status-hijau));
}

.tg-status-tinjau {
  background: var(--status-kuning-bg, var(--status-kuning-bg));
  color: var(--status-kuning, var(--status-kuning));
  border: 1px solid var(--status-kuning-border, var(--status-kuning-border));
}

.tg-status-tunda {
  background: var(--border-garis-2, var(--line-soft));
  color: var(--text-redup, var(--muted));
}

.tg-status-tolak {
  background: var(--status-merah-bg, var(--status-merah-bg));
  color: var(--status-merah, var(--status-merah));
}

.tg-halaman { display: flex; align-items: center; gap: 12px; margin-top: 14px; padding: 12px 16px; }

/* ---- Drill Down Layout (tugas/lihat) ---- */
.tg-drilldown-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 22px;
  align-items: flex-start;
}

@media (max-width: 960px) {
  .tg-drilldown-layout {
    grid-template-columns: minmax(0, 1fr);
  }
}

.tg-drilldown-main {
  display: flex;
  flex-direction: column;
  gap: 0;
  min-width: 0;
}

.tg-drilldown-side {
  display: flex;
  flex-direction: column;
  gap: 0;
  min-width: 0;
}

/* =====================================================================
   PAPAN KANBAN BITRIX24 MODERN STYLE (palet_warna_bitrix.md)
   ===================================================================== */
.tg-catatan-papan {
  margin: -4px 0 14px;
  color: var(--text-redup, var(--muted));
  font-size: 13px;
}

.tg-papan {
  display: flex;
  gap: 16px;
  align-items: flex-start;
  overflow-x: auto;
  padding: 4px 4px 16px 4px;
  scroll-behavior: smooth;
}

.tg-papan::-webkit-scrollbar {
  height: 8px;
}

.tg-papan::-webkit-scrollbar-track {
  background: var(--bg-kertas, var(--ground));
  border-radius: 4px;
}

.tg-papan::-webkit-scrollbar-thumb {
  background: var(--border-garis, var(--line));
  border-radius: 4px;
}

.tg-papan::-webkit-scrollbar-thumb:hover {
  background: var(--text-redup, #8E9DB5);
}

.tg-kolom {
  /* position: relative - 6 Oktober 2026.
     Tombol sisip "+" mengambang di CELAH kanan kolom; tanpa patokan
     ini ia akan diposisikan terhadap papan, lalu ketiga tombolnya
     menumpuk di satu titik. Tidak mengubah tata letak apa pun. */
  position: relative;
  flex: 0 0 295px;
  width: 295px;
  background: var(--bg-kertas, var(--ground));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  display: flex;
  flex-direction: column;
  min-height: 480px;
  max-height: calc(100vh - 200px);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
  transition: all .2s ease;
}

.tg-kolom-kepala {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 11px 14px;
  border-top: none;
  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
  border-radius: 11px 11px 0 0;
  background: var(--bg-permukaan, var(--surface));
  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.38);
  cursor: grab;
  user-select: none;
  transition: transform .15s ease, box-shadow .15s ease;
}

.tg-kolom-kepala:active {
  cursor: grabbing;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.2);
}

.tg-kolom-grip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: inherit;
  margin-right: 6px;
  font-size: 13px;
  opacity: 0.8;
  transition: opacity .12s;
  cursor: grab;
  line-height: 1;
}

.tg-kolom-kepala:hover .tg-kolom-grip {
  opacity: 1;
}

.tg-kolom.tg-kolom-geser {
  opacity: 0.35 !important;
  transform: scale(0.98) !important;
  box-shadow: 0 10px 28px rgba(18, 80, 155, 0.15) !important;
}

.tg-kolom.tg-kolom-drop-kiri {
  border-left: 3px solid var(--color-biru, var(--accent-2)) !important;
  position: relative;
}

.tg-kolom.tg-kolom-drop-kanan {
  border-right: 3px solid var(--color-biru, var(--accent-2)) !important;
  position: relative;
}

.tg-kolom-nama {
  font-size: 13.5px;
  font-weight: 700;
  color: inherit;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  letter-spacing: -0.01em;
}

.tg-kolom-nama-editable {
  cursor: pointer;
  padding: 2px 6px;
  margin: -2px -6px;
  border-radius: 4px;
  transition: background-color .15s ease, outline .15s ease;
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.tg-kolom-nama-editable:hover {
  background-color: rgba(255, 255, 255, 0.25);
  outline: 1px dashed rgba(255, 255, 255, 0.6);
}

.tg-kolom-nama-editable::after {
  content: '✎';
  font-size: 10px;
  opacity: 0;
  transition: opacity .15s ease;
}

.tg-kolom-nama-editable:hover::after {
  opacity: 0.85;
}

.tg-kolom-nama-input {
  font-size: 13px;
  font-weight: 700;
  color: var(--ink);
  background: var(--surface);
  border: 1.5px solid #00ACE3;
  border-radius: 4px;
  padding: 2px 6px;
  outline: none;
  width: 100%;
  max-width: 180px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.15);
}

/* Titik warna di kepala kolom Planner - 5 Oktober 2026.

   <input type="color"> digambar peramban sebagai kotak bertepi tebal
   dengan ruang dalam yang tidak bisa dihapus lewat padding saja; ketiga
   pseudo-elemen di bawah yang membuatnya menjadi titik bulat rata.
   Yang tidak dikenali satu peramban tinggal diabaikan - kotak kecil
   biasa, tetap berfungsi. */
.tg-kolom-warna {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  padding: 0;
  border: 1.5px solid rgba(255, 255, 255, 0.75);
  border-radius: 50%;
  background: none;
  cursor: pointer;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.28);
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
}
.tg-kolom-warna::-webkit-color-swatch-wrapper { padding: 0; }
.tg-kolom-warna::-webkit-color-swatch { border: none; border-radius: 50%; }
.tg-kolom-warna::-moz-color-swatch { border: none; border-radius: 50%; }
.tg-kolom-warna:hover { transform: scale(1.12); }
.tg-kolom-warna:focus-visible { outline: 2px solid var(--surface); outline-offset: 1px; }

/* Tombol hapus kolom Planner - 5 Oktober 2026.
   Samar sampai kepala kolomnya disentuh: ia tindakan merusak, dan
   tindakan merusak tidak pantas jadi hal paling mencolok di kepala
   kolom. Tetap bisa dicapai papan ketik (focus-visible). */
.tg-kolom-hapus {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  padding: 0;
  margin-left: 2px;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.18);
  color: inherit;
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  opacity: 0;
  transition: opacity .15s ease, background .15s ease;
}
.tg-kolom-kepala:hover .tg-kolom-hapus,
.tg-kolom-hapus:focus-visible { opacity: 1; }
.tg-kolom-hapus:hover { background: rgba(255, 87, 82, 0.9); color: #FFF; }

/* =====================================================================
   SISIP KOLOM DI CELAH - 6 Oktober 2026
   =====================================================================
   Meniru Bitrix24: mendekatkan kursor ke sebuah kolom memunculkan
   tombol + di celah kanannya.

   Celah papannya 16px dan tombolnya 24px, jadi ia menumpang sedikit di
   atas kedua kolom - itu memang yang dikerjakan Bitrix24, dan yang
   membuatnya terbaca sebagai "di antara keduanya".
   ===================================================================== */
.tg-kolom-sisip-tombol {
  position: absolute;
  top: 14px;
  right: -20px;
  z-index: 3;

  width: 24px;
  height: 24px;
  padding: 0;
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 50%;
  background: var(--bg-permukaan, var(--surface));
  color: var(--accent);
  font-size: 15px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  box-shadow: 0 2px 6px rgba(16, 28, 48, 0.16);

  opacity: 0;
  transform: scale(0.8);
  transition: opacity .14s ease, transform .14s ease, background .14s ease;
}

.tg-kolom:hover > .tg-kolom-sisip-tombol,
.tg-kolom-sisip-tombol:focus-visible {
  opacity: 1;
  transform: scale(1);
}

.tg-kolom-sisip-tombol:hover {
  background: var(--accent);
  color: #FFFFFF;
  border-color: var(--accent);
}

.tg-kolom-sisip-tombol:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* Layar sentuh tidak punya hover sama sekali - tanpa blok ini tombolnya
   tidak akan pernah muncul di ponsel maupun tablet. */
@media (hover: none) {
  .tg-kolom-sisip-tombol { opacity: 1; transform: scale(1); }
}

/* Kolom sementara yang menunggu namanya diisi. Bergaris putus-putus
   supaya jelas ia belum ada - belum tersimpan di mana pun. */
.tg-kolom-sisip {
  background: var(--bg-permukaan, var(--surface));
  border: 2px dashed var(--accent);
  min-height: 140px;
  justify-content: flex-start;
  padding: 14px;
  gap: 10px;
}

.tg-kolom-sisip-baris {
  display: flex;
  align-items: center;
  gap: 8px;
}

.tg-kolom-sisip-nama {
  flex: 1 1 auto;
  min-width: 0;
  height: 32px;
  padding: 0 10px;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  background: var(--bg-permukaan, var(--surface));
  border: 1.5px solid var(--accent);
  border-radius: 6px;
  outline: none;
}

.tg-kolom-sisip .tg-kolom-warna {
  opacity: 1;
  border-color: var(--border-garis, var(--line));
}

.tg-kolom-sisip-ok,
.tg-kolom-sisip-batal {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  padding: 0;
  border: none;
  border-radius: 6px;
  font-size: 14px;
  line-height: 1;
  cursor: pointer;
}

.tg-kolom-sisip-ok     { background: var(--accent); color: #FFFFFF; }
.tg-kolom-sisip-ok:hover { background: var(--accent-2); }
.tg-kolom-sisip-batal  { background: var(--bg-kertas, var(--ground)); color: var(--muted); }
.tg-kolom-sisip-batal:hover { background: #FFE9E8; color: #D32F2F; }

.tg-kolom-sisip-ok:disabled,
.tg-kolom-sisip-batal:disabled { opacity: .5; cursor: progress; }

.tg-kolom-sisip-petunjuk {
  font-size: 11.5px;
  color: var(--text-redup, var(--muted));
}

/* Baris kolom Kanban di modal Kelola Proyek - 5 Oktober 2026.
   Urutannya diseret, bukan diketik; lihat catatan di
   app/Views/tugas_proyek_form.php. */
.tg-baris-kolom.tg-baris-seret { opacity: .45; }
.tg-baris-kolom:hover .tg-baris-grip { color: var(--accent); }

.tg-urut-nomor {
  display: inline-block;
  min-width: 22px;
  font-weight: 700;
  font-size: 13px;
  color: var(--text-tinta, var(--ink));
}

.tg-urut-panah {
  border: none;
  background: none;
  padding: 0 3px;
  font-size: 10px;
  line-height: 1;
  color: #9AA7B8;
  cursor: pointer;
}
.tg-urut-panah:hover { color: var(--accent); }
.tg-urut-panah:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }

.tg-kolom-jml {
  flex: 0 0 auto;
  border-radius: 9999px;
  padding: 1.5px 8px;
  font-size: 12px;
  font-weight: 700;
  line-height: 1.35;
  min-width: 22px;
  text-align: center;
}

.tg-kolom-isi {
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1 1 auto;
  min-height: 220px;
  overflow-y: auto;
  transition: background-color .15s ease, outline .15s ease;
}

.tg-kolom-isi::-webkit-scrollbar {
  width: 6px;
}

.tg-kolom-isi::-webkit-scrollbar-thumb {
  background: var(--border-garis, var(--line));
  border-radius: 3px;
}

.tg-kolom-kosong {
  text-align: center;
  padding: 28px 12px;
  color: var(--text-redup, var(--muted));
  font-size: 12.5px;
  border: 1.5px dashed var(--border-garis, var(--line));
  border-radius: 8px;
  background: rgba(255, 255, 255, 0.5);
  margin: 4px 0;
}

/* Sasaran seret aktif */
.tg-kolom.tg-kolom-sasaran,
.tg-kolom-isi.tg-kolom-sasaran {
  background: var(--badge-biru-bg, var(--accent-w)) !important;
  outline: 2px dashed var(--color-biru-tepi, var(--accent)) !important;
  outline-offset: -2px;
}

/* Kartu Kanban Modern */
.tg-kartu {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 10px;
  padding: 12px 14px;
  cursor: grab;
  display: flex;
  flex-direction: column;
  gap: 8px;
  position: relative;
  box-shadow: 0 2px 6px rgba(11, 47, 107, 0.04), 0 1px 2px rgba(0, 0, 0, 0.03);
  transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
  user-select: none;
}

.tg-kartu a, .tg-kartu img {
  -webkit-user-drag: none;
}

.tg-kartu:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 16px rgba(11, 47, 107, 0.09), 0 2px 4px rgba(0, 0, 0, 0.04);
  border-color: var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
}

.tg-kartu:active {
  cursor: grabbing;
}

.tg-kartu-seret {
  opacity: .35 !important;
  transform: scale(0.96) !important;
  box-shadow: 0 8px 24px rgba(18, 80, 155, 0.15) !important;
}

/* Kartu yang sedang DISIMPAN - 5 Oktober 2026.
   ------------------------------------------------------------------
   Berbeda dari .tg-kartu-seret, dan perbedaannya disengaja. Kartu yang
   sedang diseret belum ada di mana-mana, jadi ia nyaris hilang (.35).
   Kartu yang sedang disimpan SUDAH mendarat di kolom tujuannya - ia
   hanya belum pasti. Jadi ia tetap terbaca (.55), tidak mengecil, dan
   berdenyut pelan supaya terlihat bahwa sesuatu masih berjalan.

   Kelas ini dibuang di satu tempat yang dilewati semua akhir
   permintaan - lihat selesaiSimpan() di assets/app.js. */
.tg-kartu-simpan {
  opacity: .55 !important;
  cursor: progress;
  animation: tgDenyutSimpan 1.1s ease-in-out infinite;
}

@keyframes tgDenyutSimpan {
  0%, 100% { opacity: .55; }
  50%      { opacity: .82; }
}

/* Yang menyetel peramban ke "kurangi gerak" tidak diberi denyutnya -
   kepudarannya saja sudah cukup memberi tahu. */
@media (prefers-reduced-motion: reduce) {
  .tg-kartu-simpan { animation: none; }
}

.tg-kartu-judul {
  font-size: 13.5px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  text-decoration: none;
  line-height: 1.4;
  word-break: break-word;
  transition: color .12s ease;
}

.tg-kartu-judul:hover {
  color: var(--color-biru, var(--accent));
}

.tg-kartu .tg-prio {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--status-merah-bg, var(--status-merah-bg));
  color: var(--status-merah, var(--status-merah));
  border: 1px solid rgba(180, 35, 24, 0.25);
  font-size: 11px;
  font-weight: 800;
  width: 16px;
  height: 16px;
  border-radius: 4px;
  margin-right: 4px;
  vertical-align: middle;
}

.tg-kartu-proyek {
  font-size: 11.5px;
  font-weight: 600;
  color: var(--color-biru, var(--accent));
  background: var(--badge-biru-bg, var(--accent-w));
  border: 1px solid var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
  border-radius: 5px;
  padding: 1px 7px;
  width: fit-content;
}

.tg-kartu-periksa {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 11.5px;
  color: var(--text-tinta-2, var(--ink-soft));
  background: var(--bg-kertas, var(--ground));
  padding: 4px 8px;
  border-radius: 6px;
}

.tg-bilah {
  flex: 1 1 auto;
  display: block;
  height: 6px;
  min-width: 40px;
  background: var(--border-garis, var(--line));
  border-radius: 3px;
  overflow: hidden;
}

.tg-bilah i {
  display: block;
  height: 100%;
  background: linear-gradient(90deg, var(--color-biru-tepi, var(--accent)) 0%, var(--btn-primary-bg, var(--accent)) 100%);
  border-radius: 3px;
}

.tg-kartu-kaki {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  color: var(--text-redup, var(--muted));
  margin-top: 4px;
  padding-top: 8px;
  border-top: 1px solid var(--border-garis-2, var(--line-soft));
}

.tg-kartu-tgl {
  margin-left: auto;
  font-size: 11.5px;
  font-weight: 600;
  padding: 2px 7px;
  border-radius: 5px;
  background: var(--bg-kertas, var(--ground));
  color: var(--text-tinta-2, var(--ink-soft));
  border: 1px solid var(--border-garis, var(--line));
}

.tg-kartu-tgl.tg-lewat {
  background: var(--status-merah-bg, var(--status-merah-bg));
  color: var(--status-merah, var(--status-merah));
  border-color: rgba(180, 35, 24, 0.25);
}

.tg-kartu-tanda {
  white-space: nowrap;
  font-size: 11.5px;
  font-weight: 500;
  color: var(--text-redup, var(--muted));
  background: var(--bg-kertas, var(--ground));
  border-radius: 4px;
  padding: 1px 5px;
  display: inline-flex;
  align-items: center;
  gap: 3px;
}

/* =====================================================================
   PALET WARNA KARTU KANBAN (palet_warna_bitrix.md)
   ===================================================================== */
.tg-kartu.tg-warna-merah  { background: var(--status-merah-bg); border-color: #F6BCB8; }

.tg-kartu.tg-warna-jingga { background: #FEF3E8; border-color: #FBD5B0; }

.tg-kartu.tg-warna-kuning { background: #FDF8E2; border-color: #F8E79B; }

.tg-kartu.tg-warna-hijau  { background: var(--status-hijau-bg); border-color: #A9E2BF; }

.tg-kartu.tg-warna-biru   { background: var(--accent-w); border-color: #B5D2F8; }

.tg-kartu.tg-warna-ungu   { background: #F3EDFC; border-color: #D3BFF5; }

[data-theme="dark"] .tg-kartu.tg-warna-merah,
.dark-mode .tg-kartu.tg-warna-merah  { background: #2C1414; border-color: #5C2222; }

[data-theme="dark"] .tg-kartu.tg-warna-jingga,
.dark-mode .tg-kartu.tg-warna-jingga { background: #2E1F0F; border-color: #5E3E1C; }

[data-theme="dark"] .tg-kartu.tg-warna-kuning,
.dark-mode .tg-kartu.tg-warna-kuning { background: #2A240E; border-color: #584B18; }

[data-theme="dark"] .tg-kartu.tg-warna-hijau,
.dark-mode .tg-kartu.tg-warna-hijau  { background: #10281D; border-color: #1F543C; }

[data-theme="dark"] .tg-kartu.tg-warna-biru,
.dark-mode .tg-kartu.tg-warna-biru   { background: #15243F; border-color: #27477D; }

[data-theme="dark"] .tg-kartu.tg-warna-ungu,
.dark-mode .tg-kartu.tg-warna-ungu   { background: #241A38; border-color: #4C3473; }

/* Menu warna titik 3 */
.tg-kartu-menu {
  position: absolute;
  top: 10px;
  right: 8px;
}

.tg-kartu-titik {
  border: none;
  background: var(--bg-kertas, var(--ground));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 4px;
  cursor: pointer;
  padding: 1px 6px;
  line-height: 1;
  font-size: 14px;
  font-weight: 700;
  color: var(--text-redup, var(--muted));
  opacity: 0;
  transition: opacity .12s, background-color .12s, color .12s;
}

.tg-kartu:hover .tg-kartu-titik,
.tg-kartu-titik:focus-visible,
.tg-kartu-titik[aria-expanded="true"] {
  opacity: 1;
}

.tg-kartu-titik:hover {
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru, var(--accent));
  border-color: var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
}

.tg-warna-pilih {
  position: absolute;
  right: 0;
  top: 24px;
  z-index: 40;
  display: flex;
  gap: 6px;
  padding: 8px 10px;
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(11, 47, 107, 0.15);
}

.tg-warna-pilih[hidden] {
  display: none !important;
}

.tg-warna-satu {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  cursor: pointer;
  border: 1.5px solid rgba(0, 0, 0, 0.15);
  padding: 0;
  transition: transform .15s ease, box-shadow .15s ease;
}

.tg-warna-satu:hover,
.tg-warna-satu:focus-visible {
  transform: scale(1.2);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}

.tg-warna-pilih .tg-warna-merah  { background: #B42318; }

.tg-warna-pilih .tg-warna-jingga { background: #EA580C; }

.tg-warna-pilih .tg-warna-kuning { background: #B45309; }

.tg-warna-pilih .tg-warna-hijau  { background: #0F7A43; }

.tg-warna-pilih .tg-warna-biru   { background: var(--accent); }

.tg-warna-pilih .tg-warna-ungu   { background: #6938B8; }

.tg-warna-kosong {
  background: var(--surface);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  font-weight: 700;
  color: var(--text-redup, var(--muted));
  border-color: var(--border-garis, var(--line));
}

/* ---- TENGGAT & KALENDER BITRIX24 MODERN ---- */
.tg-deadline-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 20px;
  flex-wrap: wrap;
}

.tg-segmented-nav {
  display: inline-flex;
  align-items: center;
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  padding: 4px;
  border-radius: 30px;
  box-shadow: 0 2px 8px rgba(11, 47, 107, 0.04);
}

.tg-segment-pill {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 7px 18px;
  border-radius: 20px;
  font-size: 13.5px;
  font-weight: 600;
  text-decoration: none;
  color: var(--text-redup, var(--muted));
  transition: all .15s ease;
}

.tg-segment-pill:hover {
  color: var(--color-biru-2, var(--accent));
  background: #F4F8FD;
}

.tg-segment-pill.aktif {
  background: var(--color-biru-2, var(--accent));
  color: #FFFFFF !important;
  box-shadow: 0 2px 8px rgba(26, 99, 196, 0.3);
}

.tg-bulan-navigator {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  padding: 4px 12px;
  border-radius: 20px;
  box-shadow: 0 2px 8px rgba(11, 47, 107, 0.04);
}

.tg-bulan-btn {
  width: 28px;
  height: 28px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  color: var(--color-biru-2, var(--accent));
  text-decoration: none;
  font-size: 18px;
  font-weight: bold;
  transition: background .15s ease, transform .1s ease;
}

.tg-bulan-btn:hover {
  background: var(--accent-w);
  transform: scale(1.08);
}

.tg-bulan-title {
  font-size: 13.5px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  min-width: 120px;
  text-align: center;
}

/* Group Card Tenggat */
.tg-deadline-group-card {
  margin-bottom: 20px;
}

.tg-deadline-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 18px;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  background: var(--line-soft);
}

.tg-deadline-header.tg-header-lewat {
  background: var(--status-merah-bg);
  border-bottom-color: #FED7D7;
}

.tg-deadline-header-left {
  display: flex;
  align-items: center;
  gap: 10px;
}

.tg-deadline-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  display: inline-block;
}

.tg-dot-lewat {
  background: #FF5752;
  box-shadow: 0 0 0 3px rgba(255, 87, 82, 0.2);
}

.tg-dot-hari {
  background: #FFA900;
  box-shadow: 0 0 0 3px rgba(255, 169, 0, 0.2);
}

.tg-dot-pekan {
  background: #00ACE3;
  box-shadow: 0 0 0 3px rgba(0, 172, 227, 0.2);
}

.tg-dot-nanti {
  background: #8E44AD;
  box-shadow: 0 0 0 3px rgba(142, 68, 173, 0.2);
}

.tg-dot-tanpa {
  background: #A0AEC0;
}

.tg-deadline-title {
  font-size: 14.5px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  margin: 0;
  letter-spacing: -0.01em;
}

.tg-header-lewat .tg-deadline-title {
  color: var(--status-merah);
}

.tg-deadline-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 2px 9px;
  border-radius: 12px;
  font-size: 11.5px;
  font-weight: 600;
  background: var(--border-garis, var(--line));
  color: var(--text-redup, var(--muted));
}

.tg-header-lewat .tg-deadline-count {
  background: var(--status-merah-bg);
  color: #991B1B;
}

/* Kalender Grid Modern */
.tg-kal {
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 6px;
  background: transparent;
  border: none;
  border-radius: 0;
  overflow: visible;
}

.tg-kal-kepala {
  background: var(--ground);
  padding: 10px 8px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--text-redup, var(--muted));
  text-align: center;
  border-radius: 6px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.tg-kal-sel {
  background: var(--surface);
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 8px;
  min-height: 105px;
  padding: 8px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  transition: border-color .15s ease, box-shadow .15s ease;
}

.tg-kal-sel:hover {
  border-color: #00ACE3;
  box-shadow: 0 4px 12px rgba(0, 172, 227, 0.08);
}

.tg-kal-kosong {
  background: var(--line-soft);
  border-color: var(--line-soft);
  opacity: 0.6;
}

.tg-kal-ini {
  border-color: #00ACE3;
  box-shadow: 0 0 0 2px rgba(0, 172, 227, 0.25);
  background: #F0F9FF;
}

.tg-kal-ini .tg-kal-nomor {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: #00ACE3;
  color: #FFFFFF;
  font-weight: 700;
}

.tg-kal-nomor {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  margin-bottom: 2px;
}

.tg-kal-tugas {
  font-size: 11.5px;
  font-weight: 500;
  line-height: 1.35;
  text-decoration: none;
  background: #EBF5FF;
  color: var(--accent);
  border: 1px solid #D1E5FF;
  border-radius: 4px;
  padding: 3px 6px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  transition: all .12s ease;
}

.tg-kal-tugas:hover {
  background: var(--accent);
  color: #FFFFFF;
  border-color: var(--accent);
}

.tg-kal-lewat {
  background: var(--status-merah-bg);
  color: var(--status-merah);
  border-color: #FECACA;
}

.tg-kal-lewat:hover {
  background: #B42318;
  color: #FFFFFF;
  border-color: #B42318;
}

.tg-kal-lagi {
  font-size: 11px;
  font-weight: 600;
  color: #00ACE3;
  text-decoration: none;
  padding: 2px 4px;
}

.tg-kal-lagi:hover {
  text-decoration: underline;
}

/* ---- gantt ---- */
/* Gantt digulir SEBAGAI SATU WADAH - ini penting, dan dulu tidak begitu.
   Sebelumnya kolom nama dan kisi tanggal punya wadah gulirnya
   masing-masing: nama ber-overflow:hidden, kisi ber-overflow-x:auto.
   Yang tidak terlihat dari CSS itu, satu aturan CSS mengubah overflow-y
   kisi menjadi auto juga begitu overflow-x-nya bukan visible - jadi
   kisinya bisa digulir tegak sementara kolom nama TIDAK BISA SAMA
   SEKALI. Di layar penuh akibatnya terlihat jelas: batangnya bergerak,
   namanya diam, dan baris di bawah lipatan tidak pernah bisa dicapai.

   Sekarang hanya .tg-gantt yang menggulir, dua arah. Kolom nama
   menempel ke kiri dan kepala tabel menempel ke atas dengan position:
   sticky, jadi keduanya tetap terlihat tanpa pernah bisa lepas dari
   barisnya - kesejajaran bukan lagi sesuatu yang harus dijaga, sebab
   keduanya digulir oleh wadah yang sama. */
/* ---- GANTT CHART BITRIX24 MODERN ---- */
.tg-gantt-wrapper {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  box-shadow: 0 4px 24px rgba(11, 47, 107, 0.08), 0 1px 3px rgba(0, 0, 0, 0.04);
  overflow: hidden;
  margin-bottom: 24px;
}

.tg-gantt-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 18px;
  background: var(--line-soft);
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  font-size: 13.5px;
  flex-wrap: wrap;
  gap: 12px;
}

.tg-gantt-toolbar-left {
  display: flex;
  align-items: center;
  gap: 10px;
}

.tg-gantt-toolbar-title {
  font-size: 14.5px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
}

.tg-gantt-legend {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  font-size: 12px;
  color: var(--text-redup, var(--muted));
  flex-wrap: wrap;
}

.tg-legend-item {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-weight: 500;
}

.tg-legend-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  display: inline-block;
}

.tg-gantt {
  display: flex;
  background: var(--surface);
  border: none;
  overflow: auto;
  max-height: calc(100vh - 230px);
  min-height: 420px;
  align-items: flex-start;
  position: relative;
}

/* Kolom Kiri: Tabel Daftar Tugas (Sticky Left) */
.tg-gantt-nama {
  flex: 0 0 340px;
  width: 340px;
  min-width: 340px;
  border-right: 1px solid var(--border-garis, var(--line));
  background: var(--surface);
  position: sticky;
  left: 0;
  z-index: 25;
  box-shadow: 3px 0 10px rgba(11, 47, 107, 0.04);
}

.tg-gantt-kepala,
.tg-gantt-kepala-kiri {
  height: 48px;
  display: flex;
  align-items: center;
  padding: 0 14px;
  background: var(--ground);
  border-bottom: 1px solid var(--border-garis, var(--line));
  font-size: 11.5px;
  font-weight: 700;
  color: var(--text-redup, var(--muted));
  text-transform: uppercase;
  letter-spacing: 0.04em;
  position: sticky;
  top: 0;
  z-index: 30;
  box-sizing: border-box;
}

.tg-gantt-kepala-kiri .tg-col-tugas {
  flex: 1;
  min-width: 0;
}

.tg-gantt-kepala-kiri .tg-col-tenggat {
  width: 68px;
  text-align: right;
  flex: 0 0 68px;
  padding-right: 6px;
}

.tg-gantt-kepala-kiri .tg-col-pic {
  width: 34px;
  text-align: center;
  flex: 0 0 34px;
}

.tg-gantt-baris {
  display: flex;
  align-items: center;
  padding: 0 14px;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  font-size: 13px;
  gap: 8px;
  transition: background-color .12s ease;
  box-sizing: border-box;
}

.tg-gantt-baris:hover,
.tg-gantt-baris.tg-row-hover {
  background-color: var(--badge-biru-bg, var(--accent-w)) !important;
}

.tg-gantt-status-dot,
.tg-gantt-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex: 0 0 8px;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.9);
}

.tg-gantt-nama-konten {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center;
  overflow: hidden;
}

.tg-gantt-baris .tg-title-link {
  font-size: 13px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  text-decoration: none;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tg-gantt-baris .tg-title-link:hover {
  color: var(--color-biru-2, var(--accent));
  text-decoration: underline;
}

.tg-prio-mini {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 15px;
  height: 15px;
  border-radius: 3px;
  background: var(--status-merah-bg);
  color: #DC2626;
  font-weight: 800;
  font-size: 11px;
  margin-right: 5px;
  flex: 0 0 15px;
  line-height: 1;
}

.tg-gantt-kol-tenggat {
  width: 68px;
  text-align: right;
  flex: 0 0 68px;
  padding-right: 6px;
}

.tg-tenggat-pill {
  font-size: 11px;
  font-weight: 500;
  padding: 2px 6px;
  border-radius: 4px;
  background: var(--line-soft);
  color: var(--text-redup, var(--muted));
  white-space: nowrap;
  display: inline-block;
}

.tg-tenggat-pill.lewat {
  background: var(--status-merah-bg);
  color: #DC2626;
  font-weight: 700;
}

.tg-tenggat-pill.selesai {
  background: var(--status-hijau-bg);
  color: var(--status-hijau);
}

.tg-tenggat-kosong,
.tg-pic-kosong {
  color: var(--text-redup, var(--muted));
  font-size: 12px;
  opacity: 0.6;
}

.tg-gantt-kol-pic {
  width: 34px;
  text-align: center;
  flex: 0 0 34px;
  display: flex;
  justify-content: center;
}

.tg-pic-avatar {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--accent-w);
  border: 1px solid var(--pb-biru-w2, #D7E6FF);
  color: var(--color-biru-2, var(--accent));
  font-size: 10px;
  font-weight: 700;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  letter-spacing: -0.02em;
}

/* Kolom Kanan: Kisi Linimasa & Waktu */
.tg-gantt-kisi {
  flex: 1 0 auto;
}

.tg-gantt-dalam {
  position: relative;
}

/* Header Waktu Dua Tingkat */
.tg-gantt-waktu-header {
  position: sticky;
  top: 0;
  z-index: 20;
  height: 48px;
  box-sizing: border-box;
}

.tg-gantt-header-tier-1 {
  height: 24px;
  background: var(--ground);
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  position: relative;
  overflow: hidden;
}

.tg-gantt-header-bulan {
  position: absolute;
  top: 0;
  height: 24px;
  line-height: 24px;
  padding-left: 10px;
  font-size: 11px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  border-left: 1px solid var(--border-garis, var(--line));
  white-space: nowrap;
  overflow: hidden;
  box-sizing: border-box;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.tg-gantt-header-tier-2 {
  height: 24px;
  background: var(--line-soft);
  border-bottom: 1px solid var(--border-garis, var(--line));
  position: relative;
  overflow: hidden;
}

.tg-gantt-header-hari {
  position: absolute;
  top: 0;
  height: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 3px;
  border-left: 1px solid var(--border-garis-2, var(--line-soft));
  font-size: 11px;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
  white-space: nowrap;
  overflow: hidden;
  box-sizing: border-box;
}

.tg-gantt-header-hari.tg-weekend {
  background: var(--line-soft);
  color: var(--muted);
}

.tg-gantt-header-hari .tg-hari-sub {
  font-size: 9.5px;
  opacity: 0.75;
  font-weight: 500;
}

.tg-gantt-header-hari .tg-hari-num {
  font-weight: 700;
}

/* Header lawas fallback (untuk tugas_gantt.php mandiri) */
.tg-gantt-waktu {
  height: 48px;
  padding: 0;
  background: var(--line-soft);
  border-bottom: 1px solid var(--border-garis, var(--line));
  position: sticky;
  top: 0;
  z-index: 15;
}

.tg-gantt-minggu {
  position: absolute;
  top: 0;
  height: 48px;
  line-height: 48px;
  padding-left: 8px;
  font-size: 12px;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
  border-left: 1px solid var(--border-garis, var(--line));
  white-space: nowrap;
  overflow: hidden;
  box-sizing: border-box;
}

.tg-gantt-bulan-awal {
  color: var(--text-tinta, var(--ink));
  font-weight: 700;
  font-size: 12.5px;
  background: var(--line-soft);
}

/* Badan Linimasa Grid */
.tg-gantt-badan {
  position: relative;
  background: var(--surface);
}

/* Pita horizontal per baris (memudahkan mata mengikuti baris) */
.tg-gantt-row-band {
  position: absolute;
  left: 0;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  box-sizing: border-box;
  transition: background-color .12s ease;
  pointer-events: none;
}

.tg-gantt-row-band.tg-row-hover {
  background-color: var(--badge-biru-bg, var(--accent-w)) !important;
}

/* Shading kolom akhir pekan */
.tg-gantt-weekend-col {
  position: absolute;
  top: 0;
  bottom: 0;
  background: rgba(244, 247, 251, 0.45);
  pointer-events: none;
  z-index: 1;
}

/* Garis vertikal per hari/minggu */
.tg-gantt-garis {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 1px;
  background: var(--line-soft);
  pointer-events: none;
  z-index: 2;
}

.tg-gantt-garis.tg-garis-weekend {
  background: #E8EEF5;
}

/* Garis Penanda HARI INI */
.tg-gantt-hariini {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 2px;
  background: #FF5752;
  z-index: 15;
  box-shadow: 0 0 8px rgba(255, 87, 82, 0.45);
  pointer-events: none;
}

.tg-hariini-badge,
.tg-gantt-hariini::before {
  content: 'HARI INI';
  position: absolute;
  top: 2px;
  left: 50%;
  transform: translateX(-50%);
  font-size: 9px;
  font-weight: 800;
  background: #FF5752;
  color: #FFFFFF;
  padding: 1px 5px;
  border-radius: 3px;
  letter-spacing: 0.04em;
  white-space: nowrap;
}

.tg-gantt-tali {
  position: absolute;
  top: 0;
  left: 0;
  pointer-events: none;
  z-index: 8;
  color: var(--muted);
}

/* Batang Linimasa Tugas (Gantt Bar) */
.tg-gantt-bar-item {
  position: absolute;
  height: 26px;
  display: flex;
  align-items: center;
  z-index: 10;
}

.tg-gantt-batang {
  position: relative;
  height: 26px;
  border-radius: 6px;
  background: linear-gradient(135deg, #00ACE3 0%, var(--accent) 100%);
  color: #FFFFFF !important;
  box-shadow: 0 2px 6px rgba(26, 99, 196, 0.25);
  display: inline-flex;
  align-items: center;
  padding: 0 8px;
  font-size: 11.5px;
  font-weight: 600;
  text-decoration: none;
  overflow: hidden;
  box-sizing: border-box;
  transition: transform .12s ease, box-shadow .12s ease;
  cursor: pointer;
  flex-shrink: 0;
}

.tg-gantt-batang:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 14px rgba(26, 99, 196, 0.4);
  z-index: 12;
  color: #FFFFFF !important;
}

.tg-gantt-bar-text,
.tg-gantt-batang span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 11.5px;
  font-weight: 600;
  line-height: 1;
}

/* Label di luar batang untuk tugas pendek */
.tg-gantt-bar-outside-label {
  position: absolute;
  white-space: nowrap;
  font-size: 12px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  text-decoration: none;
  padding-left: 6px;
  z-index: 11;
  transition: color .12s ease;
}

.tg-gantt-bar-outside-label:hover {
  color: var(--color-biru-2, var(--accent));
  text-decoration: underline;
}

/* Varian Status Gradien Bitrix */
.tg-gantt-batang.tg-gantt-jalan,
.tg-gantt-batang.tg-jalan,
.tg-gantt-batang.tg-bar-jalan {
  background: linear-gradient(135deg, #00ACE3 0%, var(--accent) 100%);
  box-shadow: 0 2px 6px rgba(26, 99, 196, 0.28);
}

.tg-gantt-batang.tg-gantt-selesai,
.tg-gantt-batang.tg-selesai,
.tg-gantt-batang.tg-bar-selesai {
  background: linear-gradient(135deg, #10B981 0%, #059669 100%);
  box-shadow: 0 2px 6px rgba(16, 185, 129, 0.25);
}

.tg-gantt-batang.tg-gantt-tinjau,
.tg-gantt-batang.tg-tinjau,
.tg-gantt-batang.tg-bar-tinjau {
  background: linear-gradient(135deg, #F59E0B 0%, #D97706 100%);
  box-shadow: 0 2px 6px rgba(245, 158, 11, 0.28);
}

.tg-gantt-batang.tg-gantt-tunda,
.tg-gantt-batang.tg-tunda,
.tg-gantt-batang.tg-bar-tunda {
  background: linear-gradient(135deg, var(--muted) 0%, var(--muted) 100%);
  box-shadow: 0 2px 5px rgba(100, 116, 139, 0.25);
}

.tg-gantt-batang.tg-gantt-lewat,
.tg-gantt-lewat,
.tg-gantt-batang.tg-bar-lewat {
  background: linear-gradient(135deg, #EF4444 0%, #DC2626 100%) !important;
  box-shadow: 0 2px 8px rgba(239, 68, 68, 0.35) !important;
}

/* ---- detail tugas ---- */
.tg-detil { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: 20px; }

@media (max-width: 820px) { .tg-detil { grid-template-columns: minmax(0, 1fr); } }

.tg-detil-sisi { border-left: 1px solid var(--line); padding-left: 16px; }

@media (max-width: 820px) { .tg-detil-sisi { border-left: none; padding-left: 0; border-top: 1px solid var(--line); padding-top: 12px; } }

.tg-fakta { margin: 0; display: grid; grid-template-columns: auto; gap: 2px; font-size: .85rem; }

.tg-fakta dt { color: var(--muted); font-size: .74rem; text-transform: uppercase; letter-spacing: .04em; margin-top: 9px; }

.tg-fakta dd { margin: 0; }

.tg-orang { display: inline-block; margin-right: 6px; }

.tg-status-form { margin-top: 14px; }

.tg-tag-baris { margin-top: 10px; }

.tg-daftar-ringkas { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }

.tg-daftar-ringkas li { display: flex; align-items: center; gap: 8px; font-size: .87rem; }

/* ---- daftar periksa ---- */
.tg-periksa { list-style: none; margin: 0 0 10px; padding: 0; display: flex; flex-direction: column; gap: 4px; }

.tg-periksa li { display: flex; align-items: center; gap: 8px; font-size: .88rem; }

.tg-periksa-form { display: inline-flex; margin: 0; }

.tg-periksa-kotak {
  width: 18px; height: 18px; flex: 0 0 18px; border: 1px solid var(--line);
  background: var(--surface); border-radius: 3px; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: .78rem; color: var(--ok); padding: 0;
}

.tg-periksa-mati { cursor: default; }

.tg-periksa-selesai .tg-periksa-teks { color: var(--muted); text-decoration: line-through; }

.tg-periksa-teks { flex: 1 1 auto; }

.tg-periksa-buang { border: none; background: transparent; color: var(--muted); cursor: pointer; font-size: 1rem; padding: 0 3px; }

.tg-periksa-buang:hover { color: var(--crit); }

.tg-periksa-tambah { display: flex; gap: 7px; }

.tg-periksa-tambah input { flex: 1 1 auto; }

/* ---- lampiran & komentar ---- */
.tg-berkas { list-style: none; margin: 0 0 10px; padding: 0; display: flex; flex-direction: column; gap: 5px; font-size: .88rem; }

.tg-berkas li { display: flex; align-items: center; gap: 8px; }

.tg-berkas-unduh { text-decoration: none; color: var(--muted); }

.tg-unggah { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }

.tg-komentar { list-style: none; margin: 0 0 14px; padding: 0; display: flex; flex-direction: column; gap: 12px; }

.tg-komentar > li { display: flex; gap: 9px; }

.tg-komentar-isi { flex: 1 1 auto; min-width: 0; }

.tg-komentar-kepala { display: flex; align-items: baseline; gap: 8px; font-size: .85rem; }

.tg-komentar-isi p { margin: 3px 0 0; font-size: .89rem; }

.tg-komentar-berkas { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; align-items: flex-start; }

.tg-komentar-berkas img { max-width: 180px; max-height: 140px; border-radius: var(--radius); display: block; }

.tg-komentar-tulis { display: flex; flex-direction: column; gap: 7px; }

.tg-komentar-tulis textarea { width: 100%; }

.tg-komentar-alat { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

/* =====================================================================
   PROYEK & WORKGROUP (Bitrix24 Modern Design System)
   ===================================================================== */

/* Wadah Utama Proyek */
.tg-proyek-wrapper {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  box-shadow: 0 4px 24px rgba(11, 47, 107, 0.08), 0 1px 3px rgba(0, 0, 0, 0.04);
  overflow: hidden;
  margin-bottom: 24px;
}

/* Toolbar Proyek */
.tg-proyek-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 20px;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  background: var(--line-soft);
  gap: 16px;
  flex-wrap: wrap;
}

.tg-proyek-toolbar-left {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
}

/* Segmented Control Pill: Aktif vs Arsip */
.tg-proyek-pills {
  display: inline-flex;
  align-items: center;
  background: var(--line-soft);
  padding: 3px;
  border-radius: 8px;
  gap: 2px;
}

.tg-proyek-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 14px;
  border-radius: 6px;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-tinta-2, var(--ink-soft));
  text-decoration: none;
  transition: all .15s ease;
}

.tg-proyek-pill:hover {
  color: var(--text-tinta, var(--ink));
  background: rgba(255, 255, 255, 0.6);
}

.tg-proyek-pill.aktif {
  background: var(--surface);
  color: var(--color-biru-2, var(--accent));
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
}

.tg-proyek-pill-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 9px;
  font-size: 11px;
  font-weight: 700;
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru, var(--accent));
  transition: all .15s ease;
}

.tg-proyek-pill.aktif .tg-proyek-pill-badge {
  background: var(--color-biru-2, var(--accent));
  color: #FFFFFF;
}

.tg-proyek-counter-text {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--text-redup, var(--muted));
}

.tg-proyek-toolbar-right {
  display: flex;
  align-items: center;
  gap: 10px;
}

.tg-btn-ghost-dark {
  height: 34px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 14px;
  background: var(--surface);
  border: 1px solid var(--border-garis, var(--line));
  color: var(--text-tinta-2, var(--ink-soft));
  border-radius: 6px;
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  transition: all .15s ease;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
}

.tg-btn-ghost-dark:hover {
  background: var(--line-soft);
  border-color: var(--color-biru-2, var(--accent));
  color: var(--color-biru-2, var(--accent));
}

.tg-btn-primary-action {
  height: 34px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 16px;
  background: var(--btn-create-bg, #00A86B);
  color: #FFFFFF !important;
  border-radius: 6px;
  font-size: 13.5px;
  font-weight: 600;
  text-decoration: none;
  border: none;
  box-shadow: 0 2px 6px rgba(0, 168, 107, 0.25);
  transition: all .15s ease;
}

.tg-btn-primary-action:hover {
  background: var(--btn-create-hover, #008f5b);
  box-shadow: 0 4px 10px rgba(0, 168, 107, 0.35);
  transform: translateY(-1px);
}

/* Container Area Kartu Proyek */
.tg-proyek-container {
  padding: 24px 20px;
  background: var(--color-kertas, var(--ground));
  min-height: 360px;
}

/* Grid Kartu Proyek */
.tg-proyek-kisi {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  gap: 20px;
}

/* Kartu Proyek Mengambang (Floating Card) */
.tg-proyek-kartu {
  position: relative;
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  box-shadow: 0 2px 8px rgba(11, 47, 107, 0.05), 0 1px 3px rgba(0, 0, 0, 0.02);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  transition: transform .2s cubic-bezier(0.16, 1, 0.3, 1), box-shadow .2s ease, border-color .2s ease;
}

.tg-proyek-kartu:hover {
  transform: translateY(-3px);
  border-color: var(--color-biru-tepi, #8CBCF8);
  box-shadow: 0 12px 28px rgba(11, 47, 107, 0.12), 0 2px 6px rgba(0, 0, 0, 0.04);
}

.tg-proyek-kartu.tg-proyek-tutup {
  opacity: .75;
  background: #FAFBFD;
}

.tg-proyek-kartu.tg-proyek-tutup:hover {
  opacity: 1;
}

/* Strip Garis Aksen Warna di bagian atas kartu */
.tg-proyek-card-top-accent {
  height: 4px;
  width: 100%;
}

.tg-proyek-card-body {
  padding: 16px 18px 14px 18px;
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  gap: 12px;
}

/* Kepala Kartu: Avatar/Icon Proyek & Judul */
.tg-proyek-kepala {
  display: flex;
  align-items: flex-start;
  gap: 12px;
}

.tg-proyek-avatar {
  width: 42px;
  height: 42px;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 42px;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
}

.tg-proyek-info {
  flex: 1 1 auto;
  min-width: 0;
}

.tg-proyek-judul {
  display: block;
  font-size: 15.5px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  line-height: 1.3;
  text-decoration: none;
  margin-bottom: 4px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  transition: color .15s ease;
}

.tg-proyek-judul:hover {
  color: var(--color-biru-2, var(--accent));
}

.tg-proyek-tags {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}

.tg-proyek-badge {
  font-size: 10.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  padding: 2px 7px;
  border-radius: 4px;
  line-height: 1.2;
}

.tg-badge-proyek {
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru, var(--accent));
  border: 1px solid var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
}

.tg-badge-grup {
  background: #E6F7F8;
  color: #0D6E7C;
  border: 1px solid #B8EBEF;
}

.tg-badge-ditutup {
  background: var(--status-kuning-bg);
  color: var(--status-kuning);
  border: 1px solid var(--status-kuning-border);
}

.tg-badge-arsip {
  background: var(--line-soft);
  color: var(--muted);
  border: 1px solid var(--line);
}

/* Deskripsi Proyek */
.tg-proyek-desc {
  font-size: 13px;
  line-height: 1.45;
  color: var(--text-redup, var(--muted));
  margin: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: 38px;
}

/* Bagian Progres Tugas */
.tg-proyek-progress-section {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-top: 2px;
}

.tg-proyek-progress-label {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 12px;
}

.tg-proyek-progress-text {
  font-weight: 500;
  color: var(--text-redup, var(--muted));
}

.tg-proyek-progress-value {
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
}

.tg-proyek-track {
  width: 100%;
  height: 6px;
  background: var(--line-soft);
  border-radius: 9999px;
  overflow: hidden;
}

.tg-proyek-bar {
  height: 100%;
  border-radius: 9999px;
  background: linear-gradient(90deg, #00ACE3 0%, var(--accent) 100%);
  transition: width .4s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-proyek-bar.penuh {
  background: linear-gradient(90deg, #10B981 0%, #059669 100%);
}

/* Metrik Statistik Grid (4 Kolom Interaktif) */
.tg-proyek-metrik-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 6px;
  background: var(--line-soft);
  border: 1px solid var(--border-garis-2, var(--line-soft));
  border-radius: 8px;
  padding: 8px 6px;
  text-align: center;
  margin-top: 4px;
}

.tg-proyek-metrik-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-decoration: none;
  padding: 4px 2px;
  border-radius: 6px;
  transition: background-color .12s ease;
}

.tg-proyek-metrik-item:hover {
  background: rgba(18, 80, 155, 0.08);
}

.tg-metrik-angka {
  font-size: 15px;
  font-weight: 700;
  line-height: 1.2;
  color: var(--text-tinta, var(--ink));
  font-variant-numeric: tabular-nums;
}

.tg-metrik-label {
  font-size: 10.5px;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
  text-transform: uppercase;
  letter-spacing: 0.03em;
  margin-top: 2px;
  white-space: nowrap;
}

/* Highlighting Status Metrik */
.tg-proyek-metrik-item.tg-metrik-lewat .tg-metrik-angka {
  color: var(--color-merah, var(--status-merah));
}

.tg-proyek-metrik-item.tg-metrik-lewat .tg-metrik-label {
  color: var(--color-merah, var(--status-merah));
}

.tg-proyek-metrik-item.tg-metrik-lewat:hover {
  background: var(--status-merah-bg);
}

.tg-proyek-metrik-item.tg-metrik-saya .tg-metrik-angka {
  color: var(--color-biru-2, var(--accent));
}

.tg-proyek-metrik-item.tg-metrik-saya .tg-metrik-label {
  color: var(--color-biru-2, var(--accent));
}

.tg-proyek-metrik-item.tg-metrik-saya:hover {
  background: var(--accent-w);
}

/* Footer Kartu Proyek: Pemilik & Tombol Buka */
.tg-proyek-card-footer {
  border-top: 1px solid var(--border-garis-2, var(--line-soft));
  padding: 10px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--line-soft);
}

.tg-proyek-owner {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}

.tg-owner-avatar {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--line);
  color: var(--text-tinta-2, var(--ink-soft));
  font-size: 11px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 24px;
}

.tg-owner-meta {
  display: flex;
  flex-direction: column;
  line-height: 1.15;
  min-width: 0;
}

.tg-owner-role {
  font-size: 9.5px;
  color: var(--text-redup, var(--muted));
  text-transform: uppercase;
  letter-spacing: 0.03em;
}

.tg-owner-name {
  font-size: 12px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tg-proyek-action-btn {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--color-biru-2, var(--accent));
  text-decoration: none;
  padding: 4px 8px;
  border-radius: 4px;
  transition: all .15s ease;
}

.tg-proyek-action-btn:hover {
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru, var(--accent));
}

.tg-proyek-action-btn svg {
  transition: transform .15s ease;
}

.tg-proyek-action-btn:hover svg {
  transform: translateX(2px);
}

/* Status Kosong (Empty State) */
.tg-proyek-empty {
  padding: 60px 20px;
  text-align: center;
  max-width: 520px;
  margin: 40px auto;
  background: var(--surface);
  border: 1px dashed var(--border-garis, var(--line));
  border-radius: 12px;
}

.tg-empty-icon {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru, var(--accent));
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto 16px auto;
}

.tg-empty-title {
  font-size: 18px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  margin: 0 0 8px 0;
}

.tg-empty-desc {
  font-size: 13.5px;
  color: var(--text-redup, var(--muted));
  line-height: 1.5;
  margin: 0 0 20px 0;
}

@media (max-width: 640px) {
  .tg-proyek-kisi {
    grid-template-columns: 1fr;
  }
  .tg-proyek-toolbar {
    flex-direction: column;
    align-items: stretch;
  }
  .tg-proyek-toolbar-right {
    justify-content: stretch;
  }
  .tg-btn-ghost-dark, .tg-btn-primary-action {
    flex: 1 1 auto;
    justify-content: center;
  }
}

/* =====================================================================
   DETAIL PROYEK (tugas/proyek/lihat) - Bitrix24 Modern Design System
   ===================================================================== */

/* Hero Header Detail Proyek */
.tg-proyek-detail-hero {
  background: linear-gradient(135deg, #12509B 0%, #1860B8 52%, #0C3674 100%);
  margin: -22px -22px 20px -22px;
  padding: 20px 24px 0 24px;
  color: #FFFFFF;
  box-shadow: 0 6px 20px -8px rgba(11, 47, 107, 0.3);
}

.tg-proyek-hero-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin-bottom: 16px;
}

.tg-proyek-hero-back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13.5px;
  font-weight: 600;
  color: rgba(255, 255, 255, 0.9);
  text-decoration: none;
  transition: color .15s ease, transform .15s ease;
}

.tg-proyek-hero-back:hover {
  color: #FFFFFF;
  transform: translateX(-2px);
}

.tg-proyek-hero-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

/* About Project Top-Right Button & Popover in Project Detail */
.tg-about-project-wrap {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.tg-btn-about-project {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 6px 14px;
  background: rgba(255, 255, 255, 0.22);
  border: 1px solid rgba(255, 255, 255, 0.35);
  border-radius: 6px;
  color: #FFFFFF;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  outline: none;
  transition: all .15s ease;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}

.tg-btn-about-project:hover,
.tg-btn-about-project.aktif {
  background: rgba(255, 255, 255, 0.35);
  border-color: rgba(255, 255, 255, 0.55);
  color: #FFFFFF;
}

.tg-btn-more-dots {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 31px;
  background: rgba(255, 255, 255, 0.22);
  border: 1px solid rgba(255, 255, 255, 0.35);
  border-radius: 6px;
  color: #FFFFFF;
  cursor: pointer;
  text-decoration: none;
  transition: all .15s ease;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}

.tg-btn-more-dots:hover {
  background: rgba(255, 255, 255, 0.35);
  border-color: rgba(255, 255, 255, 0.55);
}

/* =====================================================================
   EXTENSIONS & KNOWLEDGE BASE (Bitrix24 System)
   ===================================================================== */
.tg-extensions-wrap {
  position: relative;
  display: inline-flex;
  align-items: center;
}

.tg-btn-extensions {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  padding: 6px 12px;
  background: rgba(255, 255, 255, 0.22);
  border: 1px solid rgba(255, 255, 255, 0.35);
  border-radius: 6px;
  color: #FFFFFF;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  outline: none;
  transition: all .15s ease;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}

.tg-btn-extensions:hover,
.tg-btn-extensions.aktif {
  background: rgba(255, 255, 255, 0.35);
  border-color: rgba(255, 255, 255, 0.55);
  color: #FFFFFF;
}

.tg-btn-extensions-sep {
  display: inline-block;
  width: 1px;
  height: 12px;
  background: rgba(255, 255, 255, 0.45);
}

.tg-btn-extensions-arrow {
  transition: transform .15s ease;
  flex-shrink: 0;
}

.tg-btn-extensions.aktif .tg-btn-extensions-arrow {
  transform: rotate(180deg);
}

.tg-menu-extensions {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 1250;
  min-width: 220px;
  padding: 8px;
  background: #FFFFFF;
  border: 1px solid rgba(0, 0, 0, 0.1);
  border-radius: 12px;
  box-shadow: 0 14px 40px rgba(0, 0, 0, 0.18), 0 2px 8px rgba(0, 0, 0, 0.06);
  animation: tgFadeInDown .18s cubic-bezier(0.16, 1, 0.3, 1);
  text-align: left;
}

.tg-menu-ext-header {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 10px 8px;
}

.tg-menu-ext-title {
  font-size: 12px;
  font-weight: 500;
  color: #525C69;
  white-space: nowrap;
}

.tg-menu-ext-rule {
  flex: 1;
  height: 1px;
  background: #EEF2F5;
}

.tg-menu-ext-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  padding: 9px 12px;
  border: 0;
  border-radius: 7px;
  background: transparent;
  font: inherit;
  font-size: 13px;
  font-weight: 500;
  color: #333333;
  text-align: left;
  cursor: pointer;
  transition: background .12s ease, color .12s ease;
}

.tg-menu-ext-item:hover {
  background: #F1F5F9;
  color: #00ACE3;
}

.tg-menu-ext-divider {
  height: 1px;
  background: #EEF2F5;
  margin: 6px 4px;
}

/* Modal Dialogs - Knowledge Base Bitrix24 */
.tg-kb-modal-backdrop {
  position: fixed;
  inset: 0;
  z-index: 2100;
  background: rgba(15, 30, 60, 0.58);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
  box-sizing: border-box;
  animation: tgFadeIn .18s ease;
}

.tg-kb-modal-card {
  background: #FFFFFF;
  width: 980px;
  max-width: 96vw;
  max-height: 92vh;
  border-radius: 14px;
  box-shadow: 0 24px 64px rgba(0, 0, 0, 0.28);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  animation: tgScaleUp .22s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-kb-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 24px;
  border-bottom: 1px solid #EEF2F6;
  background: #FFFFFF;
  flex-shrink: 0;
}

.tg-kb-modal-title-left {
  display: flex;
  align-items: center;
  gap: 14px;
}

.tg-kb-modal-close-btn {
  width: 32px;
  height: 32px;
  border-radius: 6px;
  background: #00ACE3;
  border: none;
  color: #FFFFFF;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background .15s ease, transform .12s ease;
  flex-shrink: 0;
}

.tg-kb-modal-close-btn:hover {
  background: #0096C7;
  transform: scale(1.05);
}

.tg-kb-modal-title {
  font-size: 18px;
  font-weight: 600;
  color: #262626;
  margin: 0;
}

.tg-kb-btn-empty-template {
  padding: 6px 18px;
  border-radius: 20px;
  background: #FFFFFF;
  border: 1px solid #D2D8DE;
  color: #535C69;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  transition: all .15s ease;
}

.tg-kb-btn-empty-template:hover {
  background: #F8FAFC;
  border-color: #B5BFC8;
  color: #2067B0;
}

.tg-kb-modal-body {
  padding: 24px;
  overflow-y: auto;
  flex: 1;
}

.tg-kb-templates-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 20px;
}

@media (max-width: 768px) {
  .tg-kb-templates-grid {
    grid-template-columns: 1fr;
  }
}

.tg-kb-template-card {
  border: 1px solid #E2E8F0;
  border-radius: 10px;
  overflow: hidden;
  background: #FFFFFF;
  cursor: pointer;
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
  display: flex;
  flex-direction: column;
}

.tg-kb-template-card:hover {
  border-color: #00ACE3;
  box-shadow: 0 10px 28px rgba(0, 172, 227, 0.16);
  transform: translateY(-2px);
}

.tg-kb-template-card-title {
  padding: 12px 16px;
  font-size: 13px;
  font-weight: 700;
  color: #333333;
  background: #FFFFFF;
}

.tg-kb-template-card-img-wrap {
  width: 100%;
  height: 165px;
  overflow: hidden;
  background: #111827;
}

.tg-kb-template-card-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform .3s ease;
}

.tg-kb-template-card:hover .tg-kb-template-card-img {
  transform: scale(1.03);
}

.tg-kb-template-card-desc {
  padding: 12px 16px;
  font-size: 12px;
  line-height: 1.45;
  color: #64748B;
  background: #FFFFFF;
  border-top: 1px solid #F1F5F9;
  flex: 1;
}

.tg-kb-market-banner {
  margin-top: 24px;
  border-radius: 8px;
  background: linear-gradient(90deg, #00C0F0 0%, #00ADE8 100%);
  padding: 12px 20px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  cursor: pointer;
  overflow: hidden;
  position: relative;
  min-height: 74px;
  transition: opacity .15s ease, transform .15s ease;
}

.tg-kb-market-banner:hover {
  opacity: 0.96;
  transform: translateY(-1px);
}

.tg-kb-market-left {
  display: flex;
  align-items: center;
  gap: 14px;
}

.tg-kb-market-icon-circle {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: #FFFFFF;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #00ADE8;
  flex-shrink: 0;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
}

.tg-kb-market-text {
  color: #FFFFFF;
  font-size: 18px;
  font-weight: 600;
}

.tg-kb-market-mosaic {
  display: flex;
  gap: 8px;
  align-items: center;
  opacity: 0.88;
}

.tg-kb-market-tile {
  width: 72px;
  height: 52px;
  border-radius: 4px;
  background: rgba(255, 255, 255, 0.25);
  border: 1px solid rgba(255, 255, 255, 0.35);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

/* Modal Template Preview (Screenshot 3) */
.tg-kb-preview-card {
  background: #1E2229;
  width: 1240px;
  max-width: 98vw;
  height: 92vh;
  border-radius: 14px;
  box-shadow: 0 28px 72px rgba(0, 0, 0, 0.45);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  animation: tgScaleUp .22s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-kb-preview-header {
  background: #FFFFFF;
  border-bottom: 1px solid #EEF2F6;
  flex-shrink: 0;
}

.tg-kb-preview-header-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 18px;
  border-bottom: 1px solid #F1F5F9;
}

.tg-kb-preview-header-sub {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 20px;
  gap: 16px;
  flex-wrap: wrap;
}

.tg-kb-brand-title {
  font-size: 15px;
  font-weight: 700;
  color: #00ACE3;
  display: flex;
  align-items: center;
  gap: 6px;
}

.tg-kb-title-input-box {
  padding: 4px 14px;
  border: 1px solid #333333;
  border-radius: 4px;
  font-size: 13px;
  font-weight: 600;
  color: #222222;
  background: #FFFFFF;
  outline: none;
  min-width: 260px;
  box-sizing: border-box;
}

.tg-kb-title-input-box:focus {
  border-color: #00ACE3;
  box-shadow: 0 0 0 2px rgba(0, 172, 227, 0.2);
}

.tg-kb-preview-actions {
  display: flex;
  align-items: center;
  gap: 10px;
}

.tg-kb-btn-mobile {
  padding: 7px 16px;
  border-radius: 18px;
  border: 1px solid #C4CBD2;
  background: transparent;
  color: #535C69;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  cursor: pointer;
  transition: all .15s ease;
}

.tg-kb-btn-mobile:hover,
.tg-kb-btn-mobile.aktif {
  background: #F1F5F9;
  border-color: #94A3B8;
  color: #00ACE3;
}

.tg-kb-btn-create-submit {
  padding: 8px 20px;
  border-radius: 18px;
  background: #9ECE00;
  border: none;
  color: #FFFFFF;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  cursor: pointer;
  box-shadow: 0 3px 8px rgba(158, 206, 0, 0.4);
  transition: background .15s ease, transform .12s ease;
}

.tg-kb-btn-create-submit:hover {
  background: #8DBB00;
  transform: scale(1.02);
}

.tg-kb-preview-viewport {
  flex: 1;
  overflow-y: auto;
  position: relative;
  transition: all .25s ease;
  background: #1D2026;
}

.tg-kb-preview-viewport.is-mobile {
  width: 375px;
  margin: 20px auto;
  max-height: calc(100% - 40px);
  border-radius: 28px;
  border: 8px solid #334155;
  box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5);
  background: #1D2026;
}

.tg-kb-preview-canvas {
  min-height: 100%;
  padding: 36px 48px;
  box-sizing: border-box;
}

.tg-kb-canvas-dark {
  background: #1D2026 radial-gradient(circle at 10% 40%, rgba(138, 43, 226, 0.38) 0%, transparent 40%) radial-gradient(circle at 75% 30%, rgba(0, 180, 255, 0.25) 0%, transparent 45%);
  color: #FFFFFF;
}

.tg-kb-canvas-light {
  background: #F8FAFC radial-gradient(circle at 20% 30%, rgba(0, 172, 227, 0.08) 0%, transparent 45%);
  color: #1E293B;
}

.tg-kb-canvas-empty {
  background: #F1F5F9;
  color: #334155;
}

.tg-kb-nav-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  user-select: none;
}

.tg-kb-canvas-dark .tg-kb-nav-toggle {
  color: #00E5FF;
}

.tg-kb-canvas-light .tg-kb-nav-toggle {
  color: #00ACE3;
}

.tg-kb-subheading {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 2px;
  text-transform: uppercase;
  margin-top: 32px;
}

.tg-kb-canvas-dark .tg-kb-subheading { color: #94A3B8; }
.tg-kb-canvas-light .tg-kb-subheading { color: #64748B; }

.tg-kb-main-heading {
  font-size: 48px;
  font-weight: 800;
  letter-spacing: -1px;
  margin: 12px 0 16px;
  line-height: 1.15;
}

.tg-kb-canvas-dark .tg-kb-main-heading { color: #FFFFFF; }
.tg-kb-canvas-light .tg-kb-main-heading { color: #0F172A; }

.tg-kb-lead-text {
  font-size: 14px;
  line-height: 1.7;
  max-width: 680px;
  margin-bottom: 28px;
}

.tg-kb-canvas-dark .tg-kb-lead-text { color: #CBD5E1; }
.tg-kb-canvas-light .tg-kb-lead-text { color: #475569; }

.tg-kb-search-bar {
  display: flex;
  max-width: 680px;
  border-radius: 4px;
  overflow: hidden;
  margin-bottom: 36px;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
}

.tg-kb-search-input {
  flex: 1;
  padding: 12px 18px;
  border: none;
  outline: none;
  font-size: 14px;
}

.tg-kb-canvas-dark .tg-kb-search-bar { border: 1px solid #334155; }
.tg-kb-canvas-dark .tg-kb-search-input { background: #262C36; color: #FFFFFF; }
.tg-kb-canvas-light .tg-kb-search-bar { border: 1px solid #CBD5E1; }
.tg-kb-canvas-light .tg-kb-search-input { background: #FFFFFF; color: #1E293B; }

.tg-kb-search-submit {
  background: #00C4D6;
  color: #FFFFFF;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 1px;
  text-transform: uppercase;
  padding: 0 24px;
  border: none;
  cursor: pointer;
  transition: background .15s ease;
}

.tg-kb-search-submit:hover {
  background: #00B0C0;
}

.tg-kb-content-card {
  max-width: 680px;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
}

.tg-kb-canvas-dark .tg-kb-content-card {
  background: #252A34;
  border: 1px solid #334155;
}

.tg-kb-canvas-light .tg-kb-content-card {
  background: #FFFFFF;
  border: 1px solid #E2E8F0;
}

.tg-about-project-popover {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  width: 350px;
  background: #FFFFFF;
  border-radius: 12px;
  padding: 12px;
  box-shadow: 0 12px 36px rgba(0, 0, 0, 0.22), 0 2px 8px rgba(0, 0, 0, 0.08);
  border: 1px solid rgba(0, 0, 0, 0.06);
  z-index: 1050;
  text-align: left;
  animation: tgFadeInDown .18s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-about-popover-arrow {
  position: absolute;
  top: -6px;
  right: 48px;
  width: 12px;
  height: 12px;
  background: #FFFFFF;
  transform: rotate(45deg);
  border-top: 1px solid rgba(0, 0, 0, 0.08);
  border-left: 1px solid rgba(0, 0, 0, 0.08);
  z-index: 1;
}

.tg-about-card-primary {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  background: #FFFFFF;
  border: 1px solid #E2E8F0;
  border-radius: 10px;
  text-decoration: none;
  color: #1E293B;
  transition: all .15s ease;
  margin-bottom: 10px;
}

.tg-about-card-primary:hover {
  background: #F8FAFC;
  border-color: #CBD5E1;
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
}

.tg-about-icon-box {
  width: 40px;
  height: 40px;
  border-radius: 8px;
  background: #EFF6FF;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

.tg-about-text-box {
  flex: 1;
  min-width: 0;
}

.tg-about-title {
  font-size: 14px;
  font-weight: 700;
  color: #1E293B;
  line-height: 1.2;
}

.tg-about-subtitle {
  font-size: 11.5px;
  color: #64748B;
  margin-top: 3px;
  line-height: 1.2;
}

.tg-about-cards-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}

.tg-about-card-secondary {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 12px;
  background: #FFFFFF;
  border: 1px solid #E2E8F0;
  border-radius: 10px;
  text-decoration: none;
  color: #334155;
  font-size: 13px;
  font-weight: 600;
  transition: all .15s ease;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-about-card-secondary:hover {
  background: #F8FAFC;
  border-color: #CBD5E1;
  color: #0F172A;
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
}

.tg-about-mini-icon {
  width: 26px;
  height: 26px;
  border-radius: 6px;
  background: #F1F5F9;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}


.tg-proyek-hero-main {
  display: flex;
  align-items: center;
  gap: 16px;
  margin-bottom: 20px;
  flex-wrap: nowrap;
}

.tg-proyek-hero-avatar {
  width: 52px;
  height: 52px;
  border-radius: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 52px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  background: rgba(255, 255, 255, 0.18);
  border: 2px solid rgba(255, 255, 255, 0.35);
  color: #FFFFFF;
}

.tg-proyek-hero-title-box {
  flex: 0 1 auto;
  min-width: 0;
}

.tg-proyek-hero-title {
  font-size: 24px;
  font-weight: 700;
  line-height: 1.25;
  color: #FFFFFF;
  margin: 0 0 6px 0;
  letter-spacing: -0.01em;
}

.tg-proyek-hero-subtabs {
  display: flex;
  align-items: center;
  gap: 4px;
  overflow-x: auto;
  padding-bottom: 1px;
}

.tg-proyek-hero-subtab {
  font-size: 13.5px;
  color: rgba(255, 255, 255, 0.85);
  text-decoration: none;
  padding: 8px 16px;
  border-radius: 6px 6px 0 0;
  font-weight: 500;
  transition: all .15s ease;
  white-space: nowrap;
  background: transparent;
  border: none;
  cursor: pointer;
  outline: none;
  font-family: inherit;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.tg-proyek-hero-subtab:hover {
  color: #FFFFFF;
  background: rgba(255, 255, 255, 0.14);
}

.tg-proyek-hero-subtab.aktif {
  background: var(--surface);
  color: var(--accent);
  font-weight: 700;
  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);
}

/* Tab Content Panes */
.tg-tab-pane {
  animation: tgFadeIn 0.2s ease;
}

/* Toolbar Filter Lokal di Tab Semua Tugas */
.tg-tab-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 18px;
  background: var(--line-soft);
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
  gap: 12px;
  flex-wrap: wrap;
}

.tg-tab-chips {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}

.tg-tab-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 12px;
  border-radius: 20px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--text-tinta-2, var(--ink-soft));
  background: var(--line-soft);
  border: 1px solid transparent;
  cursor: pointer;
  transition: all .15s ease;
}

.tg-tab-chip:hover {
  background: var(--line);
  color: var(--text-tinta, var(--ink));
}

.tg-tab-chip.aktif {
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru-2, var(--accent));
  border-color: var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
}

.tg-tab-chip-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 8px;
  font-size: 11px;
  font-weight: 700;
  background: rgba(0, 0, 0, 0.08);
}

.tg-tab-chip.aktif .tg-tab-chip-count {
  background: var(--color-biru-2, var(--accent));
  color: #FFFFFF;
}

.tg-tab-search {
  display: inline-flex;
  align-items: center;
  background: var(--surface);
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 6px;
  padding: 0 10px;
  height: 32px;
  width: 240px;
  gap: 6px;
}

.tg-tab-search input {
  border: none;
  background: transparent;
  outline: none;
  font-size: 13px;
  color: var(--text-tinta, var(--ink));
  width: 100%;
}

/* Row Kartu Metrik Statistik */
.tg-proyek-stats-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 16px;
  margin-bottom: 24px;
}

.tg-proyek-stat-card {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  padding: 16px 18px;
  box-shadow: 0 2px 8px rgba(11, 47, 107, 0.05);
  text-decoration: none;
  color: inherit;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: 8px;
  position: relative;
  overflow: hidden;
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}

.tg-proyek-stat-card:hover {
  transform: translateY(-2px);
  border-color: var(--color-biru-2, var(--accent));
  box-shadow: 0 8px 24px rgba(11, 47, 107, 0.12);
}

.tg-proyek-stat-card.stat-lewat {
  border-left: 4px solid var(--color-merah, #B42318);
}

.tg-proyek-stat-card.stat-lewat:hover {
  border-color: var(--color-merah, #B42318);
}

.tg-proyek-stat-card.stat-lewat .tg-stat-angka {
  color: var(--color-merah, var(--status-merah));
}

.tg-proyek-stat-card.stat-saya {
  border-left: 4px solid var(--color-biru-2, var(--accent));
}

.tg-proyek-stat-card.stat-saya:hover {
  border-color: var(--color-biru-2, var(--accent));
}

.tg-proyek-stat-card.stat-saya .tg-stat-angka {
  color: var(--color-biru-2, var(--accent));
}

.tg-stat-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.tg-stat-label {
  font-size: 12px;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.tg-stat-icon {
  width: 28px;
  height: 28px;
  border-radius: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru, var(--accent));
}

.tg-stat-angka {
  font-size: 26px;
  font-weight: 700;
  line-height: 1.15;
  color: var(--text-tinta, var(--ink));
  font-variant-numeric: tabular-nums;
  margin: 2px 0;
}

.tg-stat-subtext {
  font-size: 12px;
  color: var(--text-redup, var(--muted));
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Kartu Informasi & Tim Proyek */
.tg-proyek-info-card {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  box-shadow: 0 2px 10px rgba(11, 47, 107, 0.05);
  padding: 20px 22px;
  margin-bottom: 24px;
}

.tg-proyek-info-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 14px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
}

.tg-proyek-info-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 16px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  margin: 0;
}

.tg-proyek-detail-desc {
  font-size: 14px;
  line-height: 1.6;
  color: var(--text-tinta-2, var(--ink-soft));
  margin: 0 0 18px 0;
  white-space: pre-wrap;
}

/* Grid Tim Anggota Proyek */
.tg-proyek-members-header {
  font-size: 13px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-redup, var(--muted));
  margin: 0 0 12px 0;
}

.tg-proyek-members-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 10px;
}

.tg-member-card {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 12px;
  background: var(--line-soft);
  border: 1px solid var(--border-garis-2, var(--line-soft));
  border-radius: 8px;
  transition: all .15s ease;
}

.tg-member-card:hover {
  background: var(--accent-w);
  border-color: var(--pb-biru-w2, #D7E6FF);
}

.tg-member-card.tg-member-nonaktif {
  opacity: .55;
}

.tg-member-info {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.tg-member-name {
  font-size: 13px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tg-member-role-badge {
  font-size: 10.5px;
  font-weight: 600;
  padding: 1px 6px;
  border-radius: 4px;
  display: inline-block;
  width: fit-content;
  margin-top: 2px;
}

.tg-role-pemilik {
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru, var(--accent));
}

.tg-role-moderator {
  background: #F3E8FF;
  color: #7E22CE;
}

.tg-role-anggota {
  background: var(--line-soft);
  color: #475569;
}

.tg-anggota { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; }

.tg-anggota-satu { display: flex; align-items: center; gap: 7px; font-size: .85rem; }

.tg-anggota-satu small { display: block; font-size: .72rem; }

.tg-anggota-mati { opacity: .55; }

.tg-lingkup { margin: -2px 0 10px; }

.tg-putus { display: flex; flex-direction: column; gap: 9px; }

.tg-putus-form { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }

.tg-putus-form input[type=text] { flex: 1 1 220px; }

.tg-riwayat { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; font-size: .84rem; }

.tg-riwayat li { display: grid; grid-template-columns: 118px 118px minmax(0, 1fr); gap: 10px; align-items: baseline; }

@media (max-width: 640px) { .tg-riwayat li { grid-template-columns: minmax(0, 1fr); gap: 1px; } }

.tg-riwayat-waktu { color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }

.tg-riwayat-bidang { color: var(--ink-soft); font-weight: 600; }

.tg-hari-pilih { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin: 6px 0 4px; }

.tg-hari-pilih[hidden] { display: none !important; }

.tg-hari-pilih .field-label { font-size: .8rem; color: var(--muted); }

.tg-form-tersembunyi { display: none; }

.tg-tambah-kolom { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-top: 10px; }

.tg-tambah-kolom input[type=text] { flex: 1 1 200px; }

.tg-tambah-anggota { margin-top: 14px; border-top: 1px solid var(--line); padding-top: 12px; }

.tg-hapus:hover { color: var(--crit); border-color: var(--crit); }

.tg-tag-baris { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 10px; }

.tg-tag-satu { display: inline-flex; align-items: center; gap: 3px; }

.tg-tag-lepas { border: none; background: transparent; color: inherit; cursor: pointer; padding: 0 1px; font-size: .9em; opacity: .6; }

.tg-tag-lepas:hover { opacity: 1; color: var(--crit); }

.tg-tag-tambah { display: inline-flex; gap: 5px; align-items: center; margin: 0; }

.tg-tag-tambah input { width: 120px; }

.tg-gantung-tambah { display: flex; gap: 8px; align-items: center; margin-top: 10px; flex-wrap: wrap; }

.tg-gantung-tambah select { flex: 1 1 260px; max-width: 100%; }

.tg-daftar-ringkas form { display: inline-flex; margin: 0; }

.tg-bilah-lewat i { background: var(--crit); }

/* =====================================================================
   BITRIX24 SLIDE-UP MODAL (TUGAS LIHAT)
   ===================================================================== */
.tg-slideover-backdrop {
  position: fixed;
  inset: 0;
  z-index: 1000;
  background: rgba(15, 30, 60, 0.52);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
  box-sizing: border-box;
}

.tg-slideover-wrapper {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  max-width: 100%;
  max-height: 100%;
}

/* Floating Vertical Rail Buttons (Kiri) */
.tg-slideover-rail {
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 0 0 auto;
  margin-top: 10px;
}

.tg-rail-btn {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--color-biru-2, var(--accent));
  color: #FFFFFF !important;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  cursor: pointer;
  box-shadow: 0 4px 12px rgba(18, 80, 155, 0.35);
  text-decoration: none;
  transition: transform .15s ease, background-color .15s ease;
}

.tg-rail-btn:hover {
  background: var(--color-biru, var(--accent-2));
  transform: scale(1.08);
  color: #FFFFFF !important;
}

.tg-rail-btn svg {
  width: 18px;
  height: 18px;
}

/* Modal Frame */
.tg-slideover-modal {
  width: min(1480px, 92vw);
  height: min(92vh, 880px);
  background: var(--surface);
  border-radius: 14px;
  box-shadow: 0 24px 70px rgba(10, 25, 50, 0.45), 0 4px 20px rgba(0, 0, 0, 0.15);
  display: flex;
  overflow: hidden;
  position: relative;
  animation: tgSlideUp .22s cubic-bezier(0.16, 1, 0.3, 1);
}

/* MODAL PROYEK BITRIX24 (SINGLE PANEL, TANPA CHAT) */
.tg-slideover-modal.tg-modal-proyek {
  width: min(860px, 94vw);
  height: min(90vh, 840px);
  max-height: 90vh;
  max-width: 860px;
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border-radius: 14px;
  box-shadow: 0 24px 70px rgba(10, 25, 50, 0.45), 0 4px 20px rgba(0, 0, 0, 0.15);
  overflow: hidden;
  position: relative;
  animation: tgSlideUp .22s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-modal-proyek-head {
  padding: 16px 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--line-soft);
  border-bottom: 1px solid var(--border-garis, var(--line));
  flex-shrink: 0;
}

.tg-proyek-head-icon {
  width: 40px;
  height: 40px;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
}

.tg-modal-proyek-title {
  font-size: 16.5px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  margin: 0;
  line-height: 1.25;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 520px;
}

.tg-modal-proyek-sub {
  font-size: 12px;
  color: var(--text-redup, var(--muted));
  margin-top: 2px;
}

.tg-modal-proyek-close {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: transparent;
  border: none;
  font-size: 20px;
  line-height: 1;
  color: var(--text-redup, var(--muted));
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background-color .12s, color .12s;
}

.tg-modal-proyek-close:hover {
  background: var(--line-soft);
  color: var(--text-tinta, var(--ink));
}

.tg-modal-proyek-subtabs {
  display: flex;
  gap: 8px;
  padding: 0 24px;
  background: var(--line-soft);
  border-bottom: 1px solid var(--border-garis, var(--line));
  flex-shrink: 0;
}

.tg-proyek-subtab {
  padding: 10px 14px;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
  background: transparent;
  border: none;
  border-bottom: 2px solid transparent;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  transition: color .12s, border-color .12s;
}

.tg-proyek-subtab:hover {
  color: var(--color-biru-2, var(--accent));
}

.tg-proyek-subtab.aktif {
  color: var(--color-biru-2, var(--accent));
  border-bottom-color: var(--color-biru-2, var(--accent));
}

.tg-tab-counter {
  font-size: 10.5px;
  font-weight: 700;
  padding: 1px 6px;
  border-radius: 10px;
  background: var(--accent-w);
  color: var(--color-biru-2, var(--accent));
}

.tg-modal-proyek-body {
  flex: 1 1 auto;
  min-height: 0;
  max-height: 100%;
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  padding: 24px;
  background: var(--surface);
}

.tg-modal-proyek-foot {
  padding: 14px 24px;
  background: var(--line-soft);
  border-top: 1px solid var(--border-garis, var(--line));
  display: flex;
  align-items: center;
  gap: 12px;
  flex-shrink: 0;
  margin-top: auto;
}

.tg-input-modern {
  width: 100%;
  padding: 8px 12px;
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 8px;
  font-size: 13.5px;
  color: var(--text-tinta, var(--ink));
  background: var(--surface);
  outline: none;
  box-sizing: border-box;
  transition: border-color .15s, box-shadow .15s;
}

.tg-input-modern:focus {
  border-color: var(--color-biru-tepi, var(--accent));
  box-shadow: 0 0 0 3px rgba(43, 125, 233, 0.15);
}

.tg-color-swatches {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.tg-color-swatch {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  cursor: pointer;
  border: 2px solid var(--surface);
  box-shadow: 0 0 0 1px var(--line);
  transition: transform .12s, box-shadow .12s;
  padding: 0;
}

.tg-color-swatch:hover,
.tg-color-swatch.aktif {
  transform: scale(1.15);
  box-shadow: 0 0 0 2px var(--color-biru-2, var(--accent));
}

.tg-proyek-options-card {
  background: var(--line-soft);
  border: 1px solid var(--border-garis-2, var(--line-soft));
  border-radius: 10px;
  padding: 14px 18px;
}

.tg-option-row {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  cursor: pointer;
  user-select: none;
}

.tg-option-row input[type="checkbox"] {
  margin-top: 3px;
  cursor: pointer;
}

/* =====================================================================
   COMBOBOX MULTISELECT DENGAN AUTOCOMPLETE SEARCH (PROYEK & ANGGOTA)
   ===================================================================== */
.tg-combobox-wrapper {
  position: relative;
  width: 100%;
}

.tg-combobox-field {
  background: var(--surface);
  border: 1.5px solid var(--line);
  border-radius: 8px;
  min-height: 42px;
  padding: 4px 8px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  cursor: text;
  box-sizing: border-box;
  transition: border-color .15s ease, box-shadow .15s ease;
}

.tg-combobox-field:focus-within,
.tg-combobox-field.is-focused {
  border-color: #00ACE3;
  box-shadow: 0 0 0 3px rgba(0, 172, 227, 0.15);
}

.tg-combobox-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
}

.tg-combo-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: var(--accent-w);
  border: 1px solid #BAE4F8;
  border-radius: 16px;
  padding: 3px 8px 3px 4px;
  font-size: 12.5px;
  color: var(--ink);
  font-weight: 500;
  line-height: 1.2;
  user-select: none;
  animation: tgFadeIn 0.12s ease;
}

.tg-combo-chip-avatar {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: #00ACE3;
  color: #FFFFFF;
  font-size: 9.5px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  text-transform: uppercase;
  flex-shrink: 0;
}

.tg-combo-chip-name {
  max-width: 180px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-combo-chip-remove {
  border: none;
  background: transparent;
  color: var(--muted);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  padding: 0 2px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: color .12s, transform .12s;
}

.tg-combo-chip-remove:hover {
  color: #EF4444;
  transform: scale(1.15);
}

.tg-combobox-input-wrap {
  flex: 1 1 140px;
  min-width: 140px;
  display: flex;
  align-items: center;
}

.tg-combobox-search-input {
  width: 100%;
  border: none !important;
  outline: none !important;
  background: transparent !important;
  box-shadow: none !important;
  font-size: 13px !important;
  color: var(--ink) !important;
  padding: 4px 2px !important;
  margin: 0 !important;
  font-family: inherit;
}

.tg-combobox-search-input::placeholder {
  color: #8C9BAE;
}

.tg-combobox-actions {
  display: flex;
  align-items: center;
  gap: 4px;
  margin-left: auto;
  flex-shrink: 0;
}

.tg-combobox-clear-btn {
  background: transparent;
  border: none;
  color: var(--muted);
  font-size: 16px;
  cursor: pointer;
  padding: 2px 6px;
  border-radius: 4px;
  line-height: 1;
  transition: color .15s;
}

.tg-combobox-clear-btn:hover {
  color: #EF4444;
}

.tg-combobox-arrow-btn {
  background: transparent;
  border: none;
  color: var(--muted);
  cursor: pointer;
  padding: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 4px;
  transition: transform .18s ease, color .15s;
}

.tg-combobox-arrow-btn:hover {
  color: var(--ink);
}

.tg-combobox-arrow-btn.is-open {
  transform: rotate(180deg);
  color: #00ACE3;
}

.tg-combobox-dropdown {
  position: absolute;
  top: calc(100% + 5px);
  left: 0;
  right: 0;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 8px;
  box-shadow: 0 10px 30px rgba(0, 28, 60, 0.15);
  z-index: 1000;
  overflow: hidden;
  max-height: 290px;
  display: flex;
  flex-direction: column;
  animation: tgSlideDown 0.14s cubic-bezier(0.4, 0, 0.2, 1);
}

.tg-combobox-dropdown-head {
  padding: 8px 12px;
  background: var(--line-soft);
  border-bottom: 1px solid var(--line);
  font-size: 12px;
  font-weight: 600;
  color: var(--muted);
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.tg-combobox-list {
  list-style: none;
  margin: 0;
  padding: 4px 0;
  overflow-y: auto;
  max-height: 240px;
}

.tg-combobox-list::-webkit-scrollbar {
  width: 5px;
}

.tg-combobox-list::-webkit-scrollbar-thumb {
  background: var(--line);
  border-radius: 3px;
}

.tg-combobox-item {
  padding: 7px 12px;
  display: flex;
  align-items: center;
  gap: 10px;
  cursor: pointer;
  transition: background .12s ease;
  user-select: none;
}

.tg-combobox-item:hover,
.tg-combobox-item.is-highlighted {
  background: #F0F7FF;
}

.tg-combobox-item.is-selected {
  background: var(--accent-w);
}

.tg-combobox-item-avatar {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  color: #FFFFFF;
  font-size: 11px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  text-transform: uppercase;
}

.tg-combobox-item-info {
  flex: 1 1 auto;
  min-width: 0;
}

.tg-combobox-item-name {
  font-size: 13px;
  font-weight: 600;
  color: var(--ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-combobox-item-role {
  font-size: 11.5px;
  color: var(--muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin-top: 1px;
}

.tg-combobox-item-check {
  width: 18px;
  height: 18px;
  border: 1.5px solid var(--line);
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: transparent;
  flex-shrink: 0;
  transition: all .12s ease;
}

.tg-combobox-item.is-selected .tg-combobox-item-check {
  background: #00ACE3;
  border-color: #00ACE3;
  color: #FFFFFF;
}

.tg-combobox-empty {
  padding: 18px 14px;
  text-align: center;
  color: var(--muted);
  font-size: 13px;
}

/* PANEL DETAIL (KIRI, ±45%) */
.tg-panel-detail {
  flex: 0 0 46%;
  max-width: 48%;
  min-width: 460px;
  display: flex;
  flex-direction: column;
  background: var(--line-soft);
  border-right: 1px solid var(--border-garis, var(--line));
  height: 100%;
  position: relative;
}

.tg-detail-scroll {
  flex: 1 1 auto;
  overflow-y: auto;
  padding: 22px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

/* ISINYA MENGGULIR, BUKAN DIMAMPATKAN - 20 Oktober 2026.
   ---------------------------------------------------------------------
   Dilaporkan pemilik projek: begitu satu nama ditambahkan ke
   Participants atau Observers, kotak Description MENGERUT menjadi
   sebilah garis - bilah alatnya pun ikut hilang.

   Sebabnya kolom ini flex. Anak flex berukuran bawaan flex-shrink:1,
   jadi saat satu kartu bertambah tinggi, peramban memampatkan kartu
   LAIN supaya semuanya tetap muat - alih-alih membiarkan kolomnya
   menggulir. Kartu Description yang paling terlihat karena ia
   overflow:hidden: ia mengerut tanpa suara lalu memotong isinya.

   min-height pada textarea-nya TIDAK menolong, dan itu yang membuat
   cacat ini membingungkan: yang dimampatkan KARTUNYA, bukan
   textarea di dalamnya.

   Di wadah yang memang menggulir, tidak ada satu pun anak yang pantas
   mengerut - itulah gunanya ia menggulir. */
.tg-detail-scroll > * { flex-shrink: 0; }

.tg-detail-scroll::-webkit-scrollbar {
  width: 6px;
}

.tg-detail-scroll::-webkit-scrollbar-thumb {
  background: var(--line);
  border-radius: 3px;
}

/* Header Detail */
.tg-detail-header {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 2px;
}

.tg-detail-title-row {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 14px;
}

.tg-modal-title {
  font-size: 22px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  line-height: 1.25;
  margin: 0;
  letter-spacing: -0.01em;
}

.tg-detail-actions {
  display: flex;
  align-items: center;
  gap: 14px;
  font-size: 13.5px;
}

.tg-detail-link {
  color: var(--color-biru-2, var(--accent));
  text-decoration: none;
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: 5px;
}

.tg-detail-link:hover {
  text-decoration: underline;
}

/* Cards di Panel Detail */
.tg-detail-card {
  background: var(--surface);
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 10px;
  padding: 16px 18px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);
}

/* Grid Properti (Label - Nilai) */
.tg-prop-grid {
  display: flex;
  flex-direction: column;
}

.tg-prop-row {
  min-height: 42px;
  display: flex;
  align-items: center;
  border-bottom: 1px solid var(--ground);
  padding: 4px 0;
}

.tg-prop-row:last-child {
  border-bottom: none;
}

.tg-prop-label {
  width: 150px;
  flex: 0 0 150px;
  font-size: 13.5px;
  color: var(--text-redup, var(--muted));
  font-weight: 500;
}

.tg-prop-value {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  color: var(--text-tinta, var(--ink));
}

.tg-prop-divider {
  height: 1px;
  background: var(--border-garis-2, var(--line-soft));
  margin: 6px 0;
}

/* Card Files */
.tg-files-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
}

.tg-files-title {
  font-size: 14.5px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  display: flex;
  align-items: center;
  gap: 6px;
}

.tg-files-add {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1px solid var(--border-garis, var(--line));
  background: var(--surface);
  color: var(--color-biru-2, var(--accent));
  font-size: 16px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all .15s ease;
}

.tg-files-add:hover {
  background: var(--badge-biru-bg, var(--accent-w));
  border-color: var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
}

.tg-files-grid {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

.tg-file-thumb {
  width: 106px;
  height: 94px;
  border-radius: 10px;
  border: 1px solid var(--border-garis, var(--line));
  background: var(--line-soft);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 8px 6px;
  text-decoration: none;
  cursor: pointer;
  transition: all .15s ease;
  box-sizing: border-box;
}

.tg-file-thumb:hover {
  border-color: var(--color-biru-2, var(--accent));
  background: var(--surface);
  box-shadow: 0 4px 12px rgba(26, 99, 196, 0.12);
}

.tg-file-icon-box {
  width: 38px;
  height: 42px;
  background: var(--line-soft);
  border-radius: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  font-weight: 700;
  color: var(--text-tinta-2, var(--ink-soft));
  text-transform: uppercase;
  margin-bottom: 6px;
}

.tg-file-name {
  font-size: 11px;
  color: var(--text-tinta, var(--ink));
  width: 100%;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Card Project & Stage */
.tg-stage-chevron {
  background: var(--accent-w);
  color: var(--color-biru-2, var(--accent));
  font-size: 13px;
  font-weight: 600;
  padding: 4px 14px;
  border-radius: 6px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
}

/* Chip Fitur (Progressive Disclosure) */
.tg-feature-chips {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin: 4px 0 10px;
}

.tg-fchip {
  height: 34px;
  padding: 0 12px;
  border-radius: 8px;
  background: var(--surface);
  border: 1px solid #DDE4EE;
  font-size: 13px;
  color: var(--text-tinta-2, var(--ink-soft));
  display: inline-flex;
  align-items: center;
  gap: 6px;
  cursor: pointer;
  text-decoration: none;
  transition: all .15s ease;
  user-select: none;
}

.tg-fchip:hover {
  background: var(--badge-biru-bg, var(--accent-w));
  color: var(--color-biru-2, var(--accent));
  border-color: var(--pb-biru-w2, #D7E6FF);
}

.tg-fchip.aktif {
  background: var(--badge-biru-bg, var(--accent-w));
  border-color: var(--pb-biru-w2, #D7E6FF);
  color: var(--color-biru-2, var(--accent));
  font-weight: 600;
}

/* Sticky Footer (Detail Panel) */
.tg-detail-footer {
  flex: 0 0 58px;
  height: 58px;
  background: var(--surface);
  border-top: 1px solid var(--border-garis, var(--line));
  padding: 0 20px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  z-index: 10;
  border-bottom-left-radius: 14px;
}

.tg-footer-btns {
  display: flex;
  align-items: center;
  gap: 12px;
}

.tg-btn-start {
  height: 38px;
  padding: 0 22px;
  background: var(--btn-primary-bg, var(--accent));
  color: #FFFFFF !important;
  font-size: 14px;
  font-weight: 700;
  border-radius: 8px;
  border: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 2px 6px rgba(26, 99, 196, 0.25);
  transition: background-color .15s ease;
}

.tg-btn-start:hover {
  background: var(--btn-primary-hover, var(--accent-2));
}

.tg-btn-complete {
  height: 38px;
  padding: 0 18px;
  background: var(--surface);
  color: var(--text-tinta, var(--ink));
  font-size: 14px;
  font-weight: 600;
  border-radius: 8px;
  border: 1px solid #D0D9E4;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: all .15s ease;
}

.tg-btn-complete:hover {
  background: var(--ground);
  border-color: #BAC7D5;
}

.tg-btn-more {
  height: 38px;
  width: 38px;
  background: transparent;
  border: none;
  border-radius: 8px;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 18px;
  color: var(--text-redup, var(--muted));
  transition: background-color .15s ease;
}

.tg-btn-more:hover {
  background: var(--line-soft);
  color: var(--text-tinta, var(--ink));
}

.tg-footer-meta {
  display: flex;
  align-items: center;
  gap: 16px;
  font-size: 13px;
  color: var(--text-redup, var(--muted));
}

/* PANEL CHAT (KANAN, ±55%) */
.tg-panel-chat {
  flex: 1 1 54%;
  display: flex;
  flex-direction: column;
  background: #E9F4F8;
  position: relative;
  border-top-right-radius: 14px;
  border-bottom-right-radius: 14px;
  overflow: hidden;
  transition: padding-right .2s ease;
  --pb-grad-a: #12509B; --pb-grad-b: #1A63C4;
  --pb-av0: #1A63C4; --pb-av1: #2F6F4C; --pb-av2: #6B4A9E; --pb-av3: #A8501A;
  --pb-av4: #1F5F99; --pb-av5: #9E382B; --pb-av6: #4B6B1E; --pb-av7: #7A3F6B;
  --pb-pil: rgba(16, 28, 48, .42);
  --pb-biru: #1A63C4; --pb-biru-tua: #12509B;
  --pb-biru-w: #EEF5FF; --pb-biru-w2: #D7E6FF;
  --pb-latar: #E9F0FA; --pb-kartu: #FFFFFF;
  --pb-saya: #E0F2DF; --pb-lain: #FFFFFF;
  --pb-garis: #E3E9F2; --pb-garis2: #EEF2F8;
  --pb-tinta2: #33415C; --pb-redup: #5D6B82;
  --pb-kaca: rgba(255, 255, 255, .82);
}

.tg-panel-chat.pb-panel-buka {
  padding-right: 340px;
}

.tg-panel-chat .pb-panel {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 340px;
  z-index: 50;
  display: flex;
  flex-direction: column;
  background: var(--surface, #FFF);
  border-left: 1px solid #E0EBF0;
  box-shadow: -4px 0 16px rgba(0, 0, 0, 0.06);
  border-top-right-radius: 14px;
  border-bottom-right-radius: 14px;
  overflow: hidden;
}

@media (max-width: 900px) {
  .tg-panel-chat.pb-panel-buka {
    padding-right: 0;
  }
  .tg-panel-chat .pb-panel {
    width: 100%;
    max-width: 340px;
  }
}

.tg-chat-item-sorot {
  animation: tgSorotKomentar 2.4s ease;
}

@keyframes tgSorotKomentar {
  0% { background: rgba(33, 150, 243, 0.28); border-radius: 8px; }
  100% { background: transparent; }
}

/* Chat Header */
.tg-chat-header {
  height: 56px;
  flex: 0 0 56px;
  background: var(--surface);
  border-bottom: 1px solid #E0EBF0;
  padding: 0 20px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-top-right-radius: 14px;
}

.tg-chat-head-left {
  display: flex;
  align-items: center;
  gap: 10px;
}

.tg-chat-icon-avatar {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: #E6F3FB;
  color: var(--accent);
  display: flex;
  align-items: center;
  justify-content: center;
}

.tg-chat-head-info strong {
  display: block;
  font-size: 15px;
  color: var(--text-tinta, var(--ink));
  line-height: 1.2;
}

.tg-chat-head-info small {
  font-size: 12px;
  color: var(--text-redup, var(--muted));
}

.tg-chat-head-right {
  display: flex;
  align-items: center;
  gap: 12px;
}

.tg-btn-videocall {
  height: 32px;
  padding: 0 14px;
  background: var(--accent-w);
  color: var(--color-biru-2, var(--accent));
  border: 1px solid var(--badge-biru-border, var(--pb-biru-w2, #D7E6FF));
  border-radius: 6px;
  font-size: 13px;
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  cursor: pointer;
  text-decoration: none;
}

.tg-chat-tool-btn {
  background: transparent;
  border: none;
  color: var(--muted);
  cursor: pointer;
  padding: 6px;
  border-radius: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.tg-chat-tool-btn:hover {
  background: var(--line-soft);
  color: var(--ink);
}

/* Chat Messages Stream with Pattern */
.tg-chat-stream {
  flex: 1 1 auto;
  overflow-y: auto;
  padding: 20px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  background-color: #EBF4F7;
  background-image: radial-gradient(#D5E7EE 1px, transparent 1px);
  background-size: 20px 20px;
}

.tg-chat-stream::-webkit-scrollbar {
  width: 6px;
}

.tg-chat-stream::-webkit-scrollbar-thumb {
  background: var(--line);
  border-radius: 3px;
}

/* Chat Date Pill & System Bubble */
.tg-chat-date-pill {
  align-self: center;
  background: rgba(0, 0, 0, 0.22);
  color: #FFFFFF;
  font-size: 11.5px;
  font-weight: 600;
  padding: 3px 14px;
  border-radius: 12px;
  margin: 6px 0;
  text-transform: capitalize;
}

.tg-chat-system-bubble {
  align-self: center;
  background: rgba(255, 255, 255, 0.7);
  backdrop-filter: blur(2px);
  color: var(--text-tinta-2, var(--ink-soft));
  border-radius: 10px;
  padding: 8px 16px;
  font-size: 13px;
  text-align: center;
  border: 1px solid rgba(255, 255, 255, 0.6);
  max-width: 80%;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.03);
}

.tg-chat-bubble-time {
  display: block;
  font-size: 11px;
  color: var(--text-redup, var(--muted));
  margin-top: 2px;
}

/* Chat Message Items */
.tg-chat-item {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  max-width: 88%;
  position: relative;
}

.tg-chat-item.tg-chat-me {
  align-self: flex-end;
  flex-direction: row-reverse;
}

.tg-chat-item .chat-alat {
  opacity: 0;
  transition: opacity .12s ease;
  align-self: center;
  flex: 0 0 auto;
}

.tg-chat-item:hover .chat-alat,
.tg-chat-item:focus-within .chat-alat,
.tg-chat-item .chat-alat:focus-within {
  opacity: 1;
}

.tg-chat-item.tg-chat-me .chat-pemetik,
.tg-chat-item.tg-chat-me .chat-menu {
  left: auto;
  right: 0;
}

.tg-chat-msg-box {
  background: var(--surface);
  border-radius: 12px;
  padding: 10px 14px;
  box-shadow: 0 2px 6px rgba(11, 47, 107, 0.05);
  border: 1px solid rgba(227, 233, 242, 0.7);
}

.tg-chat-me .tg-chat-msg-box {
  background: var(--accent-w);
  border-color: var(--pb-biru-w2, #D7E6FF);
}

.tg-chat-author-line {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 4px;
}

.tg-chat-author-name {
  font-size: 13px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
}

.tg-chat-me .tg-chat-author-name {
  color: var(--color-biru-2, var(--accent));
}

.tg-chat-msg-time {
  font-size: 11px;
  color: var(--text-redup, var(--muted));
}

.tg-chat-body {
  font-size: 14px;
  color: var(--text-tinta, var(--ink));
  line-height: 1.5;
  margin: 0;
  word-break: break-word;
}

/* Chat Composer (Rounded Card at Bottom) */
.tg-chat-composer-wrap {
  padding: 12px 18px 16px;
  background: transparent;
  flex: 0 0 auto;
}

.tg-composer-card {
  background: var(--surface);
  border: 1px solid #D2E1E8;
  border-radius: 12px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04);
  padding: 10px 14px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  transition: border-color .15s ease, box-shadow .15s ease;
  position: relative;
}

.tg-composer-card:focus-within {
  border-color: var(--color-biru-2, var(--accent));
  box-shadow: 0 4px 14px rgba(26, 99, 196, 0.12);
}

.tg-composer-input {
  border: none;
  outline: none;
  width: 100%;
  resize: none;
  font-size: 14px;
  color: var(--text-tinta, var(--ink));
  font-family: inherit;
  min-height: 38px;
  max-height: 120px;
  background: transparent;
}

.tg-composer-input::placeholder {
  color: var(--text-redup, var(--muted));
}

.tg-composer-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-top: 4px;
}

.tg-composer-tools-left,
.tg-composer-tools-right {
  display: flex;
  align-items: center;
  gap: 8px;
}

.tg-composer-icon-btn {
  background: transparent;
  border: none;
  color: #718299;
  cursor: pointer;
  padding: 4px;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.tg-composer-icon-btn:hover {
  color: var(--color-biru-2, var(--accent));
}

.tg-btn-chat-send {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: #00A8E8;
  color: #FFFFFF;
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  box-shadow: 0 2px 6px rgba(0, 168, 232, 0.3);
  transition: transform .15s ease, background-color .15s ease;
}

.tg-btn-chat-send:hover {
  background: #0093CB;
  transform: scale(1.06);
}

/* =====================================================================
   BITRIX24 TASK FORM MODE (CREATE / EDIT)
   ===================================================================== */
.tg-form-title-wrap {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 4px 0 2px;
}

.tg-form-title-input {
  font-size: 22px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  border: none;
  background: transparent;
  outline: none;
  width: 100%;
  padding: 4px 0;
  font-family: inherit;
  line-height: 1.25;
}

.tg-form-title-input::placeholder {
  color: var(--muted);
  font-weight: 500;
}

/* Fire Priority Toggle */
.tg-btn-fire-prio {
  background: transparent;
  border: none;
  cursor: pointer;
  color: var(--muted);
  padding: 6px;
  border-radius: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: color .15s ease, transform .15s ease, background-color .15s ease;
  flex: 0 0 auto;
}

.tg-btn-fire-prio:hover {
  color: #FF9800;
  transform: scale(1.12);
}

.tg-btn-fire-prio.aktif {
  color: #FF5722;
  background: var(--status-kuning-bg);
}

.tg-btn-fire-prio svg {
  width: 20px;
  height: 20px;
}

/* Description Editor Card & Toolbar */
.tg-desc-card {
  background: var(--surface);
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 10px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);
  margin-top: 6px;
}

.tg-desc-textarea {
  min-height: 110px;
  padding: 14px 16px;
  border: none;
  outline: none;
  resize: vertical;
  font-size: 14px;
  color: var(--text-tinta, var(--ink));
  font-family: inherit;
  line-height: 1.55;
  width: 100%;
  box-sizing: border-box;
}

.tg-desc-textarea::placeholder {
  color: var(--muted);
}

.tg-desc-toolbar {
  height: 44px;
  border-top: 1px solid var(--border-garis-2, var(--line-soft));
  padding: 0 14px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--line-soft);
}

.tg-desc-tools-left {
  display: flex;
  align-items: center;
  gap: 18px;
}

.tg-desc-tool-btn {
  background: transparent;
  border: none;
  color: #718299;
  cursor: pointer;
  padding: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  transition: color .15s ease;
}

.tg-desc-tool-btn:hover {
  color: var(--color-biru-2, var(--accent));
}

.tg-desc-tool-purple {
  color: #8E24AA !important;
  font-weight: 600;
  font-size: 13px;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  cursor: pointer;
  border: none;
  background: transparent;
  padding: 4px 6px;
  border-radius: 4px;
  transition: background-color .15s ease;
}

.tg-desc-tool-purple:hover {
  background: #F3E5F5;
}

/* Chat Disabled & Empty State Card */
.tg-panel-chat.tg-chat-disabled {
  opacity: 0.52;
  user-select: none;
}

.tg-chat-empty-card {
  background: var(--surface);
  border-radius: 14px;
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.06);
  padding: 24px 28px;
  margin: auto;
  display: flex;
  align-items: center;
  gap: 22px;
  max-width: 440px;
  border: 1px solid rgba(227, 233, 242, 0.85);
}

.tg-chat-empty-illus {
  width: 58px;
  height: 68px;
  background: #E8F4F8;
  border-radius: 8px;
  border: 2px solid #B8DFEE;
  display: flex;
  flex-direction: column;
  padding: 8px 6px;
  gap: 6px;
  box-sizing: border-box;
  flex: 0 0 58px;
}

.tg-illus-bar {
  height: 6px;
  background: #4DA8DA;
  border-radius: 3px;
}

.tg-illus-line {
  height: 3px;
  background: #C4E2F0;
  border-radius: 2px;
}

.tg-chat-empty-content h4 {
  font-size: 15.5px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  margin: 0 0 10px 0;
}

.tg-chat-empty-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 7px;
}

.tg-chat-empty-item {
  font-size: 13px;
  color: var(--text-tinta-2, var(--ink-soft));
  display: flex;
  align-items: center;
  gap: 9px;
}

.tg-chat-empty-item svg {
  width: 15px;
  height: 15px;
  color: #4DA8DA;
  flex: 0 0 15px;
}

/* Footer Cancel Link */
.tg-btn-cancel-link {
  background: transparent;
  border: none;
  color: var(--text-redup, var(--muted));
  font-size: 14px;
  font-weight: 500;
  padding: 0 14px;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  transition: color .15s ease;
}

.tg-btn-cancel-link:hover {
  color: var(--text-tinta, var(--ink));
  text-decoration: underline;
}

/* =====================================================================
   BITRIX24 CHECKLIST WIDGET (TASK FORM & VIEW)
   ===================================================================== */
.tg-cl-card {
  background: var(--surface);
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  box-shadow: 0 4px 16px rgba(16, 28, 48, 0.06);
  padding: 18px 20px;
  display: flex;
  flex-direction: column;
  gap: 12px;
  transition: all .2s ease;
}

.tg-cl-slide-up {
  animation: tgSlideUp .22s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-cl-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}

.tg-cl-header-left {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: 1 1 auto;
  min-width: 200px;
}

.tg-cl-icon {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  background: var(--accent-w);
  color: var(--color-biru-2, var(--accent));
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 32px;
}

.tg-cl-title-wrap {
  display: flex;
  flex-direction: column;
  gap: 3px;
}

.tg-cl-title-input {
  font-size: 15px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  border: none;
  background: transparent;
  padding: 0;
  margin: 0;
  outline: none;
  font-family: inherit;
  width: 180px;
}

.tg-cl-title-input:focus {
  border-bottom: 1.5px dashed var(--color-biru-2, var(--accent));
}

.tg-cl-progress-wrap {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  color: var(--text-redup, var(--muted));
}

.tg-cl-progress-bar {
  width: 65px;
  height: 4px;
  background: var(--line);
  border-radius: 2px;
  overflow: hidden;
  position: relative;
}

.tg-cl-progress-fill {
  height: 100%;
  background: #10B981;
  border-radius: 2px;
  transition: width .2s ease;
}

.tg-cl-header-right {
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Floating Action Toolbar Pill */
.tg-cl-toolbar-pill {
  display: flex;
  align-items: center;
  gap: 4px;
  background: var(--line-soft);
  border: 1px solid var(--line);
  border-radius: 20px;
  padding: 3px 8px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.03);
}

.tg-cl-tool-btn {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: none;
  background: transparent;
  color: var(--text-redup, var(--muted));
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  padding: 0;
  transition: all .15s ease;
}

.tg-cl-tool-btn:hover {
  background: #EDF2F7;
  color: var(--text-tinta, var(--ink));
}

.tg-cl-tool-btn.aktif {
  color: #FF5722;
  background: var(--status-kuning-bg);
}

.tg-cl-controls {
  display: flex;
  align-items: center;
  gap: 4px;
}

.tg-cl-ctrl-btn {
  width: 28px;
  height: 28px;
  border-radius: 6px;
  border: none;
  background: transparent;
  color: var(--text-redup, var(--muted));
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  font-weight: 600;
  transition: all .15s ease;
}

.tg-cl-ctrl-btn:hover {
  background: var(--line-soft);
  color: var(--text-tinta, var(--ink));
}

/* Checklist Items Body */
.tg-cl-body {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-top: 4px;
}

.tg-cl-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 6px 6px 6px 8px;
  border-radius: 6px;
  border-bottom: 1px solid var(--line-soft);
  transition: background-color .15s ease;
  position: relative;
}

.tg-cl-item:hover {
  background: var(--line-soft);
}

.tg-cl-item.tg-cl-indent {
  padding-left: 32px;
}

.tg-cl-checkbox-label {
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  position: relative;
  user-select: none;
  flex: 0 0 18px;
}

.tg-cl-checkbox {
  position: absolute;
  opacity: 0;
  cursor: pointer;
  height: 0;
  width: 0;
}

.tg-cl-custom-box {
  width: 18px;
  height: 18px;
  border: 1.5px solid var(--line);
  border-radius: 4px;
  background: var(--surface);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all .15s ease;
}

.tg-cl-checkbox:checked ~ .tg-cl-custom-box {
  background: var(--color-biru-2, var(--accent));
  border-color: var(--color-biru-2, var(--accent));
}

.tg-cl-checkbox:checked ~ .tg-cl-custom-box::after {
  content: '';
  width: 4px;
  height: 8px;
  border: solid white;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
  margin-top: -2px;
}

.tg-cl-input {
  flex: 1 1 auto;
  border: none;
  background: transparent;
  outline: none;
  font-size: 14px;
  color: var(--text-tinta, var(--ink));
  font-family: inherit;
  padding: 4px 0;
}

.tg-cl-input::placeholder {
  color: var(--muted);
}

.tg-cl-item.is-done .tg-cl-input {
  text-decoration: line-through;
  color: var(--text-redup, #828B99);
}

.tg-cl-item-del {
  border: none;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-size: 18px;
  padding: 0 6px;
  opacity: 0;
  transition: opacity .15s ease, color .15s ease;
}

.tg-cl-item:hover .tg-cl-item-del {
  opacity: 1;
}

.tg-cl-item-del:hover {
  color: #EF4444;
}

/* Add Item Button */
.tg-cl-add-item-wrap {
  padding: 4px 4px;
}

.tg-cl-btn-add-item {
  border: none;
  background: transparent;
  color: var(--muted);
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13.5px;
  font-weight: 500;
  cursor: pointer;
  padding: 4px 0;
  transition: color .15s ease;
}

.tg-cl-btn-add-item:hover {
  color: var(--color-biru-2, var(--accent));
}

/* Divider */
.tg-cl-divider {
  height: 1px;
  background: var(--line);
  margin: 4px 0;
}

/* Footer Action Bar */
.tg-cl-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

.tg-cl-btn-new {
  border: none;
  background: transparent;
  color: var(--muted);
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13.5px;
  font-weight: 500;
  cursor: pointer;
  transition: color .15s ease;
}

.tg-cl-btn-new:hover {
  color: var(--color-biru-2, var(--accent));
}

.tg-cl-btn-save {
  height: 34px;
  padding: 0 22px;
  background: var(--btn-primary-bg, var(--accent));
  color: #FFFFFF !important;
  font-size: 13.5px;
  font-weight: 600;
  border-radius: 8px;
  border: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 2px 6px rgba(26, 99, 196, 0.25);
  transition: background-color .15s ease;
}

.tg-cl-btn-save:hover {
  background: var(--btn-primary-hover, var(--accent-2));
}

/* =====================================================================
   BITRIX24 EMPLOYEE COMBOBOX SEARCH (PARTICIPANTS & OBSERVERS)
   ===================================================================== */
.tg-combobox-popup {
  position: fixed;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: 0 12px 36px rgba(16, 28, 48, 0.18), 0 2px 8px rgba(0, 0, 0, 0.04);
  width: 330px;
  max-width: 90vw;
  z-index: 2500;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  animation: tgSlideUp .18s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-combo-header {
  padding: 12px 14px 8px 14px;
  border-bottom: 1px solid var(--line-soft);
}

.tg-combo-search-input {
  width: 100%;
  height: 38px;
  background: var(--surface);
  border: 1.5px solid var(--line);
  border-radius: 10px;
  padding: 0 12px;
  font-size: 14px;
  color: var(--text-tinta, var(--ink));
  outline: none;
  font-family: inherit;
  transition: border-color .15s ease, box-shadow .15s ease;
}

.tg-combo-search-input:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(43, 125, 233, 0.12);
}

.tg-combo-list {
  max-height: 230px;
  overflow-y: auto;
  padding: 6px 0;
  list-style: none;
  margin: 0;
}

.tg-combo-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 8px 16px;
  cursor: pointer;
  transition: background-color .12s ease;
  user-select: none;
}

.tg-combo-item:hover,
.tg-combo-item.tg-selected {
  background-color: var(--line-soft);
}

.tg-combo-avatar {
  flex: 0 0 28px;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  overflow: hidden;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
}

.tg-combo-avatar img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.tg-combo-name {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ink);
  flex: 1 1 auto;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-combo-empty {
  padding: 16px;
  text-align: center;
  font-size: 13px;
  color: var(--muted);
}

.tg-combo-footer {
  background: var(--accent-w);
  border-top: 1px solid var(--line);
  padding: 10px 16px;
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  transition: background-color .15s ease;
}

.tg-combo-footer:hover {
  background: #DCEAFB;
}

.tg-combo-add-circle {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--accent);
  color: #FFFFFF;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  font-weight: 700;
  line-height: 1;
}

.tg-combo-footer-text {
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  flex: 1 1 auto;
}

.tg-combo-help-icon {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--line);
  color: #FFFFFF;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 10px;
  font-weight: 700;
}

/* Badges / Chips in Participants Card */
.tg-member-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--line-soft);
  border: 1px solid var(--line);
  border-radius: 20px;
  padding: 3px 10px 3px 4px;
  font-size: 13px;
  color: var(--ink);
  transition: all .15s ease;
}

.tg-member-chip:hover {
  background: var(--line);
}

.tg-member-del {
  border: none;
  background: none;
  color: var(--muted);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  padding: 0 2px;
  margin-left: 2px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: color .12s ease;
}

.tg-member-del:hover {
  color: #EF4444;
}

.tg-btn-add-member {
  border: 1.5px dashed var(--line);
  background: transparent;
  color: var(--accent);
  border-radius: 20px;
  padding: 4px 12px;
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  transition: all .15s ease;
}

.tg-btn-add-member:hover {
  background: var(--accent-w);
  border-color: var(--accent);
}


/* ---------------------------------------------------------------
   LEBAR PENUH untuk Tugas & Proyek - 5 Oktober 2026.

   .page dibatasi 1400px untuk SELURUH portal, dan itu disengaja:
   paragraf yang melebar penuh di layar 2560px sulit diikuti mata.
   Halaman tugas berbeda isinya - hero yang membleed, grid kartu
   auto-fit, tabel berkolom banyak, papan Kanban yang digulir
   mendatar - dan batas itu menyisakan jalur kosong di kanan.

   Dilonggarkan lewat kelas body, bukan dengan mengubah .page:
   dengan begitu tidak satu halaman lain pun ikut berubah. Kelasnya
   dipasang layout.php, pola yang sama dengan halaman-pesan dan
   halaman-rapat.
   --------------------------------------------------------------- */
body.halaman-tugas main.page { max-width: none; }

/* Rekap Aktivitas - permintaan pemilik projek 21 Okt 2026.

   Kelasnya 'halaman-lebar', bukan nama halamannya: yang berikutnya
   yang butuh lebar penuh cukup menambahkan rutenya di layout.php,
   tanpa aturan CSS baru. Halaman Tugas di atas sengaja dibiarkan
   dengan kelasnya sendiri - ia sudah dijaga tests/uji_lebar_tugas.php
   dengan nama itu, dan menggantinya hanya memindahkan risiko. */
body.halaman-lebar main.page { max-width: none; }

/* Panel tugas memakai DUA kelas: tg-card-wrapper untuk tampilannya,
   dan kotak supaya bilah Perkecil/Perbesar/Tutup milik app.js
   benar-benar bekerja. Yang di bawah ini menyelaraskan keduanya -
   .kotak memberi flex-column (dibutuhkan mode layar penuh), dan
   bilahnya mengikuti sudut 12px milik kartu nia, bukan 6px bawaan. */
.tg-card-wrapper.kotak,
.tg-gantt-wrapper.kotak,
.tg-proyek-wrapper.kotak { display: flex; flex-direction: column; }

.tg-card-wrapper.kotak > .kotak-bar,
.tg-gantt-wrapper.kotak > .kotak-bar,
.tg-proyek-wrapper.kotak > .kotak-bar {
  border-radius: 12px 12px 0 0;
  background: var(--bg-kertas, var(--ground));
  border-bottom: 1px solid var(--border-garis, var(--line));
}

.tg-card-wrapper.kotak.kotak-maks,
.tg-gantt-wrapper.kotak.kotak-maks,
.tg-proyek-wrapper.kotak.kotak-maks { border-radius: 0; margin: 0; }

.tg-card-wrapper.kotak.kotak-maks > .kotak-bar,
.tg-gantt-wrapper.kotak.kotak-maks > .kotak-bar,
.tg-proyek-wrapper.kotak.kotak-maks > .kotak-bar { border-radius: 0; }

/* Halaman Workgroup (/grup) - delta commit cf22b04 develop_nia (6 Okt 2026),
   diambil HANYA blok ini, bukan app.css utuh milik nia (salinannya lama).
   Ditaruh SESUDAH aturan .tg-* supaya .gr-* tetap menimpanya seperti di
   berkas aslinya. Semua selektornya baru - tidak ada halaman lain yang kena. */
/* =====================================================================
   Workgroup Modern Design System (Adapted from Tugas & Proyek)
   ===================================================================== */
.gr-hero-header { margin-bottom: 20px; }

.gr-search-box { flex: 1 1 280px; max-width: 440px; }

.gr-subtabs { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }

.gr-tab-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  margin-left: 6px;
  padding: 0 5px;
  border-radius: 9px;
  font-size: 11px;
  font-weight: 700;
  background: rgba(255, 255, 255, 0.22);
  color: #FFFFFF;
}

.gr-tab-badge-aktif {
  background: rgba(255, 255, 255, 0.35);
}

.tg-chip.tg-chip-aktif {
  background: rgba(255, 255, 255, 0.32) !important;
  border-color: rgba(255, 255, 255, 0.5) !important;
  font-weight: 600;
}

.tg-chip-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.45);
  display: inline-block;
}

.tg-chip-dot.aktif {
  background: #00A86B;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.35);
}

.gr-filter-panel {
  animation: grSlideDown 0.18s cubic-bezier(0.16, 1, 0.3, 1);
}

.gr-filter-check {
  flex-direction: row !important;
  align-items: center !important;
  gap: 8px !important;
  margin-bottom: 6px;
}

.gr-filter-check input {
  margin: 0;
  cursor: pointer;
}

.gr-card-wrapper {
  margin-bottom: 24px;
}

/* Empty State */
.gr-empty-state {
  padding: 48px 24px;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}

.gr-empty-icon {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: var(--line-soft);
  color: var(--muted);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 8px;
}

.gr-empty-state h3 {
  font-size: 16px;
  font-weight: 700;
  color: var(--text-tinta, var(--ink));
  margin: 0;
}

.gr-empty-state p {
  max-width: 460px;
  margin: 0;
  font-size: 13.5px;
  line-height: 1.5;
}

/* Modern Workgroup Table */
.gr-table-modern thead th {
  padding: 12px 16px;
  font-size: 13.5px;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
  background: var(--line-soft);
  border-bottom: 1px solid var(--border-garis, var(--line));
  white-space: nowrap;
}

.gr-col-id { width: 52px; text-align: center; }
.gr-col-nama { min-width: 260px; width: auto; }
.gr-col-kategori { width: 170px; }
.gr-col-anggota { width: 105px; }
.gr-col-tugas { width: 165px; }
.gr-col-waktu { width: 155px; }
.gr-col-peran { width: 150px; }
.gr-col-aksi { width: 85px; }
.gr-col-center { text-align: center; }

.gr-id-badge {
  font-size: 12.5px;
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  color: var(--text-redup, var(--muted));
}

.gr-table-row {
  height: 52px;
  transition: background-color .15s ease, transform .1s ease;
}

.gr-table-row:hover {
  background-color: var(--badge-biru-bg, var(--accent-w));
}

.gr-table-row.gr-row-closed {
  opacity: 0.65;
  background-color: var(--line-soft);
}

.gr-title-container {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.gr-title-line {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  flex-wrap: wrap;
}

.gr-link-name {
  font-size: 14.5px;
  font-weight: 600;
  color: var(--text-tinta, var(--ink));
  text-decoration: none;
  line-height: 1.35;
  transition: color .15s ease;
}

.gr-link-name:hover {
  color: var(--color-biru-2, var(--accent));
  text-decoration: underline;
}

.gr-badge-type {
  font-size: 10.5px !important;
  font-weight: 700 !important;
  padding: 1px 7px !important;
  letter-spacing: 0.03em;
}

.gr-badge-closed {
  font-size: 10.5px !important;
  font-weight: 700 !important;
  padding: 1px 6px !important;
  background: var(--line) !important;
  color: var(--muted) !important;
}

.gr-desc-text {
  font-size: 12px;
  color: var(--text-redup, var(--muted));
  line-height: 1.4;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 380px;
}

.gr-kat-text {
  font-size: 13px;
  font-weight: 500;
  color: var(--text-tinta-2, var(--ink-soft));
  margin-bottom: 2px;
}

.gr-tags-wrap {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
}

.gr-member-pill {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 10px;
  border-radius: 12px;
  background: var(--line-soft);
  color: var(--ink-soft);
  font-size: 13px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  border: 1px solid var(--line);
}

.gr-task-info {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
}

.gr-task-count {
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  font-size: 14px;
  font-variant-numeric: tabular-nums;
}

.gr-overdue-pill {
  font-size: 11px !important;
  padding: 1px 6px !important;
  border-radius: 4px !important;
}

.gr-my-task-chip {
  font-size: 10.5px !important;
  padding: 0 5px !important;
  background: var(--accent-w) !important;
  color: var(--accent) !important;
  border: 1px solid var(--pb-biru-w2, #D7E6FF) !important;
}

.gr-action-btn {
  height: 28px !important;
  padding: 0 10px !important;
  font-size: 12px !important;
  font-weight: 600 !important;
  gap: 3px !important;
  border-radius: 4px !important;
  color: var(--color-biru, var(--accent)) !important;
  background: var(--line-soft) !important;
  border: 1px solid var(--line) !important;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  transition: all .15s ease !important;
}

.gr-action-btn:hover {
  background: var(--accent) !important;
  color: #FFFFFF !important;
  border-color: var(--accent) !important;
  transform: translateY(-1px);
  box-shadow: 0 2px 6px rgba(26, 99, 196, 0.25);
}

.gr-security-banner {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 14px 18px;
  margin: 0;
  background: var(--line-soft);
  border-top: 1px solid var(--border-garis-2, var(--line-soft));
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--text-redup, var(--muted));
}

.gr-security-icon {
  flex: 0 0 auto;
  color: #0D6E7C;
  display: flex;
  align-items: center;
  margin-top: 1px;
}

.gr-security-text strong {
  color: var(--text-tinta, var(--ink));
}

@keyframes grSlideDown {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}


/* Detail Workgroup (/grup/lihat) bergaya detail proyek Task & Proyek -
   6 Okt 2026. Kepala, subtab, kartu angka, dan kartu Tentang memakai
   kelas tg-proyek-* apa adanya; blok ini hanya menambal yang khusus
   halaman grup. SEMUA selektornya di bawah .gr-lihat - halaman lain
   (termasuk tugas/proyek/lihat yang memiliki tg-proyek-*) tidak kena. */
.gr-lihat .tg-proyek-hero-actions .tg-btn-ghost-light { gap: 6px; }
.gr-lihat .gr-lihat-badge {
  background: rgba(255, 255, 255, 0.16);
  color: #FFFFFF;
  border: 1px solid rgba(255, 255, 255, 0.35);
}
.gr-lihat .gr-lihat-badge-peran {
  background: var(--status-hijau-bg);
  color: var(--status-hijau);
  border-color: #BFE5CD;
}
.gr-lihat .gr-lihat-subtabs { display: flex; gap: 4px; flex-wrap: wrap; margin-top: 18px; }
.gr-lihat .gr-lihat-subtabs a.tg-proyek-hero-subtab { display: inline-flex; align-items: center; gap: 6px; }
.gr-lihat .gr-lihat-jml {
  background: #E5484D; color: #FFFFFF; border-radius: 9px;
  min-width: 18px; height: 18px; padding: 0 5px; font-size: 11px; font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center;
}

.gr-lihat .gr-lihat-stats { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); margin-bottom: 20px; }
.gr-lihat .tg-proyek-stat-card.gr-lihat-diam { cursor: default; }
.gr-lihat .tg-proyek-stat-card.gr-lihat-diam:hover {
  transform: none;
  border-color: var(--border-garis, var(--line));
  box-shadow: 0 2px 8px rgba(11, 47, 107, 0.05);
}

/* Setiap kotak (Tentang, Diskusi, dan keenam kotak kisi) digambar
   sebagai kartu seperti "Tentang Proyek": putih, sudut 12px, bilah
   judul lembut. Perkecil/Perbesar/Tutup milik app.js tetap bekerja. */
.gr-lihat .kotak {
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 12px;
  box-shadow: 0 2px 8px rgba(11, 47, 107, 0.05);
}
.gr-lihat .kotak > .kotak-bar {
  background: var(--bg-kertas, var(--ground));
  border-bottom: 1px solid var(--border-garis, var(--line));
  padding: 10px 10px 10px 18px;
}
.gr-lihat .kotak > .kotak-bar .kotak-judul {
  font-size: 15px; font-weight: 700; color: var(--text-tinta, var(--ink));
}
.gr-lihat .kotak.kotak-maks { border-radius: 0; margin: 0; }
.gr-lihat .kotak.kotak-maks > .kotak-bar { border-radius: 0; }
.gr-lihat .gr-kisi { gap: 16px; }

.gr-lihat .gr-lihat-tentang .gr-ket { margin: 0 0 14px; }
.gr-lihat .gr-lihat-tentang .gr-meta { margin: 0 0 14px; }
.gr-lihat .gr-lihat-tentang .gr-kunci { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 14px; }
.gr-lihat .gr-lihat-kemajuan { margin: 0 0 6px; }

/* Detail Workgroup - Diskusi gaya Task chat + tata letak kotak (7 Okt 2026,
   dari prototipe Claude Design yang disetujui). Masih di bawah .gr-lihat. */
.gr-lihat .gr-lihat-baris1 {
  display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  gap: 16px; align-items: start; margin-bottom: 16px;
}
.gr-lihat .gr-lihat-kanan { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.gr-lihat .gr-lihat-baris1 .kotak,
.gr-lihat .gr-lihat-baris2 .kotak { margin-bottom: 0; }
/* Tiga kartu bawah: 3 kolom bila tiap kartu dapat >= 300px, selain itu
   turun baris dengan sendirinya - judul kotak tidak terpotong. */
.gr-lihat .gr-lihat-baris2 { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px; align-items: stretch; }
@media (max-width: 1150px) {
  .gr-lihat .gr-lihat-baris1 { grid-template-columns: minmax(0, 1fr); }
}

/* ---- Diskusi: ruang chat ---- */
.gr-lihat .gr-chat-kotak:not(.kotak-minim):not(.kotak-maks) { height: 600px; }
.gr-lihat .gr-chat-kotak > .kotak-isi {
  display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; padding: 0;
}
.gr-lihat .gr-chat-kotak > .kotak-bar .kotak-info { display: inline-flex; align-items: center; gap: 4px; }
.gr-lihat .gr-chat-buka {
  margin-left: 8px; padding: 5px 11px; border-radius: 6px; text-decoration: none;
  font-size: 12px; font-weight: 600; background: var(--accent-w); color: var(--accent);
}
.gr-lihat .gr-chat-buka:hover { background: var(--accent); color: #fff; }
.gr-lihat .gr-chat-baru { color: #E5484D; }
.gr-lihat .gr-chat-alir {
  flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 18px 20px;
  background-color: var(--line-soft);
  background-image: radial-gradient(rgba(26, 99, 196, 0.06) 1px, transparent 1px);
  background-size: 18px 18px;
}
.gr-lihat .gr-chat-lebih { display: flex; flex-direction: column; align-items: center; gap: 4px; margin: 0 0 14px; font-size: 12px; }
.gr-lihat .gr-chat-lama {
  border: 1px solid #C9DCF7; background: var(--surface); color: var(--accent); font: inherit; font-size: 12.5px; font-weight: 600;
  padding: 6px 16px; border-radius: 999px; cursor: pointer; box-shadow: 0 1px 2px rgba(11, 47, 107, 0.06);
}
.gr-lihat .gr-chat-lama:hover { background: var(--accent-w); }
.gr-lihat .gr-chat-lama:disabled { opacity: .6; cursor: progress; }
.gr-lihat .gr-chat-lama-pesan { font-size: 11.5px; color: var(--muted); }
.gr-lihat .gr-chat-awal { font-size: 11.5px; color: var(--muted); }
.gr-lihat .gr-chat { max-height: none; overflow: visible; margin: 0; display: flex; flex-direction: column; gap: 12px; }
.gr-lihat .gr-chat li { padding: 0; border: 0; align-items: flex-start; gap: 8px; }
.gr-lihat .gr-chat li + li { border-top: 0; }
.gr-lihat .gr-chat .gr-chat-tgl { justify-content: center; }
.gr-lihat .gr-chat-tgl span {
  font-size: 11.5px; font-weight: 600; color: var(--ink-soft); background: var(--surface-2); border: 1px solid var(--line);
  padding: 3px 12px; border-radius: 999px;
}
.gr-lihat .gr-chat-gelembung {
  flex: 0 1 auto; max-width: 70%; padding: 8px 12px;
  background: var(--pb-lain, var(--surface)); border: 1px solid var(--line); border-radius: 12px 12px 12px 4px;
  box-shadow: 0 1px 2px rgba(11, 47, 107, 0.04); color: var(--ink);
}
.gr-lihat .gr-chat-saya { flex-direction: row-reverse; }
.gr-lihat .gr-chat-saya .gr-chat-gelembung {
  /* 7 Okt 2026: warna "pesan saya" = warna Pesan (--pb-saya), ikut tema -
     dulu biru pucat tetap dengan teks terang -> tak terbaca di tema gelap. */
  background: var(--pb-saya, #E0F2DF); border-color: var(--line); color: var(--ink); border-radius: 12px 12px 4px 12px; padding: 8px 12px;
}
.gr-lihat .gr-chat-saya .gr-diskusi-kepala strong { color: var(--accent); }
.gr-lihat .gr-chat-lain .gr-diskusi-kepala strong { color: var(--accent); }
.gr-lihat .gr-chat .gr-diskusi-teks { font-size: 13.5px; margin-top: 2px; }
.gr-lihat .gr-chat-kosong {
  height: 100%; min-height: 220px; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 8px; text-align: center;
}
.gr-lihat .gr-chat-kosong p { margin: 0; max-width: 420px; font-size: 13px; }
.gr-lihat .gr-chat-kosong-ikon {
  width: 56px; height: 56px; border-radius: 50%; background: var(--surface); color: var(--accent);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 2px 8px rgba(11, 47, 107, 0.08);
}
.gr-lihat .gr-chat-tulis { padding: 12px 16px 4px; border-top: 1px solid var(--border-garis, var(--line)); gap: 4px; }
.gr-lihat .gr-chat-kotak-tulis {
  display: flex; align-items: flex-end; gap: 8px; padding: 6px 6px 6px 8px;
  border: 1px solid #D5DEEA; border-radius: 12px; background: var(--bg-permukaan, var(--surface));
}
.gr-lihat .gr-chat-kotak-tulis:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(26, 99, 196, 0.12); }
.gr-lihat .gr-chat-kotak-tulis textarea {
  flex: 1 1 auto; width: auto; border: 0; outline: none; resize: none; background: transparent;
  padding: 9px 0; min-height: 22px; max-height: 140px; font-size: 13.5px;
}
.gr-lihat .gr-chat-klip {
  flex: 0 0 38px; width: 38px; height: 38px; border-radius: 8px; cursor: pointer;
  display: flex; align-items: center; justify-content: center; color: var(--muted);
}
.gr-lihat .gr-chat-klip:hover { background: var(--line-soft); color: var(--accent); }
.gr-lihat .gr-chat-klip input { display: none; }
.gr-lihat .gr-chat-kirim {
  flex: 0 0 40px; width: 40px; height: 40px; border-radius: 50%; border: 0; cursor: pointer;
  background: #0FA3D8; color: #FFFFFF; display: flex; align-items: center; justify-content: center;
}
.gr-lihat .gr-chat-kirim:hover { background: #0B8DBC; }
.gr-lihat .gr-chat-berkas-nama { min-height: 1em; padding-left: 4px; }
.gr-lihat .gr-chat-berkas { display: flex; flex-direction: column; gap: 3px; margin-top: 5px; font-size: 12.5px; }
.gr-lihat .gr-chat-berkas a { overflow-wrap: anywhere; }
.gr-lihat .gr-chat-galat { color: var(--status-merah); font-size: 12px; padding-left: 4px; }
.gr-lihat .gr-chat-mengirim .gr-chat-kirim { opacity: .6; cursor: progress; }
.gr-lihat .gr-chat-mengirim textarea { opacity: .7; }
.gr-lihat .gr-chat-catatan { margin: 0; padding: 0 16px 12px; font-size: 11.5px; }

/* ---- Kotak bawah ---- */
/* Judul kotak tidak boleh terpotong; yang mengalah teks info di sebelahnya. */
.gr-lihat .gr-lihat-baris2 .kotak-bar .kotak-judul { flex: 1 0 auto; font-size: 14px; }
.gr-lihat .gr-lihat-baris2 .kotak-bar .kotak-info { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.gr-lihat .gr-kartu-tetap:not(.kotak-minim):not(.kotak-maks) { height: 460px; }
.gr-lihat .gr-kartu-tetap > .kotak-isi {
  display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; overflow: hidden;
}
.gr-lihat .gr-gulir { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.gr-lihat .gr-kaki {
  flex: 0 0 auto; margin: 0; padding-top: 10px;
  border-top: 1px solid var(--border-garis-2, var(--line-soft)); font-weight: 600;
}
.gr-lihat .gr-kosong { text-align: center; padding: 14px 8px; color: #9AA6B2; }
.gr-lihat .gr-kosong p { margin: 6px 0 0; font-size: 13px; }
.gr-lihat .gr-anggota-satu { padding: 8px; border-radius: 8px; }
.gr-lihat .gr-anggota-jml {
  background: var(--accent-w); color: var(--accent); font-weight: 700; border-radius: 999px; padding: 2px 8px;
}
.gr-lihat .gr-mendesak { list-style: none; margin: 0; padding: 0; }
.gr-lihat .gr-mendesak li {
  display: flex; align-items: flex-start; gap: 10px; padding: 11px 0;
  border-bottom: 1px solid var(--border-garis-2, var(--line-soft));
}
.gr-lihat .gr-mendesak-isi { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.gr-lihat .gr-mendesak-isi .tg-judul { font-size: 13.5px; font-weight: 600; }
.gr-lihat .gr-mendesak li > .tag { white-space: nowrap; }
.gr-lihat .gr-berkas li { flex-direction: row; align-items: center; gap: 10px; padding: 9px 0; }
.gr-lihat .gr-berkas-ikon {
  flex: 0 0 34px; width: 34px; height: 34px; border-radius: 8px;
  background: var(--accent-w); color: var(--accent); display: flex; align-items: center; justify-content: center;
}
.gr-lihat .gr-berkas-teks { display: flex; flex-direction: column; min-width: 0; }
.gr-lihat .gr-berkas-teks a { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gr-lihat .gr-garis-waktu li {
  position: relative; flex-direction: column; align-items: stretch; gap: 1px;
  padding: 6px 0 8px 20px; border-top: 0;
}
.gr-lihat .gr-garis-waktu li + li { border-top: 0; }
.gr-lihat .gr-garis-waktu li::before {
  content: ""; position: absolute; left: 3px; top: 11px; width: 8px; height: 8px;
  border-radius: 50%; background: var(--accent);
}
.gr-lihat .gr-garis-waktu li::after {
  content: ""; position: absolute; left: 6px; top: 22px; bottom: -6px; width: 2px; background: var(--line);
}
.gr-lihat .gr-garis-waktu li:last-child::after { display: none; }
.gr-lihat .gr-garis-waktu .gr-keg-waktu { flex: none; font-size: 11.5px; }

/* ===== AKHIR: gaya Tugas & Proyek dari develop_nia ===== */
/* =====================================================================
   Automation - tombol & ringkasan berwarna ceria (6 Okt 2026).
   ===================================================================== */
.ab-bar { gap: 10px; }
.ab-tombol {
  border: 0; color: #fff; font-weight: 600; border-radius: 10px;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .25); transition: transform .1s, filter .1s;
}
.ab-tombol:hover { color: #fff; filter: brightness(1.1); transform: translateY(-1px); }
.ab-kelola { background: linear-gradient(135deg, #7B5CF0, #A26BF5); }   /* ungu */
.ab-baru   { background: linear-gradient(135deg, #16A36A, #2BC48A); }   /* hijau */
.ab-arsip  { background: linear-gradient(135deg, #F08A24, #F5B13D); }   /* oranye */

.ab-ringkas { gap: 10px; border: 0; background: transparent; overflow: visible; }
.ab-ringkas .hari-bagian {
  border-radius: 12px; border: 0; padding: 12px 16px; color: #fff;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .25);
}
.ab-ringkas .hari-bagian .k { color: rgba(255, 255, 255, .85); }
.ab-ringkas .hari-bagian strong { color: #fff; font-size: 1.5rem; }
.ab-total  { background: linear-gradient(135deg, #1A63C4, #3D8BEA); }   /* biru */
.ab-jalan  { background: linear-gradient(135deg, #E88A12, #F5B83D); }   /* jingga */
.ab-setuju { background: linear-gradient(135deg, #15965E, #2CC489); }   /* hijau */
.ab-tolak  { background: linear-gradient(135deg, #D6453B, #F06B5E); }   /* merah */

/* =====================================================================
   LATAR ANIMASI PORTAL (6 Okt 2026) - app/Latar.php, diatur Admin di
   Panel Kontrol, berlaku untuk semua pengguna.
   Yang dianimasikan hanya transform/opacity/background-position supaya
   dikerjakan GPU (komposit) dan tidak memicu tata letak ulang - ringan
   di komputer klien. Video & animasi berhenti bila pengguna memilih
   "kurangi gerakan" di sistem operasinya.
   ===================================================================== */
.latar {
  position: fixed; inset: 0; z-index: -1; overflow: hidden;
  pointer-events: none; background: var(--pb-latar, #E9F0FA);
}
.latar-video,
.latar-gambar { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.latar-redup { position: absolute; inset: 0; background: var(--pb-latar, #E9F0FA); }
.latar-css { position: absolute; inset: 0; }

/* -- Ombak laut -- */
.latar-css-ombak { background: linear-gradient(180deg, #8EC9F0 0%, #3E8FD0 55%, #1A5E9E 100%); }
.latar-ombak {
  position: absolute; left: 0; bottom: 0; width: 200%; height: 26vh;
  will-change: transform; animation: latar-geser 18s linear infinite;
}
.latar-ombak path { fill: #FFFFFF; }
.latar-ombak-1 { opacity: .25; height: 34vh; animation-duration: 26s; }
.latar-ombak-2 { opacity: .35; height: 28vh; animation-duration: 17s; animation-direction: reverse; }
.latar-ombak-3 { opacity: .55; height: 20vh; animation-duration: 11s; }
@keyframes latar-geser { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* -- Aurora -- */
.latar-css-aurora {
  background: linear-gradient(120deg, #0B2A4A, #1A63C4, #19A39A, #6B4A9E, #1A63C4, #0B2A4A);
  background-size: 400% 400%; animation: latar-aurora 40s ease-in-out infinite;
}
@keyframes latar-aurora { 0%,100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }

/* -- Daun melayang -- */
.latar-css-daun { background: linear-gradient(180deg, #DCEFD9 0%, #A9D3A0 100%); }
.latar-daun {
  position: absolute; top: -40px; width: 22px; height: 22px;
  background: #4B8B3B; border-radius: 0 80% 0 80%; opacity: .7;
  will-change: transform; animation: latar-jatuh 16s linear infinite;
}
@keyframes latar-jatuh {
  0%   { transform: translate(0, 0) rotate(0deg); }
  25%  { transform: translate(40px, 27vh) rotate(90deg); }
  50%  { transform: translate(-30px, 54vh) rotate(200deg); }
  75%  { transform: translate(35px, 81vh) rotate(290deg); }
  100% { transform: translate(0, 110vh) rotate(360deg); }
}
.latar-daun-1  { left: 4%;  animation-duration: 15s; animation-delay: -2s; }
.latar-daun-2  { left: 11%; animation-duration: 19s; animation-delay: -9s; background: #7FB24A; }
.latar-daun-3  { left: 18%; animation-duration: 13s; animation-delay: -5s; transform: scale(.8); }
.latar-daun-4  { left: 26%; animation-duration: 21s; animation-delay: -14s; background: #C9A227; }
.latar-daun-5  { left: 33%; animation-duration: 17s; animation-delay: -1s; }
.latar-daun-6  { left: 41%; animation-duration: 14s; animation-delay: -11s; background: #7FB24A; }
.latar-daun-7  { left: 48%; animation-duration: 20s; animation-delay: -7s; }
.latar-daun-8  { left: 56%; animation-duration: 16s; animation-delay: -3s; background: #D9822B; }
.latar-daun-9  { left: 63%; animation-duration: 18s; animation-delay: -12s; }
.latar-daun-10 { left: 70%; animation-duration: 13s; animation-delay: -8s; background: #7FB24A; }
.latar-daun-11 { left: 77%; animation-duration: 22s; animation-delay: -4s; }
.latar-daun-12 { left: 84%; animation-duration: 15s; animation-delay: -10s; background: #C9A227; }
.latar-daun-13 { left: 90%; animation-duration: 19s; animation-delay: -6s; }
.latar-daun-14 { left: 96%; animation-duration: 17s; animation-delay: -13s; background: #7FB24A; }

/* -- Langit malam berbintang -- */
.latar-css-bintang { background: radial-gradient(ellipse at bottom, #1B2B4A 0%, #070B16 100%); }
.latar-bintang { position: absolute; inset: 0; background-repeat: repeat; animation: latar-kelip 6s ease-in-out infinite; }
.latar-bintang-1 {
  background-image: radial-gradient(1px 1px at 20px 30px, #fff 50%, transparent 51%),
                    radial-gradient(1px 1px at 120px 80px, #fff 50%, transparent 51%),
                    radial-gradient(1px 1px at 200px 160px, #fff 50%, transparent 51%);
  background-size: 260px 220px;
}
.latar-bintang-2 {
  background-image: radial-gradient(1.5px 1.5px at 60px 120px, #DCE8FF 50%, transparent 51%),
                    radial-gradient(1.5px 1.5px at 300px 40px, #fff 50%, transparent 51%);
  background-size: 380px 300px; animation-duration: 9s; animation-delay: -3s;
}
.latar-bintang-3 {
  background-image: radial-gradient(2px 2px at 150px 200px, #FFF6D8 50%, transparent 51%);
  background-size: 520px 420px; animation-duration: 12s; animation-delay: -6s;
}
@keyframes latar-kelip { 0%,100% { opacity: 1; } 50% { opacity: .35; } }

/* -- Kartu tembus pandang (opsi Panel Kontrol) -- */
body.latar-tembus main.page .kotak,
body.latar-tembus main.page .tbl-wrap,
body.latar-tembus main.page .bar,
body.latar-tembus main.page .subnav,
body.latar-tembus main.page .hari-ini {
  background: var(--pb-kaca, rgba(255, 255, 255, .82));
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
}

@media (prefers-reduced-motion: reduce) {
  .latar *, .latar { animation: none !important; }
}

/* -- Panel Kontrol: pengaturan latar -- */
.lt-pilihan { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; }
.lt-opsi {
  display: flex; flex-direction: column; gap: 6px; padding: 8px; cursor: pointer;
  border: 1px solid var(--line); border-radius: 10px; font-size: 13px;
}
.lt-opsi:has(input:checked) { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-w); }
.lt-opsi input { margin: 0; }
.lt-cuplik { display: block; width: 100%; height: 70px; border-radius: 6px; object-fit: cover; background: var(--surface-2); }
.lt-cuplik-ombak { background: linear-gradient(180deg, #8EC9F0, #1A5E9E); }
.lt-cuplik-aurora { background: linear-gradient(120deg, #0B2A4A, #1A63C4, #19A39A, #6B4A9E); }
.lt-cuplik-daun { background: linear-gradient(180deg, #DCEFD9, #A9D3A0); }
.lt-cuplik-bintang { background: radial-gradient(ellipse at bottom, #1B2B4A, #070B16); }
.lt-atur { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 22px; margin-top: 14px; font-size: 13px; }
.lt-atur input[type=range] { vertical-align: middle; }
.lt-garis { border: 0; border-top: 1px solid var(--line); margin: 16px 0; }
.lt-unggah { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; font-size: 13px; }
.lt-daftar { list-style: none; margin: 10px 0 0; padding: 0; }
.lt-daftar li { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--line-soft); }
.lt-daftar li form { margin-left: auto; }
.lt-daftar .btn { padding: 3px 10px; font-size: 12px; }
.lt-aktif { font-size: 11px; padding: 1px 8px; border-radius: 99px; background: var(--accent-w); color: var(--accent); }

/* =====================================================================
   Automation › Rancang - edit & geser langkah persetujuan (6 Okt 2026).
   ===================================================================== */
.rantai-baris { flex-wrap: wrap; }
.rantai-aksi { display: flex; align-items: center; gap: 6px; }
.rantai-aksi form { margin: 0; }
.rantai-geser { min-width: 30px; padding-left: 6px; padding-right: 6px; }
.rantai-geser:disabled { opacity: .3; cursor: default; }
.rantai-tombol-edit { background: var(--accent); border-color: var(--accent); color: #fff; }
.rantai-tombol-edit:hover { filter: brightness(1.1); color: #fff; }
.rantai-buka .rantai-tombol-edit { background: var(--accent-2); }
.rantai-edit {
  flex: 1 0 100%; margin: 6px 0 4px 40px; padding: 14px 16px;
  border: 1px solid var(--accent); border-radius: 10px; background: var(--accent-w);
}
.rantai-edit[hidden] { display: none; }
@media (max-width: 640px) {
  .rantai-aksi { flex-basis: 100%; justify-content: flex-end; }
  .rantai-edit { margin-left: 0; }
}

/* =====================================================================
   FEED - kartu bergaya Bitrix24 (6 Okt 2026). app/Views/feed.php.
   Kartu PADAT (bukan tembus pandang) supaya tetap terbaca di atas
   latar animasi; bayangan lembut memisahkannya dari latar.
   ===================================================================== */
.fd-tata { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 18px; align-items: start; }
.fd-utama { min-width: 0; }
.fd-sisi { display: flex; flex-direction: column; gap: 14px; position: sticky; top: 12px; }
@media (max-width: 1100px) {
  .fd-tata { grid-template-columns: minmax(0, 1fr); }
  .fd-sisi { position: static; display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
}

.fd-kartu,
body.latar-tembus main.page .fd-kartu {
  background: var(--surface); border: 1px solid var(--line); border-radius: 14px;
  box-shadow: 0 2px 10px rgba(15, 30, 60, .10);
  -webkit-backdrop-filter: none; backdrop-filter: none;
}

/* Kotak "tulis cepat" */
.fd-tulis-cepat {
  display: flex; align-items: center; gap: 12px; padding: 12px 16px; margin-bottom: 12px;
  text-decoration: none; color: var(--muted);
}
.fd-tulis-cepat:hover { border-color: var(--accent); color: var(--ink); }
.fd-tulis-ajak {
  flex: 1 1 auto; padding: 10px 16px; border: 1px solid var(--line); border-radius: 22px;
  background: var(--surface-2); font-size: .9rem;
}

/* Cari + penyaring */
.fd-alat { padding: 12px 16px; margin-bottom: 14px; }
.fd-alat .fd-cari { margin-bottom: 10px; }
.fd-alat .fd-saring { margin: 0; }
.fd-tag { display: inline-flex; align-items: center; gap: 5px; padding: 4px 11px; }
.fd-tag-nyala.fd-tag-pos       { background: #E8F1FE; border-color: #1A63C4; color: #12509B; }
.fd-tag-nyala.fd-tag-laporan   { background: #E6F6EC; border-color: #2E9E5B; color: #1F7A43; }
.fd-tag-nyala.fd-tag-absen     { background: #EEF0F4; border-color: #6B7A90; color: #44536A; }
.fd-tag-nyala.fd-tag-tugas     { background: #FFF3E0; border-color: #E08A00; color: #A86400; }
.fd-tag-nyala.fd-tag-pengajuan { background: #F1EAFB; border-color: #7B4FC9; color: #5B35A0; }

/* Kartu butir */
.fd-butir {
  display: block; padding: 0; margin-bottom: 14px;
  border-left: 1px solid var(--line); overflow: hidden;
}
.fd-butir::before { content: ""; display: block; height: 4px; background: var(--line); }
.fd-butir-pos::before       { background: #1A63C4; }
.fd-butir-laporan::before   { background: #2E9E5B; }
.fd-butir-absen::before     { background: #8A97AB; }
.fd-butir-tugas::before     { background: #E08A00; }
.fd-butir-pengajuan::before { background: #7B4FC9; }

.fd-k-kepala { display: flex; align-items: center; gap: 12px; padding: 14px 18px 4px; }
.fd-av { width: 46px; height: 46px; flex: 0 0 46px; font-size: 1rem; }
.fd-av-kecil { width: 28px; height: 28px; flex: 0 0 28px; font-size: .7rem; }
.fd-k-siapa { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; line-height: 1.3; }
.fd-k-siapa strong { font-size: .95rem; color: var(--accent-2); }
.fd-k-siapa small { color: var(--muted); font-size: .78rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fd-jenis { display: inline-flex; align-items: center; gap: 5px; padding: 3px 9px; font-size: .68rem; flex: 0 0 auto; }
.fd-pos  { background: #E8F1FE; color: #12509B; }
.fd-lap  { background: #E6F6EC; color: #1F7A43; }
.fd-abs  { background: #EEF0F4; color: #44536A; }
.fd-tgs  { background: #FFF3E0; color: #A86400; }
.fd-auto { background: #F1EAFB; color: #5B35A0; }
.fd-penting { font-size: .68rem; font-weight: 700; padding: 3px 9px; border-radius: 9px; background: #FDE8E8; color: #B42318; }

.fd-k-badan { padding: 4px 18px 14px 76px; }
.fd-judul { margin: 4px 0 2px; font-size: 1.02rem; font-weight: 600; }
.fd-teks { margin: 4px 0 0; font-size: .9rem; color: var(--ink-soft); white-space: pre-line; }

/* Dari -> kepada (seperti kotak From/To Bitrix) */
.fd-alur {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px; margin: 10px 0 4px;
  padding: 10px 14px; border-radius: 10px; background: var(--accent-w); font-size: .84rem;
}
.fd-butir-laporan .fd-alur { background: #EEF7E2; }
.fd-alur-label { color: var(--muted); font-size: .76rem; }
.fd-alur-orang { display: inline-flex; align-items: center; gap: 7px; font-weight: 600; color: var(--accent-2); }
.fd-alur-orang small { display: block; font-weight: 400; color: var(--muted); font-size: .72rem; }
.fd-alur-panah { color: var(--muted); font-size: 1.1rem; margin: 0 4px; }

/* Baris keadaan */
.fd-keadaan { display: flex; align-items: center; gap: 7px; margin: 8px 0 0; font-size: .85rem; }
.fd-titik { width: 9px; height: 9px; border-radius: 50%; background: currentColor; flex: 0 0 9px; }
.fd-st-ok     { color: #2E9E5B; }
.fd-st-buruk  { color: #D14343; }
.fd-st-tunggu { color: #C27A00; }
.fd-st-netral { color: var(--muted); }

/* Galeri foto pos */
.fd-galeri { display: grid; gap: 6px; margin-top: 10px; max-width: 560px; }
.fd-galeri-1 { grid-template-columns: 1fr; }
.fd-galeri-2 { grid-template-columns: 1fr 1fr; }
.fd-galeri-3 { grid-template-columns: 2fr 1fr 1fr; }
.fd-galeri a { position: relative; display: block; border-radius: 10px; overflow: hidden; background: var(--surface-2); }
.fd-galeri img { display: block; width: 100%; height: 100%; max-height: 320px; object-fit: cover; }
.fd-galeri-2 img, .fd-galeri-3 img { height: 170px; }
.fd-galeri-lagi {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  background: rgba(0, 0, 0, .45); color: #fff; font-size: 1.4rem; font-weight: 700;
}

.fd-k-kaki { display: flex; gap: 18px; padding: 9px 18px 11px 76px; border-top: 1px solid var(--line-soft); font-size: .84rem; }
.fd-k-kaki a { color: var(--muted); text-decoration: none; }
.fd-k-kaki a:hover { color: var(--accent); }
.fd-kosong { padding: 22px; text-align: center; color: var(--muted); }

/* Panel samping */
.fd-widget { padding: 14px 16px; }
.fd-widget h3 {
  display: flex; align-items: center; margin: 0 0 10px; padding-left: 10px;
  border-left: 3px solid var(--accent); font-size: .98rem;
}
.fd-widget-plus { margin-left: auto; font-size: 1.3rem; line-height: 1; text-decoration: none; color: var(--accent); }
.fd-acara, .fd-angka, .fd-populer { list-style: none; margin: 0; padding: 0; }
.fd-acara li { display: flex; gap: 10px; align-items: center; padding: 6px 0; }
.fd-tgl {
  flex: 0 0 40px; height: 42px; display: flex; flex-direction: column; align-items: center; justify-content: center;
  border: 2px solid var(--accent); border-radius: 8px; font-weight: 700; font-size: 1rem; line-height: 1;
}
.fd-tgl small { display: block; width: 100%; text-align: center; background: var(--accent); color: #fff; font-size: .58rem; padding: 1px 0; margin: -1px 0 3px; border-radius: 5px 5px 0 0; text-transform: uppercase; }
.fd-acara-isi { display: flex; flex-direction: column; min-width: 0; font-size: .86rem; }
.fd-acara-isi a { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fd-angka li a { display: flex; justify-content: space-between; padding: 7px 0; color: inherit; text-decoration: none; font-size: .9rem; border-bottom: 1px solid var(--line-soft); }
.fd-angka li:last-child a { border-bottom: 0; }
.fd-angka li a:hover { color: var(--accent); }
.fd-angka b { font-size: 1.05rem; }
.fd-angka-lewat a, .fd-angka-lewat b { color: #D14343; }
.fd-populer li { display: flex; gap: 10px; padding: 7px 0; font-size: .84rem; }
.fd-populer li > span { display: flex; flex-direction: column; min-width: 0; }
.fd-populer strong { color: var(--accent-2); font-size: .86rem; }
.fd-populer a { color: var(--ink-soft); text-decoration: none; }
.fd-populer a:hover { color: var(--accent); }

@media (prefers-color-scheme: dark) {
  .fd-pos, .fd-tag-nyala.fd-tag-pos             { background: #15243A; color: #8DB8F2; }
  .fd-lap, .fd-tag-nyala.fd-tag-laporan         { background: #14301F; color: #7FD6A0; }
  .fd-abs, .fd-tag-nyala.fd-tag-absen           { background: #1E2633; color: #A9B6C8; }
  .fd-tgs, .fd-tag-nyala.fd-tag-tugas           { background: #33260F; color: #F0B95A; }
  .fd-auto, .fd-tag-nyala.fd-tag-pengajuan      { background: #261B3A; color: #BFA3F0; }
  .fd-butir-laporan .fd-alur { background: #1A2A1C; }
  .fd-penting { background: #3A1A1A; color: #F59A9A; }
  .fd-kartu { box-shadow: 0 2px 12px rgba(0, 0, 0, .35); }
}
@media (max-width: 640px) {
  .fd-k-badan, .fd-k-kaki { padding-left: 18px; }
  .fd-jenis { display: none; }
}
@media (prefers-color-scheme: dark) {
  .fd-k-siapa strong, .fd-alur-orang, .fd-populer strong { color: var(--accent); }
}

/* =====================================================================
   Planner / Kanban - "Tarik tugas ke sini" & kartu "Tambah Kolom"
   (7 Okt 2026). Dulu putih 50-65% + warna inline: silau di tema gelap
   dan tulisannya hilang. Kini ikut tema; hover lewat CSS, bukan JS
   onmouseover di view.
   ===================================================================== */
.tg-kolom-kosong {
  background: transparent;
  border: 1.5px dashed var(--line);
  color: var(--muted);
}
.tg-kolom-tambah-wrap {
  background: var(--surface-2) !important;
  border: 2px dashed var(--line) !important;
  color: var(--ink-soft);
}
.tg-kolom-tambah-wrap span { color: var(--ink-soft); }
.tg-kolom-tambah-wrap:hover {
  background: var(--surface) !important;
  border-color: var(--accent) !important;
}
.tg-kolom-tambah-wrap:hover span { color: var(--accent); }

/* =====================================================================
   Form tugas - panel "Task chat" (7 Okt 2026).
   Dulu: latar biru-pucat #EBF4F7 + seluruh panel opacity .52 saat
   tugas belum disimpan -> abu-abu kusam, tulisan sulit dibaca di tema
   gelap. Kini latar ikut tema, kartu "Task chat" terang dan jelas;
   tanda "belum aktif" cukup di kotak ketik (redup + tak bisa diklik).
   Rel tombol bulat di kiri (tutup/tautan/unduh/buka/cetak) SENGAJA
   tidak disentuh - gaya itu dipertahankan atas permintaan pemilik.
   ===================================================================== */
.tg-panel-chat { background: var(--surface); }
.tg-chat-stream {
  background-color: var(--ground);
  background-image: radial-gradient(var(--line) 1px, transparent 1px);
}
.tg-panel-chat.tg-chat-disabled { opacity: 1; }
.tg-panel-chat.tg-chat-disabled .tg-chat-composer-wrap { opacity: .6; pointer-events: none; }
.tg-chat-date-pill { background: var(--surface-2); color: var(--ink-soft); border: 1px solid var(--line); }
.tg-chat-empty-card {
  border: 1px solid var(--line);
  box-shadow: 0 6px 24px rgba(0, 0, 0, .18);
}
.tg-chat-empty-content h4 { color: var(--ink); }
.tg-chat-empty-item { color: var(--ink-soft); }
.tg-chat-empty-illus { background: var(--accent-w); border-color: var(--accent); }
.tg-illus-bar { background: var(--accent); }
.tg-illus-line { background: var(--line); }
.tg-chat-empty-item svg { color: var(--accent); }

/* =====================================================================
   Panel Notifikasi menempel dari ATAS layar (7 Okt 2026).
   Dulu mulai di bawah bilah atas (top: var(--topbar-tinggi)), sehingga
   ada celah setinggi bilah atas yang memperlihatkan latar di atas
   judul "Notifications". Kini panel penuh setinggi layar dan kepalanya
   setinggi bilah atas - judul sejajar dengan judul halaman. Berlaku di
   semua halaman (panelnya ada di layout.php). Layar sempit tetap
   memakai aturan laci bawah di @media sebelumnya.
   ===================================================================== */
@media (min-width: 900px) {
  .notif-panel { top: 0; z-index: 46; }
  .notif-kepala { min-height: var(--topbar-tinggi); box-sizing: border-box; padding-top: 0; padding-bottom: 0; }
}

/* =====================================================================
   Beranda: kartu sempat KOSONG 3-5 detik saat digulir setelah halaman
   lama dibiarkan (7 Okt 2026).
   Dugaan kuat: efek kaca (backdrop-filter: blur) di atas latar VIDEO.
   Kartu tembus pandang yang mengaburkan video harus dihitung ulang tiap
   bingkai video; setelah lama diam, peramban membuang gambar kartu yang
   di luar layar, dan saat digulir ia harus melukis ulang semuanya
   sekaligus - komputer tanpa akselerasi GPU yang kuat butuh beberapa
   detik, dan selama itu kartunya kosong.
   Perbaikan: buang blur (latar cukup diredupkan oleh warna kartu yang
   sedikit lebih pekat), dan batasi area lukis tiap kartu (contain).
   ===================================================================== */
body.latar-tembus main.page .kotak,
body.latar-tembus main.page .tbl-wrap,
body.latar-tembus main.page .bar,
body.latar-tembus main.page .subnav,
body.latar-tembus main.page .hari-ini {
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  background: var(--pb-kaca, rgba(255, 255, 255, .9));
}
body.ada-latar main.page .kotak { contain: paint; }
.latar { transform: translateZ(0); }

/* =====================================================================
   Kotak dimaksimalkan harus MENGISI layar (7 Okt 2026).
   Bagan struktur organisasi (/departemen) berhenti di tengah: kanvasnya
   tidak ikut memanjang, dan sisa kotak - yang di atas latar animasi
   berwarna tembus pandang - memperlihatkan halaman di belakangnya.
   1) kotak-maks selalu PEKAT (berlaku untuk semua kotak);
   2) bingkai bagan ikut memanjang dan kanvasnya mengisi sisa tinggi.
   ===================================================================== */
.kotak.kotak-maks,
body.latar-tembus main.page .kotak.kotak-maks { background: var(--surface); contain: none; }
.kotak.kotak-maks .kotak-isi > .og-bingkai {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column;
}
.kotak.kotak-maks .og-bingkai > .og-kanvas { flex: 1 1 auto; height: auto; min-height: 0; }

/* =====================================================================
   7 Okt 2026 - /departemen
   1) Kalimat petunjuk di bilah atas bagan duduk langsung di atas latar
      animasi; abu-abu kecilnya hilang. Dibuat sebagai pil berlatar.
   2) Kotak yang dimaksimalkan TIDAK menutup menu kiri: mulai di kanan
      sidebar (lebar penuh atau sempit). Berlaku untuk semua kotak.
      Layar <=900px tetap penuh, sebab di sana menu kiri berupa laci.
   ===================================================================== */
.og-atas > .muted.small {
  background: var(--surface); color: var(--ink-soft);
  border: 1px solid var(--line); border-radius: 999px;
  padding: 4px 12px; font-size: .8rem;
}
@media (min-width: 901px) {
  .kotak.kotak-maks { left: var(--sidebar-lebar); }
  body.sidebar-kecil .kotak.kotak-maks { left: var(--sidebar-sempit); }
}

/* =====================================================================
   Teks yang duduk langsung di atas latar animasi (7 Okt 2026).
   Kelasnya dipasang skrip di layout.php (hanya saat latar aktif):
   blok -> kartu kecil, elemen sebaris -> pil. Berlaku di semua halaman.
   ===================================================================== */
body.ada-latar main.page .atas-latar {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 12px; padding: 10px 14px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, .12);
}
body.ada-latar main.page .atas-latar-pil {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 8px; padding: 2px 8px;
}
body.ada-latar main.page .atas-latar:not(.atas-latar-terang) .muted,
body.ada-latar main.page .atas-latar.muted:not(.atas-latar-terang),
body.ada-latar main.page .atas-latar-pil.muted:not(.atas-latar-terang) { color: var(--ink-soft); }
body.ada-latar main.page .atas-latar.atas-latar-terang,
body.ada-latar main.page .atas-latar-pil.atas-latar-terang { background: #FFFFFF; border-color: #E3E9F2; }

/* =====================================================================
   LOGO TERATAI - SVG sebaris + animasi (7 Okt 2026). layout.php.
   - Warna: currentColor -> teal di tema terang, putih-hijau di gelap.
   - .lotus-mekar (halaman pertama tiap sesi): kelopak tergambar satu
     per satu dari tengah ke luar, lalu kilau singkat.
   - Selalu: mengapung pelan seperti teratai di air (6 detik/putaran).
   - Kursor di atas logo: sedikit membesar.
   - "Kurangi animasi" di sistem operasi: semua gerak dimatikan.
   ===================================================================== */
.brand-lotus { height: 30px; width: auto; color: #0D6E7C; overflow: visible;
  transform-origin: 50% 85%; animation: lotus-apung 6s ease-in-out infinite; }
@media (prefers-color-scheme: dark) { .brand-lotus { color: #F6FFFB; } }
body.sidebar-kecil .brand-lotus { height: 26px; }
.brand:hover .brand-lotus { animation-duration: 3s; filter: drop-shadow(0 0 4px rgba(20, 160, 170, .55)); }
@keyframes lotus-apung {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  25%      { transform: translateY(-2.5px) rotate(-4deg); }
  50%      { transform: translateY(-3.5px) rotate(0deg); }
  75%      { transform: translateY(-2.5px) rotate(4deg); }
}
/* 7 Okt 2026 (revisi): gerak apung 2px di logo 30px nyaris tak terlihat.
   Kini lebih jelas, ditambah kelopak "bernapas" - kelopak luar & tengah
   membuka-menutup pelan dari pangkalnya - dan denyut cahaya tiap 8 detik. */
.brand-lotus .kl-2, .brand-lotus .kl-3,
.brand-lotus .kl-4, .brand-lotus .kl-5 {
  transform-box: view-box; transform-origin: 121px 100px;
}
.brand-lotus .kl-4, .brand-lotus .kl-5 { animation: lotus-napas-luar 5s ease-in-out infinite; }
.brand-lotus .kl-2, .brand-lotus .kl-3 { animation: lotus-napas-tengah 5s ease-in-out infinite; }
@keyframes lotus-napas-luar   { 0%, 100% { transform: rotate(0deg); } 50% { transform: rotate(-14deg); } }
@keyframes lotus-napas-tengah { 0%, 100% { transform: rotate(0deg); } 50% { transform: rotate(-7deg); } }
.brand-lotus > g { animation: lotus-denyut 6s ease-in-out infinite; }
/* Denyut = WARNA garis ikut berubah (lebih terlihat di logo kecil daripada
   bayangan saja) + cahaya. Tema terang: teal -> toska terang. */
@keyframes lotus-denyut {
  0%, 55%, 100% { color: #0D6E7C; filter: drop-shadow(0 0 0 rgba(20, 200, 210, 0)); }
  75%           { color: #14B8A6; filter: drop-shadow(0 0 6px rgba(20, 200, 210, .95)); }
}
@media (prefers-color-scheme: dark) {
  @keyframes lotus-denyut {
    0%, 55%, 100% { color: #F6FFFB; filter: drop-shadow(0 0 0 rgba(94, 234, 212, 0)); }
    75%           { color: #5EEAD4; filter: drop-shadow(0 0 7px rgba(94, 234, 212, 1)); }
  }
}
.brand-lotus.lotus-mekar .kl {
  stroke-dasharray: 1; stroke-dashoffset: 1;
  animation: lotus-gambar .9s ease-out forwards;
}
.brand-lotus.lotus-mekar .kl-4, .brand-lotus.lotus-mekar .kl-5 {
  animation: lotus-gambar .9s ease-out .55s forwards, lotus-napas-luar 5s ease-in-out 1.6s infinite;
}
.brand-lotus.lotus-mekar .kl-2, .brand-lotus.lotus-mekar .kl-3 {
  animation: lotus-gambar .9s ease-out .3s forwards, lotus-napas-tengah 5s ease-in-out 1.6s infinite;
}
.brand-lotus.lotus-mekar .kl-1 { animation-delay: .05s; }
@keyframes lotus-gambar { to { stroke-dashoffset: 0; } }
.brand-lotus.lotus-mekar {
  animation: lotus-apung 6s ease-in-out 1.6s infinite, lotus-kilau 1.2s ease-out 1.4s 1;
}
@keyframes lotus-kilau {
  0%   { filter: drop-shadow(0 0 0 rgba(20, 160, 170, 0)); }
  45%  { filter: drop-shadow(0 0 7px rgba(20, 200, 210, .9)); }
  100% { filter: drop-shadow(0 0 0 rgba(20, 160, 170, 0)); }
}
@media (prefers-reduced-motion: reduce) {
  .brand-lotus, .brand-lotus .kl, .brand-lotus > g { animation: none !important; stroke-dashoffset: 0 !important; }
}

/* =====================================================================
   Pesan - pil "Dilihat oleh N" bisa diklik + pop-up daftar pembaca
   (7 Okt 2026). Skrip di ujung app.js, data dari GET pesan/dilihat.
   ===================================================================== */
button.pb-dilihat { border: 0; font: inherit; font-size: .74rem; cursor: pointer; }
button.pb-dilihat:hover { background: var(--pb-biru); }
button.pb-dilihat::after { content: ' \203A'; }
.pbd-pop {
  position: fixed; z-index: 90; width: 300px; max-height: 60vh; overflow-y: auto;
  background: var(--surface); color: var(--ink); border: 1px solid var(--line);
  border-radius: 12px; box-shadow: 0 10px 30px rgba(0, 0, 0, .3); padding: 6px 0;
}
.pbd-kepala { display: flex; justify-content: space-between; padding: 8px 14px 4px; font-size: .74rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); }
.pbd-kepala span { background: var(--surface-2); border-radius: 99px; padding: 0 7px; color: var(--ink-soft); }
.pbd-belum { border-top: 1px solid var(--line-soft); margin-top: 4px; padding-top: 10px; }
.pbd-pop ul { list-style: none; margin: 0; padding: 0 6px; }
.pbd-pop li { display: flex; align-items: center; gap: 9px; padding: 6px 8px; border-radius: 8px; }
.pbd-pop li:hover { background: var(--surface-2); }
.pbd-pop li .avatar { width: 28px; height: 28px; flex: 0 0 28px; font-size: .7rem; }
.pbd-nama { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; font-size: .84rem; }
.pbd-nama b { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pbd-nama small { color: var(--muted); font-size: .72rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pbd-jam { font-size: .72rem; color: var(--muted); white-space: nowrap; }
.pbd-redup li { opacity: .7; }
.pbd-muat { margin: 6px 14px 10px; font-size: .82rem; color: var(--muted); }

/* =====================================================================
   NOTIFIKASI BROWSER (Web Push) - 8 Oktober 2026
   Status & daftar browser di bawah centang "Notifikasi browser"
   (pengaturan.php) dan modal ajakan di Beranda - keduanya diisi
   assets/notif_desktop.js. Hanya token warna, tanpa kode warna langsung.
   ===================================================================== */
.pref-nb { margin: -4px 0 10px 26px; padding: 8px 12px; border-left: 2px solid var(--line); }
.pref-nb .nb-status { margin: 0 0 6px; font-size: .8rem; color: var(--muted); }
.pref-nb .nb-status.nb-ok { color: var(--ok); }
.pref-nb .nb-status.nb-peringatan { color: var(--warn); }
.pref-nb .nb-daftar { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.pref-nb .nb-daftar li { display: flex; align-items: center; gap: 10px; font-size: .82rem; }
.pref-nb .nb-daftar li small { color: var(--muted); flex: 1 1 auto; }
.pref-nb .nb-daftar .nb-nama { font-weight: 500; }
.pref-nb .nb-daftar .nb-kosong { color: var(--muted); }
/* Modal ajakan di Beranda (9 Okt 2026) - pola .chat-modal: lapisan tipis,
   kotak di tengah. Bisa ditunda ("Nanti"), tidak pernah mengunci. */
.nb-modal {
  position: fixed; inset: 0; z-index: 220;
  display: flex; align-items: center; justify-content: center; padding: 16px;
  background: rgba(15, 23, 42, .42);
}
.nb-modal-kotak {
  width: min(440px, 100%); padding: 20px 22px 16px;
  background: var(--surface); color: var(--ink); border-radius: 14px;
  border: 1px solid var(--line); box-shadow: var(--shadow);
  display: flex; flex-direction: column; gap: 10px;
}
.nb-modal-kotak h2 { margin: 0; font-size: 1.05rem; font-weight: 600; }
.nb-modal-kotak p { margin: 0; font-size: .88rem; color: var(--ink-soft); line-height: 1.5; }
.nb-modal-kaki { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }
.nb-modal-tautan { align-self: flex-start; font-size: .8rem; color: var(--muted); }

/* =====================================================================
   MENU FOLLOW / UNFOLLOW di halaman detail proyek - 10 Oktober 2026
   =====================================================================
   Panel melayang di bawah tombol titik tiga. Bentuknya mengikuti
   popover About di sebelahnya supaya keduanya terbaca sebagai satu
   keluarga, bukan dua tempelan dari dua orang.

   SELURUH warnanya memakai token, tanpa satu pun #hex. Itu bukan sekadar
   kerapian: warna mentah tidak ikut berubah saat tema portal diubah, dan
   tests/uji_web_push.php memeriksa app.css dari penanda blok Web Push
   SAMPAI AKHIR BERKAS - jadi apa pun yang ditambahkan di ekor ikut
   terbaca sebagai bagian blok itu dan memerahkannya.
   ===================================================================== */
.tg-menu-ikuti {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 1200;
  min-width: 190px;
  padding: 6px;
  background: var(--bg-permukaan, var(--surface));
  border: 1px solid var(--border-garis, var(--line));
  border-radius: 10px;
  box-shadow: var(--shadow-card-modern, var(--shadow));
}

.tg-menu-ikuti.sibuk { opacity: .55; pointer-events: none; }

.tg-menu-ikuti-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  width: 100%;
  padding: 9px 11px;
  border: 0;
  border-radius: 7px;
  background: transparent;
  font: inherit;
  font-size: 13px;
  color: var(--text-tinta, var(--ink));
  text-align: left;
  cursor: pointer;
}

.tg-menu-ikuti-item:hover:not(:disabled) {
  background: var(--badge-biru-bg, var(--surface-2));
}

.tg-menu-ikuti-item:disabled {
  color: var(--text-redup, var(--muted));
  cursor: not-allowed;
}

/* Centangnya hanya pada butir yang SEDANG berlaku - itu satu-satunya
   penanda keadaan di menu ini, jadi ia tidak boleh samar. */
.tg-menu-ikuti-centang {
  opacity: 0;
  color: var(--color-biru-2, var(--accent));
  flex: 0 0 auto;
}
.tg-menu-ikuti-item.aktif .tg-menu-ikuti-centang { opacity: 1; }
.tg-menu-ikuti-item.aktif { font-weight: 600; }

.tg-menu-ikuti-nota {
  margin: 4px 4px 2px;
  padding: 7px 8px;
  border-radius: 6px;
  background: var(--status-kuning-bg);
  color: var(--status-kuning);
  font-size: 11px;
  line-height: 1.45;
}

/* Tombol titik tiga sekarang <button>, bukan <a> - samakan bentuknya. */
button.tg-btn-more-dots {
  border: 0;
  background: transparent;
  font: inherit;
  cursor: pointer;
}

/* =====================================================================
   KOLOM "KANBAN STAGE" di tabel tugas - 12 Oktober 2026
   =====================================================================
   Bentuknya mengikuti Bitrix24: pita bersegmen sebanyak kolom papan,
   terisi sampai tahap tempat tugas itu berada, nama tahapnya di bawah
   dengan huruf kecil beraksara besar.

   Warna segmennya datang dari warna kolom papan yang dipilih orang -
   ditulis inline oleh tgSelTahapKanban(), sebab ia berbeda per baris
   dan tidak mungkin jadi token. Yang di sini hanya bentuk dan warna
   netralnya.
   ===================================================================== */
.tg-col-stage { width: 170px; }

.tg-stage-sel { display: flex; flex-direction: column; gap: 5px; }

.tg-stage-pita {
  display: flex;
  gap: 2px;
  align-items: center;
}

.tg-stage-pita i {
  flex: 1 1 0;
  height: 7px;
  border-radius: 2px;
  background: var(--border-garis-2, var(--line-soft));
}

.tg-stage-nama {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-redup, var(--muted));
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Tugas yang menunjuk kolom papan di luar proyeknya. Dibuat MENCOLOK,
   bukan disamarkan: ia tidak pernah muncul di papan Kanban, dan kolom
   ini satu-satunya tempat keanehan itu kelihatan. */
.tg-stage-luar .tg-stage-nama { color: var(--status-kuning); }
.tg-stage-luar .tg-stage-pita i {
  background: var(--status-kuning-bg);
  box-shadow: inset 0 0 0 1px var(--status-kuning-border);
}

.tg-stage-kosong { color: var(--text-redup, var(--muted)); font-size: 12px; }

/* Baris tugas yang sudah selesai: pitanya diredupkan bersama barisnya,
   supaya ia tidak jadi satu-satunya yang menyala di baris pudar. */
.tg-row-done .tg-stage-sel { opacity: .55; }

/* Okt 2026: pesan sistem "Task chat has been created." di obrolan tugas.
   Latarnya putih 70% dengan tulisan --ink-soft: di tema gelap tulisannya
   terang di atas putih - tidak terbaca. Ikut token tema, sama dengan
   pil tanggal di atasnya. */
.tg-chat-system-bubble {
  background: var(--surface-2);
  color: var(--ink-soft);
  border: 1px solid var(--line);
  backdrop-filter: none;
}
.tg-chat-system-bubble .tg-chat-bubble-time { color: var(--muted); }

/* =====================================================================
   AUTOMATION > PENGAJUAN - KOLOM PESERTA (13 Okt 2026)
   Rantai pemohon -> penyetuju -> hasil, gaya Workflows Bitrix24.
   app/Views/auto_daftar.php + Automation::rantaiPeserta(). Warna dari
   token tema (ikut mode gelap & latar). Prototipe:
   claude.ai/artifact/LSQMP3ysTEXZrFX75Kw2kK
   ===================================================================== */
.ap-kolom { min-width: 330px; }
.ap-rantai { display: flex; align-items: flex-start; border-radius: 8px; padding: 2px 4px; outline: none; cursor: default; }
.ap-rantai:focus-visible { box-shadow: 0 0 0 2px var(--accent); }
.ap-simpul { display: flex; flex-direction: column; align-items: center; gap: 2px; width: 58px; flex: 0 0 58px; }
.ap-kap { font-size: 10px; color: var(--muted); white-space: nowrap; line-height: 1.2; }
.ap-wkt { font-size: 10px; color: var(--muted); white-space: nowrap; line-height: 1.2; max-width: 64px; overflow: hidden; text-overflow: ellipsis; }
.ap-wkt-ujung { font-weight: 700; }
.ap-av { position: relative; display: inline-flex; }
.ap-av .avatar { width: 30px; height: 30px; font-size: 11px; }
.ap-lenc {
  position: absolute; right: -4px; bottom: -3px; width: 15px; height: 15px; border-radius: 50%;
  border: 2px solid var(--surface); color: white; display: flex; align-items: center; justify-content: center;
}
.ap-lenc-setuju { background: var(--status-hijau); }
.ap-lenc-tolak  { background: var(--status-merah); }
.ap-lenc-tahu   { background: var(--accent); }
.ap-lenc-tunggu { background: var(--status-kuning); }
.ap-tunggu .ap-av .avatar { box-shadow: 0 0 0 3px var(--status-kuning-bg), 0 0 0 4px var(--status-kuning); }
.ap-tunggu .ap-kap { color: var(--status-kuning); font-weight: 700; }
.ap-akan .ap-av { opacity: .4; filter: grayscale(1); }
.ap-garis { flex: 1 1 auto; min-width: 8px; height: 2px; margin-top: 26px; background: var(--line); }
.ap-garis-putus { background: repeating-linear-gradient(90deg, var(--line) 0 4px, transparent 4px 8px); }
.ap-lebih, .ap-kabur {
  width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  font-size: 11px; font-weight: 700; border: 1px dashed var(--muted); color: var(--ink); background: var(--surface-2);
}
.ap-kabur { color: var(--muted); background: transparent; }
.ap-ujung { width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; }
.ap-ujung-selesai .ap-ujung { background: var(--status-hijau); }
.ap-ujung-selesai .ap-wkt { color: var(--status-hijau); }
.ap-ujung-tolak .ap-ujung { background: var(--status-merah); }
.ap-ujung-tolak .ap-wkt { color: var(--status-merah); }
.ap-ujung-batal .ap-ujung { background: var(--muted); }

/* Kartu rincian mengambang */
.ap-kartu {
  position: fixed; z-index: 70; width: 360px; max-width: calc(100vw - 16px); max-height: 70vh; overflow-y: auto;
  background: var(--surface); color: var(--ink); border: 1px solid var(--line); border-radius: 12px;
  box-shadow: 0 12px 32px rgba(11, 47, 107, .18); padding: 12px 14px;
}
.ap-kartu[hidden] { display: none; }
.ap-rc-kepala { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 6px; font-size: 13px; }
.ap-rc-baris { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-top: 1px solid var(--line-soft); }
.ap-rc-no { width: 16px; font-size: 11px; color: var(--muted); text-align: right; flex: 0 0 16px; }
.ap-rc-baris > .avatar, .ap-rc-baris .ap-av .avatar { width: 28px; height: 28px; font-size: 10.5px; }
.ap-rc-isi { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; font-size: 12.5px; }
.ap-rc-isi small, .ap-rc-wkt small { font-size: 11px; color: var(--muted); }
.ap-rc-wkt { display: flex; flex-direction: column; align-items: flex-end; font-size: 11.5px; white-space: nowrap; }
.ap-rc-baris.ap-akan { opacity: .55; }


/* ==========================================================================
   AUTOMATION - CARI FORMULIR (beranda) & MODAL "MULAI PENGAJUAN" (daftar)
   13 Okt 2026. Tanpa kode warna heksadesimal: hanya token.
   ========================================================================== */
.form-kartu[hidden], .am-tabel tr[hidden], .af-cari[hidden] { display: none !important; }
.af-cari-baris { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.af-cari, .am-cari { display: inline-flex; align-items: center; gap: 8px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); padding: 0 10px; color: var(--muted); min-width: 0; }
.af-cari { flex: 0 1 300px; }
.af-cari:focus-within, .am-cari:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-w); }
.af-cari input, .am-cari input { border: 0; outline: 0; background: transparent; color: var(--ink); padding: 8px 0; font: inherit; width: 100%; min-width: 0; }
.af-kosong, .am-kosong { text-align: center; padding: 24px 12px; }

body.am-terbuka { overflow: hidden; }
.am-latar { position: fixed; inset: 0; z-index: 1000; background: rgba(0, 0, 0, .6); display: flex; align-items: flex-start; justify-content: center; padding: max(6vh, 16px) 16px 16px; }
.am-latar[hidden] { display: none !important; }
.am-modal { background: var(--surface); color: var(--ink); border-radius: 12px; box-shadow: var(--shadow), 0 20px 50px rgba(0, 0, 0, .25); width: min(980px, 100%); max-height: 86vh; display: flex; flex-direction: column; overflow: hidden; }
.am-kepala { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 16px 18px; border-bottom: 1px solid var(--line); }
.am-kepala h2 { margin: 0; font-size: 1.15rem; margin-right: auto; }
.am-cari { flex: 0 1 280px; }
.am-jml { font-size: 12px; color: var(--muted); white-space: nowrap; }
.am-tutup { border: 0; background: transparent; color: var(--muted); cursor: pointer; padding: 6px; border-radius: 6px; display: inline-flex; }
.am-tutup:hover { background: var(--surface-2); color: var(--ink); }
.am-isi { overflow: auto; }
.am-tabel { width: 100%; border-collapse: collapse; }
.am-tabel th { position: sticky; top: 0; background: var(--surface-2); text-align: left; font-size: 11.5px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: .03em; padding: 9px 14px; z-index: 1; }
.am-tabel td { padding: 11px 14px; border-top: 1px solid var(--line-soft); vertical-align: middle; }
.am-tabel tbody tr:hover td { background: var(--surface-2); }
.am-nama { display: block; font-weight: 600; color: var(--accent); text-decoration: none; }
.am-nama:hover { text-decoration: underline; }
.am-tabel td small { display: block; margin-top: 3px; font-size: 11.5px; color: var(--muted); }
.am-tabel td small b { font-weight: 600; color: var(--ink); }
.am-mulai { display: inline-block; padding: 5px 16px; border-radius: 999px; border: 1px solid var(--accent); color: var(--accent); font-size: 12.5px; font-weight: 600; text-decoration: none; white-space: nowrap; }
.am-mulai:hover { background: var(--accent); color: white; }
@media (max-width: 640px) {
  .am-latar { padding: 0; }
  .am-modal { max-height: 100vh; height: 100%; border-radius: 0; }
  .am-tabel thead { display: none; }
  .am-tabel tr { display: grid; grid-template-columns: 1fr auto; gap: 4px 10px; padding: 10px 14px; border-top: 1px solid var(--line-soft); }
  .am-tabel td { padding: 0; border: 0; }
  .am-tabel td:nth-child(1) { grid-column: 1; }
  .am-tabel td:nth-child(2) { grid-column: 2; grid-row: 1 / span 2; align-self: center; }
}
/* =====================================================================
   TASK CHAT MODAL (Gaya Messenger Bitrix24 - Kolom Kiri: Daftar Tugas, Kolom Kanan: Room Chat)
   ===================================================================== */
.tg-task-chat-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(15, 23, 42, 0.55);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
  box-sizing: border-box;
}

.tg-task-chat-modal {
  width: min(1380px, 95vw) !important;
  height: min(92vh, 880px) !important;
  max-height: 92vh !important;
  background: var(--surface) !important;
  border-radius: 14px !important;
  box-shadow: 0 24px 70px rgba(10, 25, 50, 0.45), 0 4px 20px rgba(0, 0, 0, 0.15) !important;
  display: flex !important;
  flex-direction: column !important;
  overflow: hidden !important;
  position: relative;
  padding: 0 !important;
}

.tg-task-chat-modal .chat {
  width: 100% !important;
  height: 100% !important;
  min-height: 0 !important;
  display: grid !important;
  grid-template-columns: 320px minmax(0, 1fr) !important;
  gap: 0 !important;
  border-radius: 14px !important;
  overflow: hidden !important;
  background: var(--surface) !important;
  border: none !important;
}

.tg-task-chat-modal .chat-daftar {
  border: none !important;
  border-right: 1px solid var(--line) !important;
  border-radius: 0 !important;
  height: 100% !important;
  min-height: 0 !important;
}

.tg-task-chat-modal .chat-ruang {
  border: none !important;
  border-radius: 0 !important;
  height: 100% !important;
  min-height: 0 !important;
  display: flex !important;
  flex-direction: column !important;
}

/* Badge di tabel tugas (bila ada) */
.tg-meta-chip-chat {
  text-decoration: none;
  color: var(--color-biru-2) !important;
  font-weight: 600;
}

.tg-meta-chip-chat:hover {
  background: var(--color-biru-2) !important;
  color: #fff !important;
}

/* =====================================================================
   POPUP MENTION ANGGOTA TUGAS (@)
   ===================================================================== */
.pb-tulis-kartu {
  position: relative;
}

.tg-btn-mention {
  color: var(--text-redup, #64748b);
  transition: all .15s ease;
}

.tg-btn-mention:hover {
  color: var(--accent, #0083B0);
}

.tg-task-chat-modal .chat-jendela {
  display: none !important;
}

.tg-btn-mention.aktif {
  color: var(--accent, #0083B0) !important;
  background: rgba(0, 131, 176, 0.12) !important;
}

.tg-mention-popup {
  position: absolute;
  bottom: calc(100% + 8px);
  left: 14px;
  width: 320px;
  max-width: calc(100vw - 32px);
  background: var(--surface, #FFFFFF);
  border: 1px solid var(--line, #E2E8F0);
  border-radius: 12px;
  box-shadow: 0 14px 35px rgba(15, 23, 42, 0.18), 0 3px 8px rgba(0, 0, 0, 0.07);
  z-index: 120;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  animation: tgSlideUp .18s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-mention-popup[hidden] {
  display: none !important;
}

.tg-mention-popup-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 14px;
  border-bottom: 1px solid var(--line-soft, #F1F5F9);
  background: var(--surface-2, #F8FAFC);
}

.tg-mention-popup-title {
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--text-redup, #64748B);
}

.tg-mention-popup-close {
  background: transparent;
  border: none;
  font-size: 18px;
  line-height: 1;
  color: var(--text-redup, #94A3B8);
  cursor: pointer;
  padding: 0 4px;
}

.tg-mention-popup-close:hover {
  color: var(--ink, #0F172A);
}

.tg-mention-popup-search {
  padding: 8px 12px;
  border-bottom: 1px solid var(--line-soft, #F1F5F9);
}

.tg-mention-popup-search input {
  width: 100%;
  box-sizing: border-box;
  padding: 6px 10px;
  font-size: 12.5px;
  border: 1px solid var(--line, #CBD5E1);
  border-radius: 6px;
  background: var(--surface, #FFFFFF);
  color: var(--ink, #0F172A);
  outline: none;
}

.tg-mention-popup-search input:focus {
  border-color: var(--accent, #0083B0);
  box-shadow: 0 0 0 2px rgba(0, 131, 176, 0.15);
}

.tg-mention-popup-list {
  list-style: none;
  margin: 0;
  padding: 6px 0;
  max-height: 240px;
  overflow-y: auto;
}

.tg-mention-popup-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 14px;
  cursor: pointer;
  transition: background .12s ease;
  user-select: none;
}

.tg-mention-popup-item[hidden] {
  display: none !important;
}

.tg-mention-popup-item:hover,
.tg-mention-popup-item.terpilih {
  background: var(--surface-2, #F1F5F9);
}

.tg-mention-avatar {
  flex-shrink: 0;
}

.tg-mention-avatar .avatar {
  width: 28px;
  height: 28px;
  font-size: 11px;
}

.tg-mention-user-info {
  display: flex;
  flex-direction: column;
  min-width: 0;
  flex: 1 1 auto;
}

.tg-mention-name {
  font-size: 13px;
  font-weight: 600;
  color: var(--ink, #0F172A);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-mention-role-tag {
  font-size: 11px;
  color: var(--color-biru-2, #0083B0);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-mention-popup-empty {
  padding: 16px 14px;
  text-align: center;
  color: var(--text-redup, #94A3B8);
}

.tg-mention-popup-empty[hidden] {
  display: none !important;
}

.tg-mention-popup-hint {
  padding: 8px 14px;
  font-size: 11.5px;
  color: var(--text-redup, #64748B);
  background: var(--surface-2, #F8FAFC);
  border-bottom: 1px solid var(--line-soft, #F1F5F9);
}

.tg-mention-popup-hint[hidden] {
  display: none !important;
}

/* Modal Tambah Anggota Khusus Obrolan Tugas */
.tg-modal-anggota-chat {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  z-index: 1050;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  box-sizing: border-box;
}

.tg-modal-anggota-chat[hidden] {
  display: none !important;
}

.tg-modal-anggota-backdrop {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(15, 23, 42, 0.45);
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
}

.tg-modal-anggota-dialog {
  position: relative;
  z-index: 2;
  width: 520px;
  max-width: 100%;
  max-height: 85vh;
  background: var(--surface, #FFFFFF);
  border-radius: 16px;
  box-shadow: 0 20px 45px rgba(15, 23, 42, 0.22), 0 4px 12px rgba(0, 0, 0, 0.08);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  animation: tgSlideUp .2s cubic-bezier(0.16, 1, 0.3, 1);
}

.tg-modal-anggota-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  padding: 18px 22px 14px;
  border-bottom: 1px solid var(--line, #E2E8F0);
  background: var(--surface-2, #F8FAFC);
}

.tg-modal-anggota-title {
  font-size: 16px;
  font-weight: 700;
  color: var(--ink, #0F172A);
  margin: 0 0 4px;
}

.tg-modal-anggota-sub {
  font-size: 12px;
  color: var(--text-redup, #64748B);
  margin: 0;
  line-height: 1.45;
}

.tg-modal-anggota-close {
  background: transparent;
  border: none;
  font-size: 24px;
  line-height: 1;
  color: var(--text-redup, #94A3B8);
  cursor: pointer;
  padding: 2px 6px;
  border-radius: 6px;
  transition: all .15s ease;
}

.tg-modal-anggota-close:hover {
  color: var(--danger, #DC2626);
  background: rgba(220, 38, 38, 0.08);
}

.tg-modal-anggota-body {
  padding: 18px 22px;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.tg-modal-anggota-search {
  position: relative;
  display: flex;
  align-items: center;
}

.tg-modal-anggota-search svg {
  position: absolute;
  left: 12px;
  width: 17px;
  height: 17px;
  color: var(--text-redup, #94A3B8);
  pointer-events: none;
}

.tg-modal-anggota-search input {
  width: 100%;
  box-sizing: border-box;
  padding: 10px 14px 10px 38px;
  font-size: 13.5px;
  border: 1.5px solid var(--line, #CBD5E1);
  border-radius: 10px;
  background: var(--surface, #FFFFFF);
  color: var(--ink, #0F172A);
  outline: none;
  transition: border-color .15s ease, box-shadow .15s ease;
}

.tg-modal-anggota-search input:focus {
  border-color: var(--accent, #0083B0);
  box-shadow: 0 0 0 3px rgba(0, 131, 176, 0.15);
}

.tg-modal-anggota-hint {
  font-size: 12px;
  color: var(--text-redup, #64748B);
  margin-top: -8px;
}

.tg-modal-anggota-section {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.tg-modal-anggota-sec-title {
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--text-redup, #64748B);
}

.tg-cm-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-height: 220px;
  overflow-y: auto;
}

.tg-cm-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 12px;
  border-radius: 10px;
  border: 1px solid var(--line-soft, #F1F5F9);
  background: var(--surface-2, #F8FAFC);
  transition: all .15s ease;
}

.tg-cm-item:hover {
  background: var(--surface, #FFFFFF);
  border-color: var(--line, #E2E8F0);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
}

.tg-cm-user {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  flex: 1 1 auto;
}

.tg-cm-info {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.tg-cm-name {
  font-size: 13.5px;
  font-weight: 600;
  color: var(--ink, #0F172A);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-cm-role {
  font-size: 11.5px;
  color: var(--text-redup, #64748B);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tg-cm-btn-tambah {
  padding: 6px 14px;
  font-size: 12.5px;
  font-weight: 600;
  color: #FFFFFF;
  background: var(--accent, #0083B0);
  border: none;
  border-radius: 8px;
  cursor: pointer;
  transition: all .15s ease;
  white-space: nowrap;
}

.tg-cm-btn-tambah:hover {
  opacity: 0.9;
  transform: translateY(-1px);
}

.tg-cm-btn-hapus {
  padding: 5px 10px;
  font-size: 12px;
  font-weight: 500;
  color: var(--danger, #DC2626);
  background: rgba(220, 38, 38, 0.08);
  border: 1px solid rgba(220, 38, 38, 0.2);
  border-radius: 8px;
  cursor: pointer;
  transition: all .15s ease;
  white-space: nowrap;
}

.tg-cm-btn-hapus:hover {
  background: var(--danger, #DC2626);
  color: #FFFFFF;
}

.tg-cm-empty {
  padding: 12px;
  text-align: center;
  font-size: 12.5px;
  color: var(--text-redup, #94A3B8);
  background: var(--surface-2, #F8FAFC);
  border-radius: 8px;
  border: 1px dashed var(--line, #E2E8F0);
  margin: 0;
}


/* Okt 2026: gelembung pesan di obrolan tugas (tugas/lihat).
   .tg-panel-chat menyetel ulang token --pb-* versi TERANG saja, jadi di
   tema gelap gelembungnya putih (#FFFFFF) dengan tulisan terang - tidak
   terbaca. Nilai gelapnya disamakan persis dengan halaman Pesan. */
@media (prefers-color-scheme: dark) {
  .tg-panel-chat {
    --pb-biru: #5B9BEA; --pb-biru-tua: #2E63AE;
    --pb-biru-w: #15243A; --pb-biru-w2: #1D3354;
    --pb-latar: #0E1826; --pb-kartu: #131D2A;
    --pb-saya: #1B3526; --pb-lain: #17222F;
    --pb-garis: #243449; --pb-garis2: #1C2A3B;
    --pb-tinta2: #B8C6D8; --pb-redup: #94A3B8;
    --pb-kaca: rgba(23, 34, 47, .88);
    --pb-pil: rgba(0, 0, 0, .35);
  }
}

/* =====================================================================
   QUICK TASK - papan Kanban proyek (15 Okt 2026)
   =====================================================================
   Tombol selebar kolom yang MELEBAR saat kursor mendekat: ikon + saja,
   lalu "+ Quick task". Ditaruh di LUAR .tg-kolom-isi - elemen itu zona
   jatuh seret-kartu, dan ia juga tetap menempel saat kartunya digulir.

   JANGAN tertukar dengan .tg-kolom-sisip-tombol: yang itu menyisipkan
   KOLOM, bentuknya bulat kecil di tepi kepala kolom.

   Hanya token warna, tanpa #hex - aturan tetap pemilik projek.
   ===================================================================== */
.tg-quick-tombol {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  width: 100%; margin: 6px 0 4px; padding: 5px 8px;
  border: 1px dashed var(--border-garis-2);
  border-radius: 7px;
  background: transparent;
  color: var(--text-redup);
  font-size: 12.5px; font-weight: 600; line-height: 1.2;
  cursor: pointer;
  opacity: .55;
  transition: opacity .14s, background .14s, border-color .14s, color .14s;
}

/* Melebar saat kursor mendekat KOLOMNYA, bukan hanya tombolnya -
   itu yang membuatnya mudah ditemukan tanpa menjadi ramai saat diam. */
.tg-kolom:hover > .tg-quick-tombol,
.tg-quick-tombol:hover,
.tg-quick-tombol:focus-visible {
  opacity: 1;
  background: var(--surface-2);
  border-color: var(--accent);
  color: var(--accent);
}

.tg-quick-plus { font-size: 15px; line-height: 1; font-weight: 700; }

/* Teksnya tersembunyi saat diam dan muncul saat didekati - persis
   perilaku yang diminta: ikon + yang berubah jadi "+ Quick task". */
.tg-quick-teks {
  max-width: 0; overflow: hidden; white-space: nowrap;
  opacity: 0;
  transition: max-width .16s ease, opacity .16s ease;
}
.tg-kolom:hover > .tg-quick-tombol .tg-quick-teks,
.tg-quick-tombol:hover .tg-quick-teks,
.tg-quick-tombol:focus-visible .tg-quick-teks {
  max-width: 160px; opacity: 1;
}

.tg-quick-kotak {
  margin: 6px 0 4px; padding: 7px;
  border: 1px solid var(--accent);
  border-radius: 7px;
  background: var(--surface);
}

.tg-quick-isian {
  width: 100%; box-sizing: border-box;
  padding: 6px 8px;
  border: 1px solid var(--border-garis-2);
  border-radius: 5px;
  background: var(--surface);
  color: var(--text);
  font-size: 13px; font-family: inherit;
}
.tg-quick-isian:focus { outline: none; border-color: var(--accent); }
.tg-quick-isian:disabled { opacity: .6; }

.tg-quick-petunjuk {
  margin-top: 5px;
  font-size: 11.5px; line-height: 1.35;
  color: var(--text-redup);
}
.tg-quick-galat { color: var(--status-merah); font-weight: 600; }

/* Kartu sisipan TIDAK diberi penanda apa pun.

   Versi pertama memberinya garis tepi, dengan anggapan ia sementara dan
   akan diganti saat halaman dimuat ulang. Sejak muat ulangnya dibuang
   (15 Okt 2026), kartu itu BUKAN sementara - ia setara kartu sungguhan,
   dan penanda yang menetap hanya membuatnya terlihat berbeda tanpa
   alasan. */

/* Okt 2026: empat kartu angka di Automation (.hari-ini.ab-ringkas).
   Aturan "kartu tembus pandang" di atas memberi SEMUA .hari-ini latar
   kaca gelap bersudut 8px - padahal di sini .hari-ini hanya pembungkus
   kisi, dan kartunya sendiri bersudut 12px. Latar pembungkusnya
   menyembul di tiap sudut dan celah antarkartu. Pembungkus dibuat
   transparan; tiap kartu tetap berwarna sendiri. */
body.latar-tembus main.page .hari-ini.ab-ringkas,
.hari-ini.ab-ringkas {
  background: transparent;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  box-shadow: none;
}
/* =====================================================================
   FEED PROYEK - PANEL DI DALAM TAB, 16 Oktober 2026
   =====================================================================

   Lahir 16 Okt 2026 sebagai modal tumpang, lalu diubah hari itu juga
   atas keputusan tim: Feed tampil LANGSUNG di bawah deretan tab halaman
   detail proyek, persis seperti Papan Kanban dan Planner. Task chats
   sengaja tetap seperti semula - ia memang halaman tersendiri.

   Karena itu seluruh gaya cangkangnya dibuang: lapisan gelap, tirai,
   tombol bulat di sisi kiri, tombol perbesar, dan penguncian gulir
   halaman. Yang TETAP adalah gaya ISINYA - penulis pos, bilah markah,
   lampiran, kartu pos, komentar, menu More - sebab isinya tidak pernah
   peduli ia duduk di dalam tumpang atau di dalam panel.

   Rupa isinya mengikuti rujukan pemilik projek (penulis pos Bitrix24):
   putih, lapang, bergaris tipis - bukan kotak abu-abu bertumpuk.

   Seluruh warnanya lewat token yang sudah ada. Nol #hex, sesuai aturan
   tetap projek.
   ===================================================================== */

/* Panelnya TIDAK menggulir sendiri. Gulir di dalam gulir adalah cara
   tercepat membuat orang kehilangan posisinya: halaman detail proyek
   sudah punya gulirnya sendiri, dan kotak kedua di dalamnya membuat
   roda tetikus mengenai yang salah tergantung di mana kursornya. Panel
   ini tumbuh setinggi isinya, dan halamannya yang menggulir. */
.pf-panel-tab{display:block;background:var(--surface-2);
  border-radius:12px;box-shadow:0 0 0 1px var(--line-soft);overflow:hidden}

/* Gagal memuat dibedakan dari sedang memuat - keduanya kalimat di
   tengah kotak kosong, dan tanpa beda warna orang menunggui yang
   sebenarnya sudah menyerah. */
.pf-memuat-gagal{color:var(--ink-soft)}


.pf-memuat{padding:64px 20px;text-align:center;color:var(--muted)}
.pf-tolak{padding:56px 20px;text-align:center;color:var(--ink-soft)}

/* --- kepala --- */
/* TIDAK sticky. Di dalam modal ia menempel di puncak panel yang
   menggulir sendiri; di dalam tab, puncaknya adalah puncak HALAMAN -
   dan kepala Feed yang melayang di sana akan menabrak bilah atas
   portal serta deretan tabnya sendiri. */
.pf-kepala{display:flex;align-items:center;gap:14px;padding:20px 26px 18px 26px;
  background:var(--surface);border-bottom:1px solid var(--line-soft)}
.pf-kepala-kiri{display:flex;align-items:center;gap:13px;min-width:0}
.pf-ikon{width:40px;height:40px;border-radius:12px;background:var(--accent-w);
  display:flex;align-items:center;justify-content:center;font-size:18px;flex:0 0 auto}
.pf-judul{margin:0;font-size:17px;font-weight:700;color:var(--ink);line-height:1.2}
.pf-sub{margin:2px 0 0;font-size:12.5px;color:var(--muted)}
.pf-jml{margin-left:auto;font-size:12.5px;color:var(--muted);white-space:nowrap}

/* Batas lebar isi DIBUANG 16 Okt 2026. Sebelumnya 860px, dan dengan
   panel 85% layar itu menyisakan jalur putih lebar di kiri-kanan yang
   terbaca sebagai kerusakan, bukan sebagai kelapangan. Lebar yang
   diminta memang untuk dipakai. */
.pf-badan{padding:20px 30px 34px}

/* --- penulis pos --- */
.pf-av{width:38px;height:38px;border-radius:50%;flex:0 0 auto}
.pf-tulis{background:var(--surface);border-radius:14px;
  box-shadow:0 1px 3px rgba(8,18,22,.06),0 0 0 1px var(--line-soft);overflow:hidden}

/* Rupa awal (gambar ke-3): kartu putih, deret tab, lalu SATU baris
   ajakan menulis. Lapang dan sepi - bukan tumpukan kotak. */
.pf-pemicu{display:block;width:100%;padding:20px 22px;background:var(--surface);
  border:0;cursor:pointer;text-align:left;font:inherit;font-size:14px;
  color:var(--muted)}
/* [hidden] HARUS disebut lagi di sini. Atribut hidden milik peramban
   hanya `display:none` di lembar gaya BAWAAN, dan `display:block` di
   atas - yang berasal dari lembar gaya kita sendiri - mengalahkannya.
   Akibatnya elemen yang sudah di-hidden JavaScript tetap tampil, tanpa
   satu pun galat. Terjadi 16 Okt 2026 pada ajakan "Tulis pos untuk ..."
   yang tidak mau hilang saat borangnya dibuka. */
.pf-pemicu[hidden]{display:none}
.pf-pemicu:hover{background:var(--surface-2)}

.pf-jenis{display:flex;gap:26px;padding:0 20px;border-bottom:1px solid var(--line-soft)}
.pf-jenis-tab{background:0;border:0;border-bottom:2px solid transparent;
  color:var(--muted);padding:14px 0 12px;font-size:12px;font-weight:700;
  letter-spacing:.7px;cursor:pointer}
.pf-jenis-tab.aktif{color:var(--accent-2);border-bottom-color:var(--accent)}
.pf-jenis-tab:hover{color:var(--ink-soft)}

/* Bilah markah - rapat, abu, bergaris bawah; isinya hanya markah yang
   bisa bertahan sebagai teks. Lihat catatan di tampilannya. */
.pf-markah{display:flex;align-items:center;gap:2px;padding:8px 14px;
  border-bottom:1px solid var(--line-soft);flex-wrap:wrap}
.pf-markah-btn{min-width:30px;height:30px;border:0;background:0;border-radius:7px;
  color:var(--ink-soft);font:inherit;font-size:13px;cursor:pointer;padding:0 7px;
  display:inline-flex;align-items:center;justify-content:center}
.pf-markah-btn:hover{background:var(--surface-2);color:var(--ink)}

/* TANDA AKTIF. Dibedakan dari :hover dengan TIGA hal sekaligus - warna
   latar, warna huruf, dan tebalnya - bukan hanya latar. Yang memakai
   mode gelap atau layar murah sering tidak bisa membedakan dua abu
   yang berdekatan, dan "apakah tombol ini menyala" adalah pertanyaan
   yang harus terjawab sekali lihat. */
.pf-markah-btn.aktif{background:var(--accent-w);color:var(--accent-2);
  font-weight:700;box-shadow:inset 0 0 0 1px var(--accent)}
.pf-markah-btn.aktif:hover{background:var(--accent-w)}
.pf-markah-pisah{width:1px;height:18px;background:var(--line);margin:0 6px}

/* Judul berdiri SENDIRI di atas bilah markah, jadi paddingnya ikut
   pindah ke sini - sebelumnya ia menumpang padding pembungkusnya. */
.pf-judul-isian{display:block;width:100%;border:0;
  border-bottom:1px solid var(--line-soft);
  padding:20px 22px 18px;font:inherit;font-size:16px;font-weight:600;
  color:var(--ink);background:transparent}
.pf-judul-isian:focus{outline:0;border-bottom-color:var(--accent);
  background:var(--surface-2)}
.pf-judul-isian::placeholder{color:var(--muted);font-weight:400}

.pf-borang-isi{padding:0 22px}

/* Kotak ketik contenteditable - gambar tempelan tampil DI DALAMNYA. */
/* Jarak atas memisahkannya dari bilah markah, jarak bawah dari bilah
   Upload. Tanpa keduanya ketiganya menempel dan terbaca sebagai satu
   gumpalan. */
.pf-isi{min-height:168px;max-height:46vh;overflow:auto;
  margin:18px 0 20px;font-size:14px;line-height:1.6;color:var(--ink);
  outline:0;border-radius:9px;padding:2px}
.pf-isi:empty::before{content:attr(data-ajak);color:var(--muted)}
.pf-isi.pf-isi-jatuh{outline:2px dashed var(--accent);outline-offset:5px}
.pf-isi-gambar{max-width:100%;max-height:340px;border-radius:9px;
  border:1px solid var(--line-soft);display:block;margin:9px 0}

.pf-alat{display:flex;align-items:center;gap:12px;padding:10px 20px 14px;
  border-bottom:1px solid var(--line-soft);flex-wrap:wrap}
.pf-alat-btn{display:inline-flex;align-items:center;gap:7px;background:0;
  border:1px solid var(--line);border-radius:8px;padding:6px 13px;
  color:var(--ink-soft);font:inherit;font-size:12.5px;cursor:pointer}
.pf-alat-btn:hover{border-color:var(--accent);color:var(--accent-2)}
.pf-alat-ikon{font-size:12px}
.pf-alat-nanti{opacity:.55;cursor:not-allowed}
.pf-alat-nanti:hover{border-color:var(--line);color:var(--ink-soft)}
.pf-alat-tanda{font-size:9.5px;font-weight:700;letter-spacing:.5px;
  background:var(--surface-2);color:var(--muted);border-radius:5px;padding:1px 6px}
.pf-alat-ajak{font-size:12px;color:var(--muted)}

.pf-lamp{display:flex;flex-wrap:wrap;gap:12px;padding:14px 20px 0}
.pf-lamp:empty{padding:0}
.pf-lamp-item{position:relative;width:92px}
.pf-lamp-muka{width:92px;height:68px;border-radius:9px;background:var(--surface-2);
  box-shadow:0 0 0 1px var(--line-soft);display:flex;align-items:center;
  justify-content:center;overflow:hidden;font-size:12px;font-weight:700;color:var(--muted)}
.pf-lamp-muka img{width:100%;height:100%;object-fit:cover;display:block}
.pf-lamp-nama{font-size:10.5px;color:var(--muted);margin-top:4px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pf-lamp-buang{position:absolute;top:-7px;right:-7px;width:21px;height:21px;
  border-radius:50%;border:0;background:var(--surface);color:var(--muted);
  font-size:13px;line-height:1;cursor:pointer;padding:0;
  box-shadow:0 1px 4px rgba(8,18,22,.22)}
.pf-lamp-buang:hover{color:var(--ink)}

.pf-kaki{padding:16px 20px 18px}
.pf-kaki-atas{display:flex;align-items:center;gap:11px;flex-wrap:wrap;
  padding-bottom:14px;border-bottom:1px solid var(--line-soft)}
.pf-ke-label{font-size:12.5px;color:var(--muted)}
.pf-chip{display:inline-flex;align-items:center;gap:7px;background:var(--accent-w);
  color:var(--accent-2);border-radius:8px;padding:5px 12px;
  font-size:12.5px;font-weight:600}
.pf-chip-ikon{font-size:12px}
.pf-kunci{font-size:10.5px;opacity:.8}
.pf-penting{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;
  color:var(--ink-soft);margin-left:auto}
.pf-sampai{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--muted)}
.pf-sampai[hidden]{display:none}
.pf-tgl{border:1px solid var(--line);border-radius:7px;padding:4px 8px;
  font:inherit;font-size:12.5px;color:var(--ink);background:var(--surface)}

.pf-kaki-bawah{display:flex;align-items:center;gap:12px;padding-top:15px;flex-wrap:wrap}
.pf-kirim{background:var(--accent);color:rgba(255,255,255,.96);border:0;
  border-radius:9px;padding:11px 30px;font:inherit;font-size:12.5px;
  font-weight:700;letter-spacing:.7px;cursor:pointer}
.pf-kirim:hover{background:var(--accent-2)}
.pf-kirim:disabled{opacity:.6;cursor:default}
.pf-batal{background:0;border:0;color:var(--muted);font:inherit;font-size:12.5px;
  font-weight:700;letter-spacing:.7px;cursor:pointer;padding:11px 6px}
.pf-batal:hover{color:var(--ink)}
.pf-pesan{font-size:12.5px;color:var(--muted)}
.pf-pesan-galat{color:var(--awas,var(--ink-soft));font-weight:600}

/* --- daftar pos --- */
.pf-daftar{margin-top:20px;display:flex;flex-direction:column;gap:14px}
.pf-pos{background:var(--surface);border-radius:14px;padding:18px 20px;
  box-shadow:0 1px 3px rgba(8,18,22,.06),0 0 0 1px var(--line-soft)}
.pf-pos-disemat{box-shadow:0 1px 3px rgba(8,18,22,.06),0 0 0 1.5px var(--accent)}
.pf-pos-kepala{display:flex;align-items:center;gap:12px}
.pf-pos-siapa{min-width:0}
.pf-pos-nama{font-weight:700;color:var(--ink);font-size:13.5px}
.pf-pos-wkt{display:block;font-size:11.5px;color:var(--muted);margin-top:1px}
.pf-tag{margin-left:auto;background:var(--surface-2);color:var(--muted);
  border-radius:6px;padding:3px 10px;font-size:10.5px;font-weight:700;letter-spacing:.5px}
.pf-tag-disemat{background:var(--accent);color:rgba(255,255,255,.96)}

.pf-pos-judul{margin:14px 0 7px;font-size:15px;font-weight:700;color:var(--ink)}
.pf-pos-isi{color:var(--ink-soft);font-size:13.5px;line-height:1.65;
  white-space:pre-wrap;word-wrap:break-word}
.pf-pos-isi strong{color:var(--ink)}

/* Tautan di dalam pos. word-break menjaga alamat panjang tanpa spasi
   tidak melebarkan kartunya - tampilannya sudah dipotong di 70 huruf,
   tetapi alamat tanpa pemisah tetap bisa menembus. */
.pf-tautan{color:var(--accent);text-decoration:none;word-break:break-word}
.pf-tautan:hover{text-decoration:underline}

/* LAMPIRAN DI BAWAH POS = UBIN KECIL, bukan gambar lebar.

   Sampai 16 Okt 2026 galeri ini memakai grid selebar kartunya; dengan
   panel 85% layar, satu gambar saja memenuhi hampir seluruh layar dan
   mendorong pos berikutnya jauh ke bawah. Lampiran di sini gunanya
   menunjukkan APA yang ikut, bukan memamerkannya - yang ingin dilihat
   besar sudah ada di dalam tulisan, atau tinggal diklik.

   Ubin tetap juga berarti tinggi kartunya tidak berubah saat gambarnya
   selesai dimuat; tinggi yang berubah menarik gulir dan membuat orang
   kehilangan tempat bacanya. */
.pf-galeri{display:flex;flex-wrap:wrap;gap:8px;margin-top:13px}
.pf-galeri-sel{position:relative;display:block;width:104px;height:78px;
  border-radius:9px;overflow:hidden;box-shadow:0 0 0 1px var(--line-soft);
  flex:0 0 auto}
.pf-galeri-sel:hover{box-shadow:0 0 0 1.5px var(--accent)}
.pf-galeri-sel img{width:100%;height:100%;object-fit:cover;display:block}

.pf-galeri-ket{margin:7px 0 0;font-size:11.5px;color:var(--muted)}
.pf-berkas{margin-top:12px;display:flex;flex-direction:column;gap:6px;font-size:12.5px}
.pf-berkas a{color:var(--accent);text-decoration:none;display:inline-flex;gap:7px}
.pf-berkas a:hover{text-decoration:underline}
.pf-pos-kaki{margin-top:14px;padding-top:12px;border-top:1px solid var(--line-soft);
  font-size:12.5px}
.pf-pos-kaki a{color:var(--muted);text-decoration:none}
.pf-pos-kaki a:hover{color:var(--accent)}

/* --- komentar --- */
.pf-pos-kaki{display:flex;align-items:center;gap:16px}
.pf-kaki-btn{background:0;border:0;padding:0;font:inherit;font-size:12.5px;
  color:var(--muted);cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.pf-kaki-btn:hover{color:var(--accent)}
.pf-kaki-tautan{margin-left:auto;font-size:12.5px;color:var(--muted);text-decoration:none}
.pf-kaki-tautan:hover{color:var(--accent)}

/* --- menu "More" --- */
.pf-menu-bungkus{position:relative}
.pf-menu-pemicu{font-weight:600}
.pf-menu{position:absolute;right:0;bottom:calc(100% + 8px);z-index:5;
  min-width:148px;background:var(--surface);border-radius:10px;padding:5px;
  box-shadow:0 8px 28px rgba(8,18,22,.22),0 0 0 1px var(--line-soft);
  display:flex;flex-direction:column}
.pf-menu[hidden]{display:none}
.pf-menu-butir{background:0;border:0;text-align:left;padding:9px 12px;
  border-radius:7px;font:inherit;font-size:13px;color:var(--ink-soft);cursor:pointer}
.pf-menu-butir:hover{background:var(--surface-2);color:var(--ink)}
.pf-menu-bahaya{color:var(--awas,var(--ink-soft))}
.pf-menu-bahaya:hover{background:var(--awas-w,var(--surface-2))}

.pf-kom-wadah{margin-top:12px;padding-top:12px;border-top:1px solid var(--line-soft)}
.pf-kom-wadah[hidden]{display:none}
.pf-kom-kosong{margin:0;font-size:12.5px;color:var(--muted)}
.pf-kom-daftar{list-style:none;margin:0;padding:0;display:flex;
  flex-direction:column;gap:12px}
.pf-kom-butir{display:flex;gap:10px}
.pf-kom-av{width:30px;height:30px;border-radius:50%;flex:0 0 auto}
.pf-kom-isi{min-width:0;flex:1 1 auto}
.pf-kom-kepala{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.pf-kom-nama{font-weight:700;font-size:12.5px;color:var(--ink)}
.pf-kom-wkt{font-size:11px;color:var(--muted)}
.pf-kom-teks{font-size:13px;line-height:1.55;color:var(--ink-soft);
  white-space:pre-wrap;word-wrap:break-word;margin-top:2px}

.pf-kom-tulis{display:flex;align-items:center;gap:10px;margin-top:14px}
.pf-kom-kotak{flex:1 1 auto;border:0;box-shadow:0 0 0 1px var(--line);
  border-radius:99px;padding:9px 16px;font:inherit;font-size:13px;
  color:var(--ink);background:var(--surface)}
.pf-kom-kotak:focus{outline:0;box-shadow:0 0 0 1.5px var(--accent)}
.pf-kom-kirim{border:0;background:var(--accent);color:rgba(255,255,255,.96);
  border-radius:99px;padding:9px 18px;font:inherit;font-size:12.5px;
  font-weight:700;cursor:pointer;flex:0 0 auto}
.pf-kom-kirim:hover{background:var(--accent-2)}
.pf-kom-kirim:disabled{opacity:.6;cursor:default}
.pf-kom-pesan{margin:8px 0 0;font-size:12px;color:var(--muted)}
.pf-kom-pesan:empty{display:none}
.pf-kom-galat{color:var(--awas,var(--ink-soft));font-weight:600}

.pf-kosong{text-align:center;padding:56px 24px;background:var(--surface);
  border-radius:14px;box-shadow:0 0 0 1px var(--line-soft)}
.pf-kosong-ikon{font-size:32px;opacity:.45}
.pf-kosong strong{display:block;margin:12px 0 6px;font-size:15px;color:var(--ink)}
.pf-kosong p{margin:0 auto;max-width:440px;color:var(--muted);font-size:13px;line-height:1.6}

.pf-lagi{text-align:center;margin-top:18px}
.pf-lagi-btn{background:var(--surface);border:0;box-shadow:0 0 0 1px var(--line);
  border-radius:9px;padding:9px 20px;font:inherit;font-size:12.5px;
  color:var(--ink-soft);cursor:pointer}
.pf-lagi-btn:hover{box-shadow:0 0 0 1px var(--accent);color:var(--accent-2)}

/* Ambang 980px DIBUANG: isinya hanya mengatur tombol bulat dan
   lapisan tumpang, dan keduanya sudah tidak ada. Menyisakan aturan
   kosong di sini berarti orang berikutnya mengira ada yang hilang. */
@media (max-width:720px){
  /* Sudut dan garis panel dilepas di layar sempit - di lebar segitu
     bingkai hanya memakan tempat tanpa memisahkan apa pun. */
  .pf-panel-tab{border-radius:0;box-shadow:none}
  .pf-kepala{padding:16px 18px 14px}
  .pf-badan{padding:16px 14px 28px}
  .pf-galeri-3{grid-template-columns:1fr 1fr}
  .pf-penting{margin-left:0}
}

/* =====================================================================
   PENAMPIL GAMBAR LAYAR PENUH - 16 Oktober 2026
   =====================================================================

   Latarnya gelap pekat dan SENGAJA tidak memakai token permukaan:
   penampil gambar harus gelap di mode terang maupun gelap, sebab yang
   dinilai orang adalah gambarnya - permukaan terang di sekelilingnya
   mengubah cara mata membaca warna di dalamnya.

   1400 - di atas slideover detail tugas (1000), satu-satunya tumpang
   lain yang bisa terbuka dari dalam pos. Ia memang tampil DI ATAS
   panelnya, bukan menggantikannya: menutupnya mengembalikan orang ke
   posnya, pada posisi gulir yang sama.
   ===================================================================== */
.pl-lapis{position:fixed;inset:0;z-index:1400;background:rgba(6,10,12,.94);
  display:flex;flex-direction:column}
.pl-lapis[hidden]{display:none}
body.pl-terkunci{overflow:hidden}

.pl-atas{display:flex;align-items:center;gap:14px;padding:12px 16px;
  color:rgba(255,255,255,.9);flex:0 0 auto}
.pl-judul{font-size:13px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;max-width:46vw}
.pl-posisi{font-size:12px;color:rgba(255,255,255,.55)}
.pl-alat{margin-left:auto;display:flex;align-items:center;gap:4px}
.pl-ikon{width:38px;height:38px;border-radius:9px;border:0;background:transparent;
  color:rgba(255,255,255,.85);font-size:16px;line-height:1;cursor:pointer;padding:0;
  display:flex;align-items:center;justify-content:center;text-decoration:none}
.pl-ikon:hover{background:rgba(255,255,255,.14);color:rgba(255,255,255,1)}
.pl-tutup{font-size:24px}

.pl-panggung{flex:1 1 auto;display:flex;align-items:center;justify-content:center;
  overflow:hidden;padding:8px 68px;min-height:0}
.pl-gambar{max-width:100%;max-height:100%;object-fit:contain;display:block;
  transform-origin:center center;transition:transform .12s ease}

.pl-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:2;
  width:48px;height:48px;border-radius:50%;border:0;
  background:rgba(255,255,255,.12);color:rgba(255,255,255,.9);
  font-size:20px;line-height:1;cursor:pointer;padding:0}
.pl-nav:hover{background:rgba(255,255,255,.24)}
.pl-prev{left:14px}
.pl-next{right:14px}

/* Deret ubin di bawah - jumlahnya mengikuti gambar di pos itu. */
.pl-strip{flex:0 0 auto;display:flex;gap:8px;padding:12px 16px 16px;
  overflow-x:auto;justify-content:center}
.pl-strip[hidden]{display:none}
.pl-strip-ubin{width:74px;height:56px;border-radius:7px;overflow:hidden;
  border:0;padding:0;cursor:pointer;flex:0 0 auto;opacity:.5;
  box-shadow:0 0 0 2px transparent;background:rgba(255,255,255,.08)}
.pl-strip-ubin:hover{opacity:.85}
.pl-strip-ubin.aktif{opacity:1;box-shadow:0 0 0 2px rgba(255,255,255,.9)}
.pl-strip-ubin img{width:100%;height:100%;object-fit:cover;display:block}

/* Gambar di dalam pos & ubin galeri: tandai bahwa ia bisa diklik. */
.pf-isi-gambar{cursor:zoom-in}
.pf-galeri-sel{cursor:zoom-in}

@media (max-width:720px){
  .pl-panggung{padding:6px 10px}
  .pl-nav{width:40px;height:40px;font-size:17px}
  .pl-prev{left:6px}
  .pl-next{right:6px}
  .pl-judul{max-width:38vw}
  .pl-strip{justify-content:flex-start}
}

/* Okt 2026: Pos populer di Feed - alamat panjang tanpa spasi (mis.
   https://portal.../workgroups/group/4/tasks/...) keluar dari kotak.
   Kolom teksnya boleh menyempit dan kata panjang dipatahkan. */
/* :not(.avatar) - fotonya juga <span> anak langsung li; tanpa ini ikut
   melebar menjadi lonjong (versi 17 Okt pagi). */
.fd-populer li > span:not(.avatar) { flex: 1 1 auto; }
.fd-populer li > .avatar { flex: 0 0 28px; width: 28px; height: 28px; }
.fd-populer a { overflow-wrap: anywhere; word-break: break-word; }

/* =====================================================================
   BERANDA MERIAH (Okt 2026) - kritik: "sendu, sunyi, banyak bidang
   kosong". Pita sapaan berwarna + enam ubin angka, pita hari ini
   berwarna, dan kotak disusun dua kolom (kerjakan | ketahui).
   app/Views/beranda_sapa.php, app/Views/dashboard.php
   ===================================================================== */
.bd-sapa {
  position: relative; overflow: hidden;
  border-radius: 16px; padding: 22px 24px 20px; margin-bottom: 16px;
  color: #fff;
  background: linear-gradient(120deg, #0F4C9A 0%, #1A63C4 38%, #5A4BC4 72%, #9A3F9E 100%);
  box-shadow: 0 8px 24px rgba(10, 30, 70, .35);
}
.bd-sapa::before, .bd-sapa::after {
  content: ''; position: absolute; border-radius: 50%; pointer-events: none;
  background: rgba(255, 255, 255, .08);
}
.bd-sapa::before { width: 320px; height: 320px; right: -80px; top: -150px; }
.bd-sapa::after  { width: 200px; height: 200px; right: 180px; bottom: -130px; background: rgba(255, 255, 255, .06); }
.bd-sapa-kepala { position: relative; z-index: 1; }
.bd-sapa-tgl   { margin: 0; font-size: .8rem; letter-spacing: .04em; text-transform: uppercase; color: rgba(255,255,255,.8); }
.bd-sapa-judul { margin: 4px 0 2px; font-size: 1.65rem; font-weight: 700; color: #fff; line-height: 1.2; }
.bd-sapa-kata  { margin: 0; font-size: .92rem; color: rgba(255,255,255,.88); }

.bd-ubin {
  position: relative; z-index: 1;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 10px; margin-top: 16px;
}
.bd-ubin-satu {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; border-radius: 12px; color: #fff; text-decoration: none;
  box-shadow: 0 3px 10px rgba(0, 0, 0, .22);
  transition: transform .15s ease, filter .15s ease;
}
.bd-ubin-satu:hover { color: #fff; transform: translateY(-2px); filter: brightness(1.08); }
.bd-ubin-ikon {
  flex: 0 0 40px; width: 40px; height: 40px; border-radius: 10px;
  display: grid; place-items: center; background: rgba(255, 255, 255, .2);
}
.bd-ubin-ikon svg { width: 22px; height: 22px; }
.bd-ubin-teks { display: flex; flex-direction: column; min-width: 0; line-height: 1.15; }
.bd-ubin-angka { font-size: 1.55rem; font-weight: 800; }
.bd-ubin-label { font-size: .82rem; font-weight: 600; }
.bd-ubin-teks small { font-size: .7rem; color: rgba(255,255,255,.82); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.bd-c-biru  { background: linear-gradient(135deg, #1A63C4, #3D8BEA); }
.bd-c-jingga{ background: linear-gradient(135deg, #E07A10, #F5B13D); }
.bd-c-ungu  { background: linear-gradient(135deg, #6B45D8, #9B6CF2); }
.bd-c-hijau { background: linear-gradient(135deg, #15965E, #2CC489); }
.bd-c-tosca { background: linear-gradient(135deg, #0E8A9A, #2BB8C4); }
.bd-c-merah { background: linear-gradient(135deg, #D6453B, #F27A6A); }

/* Pita "hari ini" - kartu berwarna, sama keluarganya dengan Automation. */
.bd-hari { margin-bottom: 16px; }
.bd-hari .hari-bagian .muted { color: rgba(255,255,255,.85) !important; }
.bd-hari .hari-bagian strong { font-size: 1.15rem; }
.bd-hari .btn { background: rgba(255,255,255,.22); border-color: rgba(255,255,255,.35); color: #fff; }
.bd-hari .btn:hover { background: rgba(255,255,255,.32); color: #fff; }

/* Dua kolom: kiri = yang perlu dikerjakan, kanan = yang perlu diketahui. */
.bd-tata {
  display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr);
  gap: 16px; align-items: start;
}
.bd-utama, .bd-sisi { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.bd-utama > .kotak, .bd-sisi > .kotak { margin: 0; }
@media (max-width: 1100px) { .bd-tata { grid-template-columns: minmax(0, 1fr); } }

/* Aksen warna per kotak: garis atas + titik di depan judul. */
.bd-tata .kotak { border-top: 3px solid var(--bd-aksen, var(--accent)); }
.bd-tata .kotak .kotak-judul::before {
  content: ''; display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  margin-right: 8px; vertical-align: middle; background: var(--bd-aksen, var(--accent));
}
.bd-tata .kotak[data-kotak="tugas-tinjau"]    { --bd-aksen: #F5A524; }
.bd-tata .kotak[data-kotak="auto-tugas"]      { --bd-aksen: #F08A24; }
.bd-tata .kotak[data-kotak="tugas-saya"]      { --bd-aksen: #3D8BEA; }
.bd-tata .kotak[data-kotak="auto-saya"]       { --bd-aksen: #9B6CF2; }
.bd-tata .kotak[data-kotak="laporan-masuk"]   { --bd-aksen: #2CC489; }
.bd-tata .kotak[data-kotak="agenda-beranda"]  { --bd-aksen: #2BB8C4; }
.bd-tata .kotak[data-kotak="surat-beranda"]   { --bd-aksen: #5B9BEA; }
.bd-tata .kotak[data-kotak="obrolan-beranda"] { --bd-aksen: #E8649A; }
.bd-tata .kotak[data-kotak="grup-beranda"]    { --bd-aksen: #7B5CF0; }
.bd-tata .kotak[data-kotak="ultah-beranda"]   { --bd-aksen: #F27A6A; }
.bd-tata .kotak[data-kotak="tim"]             { --bd-aksen: #16A36A; }

@media (max-width: 640px) {
  .bd-sapa { padding: 18px 16px; }
  .bd-sapa-judul { font-size: 1.3rem; }
  .bd-ubin { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Okt 2026: "Unduh aplikasi" di sisi kanan pita sapaan Beranda.
   Hiasan lingkaran dipindah ke .bd-sapa-hias (yang memotong dirinya
   sendiri), supaya pita boleh overflow:visible - panel petunjuk
   pemasangan yang muncul saat lencana disorot tidak terpotong. */
.bd-sapa { overflow: visible; }
.bd-sapa::before, .bd-sapa::after { content: none; }
.bd-sapa-hias {
  position: absolute; inset: 0; border-radius: inherit; overflow: hidden; pointer-events: none;
}
.bd-sapa-hias::before, .bd-sapa-hias::after {
  content: ''; position: absolute; border-radius: 50%; background: rgba(255, 255, 255, .08);
}
.bd-sapa-hias::before { width: 320px; height: 320px; right: -80px; top: -150px; }
.bd-sapa-hias::after  { width: 200px; height: 200px; right: 180px; bottom: -130px; background: rgba(255, 255, 255, .06); }
.bd-sapa-kepala {
  position: relative; z-index: 3;
  display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; flex-wrap: wrap;
}
.bd-sapa-salam { flex: 1 1 280px; min-width: 0; }
.bd-sapa-unduh { flex: 0 1 auto; max-width: 100%; }
.bd-sapa-unduh .unduh-kartu {
  margin: 0; padding: 10px 14px 12px; border-radius: 12px;
  background: rgba(255, 255, 255, .12); border: 1px solid rgba(255, 255, 255, .22);
  box-shadow: none; color: #fff;
  -webkit-backdrop-filter: none; backdrop-filter: none;
}
.bd-sapa-unduh .unduh-kepala h2 { color: #fff; font-size: .92rem; }
.bd-sapa-unduh .unduh-kepala p { color: rgba(255, 255, 255, .85) !important; font-size: .76rem; max-width: 520px; }
.bd-sapa-unduh .unduh-kepala p strong { color: #fff; }
.bd-sapa-unduh .unduh-daftar { margin-top: 8px; gap: 6px; }
.bd-sapa-unduh .unduh-lencana {
  background: rgba(255, 255, 255, .16); border-color: rgba(255, 255, 255, .28); color: #fff;
  padding: 6px 12px 6px 8px; font-size: .8rem;
}
.bd-sapa-unduh .unduh-ikon { color: #fff; width: 18px; height: 18px; flex-basis: 18px; }
.bd-sapa-unduh a.unduh-lencana:hover { background: rgba(255, 255, 255, .28); border-color: #fff; color: #fff; }
.bd-sapa-unduh .unduh-mati { background: transparent; color: rgba(255, 255, 255, .6); border-color: rgba(255, 255, 255, .3); }
.bd-sapa-unduh .unduh-mati .unduh-ikon { color: rgba(255, 255, 255, .6); }
/* Panel petunjuk pemasangan tetap bergaya kartu biasa (tulisan gelap/terang ikut tema). */
.bd-sapa-unduh .unduh-tip { color: var(--ink); }
.bd-sapa-unduh .unduh-tip { background: var(--surface); border-radius: 8px; padding: 8px 10px; }
@media (hover: hover) and (pointer: fine) {
  .bd-sapa-unduh .unduh-tip { left: auto; right: 0; }
}

/* Okt 2026: Feed - penanda laporan warisan Bitrix yang gambar
   tempelannya tidak pernah tersimpan (isi hanya "<img>" tanpa alamat). */
.fd-gambar-hilang {
  display: inline-flex; align-items: center; gap: 6px;
  margin: 8px 0 0; padding: 4px 10px; border-radius: 999px;
  font-size: .76rem; color: var(--muted);
  background: var(--surface-2); border: 1px dashed var(--line);
}
.fd-gambar-hilang svg { width: 14px; height: 14px; flex: 0 0 14px; }

/* Okt 2026: kalimat pengantar "Portal Padma sebagai aplikasi sendiri ..."
   di kotak Unduh aplikasi pada pita sapaan Beranda disembunyikan
   (permintaan IT). Judul dan lencananya tetap. */
.bd-sapa-unduh .unduh-kepala p { display: none; }

/* Okt 2026: bilah judul kotak Beranda diwarnai penuh dengan warna aksen
   kotaknya masing-masing (permintaan IT) - tulisan & tombol jadi putih. */
.bd-tata .kotak { border-top: 0; }
.bd-tata .kotak > .kotak-bar {
  background:
    linear-gradient(135deg, rgba(255, 255, 255, .16), rgba(255, 255, 255, 0) 60%),
    var(--bd-aksen, var(--accent));
  border-bottom: 0;
  color: #fff;
}
.bd-tata .kotak > .kotak-bar .kotak-judul { color: #fff; font-weight: 700; }
.bd-tata .kotak > .kotak-bar .kotak-judul::before { background: rgba(255, 255, 255, .85); }
.bd-tata .kotak > .kotak-bar .kotak-info { color: rgba(255, 255, 255, .9); }
.bd-tata .kotak > .kotak-bar .kotak-jendela button { color: #fff; opacity: .9; }
.bd-tata .kotak > .kotak-bar .kotak-jendela button:hover { background: rgba(255, 255, 255, .2); opacity: 1; }

/* Okt 2026: tiga kotak Beranda di luar dua kolom (Profil saya, Ringkasan
   karyawan, Aktivitas login terakhir) ikut diberi bilah judul berwarna. */
.kotak[data-kotak="profil"]         { --bd-aksen: #1F7FB8; }
.kotak[data-kotak="ringkas"]        { --bd-aksen: #C2459C; }
.kotak[data-kotak="login-terakhir"] { --bd-aksen: #5B6B82; }
.kotak:is([data-kotak="profil"], [data-kotak="ringkas"], [data-kotak="login-terakhir"]) > .kotak-bar {
  background:
    linear-gradient(135deg, rgba(255, 255, 255, .16), rgba(255, 255, 255, 0) 60%),
    var(--bd-aksen);
  border-bottom: 0; color: #fff;
}
.kotak:is([data-kotak="profil"], [data-kotak="ringkas"], [data-kotak="login-terakhir"]) > .kotak-bar .kotak-judul { color: #fff; font-weight: 700; }
.kotak:is([data-kotak="profil"], [data-kotak="ringkas"], [data-kotak="login-terakhir"]) > .kotak-bar .kotak-judul::before {
  content: ''; display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  margin-right: 8px; vertical-align: middle; background: rgba(255, 255, 255, .85);
}
.kotak:is([data-kotak="profil"], [data-kotak="ringkas"], [data-kotak="login-terakhir"]) > .kotak-bar .kotak-info { color: rgba(255, 255, 255, .9); }
.kotak:is([data-kotak="profil"], [data-kotak="ringkas"], [data-kotak="login-terakhir"]) > .kotak-bar .kotak-jendela button { color: #fff; opacity: .9; }
.kotak:is([data-kotak="profil"], [data-kotak="ringkas"], [data-kotak="login-terakhir"]) > .kotak-bar .kotak-jendela button:hover { background: rgba(255, 255, 255, .2); opacity: 1; }

/* ---- Zona Berbahaya di modal Kelola Proyek (20 Okt 2026) ----
   Bentuk kartunya sengaja MENIRU kartu Arsip yang duduk tepat di
   atasnya - jarak, sudut, dan susunannya sama. Yang membedakan hanya
   warnanya, dan itu cukup: dua kartu yang berbeda bentuk di dasar satu
   tab terbaca sebagai dua hal yang tidak berhubungan, padahal keduanya
   aksi daur-hidup proyek yang sama.

   Warnanya dari token --crit, bukan heks karangan: berkas ini punya dua
   palet, dan yang kedua hanya terlihat oleh yang memakainya. */
.tg-zona-bahaya {
  margin-top: 12px; padding: 16px;
  border: 1px solid var(--crit); border-radius: 10px;
  background: var(--crit-w);
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 12px;
}
.tg-zona-bahaya strong {
  display: block; font-size: 13px; color: var(--crit);
}
.tg-zona-bahaya .muted { display: block; margin-top: 2px; max-width: 62ch; }
.tg-btn-bahaya {
  background: var(--crit); border-color: var(--crit); color: #fff;
  flex: 0 0 auto;
}
.tg-btn-bahaya:hover { opacity: .9; }

/* ---- baris "pilih karyawan + Tambah" di borang tugas (20 Okt 2026) ----
   Kotak ketiknya MENGISI sisa lebar, tombolnya menempel di kanan.

   Tanpa aturan ini kotaknya menyusut ke selebar isinya dan menyisakan
   ruang kosong di tengah baris. Sebabnya halus: flex:1 dulu menempel di
   <select>-nya, dan pilih_cari.js menyembunyikan select itu lalu
   menyisipkan pembungkusnya SEBELUM-nya - pembungkus yang tidak mewarisi
   apa pun dari select yang digantikannya.

   Dua pemilih: select polos (tanpa JavaScript, select-nya sendiri yang
   tampil) DAN pembungkus pilih-cari. Keduanya perlu, dan keduanya murah.

   min-width:0 wajib - tanpa itu, kotak berisi nama panjang menolak
   menyusut dan mendorong tombolnya keluar baris. */
.tg-baris-tambah { display: flex; gap: 8px; align-items: center; }
.tg-baris-tambah > select,
.tg-baris-tambah > .pc-bungkus { flex: 1 1 auto; min-width: 0; }
.tg-baris-tambah > .btn { flex: 0 0 auto; }
.tg-baris-tambah > .pc-bungkus input {
  height: 32px; box-sizing: border-box;
  border: 1px solid var(--border-garis, var(--line)); border-radius: 6px;
  font-size: 13px; padding: 0 10px; background: var(--surface); color: var(--ink);
}



/* =====================================================================
   OBROLAN TUGAS & CHECKLIST - gaya dari develop_nia, 23 Oktober 2026
   =====================================================================

   Hanya empat belas kelas .tg-* yang BELUM ada di berkas ini, bukan
   seluruh selisih app.css milik develop_nia - permintaan pemilik
   projek: ambil yang dibutuhkan revisinya saja.

   Yang memakainya:
     .tg-chat-link                     Tugas::tautkanPesan()
     .tg-chat-tick .tg-tick-blue
     .tg-tick-gray .tg-chat-flag-dilihat
     .tg-flag-arrow                    penanda terkirim/dibaca di
                                       panel obrolan halaman detail
     .tg-chat-wrapper-me
     .tg-chat-head-members-btn         kepala panel obrolan
     .tg-emoji-* .tg-mention-popup-footer
     .tg-avatar-ai .tg-avatar-all      pemilih emoji & sebut orang

   DITARUH SEBELUM blok lencana tab dengan sengaja. Blok itu dan
   seluruh isi SESUDAHNYA dijaga bebas #hex (uji_lencana_automation);
   aturan di bawah masih memuat warna harfiah bawaan rancangan nia,
   jadi menaruhnya di sana akan membuat penjaga itu merah untuk sebab
   yang bukan cacat.

   Catatan jujur: karena warnanya harfiah, kelas-kelas ini TIDAK
   mengikuti mode gelap. Dibiarkan apa adanya supaya tampilannya sama
   persis dengan rancangan yang sudah diuji; memetakannya ke token
   adalah pekerjaan tersendiri yang pantas diuji sendiri.
   ===================================================================== */
.tg-chat-head-members-btn {
  cursor: pointer;
  display: inline-block;
  user-select: none;
  transition: color 0.15s ease, text-decoration 0.15s ease;
}
.tg-chat-head-members-btn:hover {
  color: var(--accent, #0088cc) !important;
  text-decoration: underline;
}
/* Chat Read Receipts (Centang & Flag Dilihat) */
.tg-chat-wrapper-me {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 4px;
}
.tg-chat-tick {
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
  line-height: 1;
  margin-left: 3px;
}
.tg-chat-tick svg {
  width: 14px;
  height: 14px;
  display: block;
}
.tg-chat-tick.tg-tick-gray {
  color: #94a3b8;
}
.tg-chat-tick.tg-tick-blue {
  color: #2B7DE9;
}
.tg-chat-flag-dilihat {
  align-self: flex-end;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 10px;
  border-radius: 12px;
  background: var(--text-redup, #828B99);
  color: #FFFFFF;
  font-size: 11px;
  font-weight: 500;
  line-height: 1.3;
  margin-top: 2px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12);
  user-select: none;
  cursor: default;
  transition: all .15s ease;
}
.tg-chat-flag-dilihat .tg-flag-arrow {
  font-size: 13px;
  line-height: 1;
  opacity: 0.85;
}
.tg-chat-link {
  color: #0083B0;
  text-decoration: underline;
  text-underline-offset: 2px;
  word-break: break-all;
  font-weight: 500;
  transition: color .12s ease, text-decoration-color .12s ease;
}
.tg-chat-item.me .tg-chat-link,
.tg-chat-item.tg-chat-me .tg-chat-link {
  color: #006699;
}
.tg-chat-link:hover {
  color: #0056b3;
  text-decoration: underline;
}
.tg-avatar-ai {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: linear-gradient(135deg, #8b5cf6 0%, #d946ef 100%);
  color: #FFFFFF;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 2px 6px rgba(139, 92, 246, 0.3);
}
.tg-avatar-all {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: #0ea5e9;
  color: #FFFFFF;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 2px 6px rgba(14, 165, 233, 0.3);
}
.tg-mention-popup-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 8px 14px;
  background: #F8FAFC;
  border-top: 1px solid #F1F5F9;
  font-size: 11px;
  color: #64748B;
  user-select: none;
  gap: 6px;
  flex-wrap: wrap;
}
.tg-mention-popup-footer kbd {
  display: inline-block;
  padding: 1px 4px;
  font-family: inherit;
  font-size: 10px;
  line-height: 1.2;
  color: #334155;
  background-color: #E2E8F0;
  border-radius: 3px;
  border: 1px solid #CBD5E1;
}
/* Pop-up Picker Emoji */
.tg-emoji-picker-popup {
  position: absolute;
  bottom: calc(100% + 10px);
  right: 50px;
  width: 310px;
  background: var(--surface, #FFFFFF);
  border: 1px solid rgba(226, 232, 240, 0.9);
  border-radius: 14px;
  box-shadow: 0 16px 36px rgba(15, 23, 42, 0.16), 0 4px 12px rgba(0, 0, 0, 0.06);
  z-index: 135;
  overflow: hidden;
  animation: tgSlideUp .18s cubic-bezier(0.16, 1, 0.3, 1);
  user-select: none;
}
.tg-emoji-picker-popup[hidden] {
  display: none !important;
}
.tg-emoji-grid {
  display: grid;
  grid-template-columns: repeat(8, 1fr);
  gap: 4px;
  padding: 10px;
  max-height: 220px;
  overflow-y: auto;
}
.tg-emoji-btn {
  background: transparent;
  border: none;
  font-size: 21px;
  line-height: 1;
  height: 34px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  cursor: pointer;
  transition: background .12s ease, transform .1s ease;
  padding: 0;
}
.tg-emoji-btn:hover {
  background: #F1F5F9;
  transform: scale(1.22);
}
.tg-emoji-btn:active {
  transform: scale(0.95);
}

/* =====================================================================
   ANGKA DI TAB - .sub-lencana, 22 Oktober 2026
   =====================================================================

   Pasangan .side-lencana di menu kiri. Dipakai tab "Persetujuan untuk
   Anda" pada bilah Automation; dipasang layout.php hanya bila giliran
   memutuskan memang ada pada orang itu.

   Warnanya var(--crit) - sama dengan lencana menu kiri, supaya dua
   angka untuk hal yang SAMA tidak tampak seperti dua hal berbeda.
   Nol #hex: seluruh nilainya token, jadi mode gelap ikut tanpa aturan
   kedua. Putih pada teksnya memang harfiah - ia tulisan di atas warna
   peringatan, bukan warna yang mengikuti tema.
   ===================================================================== */
.sub-lencana {
  display: inline-block; margin-left: 6px; flex: 0 0 auto;
  min-width: 18px; height: 18px; padding: 0 5px;
  border-radius: 9px; background: var(--crit); color: var(--lencana-teks);
  font-size: .66rem; font-weight: 700; line-height: 18px; text-align: center;
  vertical-align: 1px;
}
.sub-item.aktif .sub-lencana { background: var(--crit); }

/* Halaman yang memang perlu selebar layar - Monitoring Clock In /
   Out, 22 Okt 2026. Batas 1400px di .page benar untuk halaman
   berisi tulisan, tetapi halaman ini berisi tabel matriks selebar
   satu periode, tujuh kartu KPI, dan peta; sisa ruang di kanan
   terbaca sebagai halaman yang gagal memuat.

   Diminta sendiri lewat $GLOBALS['__lebarPenuh'], jadi halaman
   lain tidak ikut berubah sama sekali. */
.page.page-lebar { max-width: none; }
