/* ============================================================
   BOOKING GATEWAY — VIRCANSASTUDIO · ADMIN
   Dense, scannable, low-decoration admin panel.
   Inherits tokens from app.css (loaded first).
   ============================================================ */

/* ============================================================
   FONT SISTEM DS v2.0 — restore stack prototype "POS Money-First".
   Kembali ke tiga family DS: Fivo Sans Modern (display/judul + angka
   TOTAL besar), Geist Mono (No.Dok, ID, harga), Geist (body). Override
   token DILAKUKAN DI SINI (admin.css hanya dimuat oleh admin app) → efek
   global untuk seluruh admin, storefront/tracking tetap Geist tunggal.
   Fivo self-hosted (assets/fonts); Geist Mono & Space Grotesk via Google
   Fonts di admin/index.html. ============================================ */
@font-face { font-family: "Fivo Sans Modern"; src: url("../fonts/FivoSansModern-400.otf") format("opentype"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "Fivo Sans Modern"; src: url("../fonts/FivoSansModern-500.otf") format("opentype"); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: "Fivo Sans Modern"; src: url("../fonts/FivoSansModern-700.otf") format("opentype"); font-weight: 700; font-style: normal; font-display: swap; }
@font-face { font-family: "Fivo Sans Modern"; src: url("../fonts/FivoSansModern-800.otf") format("opentype"); font-weight: 800; font-style: normal; font-display: swap; }
:root {
  /* display (judul + angka besar) = Fivo → Space Grotesk → system */
  --font-heading: "Fivo Sans Modern", "Space Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-display: "Fivo Sans Modern", "Space Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-head:    var(--font-heading);
  /* mono (No.Dok / ID / harga) = Geist Mono */
  --font-mono: "Geist Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
  /* body tetap Geist (app.css) */
}

body.admin { background: var(--app-bg); font-size: 14px; }

/* ---------- Login admin (12.33 · Quiet Access Portal) ----------
   Primitive form, CTA, alert, dan breakpoint tetap diwarisi dari AUTH-UNIFY
   di app.css. Blok ini hanya mengatur komposisi dan identitas login admin. */
.auth-wrap--admin {
  --ls-display: -.02em;
  position: relative;
  overflow: hidden;
  background: var(--bg-app);
}
.auth-wrap--admin[data-brand="luxa"] {
  --brand-gradient: var(--brand-luxa-grad);
  --brand-gradient-soft: var(--brand-luxa-grad-soft);
  --brand-accent: var(--brand-luxa-accent);
  --brand-accent-ink: var(--text-on-dark);
}
.auth-wrap--admin[data-brand="nussa"] {
  --brand-gradient: var(--brand-nussa-grad);
  --brand-gradient-soft: var(--brand-nussa-grad-soft);
  --brand-accent: var(--brand-nussa-accent);
  --brand-accent-ink: var(--text-on-dark);
}
.auth-shell--admin {
  position: relative;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--space-3);
  padding: var(--space-3);
  background: var(--surface-0);
  border-color: var(--border-default);
  box-shadow: var(--shadow-pop);
}
.auth-hero--admin {
  min-width: 0;
  min-height: calc(var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-8));
  padding: var(--space-10) var(--space-9);
  border-radius: var(--radius-lg);
  background: var(--brand-gradient-soft);
  color: var(--text-strong);
}
.auth-hero--admin::after {
  content: "";
  position: absolute;
  right: calc(var(--space-1) - var(--space-1) - var(--space-10));
  bottom: calc(var(--space-1) - var(--space-1) - var(--space-10));
  z-index: 0;
  width: calc(var(--space-14) + var(--space-14));
  aspect-ratio: 1;
  border-radius: var(--radius-pill);
  background: var(--brand-accent);
  filter: blur(var(--space-9));
  opacity: .42;
  pointer-events: none;
}
.auth-hero--admin > * {
  position: relative;
  z-index: 1;
}
.auth-hero-head,
.auth-brand-lockup {
  display: flex;
  align-items: center;
}
.auth-hero-head {
  min-height: var(--space-10);
}
.auth-brand-lockup {
  min-width: 0;
}
.auth-brand-logo {
  display: block;
  width: auto;
  height: var(--space-6);
  max-width: calc(var(--space-14) + var(--space-9));
  object-fit: contain;
  object-position: left center;
}
.auth-hero-kicker {
  font-family: var(--font-mono);
  font-size: var(--text-2xs);
  font-weight: var(--fw-medium);
  letter-spacing: var(--ls-label);
  text-transform: uppercase;
}
.auth-hero-kicker {
  margin: var(--space-0) var(--space-0) var(--space-5);
  color: var(--text-muted);
}
.auth-hero-title {
  margin: var(--space-0);
  color: var(--text-strong);
  font-family: var(--font-display);
  font-size: var(--text-display);
  font-weight: var(--fw-bold);
  letter-spacing: var(--ls-display);
  line-height: var(--lh-tight);
  text-wrap: balance;
}
.auth-hero-accent { color: var(--text-strong); }
.auth-hero-sub {
  max-width: 34ch;
  margin: var(--space-5) var(--space-0) var(--space-0);
  color: var(--text-muted);
  font-size: var(--text-sm);
  line-height: var(--lh-relaxed);
}

/* — Panel dan aksesori form admin — */
.auth-panel--admin.auth-form {
  margin-top: var(--space-0);
  padding: var(--space-11) var(--space-10);
  border-radius: var(--radius-lg);
}
.auth-panel-head { margin-bottom: var(--space-2); }
.auth-panel--admin .auth-title {
  margin-top: var(--space-0);
  font-size: var(--text-h2);
  line-height: var(--lh-snug);
}
.auth-panel--admin .auth-sub {
  max-width: 42ch;
  margin-top: var(--space-3);
}

/* Input dengan ikon kiri + toggle kanan; struktur tetap primitive AUTH-UNIFY. */
.ctl-wrap { position: relative; }
.ctl-wrap .ctl-ic {
  position: absolute;
  left: var(--space-4);
  top: 50%;
  display: inline-flex;
  color: var(--text-subtle);
  pointer-events: none;
  transform: translateY(-50%);
}
.control--ic,
.auth-field .control--ic { padding-left: calc(var(--space-8) + var(--space-3)); }
.control--pass,
.auth-field .control--pass { padding-right: calc(var(--space-9) + var(--space-4)); }
.auth-field .control:focus {
  border-color: var(--border-strong);
  box-shadow: var(--shadow-focus-brand);
}
.pass-toggle {
  position: absolute;
  right: var(--space-2);
  top: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: calc(var(--space-9) + var(--space-2));
  height: calc(var(--space-9) + var(--space-2));
  padding: var(--space-0);
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--text-subtle);
  cursor: pointer;
  transform: translateY(-50%);
}
.pass-toggle:hover {
  background: var(--surface-50);
  color: var(--text-strong);
}
.pass-toggle:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
}
.caps-hint {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  color: var(--tag-warning-text);
  font-family: var(--font-mono);
  font-size: var(--text-2xs);
  font-weight: var(--fw-semibold);
  letter-spacing: var(--ls-label-sm);
  text-transform: uppercase;
}
.caps-hint svg { color: var(--tag-warning-text); }
.auth-trust {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: var(--space-3);
  margin-top: var(--space-6);
  padding: var(--space-4);
  border: 1px solid var(--tag-neutral-border);
  border-radius: var(--radius-sm);
  background: var(--tag-neutral-bg);
  color: var(--tag-neutral-text);
  font-size: var(--text-2xs);
  line-height: var(--lh-normal);
}
.auth-trust svg { color: var(--tag-success-text); }
.auth-foot {
  margin-top: var(--space-5);
  color: var(--text-subtle);
  font-size: var(--text-2xs);
  line-height: var(--lh-normal);
  text-align: center;
}
.demo-hint {
  margin-top: var(--space-5);
  padding: var(--space-4);
  border: 1px dashed var(--tag-warning-border);
  border-radius: var(--radius-sm);
  background: var(--tag-warning-bg);
  color: var(--tag-warning-text);
  font-family: var(--font-mono);
  font-size: var(--text-2xs);
  line-height: var(--lh-relaxed);
}
@media (max-width: 900px) {
  .auth-shell--admin {
    grid-template-columns: 1fr;
    grid-template-rows: auto 1fr;
    gap: var(--space-0);
  }
  .auth-hero--admin {
    min-height: var(--space-13);
    padding: var(--space-6) var(--space-7);
  }
  .auth-hero--admin .auth-hero-more { display: none; }
  .auth-hero-head { width: 100%; }
  .auth-panel--admin.auth-form { padding: var(--space-8) var(--space-7); }
}
@media (max-width: 560px) {
  .auth-wrap--admin { background: var(--brand-gradient-soft); }
  .auth-shell--admin {
    grid-template-rows: calc(var(--space-14) + var(--space-12)) minmax(0, 1fr);
    gap: var(--space-0);
    padding: var(--space-0);
    background: var(--brand-gradient-soft);
  }
  .auth-hero--admin {
    min-height: calc(var(--space-14) + var(--space-12));
    padding: calc(var(--space-8) + env(safe-area-inset-top)) var(--space-6) var(--space-10);
    border-radius: var(--space-0);
    flex-direction: column;
    align-items: stretch;
  }
  .auth-hero--admin .auth-hero-body.auth-hero-more {
    display: block;
    margin-top: auto;
  }
  .auth-hero-kicker,
  .auth-hero-sub { display: none; }
  .auth-hero-title {
    max-width: 16ch;
    font-size: var(--text-h2);
    line-height: var(--lh-snug);
  }
  .auth-panel--admin.auth-form {
    position: relative;
    top: calc(var(--space-1) - var(--space-1) - var(--space-7));
    z-index: 2;
    min-height: calc(100dvh - var(--space-14) - var(--space-12) + var(--space-7));
    margin-top: var(--space-0);
    margin-bottom: calc(var(--space-1) - var(--space-1) - var(--space-7));
    padding: var(--space-9) var(--space-6) calc(var(--space-7) + env(safe-area-inset-bottom));
    border-radius: var(--radius-xl) var(--radius-xl) var(--space-0) var(--space-0);
    justify-content: flex-start;
  }
  .auth-panel--admin::before {
    content: "";
    position: absolute;
    top: var(--space-3);
    left: 50%;
    width: var(--space-8);
    height: var(--space-1);
    border-radius: var(--radius-pill);
    background: var(--border-default);
    transform: translateX(-50%);
  }
  .auth-foot {
    margin-top: auto;
    padding-top: var(--space-7);
  }
}

/* ---------- App layout · DS v2 App Shell ---------- */
.skip-link {
  position:fixed; left:16px; top:12px; z-index:1000; padding:10px 14px;
  border-radius:var(--radius-sm); background:var(--ink); color:#fff; font-weight:650;
  transform:translateY(-160%); transition:transform .14s ease;
}
.skip-link:focus { transform:translateY(0); }
.admin-shell { display:grid; grid-template-columns:248px minmax(0,1fr); min-height:100dvh; background:var(--app-bg); }
.sidebar {
  background:var(--surface-0); color:var(--text-body); padding:18px 12px 14px; display:flex; flex-direction:column;
  position:sticky; top:0; height:100dvh; border-right:1px solid var(--line-200); overflow:hidden;
}
.sidebar .logo { min-height:46px; display:flex; align-items:center; justify-content:flex-start; padding:4px 12px 15px; border-bottom:1px solid var(--line-100); }
.sidebar .logo .wordmark { color:var(--ink); font-family:var(--font-display); font-size:14px; font-weight:800; letter-spacing:-.02em; }
.sidebar .logo .logo-img { height:18px; width:auto; max-width:178px; object-fit:contain; display:block; }
.sidebar .logo .tag { font-family:var(--font-mono); font-size:9px; color:var(--text-subtle); letter-spacing:.14em; text-transform:uppercase; }
.nav { display:flex; flex-direction:column; gap:2px; flex:1; min-height:0; overflow-y:auto; padding:11px 0 8px; scrollbar-width:thin; scrollbar-color:var(--line-200) transparent; }
.nav-label { padding:7px 12px 8px; font-family:var(--font-mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--text-subtle); }
.nav-separator { height:1px; flex:0 0 auto; background:var(--line-100); margin:9px 12px; }
.nav a {
  position:relative; display:flex; align-items:center; gap:11px; min-height:40px; padding:8px 12px; border-radius:8px;
  color:var(--text-muted); font-size:13.5px; font-weight:520; transition:background .14s ease,color .14s ease;
}
.nav a svg { width:18px; height:18px; flex:0 0 auto; }
.nav a:hover { background:var(--surface-50); color:var(--text-strong); }
.nav a.active { background:var(--surface-50); color:var(--ink); font-weight:650; }
.nav a.active::before { content:""; position:absolute; left:0; top:9px; bottom:9px; width:3px; border-radius:0 3px 3px 0; background:var(--identity-yellow); box-shadow:0 0 0 1px var(--identity-yellow-shadow); }
.nav a:focus-visible { outline:none; box-shadow:var(--shadow-focus,0 0 0 3px rgba(5,5,5,.14)); }
.nav .nav-external { color:var(--text-subtle); }
.sidebar .userbox {
  border-top:1px solid var(--line-100); padding:14px 4px 0; margin-top:0;
  display:flex; align-items:center; gap:10px;
}
.sidebar .userbox .av { width:34px; height:34px; border-radius:10px; background:var(--ink); color:#fff; display:grid; place-items:center; font-weight:700; font-size:12px; flex:none; }
.sidebar .userbox .who { min-width:0; }
.sidebar .userbox .who .nm { font-size:12.5px; color:var(--text-strong); font-weight:650; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sidebar .userbox .who .rl { font-size:10.5px; color:var(--text-subtle); }
.sidebar .userbox .out { margin-left:auto; color:var(--text-subtle); background:transparent; border:0; padding:7px; border-radius:8px; cursor:pointer; }
.sidebar .userbox .out:hover { color:var(--text-strong); background:var(--surface-50); }
.sidebar .userbox .out:focus-visible { outline:none; box-shadow:var(--shadow-focus,0 0 0 3px rgba(5,5,5,.14)); }

/* ── Sidebar auto-rail (desktop): ciutkan jadi rail ikon, auto-perluas saat hover ── */
.sb-rail-toggle {
  margin-left:auto; flex:0 0 auto; display:grid; place-items:center; width:30px; height:30px;
  color:var(--text-subtle); background:transparent; border:1px solid transparent; border-radius:8px; cursor:pointer;
  transition:background .14s ease,color .14s ease;
}
.sb-rail-toggle:hover { color:var(--text-strong); background:var(--surface-50); }
.sb-rail-toggle:focus-visible { outline:none; box-shadow:var(--shadow-focus,0 0 0 3px rgba(5,5,5,.14)); }
@media (min-width:861px) {
  .admin-shell.is-rail { grid-template-columns:68px minmax(0,1fr); }
  .admin-shell.is-rail .sidebar {
    width:68px; z-index:40; transition:width .2s cubic-bezier(.2,.7,.3,1), box-shadow .2s ease;
  }
  .admin-shell.is-rail .sidebar:hover,
  .admin-shell.is-rail .sidebar:focus-within { width:248px; box-shadow:var(--shadow-pop); }
  /* Sembunyikan teks/label saat rail tertutup → ikon di tengah */
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .nav a span,
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .nav-external span,
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .nav-label,
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .userbox .who,
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .logo .wordmark,
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .logo .logo-img { display:none; }
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .nav a { justify-content:center; padding-inline:0; }
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .userbox { justify-content:center; padding-inline:0; }
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .userbox .out { display:none; }
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .logo { justify-content:center; padding-inline:0; }
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .sb-rail-toggle { margin-inline:0; }
}

.main { min-width:0; display:flex; flex-direction:column; }
.admin-top {
  min-height:64px; display:flex; align-items:center; justify-content:space-between; gap:14px;
  padding:0 28px; background:rgba(255,255,255,.96); backdrop-filter:saturate(160%) blur(12px);
  border-bottom:1px solid var(--line-200); position:sticky; top:0; z-index:20;
}
.admin-top__title { display:flex; align-items:baseline; gap:10px; min-width:0; }
.admin-top__eyebrow { font-family:var(--font-mono); font-size:9.5px; letter-spacing:.14em; color:var(--text-subtle); }
.admin-top h1 { font-family:var(--font-display); font-size:17px; font-weight:700; letter-spacing:-.01em; }
.admin-top .crumb { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); letter-spacing:.04em; }
/* Hanya tombol netral yang di-flatten ke surface topbar. Varian solid (dark/danger)
   dikecualikan: selector ini lebih spesifik dari .abtn--dark dan dulu menimpa
   background-nya saja — teks tetap putih → tombol putih di atas putih. */
.admin-top__tools .abtn:not(.abtn--dark):not(.abtn--danger) { background:var(--surface-0); border-color:var(--border-input); }
/* Isi penuh kolom .main (hilangkan ruang kosong kanan); cap besar hanya untuk layar ultra-wide.
   Header (.admin-top) juga selebar .main, jadi tepi kanan konten & tombol header sejajar. */
/* --content-pad diekspos supaya elemen full-bleed (mis. .bk-datebar sticky) bisa
   menghitung margin negatifnya tanpa menebak angka padding. */
.content { --content-pad:28px; padding:28px var(--content-pad) 64px; max-width:1440px; width:100%; margin:0 auto; }

/* mobile bottom nav */
.mnav { display: none; }
@media (max-width: 860px) {
  .admin-shell { grid-template-columns: 1fr; }
  .sidebar { display: none; }
  .content { --content-pad:16px; padding: 18px var(--content-pad) 108px; }
  /* Header boleh membungkus: judul + tombol aksi tak lagi meluber keluar layar.
     Crumb (subjudul) disembunyikan di mobile untuk menghemat ruang. */
  .admin-top {
    padding: 9px 16px; height: auto; min-height: 54px;
    flex-wrap: wrap; row-gap: 8px; align-items: center;
  }
  .admin-top > div:first-child { min-width: 0; }
  .admin-top h1 { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .admin-top .between { flex-wrap: wrap; justify-content: flex-end; gap: 8px; min-width: 0; }
  .admin-top .crumb { display: none; }
  .mnav {
    --mnav-pad-x: 10px;
    display: flex; gap: 6px; position: fixed; bottom: 0; left: 0; right: 0; z-index: 40;
    overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch; scrollbar-width: none;
    background: rgba(255,255,255,.96); backdrop-filter: saturate(160%) blur(14px); border-top: 1px solid var(--line);
    padding: 8px var(--mnav-pad-x) calc(8px + env(safe-area-inset-bottom));
    box-shadow: 0 -8px 22px rgba(10,10,10,.06);
  }
  .mnav::-webkit-scrollbar { display: none; }
  .mnav::before,
  .mnav::after { content:''; flex: 0 0 max(0px, calc(env(safe-area-inset-left) - var(--mnav-pad-x))); }
  .mnav::after { flex-basis: max(0px, calc(env(safe-area-inset-right) - var(--mnav-pad-x))); }
  .mnav a {
    flex: 0 0 66px; min-width: 66px; min-height: 56px; scroll-snap-align: center;
    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:4px;
    padding:7px 4px 6px; border-radius: 8px; color: var(--muted);
    font-size:10.5px; line-height:1.12; font-weight:650; text-align:center;
    transition: background .14s, color .14s, transform .14s;
  }
  .mnav a svg { width: 21px; height: 21px; flex:none; }
  .mnav a span { display:block; max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .mnav a:active { transform: translateY(1px); }
  .mnav a.active { color: var(--ink); background: var(--paper-warm2); box-shadow: inset 0 0 0 1px var(--line-soft); }
}
@media (max-width: 360px) {
  .mnav a { flex-basis: 60px; min-width: 60px; font-size: 10px; }
}

/* ---------- Stat cards ---------- */
.stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 22px; }
@media (max-width: 860px) { .stat-grid { grid-template-columns: 1fr 1fr; } }
/* Kartu boleh menyusut; nominal tak boleh dipecah di tengah angka. Layar sempit pakai
   kolom lebih sedikit (lihat .kpi6 di bawah) agar nominal Rp besar tetap muat 1 baris. */
.stat-grid > * { min-width: 0; }
.stat .num { white-space: nowrap; }
@media (max-width: 560px) { .stat .num { font-size: 22px; } }
.stat {
  background: var(--paper); border: 1px solid var(--line); border-radius: var(--r-md); padding: 16px;
  box-shadow: var(--shadow-card);
}
.stat .lbl { font-size: 11px; color: var(--muted); font-weight: 600; display:flex; align-items:center; gap:6px; }
.stat .lbl svg { width: 14px; height: 14px; }
.stat .num { font-family: var(--font-mono); font-size: 28px; font-weight: 600; letter-spacing: 0; margin-top: 8px; line-height: 1; }
.stat .sub { font-size: 11px; color: var(--graphite); margin-top: 6px; }
.stat.accent { background: var(--ink); color: var(--text-on-dark); border-color: var(--ink); }
.stat.accent .lbl, .stat.accent .sub { color: var(--text-on-dark-muted); }

/* ---------- Section / card ---------- */
.panel { background: var(--paper); border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden; margin-bottom: 20px; }
.panel-head { display:flex; align-items:center; justify-content:space-between; gap:12px; padding: 14px 16px; border-bottom: 1px solid var(--line-soft); }
.panel-head h2 { font-size: 14.5px; font-weight: 700; }
.panel-head .meta { font-size: 12px; color: var(--muted); }
.panel-body { padding: 16px; }
.panel-body.flush { padding: 0; }

.section-title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--graphite); margin: 6px 0 12px; }

/* ---------- Table ---------- */
.tbl { width: 100%; border-collapse: collapse; }
.tbl th {
  text-align: left; font-size: 10.5px; text-transform: uppercase; letter-spacing: .08em; color: var(--muted);
  font-weight: 650; padding: 11px 14px; border-bottom: 1px solid var(--line); background: var(--paper-warm); white-space: nowrap;
}
.tbl td { padding: 13px 14px; border-bottom: 1px solid var(--line-soft); font-size: 13px; vertical-align: middle; }
.tbl tr:last-child td { border-bottom: 0; }
.tbl tr.clickable { cursor: pointer; transition: background .12s; }
.tbl tr.clickable:hover td { background: var(--paper-warm); }
.tbl .sid { font-family: var(--font-mono); font-size: 11.5px; color: var(--graphite); }
.tbl .nm { font-weight: 620; }
.tbl .sub { font-size: 11.5px; color: var(--muted); }
.tbl .select-col, .select-col { width: 38px; text-align: center; }
.tbl input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--ink); }
.sort-th {
  display:inline-flex; align-items:center; gap:5px; border:0; background:transparent; color:inherit;
  font:inherit; text-transform:inherit; letter-spacing:inherit; cursor:pointer; padding:0;
}
.sort-th:hover { color: var(--ink); }
.sort-arrow { font-size: 9px; color: var(--ink); }
.db-size { display:inline-flex; align-items:center; gap:7px; font-size:12px; color:var(--muted); }
.db-size select {
  padding: 8px 28px 8px 10px; border:1px solid var(--line); border-radius: var(--r-sm);
  background:var(--paper); font-size:13px;
}
.db-pager {
  display:flex; align-items:center; justify-content:flex-end; gap:8px; padding: 10px 14px;
  color:var(--muted); font-size:12px;
}
.db-page, .db-range { font-family: var(--font-mono); }
.db-bulk {
  display:none; align-items:center; gap:8px; flex-wrap:wrap; margin: 0 0 14px;
  padding:10px; border:1px solid var(--line); border-radius: var(--r-sm); background: var(--paper);
}
.db-bulk.show { display:flex; }
.db-selected-count { font-family: var(--font-mono); font-size:12px; color:var(--graphite); margin-right:auto; }
.db-bulk select { padding:7px 28px 7px 10px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); }
.cat-tag {
  display:inline-flex; align-items:center; max-width:100%; padding:3px 8px; border-radius:999px;
  background:var(--vf-bg); color:var(--vf-ink); font-size:11px; font-weight:700; line-height:1.2;
}
.card-check {
  position:absolute; z-index:5; margin:8px; display:inline-flex; align-items:center; gap:5px;
  font-size:11px; color:var(--ink); background:rgba(255,255,255,.92); border:1px solid var(--line);
  border-radius:6px; padding:4px 7px; box-shadow: var(--shadow-1);
}
.card-check input { accent-color: var(--ink); }

/* responsive table -> cards */
@media (max-width: 720px) {
  .tbl, .tbl tbody, .tbl tr, .tbl td { display: block; width: 100%; }
  .tbl thead { display: none; }
  .tbl tr { border: 1px solid var(--line); border-radius: var(--r-sm); margin-bottom: 10px; padding: 6px; }
  /* AUDIT Finance 2026-08-11 (D-17) + aturan owner "baris komposit = grid":
     flex tanpa wrap membuat teks + subline berjejer horizontal dan mendorong isi sel
     rata kanan tanpa keterangan. Dua track: label (auto) | nilai (minmax(0,1fr)).
     Anak elemen berikutnya (mis. .sub) TURUN ke baris berikutnya di kolom nilai. */
  .tbl td { border: 0; padding: 6px 10px; display: grid;
            grid-template-columns: auto minmax(0, 1fr); align-items: baseline;
            column-gap: 12px; text-align: right; }
  .tbl td::before { content: attr(data-l); grid-column: 1; text-align: left;
    font-size: 10.5px; text-transform: uppercase; letter-spacing:.06em; color: var(--muted); font-weight: 650; }
  .tbl td > * { grid-column: 2; }
  .tbl td.no-l { grid-template-columns: minmax(0, 1fr); text-align: left; }
  .tbl td.no-l::before { content: none; }
  .tbl td.no-l > * { grid-column: 1; }
}

/* ---------- Status badge ----------
   Anatomi = Fresh Tag System (unit GUI/07/TAGS-TONES, reproduksi app `.vs-tag`):
   pill hairline, min-height 26px, 11px/650 body, dot 6px. Tone memakai alias
   kanonik --tag-* (bukan ramp mentah --pst-*). */
.badge-st {
  display: inline-flex; align-items: center; gap: 5px; min-height: 26px;
  font: 650 11px/1.2 var(--font-body);
  padding: 3px 10px; border-radius: var(--radius-pill,100px); border: 1px solid transparent; white-space: nowrap;
}
.badge-st::before { content:''; width: 6px; height: 6px; flex:0 0 auto; border-radius: var(--radius-pill,100px); background: currentColor; }
/* Peta warna status (2026-07-22) — lihat catatan di app.css § status chip aliases.
   Merah disimpan HANYA untuk cancelled; window bayar habis pakai abu (mati, bukan alarm). */
.st-new        { color: var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.st-reviewing  { color: var(--tag-purple-text);  background:var(--tag-purple-bg);  border-color:var(--tag-purple-border); }
.st-contacted  { color: var(--tag-info-text);    background:var(--tag-info-bg);    border-color:var(--tag-info-border); }
.st-tentative,
.st-pending_payment { color: var(--tag-warning-text); background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.st-partially_paid,
.st-rescheduled { color: var(--tag-orange-text); background:var(--tag-orange-bg); border-color:var(--tag-orange-border); }
.st-paid       { color: var(--tag-mint-text);    background:var(--tag-mint-bg);    border-color:var(--tag-mint-border); }
.st-confirmed  { color: var(--tag-blue-text);    background:var(--tag-blue-bg);    border-color:var(--tag-blue-border); }
.st-cancelled  { color: var(--tag-danger-text);  background:var(--tag-danger-bg);  border-color:var(--tag-danger-border); }
.st-payment_expired,
.st-completed  { color: var(--tag-neutral-text); background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); }

/* ---------- Filters ---------- */
.filters { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; align-items: center; }
.search-box { position: relative; flex: 1; min-width: 200px; }
.search-box svg { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; color: var(--muted); }
.search-box input { width: 100%; padding: 9px 12px 9px 36px; border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--paper); font-size: 14px; outline: none; }
.search-box input:focus { border-color: var(--ink); }
.filters select { padding: 9px 32px 9px 12px; border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--paper); font-size: 13.5px;
  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='%238C8C86' stroke-width='2.5' 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 11px center; }

.status-strip { display:flex; gap:8px; overflow-x:auto; padding-bottom:10px; margin:-6px 0 14px; }
.status-chip { display:flex; align-items:center; gap:8px; padding:6px 8px; border:1px solid var(--line); border-radius:100px; background:var(--paper); cursor:pointer; white-space:nowrap; }
.status-chip b { font-family:var(--font-mono); font-size:11px; color:var(--muted); }
.status-chip.active { border-color:var(--ink); box-shadow:var(--shadow-1); }
.booking-card-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:12px; padding:14px; }
.booking-card { border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper); padding:13px; cursor:pointer; transition:border-color .14s, box-shadow .14s, transform .12s; }
.booking-card:hover { border-color:var(--ink); box-shadow:var(--shadow-1); transform:translateY(-1px); }
.booking-card-head { display:flex; justify-content:space-between; gap:10px; align-items:flex-start; }
.booking-card .sid { font-family:var(--font-mono); font-size:10.5px; color:var(--muted); }
.booking-card .nm { font-size:14px; font-weight:700; margin-top:3px; }
.booking-card-body { display:grid; gap:7px; margin-top:12px; color:var(--graphite); font-size:12px; }
.booking-card-body div { display:flex; align-items:center; gap:7px; }
.booking-board { display:flex; gap:14px; overflow-x:auto; padding:14px; }
.booking-col { flex:none; width:260px; background:var(--paper-warm); border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden; }
.booking-detail-split { display:grid; grid-template-columns:340px 1fr; gap:16px; padding:14px; }
.booking-actions { display:flex; gap:8px; margin-top:16px; flex-wrap:wrap; }
@media (max-width:760px){ .booking-detail-split { grid-template-columns:1fr; } }

/* admin buttons (compact) */
.abtn {
  display:inline-flex; align-items:center; gap:7px; padding: 9px 14px; font-size: 13px; font-weight: 620;
  border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--paper); color: var(--ink); cursor:pointer;
  transition: background .14s, border-color .14s; white-space: nowrap;
}
.abtn svg { width: 16px; height: 16px; }
.abtn:hover { background: var(--paper-warm); }
.abtn--dark { background: var(--ink); color:#fff; border-color: var(--ink); }
.abtn--dark:hover { opacity:.92; background: var(--ink); }
.abtn--sm { padding: 6px 10px; font-size: 12px; }
.abtn:disabled { opacity:.5; cursor: not-allowed; }
/* AUDIT Finance 2026-08-11 (D-15) — modifier yang dipakai 76×/1× di admin.js tetapi
   TIDAK PERNAH punya aturan, sehingga "xs" justru render lebih besar daripada "sm".
   Didefinisikan di blok primitive (bukan ditambal per-modul). Tangga tinggi terukur:
   xs < sm < base. `.abtn--sm` sengaja TIDAK diubah — menaikkannya menyentuh 182
   pemakaian di luar scope brief; target sentuh 44px ditegakkan per-container di FIN-V2. */
.abtn--xs { padding: 3px 8px; font-size: 11.5px; gap: 5px; }
.abtn--xs svg { width: 13px; height: 13px; }
.abtn--light { background: var(--paper); color: var(--ink); border-color: var(--line); }
.abtn--light:hover { background: var(--paper-warm); }
/* `.icon-btn` hanya punya aturan kontekstual (modal-head, schedule-layer, sg-table);
   tanpa aturan dasar, tombol tutup 5 modal Finance render sebagai tombol default browser. */
.icon-btn {
  display:inline-flex; align-items:center; justify-content:center; width:34px; height:34px;
  padding:0; border:1px solid var(--line); border-radius: var(--r-sm); background: var(--paper);
  color: var(--ink); cursor:pointer; transition: background .14s, border-color .14s;
}
.icon-btn:hover { background: var(--paper-warm); }
.icon-btn svg { width:16px; height:16px; }

/* ---------- Detail drawer ---------- */
.drawer-back { position: fixed; inset: 0; background: rgba(10,10,10,.4); z-index: 60; animation: fade .2s var(--ease); }
.drawer {
  position: fixed; top: 0; right: 0; height: 100dvh; width: min(460px, 100%); background: var(--paper);
  z-index: 61; box-shadow: var(--shadow-pop); display: flex; flex-direction: column; animation: slidein .26s var(--ease);
}
@keyframes slidein { from { transform: translateX(100%); } to { transform: none; } }
.drawer-head { padding: 18px 20px; border-bottom: 1px solid var(--line); display:flex; align-items:flex-start; justify-content:space-between; gap:12px; }
.drawer-head .sid { font-family: var(--font-mono); font-size: 11px; color: var(--muted); }
.drawer-head .ttl { font-size: 18px; font-weight: 760; margin-top: 4px; }
.drawer-head .x { background:transparent; border:0; color: var(--muted); padding:6px; border-radius:6px; cursor:pointer; }
.drawer-head .x:hover { background: var(--paper-warm); color: var(--ink); }
.drawer-body { overflow-y: auto; padding: 18px 20px; flex: 1; }
.drawer-foot { padding: 14px 20px calc(14px + env(safe-area-inset-bottom)); border-top: 1px solid var(--line); display:flex; gap:10px; }

.kv { display:flex; gap:12px; padding: 9px 0; border-bottom: 1px solid var(--line-soft); }
.kv:last-child { border-bottom: 0; }
.kv .k { flex:none; width: 40%; font-size: 12px; color: var(--muted); }
.kv .v { flex:1; font-size: 13px; font-weight: 520; word-break: break-word; }
.dgroup-label { font-family: var(--font-mono); font-size: 10px; letter-spacing:.12em; text-transform:uppercase; color: var(--muted); margin: 18px 0 6px; }
.pill-list { display:flex; flex-wrap:wrap; gap:6px; }
.pill-list .pill { font-size:12px; padding:4px 10px; border:1px solid var(--line); border-radius:100px; background: var(--paper-warm); }
.wa-preview { font-family: var(--font-mono); font-size: 11.5px; line-height:1.6; white-space: pre-wrap; word-break: break-word;
  background: var(--paper-warm); border:1px solid var(--line); border-radius: var(--r-sm); padding: 12px; color: var(--ink-soft); max-height: 220px; overflow:auto; }
.note-area { width:100%; min-height: 70px; border:1px solid var(--line); border-radius: var(--r-sm); padding:10px 12px; font-size:13px; resize:vertical; outline:none; font-family: var(--font-sans); }
.note-area:focus { border-color: var(--ink); }
.status-select { width:100%; padding:10px 12px; border:1px solid var(--line); border-radius: var(--r-sm); font-size:14px; font-weight:600;
  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='%238C8C86' stroke-width='2.5' 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; }

/* ---------- Pages management ---------- */
.page-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
@media (max-width: 720px) { .page-cards { grid-template-columns: 1fr; } }
.page-card { position: relative; border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden; background: var(--paper); }
.page-card .pc-cover { height: 86px; background: var(--paper-warm2); position: relative; display:grid; place-items:center; overflow:hidden; }
.page-card .pc-cover .ph { font-family: var(--font-mono); font-size: 10px; letter-spacing:.14em; color: var(--muted); text-transform:uppercase; }
.page-card .pc-cover.visual-fallback { background:var(--vf-bg); }
.page-card .pc-cover .vf-label { max-width:76%; color:var(--vf-ink); }
.page-card .pc-cover .swatch { position:absolute; top:10px; left:10px; width:18px; height:18px; border-radius:5px; border:2px solid #fff; box-shadow: var(--shadow-1); z-index:2; }
.page-card .pc-order { position:absolute; top:8px; right:8px; z-index:3; display:flex; align-items:center; gap:4px; }
.page-card .pc-order .pc-pos { font-family: var(--font-mono); font-size:10.5px; font-weight:700; color:#fff; background:rgba(0,0,0,.45); border-radius:5px; padding:2px 6px; backdrop-filter:saturate(140%) blur(2px); }
.page-card .pc-order .pc-move { width:24px; height:24px; display:grid; place-items:center; border:none; border-radius:6px; background:rgba(255,255,255,.92); color:var(--ink); cursor:pointer; box-shadow: var(--shadow-1); }
.page-card .pc-order .pc-move:hover:not(:disabled) { background:#fff; }
.page-card .pc-order .pc-move:disabled { opacity:.35; cursor:default; }
.page-card .pc-body { padding: 13px 14px; }
.page-card .pc-body .nm { font-size: 14.5px; font-weight: 700; }
.page-card .pc-body .slug { font-family: var(--font-mono); font-size: 11px; color: var(--muted); margin-top: 3px; }
.page-card .pc-body .ds { font-size: 12px; color: var(--graphite); margin-top: 8px; line-height: 1.45; }
.public-link { margin-top: 10px; display:flex; align-items:center; gap:8px; min-width:0; }
.public-link .mono { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--graphite); font-size:10.5px; }
.link-copy { flex:none; border:1px solid var(--line); background:var(--paper); color:var(--graphite); border-radius:6px; width:26px; height:26px; display:grid; place-items:center; cursor:pointer; }
.link-copy:hover { color:var(--ink); border-color:var(--ink); }
.page-card .pc-foot { display:flex; align-items:center; justify-content:space-between; padding: 11px 14px; border-top: 1px solid var(--line-soft); }
.page-card .pc-foot .cnt { font-size: 11.5px; color: var(--muted); }
.dot-on { display:inline-flex; align-items:center; gap:6px; font-size:11.5px; font-weight:600; color: var(--ok); }
.dot-on::before { content:''; width:7px; height:7px; border-radius:50%; background: var(--ok); }
.dot-off { display:inline-flex; align-items:center; gap:6px; font-size:11.5px; font-weight:600; color: var(--muted); }
.dot-off::before { content:''; width:7px; height:7px; border-radius:50%; background: var(--muted); }

/* mini bar chart for "by page" */
.bars { display:flex; flex-direction:column; gap:10px; }
.bar-row { display:flex; align-items:center; gap:12px; }
.bar-row .bl { flex:none; width: 150px; font-size: 12.5px; font-weight: 550; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.bar-row .bt { flex:1; height: 8px; background: var(--paper-warm2); border-radius: 100px; overflow:hidden; }
.bar-row .bt i { display:block; height:100%; background: var(--ink); border-radius: 100px; }
.bar-row .bn { flex:none; width: 30px; text-align:right; font-family: var(--font-mono); font-size: 12px; font-weight: 600; }

.empty-row td { text-align:center; color: var(--muted); padding: 40px 14px; font-size: 13px; }

/* ---------- CRM / Customer Management ---------- */
.crm-subnav {
  display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 14px;
}
.crm-subnav a {
  display: inline-flex; align-items: center; gap: 7px; min-height: 36px;
  padding: 8px 11px; border: 1px solid var(--line); border-radius: var(--r-sm);
  background: var(--paper); color: var(--graphite); font-size: 13px; font-weight: 650;
}
.crm-subnav a svg { width: 15px; height: 15px; }
.crm-subnav a:hover { border-color: var(--ink-soft); color: var(--ink); }
.crm-subnav a.active { background: var(--ink); border-color: var(--ink); color: #fff; }
.crm-subnav b {
  display: inline-grid; place-items: center; min-width: 22px; height: 20px; padding: 0 6px;
  border-radius: 999px; background: var(--paper-warm2); color: var(--graphite);
  font-family: var(--font-mono); font-size: 11px; line-height: 1; font-weight: 700;
}
.crm-subnav a.active b { background: rgba(255,255,255,.18); color: #fff; }
.stat-grid.crm-kpi { grid-template-columns: repeat(6, 1fr); }
@media (max-width: 1100px){ .stat-grid.crm-kpi { grid-template-columns: repeat(3,1fr); } }
@media (max-width: 640px){ .stat-grid.crm-kpi { grid-template-columns: repeat(2,1fr); } }
/* KPI CRM = tombol filter: paritas hover a.stat + status aktif terlihat jelas. */
.stat--btn { cursor:pointer; text-decoration:none; color:inherit; display:block;
  transition: border-color .14s, box-shadow .14s, transform .12s; }
.stat--btn:hover { border-color: var(--ink); box-shadow: var(--shadow-1); transform: translateY(-1px); }
.stat--btn.is-active { border-color: var(--ink); box-shadow: 0 0 0 2px var(--ink) inset; }
.stat--btn.accent.is-active { box-shadow: 0 0 0 2px rgba(255,255,255,.55) inset; }
/* Filter chip-select di bar .filters: field kompak sejajar kontrol lain. */
.filters .chipsel { min-width: 150px; }
.filters .chipsel.chip-field { min-height: 36px; padding: 3px 6px; }
.crm-type {
  display:inline-flex; align-items:center; gap:6px; padding:4px 9px; border-radius:100px;
  font-size:11.5px; font-weight:650; white-space:nowrap; border:1px solid transparent;
}
.crm-regular { color:var(--pst-blue-text); background:var(--pst-blue-bg); border:1px solid var(--pst-blue-border); }
.crm-brand { color:var(--pst-warning-text); background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border); }
.crm-vendor { color:var(--pst-success-text); background:var(--pst-success-bg); border:1px solid var(--pst-success-border); }
.crm-internal { color:var(--pst-neutral-text); background:var(--pst-neutral-bg); border:1px solid var(--pst-neutral-border); }
.crm-blocked { color:var(--pst-danger-text); background:var(--pst-danger-bg); border:1px solid var(--pst-danger-border); }
.crm-tags { display:flex; flex-wrap:wrap; gap:5px; }
.crm-tag {
  display:inline-flex; align-items:center; padding:3px 7px; border-radius:6px;
  font-family:var(--font-mono); font-size:10.5px; background:var(--paper-warm2); color:var(--graphite); border:1px solid var(--line-soft);
}
.crm-drawer { width:clamp(24rem,58vw,51.25rem); max-width:100%; }
.crm-drawer .drawer-body { background:var(--paper-warm2); }
.crm-profile-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media (max-width:760px){ .crm-profile-grid { grid-template-columns:1fr; } }
.crm-score { display:grid; grid-template-columns:repeat(3,1fr); gap:8px; }
.crm-score div { border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm); padding:9px 10px; min-width:0; }
.crm-score span { display:block; font-size:10.5px; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; }
.crm-score b { display:block; margin-top:3px; font-size:13px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
@media (max-width:520px){ .crm-score { grid-template-columns:1fr; } }
.crm-mini-row {
  display:grid; grid-template-columns: 1fr auto auto auto; gap:10px; align-items:center;
  padding:8px 0; border-bottom:1px dashed var(--line-soft); font-size:12.5px;
}
.crm-mini-row:last-child { border-bottom:0; }
.crm-mini-row a { font-size:12px; font-weight:650; color:var(--ink); }
@media (max-width:560px){ .crm-mini-row { grid-template-columns:1fr; gap:3px; } }
.crm-stack { display:flex; flex-direction:column; gap:8px; }
.crm-note, .crm-ledger, .crm-voucher, .crm-contact {
  border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); padding:10px 11px;
  display:flex; flex-direction:column; gap:3px; font-size:12.5px;
}
.crm-note b, .crm-ledger b, .crm-voucher b, .crm-contact b { font-size:12.5px; }
.crm-note small, .crm-ledger small { color:var(--muted); font-size:11px; }
.crm-ledger b.pos { color:var(--ok); }
.crm-ledger b.neg { color:var(--danger); }
.crm-voucher { display:grid; grid-template-columns:1fr auto; gap:3px 10px; }
.crm-voucher span { color:var(--graphite); }
.crm-voucher em, .crm-contact em { font-style:normal; font-family:var(--font-mono); font-size:10.5px; color:var(--muted); }
.crm-contact span { color:var(--graphite); }
.crm-foot { flex-wrap:wrap; }
.crm-foot .abtn { flex:none; }

/* inline note saved flash */
.saved-flash { font-size: 11.5px; color: var(--ok); font-weight:600; opacity:0; transition: opacity .2s; }
.saved-flash.show { opacity:1; }

/* ============================================================
   EDITOR (create / customize booking page) + SETTINGS
   ============================================================ */
.ed-head { display:flex; align-items:center; gap:12px; margin-bottom:16px; }
.ed-head .back { font-size:13px; }

/* sub-tabs inside editor — segmented pill bar (scrollable, tak membungkus) */
.ed-tabs { display:flex; gap:3px; flex-wrap:nowrap; overflow-x:auto; margin-bottom:22px; padding:4px;
  background:var(--paper-warm); border:1px solid var(--line); border-radius:12px; scrollbar-width:none; -webkit-overflow-scrolling:touch; }
.ed-tabs::-webkit-scrollbar { display:none; }
.ed-tab {
  flex:0 0 auto; padding:9px 14px; font-size:13px; font-weight:600; color:var(--graphite); background:transparent; border:0;
  border-radius:9px; cursor:pointer; transition:background .16s, color .16s, box-shadow .16s; white-space:nowrap;
  display:inline-flex; align-items:center; gap:7px;
}
.ed-tab svg { width:15px; height:15px; opacity:.85; }
.ed-tab:hover { color:var(--ink); background:rgba(255,255,255,.6); }
.ed-tab.active { color:var(--ink); background:var(--paper); box-shadow:0 1px 2px rgba(16,18,22,.10), inset 0 0 0 1px var(--line); }
.ed-tab.active svg { opacity:1; }

/* form layout */
.fgrid { display:grid; grid-template-columns:1fr 1fr; gap:16px; }
@media (max-width:720px){ .fgrid { grid-template-columns:1fr; } }
.fcol { display:flex; flex-direction:column; }
.frow { margin-bottom:16px; }
.frow > label, .flabel { display:block; font-size:12.5px; font-weight:620; margin-bottom:7px; color:var(--ink); }
.frow .fhint { font-size:11px; color:var(--muted); margin-top:6px; line-height:1.45; }
.ctrl {
  width:100%; padding:10px 12px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper);
  font-size:14px; color:var(--ink); outline:none; transition:border-color .14s, box-shadow .14s; font-family:var(--font-sans);
}
.ctrl:focus { border-color:var(--ink); box-shadow:0 0 0 3px rgba(10,10,10,.05); }
textarea.ctrl { resize:vertical; min-height:70px; line-height:1.5; }
.ctrl.mono { font-family:var(--font-mono); font-size:12.5px; }
select.ctrl { appearance:none; padding-right:34px;
  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='%238C8C86' stroke-width='2.5' 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 11px center; }
.input-prefix { display:flex; }
.input-prefix .pf { display:flex; align-items:center; padding:0 11px; background:var(--paper-warm2); border:1px solid var(--line); border-right:0; border-radius:var(--r-sm) 0 0 var(--r-sm); font-family:var(--font-mono); font-size:13px; color:var(--graphite); }
.input-prefix .ctrl { border-radius:0 var(--r-sm) var(--r-sm) 0; }

/* toggle switch */
.switch-row { display:flex; align-items:center; justify-content:space-between; gap:14px; padding:12px 0; }
.switch-row .sl { font-size:13.5px; font-weight:560; }
.switch-row .sl small { display:block; font-size:11.5px; color:var(--muted); font-weight:400; margin-top:2px; }
.switch { position:relative; width:42px; height:24px; flex:none; }
.switch input { position:absolute; opacity:0; width:100%; height:100%; margin:0; cursor:pointer; }
.switch .track { position:absolute; inset:0; background:var(--line); border-radius:100px; transition:background .16s; }
.switch .track::after { content:''; position:absolute; top:2px; left:2px; width:20px; height:20px; border-radius:50%; background:#fff; box-shadow:var(--shadow-1); transition:transform .16s; }
.switch input:checked + .track { background:var(--ink); }
.switch input:checked + .track::after { transform:translateX(18px); }

/* color picker row */
.color-row { display:flex; align-items:center; gap:10px; }
.color-row input[type=color] { width:42px; height:42px; padding:0; border:1px solid var(--line); border-radius:var(--r-sm); background:none; cursor:pointer; }
.color-row .ctrl { flex:1; }
.accent-swatches { display:flex; flex-wrap:wrap; gap:7px; margin-top:9px; }
.accent-swatch { width:24px; height:24px; border:1px solid rgba(10,10,10,.18); border-radius:7px; padding:0; cursor:pointer; box-shadow: inset 0 0 0 1px rgba(255,255,255,.35); }
.accent-swatch.active { outline:2px solid var(--ink); outline-offset:2px; }
.copy-row { display:flex; gap:8px; align-items:center; }
.copy-row .ctrl { min-width:0; }

.img-upload { display:grid; grid-template-columns:120px 1fr; gap:14px; align-items:stretch; }
.img-preview { min-height:104px; border:1px dashed var(--line); border-radius:var(--r-sm); background:var(--paper-warm2) center/cover no-repeat; display:grid; place-items:center; color:var(--muted); overflow:hidden; }
.img-preview.has { border-style:solid; }
.img-preview.visual-fallback { border-style:solid; background:var(--vf-bg); }
.img-preview.visual-fallback .vf-label { color:var(--vf-ink); font-size:10px; }
.img-upload-actions { display:flex; flex-wrap:wrap; gap:8px; align-content:flex-start; align-items:center; }
.img-upload-actions .fhint { width:100%; margin-top:2px; }
@media (max-width:560px){ .img-upload { grid-template-columns:1fr; } .img-preview { aspect-ratio:16/9; } }

/* repeatable rows (categories / items / fields) */
.repeat { display:flex; flex-direction:column; gap:10px; }
.rrow {
  border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper); overflow:hidden;
}
.rrow-head { display:flex; align-items:center; gap:10px; padding:12px 14px; }
.rrow-head.toggle-open { cursor:pointer; }
.rrow-head .grip { color:var(--muted); display:flex; flex-direction:column; gap:2px; }
.rrow-head .grip button { background:transparent; border:0; color:var(--muted); cursor:pointer; padding:0; line-height:0; }
.rrow-head .grip button:hover { color:var(--ink); }
.rrow-head .grip button:disabled { opacity:.28; cursor:not-allowed; }
.rrow-head .grip button:disabled:hover { color:var(--muted); }
.rrow-head .grip svg { width:14px; height:14px; }
.rrow-head .rtitle { font-size:13.5px; font-weight:650; flex:1; min-width:0; }
.rrow-head .rtitle small { font-family:var(--font-mono); font-size:11px; color:var(--muted); font-weight:400; display:block; margin-top:2px; }
.rrow-head .rmeta { font-size:11.5px; color:var(--muted); white-space:nowrap; }
.rrow-head .rdel { background:transparent; border:0; color:var(--muted); padding:6px; border-radius:6px; cursor:pointer; }
.rrow-head .rdel:hover { color:var(--danger); background:var(--danger-bg); }
.rrow-head .chev { color:var(--muted); transition:transform .18s; }
.rrow.open .rrow-head .chev { transform:rotate(180deg); }
.rrow-body { padding:0 14px; max-height:0; overflow:hidden; transition:max-height .25s var(--ease), padding .2s; border-top:0 solid var(--line-soft); }
.rrow.open .rrow-body { max-height:1400px; padding:14px; border-top:1px solid var(--line-soft); }

.add-row { display:inline-flex; align-items:center; gap:7px; padding:11px 14px; border:1px dashed var(--line); border-radius:var(--r-sm);
  background:var(--paper-warm); color:var(--graphite); font-size:13px; font-weight:600; cursor:pointer; width:100%; justify-content:center; transition:border-color .14s, color .14s; }
.add-row:hover { border-color:var(--ink); color:var(--ink); }
.add-row svg { width:16px; height:16px; }

/* options tag list */
.opt-list { display:flex; flex-wrap:wrap; gap:7px; margin-bottom:8px; }
.opt-tag { display:inline-flex; align-items:center; gap:6px; padding:5px 8px 5px 11px; border:1px solid var(--line); border-radius:100px; font-size:12.5px; background:var(--paper-warm); }
.opt-tag button { background:transparent; border:0; color:var(--muted); cursor:pointer; padding:0; display:flex; }
.opt-tag button:hover { color:var(--danger); }
.opt-tag svg { width:13px; height:13px; }

/* ===== WhatsApp template editor (advanced) ===== */
.wa-template-grid { display:grid; grid-template-columns:minmax(0,1.15fr) minmax(300px,.85fr); gap:20px; align-items:start; }
/* Editor shell: toolbar + textarea + footer sebagai satu kartu */
.wa-editor { border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper); overflow:hidden; box-shadow:var(--shadow-xs,0 1px 2px rgba(16,18,22,.04)); }
.wa-editor:focus-within { border-color:var(--ink); box-shadow:0 0 0 3px var(--identity-yellow-shadow,rgba(255,247,0,.28)); }
.wa-toolbar { display:flex; align-items:center; gap:8px; padding:8px 10px; border-bottom:1px solid var(--line-soft); background:var(--paper-warm); }
.wa-toolbar .grow { flex:1; }
.wa-tool-grp { display:flex; gap:3px; }
.wa-tool-sep { width:1px; align-self:stretch; margin:2px 2px; background:var(--line); }
.wa-tool { width:30px; height:30px; display:inline-flex; align-items:center; justify-content:center; border:1px solid transparent; border-radius:8px; background:transparent; color:var(--graphite); cursor:pointer; transition:background .14s,color .14s,border-color .14s; padding:0; }
.wa-tool:hover { background:#fff; color:var(--ink); border-color:var(--line); }
.wa-tool:active { transform:translateY(.5px); }
.wa-tool svg { width:15px; height:15px; }
.wa-tool--ghost { color:var(--muted); }
.wa-tool-g { font-size:13.5px; font-weight:800; line-height:1; }
.wa-tool-g.is-i { font-style:italic; font-family:var(--font-serif,Georgia,serif); }
.wa-tool-g.is-s { text-decoration:line-through; }
.wa-input { display:block; width:100%; border:0; outline:none; resize:vertical; padding:14px 14px; font-size:12.5px; line-height:1.7; min-height:300px; background:var(--paper); color:var(--ink); }
.wa-input::placeholder { color:var(--muted); }
.wa-editor-foot { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:8px 12px; border-top:1px solid var(--line-soft); background:var(--paper-warm); }
.wa-syntax { display:flex; flex-wrap:wrap; gap:10px; align-items:center; font-size:11px; color:var(--muted); }
.wa-syntax b, .wa-syntax i, .wa-syntax s { color:var(--graphite); font-family:var(--font-mono); font-size:10.5px; }
.wa-syntax code { font-family:var(--font-mono); font-size:10.5px; color:var(--graphite); }
.wa-count { font-family:var(--font-mono); font-size:10.5px; color:var(--muted); white-space:nowrap; }

/* placeholder chips for WA template */
.ph-panel { margin-top:16px; border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper); padding:14px 16px; }
.ph-panel-head { display:flex; align-items:center; gap:8px; font-size:12.5px; font-weight:700; color:var(--ink); }
.ph-panel-head svg { width:14px; height:14px; color:var(--graphite); }
.ph-panel-head small { margin-left:auto; font-weight:500; font-size:11px; color:var(--muted); }
.ph-section { margin:14px 0 0; }
.ph-sub { font-family:var(--font-mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); margin-bottom:8px; }
.ph-chips { display:flex; flex-wrap:wrap; gap:6px; }
.ph-chip { display:inline-flex; flex-direction:column; align-items:flex-start; gap:1px; text-align:left; padding:5px 11px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm); color:var(--graphite); cursor:pointer; transition:all .14s; }
.ph-chip:hover { border-color:var(--ink); color:var(--ink); background:#fff; transform:translateY(-1px); }
.ph-chip--field { background:#fff; }
.ph-chip .ph-lb { font-size:11.5px; font-weight:600; color:var(--ink); line-height:1.2; }
.ph-chip .ph-tk { font-family:var(--font-mono); font-size:10px; color:var(--muted); line-height:1.2; }
.ph-chip:hover .ph-tk { color:var(--graphite); }

/* WhatsApp phone preview */
.wa-preview-panel { position:sticky; top:80px; }
.wa-phone { border:1px solid var(--line); border-radius:var(--r-lg); overflow:hidden; background:#0b141a; box-shadow:0 8px 30px rgba(16,18,22,.10); }
.wa-phone-bar { display:flex; align-items:center; gap:8px; padding:11px 14px; background:#1f2c34; color:#e9edef; font-size:12px; font-weight:600; }
.wa-phone-bar svg { width:15px; height:15px; color:#25d366; }
.wa-phone-screen { padding:16px 14px 22px; min-height:300px; max-height:560px; overflow:auto;
  background-color:#0b141a;
  background-image:radial-gradient(rgba(255,255,255,.035) 1px, transparent 1px); background-size:18px 18px; }
.wa-bubble { position:relative; max-width:88%; margin-left:auto; background:#005c4b; color:#e9edef; font-family:var(--font-sans); font-size:13px; line-height:1.55;
  padding:9px 12px 8px; border-radius:12px 12px 4px 12px; white-space:pre-wrap; word-break:break-word; box-shadow:0 1px 1px rgba(0,0,0,.18); }
.wa-bubble b { font-weight:700; } .wa-bubble i { font-style:italic; } .wa-bubble s { text-decoration:line-through; }
.wa-bubble .wa-mono { font-family:var(--font-mono); font-size:12px; background:rgba(0,0,0,.22); padding:1px 4px; border-radius:4px; }
.wa-bubble .wa-quote { display:block; border-left:3px solid #25d366; padding-left:9px; margin:2px 0; color:#cfe9df; }
.wa-bubble .wa-li { display:block; padding-left:2px; }
.wa-bubble .wa-li .wa-mk { display:inline-block; min-width:1.2em; color:#9fe3c5; font-style:normal; }

@media (max-width:880px){ .wa-template-grid { grid-template-columns:1fr; } .wa-preview-panel { position:static; } }

/* category group label inside item list */
.item-group-label { font-family:var(--font-mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); margin:16px 0 8px; display:flex; align-items:center; gap:8px; }
.item-group-label::after { content:''; flex:1; height:1px; background:var(--line-soft); }

/* sticky save bar */
.save-bar {
  position:sticky; bottom:0; margin:24px -24px -60px; padding:14px 24px calc(14px + env(safe-area-inset-bottom));
  background:rgba(255,255,255,.94); backdrop-filter:blur(12px); border-top:1px solid var(--line);
  display:flex; align-items:center; gap:12px; z-index:10;
}
@media (max-width:860px){
  /* Bungkus tombol save-bar agar label panjang (mis. "Reset ke Design System") tak meluber di mobile. */
  .save-bar { margin:24px -16px 0; bottom:72px; flex-wrap:wrap; justify-content:flex-end; row-gap:8px; }
  .save-bar .grow { display:none; }
}
.save-bar .grow { flex:1; }

.ed-info-banner { display:flex; align-items:flex-start; gap:10px; padding:12px 14px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm); font-size:12.5px; color:var(--graphite); line-height:1.5; margin-bottom:18px; }
.ed-info-banner svg { width:17px; height:17px; flex:none; margin-top:1px; color:var(--graphite); }
.field-toolrow { display:flex; justify-content:flex-end; gap:8px; margin:-6px 0 12px; }
.content-organizer { display:flex; flex-wrap:wrap; gap:8px; margin:-8px 0 18px; }
.content-organizer span { border:1px solid var(--line); background:#fff; border-radius:7px; padding:7px 10px; font-size:11.5px; font-weight:650; color:var(--graphite); }

/* ---------- Bypass / mode pemrosesan (Page Editor → tab Halaman) ---------- */
.bypass-seg { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; }
@media (max-width:640px){ .bypass-seg { grid-template-columns:1fr; } }
.bypass-opt {
  display:flex; align-items:center; gap:10px; text-align:left; cursor:pointer;
  padding:11px 12px; border:1px solid var(--line); border-radius:var(--r-sm);
  background:var(--paper); color:var(--graphite); transition:border-color .14s, background .14s, box-shadow .14s;
}
.bypass-opt:hover { border-color:var(--ink-400); }
.bypass-opt .bo-ic { width:30px; height:30px; flex:none; display:grid; place-items:center; border-radius:8px; background:var(--paper-warm); color:var(--graphite); }
.bypass-opt .bo-ic svg { width:16px; height:16px; }
.bypass-opt .bo-tx { display:flex; flex-direction:column; min-width:0; line-height:1.25; }
.bypass-opt .bo-tx b { font-size:13px; font-weight:680; color:var(--ink); white-space:nowrap; }
.bypass-opt .bo-tx small { font-size:10.5px; font-family:var(--font-mono); letter-spacing:.04em; text-transform:uppercase; color:var(--muted); }
.bypass-opt.active { border-color:var(--ink); background:#fff; box-shadow:inset 0 0 0 1px var(--ink); }
.bypass-opt.active .bo-ic { background:var(--ink); color:#fff; }
.bypass-note { display:flex; align-items:flex-start; gap:9px; margin-top:10px; padding:10px 12px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm); font-size:12px; line-height:1.5; color:var(--graphite); }
.bypass-note svg { width:16px; height:16px; flex:none; margin-top:1px; }
.bypass-note.is-schedule { background:var(--pst-info-bg); border-color:var(--pst-info-border); color:var(--pst-info-text); }
.bypass-note.is-forward { background:var(--pst-warning-bg); border-color:var(--pst-warning-border); color:var(--pst-warning-text); }
.bypass-note b { font-weight:700; }

/* Chip mode bypass di kartu Booking Page */
.page-card .pc-mode {
  position:absolute; left:10px; bottom:10px; z-index:2;
  display:inline-flex; align-items:center; gap:5px; padding:3px 8px; border-radius:var(--r-pill, 100px);
  font-size:10px; font-weight:700; letter-spacing:.02em; line-height:1; white-space:nowrap;
  box-shadow:var(--shadow-1); backdrop-filter:saturate(140%) blur(2px);
}
.page-card .pc-mode svg { width:11px; height:11px; }
.page-card .pc-mode.mode-schedule { background:var(--pst-info-bg); color:var(--pst-info-text); border:1px solid var(--pst-info-border); }
.page-card .pc-mode.mode-forward { background:var(--pst-warning-bg); color:var(--pst-warning-text); border:1px solid var(--pst-warning-border); }

.flow-toolbar { display:flex; gap:8px; flex-wrap:wrap; justify-content:flex-end; margin:-6px 0 14px; }
.flow-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; }
@media (max-width:760px){ .flow-grid { grid-template-columns:1fr; } }
.flow-card { border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper); overflow:hidden; }
.flow-card-head { display:flex; justify-content:space-between; gap:12px; padding:14px; border-bottom:1px solid var(--line-soft); }
.flow-card-head h3 { font-size:14px; font-weight:720; }
.flow-card-head p { font-size:12px; color:var(--muted); line-height:1.45; margin-top:4px; }
.flow-count { width:28px; height:28px; border-radius:50%; background:var(--ink); color:#fff; display:grid; place-items:center; font-family:var(--font-mono); font-size:12px; flex:none; }
.flow-list { display:grid; gap:8px; padding:12px 14px; }
.flow-item { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:8px 10px; border:1px solid var(--line-soft); border-radius:var(--r-sm); background:var(--paper-warm); }
.flow-item span { font-size:12.5px; font-weight:620; }
.flow-item small { font-family:var(--font-mono); font-size:10.5px; color:var(--muted); }
.flow-toggle { padding:0 14px 14px; }
.flow-step-list { display:grid; gap:12px; }
.flow-step-card { border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper); overflow:hidden; }
.flow-step-head { display:flex; align-items:center; gap:12px; padding:12px 14px; border-bottom:1px solid var(--line-soft); }
.flow-step-head .grip { display:flex; flex-direction:column; gap:2px; }
.flow-step-head .grip button { border:0; background:transparent; color:var(--muted); padding:0; line-height:0; }
.flow-step-head .grip button:hover { color:var(--ink); }
.flow-step-head .grip button:disabled { opacity:.28; cursor:not-allowed; }
.flow-step-head b { display:block; font-size:13.5px; }
.flow-step-head small { display:block; margin-top:2px; font-family:var(--font-mono); font-size:10.5px; color:var(--muted); }
.flow-step-head > div:nth-child(2) { flex:1; min-width:0; }
.flow-step-body { padding:14px; }
.flow-list.compact { margin-top:4px; padding:0; }

.settings-card { max-width:680px; }
/* Builder (Email/WhatsApp) butuh ruang lebih agar kolom preview tak terpotong */
.settings-card.is-wide { max-width:1040px; }
.help-pill { font-family:var(--font-mono); font-size:11px; color:var(--ok); background:var(--ok-bg); padding:3px 8px; border-radius:6px; }

/* ===== Notifikasi & Template — Builder (Email/WA) ===== */
.nt-builder-grid { display:grid; grid-template-columns:1fr 1fr; gap:18px; align-items:start; }
@media (max-width:900px){ .nt-builder-grid { grid-template-columns:1fr; } }
.nt-tabs { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:4px; }
.nt-fmtbar { display:flex; align-items:center; gap:5px; flex-wrap:wrap; padding:6px; background:var(--paper-warm2,#f6f6f4); border:1px solid var(--line); border-radius:10px; }
.nt-fmtbar .abtn.nt-fmt { width:30px; padding:0; justify-content:center; }
.nt-fmt-sep { width:1px; align-self:stretch; background:var(--line); margin:2px 4px; }
/* Panggung + bubble WhatsApp (render text formatting) */
.nt-wa-stage { background:#E5DDD5; border:1px solid var(--line); border-radius:12px; padding:16px; min-height:180px; }
.nt-wa-bubble { background:#DCF8C6; border-radius:12px 12px 12px 4px; padding:12px 14px; font-size:13px; line-height:1.55; color:#111; max-width:340px; box-shadow:0 1px 2px rgba(0,0,0,.14); word-break:break-word; overflow-wrap:anywhere; }
.nt-wa-bubble b { font-weight:700; }
.nt-wa-bubble code { font-family:var(--font-mono); font-size:12px; background:rgba(0,0,0,.06); padding:1px 4px; border-radius:4px; }

/* ============================================================
   CENTERED MODAL (item editor, category manager, field palette)
   ============================================================ */
.modal-back.center { display:grid; place-items:center; padding:24px; }
/* Modal bertumpuk di atas drawer booking (#bkDetailBack z-index:1200). */
#bkModalStack .modal-back { z-index:1300; }
/* Modal generik (adminModal) = interaksi teratas SAAT terbuka. Default app.css 90
   kalah dari slideover Workspace (1201) / pos-modal (1200) / drawer wp2 (1201) —
   modal yang dibuka DARI permukaan itu tenggelam. 1290 = di atas semua drawer,
   tetap di bawah #bkModalStack (1300), uiConfirm (1500), dan toast (1600). */
.modal-back { z-index:1290; }

/* ============================================================
   DOKUMEN TRANSAKSI — Invoice Card (.inv2) & Struk kasir (.rcp2)
   Reproduksi komponen master; angka mono, rule identity di kepala invoice.
   ============================================================ */
.inv2 { display:flex; flex-direction:column; gap:14px; padding:24px 26px; background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line)); border-top:3px solid var(--identity-yellow,#FFF700); border-radius:var(--radius-md,14px); }
.inv2-head { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:start; gap:14px; }
.inv2-kicker { display:block; color:var(--text-subtle,var(--ink-400)); font-family:var(--font-mono); font-size:10px; font-weight:650; letter-spacing:.12em; text-transform:uppercase; }
.inv2-no { display:block; margin-top:4px; color:var(--text-strong,var(--ink)); font-size:27px; font-weight:750; letter-spacing:-.02em; }
.inv2-headright { display:grid; justify-items:end; gap:8px; }
.inv2-brand { color:var(--text-strong,var(--ink)); font-size:12px; font-weight:800; letter-spacing:.04em; text-transform:uppercase; }
.inv2-status { padding:5px 12px; border:1px solid; border-radius:var(--radius-pill,100px); font-family:var(--font-mono); font-size:10.5px; letter-spacing:.08em; text-transform:uppercase; }
.inv2-status.is-due  { color:var(--tag-orange-text);  background:var(--tag-orange-bg);  border-color:var(--tag-orange-border); }
.inv2-status.is-paid { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.inv2-meta { color:var(--text-subtle,var(--ink-400)); font-size:11px; letter-spacing:.06em; text-transform:uppercase; }
.inv2-panel { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; padding:14px 16px;
  background:var(--surface-1,var(--paper-warm)); border-radius:var(--radius-sm,10px); }
.inv2-panel > div { min-width:0; display:grid; gap:3px; }
.inv2-panel b { overflow:hidden; color:var(--text-strong,var(--ink)); font-size:14px; text-overflow:ellipsis; white-space:nowrap; }
.inv2-panel small { color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.inv2-lines { display:flex; flex-direction:column; }
.inv2-line { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:14px; padding:12px 0; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.inv2-line b { display:block; color:var(--text-strong,var(--ink)); font-size:14px; font-weight:700; }
.inv2-line small { display:block; margin-top:2px; color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.inv2-line strong { font-size:14px; font-weight:600; }
.inv2-totals { display:grid; gap:7px; justify-self:end; width:min(320px,100%); margin-left:auto; }
.inv2-totals > div { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:14px; color:var(--text-body,var(--ink-700)); font-size:13px; }
.inv2-totals .inv2-total { padding-top:7px; border-top:1px solid var(--line-200,var(--line)); font-size:15px; font-weight:750; }
.inv2-totals .inv2-due { padding-top:9px; border-top:2px solid var(--ink-900,var(--ink)); font-size:17px; font-weight:750; }
.inv2-foot { padding-top:12px; border-top:1px solid var(--line-100,var(--line-soft)); color:var(--text-subtle,var(--ink-400)); font-size:10.5px; letter-spacing:.05em; text-transform:uppercase; }

/* ── Dokumen Order (brief §Phase 2.D): daftar sesi + section per tanggal transaksi.
   Anatominya meneruskan .inv2-* yang sudah ada; hanya penataan grup yang baru.
   Spacing/tipografi SELURUHNYA token (ADR D-23); hairline 1px tetap literal
   karena ia lebar garis, bukan nilai skala. */
.inv2-sessions { grid-template-columns:minmax(0,1fr); }
.inv2-session-row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-4); align-items:center; padding:var(--space-3) 0; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.inv2-session-row:last-child { border-bottom:0; }
.inv2-session-row b { overflow:hidden; display:block; font-size:var(--text-sm); text-overflow:ellipsis; white-space:nowrap; }
.inv2-session-row small { display:block; margin-top:var(--space-1); color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs); }
.inv2-txsec { padding-top:var(--space-4); }
.inv2-txsec + .inv2-txsec { margin-top:var(--space-3); border-top:1px solid var(--line-100,var(--line-soft)); }
.inv2-txsec-head { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-4); align-items:baseline; padding-bottom:var(--space-2); }
.inv2-txsec-head small { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs); }
.inv2-line--sum { border-bottom:0; font-weight:var(--fw-bold); }
.inv2-request { margin-top:var(--space-5); padding-top:var(--space-4); border-top:1px solid var(--line-200,var(--line)); }

/* ── Riwayat pembayaran (tiap transaksi + kapan dibayar) ──
   Baris komposit → grid, sesuai aturan: no|isi|status|nominal|kumulatif. */
.inv2-pay { display:flex; flex-direction:column; gap:8px; padding-top:14px; border-top:1px solid var(--line-100,var(--line-soft)); }
.inv2-pay-empty { color:var(--text-subtle,var(--ink-400)); font-size:12px; }
.inv2-pay-row {
  display:grid;
  grid-template-columns:auto minmax(0,1fr) auto;
  align-items:start;
  gap:4px 10px;
  padding:10px 12px;
  background:var(--surface-1,var(--paper-warm));
  border:1px solid var(--line-100,var(--line-soft));
  border-radius:var(--radius-sm,10px);
}
.inv2-pay-seq {
  display:grid; place-items:center; width:22px; height:22px;
  color:var(--text-muted,var(--graphite));
  background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line));
  border-radius:var(--radius-pill,100px);
  font-size:10.5px;
}
.inv2-pay-main { min-width:0; display:grid; justify-items:start; gap:2px; }
.inv2-pay-main b { color:var(--text-strong,var(--ink)); font-size:13px; font-weight:700; }
.inv2-pay-main small { color:var(--text-subtle,var(--ink-400)); font-size:11px; overflow-wrap:anywhere; }
.inv2-pay-stat { margin-top:3px; padding:3px 9px; border:1px solid; border-radius:var(--radius-pill,100px); font-family:var(--font-mono); font-size:10px; letter-spacing:.05em; }
.inv2-pay-stat.is-ok   { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.inv2-pay-stat.is-wait { color:var(--tag-orange-text);  background:var(--tag-orange-bg);  border-color:var(--tag-orange-border); }
/* Kolom nominal: rata kanan, tak pernah ikut menyusut. */
.inv2-pay-amt { display:grid; justify-items:end; gap:2px; text-align:right; }
.inv2-pay-amt strong { color:var(--text-strong,var(--ink)); font-size:14px; font-weight:700; white-space:nowrap; }
.inv2-pay-run { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; white-space:nowrap; }

/* ── Halaman lampiran bukti transfer ── */
.inv2-proofpage { margin-top:16px; padding-top:14px; border-top:1px solid var(--line-200,var(--line)); break-before:page; }
.inv2-proofpage-head { display:grid; gap:3px; margin-bottom:12px; }
.inv2-proofpage-head b { color:var(--text-strong,var(--ink)); font-size:16px; font-weight:750; }
.inv2-proofpage-head small { color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.inv2-proof-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(190px,1fr)); gap:12px; }
.inv2-proof-card { margin:0; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px); overflow:hidden; background:var(--surface-0,var(--paper)); }
.inv2-proof-card img { display:block; width:100%; max-height:260px; object-fit:contain; background:var(--surface-1,var(--paper-warm)); }
.inv2-proof-card figcaption { display:grid; gap:2px; padding:9px 11px; border-top:1px solid var(--line-100,var(--line-soft)); }
.inv2-proof-card figcaption b { color:var(--text-strong,var(--ink)); font-size:12px; font-weight:700; }
.inv2-proof-card figcaption small { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; }
.inv2-proof-card figcaption small.is-ok   { color:var(--tag-success-text); }
.inv2-proof-card figcaption small.is-wait { color:var(--tag-orange-text); }

/* Receipt: banner status saat pembayaran belum diverifikasi. */
.rcp2-warn {
  display:flex; align-items:flex-start; gap:8px;
  padding:9px 11px;
  color:var(--tag-orange-text); background:var(--tag-orange-bg);
  border:1px solid var(--tag-orange-border); border-radius:var(--radius-sm,10px);
  font-size:11.5px; line-height:1.45;
}
.rcp2-warn svg { flex:none; margin-top:1px; }

.rcp2 { display:flex; flex-direction:column; gap:12px; padding:22px; background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,14px); }
.rcp2-title { color:var(--text-strong,var(--ink)); font-size:20px; font-weight:750; letter-spacing:-.01em; }
/* Kertas struk drawer generasi lama (`.rcp-paper` dkk) DICABUT — struk kasir dan
   Kwitansi kini memakai komponen DS bersama `.vs-receipt` (unit GUI/19/RECEIPT),
   sama dengan POS. Menyisakannya berarti menyimpan desain struk kedua yang siap
   dipakai tanpa sengaja lalu menyimpang lagi. `.rcp2*` (bingkai dokumen di
   sekeliling kertas, bukan kertasnya) TETAP dipakai dan tidak ikut dicabut. */

/* Picker add-on pada modal Tambah Charge (hirarki paket → katalog → manual). */
.ch-list { display:flex; flex-direction:column; gap:6px; max-height:280px; overflow-y:auto; }
.ch-opt { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:12px; width:100%; padding:10px 12px; text-align:left;
  background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px); cursor:pointer;
  transition:border-color .14s ease, background .14s ease; }
.ch-opt:hover { border-color:var(--ink-400,var(--muted)); }
.ch-opt.is-on { border-color:var(--ink-900,var(--ink)); box-shadow:0 0 0 1px var(--ink-900,var(--ink)) inset; }
.ch-opt-main { min-width:0; display:grid; }
.ch-opt-main > b { overflow:hidden; color:var(--text-strong,var(--ink)); font-size:13px; text-overflow:ellipsis; white-space:nowrap; }
.ch-opt-main > small { color:var(--text-subtle,var(--ink-400)); font-size:11px; }

/* ============================================================
   PAYMENT DRAWER — Status deposit · Rincian tagihan · Riwayat
   Adaptasi master; semua warna/spacing dari token DS.
   ============================================================ */
.bkpay-card { display:flex; flex-direction:column; gap:10px; padding:16px 18px; margin-bottom:12px;
  background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,14px); }
.bkpay-head { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:10px; }
.bkpay-kicker { color:var(--text-subtle,var(--ink-400)); font-family:var(--font-mono); font-size:10px; font-weight:650; letter-spacing:.1em; text-transform:uppercase; }
.bkpay-title { margin:-4px 0 2px; color:var(--text-strong,var(--ink)); font-size:16px; font-weight:700; letter-spacing:-.01em; }
.bkpay-chip { display:inline-flex; align-items:center; padding:3px 10px; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-pill,100px);
  color:var(--text-muted,var(--ink-600)); background:var(--surface-1,var(--paper-warm)); font-family:var(--font-mono); font-size:10px; letter-spacing:.06em; white-space:nowrap; }
.bkpay-chip--dp     { color:var(--tag-blue-text);    background:var(--tag-blue-bg);    border-color:var(--tag-blue-border); }
.bkpay-chip--lunas  { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.bkpay-chip--refund { color:var(--tag-purple-text);  background:var(--tag-purple-bg);  border-color:var(--tag-purple-border); }
.bkpay-amountrow { display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; }
.bkpay-amountrow > b { font-size:30px; font-weight:700; letter-spacing:-.03em; }
.bkpay-amountrow > span { color:var(--text-subtle,var(--ink-400)); font-size:12.5px; }
.bkpay-bar { height:8px; overflow:hidden; background:var(--ink-050,var(--surface-1)); border-radius:var(--radius-pill,100px); }
.bkpay-bar > i { display:block; height:100%; background:var(--ink-900,var(--ink)); border-radius:inherit; }
.bkpay-deprow { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:12px; color:var(--text-muted,var(--ink-600)); font-size:12.5px; }
.bkpay-lines { display:flex; flex-direction:column; }
.bkpay-line { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline; gap:12px; padding:7px 0; color:var(--text-body,var(--ink-700)); font-size:13px; }
.bkpay-line--sum { border-top:1px solid var(--line-100,var(--line-soft)); font-weight:700; }
.bkpay-line--grand { border-top:2px solid var(--ink-900,var(--ink)); font-size:15px; font-weight:750; }
.bkpay-neg { color:var(--tag-success-text); }
.bkpay-due { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:10px; margin-top:4px; padding:12px 14px;
  background:var(--surface-1,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px); }
.bkpay-due > b { justify-self:end; font-size:20px; font-weight:750; letter-spacing:-.02em; }
.bkpay-hrow { display:grid; grid-template-columns:auto minmax(0,1fr) auto auto; align-items:center; gap:12px; padding:10px 0; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.bkpay-hrow:last-of-type { border-bottom:0; }
.bkpay-hwhen { display:grid; }
.bkpay-hwhen > b { font-size:11.5px; }
.bkpay-hwhen > small { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; }
.bkpay-hmain { min-width:0; display:grid; }
.bkpay-hmain > b { overflow:hidden; font-size:13px; text-overflow:ellipsis; white-space:nowrap; }
.bkpay-hmain > small { color:var(--text-subtle,var(--ink-400)); font-size:11px; }
.bkpay-hamt { display:grid; justify-items:end; }
.bkpay-hamt > b { font-size:13.5px; font-weight:700; }
.bkpay-hamt > small { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; }
.bkpay-hbadge { display:inline-flex; align-items:center; gap:6px; }
@media (max-width:768px) {
  .bkpay-hrow { grid-template-columns:auto minmax(0,1fr); row-gap:6px; }
  .bkpay-hamt, .bkpay-hbadge { grid-column:2; justify-self:start; justify-items:start; }
}
/* Scroll-lock saat modal terbuka (setModalScrollLock di admin.js). Mengunci
   gulir latar + menutup artefak repaint backdrop-filter pada backdrop fixed. */
html.bg-modal-lock, html.bg-modal-lock body { overflow:hidden; }
.modal-center { width:100%; max-width:520px; background:var(--paper); border-radius:var(--r-lg); box-shadow:var(--shadow-pop); max-height:88vh; display:flex; flex-direction:column; animation:popin .2s var(--ease); text-align:left; }
.modal-center.wide { max-width:580px; }
@keyframes popin { from { opacity:0; transform:translateY(12px) scale(.99);} to { opacity:1; transform:none; } }
.mc-head { display:flex; align-items:center; justify-content:space-between; padding:16px 20px; border-bottom:1px solid var(--line); }
.mc-head h3 { font-size:16px; font-weight:740; }
.mc-head .x { background:transparent; border:0; color:var(--muted); padding:6px; border-radius:6px; cursor:pointer; }
.mc-head .x:hover { background:var(--paper-warm); color:var(--ink); }
.mc-body { padding:18px 20px; overflow-y:auto; }
/* Tab editor item — bar section di bawah head modal; pane di-swap tanpa re-render. */
.ed-tabbar { padding:0 20px; border-bottom:1px solid var(--line); overflow-x:auto; -webkit-overflow-scrolling:touch; }
.ed-tabbar::-webkit-scrollbar { height:0; }
.ed-tabbar .vs-tabs { border-bottom:0; flex-wrap:nowrap; }
/* Tab composer diperjelas: target sentuh 44px, jarak lega, state aktif tegas
   (garis bawah 2px + teks penuh kontras) — sebelumnya 8px padding dan tipis. */
.ed-tabbar .vs-tab { flex:none; white-space:nowrap; gap:7px; padding:0 14px; min-height:46px; font-size:13px; color:var(--text-muted); }
.ed-tabbar .vs-tab:hover { color:var(--text-strong); background:var(--surface-1); }
.ed-tabbar .vs-tab[aria-selected="true"] { color:var(--text-strong); font-weight:700; }
.ed-tabbar .vs-tab:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
/* Kontainer grup field di composer — batas "kebutuhan input" jadi jelas:
   border grey + head kicker mono + penjelas, isi ber-padding. */
.fgrp { border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); margin:0 0 14px; }
.fgrp:last-child { margin-bottom:0; }
.fgrp__head { display:flex; flex-direction:column; gap:2px; padding:12px 14px; border-bottom:1px solid var(--line-100); background:var(--surface-1); border-radius:var(--radius-sm) var(--radius-sm) 0 0; }
.fgrp__ttl { font-family:var(--font-mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.fgrp__desc { font-size:12px; color:var(--text-muted); line-height:1.45; }
.fgrp__body { padding:14px; }
.fgrp__body > .frow:last-child, .fgrp__body > .fgrid:last-child, .fgrp__body > .fgrid3:last-child { margin-bottom:0; }

/* Transisi antar tab: fade + geser halus, dihormati prefers-reduced-motion. */
@keyframes ed-pane-in { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:none; } }
.ed-pane.is-in { animation:ed-pane-in .18s ease both; }
@media (prefers-reduced-motion: reduce){ .ed-pane.is-in { animation:none; } }
/* `hidden` harus menang atas display flex/grid pane (lih. pola .pos-*[hidden]). */
.ed-pane[hidden] { display:none !important; }
.mc-foot { display:flex; align-items:center; gap:10px; padding:14px 20px; border-top:1px solid var(--line); }
/* Alias untuk modal yang memakai class .modal-* (Finance dkk) — tanpa ini layoutnya berantakan */
.modal-center .modal-head { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:16px 20px; border-bottom:1px solid var(--line); }
.modal-center .modal-head h2, .modal-center .modal-head h3 { font-size:16px; font-weight:740; margin:0; min-width:0; overflow-wrap:anywhere; }
.modal-center .modal-head .icon-btn { flex:0 0 auto; }
.modal-center .modal-body { padding:18px 20px; overflow-y:auto; min-height:0; }
.modal-center .modal-foot { display:flex; align-items:center; justify-content:flex-end; gap:10px; padding:14px 20px; border-top:1px solid var(--line); }
@media (max-width:560px){ .modal-back.center { place-items:end center; padding:0; } .modal-center { max-width:100%; border-radius:var(--r-lg) var(--r-lg) 0 0; max-height:92vh; } }

/* In-app confirm dialog (uiConfirm) — bertumpuk di atas modal editor (modal-back z=90) */
/* == TANGGA LAPISAN OVERLAY (bugfix 2026-08-10) ==============================
   Bug nyata: "Hapus ke Trash" di drawer Bookings memunculkan uiConfirm DI BELAKANG
   backdrop blur — karena permukaan interaktif tertinggi ada di 1200–1300
   (.bk-detail-back/.pos-modal/#bgAsst 1200 · .ws-slideover/.wp2-drawer 1201 ·
   .sched-doc-overlay 1250 · #bkModalStack .modal-back 1300) sedangkan layer
   KEPUTUSAN (.uic-back) dulu 300 dan UMPAN BALIK (.toast-wrap) 80.
   Kanon mulai sekarang: interaktif ≤1300 < modal c2 1320 < uiConfirm/uiPrompt 1500
   < toast 1600 < station badge/lock 8000/9000 (kiosk wajib menang) < chip-pop 9999.
   Jangan menambah permukaan interaktif baru di atas 1300. */
.uic-back { position:fixed; inset:0; z-index:1500; background:rgba(10,10,10,.5); display:grid; place-items:center; padding:24px; animation:fade .16s var(--ease); }
.uic-card { width:100%; max-width:420px; background:var(--paper); border-radius:var(--r-lg); box-shadow:var(--shadow-pop); padding:22px 22px 16px; animation:popin .18s var(--ease); text-align:left; }
.uic-title { font-size:16px; font-weight:760; margin:0 0 8px; }
.uic-msg { font-size:13.5px; color:var(--graphite); line-height:1.55; }
.uic-foot { display:flex; align-items:center; gap:10px; margin-top:18px; }
.abtn--danger { background:var(--danger); color:#fff; border-color:var(--danger); }
.abtn--danger:hover { opacity:.92; background:var(--danger); }
@media (max-width:560px){ .uic-back { place-items:end center; padding:0; } .uic-card { max-width:100%; border-radius:var(--r-lg) var(--r-lg) 0 0; } }
/* Toast = umpan balik terakhir; app.css menetapkan 80 (di bawah semua drawer 1200+
   → toast dari dalam drawer tak pernah terlihat). Override khusus admin (admin.css
   hanya dimuat app admin; permukaan publik tetap 80 milik app.css). */
.toast-wrap { z-index:1600; }

.subcat-editor { display:grid; gap:8px; margin-bottom:10px; }
.subcat-edit-row { display:grid; grid-template-columns:auto 1fr 150px auto auto; gap:8px; align-items:center; }
.subcat-edit-row.is-off .ctrl { opacity:.5; }
.subcat-ord { display:flex; gap:2px; }
.subcat-act { display:inline-flex; align-items:center; gap:5px; font-size:12px; color:var(--graphite); cursor:pointer; white-space:nowrap; }
.subcat-add-row, .category-add-row { display:grid; grid-template-columns:1fr 180px auto; gap:8px; align-items:center; margin-top:12px; }
@media (max-width:620px){ .subcat-edit-row, .subcat-add-row, .category-add-row { grid-template-columns:1fr; } }

/* field palette */
.palette-label { font-family:var(--font-mono); font-size:10.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); margin-bottom:10px; }
.palette-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
@media (min-width:480px){ .palette-grid { grid-template-columns:1fr 1fr 1fr; } }
.palette-item { display:flex; flex-direction:column; align-items:flex-start; gap:8px; padding:14px 12px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); cursor:pointer; transition:border-color .14s, background .14s, transform .1s; text-align:left; }
.palette-item:hover { border-color:var(--ink); background:var(--paper-warm); }
.palette-item:active { transform:scale(.98); }
.palette-item svg { width:18px; height:18px; color:var(--ink); }
.palette-item span { font-size:12.5px; font-weight:600; }

/* ============================================================
   CATALOG DATABASE
   ============================================================ */
.cat-toolbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:18px; }
.cat-toolbar select { padding:9px 30px 9px 12px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); font-size:13px;
  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='%238C8C86' stroke-width='2.5' 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 10px center; }

/* segmented view switcher */
.seg { display:inline-flex; background:var(--paper-warm2); border:1px solid var(--line); border-radius:var(--r-sm); padding:3px; gap:2px; }
.seg-btn { display:inline-flex; align-items:center; gap:6px; padding:7px 12px; border:0; background:transparent; border-radius:7px; font-size:12.5px; font-weight:600; color:var(--graphite); cursor:pointer; transition:background .14s, color .14s; }
.seg-btn svg { width:15px; height:15px; }
.seg-btn:hover { color:var(--ink); }
.seg-btn.active { background:var(--paper); color:var(--ink); box-shadow:var(--shadow-1); }
@media (max-width:600px){ .seg-btn span { display:none; } .seg-btn { padding:8px 10px; } }
/* 12.20 — selektor metode pembayaran (Verifikasi Pembayaran): chip mengisi penuh, label tetap tampil di mobile */
.seg--pay { display:flex; width:100%; }
.seg--pay .seg-btn { flex:1; justify-content:center; }

.img-thumb { width:40px; height:40px; border-radius:8px; background:var(--paper-warm2) center/cover no-repeat; flex:none; display:grid; place-items:center; color:var(--muted); overflow:hidden; }
.img-thumb.ph svg { width:18px; height:18px; }
.img-thumb.visual-fallback { background:var(--vf-bg); color:var(--vf-ink); }
.img-thumb.visual-fallback::before,
.img-thumb.visual-fallback::after { display:none; }
.img-thumb .vf-mini { font-size:12px; font-weight:800; color:var(--vf-ink); }

/* gallery */
.gallery-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:14px; }
.gal-card { border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden; background:var(--paper); cursor:pointer; transition:border-color .14s, box-shadow .14s, transform .12s; }
.gal-card:hover { border-color:var(--ink); box-shadow:var(--shadow-2); transform:translateY(-2px); }
.gal-cover { aspect-ratio:4/3; background:var(--paper-warm2); position:relative; display:grid; place-items:center; color:var(--muted); overflow:hidden; }
.gal-cover.visual-fallback { background:var(--vf-bg); }
.gal-cover .vf-label { max-width:76%; color:var(--vf-ink); }
.gal-cover .img-cover { position:absolute; inset:0; background-size:cover; background-position:center; }
.gal-cover .badge { position:absolute; top:9px; left:9px; font-family:var(--font-mono); font-size:9.5px; letter-spacing:.08em; text-transform:uppercase; background:var(--ink); color:#fff; padding:3px 8px; border-radius:100px; z-index:2; }
.gal-cover .muted-tag { position:absolute; top:9px; right:9px; font-size:10px; background:rgba(10,10,10,.6); color:#fff; padding:3px 8px; border-radius:100px; z-index:2; }
.gal-body { padding:11px 12px 13px; }
.gal-body .nm { font-size:13.5px; font-weight:680; letter-spacing:0; }
.gal-body .cat { font-size:11.5px; color:var(--muted); margin-top:3px; }
.gal-body .pr { font-size:12px; color:var(--ink); margin-top:7px; font-weight:600; }

/* board */
.board { display:flex; gap:14px; overflow-x:auto; padding-bottom:8px; -webkit-overflow-scrolling:touch; }
.board-col { flex:none; width:248px; background:var(--paper-warm); border:1px solid var(--line); border-radius:var(--r-md); display:flex; flex-direction:column; max-height:70vh; }
.board-head { display:flex; align-items:center; justify-content:space-between; padding:12px 14px; border-bottom:1px solid var(--line-soft); font-size:13px; font-weight:700; }
.board-head .cnt { font-family:var(--font-mono); font-size:11px; color:var(--muted); background:var(--paper); border:1px solid var(--line); border-radius:100px; padding:1px 8px; }
.board-items { padding:10px; display:flex; flex-direction:column; gap:8px; overflow-y:auto; }
.board-card { background:var(--paper); border:1px solid var(--line); border-radius:var(--r-sm); padding:10px; cursor:pointer; transition:border-color .14s, box-shadow .14s; }
.board-card:hover { border-color:var(--ink); box-shadow:var(--shadow-1); }
.board-card .bc-top { display:flex; align-items:center; gap:9px; }
.board-card .bc-top .img-thumb { width:30px; height:30px; }
.board-card .bc-top .nm { font-size:12.5px; font-weight:620; line-height:1.3; }
.board-card .bc-meta { display:flex; align-items:center; justify-content:space-between; margin-top:8px; }
.board-card .bc-meta .mono { font-size:11px; color:var(--graphite); }
.board-card .bc-meta .dot-off { width:7px; height:7px; border-radius:50%; background:var(--muted); display:inline-block; }
.board-card .bc-meta .dot-off::before { display:none; }
.board-empty { text-align:center; color:var(--muted); font-size:12px; padding:10px; }
.board-add { display:flex; align-items:center; justify-content:center; gap:6px; padding:8px; border:1px dashed var(--line); border-radius:var(--r-sm); background:transparent; color:var(--muted); font-size:12px; font-weight:600; cursor:pointer; }
.board-add:hover { border-color:var(--ink); color:var(--ink); }

/* ============================================================
   GROUP-BY (Notion-like multi-level) · inline edit · drag-drop
   ============================================================ */
/* group-by control bar */
.grp-ctrl { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:-6px 0 16px; padding:10px 12px;
  background:var(--paper); border:1px solid var(--line); border-radius:var(--r-sm); }
.grp-ctrl-lbl { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--graphite); text-transform:uppercase; letter-spacing:.04em; }
.grp-ctrl-lbl svg { width:15px; height:15px; }
.grp-chips { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.grp-keychip { display:inline-flex; align-items:center; gap:7px; padding:5px 8px 5px 6px; background:var(--ink-950); color:#fff;
  border:1px solid var(--ink-950); border-radius:var(--r-sm); font-size:12px; font-weight:600; cursor:grab; user-select:none; }
.grp-keychip .gk-ord { display:grid; place-items:center; width:16px; height:16px; border-radius:50%; background:var(--identity-yellow); color:var(--ink-950); font-family:var(--font-mono); font-size:10px; font-weight:700; }
.grp-keychip .gk-x { display:inline-flex; align-items:center; background:transparent; border:0; color:#aaa; padding:1px; border-radius:4px; cursor:pointer; }
.grp-keychip .gk-x:hover { color:#fff; background:rgba(255,255,255,.14); }
.grp-keychip.is-dragging { opacity:.4; }
.grp-keychip.drag-over { outline:2px dashed var(--identity-yellow); outline-offset:2px; }
.grp-add { padding:7px 10px; border:1px dashed var(--line); border-radius:var(--r-sm); background:var(--paper-warm); font-size:12.5px; font-weight:600; color:var(--graphite); cursor:pointer; }
.grp-hint { font-size:12px; color:var(--muted); }

/* top summary strip */
.grp-summary { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:14px; padding:12px 14px;
  background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md); box-shadow:var(--shadow-card); }
.grp-summary-note { font-size:12px; color:var(--muted); }

/* group chips & totals */
.grp-chip { display:inline-flex; align-items:center; gap:5px; padding:2px 9px; border-radius:var(--radius-pill);
  font-size:11.5px; font-weight:600; background:var(--pst-neutral-bg); border:1px solid var(--pst-neutral-border); color:var(--pst-neutral-text); white-space:nowrap; }
.grp-chip.lg { font-size:12.5px; padding:3px 11px; }
.grp-chip.ok { background:var(--pst-success-bg); border-color:var(--pst-success-border); color:var(--pst-success-text); }
.grp-chip.muted { background:var(--pst-neutral-bg); border-color:var(--pst-neutral-border); color:var(--pst-neutral-text); }
.grp-total { font-family:var(--font-mono); font-size:12px; font-weight:600; color:var(--ink-900); }
.grp-total.lg { font-size:15px; }

/* nested group accordion */
.grp-wrap { display:flex; flex-direction:column; gap:10px; }
.grp { border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper); overflow:hidden; }
.grp.lvl-top { box-shadow:var(--shadow-card); }
.grp.lvl-top > .grp-head { border-left:3px solid var(--identity-yellow); }
.grp .grp { margin:0; border:0; border-top:1px solid var(--line-soft); border-radius:0; }
.grp-head { display:flex; align-items:center; gap:9px; padding:11px 14px; cursor:pointer; user-select:none; background:var(--paper); transition:background .12s; }
.grp-head:hover { background:var(--paper-warm); }
.grp-head:focus-visible { outline:2px solid var(--ink-950); outline-offset:-2px; }
.grp-caret { display:inline-flex; color:var(--graphite); flex:none; }
.grp-caret svg { width:16px; height:16px; }
.grp-label { font-size:13.5px; font-weight:700; color:var(--ink-900); }
.grp .grp .grp-label { font-size:13px; font-weight:640; }
.grp .grp .grp .grp-label { font-weight:600; color:var(--ink-700); }
.grp-crumb { font-size:11px; color:var(--muted); font-family:var(--font-mono); }
.grp-meta { display:flex; align-items:center; gap:8px; flex-wrap:wrap; justify-content:flex-end; }
.grp-body { border-top:1px solid var(--line-soft); }
.grp .grp-body { padding-left:14px; }            /* indent nested levels */
.grp.is-collapsed > .grp-body { display:none; }

/* DBGroup: tabel daun (rows DB lain) di dalam group body — mulus tanpa border ganda */
.grp-host { display:block; }
.grp-body > .tbl--leaf { width:100%; margin:0; }
.grp-body > .tbl--leaf > tbody > tr > td { border-top:1px solid var(--line-soft); }
.grp-body > .tbl--leaf > tbody > tr:first-child > td { border-top:0; }
.grp-body > .tbl--leaf > tbody > tr:last-child > td { border-bottom:0; }

/* leaf item rows */
.grp-rows { display:flex; flex-direction:column; }
/* Baris komposit → grid dgn kolom tetap, bukan flex: kolomnya sejajar antar baris
   dan teks panjang menyusut di kolomnya sendiri (tidak membungkus / mendorong). */
.grp-row {
  display:grid;
  grid-template-columns:auto auto auto 128px minmax(0,1fr) auto 190px auto auto;
  align-items:center;
  gap:10px;
  padding:9px 14px;
  border-top:1px solid var(--line-soft);
  background:var(--paper);
}
.grp-rows .grp-row:first-child { border-top:0; }
.grp-row:hover { background:var(--paper-warm); }
.grp-row.is-off { opacity:.62; }
.grp-row.is-dragging { opacity:.4; }
.grp-row.drag-over { box-shadow:inset 0 2px 0 var(--identity-yellow); }
.grp-grip { display:inline-flex; color:var(--muted); cursor:grab; flex:none; opacity:.5; }
.grp-row:hover .grp-grip { opacity:1; }
.grp-grip:active { cursor:grabbing; }
.grp-sel { display:inline-flex; flex:none; }
.grp-sel input { width:16px; height:16px; accent-color:var(--ink-950); }
.grp-thumb { flex:none; }
.grp-thumb .img-thumb { width:26px; height:26px; }
.grp-code { font-size:11px; color:var(--graphite); min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.grp-name { font-size:13px; font-weight:600; color:var(--ink-900); min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.grp-tags { display:flex; align-items:center; gap:6px; min-width:0; }
.grp-tags .sub { font-size:11px; color:var(--muted); }
/* nowrap = harga tetap satu baris; kolomnya sudah dipatok di grid-template. */
.grp-price {
  font-family:var(--font-mono); font-size:12px; color:var(--ink-900);
  min-width:0; text-align:right;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.grp-stat { flex:none; padding:2px 10px; border-radius:var(--radius-pill); font-size:11px; font-weight:600; cursor:pointer; border:1px solid; }
.grp-stat.on { background:var(--pst-success-bg); border-color:var(--pst-success-border); color:var(--pst-success-text); }
.grp-stat.off { background:var(--pst-neutral-bg); border-color:var(--pst-neutral-border); color:var(--pst-neutral-text); }
.grp-edit { flex:none; display:inline-flex; align-items:center; padding:5px; border:1px solid var(--line); border-radius:var(--r-xs); background:var(--paper); color:var(--graphite); cursor:pointer; }
.grp-edit:hover { border-color:var(--ink-950); color:var(--ink-950); }

/* inline-edit affordance + active input */
.cat-inline { cursor:text; border-radius:4px; transition:background .12s, box-shadow .12s; }
.cat-inline:hover { background:var(--identity-yellow-soft); box-shadow:inset 0 0 0 1px var(--identity-yellow); }
.grp-edit-input { width:100%; min-width:80px; padding:3px 6px; border:1.5px solid var(--ink-950); border-radius:var(--r-xs);
  font-family:inherit; font-size:13px; background:var(--paper); outline:none; }
.grp-edit-input.mono { font-family:var(--font-mono); }

/* tags (FR-11) */
.cat-tag.tag-soft { background:var(--pst-info-bg); color:var(--pst-info-text); border:1px solid var(--pst-info-border); font-weight:600; }
.row-tags { display:flex; align-items:center; flex-wrap:wrap; gap:4px; margin-top:5px; }
.grp-tags .cat-tag { font-size:10.5px; padding:2px 7px; }
/* tag input (item editor) */
.tag-input { display:flex; align-items:center; flex-wrap:wrap; gap:6px; padding:6px; min-height:42px;
  border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); }
.tag-input:focus-within { border-color:var(--ink-950); }
.tag-chip { display:inline-flex; align-items:center; gap:5px; padding:3px 6px 3px 9px; border-radius:var(--radius-pill);
  background:var(--pst-info-bg); border:1px solid var(--pst-info-border); color:var(--pst-info-text); font-size:12px; font-weight:600; }
.tag-chip .tc-x { display:inline-flex; align-items:center; background:transparent; border:0; color:inherit; opacity:.65; padding:1px; border-radius:50%; cursor:pointer; }
.tag-chip .tc-x:hover { opacity:1; background:rgba(0,0,0,.08); }
.tag-add-input { flex:1; min-width:120px; border:0; outline:none; background:transparent; font-family:inherit; font-size:13px; padding:4px 2px; }

/* board: dimension selector + kanban drag (FR-13) */
.board-dim { display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:14px; }
.board-dim-lbl { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--graphite); }
.board-dim-hint { font-size:12px; color:var(--muted); }
.board-head .cnt { font-family:var(--font-mono); }
.board-card[draggable="true"] { cursor:grab; }
.board-card.is-dragging { opacity:.4; }
.board-items.drag-over { background:var(--identity-yellow-soft); outline:2px dashed var(--identity-yellow); outline-offset:-4px; border-radius:var(--r-sm); }
.board-card .row-tags { margin-top:7px; }

/* light in-table group header rows (bookings / customers / rooms) */
.tbl tr.tbl-grp td { background:var(--paper-warm); border-bottom:1px solid var(--line); border-top:2px solid var(--line);
  padding:9px 14px; position:sticky; }
.tbl tr.tbl-grp:first-child td { border-top:0; }
.tg-label { font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--ink-900); margin-right:10px; }
.tg-total { margin-left:10px; font-family:var(--font-mono); font-size:12px; color:var(--ink-700); }
.tbl tr.tbl-grp td .grp-chip { vertical-align:middle; }

@media (max-width:760px){
  .grp-code { display:none; }
  .grp-price { width:auto; }
  .grp-name { min-width:90px; }
  .grp-tags { display:none; }
}

/* details */
.detail-split { display:grid; grid-template-columns:300px 1fr; gap:16px; }
@media (max-width:760px){ .detail-split { grid-template-columns:1fr; } }
.detail-list { border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden; max-height:72vh; overflow-y:auto; background:var(--paper); }
.dl-row { display:flex; align-items:center; gap:10px; width:100%; padding:11px 12px; border:0; border-bottom:1px solid var(--line-soft); background:transparent; cursor:pointer; text-align:left; transition:background .12s; }
.dl-row:hover { background:var(--paper-warm); }
.dl-row.active { background:var(--ink); }
.dl-row.active .nm, .dl-row.active .sub { color:#fff; }
.dl-row .nm { font-size:13px; font-weight:620; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dl-row .sub { font-size:11px; color:var(--muted); }
.detail-pane { border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden; background:var(--paper); }
.dp-cover { aspect-ratio:16/7; background:var(--paper-warm2); display:grid; place-items:center; color:var(--muted); position:relative; overflow:hidden; }
.dp-cover.visual-fallback { background:var(--vf-bg); }
.dp-cover .vf-label { max-width:70%; color:var(--vf-ink); }
.dp-cover .img-cover { position:absolute; inset:0; background-size:cover; background-position:center; }
.dp-body { padding:18px 20px; }
.dp-tags { display:flex; flex-wrap:wrap; gap:6px; margin:12px 0; }

/* ============================================================
   POS RECEIPT
   ============================================================ */
.content.content--pos { max-width:none; padding:18px 18px 72px; }
/* PRD 12.25b — Layout 2-kolom + work area ber-tab.
   Sebelumnya 3 kolom (queue|register|checkout) yang lebarnya melebihi ruang
   konten (viewport − sidebar 232px − padding) sehingga kolom ke-3 ter-clip /
   tumpang-tindih. Kini: rail Queue + satu kontainer kerja ber-tab. */
.pos-shell { display:grid; grid-template-columns:300px minmax(0,1fr); gap:14px; align-items:start; }
.pos-queue, .pos-work {
  min-width:0; background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden;
}
.pos-queue { position:sticky; top:78px; max-height:calc(100dvh - 96px); overflow:auto; }
/* Work area: panel penuh-tinggi yang dipancang; header + tab + footer tetap,
   hanya pane aktif yang men-scroll. */
.pos-work { position:sticky; top:78px; max-height:calc(100dvh - 96px); display:flex; flex-direction:column; }
.pos-work-head { flex:none; }
.pos-tabbody { flex:1 1 auto; min-height:0; overflow:auto; }
.pos-pane { padding:14px; }
.pos-pane[data-pane="items"] { padding:0; }
.pos-pane[hidden] { display:none !important; }
.pos-panel-head, .pos-context, .pos-catalog-head, .pos-cart-head {
  display:flex; align-items:center; justify-content:space-between; gap:12px; padding:13px 14px; border-bottom:1px solid var(--line-soft);
}
.pos-panel-head h2, .pos-context h2, .pos-catalog-head h2, .pos-cart-head h2 { font-size:14px; font-weight:760; }
.pos-panel-head span, .pos-context span, .pos-catalog-head span, .pos-cart-head span { display:block; font-size:11.5px; color:var(--muted); margin-top:2px; }
.pos-context-id { font-size:10.5px; color:var(--muted); margin-bottom:3px; }
.pos-context-actions { display:flex; gap:8px; flex-wrap:wrap; justify-content:flex-end; }
.pos-search { margin:12px 12px 10px; min-width:0; }
.pos-queue-list { display:grid; gap:8px; padding:0 12px 12px; }
/* FR-4: bar customer + daftar pencarian customer di POS */
.pos-cust-bar { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:10px 14px; border-bottom:1px solid var(--line-soft); flex-wrap:wrap; }
.pos-cust-tag { display:inline-flex; align-items:center; gap:5px; font-size:11.5px; color:var(--muted); }
.pos-cust-actions { display:flex; gap:8px; flex-wrap:wrap; }
.pos-detail-grid { border-top:1px solid var(--line-soft); }
.pos-cust-list { display:grid; gap:6px; max-height:52vh; overflow:auto; }
.pos-cust-row { width:100%; text-align:left; display:grid; gap:2px; border:1px solid var(--line); background:var(--paper); border-radius:var(--r-sm); padding:9px 11px; }
.pos-cust-row:hover { border-color:var(--ink); background:var(--paper-warm); }
.pos-cust-row b { font-size:12.5px; }
.pos-cust-row span { font-size:11px; color:var(--muted); }
/* FR-5: highlight field bermasalah + panel checklist validasi POS */
.pos-invalid { border-color:var(--danger) !important; box-shadow:0 0 0 2px var(--pst-danger-bg); }
.pos-validate-hint { display:grid; gap:4px; margin:0 0 10px; padding:10px 12px; border:1px solid var(--pst-warning-border); background:var(--pst-warning-bg); border-radius:var(--r-sm); }
.pos-validate-hint span { display:flex; gap:6px; align-items:flex-start; font-size:11.5px; color:var(--pst-warning-text); }
.pos-config-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; padding:14px; border-bottom:1px solid var(--line-soft); }
.pos-config-grid .frow { margin-bottom:0; }
.pos-brand-seg { width:100%; }
.pos-brand-seg .seg-btn { flex:1; justify-content:center; }
.pos-pay-methods { display:flex; gap:8px; margin-bottom:4px; }
.pos-pay-methods button {
  flex:1; min-width:0; border:1px solid var(--line); background:var(--paper); border-radius:var(--r-sm); padding:9px 8px;
  font-size:12px; font-weight:650; color:var(--graphite); cursor:pointer;
}
.pos-pay-methods button.active { background:var(--ink); border-color:var(--ink); color:#fff; }
/* Checkout sections */
.pos-sec { margin-bottom:14px; }
.pos-sec-head { display:flex; align-items:center; gap:7px; font-size:11px; font-weight:750; text-transform:uppercase; letter-spacing:.06em; color:var(--graphite); margin-bottom:9px; }
.pos-sec-head svg { color:var(--muted); }
.pos-pay-sec { border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm); padding:12px; }
.pos-mini-label { display:block; font-size:10px; text-transform:uppercase; letter-spacing:.05em; color:var(--muted); font-weight:650; margin:8px 0 5px; }
.pos-pay-sec .pos-mini-label:first-of-type { margin-top:0; }
.pos-dp-row .ctrl { width:100%; }
.pos-dp-chips { display:flex; gap:6px; margin-top:8px; }
.pos-dp-chip {
  flex:1; border:1px solid var(--line); background:var(--paper); border-radius:100px; padding:7px 8px;
  font-size:11.5px; font-weight:650; color:var(--graphite); cursor:pointer; transition:border-color .12s, background .12s, color .12s;
}
.pos-dp-chip:hover { border-color:var(--ink); color:var(--ink); }
.pos-dp-chip.active { background:var(--ink); border-color:var(--ink); color:#fff; }
.pos-total-due { margin-top:10px; font-family:var(--font-mono); font-size:12px; font-weight:600; color:#B8B8B4; }
.pos-total-due.is-partial { color:var(--pst-warning-border); }
.pos-total-due.is-paid { color:var(--pst-mint-border); }
.pos-auto-tag { display:inline-block; margin-left:6px; font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; color:var(--muted); border:1px solid var(--line); border-radius:100px; padding:1px 7px; vertical-align:middle; }
.pos-cta { width:100%; justify-content:center; padding:13px; font-size:13.5px; margin-top:6px; }
.pos-cat-tools { display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end; }
.pos-cat-tools .search-box { min-width:190px; }
.pos-cat-tools select {
  padding:9px 30px 9px 12px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); font-size:13px;
  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='%238C8C86' stroke-width='2.5' 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 10px center;
}
/* Instant category picker — chip warna design-system */
.pos-cat-chips { display:flex; flex-wrap:wrap; gap:6px; padding:12px 14px 0; }
.pos-cat-chip {
  display:inline-flex; align-items:center; gap:6px; border:1px solid var(--line); background:var(--paper);
  border-radius:100px; padding:5px 11px; font-size:11.5px; font-weight:650; color:var(--graphite); cursor:pointer;
  transition:border-color .12s, background .12s, color .12s;
}
.pos-cat-chip:hover { border-color:var(--ink); color:var(--ink); }
.pos-cat-chip .pos-cat-dot { width:9px; height:9px; border-radius:3px; background:var(--dot,var(--line)); flex:none; }
.pos-cat-chip.active .pos-cat-dot { display:none; }
.pos-cat-chip.active { font-weight:720; }
.pos-cat-chip em { font-style:normal; font-family:var(--font-mono); font-size:10px; opacity:.7; }
.pos-cat-chip--all.active { background:var(--ink); color:#fff; border-color:var(--ink); }
.pos-product-grid {
  display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:8px; padding:12px 14px 16px;
  border-bottom:1px solid var(--line-soft); max-height:330px; overflow:auto;
}
.pos-prod-group { grid-column:1 / -1; padding:8px 0 2px; }
.pos-product {
  position:relative; min-height:74px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm);
  padding:10px 10px 10px 13px; text-align:left; display:flex; flex-direction:column; justify-content:space-between; gap:8px;
  transition:border-color .14s, background .14s, transform .1s; overflow:hidden;
}
.pos-product::before { content:''; position:absolute; left:0; top:0; bottom:0; width:4px; background:var(--prod-tone,var(--line)); }
.pos-product:hover { border-color:var(--ink); background:var(--paper); }
.pos-product:active { transform:scale(.985); }
.pos-product b { font-size:12.5px; line-height:1.3; }
.pos-product span { font-family:var(--font-mono); font-size:11px; color:var(--graphite); }
.pos-cart { padding:12px 14px 16px; display:grid; gap:10px; }
.pos-line {
  position:relative; display:grid; gap:8px;
  padding:10px 10px 10px 13px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm);
}
.pos-line::before { content:''; position:absolute; left:0; top:0; bottom:0; width:4px; border-radius:var(--r-sm) 0 0 var(--r-sm); background:var(--ln-tone,var(--line)); }
.pos-line .ctrl { padding:8px 9px; font-size:13px; min-width:0; }
.pos-line-main {
  display:grid; grid-template-columns:minmax(150px,1fr) 116px 58px auto 32px;
  gap:7px; align-items:center;
}
.pos-line-name { font-weight:650; }
.pos-line-total { font-family:var(--font-mono); font-size:12px; font-weight:700; text-align:right; white-space:nowrap; }
.pos-line-total small { display:block; margin-top:2px; font-family:var(--font-body); font-size:10px; font-weight:600; color:var(--graphite); white-space:normal; }
.pos-line-del {
  width:32px; height:32px; display:grid; place-items:center; border:1px solid var(--line); border-radius:var(--r-xs);
  background:var(--paper); color:var(--danger); flex:none;
}
.pos-line-del:hover { border-color:var(--danger); }
/* Mini labelled field (pricing & schedule sub-rows) */
.pos-line-mini { display:flex; flex-direction:column; gap:3px; min-width:0; }
.pos-line-mini > span { font-size:9.5px; text-transform:uppercase; letter-spacing:.05em; color:var(--muted); font-weight:650; }
.pos-line-mini .ctrl { width:100%; }
.pos-order-block {
  display:grid; grid-template-columns:auto minmax(120px,1fr) minmax(92px,1fr) minmax(92px,1fr) auto;
  gap:6px; align-items:end; padding:9px 0;
}
.pos-order-block .pos-order-break { grid-column:2 / 4; }
.pos-order-block .pos-order-resource { grid-column:4 / 6; }
.pos-line-pricing { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
/* Rental studio: harga digerakkan durasi (jam) + tier — TANPA kolom qty. */
.pos-line-pricing--flat { grid-template-columns:1fr; }
.pos-line--rental .pos-line-main { grid-template-columns:minmax(150px,1fr) 116px auto 32px; }
.pos-line-sched {
  border-top:1px dashed var(--line); padding-top:9px; display:grid; gap:7px;
}
.pos-line-sched-top { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.pos-line-sched-tag { display:inline-flex; align-items:center; gap:5px; font-size:10.5px; font-weight:650; color:var(--st-tentative); }
.pos-line-sched-fields { display:grid; grid-template-columns:1fr 1fr 110px; gap:8px; align-items:end; }
.pos-line-sched-fields.is-rental { grid-template-columns:1fr 1fr; }
.pos-line-schedoff {
  display:inline-flex; align-items:center; gap:4px; border:none; background:none; cursor:pointer;
  font-size:10.5px; font-weight:600; color:var(--muted); padding:2px 4px; border-radius:var(--r-xs);
}
.pos-line-schedoff:hover { color:var(--danger); }
.pos-line-schedbtn {
  display:inline-flex; align-items:center; gap:6px; align-self:start; width:fit-content;
  border:1px dashed var(--line); background:var(--paper); border-radius:100px; padding:6px 12px;
  font-size:11.5px; font-weight:600; color:var(--graphite); cursor:pointer;
}
.pos-line-schedbtn:hover { border-color:var(--ink); color:var(--ink); border-style:solid; }
/* Work-area tabs (PRD 12.25b) */
.pos-tabs { flex:none; display:flex; gap:2px; padding:0 14px; border-bottom:1px solid var(--line); background:var(--paper); overflow-x:auto; }
.pos-tab { position:relative; display:inline-flex; align-items:center; gap:7px; white-space:nowrap; border:none; background:none; cursor:pointer;
  padding:12px 14px; font-size:12.5px; font-weight:650; color:var(--muted); border-bottom:2px solid transparent; margin-bottom:-1px; transition:color .14s; }
.pos-tab:hover { color:var(--ink); }
.pos-tab.active { color:var(--ink); font-weight:760; border-bottom-color:var(--pos-accent,var(--ink)); }
.pos-tab svg { color:currentColor; }
.pos-tab-badge { font-style:normal; font-family:var(--font-mono); font-size:10px; font-weight:700; min-width:16px; text-align:center;
  background:var(--paper-warm); border:1px solid var(--line); border-radius:100px; padding:1px 6px; color:var(--graphite); }
.pos-tab-badge:empty { display:none; }
.pos-tab.active .pos-tab-badge { background:var(--pos-accent,var(--ink)); border-color:var(--pos-accent,var(--ink)); color:#fff; }
/* Pane refinements: pane scrolls as one surface (no nested catalog scroll) */
.pos-pane .pos-product-grid { max-height:none; overflow:visible; }
.pos-pane[data-pane="pay"] .pos-summary:first-child { margin-top:0; }
/* Status override popup membuka ke atas agar tak ter-clip dasar pane yang men-scroll */
.pos-tabbody .pos-kebab-menu { top:auto; bottom:calc(100% + 6px); }
/* Work footer: total selalu terlihat + CTA lintas-tab */
.pos-workfoot { flex:none; border-top:1px solid var(--line); background:var(--paper); padding:12px 14px; }
.pos-foot-total { display:flex; align-items:baseline; justify-content:space-between; gap:10px; margin-bottom:10px; }
.pos-foot-total-l { display:flex; align-items:baseline; gap:10px; min-width:0; }
.pos-foot-total span { font-size:10.5px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); white-space:nowrap; }
.pos-foot-total strong { font-family:var(--font-mono); font-size:22px; line-height:1; font-weight:800; color:var(--ink); }
.pos-foot-total .pos-total-due { margin:0; font-size:11.5px; text-align:right; white-space:nowrap; }
.pos-workfoot .pos-cta { margin-top:0; }
.pos-workfoot .pos-action-grid { margin-top:8px; grid-template-columns:repeat(5,1fr); }
.pos-check-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.pos-check-grid .frow { margin-bottom:0; }
.pos-summary { border:1px solid var(--line); border-radius:var(--r-sm); overflow:hidden; margin:14px 0; }
.pos-sum-row { display:flex; justify-content:space-between; gap:12px; padding:9px 11px; border-bottom:1px solid var(--line-soft); font-size:12.5px; }
.pos-sum-row:last-child { border-bottom:0; }
.pos-sum-row b { font-family:var(--font-mono); font-size:12px; white-space:nowrap; }
.pos-sum-row.total { background:var(--paper-warm); color:var(--ink); font-weight:760; }
.pos-sum-row.due { background:var(--pst-warning-bg); color:var(--pst-warning-text); font-weight:760; }
.pos-preview-head { display:flex; justify-content:flex-end; margin:12px 0 10px; }
.pos-preview-pane { min-height:240px; max-height:420px; overflow:auto; }
.pos-wa-text {
  margin:0; font-family:var(--font-mono); font-size:11.5px; line-height:1.58; white-space:pre-wrap; word-break:break-word;
  background:var(--paper-warm); border:1px solid var(--line); border-radius:var(--r-sm); padding:12px; color:var(--ink-soft);
}
/* Kartu struk generasi lama — dipertahankan hanya untuk markup lain yang masih
   memakainya TANPA .vs-receipt. Warna kertas kini token (dulu literal #fff).
   Struk kanonik = .vs-receipt (unit DS GUI/19/RECEIPT) di bagian POSDOC-REFRESH. */
.pos-receipt-card { position:relative; overflow:hidden; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--surface-0); padding:18px; }
/* .pos-watermark DIHAPUS: unit DS GUI/19/RECEIPT tidak punya watermark diagonal,
   dan nilainya dulu literal rgba() di luar token. Tidak ada pemakai tersisa. */
.pos-r-head { display:flex; justify-content:space-between; gap:16px; border-bottom:1px solid var(--line); padding-bottom:12px; }
.pos-r-brand { font-size:15px; font-weight:850; }
.pos-r-sub { font-size:11.5px; color:var(--muted); margin-top:2px; }
.pos-r-mode { font-family:var(--font-mono); font-size:11px; font-weight:800; text-transform:uppercase; }
.pos-r-meta { display:grid; grid-template-columns:1fr 1fr; gap:10px; padding:13px 0; border-bottom:1px solid var(--line-soft); }
.pos-r-meta span { display:block; font-size:10px; color:var(--muted); text-transform:uppercase; letter-spacing:.08em; }
.pos-r-meta b { display:block; font-size:12.5px; margin-top:2px; }
.pos-r-items { display:grid; gap:9px; padding:12px 0; border-bottom:1px solid var(--line-soft); }
.pos-r-item { display:flex; justify-content:space-between; gap:12px; }
.pos-r-item b, .pos-r-item strong { font-size:12.5px; }
.pos-r-item span, .pos-r-item small { display:block; font-size:10.8px; color:var(--muted); margin-top:1px; }
.pos-r-empty { color:var(--muted); font-size:12px; }
.pos-r-total { margin-top:10px; }
.pos-r-notes { margin-top:12px; background:var(--paper-warm); border-radius:var(--r-sm); padding:10px; font-size:11.8px; color:var(--graphite); line-height:1.5; }
.pos-r-foot { margin-top:13px; color:var(--muted); font-size:11px; text-align:center; }
.pos-action-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-top:14px; }
.pos-action-grid .abtn { justify-content:center; min-width:0; }
.pos-empty {
  min-height:132px; display:grid; place-items:center; align-content:center; gap:5px; text-align:center;
  color:var(--muted); border:1px dashed var(--line); border-radius:var(--r-sm); padding:18px;
}
.pos-empty b { color:var(--graphite); font-size:13px; }
.pos-empty span { font-size:11.5px; }
/* .pos-history-list / .pos-history-row DIHAPUS bersama modal "Histori Draft POS"
   (ADR D-12b): quotation POS tidak lagi mem-persist ke localStorage, jadi tidak
   ada daftar draft yang perlu digayakan. */

/* ============================================================
   PRD 12.25 — POS Frontend (brand navbar, status chip, identity,
   progressive disclosure, quick-jump). Token-only, additive.
   ============================================================ */
/* Fix: elemen ber-display:grid/flex tetap tunduk pada atribut [hidden] (popover & collapsible). */
.pos-qj-menu[hidden], .pos-kebab-menu[hidden], .pos-config-grid[hidden], .pos-adjust-box[hidden], .pos-detail-grid[hidden] { display:none !important; }
/* Aksen brand per shell (Q4): VS hitam+dot kuning · LUXA hitam mono · NUSSA orange pekat */
.pos-shell { --pos-accent:var(--ink-950); --pos-dot:var(--ink-700); }
.pos-shell[data-pos-brand-active="vs"]    { --pos-accent:var(--ink-950);        --pos-dot:var(--identity-yellow); }
.pos-shell[data-pos-brand-active="luxa"]  { --pos-accent:var(--ink-950);        --pos-dot:var(--ink-900); }
.pos-shell[data-pos-brand-active="nussa"] { --pos-accent:var(--pst-orange-text); --pos-dot:var(--sunset-orange); }

/* Brand Navbar (F0) — spans semua kolom */
.pos-navbar { grid-column:1 / -1; display:flex; align-items:center; justify-content:space-between; gap:14px;
  flex-wrap:wrap; background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md); padding:8px 10px; margin-bottom:2px; }
.pos-nav-brands { display:flex; gap:6px; min-width:0; flex-wrap:wrap; }
.pos-brand-pill { display:inline-flex; align-items:center; gap:8px; border:1px solid var(--line); background:var(--paper);
  border-radius:var(--r-md); padding:7px 13px; cursor:pointer; transition:border-color .14s, background .14s, color .14s; min-height:40px; }
.pos-brand-pill .pos-brand-dot { width:10px; height:10px; border-radius:50%; background:var(--line); flex:none; }
.pos-brand-pill[data-brand="vs"]    .pos-brand-dot { background:var(--identity-yellow); }
.pos-brand-pill[data-brand="luxa"]  .pos-brand-dot { background:var(--ink-900); }
.pos-brand-pill[data-brand="nussa"] .pos-brand-dot { background:var(--sunset-orange); }
.pos-brand-pill .pos-brand-name { font-size:13px; font-weight:740; letter-spacing:-.2px; }
.pos-brand-pill small { font-size:10.5px; color:var(--muted); margin-left:2px; }
.pos-brand-pill:hover:not(.active):not(:disabled) { border-color:var(--ink); }
.pos-brand-pill.active { background:var(--pos-accent); border-color:var(--pos-accent); color:#fff; box-shadow:0 0 0 3px color-mix(in srgb, var(--pos-accent) 18%, transparent); }
.pos-brand-pill.active small { color:rgba(255,255,255,.72); }
.pos-brand-pill.active .pos-brand-dot { box-shadow:0 0 0 2px rgba(255,255,255,.3); }
.pos-brand-pill[data-brand="luxa"].active .pos-brand-dot { background:#fff; }
.pos-brand-pill:disabled { opacity:.4; cursor:not-allowed; }
.pos-nav-tools { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.pos-nav-search { min-width:220px; }
.pos-nav-search input { padding-top:8px; padding-bottom:8px; }
.pos-nav-site { padding:9px 11px; }
/* Quick-jump (F5) */
.pos-qj { position:relative; }
.pos-qj-btn { white-space:nowrap; }
.pos-qj-menu { position:absolute; right:0; top:calc(100% + 6px); z-index:30; min-width:230px; background:var(--paper);
  border:1px solid var(--line); border-radius:var(--r-md); box-shadow:var(--shadow-pop,0 12px 32px rgba(17,18,20,.12)); padding:6px; display:grid; gap:2px; }
.pos-qj-item { display:flex; align-items:center; gap:9px; width:100%; text-align:left; border:none; background:none;
  border-radius:var(--r-sm); padding:9px 10px; font-size:12.5px; color:var(--ink); cursor:pointer; }
.pos-qj-item span { flex:1; }
.pos-qj-item em { font-style:normal; font-size:10px; color:var(--muted); }
.pos-qj-item:hover:not(:disabled) { background:var(--paper-warm); }
.pos-qj-item:disabled { color:var(--muted); cursor:not-allowed; }
.pos-qj-item:disabled svg { opacity:.5; }

/* Queue brand-aware (F1) */
.pos-brand-badge { display:inline-block; font-style:normal; font-size:9.5px; font-weight:740; letter-spacing:.03em;
  border:1px solid var(--line); border-radius:100px; padding:0 6px; margin-right:6px; color:var(--graphite); background:var(--paper-warm); vertical-align:1px; }
.pos-brand-badge[data-brand="vs"]    { box-shadow:inset 3px 0 0 var(--identity-yellow); }
.pos-brand-badge[data-brand="luxa"]  { box-shadow:inset 3px 0 0 var(--ink-900); }
.pos-brand-badge[data-brand="nussa"] { box-shadow:inset 3px 0 0 var(--sunset-orange); }

/* Doc meta: mode segmented + No.Dok chip (F2) */
.pos-docmeta { display:flex; align-items:center; gap:8px; flex-wrap:wrap; justify-content:flex-end; }
.pos-mode-seg .seg-btn { padding:7px 11px; font-size:12px; }
.pos-docnum { display:inline-flex; align-items:center; gap:4px; border:1px solid var(--line); border-radius:var(--r-sm);
  background:var(--paper-warm); padding:2px 4px 2px 9px; }
.pos-docnum-input { border:none; background:none; padding:5px 0; width:160px; font-size:11.5px; color:var(--graphite); }
.pos-docnum-input[readonly] { cursor:default; }
.pos-docnum-input.editing { color:var(--ink); }
.pos-mini-edit { border:none; background:none; color:var(--muted); cursor:pointer; padding:4px; border-radius:6px; display:inline-flex; }
.pos-mini-edit:hover { background:var(--paper); color:var(--ink); }

/* Identity block (F3) */
.pos-ident-wrap { padding:12px 14px; border-bottom:1px solid var(--line-soft); }
.pos-ident { display:flex; align-items:flex-end; gap:12px; flex-wrap:wrap; }
.pos-ident-fields { display:grid; grid-template-columns:1fr 1fr; gap:10px; flex:1; min-width:240px; }
.pos-ident-fields .frow { margin-bottom:0; }
.pos-ident-actions { display:flex; gap:6px; flex-wrap:wrap; }
.pos-ident--linked { padding:11px 13px; border:1px solid var(--pst-mint-border); background:var(--pst-mint-bg); border-radius:var(--r-sm); justify-content:space-between; }
.pos-ident-main { display:flex; align-items:center; gap:10px; flex-wrap:wrap; min-width:0; }
.pos-ident-tag { display:inline-flex; align-items:center; gap:5px; font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--pst-mint-text); }
.pos-ident-main b { font-size:13.5px; }
.pos-ident-main .mono { font-size:12px; color:var(--graphite); }

/* Progressive disclosure (F4) */
.pos-details-toggle, .pos-adjust-toggle { display:flex; align-items:center; gap:9px; width:100%; text-align:left;
  border:none; background:none; cursor:pointer; padding:11px 14px; font-size:12.5px; color:var(--ink); border-bottom:1px solid var(--line-soft); }
.pos-adjust-toggle { border:1px solid var(--line); border-radius:var(--r-sm); padding:10px 12px; margin-bottom:14px; }
.pos-details-toggle b, .pos-adjust-toggle b { font-weight:700; }
.pos-details-sum, .pos-adjust-sum { flex:1; font-size:11px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-family:var(--font-mono); }
.pos-details-toggle svg:last-child, .pos-adjust-toggle svg:last-child { color:var(--muted); transition:transform .16s; }
.pos-details-toggle.open svg:last-child, .pos-adjust-toggle.open svg:last-child { transform:rotate(180deg); }
.pos-adjust-box { margin-top:-8px; margin-bottom:14px; }

/* Status chip (F2/Q3) */
.pos-status-row { display:flex; align-items:center; gap:8px; }
.pos-status-chip { display:inline-flex; align-items:center; gap:6px; border:1px solid var(--line); border-radius:100px;
  padding:5px 11px; font-size:12px; font-weight:680; }
.pos-status-chip em { font-style:normal; font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; opacity:.7; }
.pos-status-chip.is-paid    { background:var(--pst-mint-bg);    border-color:var(--pst-mint-border);    color:var(--pst-mint-text); }
.pos-status-chip.is-partial { background:var(--pst-warning-bg); border-color:var(--pst-warning-border); color:var(--pst-warning-text); }
.pos-status-chip.is-unpaid  { background:var(--pst-neutral-bg); border-color:var(--pst-neutral-border); color:var(--pst-neutral-text); }
.pos-status-chip.is-draft   { background:var(--pst-neutral-bg); border-color:var(--pst-neutral-border); color:var(--pst-neutral-text); }
.pos-status-chip.is-sent    { background:var(--pst-blue-bg);    border-color:var(--pst-blue-border);    color:var(--pst-blue-text); }
.pos-status-chip.is-void    { background:var(--pst-danger-bg);  border-color:var(--pst-danger-border);  color:var(--pst-danger-text); }
.pos-status-more { position:relative; }
.pos-kebab { border:1px solid var(--line); background:var(--paper); border-radius:var(--r-sm); cursor:pointer;
  width:30px; height:30px; font-size:16px; line-height:1; color:var(--graphite); }
.pos-kebab:hover { border-color:var(--ink); color:var(--ink); }
.pos-kebab-menu { position:absolute; right:0; top:calc(100% + 6px); z-index:30; min-width:200px; background:var(--paper);
  border:1px solid var(--line); border-radius:var(--r-md); box-shadow:var(--shadow-pop,0 12px 32px rgba(17,18,20,.12)); padding:6px; display:grid; gap:2px; }
.pos-kebab-menu button { display:flex; align-items:center; gap:9px; width:100%; text-align:left; border:none; background:none;
  border-radius:var(--r-sm); padding:9px 10px; font-size:12.5px; color:var(--ink); cursor:pointer; }
.pos-kebab-menu button:hover { background:var(--paper-warm); }

/* Breakpoints sadar-sidebar: ruang nyata = viewport − sidebar(232) − padding.
   Persempit rail Queue lebih dulu, lalu tumpuk sebelum work-area sesak. */
@media (max-width:1180px) {
  .pos-shell { grid-template-columns:260px minmax(0,1fr); }
  .pos-config-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
  .pos-workfoot .pos-action-grid { grid-template-columns:repeat(3,1fr); }
}
@media (max-width:920px) {
  .pos-shell { grid-template-columns:1fr; }
  .pos-queue, .pos-work { position:static; max-height:none; }
  .pos-tabbody { overflow:visible; }
  .pos-queue-list { grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); }
}
@media (max-width:760px) {
  .content.content--pos { padding:14px 12px 96px; }
  .pos-panel-head, .pos-context, .pos-catalog-head, .pos-cart-head { align-items:flex-start; flex-direction:column; }
  .pos-context-actions, .pos-cat-tools { width:100%; justify-content:stretch; }
  .pos-cat-tools .search-box { width:100%; max-width:none; }
  .pos-config-grid, .pos-check-grid, .pos-r-meta, .pos-action-grid, .pos-workfoot .pos-action-grid { grid-template-columns:1fr 1fr; }
  .pos-line-main { grid-template-columns:1fr 84px 50px 32px; grid-template-areas:"name name name del" "price qty total total"; }
  .pos-line--rental .pos-line-main { grid-template-columns:1fr 84px 32px; grid-template-areas:"name name del" "price total total"; }
  .pos-line-main .pos-line-name { grid-area:name; }
  .pos-line-main .pos-line-price { grid-area:price; }
  .pos-line-main .pos-line-qty { grid-area:qty; }
  .pos-line-main .pos-line-total { grid-area:total; text-align:left; align-self:center; }
  .pos-line-main .pos-line-del { grid-area:del; justify-self:end; }
  .pos-line-sched-fields, .pos-line-sched-fields.is-rental { grid-template-columns:1fr 1fr; }
  .pos-order-block { grid-template-columns:minmax(0,1fr) minmax(0,1fr); }
  .pos-order-block > b { grid-column:1; grid-row:1; align-self:center; }
  .pos-order-block > [data-pos-block-del] { grid-column:2; grid-row:1; justify-self:end; }
  .pos-order-block > .pos-line-mini:nth-of-type(1) { grid-column:1 / -1; }
  .pos-order-block .pos-order-spacer { display:none; }
  .pos-order-block .pos-order-break,
  .pos-order-block .pos-order-resource { grid-column:1 / -1; }
  .pos-product-grid { max-height:none; grid-template-columns:repeat(2,minmax(0,1fr)); }
}

/* ============================================================
   PRD 12.39 — POS System redesign (Claude Design import)
   Additive reskin of the POS surfaces to match "POS System.dc.html".
   Token-only (no global token changes) · selectors mirror the wired
   markup, so logic/event-binding is untouched. Loaded AFTER the base
   POS rules above, so these win by cascade order. Revert = delete block.
   ============================================================ */
.content.content--pos {
  background:var(--app-bg);
  padding:16px 16px 80px;
  /* design semantic aliases mapped onto existing tokens */
  --pos-surface:var(--paper);
  --pos-surface-1:var(--paper-warm);
  --pos-canvas:var(--app-bg);
  --pos-line:var(--line);
  --pos-line-soft:var(--line-soft);
  --pos-strong:var(--ink);
  --pos-body:var(--ink-soft);
  --pos-muted:var(--ink-700);
  --pos-subtle:var(--ink-500);
  --pos-faint:var(--ink-400);
}
/* Per-brand accent rule colour (3px bar atop the work panel) */
.pos-shell { --pos-rule:var(--ink); }
.pos-shell[data-pos-brand-active="vs"]    { --pos-rule:var(--identity-yellow); }
.pos-shell[data-pos-brand-active="luxa"]  { --pos-rule:#3A3A3A; }
.pos-shell[data-pos-brand-active="nussa"] { --pos-rule:var(--brand-nussa-accent); }   /* VER-3 #4 — satu nilai orange */

/* ---- shell + panels ---- */
.pos-shell { gap:16px; }
.pos-queue, .pos-work {
  background:var(--pos-surface); border:1px solid var(--pos-line);
  border-radius:var(--r-md); box-shadow:var(--shadow-card);
}
/* 3-column layout (Booking Queue · Register · Detail+Pembayaran+Dokumen).
   FLUID widths via minmax(0,Nfr) — proportional "%" tracks that always
   shrink to fit the real space (viewport − sidebar 232px − padding), so the
   3rd column can never clip the way the old fixed-px 3-col did. Collapses
   3→2→1 by breakpoint. */
.pos-shell.pos-shell--3col {
  grid-template-columns: minmax(0,1.1fr) minmax(0,1.85fr) minmax(0,1.4fr);
  align-items:start;
}
/* narrow rails: let panel headers wrap their action buttons instead of clipping */
.pos-shell--3col .pos-panel-head,
.pos-shell--3col .pos-context { flex-wrap:wrap; row-gap:9px; }
.pos-shell--3col .pos-queue,
.pos-shell--3col .pos-register,
.pos-shell--3col .pos-detail { top:74px; max-height:calc(100dvh - 90px); }
/* per-column scroll body; detail column keeps its footer pinned */
.pos-colbody { flex:1 1 auto; min-height:0; overflow:auto; }
.pos-detail { display:flex; flex-direction:column; }
.pos-detail .pos-workfoot { flex:none; }
.pos-detail .pos-workfoot .pos-action-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
/* detail column: prominent TOTAL TAGIHAN card pinned at TOP (owner pref —
   biaya langsung terlihat, footer tinggal Simpan + aksi). flex:none so it
   stays above the scrolling body. */
.pos-detail-total { flex:none; margin:13px 14px 2px; padding:14px 17px; background:var(--ink-950); border-radius:var(--r-md); }
.pos-detail-total .pos-foot-total { margin:0; flex-direction:column; align-items:flex-start; gap:6px; }
.pos-detail-total .pos-foot-total-l { flex-direction:column; align-items:flex-start; gap:3px; }
.pos-detail-total .pos-foot-total span { color:rgba(255,255,255,.55); }
.pos-detail-total .pos-foot-total strong { color:#fff; font-size:30px; line-height:1; }
.pos-detail-total .pos-total-due { color:rgba(255,255,255,.78); font-size:11.5px; }
.pos-detail-total .pos-total-due.is-partial { color:var(--pst-warning-border); }
.pos-detail-total .pos-total-due.is-paid { color:var(--pst-mint-border); }
@media (max-width:1200px) {
  .pos-shell.pos-shell--3col { grid-template-columns: minmax(0,1fr) minmax(0,1.55fr); }
  .pos-shell--3col .pos-detail { grid-column:1 / -1; position:static; max-height:none; }
}
@media (max-width:900px) {
  .pos-shell.pos-shell--3col { grid-template-columns:1fr; }
  .pos-shell--3col .pos-queue,
  .pos-shell--3col .pos-register { position:static; max-height:none; }
  .pos-shell--3col .pos-detail { grid-column:auto; }
  /* queue full-width → cards flow into a responsive grid instead of stretching */
  .pos-shell--3col .pos-queue-list { grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); }
}
/* brand accent rule — pseudo first flex child, zero markup change */
.pos-work::before {
  content:''; flex:none; height:3px; background:var(--pos-rule);
  border-radius:var(--r-md) var(--r-md) 0 0;
}

/* ---- panel heads ---- */
.pos-panel-head, .pos-context, .pos-catalog-head, .pos-cart-head {
  padding:15px 16px; border-bottom:1px solid var(--pos-line-soft);
}
.pos-panel-head h2, .pos-context h2, .pos-catalog-head h2, .pos-cart-head h2 {
  font-family:var(--font-head); font-weight:700; font-size:15px; letter-spacing:-.01em;
}
.pos-panel-head span, .pos-context span, .pos-catalog-head span, .pos-cart-head span {
  font-size:11.5px; color:var(--pos-subtle);
}
.pos-context-id { font-family:var(--font-mono); font-size:10px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--pos-faint); margin-bottom:4px; }

/* ---- booking queue — structured card (header · meta grid · footer) ---- */
.pos-queue-list { gap:9px; padding:10px; }
/* header: client name + brand badge */

/* meta grid: id (mono) · layanan · jadwal — each on its own line with an icon */

/* footer: status badge + payment, divided from the meta above */


/* ---- brand navbar → full-gradient identity banner + segmented switcher ---- */
.pos-navbar {
  flex-direction:column; align-items:stretch; gap:0; padding:0; overflow:hidden;
  border-radius:var(--r-md); border-color:var(--pos-line); box-shadow:var(--shadow-card);
}
/* Gradient identity band — brand grad tokens from DS (12.34.A palette) */
.pos-nav-banner {
  display:flex; align-items:center; justify-content:space-between; gap:14px 18px; flex-wrap:wrap;
  padding:15px 18px; color:#fff; position:relative; isolation:isolate;
  background:var(--brand-vs-grad); transition:background .35s ease;
}
.pos-navbar[data-brand="vs"]    .pos-nav-banner { background:var(--brand-vs-grad); }
.pos-navbar[data-brand="luxa"]  .pos-nav-banner { background:var(--brand-luxa-grad); }
.pos-navbar[data-brand="nussa"] .pos-nav-banner { background:var(--brand-nussa-grad); }
/* soft top-right sheen for depth */
.pos-nav-banner::after { content:''; position:absolute; inset:0; z-index:-1; pointer-events:none;
  background:radial-gradient(120% 150% at 90% -20%, rgba(255,255,255,.22), rgba(255,255,255,0) 55%); }
.pos-nav-identity { display:flex; align-items:center; gap:13px; min-width:0; }
.pos-nav-crest { width:42px; height:42px; border-radius:13px; display:grid; place-items:center; flex:none;
  background:rgba(255,255,255,.15); border:1px solid rgba(255,255,255,.32); }
.pos-nav-crest-dot { width:15px; height:15px; border-radius:50%; background:#fff; box-shadow:0 0 0 4px rgba(255,255,255,.22); }
.pos-navbar[data-brand="vs"]    .pos-nav-crest-dot { background:var(--identity-yellow); }
.pos-navbar[data-brand="nussa"] .pos-nav-crest-dot { background:#fff; }
.pos-nav-idtext { display:flex; flex-direction:column; min-width:0; }
.pos-nav-brandname { font-family:var(--font-head); font-weight:800; font-size:18px; line-height:1.05;
  letter-spacing:.01em; text-transform:uppercase; color:#fff; text-shadow:0 1px 12px rgba(0,0,0,.3);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-nav-tagline { font-size:11.5px; font-weight:500; letter-spacing:.01em; margin-top:3px;
  color:rgba(255,255,255,.9); text-shadow:0 1px 8px rgba(0,0,0,.26);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* switcher pills — frosted glass on the gradient */
.pos-nav-banner .pos-nav-brands { gap:5px; padding:4px; flex-wrap:nowrap; align-items:center;
  background:rgba(255,255,255,.14); border:1px solid rgba(255,255,255,.26); border-radius:var(--r-sm); }
.pos-nav-banner .pos-brand-pill { border:1px solid transparent; background:transparent; border-radius:var(--r-xs);
  padding:7px 13px; min-height:34px; gap:7px; color:rgba(255,255,255,.92); transition:background .16s, color .16s, box-shadow .16s; }
.pos-nav-banner .pos-brand-pill .pos-brand-dot { width:9px; height:9px; background:rgba(255,255,255,.8); box-shadow:none; }
.pos-nav-banner .pos-brand-pill .pos-brand-name { font-size:12.5px; font-weight:700; color:inherit; }
.pos-nav-banner .pos-brand-pill small { display:none; }
.pos-nav-banner .pos-brand-pill:hover:not(.active):not(:disabled) { background:rgba(255,255,255,.18); color:#fff; }
.pos-nav-banner .pos-brand-pill.active { background:#fff; border-color:#fff; color:var(--ink); box-shadow:0 4px 14px rgba(0,0,0,.2); }
.pos-nav-banner .pos-brand-pill.active[data-brand="vs"]    .pos-brand-dot { background:var(--identity-yellow); box-shadow:0 0 0 1.5px rgba(5,5,5,.12); }
.pos-nav-banner .pos-brand-pill.active[data-brand="luxa"]  .pos-brand-dot { background:var(--ink-900); }
.pos-nav-banner .pos-brand-pill.active[data-brand="nussa"] .pos-brand-dot { background:var(--sunset-orange); }
.pos-nav-banner .pos-brand-pill:disabled { opacity:.5; cursor:not-allowed; }
.pos-nav-lock { display:inline-flex; align-items:center; gap:4px; align-self:center; margin-left:4px;
  font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; color:rgba(255,255,255,.85); }
/* tools row — plain surface below the band */
.pos-nav-tools { padding:10px 14px; gap:8px; background:var(--pos-surface); }
.pos-nav-search { flex:1 1 auto; min-width:160px; max-width:none; }
.pos-nav-search input { background:var(--pos-surface-1); }
@media (max-width:560px) {
  .pos-nav-banner { flex-direction:column; align-items:stretch; gap:12px; }
  .pos-nav-banner .pos-nav-brands { width:100%; }
  .pos-nav-banner .pos-brand-pill { flex:1 1 0; justify-content:center; }
}

/* ---- work header: doc meta + status ---- */
.pos-work-head { background:var(--pos-surface); }
.pos-docnum { border-radius:var(--r-xs); background:var(--pos-surface-1); border-color:var(--pos-line); }
.pos-status-chip { border-radius:var(--r-pill,100px); font-weight:680; }
.pos-kebab { border-radius:var(--r-xs); }

/* ---- identity: linked customer card (success) + walk-in ---- */
.pos-ident-wrap { padding:14px 16px; }
.pos-ident--linked {
  padding:12px 14px; border-radius:var(--r-md);
  border-color:var(--pst-success-border); background:var(--pst-success-bg);
}
.pos-ident-tag { color:var(--pst-success-text); }
.pos-ident-main b { font-family:var(--font-head); font-size:16px; font-weight:700; }

/* ---- progressive disclosure toggles ---- */
.pos-details-toggle, .pos-adjust-toggle {
  border:1px solid var(--pos-line); border-radius:var(--r-sm);
  background:var(--pos-surface); margin:14px 16px; padding:11px 14px; width:auto;
}
.pos-pane[data-pane="items"] .pos-details-toggle { margin:14px 16px 0; }
.pos-details-toggle b, .pos-adjust-toggle b { font-weight:650; }
/* Register field grid — auto-fit tracks so every field keeps a consistent
   width and reflows 1→N columns responsively (overrides the fixed 3/2-col
   base rules above via source order). */
.pos-config-grid { grid-template-columns:repeat(auto-fit,minmax(158px,1fr)); padding:0 16px 14px; border-bottom:none; gap:12px 13px; align-items:end; }
.pos-config-grid .frow { display:flex; flex-direction:column; gap:5px; margin-bottom:0; min-width:0; }
.pos-config-grid .frow label { font-size:10.5px; font-weight:650; text-transform:uppercase; letter-spacing:.04em; color:var(--pos-subtle); }
.pos-config-grid .frow .ctrl { width:100%; }
.pos-config-grid .frow .fhint { font-size:10px; line-height:1.4; color:var(--pos-faint); }
.pos-pane[data-pane="items"] .pos-config-grid { padding:14px 16px; margin:0 16px 4px; border:1px solid var(--pos-line); border-radius:var(--r-md); }
/* identity fields keep the same consistent min-width so name/phone line up
   with the advanced-detail grid above them */
.pos-ident-fields { grid-template-columns:repeat(auto-fit,minmax(158px,1fr)); }

/* ---- category chips (hirarki: utama dulu · pemisah Add-on) ---- */
.pos-cat-chips { padding:12px 16px 4px; gap:8px; align-items:center; }
.pos-cat-chip { border-radius:100px; border-color:var(--pos-line); font-weight:600; }
.pos-cat-chip:hover { background:var(--pos-surface-1); }
.pos-cat-sep { display:inline-flex; align-items:center; gap:4px; margin:0 2px; padding-left:8px;
  border-left:1px solid var(--pos-line); font-size:10px; font-weight:700; text-transform:uppercase;
  letter-spacing:.06em; color:var(--pos-faint); white-space:nowrap; }
.pos-cat-sep svg { color:var(--pos-faint); }

/* ---- catalog product cards ---- */
.pos-product-grid {
  grid-template-columns:repeat(auto-fill,minmax(168px,1fr)); gap:10px;
  padding:8px 16px 16px; border-bottom:none;
}
.pos-prod-group {
  grid-column:1 / -1; display:flex; align-items:center; gap:9px; padding:10px 0 2px;
}
.pos-prod-group::after { content:''; flex:1; height:1px; background:var(--pos-line-soft); }
/* add-on group heading + cards: quieter tone so main packages read first */
.pos-prod-kind { display:inline-flex; align-items:center; gap:4px; flex:none; padding:2px 8px;
  border:1px dashed var(--pos-line); border-radius:100px; font-size:9.5px; font-weight:700;
  text-transform:uppercase; letter-spacing:.05em; color:var(--pos-subtle); }
.pos-prod-group.is-addon { padding-top:14px; }
.pos-product.is-addon { min-height:70px; background:var(--pos-surface-1); }
.pos-product.is-addon::after { content:'+ Add-on'; }
.pos-product {
  min-height:82px; padding:13px 13px 30px; gap:9px; border-radius:var(--r-md);
  background:var(--pos-surface); border-color:var(--pos-line); justify-content:space-between;
}
.pos-product::before { width:3px; opacity:.85; }
.pos-product:hover { background:var(--pos-surface); border-color:var(--ink); box-shadow:var(--shadow-card); transform:translateY(-1px); }
.pos-product b { font-size:13.5px; font-weight:600; color:var(--pos-strong); }
.pos-product span { font-size:13px; font-weight:600; color:var(--pos-strong); }
/* "+ Tambah" affordance via pseudo (no markup change), pinned bottom-right */
.pos-product::after {
  content:'+ Tambah'; position:absolute; right:13px; bottom:11px;
  font-family:var(--font-body); font-size:11px; font-weight:600; color:var(--pos-subtle);
}

/* ---- cart / line items ---- */
.pos-cart { padding:14px 16px 18px; gap:10px; }
.pos-line { border-radius:var(--r-md); border-color:var(--pos-line); background:var(--pos-surface); padding:12px 12px 12px 15px; }
.pos-line:hover { border-color:var(--pos-line); box-shadow:var(--shadow-card); }
.pos-line-name { font-weight:600; }
.pos-line-total { font-size:13px; }
/* B2: schedule fields reflow consistently (Tanggal · Jam mulai · Durasi · Selesai) */
.pos-line-sched-fields, .pos-line-sched-fields.is-rental { grid-template-columns:repeat(auto-fit,minmax(118px,1fr)); align-items:end; }
/* B2: compact duration stepper [-] [input] [+] — joined segmented control */
.pos-stepper { display:flex; align-items:stretch; }
.pos-stepper .ctrl, .pos-stepper .vs-field__control { flex:1 1 auto; min-width:0; text-align:center; border:0; border-radius:0; box-shadow:none; }
.pos-step { flex:none; width:30px; display:grid; place-items:center; cursor:pointer; color:var(--ink);
  border:1px solid var(--pos-line); background:var(--pos-surface); -webkit-tap-highlight-color:transparent; }
.pos-step:first-child { border-radius:var(--r-xs) 0 0 var(--r-xs); }
.pos-step:last-child { border-radius:0 var(--r-xs) var(--r-xs) 0; }
.pos-step:hover { border-color:var(--ink); color:var(--ink); position:relative; z-index:1; }
.pos-step:active { background:var(--pos-surface-1); transform:scale(.95); }
/* B2: auto-computed end time — read-only badge */
.pos-line-endwrap { min-width:0; }
.pos-line-endtime { display:flex; align-items:center; gap:5px; min-height:36px; padding:8px 10px;
  border:1px dashed var(--pos-line); border-radius:var(--r-sm); background:var(--pos-surface-1);
  font-family:var(--font-mono); font-size:13px; font-weight:700; color:var(--pos-strong); }
.pos-line-endtime.is-empty::before { content:'—'; color:var(--pos-faint); font-weight:600; }

/* ---- work tabs (underline) ---- */
.pos-tabs { padding:0 16px; gap:4px; border-bottom:1px solid var(--pos-line); }
.pos-tab { padding:13px 14px; font-size:13px; }
.pos-tab.active { border-bottom-color:var(--ink); }
.pos-tab-badge { border-radius:100px; }

/* ---- payment summary card ---- */
.pos-pay-sec { border-radius:var(--r-md); background:var(--pos-surface); border-color:var(--pos-line); padding:14px; }
.pos-pay-methods button { border-radius:var(--r-sm); padding:11px 8px; font-weight:600; }
.pos-pay-methods button.active { background:var(--ink); border-color:var(--ink); }
.pos-dp-chip { border-radius:var(--r-sm); padding:10px 8px; }
.pos-dp-chip.active { background:var(--ink); border-color:var(--ink); }
.pos-summary { border-radius:var(--r-md); border-color:var(--pos-line); box-shadow:var(--shadow-card); }
.pos-sum-row { padding:11px 14px; font-size:13.5px; }
.pos-sum-row.total {
  background:transparent; border-top:1px solid var(--pos-line);
  font-family:var(--font-head); font-weight:800;
}
.pos-sum-row.total span { font-size:14px; }
.pos-sum-row.total b { font-family:var(--font-head); font-size:19px; }
/* remaining-balance highlighted box */
.pos-sum-row.due {
  margin:10px 12px 12px; border-radius:var(--r-sm); border:1px solid var(--pst-warning-border);
  background:var(--pst-warning-bg); padding:11px 13px; font-weight:700;
}
.pos-sum-row.due b { font-size:15px; }

/* ---- document tab preview ---- */
/* Dibatasi ke kartu struk LAMA (`:not(.vs-receipt)`) — dulu selektornya menyebut
   .pos-watermark yang sudah dihapus, dan `> *` di sini lebih spesifik daripada
   aturan .vs-receipt sehingga akan diam-diam mengembalikan margin samping ke
   struk kanonik. Batasi di selektornya, jangan diadu spesifisitas. */
.pos-receipt-card:not(.vs-receipt) { border-radius:var(--r-md); box-shadow:var(--shadow-card); padding:0; }
.pos-receipt-card:not(.vs-receipt)::before { content:''; display:block; height:4px; background:var(--pos-rule); }
.pos-receipt-card:not(.vs-receipt) > * { margin-left:22px; margin-right:24px; }
.pos-r-head { padding-top:20px; }
.pos-r-brand { font-family:var(--font-head); font-weight:800; font-size:18px; letter-spacing:-.01em; }
.pos-r-foot { margin-bottom:20px; }
.pos-wa-text { border-radius:var(--r-md); background:var(--ink-050,var(--paper-warm)); }

/* ---- cross-tab footer ---- */
.pos-workfoot { padding:13px 16px; }
.pos-foot-total strong { font-family:var(--font-head); font-size:24px; }
.pos-cta { border-radius:var(--r-sm); font-weight:650; }

/* ---- B3: pos-detail — grid rapi · hint kecil · accordion dokumen ---- */
/* hint text lebih kecil agar tidak memakan ruang di kolom detail */
.pos-detail .fhint { font-size:10px; line-height:1.42; color:var(--pos-faint); margin-top:5px; }
.pos-detail .pos-total-due { font-size:11px; }
.pos-detail .pos-mini-label { font-size:9.5px; }
/* metode bayar & chip DP → grid lebar sama */
.pos-detail .pos-pay-methods { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; }
.pos-detail .pos-dp-chips { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:6px; }
.pos-detail .pos-dp-chip { flex:none; }
.pos-detail .pos-check-grid { grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); }
/* accordion "Catatan & preview dokumen" — mirror gaya toggle lain */
.pos-doc-toggle { display:flex; align-items:center; gap:9px; width:auto; text-align:left; cursor:pointer;
  border:1px solid var(--pos-line); border-radius:var(--r-sm); background:var(--pos-surface);
  margin:2px 16px 12px; padding:11px 14px; font-size:12.5px; color:var(--ink); }
.pos-doc-toggle b { font-weight:650; }
.pos-doc-sum { flex:1; font-size:11px; color:var(--pos-subtle); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-doc-toggle svg:last-child { color:var(--muted); transition:transform .16s; }
.pos-doc-toggle.open svg:last-child { transform:rotate(180deg); }
.pos-doc-toggle:hover { border-color:var(--ink); }
.pos-doc-body { padding-top:0; }

/* ---- popovers / quick-jump ---- */
.pos-qj-menu, .pos-kebab-menu { border-radius:var(--r-md); box-shadow:var(--shadow-pop); }
.pos-qj-item, .pos-kebab-menu button { border-radius:var(--r-sm); }

/* ═══════════════════════════════════════════════════════════════════════
   PRD 12.37 — POS REFRESH (prototype "POS System.dc.html", Claude Design)
   Additive override layer di atas reskin 12.39. Loaded PALING AKHIR di
   region POS → menang cascade. CSS-only: cermin markup ter-wire, nol ubah
   logic/handler/id. Token DS v2.0 (bridge di app.css). Revert = hapus blok.
   ═══════════════════════════════════════════════════════════════════════ */
/* Per-brand accent + gradient mengalir ke crest, top-strip & hero total */
.pos-shell.pos-shell--3col { gap:14px; }
.pos-shell[data-pos-brand-active="vs"]    { --brand-accent:var(--brand-vs-accent);    --brand-gradient:var(--brand-vs-grad); }
.pos-shell[data-pos-brand-active="luxa"]  { --brand-accent:var(--brand-luxa-accent);  --brand-gradient:var(--brand-luxa-grad); }
.pos-shell[data-pos-brand-active="nussa"] { --brand-accent:var(--brand-nussa-accent); --brand-gradient:var(--brand-nussa-grad); }
.content.content--pos { background:var(--canvas); }

/* ── Navbar → bar putih bersih + strip aksen 3px + crest hitam (prototype) ── */
.pos-navbar { position:relative; background:var(--surface-0); border-color:var(--border-default); }
.pos-navbar::before { content:''; display:block; height:3px; background:var(--brand-accent); }
.pos-nav-banner,
.pos-navbar[data-brand="vs"]    .pos-nav-banner,
.pos-navbar[data-brand="luxa"]  .pos-nav-banner,
.pos-navbar[data-brand="nussa"] .pos-nav-banner { background:var(--surface-0); color:var(--text-strong); padding:13px 16px; }
.pos-nav-banner::after { display:none; }
.pos-nav-crest { background:var(--vs-black); border:0; border-radius:var(--radius-sm); width:44px; height:44px; box-shadow:var(--shadow-xs); }
.pos-nav-crest-dot { box-shadow:none; }
.pos-navbar[data-brand="vs"]    .pos-nav-crest-dot { background:var(--brand-accent); }
.pos-navbar[data-brand="luxa"]  .pos-nav-crest-dot,
.pos-navbar[data-brand="nussa"] .pos-nav-crest-dot { background:#fff; }
.pos-nav-brandname { color:var(--text-strong); text-shadow:none; font-size:16px; letter-spacing:-.01em; }
.pos-nav-tagline { color:var(--text-subtle); text-shadow:none; font-family:var(--font-mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; }
.pos-nav-banner .pos-nav-brands { background:var(--surface-1); border:1px solid var(--border-default); border-radius:var(--radius-pill); padding:4px; gap:4px; }
.pos-nav-banner .pos-brand-pill { color:var(--text-muted); border-radius:var(--radius-pill); }
.pos-nav-banner .pos-brand-pill .pos-brand-dot { background:var(--ink-300); }
.pos-nav-banner .pos-brand-pill .pos-brand-name { color:inherit; }
.pos-nav-banner .pos-brand-pill:hover:not(.active):not(:disabled) { background:var(--surface-0); color:var(--text-strong); }
.pos-nav-banner .pos-brand-pill.active { background:var(--vs-black); border-color:var(--vs-black); color:#fff; box-shadow:none; }
.pos-nav-banner .pos-brand-pill.active .pos-brand-name { color:#fff; }
.pos-nav-banner .pos-brand-pill.active .pos-brand-dot { box-shadow:0 0 0 1.5px rgba(255,255,255,.25); }
.pos-nav-lock { color:var(--text-subtle); }
.pos-nav-tools { border-top:1px solid var(--line-100); background:var(--surface-0); }
.pos-nav-search input { background:var(--surface-1); }

/* ── Total hero → gradient brand ekspresif + angka tabular besar (prototype) ── */
.pos-detail-total { background:var(--brand-gradient); border-radius:var(--radius-md); box-shadow:var(--shadow-card);
  position:relative; overflow:hidden; padding:16px 18px; }
.pos-detail-total .pos-foot-total span { color:rgba(255,255,255,.6); font-family:var(--font-mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; }
.pos-detail-total .pos-foot-total strong { color:#fff; font-size:34px; letter-spacing:-.02em; line-height:1.02; font-variant-numeric:tabular-nums; }
.pos-detail-total .pos-total-due { color:rgba(255,255,255,.72); font-family:var(--font-mono); font-size:11.5px; }
.pos-detail-total__ico { position:absolute; top:16px; right:18px; width:30px; height:30px; border-radius:var(--radius-xs);
  display:grid; place-items:center; background:rgba(255,255,255,.12); color:#fff; }
.pos-detail-total__ico svg { width:16px; height:16px; }

/* ── Kartu & permukaan → token DS v2.0 (radius/shadow/border konsisten) ── */
.pos-queue, .pos-work { border-color:var(--border-default); box-shadow:var(--shadow-card); }
.pos-product { border-radius:var(--radius-sm); background:var(--surface-0); }
.pos-product:hover { border-color:var(--vs-black); box-shadow:var(--shadow-card); }
.pos-line { border-radius:var(--radius-sm); background:var(--surface-0); }

/* ── Chip kategori, tombol Add-item aksen, segmented & ringkasan ── */
.pos-cat-chip { border-radius:var(--radius-pill); border-color:var(--border-default); }
.pos-cat-chip.active { background:var(--vs-black); color:#fff; border-color:var(--vs-black); }
.pos-cat-chip.active .pos-cat-dot { display:none; }
.pos-mode-seg .seg-btn.active { background:var(--surface-0); color:var(--text-strong); box-shadow:var(--shadow-xs); }
.pos-sum-row.total { background:var(--surface-1); color:var(--text-strong); }
.pos-sum-row.due { background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.pos-cta.abtn--dark { background:var(--vs-black); border-radius:var(--radius-sm); }
.pos-cta.abtn--dark:hover { background:var(--primary-hover); }

/* ═══ 12.37 REFRESH — adaptasi struktur/workflow prototype (kartu + modal) ═══ */
/* Kolom Register & Checkout jadi TRANSPARAN → kartu mengambang di kanvas (Queue tetap 1 panel) */
.pos-shell--3col .pos-register,
.pos-shell--3col .pos-detail { background:transparent; border:0; box-shadow:none; border-radius:0; }
.pos-register::before, .pos-detail::before { display:none; }
.pos-reg-body { display:flex; flex-direction:column; gap:14px; padding:2px; }
.pos-shell--3col .pos-detail { gap:13px; }
.pos-detail .pos-detail-total { margin:2px 2px 0; }
.pos-detail .pos-colbody { display:flex; flex-direction:column; gap:13px; padding:2px; }

/* Kartu dasar */
.pos-card { background:var(--surface-0); border:1px solid var(--border-default); border-radius:var(--radius-md); box-shadow:var(--shadow-card); padding:16px; }
.pos-card__head { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:12px; }
.pos-detail-sum { font-size:11.5px; color:var(--text-subtle); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }

/* Context card */
.pos-ctxcard { display:flex; align-items:flex-start; justify-content:space-between; gap:16px; flex-wrap:wrap; }
.pos-ctxcard__main { min-width:0; flex:1 1 210px; }
.pos-ctxcard .pos-context-id { font-size:11px; color:var(--text-muted); }
.pos-ctxcard__name { font-family:var(--font-display); font-weight:800; font-size:24px; letter-spacing:-.02em; line-height:1.05; color:var(--text-strong); margin:8px 0 12px; }
.pos-ctxcard .pos-mode-seg { display:inline-flex; }
.pos-ctxcard__meta { display:flex; flex-direction:column; align-items:flex-end; gap:8px; flex:0 0 auto; }
.pos-ctxcard__meta .pos-mini-label { margin:0; }
.pos-ctxcard .pos-context-actions { display:flex; gap:7px; margin-top:2px; }

/* Identitas + Detail grid */
.pos-cardgrid { display:grid; grid-template-columns:repeat(auto-fit,minmax(236px,1fr)); gap:14px; }
.pos-identcard .pos-ident-wrap { padding:0; border:0; margin-top:12px; }
.pos-detailcard .pos-config-grid { padding:0; border:0; margin:0; grid-template-columns:1fr 1fr; }

/* Cart card */
.pos-cartcard { padding:0; overflow:hidden; }
.pos-cartcard .pos-cart-head { padding:14px 16px; border-bottom:1px solid var(--line-100); }
.pos-cart-head__l { display:flex; align-items:center; gap:9px; min-width:0; }
.pos-cart-head__l h2 { font-family:var(--font-display); font-weight:700; font-size:15px; color:var(--text-strong); }
.pos-cart-ico { width:32px; height:32px; border-radius:var(--radius-xs); background:var(--vs-black); color:#fff; display:grid; place-items:center; flex:none; }
.pos-cart-actions { display:flex; gap:8px; flex:none; }
.pos-cartcard .pos-cart { padding:12px 14px 16px; }
.pos-addbtn { display:inline-flex; align-items:center; gap:7px; height:38px; padding:0 16px; border:0; border-radius:var(--radius-sm); background:var(--brand-accent); color:var(--brand-accent-ink); font-family:var(--font-body); font-size:13px; font-weight:700; cursor:pointer; box-shadow:var(--shadow-identity); white-space:nowrap; }
.pos-addbtn:hover { filter:brightness(.96); }

/* Summary card + method summary */
.pos-sumcard .pos-summary { margin:12px 0 0; }
.pos-sum-actions { display:flex; gap:8px; margin-top:14px; }
.pos-sum-actions .abtn { flex:1; justify-content:center; height:40px; min-width:0; }
.pos-method-summary { display:flex; align-items:center; gap:9px; margin-top:12px; padding:10px 12px; border-radius:var(--radius-sm); background:var(--surface-1); border:1px solid var(--border-default); }
.pos-method-ico { width:30px; height:30px; border-radius:var(--radius-xs); background:var(--vs-black); color:#fff; display:grid; place-items:center; flex:none; }
.pos-method-txt { flex:1; min-width:0; }
.pos-method-txt b { display:block; font-size:12.5px; color:var(--text-strong); }
.pos-method-txt span { font-size:11px; color:var(--text-subtle); }
.pos-method-dp { text-align:right; flex:none; }
.pos-method-dp b { font-family:var(--font-mono); font-size:13px; color:var(--text-strong); }

/* Status card */
.pos-statuscard .pos-status-row { display:flex; align-items:center; justify-content:space-between; gap:10px; }
.pos-statuscard__chip { margin-top:9px; }

/* Doc toggle & footer di kolom transparan → beri permukaan sendiri */
.pos-detail .pos-doc-toggle { margin:0 2px; background:var(--surface-0); border:1px solid var(--border-default); border-radius:var(--radius-md); box-shadow:var(--shadow-card); }
.pos-detail .pos-doc-body { background:var(--surface-0); border:1px solid var(--border-default); border-top:0; border-radius:0 0 var(--radius-md) var(--radius-md); margin:-6px 2px 0; padding:12px 14px; }
.pos-detail .pos-workfoot { background:transparent; border-top:0; padding:6px 2px 2px; }

/* Modal overlay (katalog / penyesuaian / pembayaran) */
html.pos-modal-open, body.pos-modal-open { overflow:hidden; }
.pos-modal { position:fixed; inset:0; z-index:1200; display:flex; align-items:center; justify-content:center; padding:24px;
  background:rgba(5,5,5,.42); backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px); animation:posmodal-fade .14s ease; }
.pos-modal[hidden] { display:none !important; }
.pos-modal__card { width:min(560px,100%); max-height:86vh; display:flex; flex-direction:column; background:var(--surface-0);
  border-radius:var(--radius-lg); box-shadow:var(--shadow-pop); overflow:hidden; animation:posmodal-pop .16s ease; }
.pos-modal__card--wide { width:min(900px,100%); height:min(720px,86vh); }
.pos-modal__head { display:flex; align-items:center; gap:14px; padding:16px 20px; border-bottom:1px solid var(--line-100); }
.pos-modal__title { flex:1; min-width:0; }
.pos-modal__title b { display:block; font-family:var(--font-display); font-weight:800; font-size:18px; color:var(--text-strong); }
.pos-modal__title span { font-size:12px; color:var(--text-subtle); }
.pos-modal__search { width:260px; max-width:42%; flex:none; }
.pos-modal__x { width:40px; height:40px; flex:none; display:grid; place-items:center; border:1px solid var(--border-input); border-radius:var(--radius-xs); background:var(--surface-0); color:var(--text-muted); cursor:pointer; }
.pos-modal__x:hover { background:var(--surface-1); }
.pos-modal__body { padding:18px 20px; display:flex; flex-direction:column; gap:8px; overflow-y:auto; }
.pos-modal__scroll { padding:16px 20px; overflow-y:auto; flex:1 1 auto; min-height:0; }
.pos-modal__card--wide .pos-cat-chips { padding:14px 20px; border-bottom:1px solid var(--line-100); margin:0; }
.pos-modal__card--wide .pos-product-grid { max-height:none; border:0; padding:0; grid-template-columns:repeat(3,1fr); overflow:visible; }
.pos-modal__foot { padding:0 20px 18px; }
.pos-modal__foot .abtn { width:100%; justify-content:center; height:46px; }
@keyframes posmodal-fade { from{opacity:0} to{opacity:1} }
@keyframes posmodal-pop { from{transform:translateY(8px) scale(.99);opacity:0} to{transform:none;opacity:1} }
@media (prefers-reduced-motion:reduce){ .pos-modal, .pos-modal__card { animation:none; } }

/* ═══ 12.37 REVISI layout — navbar dihapus, switcher→header, queue tools, kompak ═══ */
/* Brand switcher header — gradient hologram per brand + thumb geser (slide); ukuran ringkas */
.pos-hdr-brands { --brandc:var(--identity-yellow); --brand-ink:rgba(24,24,16,.60);
  position:relative; display:inline-flex; align-items:center; justify-content:center; gap:6px; padding:5px 11px; isolation:isolate; overflow:hidden;
  /* Lebar DIKUNCI (widest = brand-name terpanjang aktif) → ganti brand tak mengubah lebar,
     jadi switcher absolut-tengah tak "loncat" (translate -50% stabil). */
  width:322px; box-sizing:border-box;
  border:1px solid rgba(255,255,255,.14); border-radius:var(--radius-pill);
  background:
    radial-gradient(130% 170% at 78% 50%, color-mix(in srgb, var(--brandc) 55%, transparent) 0%, transparent 70%),
    linear-gradient(100deg, color-mix(in srgb, var(--brandc) 60%, #2c2c26) 0%, color-mix(in srgb, var(--brandc) 92%, #fff 6%) 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.10), 0 4px 14px -8px rgba(0,0,0,.55);
  transition:background .45s ease; }
.pos-hdr-brands[data-active-brand="vs"]    { --brandc:var(--identity-yellow); --brand-ink:rgba(24,24,16,.60); }
.pos-hdr-brands[data-active-brand="luxa"]  { --brandc:#3a3a40;                --brand-ink:rgba(255,255,255,.60); }
.pos-hdr-brands[data-active-brand="nussa"] { --brandc:var(--sunset-orange);   --brand-ink:rgba(28,14,8,.62); }
/* Lapisan hologram: pita cahaya lembut yang bergerak pelan */
.pos-hdr-brands::before { content:""; position:absolute; inset:-40% -20%; z-index:0; pointer-events:none; mix-blend-mode:screen; opacity:.5;
  background:linear-gradient(115deg, transparent 30%, rgba(255,255,255,.45) 48%, rgba(180,220,255,.28) 54%, transparent 70%);
  background-size:220% 100%; animation:posHolo 7s linear infinite; }
@keyframes posHolo { 0%{background-position:180% 0} 100%{background-position:-60% 0} }
/* Thumb putih yang menggeser ke pill aktif (posisi diukur via JS) */
.pos-hdr-brands__thumb { position:absolute; z-index:1; top:3px; bottom:3px; left:0; width:0; opacity:0; border-radius:var(--radius-pill);
  background:linear-gradient(180deg, #fff, #f4f4f2); box-shadow:0 2px 8px rgba(0,0,0,.18), inset 0 0 0 1px rgba(255,255,255,.6);
  transform:translateX(0); transition:transform .34s cubic-bezier(.22,.61,.36,1), width .34s cubic-bezier(.22,.61,.36,1); }
.pos-hdr-brands .pos-brand-pill { position:relative; z-index:2; display:inline-flex; align-items:center; gap:7px; height:30px; padding:0 15px; border:0; background:transparent; border-radius:var(--radius-pill); color:var(--brand-ink); font-family:var(--font-body); font-size:11.5px; font-weight:700; letter-spacing:.02em; text-transform:uppercase; cursor:pointer; transition:color .28s ease; }
.pos-hdr-brands .pos-brand-ico { display:inline-flex; flex:none; opacity:.85; transition:opacity .2s; }
.pos-hdr-brands .pos-brand-ico svg { width:13px; height:13px; }
/* Kompak: nama hanya untuk pill aktif; non-aktif = ikon saja (footprint ramping). */
.pos-hdr-brands .pos-brand-name { display:none; }
.pos-hdr-brands .pos-brand-pill.active .pos-brand-name { display:inline; }
.pos-hdr-brands .pos-brand-pill:not(.active) { padding:0 12px; }
.pos-hdr-brands .pos-brand-pill:hover:not(.active):not(:disabled) { color:color-mix(in srgb, var(--brand-ink) 55%, #fff 20%); }
.pos-hdr-brands .pos-brand-pill:hover:not(.active):not(:disabled) .pos-brand-ico { opacity:1; }
.pos-hdr-brands .pos-brand-pill.active { color:var(--ink-950); background:transparent; box-shadow:none; }
.pos-hdr-brands .pos-brand-pill.active .pos-brand-ico { opacity:1; }
.pos-hdr-brands .pos-brand-pill:disabled { opacity:.4; cursor:not-allowed; }
.pos-hdr-brands .pos-nav-lock { position:relative; z-index:2; display:inline-flex; align-items:center; color:var(--brand-ink); padding-left:4px; }
@media (prefers-reduced-motion:reduce) { .pos-hdr-brands::before { animation:none; } .pos-hdr-brands__thumb { transition:none; } }

/* Queue: tools (search + brand toggle) + quick-jump bento ikon-only */

.pos-queue-search { flex:1 1 auto; min-width:0; height:36px; }
.pos-queue-search input { font-size:12.5px; }
.pos-qj-bento { display:grid; grid-template-columns:repeat(4,1fr); gap:6px; padding:0 14px 12px; border-bottom:1px solid var(--line-100); margin-bottom:10px; }
.pos-qj-cell { display:grid; place-items:center; height:38px; border:1px solid var(--border-default); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-muted); cursor:pointer; transition:border-color .14s, color .14s, background .14s; }
.pos-qj-cell:hover:not(:disabled) { border-color:var(--vs-black); color:var(--text-strong); background:var(--surface-1); }
.pos-qj-cell:disabled { opacity:.4; cursor:not-allowed; }

/* Queue card: rapikan detail (svc di atas, id + jadwal satu baris) */


/* Kolom kanan lebih ramping + gap kolom rapat */
.pos-shell.pos-shell--3col { grid-template-columns:minmax(238px,1.02fr) minmax(0,2.05fr) minmax(0,1.02fr); gap:12px; }

/* Kompak: font & padding lebih hemat tapi tetap terbaca (cart cepat kelihatan) */
.pos-reg-body, .pos-detail .pos-colbody { gap:10px; padding:2px; }
.pos-shell--3col .pos-detail { gap:10px; }
.pos-cardgrid { gap:10px; }
.pos-shell .pos-card { padding:12px 14px; }
.pos-ctxcard__name { font-size:19px; margin:5px 0 9px; }
.pos-detailcard .pos-config-grid { gap:9px; }
.pos-detailcard .frow label, .pos-identcard .frow label { font-size:10px; }
.pos-sum-actions .abtn { height:38px; font-size:12.5px; }
.pos-method-summary { padding:9px 11px; margin-top:10px; }
.pos-detail .pos-detail-total { padding:13px 15px; }
.pos-detail .pos-detail-total .pos-foot-total strong { font-size:30px; }
.pos-cartcard .pos-cart-head { padding:12px 14px; }
.pos-cartcard .pos-cart { padding:10px 12px 14px; }

/* ═══ 12.37 REVISI-2 — switcher tengah, kolom penuh (isi scroll), kartu kompak ═══ */
/* (1) Brand switcher di header admin. Nama brand kini lengkap (lebih lebar), jadi
   switcher TIDAK lagi overlay absolut di tengah — itu menutup util topbar
   (bell/chat/help/trash/Pedoman). Sekarang ikut alur flex, rata kanan bersama util. */
.admin-top { position:relative; }
/* Brand switcher = pusatkan absolut di header (prototype: switcher rata-tengah topbar).
   Tools (Brand ini · Baru) tetap rata kanan. position:absolute juga mengembalikan
   switcher jadi offsetParent pill-nya → thumb geser ukur offsetLeft dengan benar
   (sebelumnya position:static bikin thumb salah posisi / mengambang). */
.admin-top__tools:has(.pos-hdr-brands) { justify-content:flex-end; }
.admin-top:has(.pos-hdr-brands) .admin-top__tools { position:static; }
/* POS: header WAJIB sticky (global .admin-top di-set position:relative → scroll hilang &
   money bar sticky top:64px meninggalkan gap). Sticky tetap positioned → offsetParent switcher. */
.admin-top:has(.pos-hdr-brands) { position:sticky; top:0; z-index:22; }
.pos-hdr-brands { position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:6; margin:0; }
.pos-hdr-brands .pos-brand-pill { justify-content:center; }
@media (max-width:1200px) {
  /* Ruang header lebih sempit → switcher kembali inline lebih awal (position:relative
     agar thumb tetap terukur benar), ikut alur tools dgn margin agar tak menempel. */
  .pos-hdr-brands { position:relative; left:auto; top:auto; transform:none; margin:0 4px 0 10px; }
}
@media (max-width:760px) {
  /* Header POS di layar kecil: brand switcher (±322px) + tools (±181px) tak muat sebaris
     dengan ikon topbar → wrap jadi 3–4 baris dan header memakan ±190px tinggi.
     Tools dinaikkan ke baris ikon (34+148+181 muat), switcher dapat barisnya sendiri. */
  .admin-top:has(.pos-hdr-brands) .admin-top__tools { flex-wrap:wrap; align-items:center; column-gap:8px; row-gap:8px; }
  .pos-hdr-tools { order:-1; flex:0 0 auto; }
  .pos-hdr-brands { order:0; flex:1 1 100%; max-width:340px; margin-inline:auto; min-width:0; justify-content:center; }
}
@media (max-width:430px) {
  /* Ponsel: "Brand ini" + "Baru" (181px) masih memaksa baris ketiga → rapatkan tombol
     supaya muat sebaris dengan cluster ikon (label tetap ada, bukan icon-only). */
  .pos-hdr-tools { gap:6px; }
  .pos-hdr-tools .vs-btn { padding:0 9px; font-size:11.5px; gap:5px; }
  /* "Brand ini" jadi ikon saja: font-size:0 menyembunyikan label secara visual TAPI
     teksnya tetap ada di accessibility tree (accessible name & title utuh). */
  
}

/* (3) Kolom isi PENUH tinggi (nempel), nol kanvas kosong — hanya isi yang scroll */
.pos-shell--3col .pos-queue,
.pos-shell--3col .pos-register,
.pos-shell--3col .pos-detail { height:calc(100dvh - 90px); max-height:none; }
.pos-reg-body { overflow:hidden; }
.pos-cartcard { flex:1 1 auto; min-height:140px; display:flex; flex-direction:column; }
.pos-cartcard .pos-cart { flex:1 1 auto; min-height:0; overflow:auto; }
.pos-cartcard .pos-empty { height:100%; margin:0; }

/* (2) Identitas & Detail booking lebih ringkas (input pendek, tak kebesaran) */
.pos-identcard .ctrl, .pos-detailcard .ctrl { height:38px; min-height:38px; padding:6px 11px; font-size:12.5px; }
.pos-identcard, .pos-detailcard { padding:11px 12px; }
.pos-identcard .pos-ident-wrap { margin-top:9px; }
.pos-detailcard .pos-card__head { margin-bottom:9px; }
.pos-detailcard .pos-config-grid { gap:8px 10px; }

/* ═══ 12.37 REVISI-3 — total tagihan isi space, ikon cart, tag queue grid ═══ */
/* (1) Kartu TOTAL TAGIHAN melar mengisi ruang kosong kolom kanan (angka di tengah) */
.pos-detail .pos-detail-total { flex:1 1 auto; min-height:120px; display:flex; flex-direction:column; justify-content:center; }
.pos-detail .pos-colbody { flex:0 1 auto; }

/* (2b) Ikon Cart tanpa blok hitam — ikon polos biar clean */
.pos-cart-head__l .pos-cart-ico { width:auto; height:auto; background:transparent; color:var(--text-strong); border-radius:0; box-shadow:none; }
.pos-cart-head__l .pos-cart-ico svg { width:20px; height:20px; color:var(--text-strong); }

/* ═══ 12.37 REVISI-4 — Detail booking lega + input rapi (fix select ketiban chevron) ═══ */
/* Ambil sedikit lebar dari Identitas → beri ke Detail booking */
.pos-cardgrid { grid-template-columns:minmax(0,0.9fr) minmax(0,1.15fr); }
@media (max-width:900px) { .pos-cardgrid { grid-template-columns:1fr; } }
/* Layanan full-width: teks panjang + hint tak sesak, baris lain jadi rata */
.pos-detailcard .pos-config-grid .frow:first-child { grid-column:1 / -1; }
.pos-detailcard .pos-config-grid .frow:first-child .fhint { margin-top:4px; }
/* FIX overlap: select butuh ruang kanan utk chevron (jangan ketiban teks) */
.pos-identcard select.ctrl, .pos-detailcard select.ctrl { padding:6px 34px 6px 11px; text-overflow:ellipsis; }
/* Input rapi & konsisten */
.pos-identcard .ctrl, .pos-detailcard .ctrl { border-color:var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); }
.pos-identcard .ctrl:focus, .pos-detailcard .ctrl:focus { border-color:var(--vs-black); outline:none; box-shadow:0 0 0 3px var(--focus-ring); }
.pos-detailcard .pos-config-grid .frow > label { margin-bottom:5px; }

/* (3) Footer kartu queue dirapikan grid: status di atas, chip bayar + sisa satu baris */


/* ---------- Schedule editor / Kalender Global ---------- */
.wk-list { display:flex; flex-direction:column; }
.wk-row { display:flex; align-items:center; gap:14px; padding:9px 0; border-bottom:1px solid var(--line); }
.wk-row:last-child { border-bottom:none; }
.wk-day { display:flex; align-items:center; gap:8px; width:108px; flex:none; font-size:13.5px; font-weight:560; cursor:pointer; }
.wk-day input { width:16px; height:16px; }
.wk-times { display:flex; align-items:center; gap:8px; }
.wk-times .ctrl { width:118px; }
.wk-dash { color:var(--muted); }
.wk-closed { font-size:13px; }
.rule-card { border:1px solid var(--line); border-radius:var(--r-sm,10px); padding:14px; margin-bottom:12px; background:var(--paper,#fff); }
.rule-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:10px; font-size:13px; }
.rule-head b { display:flex; align-items:center; gap:6px; }
.rdel { background:none; border:none; color:var(--danger); cursor:pointer; padding:4px; border-radius:6px; }
.rdel:hover { background:var(--paper-warm2,#f3f2ee); }
.wd-chips { display:flex; flex-wrap:wrap; gap:6px; }
.wd-chip { display:inline-flex; align-items:center; gap:5px; padding:6px 10px; border:1px solid var(--line); border-radius:100px; background:var(--paper); color:var(--ink); font:inherit; font-size:12.5px; cursor:pointer; user-select:none; }
.wd-chip.on { background:var(--ink); color:#fff; border-color:var(--ink); }
.wd-chip input { width:13px; height:13px; margin:0; }
.wd-chip input:disabled { cursor:not-allowed; }

/* ============================================================
   BOOKING DASHBOARD & DB (PRD 12.02) — dashboard, payment,
   calendar, room management additions.
   ============================================================ */

/* KPI grid (6 cards) + clickable stat */
.stat-grid.kpi6 { grid-template-columns: repeat(6, 1fr); }
a.stat { text-decoration:none; transition: border-color .14s, box-shadow .14s, transform .12s; }
a.stat:hover { border-color: var(--ink); box-shadow: var(--shadow-1); transform: translateY(-1px); }
.stat.warn { border-color:#E8D08A; }
.stat.warn .num { color:var(--pst-warning-text); }
.stat.ok .num { color: var(--ok); }
@media (max-width: 1100px){ .stat-grid.kpi6 { grid-template-columns: repeat(3,1fr); } }
@media (max-width: 560px){ .stat-grid.kpi6 { grid-template-columns: repeat(2,1fr); } }

/* Finance: tepat 4 KPI → isi 4 kolom (tak ada kolom kosong di kanan).
   Layar sempit pakai kolom lebih sedikit agar nominal Rp besar muat 1 baris. */
.stat-grid.kpi4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 960px){ .stat-grid.kpi4 { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 480px){ .stat-grid.kpi4 { grid-template-columns: 1fr; } }

/* dashboard 2-column */
.dash-2col { display:grid; grid-template-columns: 1fr 1fr; gap:20px; margin-bottom:20px; }
@media (max-width: 900px){ .dash-2col { grid-template-columns:1fr; } }

/* alert list */
.alert-list { display:flex; flex-direction:column; }
.alert-row { display:flex; align-items:center; gap:10px; width:100%; text-align:left; padding:11px 16px; border:0; border-bottom:1px solid var(--line-soft); background:transparent; cursor:pointer; font:inherit; font-size:13px; color:var(--ink); }
.alert-row:last-child { border-bottom:0; }
.alert-row:hover { background:var(--paper-warm); }
.alert-row span { flex:1; min-width:0; }
.alert-row svg:first-child { flex:none; }
.alert-row.al-high { color:var(--danger); }
.alert-row.al-high svg:first-child { color:var(--danger); }
.alert-row.al-warn svg:first-child { color:var(--warn); }
.alert-row.al-info svg:first-child { color:var(--st-contacted); }
.alert-row b { font-weight:680; }
.alert-empty { padding:18px 16px; color:var(--graphite); font-size:13px; display:flex; align-items:center; gap:8px; }
.alert-empty svg { color:var(--ok); }

/* today timeline */
.timeline { display:flex; flex-direction:column; }
.tl-row { display:flex; align-items:center; gap:12px; width:100%; text-align:left; padding:11px 16px; border:0; border-bottom:1px solid var(--line-soft); background:transparent; cursor:pointer; font:inherit; }
.tl-row:last-child { border-bottom:0; }
.tl-row:hover { background:var(--paper-warm); }
.tl-time { flex:none; width:96px; font-size:12px; color:var(--ink); font-weight:600; }
.tl-main { flex:1; min-width:0; display:flex; flex-direction:column; }
.tl-main b { font-size:13px; font-weight:640; }
.tl-main em { font-style:normal; font-size:11.5px; color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.tl-side { display:flex; align-items:center; gap:6px; flex:none; flex-wrap:wrap; justify-content:flex-end; }
.empty.mini { padding:22px 16px; text-align:center; color:var(--muted); }

/* payment chip — Fresh Tag varian sm (`.vs-tag--sm`): pill hairline, min-height 22px,
   angka/kode tetap mono sesuai aturan tipografi DS. Tone dari alias --tag-*. */
.pay-chip { display:inline-flex; align-items:center; gap:4px; min-height:22px; font-family:var(--font-mono); font-size:10.5px; font-weight:600; letter-spacing:.02em; padding:2px 8px; border-radius:var(--radius-pill,100px); white-space:nowrap; border:1px solid var(--tag-neutral-border); color:var(--tag-neutral-text); background:var(--tag-neutral-bg); }
.pay-unpaid    { color:var(--tag-warning-text); background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.pay-dp_paid   { color:var(--tag-blue-text); background:var(--tag-blue-bg); border-color:var(--tag-blue-border); }
.pay-partial   { color:var(--tag-orange-text); background:var(--tag-orange-bg); border-color:var(--tag-orange-border); }
.pay-paid      { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.pay-refunded  { color:var(--tag-neutral-text); background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); }
.pay-cancelled { color:var(--tag-danger-text); background:var(--tag-danger-bg); border-color:var(--tag-danger-border); }

/* drawer chips + conflict */
.drawer-chips { display:flex; flex-wrap:wrap; gap:6px; margin-top:8px; align-items:center; }
.conflict-chip { display:inline-flex; align-items:center; gap:4px; font-size:10.5px; font-family:var(--font-mono); padding:3px 8px; border-radius:100px; color:var(--danger); background:var(--danger-bg); }
.conflict-chip svg { width:12px; height:12px; }
/* Sistem Bypass / Akses Sementara (PRD 12.13) — chip & banner (token-only). */
.bypass-chip { display:inline-flex; align-items:center; gap:4px; font-size:10.5px; font-weight:600; padding:3px 8px; border-radius:100px; cursor:pointer; color:var(--pst-warning-text); background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border); margin-left:4px; vertical-align:middle; }
.bypass-chip svg { width:12px; height:12px; }
.bypass-banner { display:flex; align-items:center; gap:8px; padding:8px 14px; margin:0 0 10px; border-radius:var(--r-sm); background:var(--pst-warning-bg); color:var(--pst-warning-text); border:1px solid var(--pst-warning-border); font-size:12.5px; }
.bypass-banner svg { flex:none; }
.abtn.is-on { background:var(--pst-warning-bg); color:var(--pst-warning-text); border-color:var(--pst-warning-border); }
.inline-alert { display:flex; align-items:center; gap:8px; padding:9px 12px; border-radius:var(--r-sm); background:var(--danger-bg); color:var(--danger); font-size:12.5px; margin:8px 0; }
.inline-alert svg { flex:none; }
.pax-warn { font-size:11.5px; margin-top:3px; }
.pax-warn.pax-charge { color:var(--st-contacted); }
.pax-warn.pax-warn { color:var(--warn); }
.pax-warn.pax-reject { color:var(--danger); }

/* payment section */
.pay-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:8px; margin:6px 0 10px; }
.pay-box { border:1px solid var(--line); border-radius:var(--r-sm); padding:9px 10px; background:var(--paper-warm); }
.pay-box .pl { display:block; font-size:10.5px; color:var(--muted); text-transform:uppercase; letter-spacing:.06em; }
.pay-box b { font-size:14px; }
.pay-box.rem { border-color:var(--pst-warning-border); background:var(--pst-warning-bg); }
.pay-box.rem b { color:var(--pst-warning-text); }
.pay-hist { display:flex; flex-direction:column; gap:4px; margin:6px 0; }
.pay-hist-row { display:flex; gap:10px; align-items:baseline; font-size:12px; padding:5px 0; border-bottom:1px dashed var(--line-soft); }
.pay-hist-row .mono { font-weight:640; }
/* 12.20 F3: banner verifikasi bukti klien */
.proof-pending { margin:8px 0; padding:9px 11px; border:1px solid var(--warn,#E0A800); border-radius:8px; background:rgba(255,193,7,.08); }
.proof-pending-h { display:flex; align-items:center; gap:6px; font-size:12.5px; margin-bottom:6px; }
.proof-thumbs { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:6px; }
.proof-thumbs img { max-height:64px; border-radius:6px; border:1px solid var(--line); cursor:pointer; }
.proof-verified { margin:8px 0; padding:7px 11px; border:1px solid var(--ok,#1E9E5A); border-radius:8px; background:rgba(30,158,90,.08); font-size:12px; display:flex; align-items:center; gap:6px; }
.row-btns { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }

/* progress */
.prog-flow { display:flex; flex-wrap:wrap; gap:4px 14px; margin:6px 0 10px; }
.prog-step { display:flex; align-items:center; gap:6px; font-size:11.5px; color:var(--muted); }
.prog-step .dot { width:9px; height:9px; border-radius:50%; border:1.5px solid var(--line); background:var(--paper); }
.prog-step.done { color:var(--ink); }
.prog-step.done .dot { background:var(--ok); border-color:var(--ok); }
.prog-step.current { color:var(--ink); font-weight:680; }
.prog-step.current .dot { background:var(--ink); border-color:var(--ink); }
.prog-logs { display:flex; flex-direction:column; gap:4px; margin-bottom:8px; }
.prog-log { font-size:12px; color:var(--ink-soft); padding:5px 0; border-bottom:1px dashed var(--line-soft); }
.prog-log .sub { display:block; font-size:10.5px; color:var(--muted); }

/* reschedule */
.resch-row { font-size:12.5px; padding:6px 0; border-bottom:1px dashed var(--line-soft); display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.resch-row .sub { flex-basis:100%; color:var(--muted); font-size:11px; }
.muted.mini { font-size:12px; color:var(--muted); padding:4px 0; }

/* 12.34.A — inbox permintaan klien (add-on/perpanjang/BTS) di drawer booking */
.req-row { padding:9px 0; border-bottom:1px dashed var(--line-soft); }
.req-row.is-done { opacity:.72; }
.req-head { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.req-head b { font-size:13px; }
.req-meta { font-size:11.5px; color:var(--muted); margin-top:2px; }
.req-row .sub { color:var(--muted); font-size:11.5px; margin-top:2px; }
.conflict-chip.req-st-ok { color:var(--pst-success-text,#0B7A47); background:var(--pst-success-bg,#D6F9E5); }
.req-confirm { display:flex; align-items:center; gap:7px; margin-top:7px; }
.req-confirm .req-price { max-width:140px; }
/* 12.34.A — scanner QR check-in */
.scan-wrap { position:relative; width:100%; aspect-ratio:4/3; background:#000; border-radius:var(--r-md); overflow:hidden; margin-bottom:8px; }
.scan-wrap video { width:100%; height:100%; object-fit:cover; display:block; }
.scan-frame { position:absolute; inset:18% 22%; border:2px solid rgba(255,247,0,.9); border-radius:12px; box-shadow:0 0 0 9999px rgba(0,0,0,.28); pointer-events:none; }

/* filters: date input */
.filter-date { padding:9px 12px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); font-size:13px; }
.fgrid3 { display:grid; grid-template-columns:repeat(3,1fr); gap:10px; }
.bc-pay { display:flex; align-items:center; gap:8px; margin-top:4px; }

/* ---------- BOOKING CALENDAR ---------- */
.cal-toolbar { display:flex; align-items:center; gap:12px; margin-bottom:12px; flex-wrap:wrap; }
/* .cal-datenav: kelas khusus admin (hindari bentrok dgn .cal-nav publik di app.css yang paksa tombol 32px grid). */
.cal-datenav { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.cal-navico { flex:none; width:32px; height:32px; display:grid; place-items:center; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); color:var(--ink); cursor:pointer; }
.cal-navico:hover { background:var(--paper-warm); }
.cal-navico svg { width:16px; height:16px; }
.cal-datepill { flex:none; display:inline-flex; align-items:center; gap:7px; height:32px; padding:0 12px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); color:var(--ink); cursor:pointer; font:inherit; white-space:nowrap; }
.cal-datepill:hover { background:var(--paper-warm); border-color:var(--ink); }
.cal-datepill svg { color:var(--graphite); }
.cal-datepill svg:last-child { width:13px; height:13px; }
.cal-title { font-size:14px; font-weight:680; }

/* Mini calendar / date picker popover */
.minical-pop { position:absolute; z-index:210; width:264px; padding:12px; background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md); box-shadow:var(--shadow-pop); }
.minical-pop .mc-head { display:flex; align-items:center; gap:6px; margin-bottom:8px; }
.minical-pop .mc-nav { width:28px; height:28px; }
.minical-pop .mc-nav svg { width:15px; height:15px; }
.mc-title { flex:1; text-align:center; font-size:13px; font-weight:700; border:0; background:transparent; cursor:pointer; border-radius:7px; padding:5px 4px; color:var(--ink); }
.mc-title:hover { background:var(--paper-warm); }
.mc-wd { display:grid; grid-template-columns:repeat(7,1fr); gap:2px; margin-bottom:4px; }
.mc-wd span { text-align:center; font-size:10px; color:var(--muted); font-weight:640; text-transform:uppercase; }
.mc-grid { display:grid; grid-template-columns:repeat(7,1fr); gap:2px; }
.mc-day { aspect-ratio:1; border:0; background:transparent; border-radius:7px; font-size:12px; font-weight:560; color:var(--ink); cursor:pointer; font-family:inherit; }
.mc-day:hover { background:var(--paper-warm); }
.mc-day.out { color:#C8C7C1; }
.mc-day.today { box-shadow:inset 0 0 0 1.5px var(--ink); }
.mc-day.sel { background:var(--gradient-identity-sunset); color:var(--ink); font-weight:780; box-shadow:var(--shadow-identity); }
.mc-foot { margin-top:9px; display:flex; justify-content:center; }
.mc-today { display:inline-flex; align-items:center; gap:6px; padding:7px 14px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); font-size:12px; font-weight:620; color:var(--ink); cursor:pointer; }
.mc-today:hover { background:var(--paper-warm); border-color:var(--ink); }
.mc-today svg { width:14px; height:14px; }
.mc-months { display:grid; grid-template-columns:repeat(3,1fr); gap:6px; }
.mc-mon { padding:11px 0; border:1px solid var(--line); border-radius:9px; background:var(--paper); font-size:12px; font-weight:600; color:var(--ink); cursor:pointer; font-family:inherit; }
.mc-mon:hover { background:var(--paper-warm); }
.mc-mon.sel { background:var(--ink); color:#fff; border-color:var(--ink); }
.cal-legend { display:flex; flex-wrap:wrap; gap:6px 16px; margin:6px 0 14px; font-size:11.5px; color:var(--graphite); }
.cal-leg-item { display:inline-flex; align-items:center; gap:6px; }
.leg-dot { width:11px; height:11px; border-radius:3px; display:inline-block; }
.leg-dot.ev-conflict-dot { background:repeating-linear-gradient(45deg,var(--danger),var(--danger) 3px,#fff 3px,#fff 5px); }

.cal-month .cal-wdrow { display:grid; grid-template-columns:repeat(7,1fr); background:var(--paper-warm); border-bottom:1px solid var(--line); }
.cal-wd { padding:8px 10px; font-size:11px; font-weight:640; color:var(--graphite); text-transform:uppercase; letter-spacing:.05em; }
.cal-grid { display:grid; grid-template-columns:repeat(7,1fr); }
.cal-cell { min-height:104px; border-right:1px solid var(--line-soft); border-bottom:1px solid var(--line-soft); padding:6px; cursor:pointer; display:flex; flex-direction:column; gap:4px; }
.cal-cell:nth-child(7n) { border-right:0; }
.cal-cell:hover { background:var(--paper-warm); }
.cal-cell.out { background:#FBFAF7; }
.cal-cell.out .cal-date { color:#C4C3BD; }
.cal-cell.today .cal-date { background:var(--ink); color:#fff; border-radius:50%; }
.cal-date { font-size:12px; font-weight:600; width:22px; height:22px; display:grid; place-items:center; }
.cal-evs { display:flex; flex-direction:column; gap:3px; }
.cal-ev { display:flex; align-items:center; gap:5px; width:100%; text-align:left; border:0; border-left:3px solid currentColor; border-radius:4px; padding:3px 6px; font:inherit; font-size:11px; cursor:pointer; overflow:hidden; }
.cal-ev .evt-t { font-family:var(--font-mono); font-size:10px; opacity:.8; flex:none; }
.cal-ev .evt-n { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cal-ev.ev-conflict { outline:2px solid var(--danger); outline-offset:-2px; }
.cal-more { font-size:10.5px; color:var(--muted); padding-left:4px; }

.cal-week { display:grid; grid-template-columns:repeat(7,1fr); border:1px solid var(--line); border-radius:var(--r-sm); overflow:hidden; }
.cal-wcol { border-right:1px solid var(--line-soft); min-height:240px; }
.cal-wcol:last-child { border-right:0; }
.cal-wcol-head { padding:8px; font-size:12px; font-weight:640; text-align:center; background:var(--paper-warm); border-bottom:1px solid var(--line-soft); }
.cal-wcol-head.today { background:var(--ink); color:#fff; }
.cal-wcol-body { padding:6px; display:flex; flex-direction:column; gap:4px; cursor:pointer; min-height:200px; }
.cal-wempty { color:#D7D6D0; text-align:center; font-size:12px; padding-top:10px; }

.cal-day { display:flex; flex-direction:column; }
.cal-day-row { display:flex; align-items:center; gap:14px; width:100%; text-align:left; padding:12px 16px; border:0; border-left:4px solid currentColor; border-bottom:1px solid var(--line-soft); background:transparent; cursor:pointer; font:inherit; }
.cal-day-row:hover { background:var(--paper-warm); }
.cal-day-row.ev-conflict { background:var(--danger-bg); }
.cd-time { flex:none; width:110px; font-size:12.5px; font-weight:640; color:var(--ink); }
.cd-main { flex:1; min-width:0; display:flex; flex-direction:column; }
.cd-main b { font-size:13.5px; }
.cd-main em { font-style:normal; font-size:11.5px; color:var(--muted); }
.cd-side { display:flex; align-items:center; gap:6px; flex:none; flex-wrap:wrap; justify-content:flex-end; }
.agenda-date { padding:10px 16px 6px; font-size:12px; font-weight:700; color:var(--graphite); text-transform:uppercase; letter-spacing:.04em; background:var(--paper-warm); border-bottom:1px solid var(--line-soft); }

/* ---------- SCHEDULE: attention strip (F5, Ref Needs Attention) ---------- */
.cal-attn { display:flex; align-items:center; gap:8px; padding:9px 13px; margin-bottom:12px; font-size:12.5px; color:var(--pst-warning-text); background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border); border-radius:var(--r-sm); }
.cal-attn svg { flex:none; }
.cal-attn b { font-weight:720; }

/* ---------- SCHEDULE: tone & legend (design system §4.2/§4.3) ---------- */
.leg-dot.leg-blocked { background:repeating-linear-gradient(45deg,var(--pst-neutral-border),var(--pst-neutral-border) 3px,#fff 3px,#fff 5px); }
.cal-ev.ev-identity { box-shadow:inset 0 0 0 1.5px var(--pst-identity-border); }
.cal-day-row.ev-identity { box-shadow:inset 4px 0 0 var(--pst-identity-border); }

/* ---------- SCHEDULE: Kalender Global block overlay (F3) ---------- */
.cal-blockchip { display:flex; align-items:center; gap:4px; font-size:10px; font-weight:600; line-height:1.3; color:var(--pst-neutral-text); background:repeating-linear-gradient(45deg,var(--pst-neutral-bg),var(--pst-neutral-bg) 5px,#fff 5px,#fff 10px); border:1px solid var(--pst-neutral-border); border-radius:4px; padding:2px 5px; margin-bottom:2px; overflow:hidden; }
.cal-blockchip svg { flex:none; }
.cal-blockchip span { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cal-blockchip.full { color:var(--pst-danger-text); border-color:var(--pst-danger-border); background:repeating-linear-gradient(45deg,var(--pst-danger-bg),var(--pst-danger-bg) 5px,#fff 5px,#fff 10px); }
.cal-cell.blocked { background:repeating-linear-gradient(45deg,#FBFAF7,#FBFAF7 7px,#F3F2ED 7px,#F3F2ED 14px); }
.cal-block-banner { display:flex; align-items:flex-start; gap:8px; padding:10px 14px; margin-bottom:10px; font-size:12.5px; background:var(--pst-neutral-bg); border:1px solid var(--pst-neutral-border); border-radius:var(--r-sm); color:var(--ink-soft); }
.cal-block-banner svg { flex:none; margin-top:1px; }

/* ---------- SCHEDULE: Resource timeline view (F1, Ref Studio Schedule) ---------- */
.cal-res-wrap { display:flex; border:1px solid var(--line); border-radius:var(--r-sm); overflow:auto; background:var(--paper); max-height:74vh; }
.cal-res-gutter { position:sticky; left:0; z-index:4; flex:none; width:52px; background:var(--paper); border-right:1px solid var(--line); }
.cal-res-cols { display:flex; flex:1; min-width:0; }
.cal-res-group { display:flex; flex-direction:column; min-width:0; border-right:2px solid var(--line); }
.cal-res-group:last-child { border-right:0; }
.cal-res-groupcols { display:flex; flex:1; min-width:0; }
.cal-res-bandhead { flex:none; height:24px; box-sizing:border-box; display:flex; align-items:center; justify-content:center; gap:5px; padding:0 6px; font-size:9.5px; font-weight:700; letter-spacing:.07em; text-transform:uppercase; color:#fff; background:var(--ink); border-bottom:1px solid var(--line); position:sticky; top:0; z-index:5; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cal-res-bandhead.gutter-band { background:var(--paper); }
.cal-res-col { flex:1 1 0; min-width:0; border-right:1px solid var(--line-soft); }
.cal-res-col:last-child { border-right:0; }
.cal-res-colhead { height:56px; box-sizing:border-box; padding:8px 11px; border-bottom:1px solid var(--line); background:var(--paper-warm); display:flex; flex-direction:column; justify-content:center; gap:4px; position:sticky; top:24px; z-index:3; }
.gutter-head { background:var(--paper); }
.cal-res-name { font-size:12.5px; font-weight:680; color:var(--ink); display:flex; align-items:center; gap:6px; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cal-res-band { font-size:9px; font-weight:700; color:var(--muted); background:var(--paper-warm2); border-radius:4px; padding:1px 5px; flex:none; }
.cal-res-substat { display:flex; align-items:center; gap:6px; font-size:11px; min-width:0; }
.cal-res-dot { width:8px; height:8px; border-radius:50%; flex:none; }
.cal-res-occ { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; color:var(--ink); }
.cal-res-occ.muted { color:var(--muted); }
.cal-res-occ em { font-style:normal; color:var(--muted); margin-left:4px; font-size:10px; }
.cal-res-hours { position:relative; }
.cal-res-hr { box-sizing:border-box; border-bottom:1px solid var(--line-soft); position:relative; }
.cal-res-hr span { font-size:10px; color:var(--muted); font-family:var(--font-mono); position:absolute; top:-7px; left:6px; background:var(--paper); padding:0 2px; }
.cal-res-track { position:relative; cursor:pointer; background-image:linear-gradient(to bottom,var(--line-soft) 1px,transparent 1px); background-repeat:repeat-y; }
.cal-res-track:hover { background-color:var(--paper-warm); }
.cal-res-track.blocked { background-color:#FBFAF7; background-image:repeating-linear-gradient(45deg,transparent,transparent 8px,rgba(0,0,0,.035) 8px,rgba(0,0,0,.035) 16px),linear-gradient(to bottom,var(--line-soft) 1px,transparent 1px); }
.cal-res-block { position:absolute; left:2px; right:2px; z-index:1; background:repeating-linear-gradient(45deg,var(--pst-neutral-bg),var(--pst-neutral-bg) 6px,#fff 6px,#fff 12px); border:1px dashed var(--pst-neutral-border); border-radius:4px; }
.cal-res-ev { position:absolute; left:3px; right:3px; z-index:2; box-sizing:border-box; border:0; border-left:4px solid currentColor; border-radius:5px; padding:3px 7px; text-align:left; font:inherit; cursor:pointer; overflow:hidden; box-shadow:var(--shadow-1); display:flex; flex-direction:column; gap:1px; }
.cal-res-ev .rev-t { font-family:var(--font-mono); font-size:9.5px; opacity:.85; white-space:nowrap; }
.cal-res-ev .rev-n { font-size:11.5px; font-weight:620; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cal-res-ev.ev-conflict { outline:2px solid var(--danger); outline-offset:-2px; }
.cal-res-ev.ev-identity { box-shadow:0 0 0 2px var(--pst-identity-border),var(--shadow-1); }
.cal-res-ev.ev-parent { border-left-style:dashed; }   /* booking diturunkan dari parent (mis. V SPACE) */

/* ============================================================
   SCHEDULE — Redesign polish (ref: "Schedule Module standalone").
   Selaras DS v2.0 (ink/paper/identity + pastel --pst-*); semua
   selector di-scope ke kelas Schedule agar tak merembet ke modul lain.
   ============================================================ */
/* View-switcher: pil hitam aktif + ikon (khusus toolbar Schedule) */
.cal-toolbar .seg-btn { height:32px; padding:0 11px; }
.cal-toolbar .seg-btn svg { color:var(--muted); transition:color .14s; }
.cal-toolbar .seg-btn:hover svg { color:var(--ink); }
.cal-toolbar .seg-btn.active { background:var(--ink); color:#fff; box-shadow:var(--shadow-1); }
.cal-toolbar .seg-btn.active svg { color:#fff; }
/* Filter bar inline + kicker mono */
.cal-filterbar { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.cal-filterbar--row { margin:-2px 0 14px; }   /* baris filter terpisah, di bawah baris pilihan tab */
.cal-filter-kicker { font-family:var(--font-mono); font-size:10.5px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:var(--muted); }
.cal-filterbar select { height:34px; padding:0 30px 0 11px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); font-size:13px; color:var(--ink); cursor:pointer; }
.cal-filter-reset { display:inline-flex; align-items:center; gap:5px; height:34px; padding:0 10px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper); cursor:pointer; font:inherit; font-size:13px; font-weight:560; color:var(--muted); }
.cal-filter-reset:hover { color:var(--ink); border-color:var(--ink); }
/* Tombol "Hari Ini" tersorot saat memang di hari ini */
.cal-today-on { background:var(--identity-yellow-soft) !important; border-color:var(--identity-yellow-shadow) !important; color:var(--ink) !important; }

/* Transisi mulus semua tombol toolbar + anti-"jumping" saat ganti view/tanggal:
   body ditukar di tempat (tanpa remount) → min-height stabil + fade halus. */
.cal-navico, .cal-datepill, .cal-toolbar .abtn, .cal-filterbar select, .cal-filter-reset { transition:background .15s ease, color .15s ease, border-color .15s ease, box-shadow .15s ease; }
.cal-datepill svg, .cal-navico svg { transition:color .15s ease; }
#calBody { min-height:52vh; }
#calBody.cal-swap { animation:cal-bodyswap .18s ease; }
@keyframes cal-bodyswap { from { opacity:.35; } to { opacity:1; } }
@media (prefers-reduced-motion: reduce) { #calBody.cal-swap { animation:none; } }

/* Rich attention banner "Perlu perhatian" */
.cal-attn-card { display:flex; flex-direction:column; gap:7px; padding:13px 16px; margin-bottom:14px; background:linear-gradient(180deg,var(--paper),var(--paper-warm)); border:1px solid var(--line); border-left:4px solid var(--danger); border-radius:var(--r-md); box-shadow:var(--shadow-1); }
.cal-attn-top { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.cal-attn-title { font-family:var(--font-display,inherit); font-weight:760; font-size:15px; color:var(--ink); letter-spacing:-.01em; display:inline-flex; align-items:center; gap:8px; }
.cal-attn-title svg { color:var(--danger); }
.cal-attn-pill { font-size:11px; font-weight:700; padding:2px 8px; border-radius:6px; }
.cal-attn-pill.danger { background:var(--pst-danger-bg); color:var(--pst-danger-text); border:1px solid var(--pst-danger-border); }
.cal-attn-pill.orange { background:var(--pst-orange-bg); color:var(--pst-orange-text); border:1px solid var(--pst-orange-border); }
.cal-attn-rows { display:flex; flex-direction:column; gap:2px; }
.cal-attn-row { display:flex; align-items:center; gap:10px; width:100%; text-align:left; padding:7px 10px; border:0; border-radius:var(--r-sm); background:transparent; cursor:pointer; font:inherit; }
.cal-attn-row:hover { background:var(--paper-warm2); }
.cal-attn-row .ar-dot { width:7px; height:7px; border-radius:50%; flex:none; }
.cal-attn-row .ar-title { font-size:13.5px; font-weight:640; color:var(--ink); flex:none; white-space:nowrap; }
.cal-attn-row .ar-detail { font-size:12.5px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex:1; min-width:0; }
.cal-attn-row .ar-chev { color:var(--line); flex:none; }
.cal-attn-more { font-size:12px; color:var(--muted); padding:3px 10px 0; }

/* Legend → carded (kicker "Legenda") */
.cal-legend.cal-legend-card { padding:11px 15px; background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md); margin:14px 0 0; align-items:center; }
.cal-leg-kicker { font-family:var(--font-mono); font-size:10.5px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:var(--muted); }
/* Month: kolom Minggu (Sun) merah seperti prototype */
.cal-wd.cal-wd-sun { color:var(--danger); }

/* Resource view: band dot + kind subtitle + garis "now" */
.cal-res-banddot { width:8px; height:8px; border-radius:2px; flex:none; display:inline-block; }
.cal-res-colhead { height:64px; }   /* +ruang utk baris "kind" (jenis room); gutter-head ikut agar grid sejajar */
.cal-res-bandhead.cal-res-bandhead--soft { background:var(--paper-warm); color:var(--ink); gap:6px; font-weight:740; letter-spacing:.02em; text-transform:none; font-size:11px; }
.cal-res-kind { font-size:10px; color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-top:1px; }
.cal-res-cols { position:relative; }
.cal-res-now { position:absolute; left:0; right:0; height:0; border-top:2px solid var(--danger); z-index:6; pointer-events:none; }
.cal-res-now::before { content:''; position:absolute; left:-3px; top:-4px; width:8px; height:8px; border-radius:50%; background:var(--danger); }
.cal-res-now .now-lbl { position:absolute; right:4px; top:-8px; font-family:var(--font-mono); font-size:9px; font-weight:700; color:#fff; background:var(--danger); padding:1px 5px; border-radius:3px; }

/* ============================================================
   SCHEDULE REFRESH 12.56 — brand workspace, conditional color,
   attention cards, rich booking cards, aligned resource grid.
   ============================================================ */
.cal-context-card { display:grid; grid-template-columns:minmax(250px,.72fr) minmax(0,1.5fr); align-items:end; gap:18px; margin-bottom:14px; padding:16px 18px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-card); }
.cal-context-copy h2 { margin:3px 0 2px; font-size:18px; letter-spacing:-.02em; color:var(--ink); }
.cal-context-copy p { margin:0; max-width:520px; font-size:12.5px; line-height:1.45; color:var(--muted); }
.cal-context-kicker { display:block; font-family:var(--font-mono); font-size:10px; font-weight:700; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-500); }
.cal-brand-tabs { display:flex; justify-content:flex-end; gap:5px; min-width:0; overflow-x:auto; padding:2px; scrollbar-width:none; }
.cal-brand-tabs::-webkit-scrollbar { display:none; }

.cal-color-control { min-height:34px; display:inline-flex; align-items:center; gap:8px; padding-left:10px; border-left:1px solid var(--line-200); color:var(--ink-500); font-size:11.5px; font-weight:620; white-space:nowrap; }
.cal-color-control select { min-width:112px; color:var(--ink); font-weight:620; }
.cal-main-panel .panel-body { overflow:auto; }

/* Conditional-color contract. Conflict and block styles remain independent. */
.cal-ev.sched-colored,.cal-scard.sched-colored,.cal-day-row.sched-colored,.cal-res-ev.sched-colored { background:var(--sched-bg); color:var(--sched-text); border-color:var(--sched-border); border-left-color:var(--sched-accent); }
.cal-ev.sched-colored:hover,.cal-scard.sched-colored:hover,.cal-day-row.sched-colored:hover,.cal-res-ev.sched-colored:hover { box-shadow:0 4px 14px color-mix(in srgb,var(--sched-accent) 15%,transparent); }
.cal-ev.ev-conflict,.cal-scard.ev-conflict,.cal-day-row.ev-conflict,.cal-res-ev.ev-conflict { outline:2px solid var(--hot-red); outline-offset:-2px; }

/* Compact month card: two information lines without crowding the date cell. */
.cal-month { min-width:920px; }
.cal-cell { min-height:132px; padding:7px; }
.cal-ev { min-height:36px; display:block; padding:5px 7px; border:1px solid var(--sched-border); border-left:3px solid var(--sched-accent); border-radius:6px; line-height:1.15; }
.cal-ev .evt-line { display:flex; align-items:center; gap:5px; min-width:0; }
.cal-ev .evt-t { color:var(--sched-text); font-weight:700; }
.cal-ev .evt-n { min-width:0; font-size:10.8px; font-weight:700; }
.cal-ev .evt-meta { display:block; margin-top:3px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:9.5px; color:var(--sched-text); opacity:.78; }
.cal-more { width:100%; min-height:24px; border:0; border-radius:6px; background:transparent; color:var(--ink-500); padding:3px 5px; text-align:left; font:inherit; font-size:10.5px; font-weight:650; cursor:pointer; }
.cal-more:hover { background:var(--surface-50); color:var(--ink); }

/* Weekly Notion-inspired cards. View scrolls horizontally instead of crushing columns. */
.cal-week { min-width:1470px; grid-template-columns:repeat(7,minmax(210px,1fr)); border-radius:var(--radius-sm); }
.cal-wcol { min-height:420px; background:var(--surface-0); }
.cal-wcol-head { min-height:45px; display:flex; align-items:center; justify-content:center; gap:6px; color:var(--ink-500); }
/* Pintasan "+" per tanggal: selalu ada (bukan hanya saat kolom kosong), muncul penuh
   saat hover/focus kolom supaya tidak berisik. */
.cal-wcol-head { position:relative; }
.cal-wcol-add { position:absolute; right:6px; top:50%; transform:translateY(-50%); display:inline-flex; align-items:center; justify-content:center;
  width:24px; height:24px; padding:0; color:var(--text-muted,var(--ink-500)); background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,7px); cursor:pointer; opacity:.45; transition:opacity .14s ease, background .14s ease, color .14s ease; }
.cal-wcol:hover .cal-wcol-add,
.cal-wcol-add:focus-visible { opacity:1; }
.cal-wcol-add:hover { color:var(--primary-contrast,#fff); background:var(--ink-900,var(--ink)); border-color:var(--ink-900,var(--ink)); }
.cal-wcol-head.today .cal-wcol-add { background:transparent; border-color:rgba(255,255,255,.35); color:#fff; }
.cal-wcol-head.today .cal-wcol-add:hover { background:rgba(255,255,255,.18); }
.cal-wcol-head b { width:24px; height:24px; display:grid; place-items:center; border-radius:50%; color:var(--ink); }
.cal-wcol-head.today { background:var(--surface-50); color:var(--ink-500); }
.cal-wcol-head.today b { background:var(--ink); color:#fff; }
.cal-wcol-body { gap:7px; padding:7px; }
.cal-wempty { padding:20px 6px; color:var(--ink-300); }
.cal-scard { width:100%; min-width:0; display:flex; flex-direction:column; align-items:stretch; gap:7px; padding:10px; border:1px solid var(--sched-border); border-left:4px solid var(--sched-accent); border-radius:var(--radius-sm); text-align:left; font:inherit; cursor:pointer; box-shadow:var(--shadow-card); }
.cal-scard-top { display:flex; justify-content:space-between; align-items:flex-start; gap:8px; }
.cal-scard-top b { min-width:0; overflow:hidden; text-overflow:ellipsis; font-size:13px; line-height:1.25; color:var(--ink); }
.cal-scard-top em { flex:none; color:var(--sched-text); font-size:10.5px; font-weight:700; font-style:normal; }
.cal-scard-tags,.cal-scard-state { display:flex; align-items:center; gap:5px; flex-wrap:wrap; }
.cal-brand-chip,.cal-resource-chip { display:inline-flex; align-items:center; max-width:100%; min-height:20px; padding:2px 7px; border:1px solid var(--sched-border); border-radius:6px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:10px; font-weight:680; }
.cal-brand-chip { color:var(--sched-text); background:var(--sched-bg); }
.cal-resource-chip { color:var(--ink-700); background:rgba(255,255,255,.55); border-color:rgba(5,5,5,.1); }
.cal-scard-client,.cal-scard-time { display:flex; align-items:flex-start; gap:6px; min-width:0; color:var(--ink-700); font-size:11px; line-height:1.35; }
.cal-scard-client svg,.cal-scard-time svg { flex:none; margin-top:1px; color:var(--ink-400); }
.cal-scard-client b,.cal-scard-time span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cal-scard-note { padding-top:6px; border-top:1px solid color-mix(in srgb,var(--sched-border) 65%,transparent); color:var(--ink-700); font-size:10.5px; line-height:1.35; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.cal-scard-code { color:var(--ink-400); font-size:10px; }
.cal-conflict-chip { display:inline-flex; align-items:center; gap:3px; padding:2px 6px; border-radius:5px; color:var(--pst-danger-text); background:var(--pst-danger-bg); border:1px solid var(--pst-danger-border); font-size:9.5px; font-weight:700; }
.cal-day-modal { display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:10px; }
.cal-scard--modal { min-height:190px; }

/* Rich day/agenda rows remain scannable at table density. */
.cal-day { gap:8px; padding:10px; }
.cal-day-row { gap:16px; padding:13px 15px; border:1px solid var(--sched-border); border-left:4px solid var(--sched-accent); border-radius:var(--radius-sm); box-shadow:var(--shadow-card); }
.cal-day-row:hover { background:var(--sched-bg); }
.cd-main { gap:2px; }
.cd-main b { font-size:14px; color:var(--ink); }
.cd-main em { font-size:12px; color:var(--ink-700); }
.cd-tags { display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-top:5px; color:var(--ink-500); font-size:10.5px; }
.cd-main small { max-width:720px; margin-top:4px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--ink-500); font-size:10.5px; }
.cd-code { color:var(--ink-400); font-size:10px; }

/* Attention is a real card grid: 3/2/1 columns. */
.cal-attn-shell { margin-bottom:14px; padding:15px; background:var(--surface-0); border:1px solid var(--line-200); border-left:4px solid var(--hot-red); border-radius:var(--radius-md); box-shadow:var(--shadow-card); }
.cal-attn-shell .cal-attn-top { justify-content:space-between; align-items:flex-start; margin-bottom:12px; }
.cal-attn-shell .cal-attn-top p { margin:3px 0 0; color:var(--ink-500); font-size:11.5px; }
.cal-attn-pills { display:flex; gap:6px; flex-wrap:wrap; }
.cal-attn-cards { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:9px; }
.cal-attn-item { --attn-bg:var(--pst-neutral-bg); --attn-border:var(--pst-neutral-border); --attn-text:var(--pst-neutral-text); display:flex; flex-direction:column; min-width:0; padding:12px; background:color-mix(in srgb,var(--attn-bg) 48%,white); border:1px solid var(--attn-border); border-left:3px solid var(--attn-border); border-radius:var(--radius-sm); }
.cal-attn-item.tone-danger { --attn-bg:var(--pst-danger-bg); --attn-border:var(--pst-danger-border); --attn-text:var(--pst-danger-text); }
.cal-attn-item.tone-orange { --attn-bg:var(--pst-orange-bg); --attn-border:var(--pst-orange-border); --attn-text:var(--pst-orange-text); }
.cal-attn-item.tone-warning { --attn-bg:var(--pst-warning-bg); --attn-border:var(--pst-warning-border); --attn-text:var(--pst-warning-text); }
.cal-attn-item header { display:flex; align-items:center; justify-content:space-between; gap:7px; color:var(--ink-400); font-size:9.5px; }
.cal-attn-type { display:inline-flex; align-items:center; gap:5px; color:var(--attn-text); font-size:10.5px; font-weight:750; text-transform:uppercase; letter-spacing:.04em; }
.cal-attn-item h3 { margin:8px 0 10px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--ink); font-size:14px; }
.cal-attn-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px 10px; }
.cal-attn-grid span { min-width:0; }
.cal-attn-grid small { display:block; margin-bottom:2px; color:var(--ink-400); font-size:9.5px; text-transform:uppercase; letter-spacing:.03em; }
.cal-attn-grid b { display:block; overflow:hidden; text-overflow:ellipsis; color:var(--ink-700); font-size:10.8px; line-height:1.35; }
.cal-attn-item footer { display:flex; align-items:center; gap:5px; flex-wrap:wrap; margin-top:auto; padding-top:11px; }
.cal-attn-item footer .abtn:last-child { margin-left:auto; }
.cal-attn-toggle { display:flex; align-items:center; justify-content:center; gap:6px; width:100%; min-height:32px; margin-top:10px; border:0; border-top:1px solid var(--line-100); background:transparent; color:var(--ink-500); font:inherit; font-size:11.5px; font-weight:650; cursor:pointer; }
.cal-attn-toggle:hover { color:var(--ink); }

/* Legend explains the active conditional color rather than a hard-coded status set. */
.cal-legend.cal-legend-card { gap:7px 14px; }
.cal-legend .cal-leg-item { color:var(--ink-700); }
.cal-legend .leg-dot:not(.leg-blocked):not(.ev-conflict-dot) { background:var(--sched-accent); border:1px solid var(--sched-border); }
.cal-leg-empty { color:var(--ink-400); font-size:11px; }
.cal-leg-sep { width:1px; height:18px; background:var(--line-200); }

/* Resource header alignment: the gutter and all columns share the same tokens. */
.cal-res-wrap { --cal-gutter-w:64px; --cal-band-h:28px; --cal-resource-head-h:76px; }
.cal-res-gutter { width:var(--cal-gutter-w); z-index:8; }
.cal-res-cols { flex:1 0 auto; min-width:max-content; }
.cal-res-group { min-width:176px; }
.cal-res-groupcols { min-width:max-content; }
.cal-res-col { flex:0 0 176px; min-width:176px; }
.cal-res-bandhead { height:var(--cal-band-h); }
.cal-res-colhead { height:var(--cal-resource-head-h); top:var(--cal-band-h); padding:9px 10px; gap:3px; }
.cal-res-name { line-height:1.25; }
.cal-res-hours { background:var(--surface-0); }
.cal-res-hr { display:flex; align-items:flex-start; padding:4px 7px 0; }
.cal-res-hr span { position:static; display:block; padding:0; background:transparent; line-height:1; }
.cal-res-ev { border:1px solid var(--sched-border); border-left:4px solid var(--sched-accent); gap:1px; }
.cal-res-ev .rev-service { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--ink); font-size:11px; font-weight:720; }
.cal-res-ev .rev-n { color:var(--ink-700); font-size:10.5px; }
.cal-res-ev .rev-meta { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--sched-text); font-size:9px; opacity:.82; }
.cal-res-ev--compact .rev-n,.cal-res-ev--compact .rev-meta { display:none; }
.cal-res-ev--standard .rev-meta { display:none; }

@media (max-width:1100px) {
  .cal-context-card { grid-template-columns:1fr; align-items:start; }
  .cal-brand-tabs { justify-content:flex-start; }
  .cal-attn-cards { grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:760px) {
  .cal-context-card { padding:14px; }
  .cal-brand-tabs { margin:0 -2px; }
  .cal-toolbar { align-items:flex-start; }
  .cal-toolbar > .grow { display:none; }
  .cal-toolbar .seg { width:100%; overflow-x:auto; justify-content:flex-start; }
  .cal-filterbar > .grow { display:none; }
  .cal-color-control { width:100%; justify-content:space-between; padding:8px 0 0; border-left:0; border-top:1px solid var(--line-200); }
  .cal-color-control select { flex:1; }
  .cal-attn-cards { grid-template-columns:1fr; }
  .cal-attn-grid { grid-template-columns:1fr 1fr; }
  .cal-day-row { display:grid; grid-template-columns:92px minmax(0,1fr); align-items:start; }
  .cd-time { width:auto; }
  .cd-side { grid-column:2; justify-content:flex-start; }
  .cal-leg-sep { width:100%; height:1px; }
}
@media (max-width:480px) {
  .cal-datenav { display:grid; grid-template-columns:32px minmax(0,1fr) 32px; width:100%; }
  .cal-datepill { min-width:0; justify-content:center; }
  .cal-title { overflow:hidden; text-overflow:ellipsis; }
  .cal-datenav #calToday { grid-column:1/-1; }
  .cal-filterbar select { flex:1 1 calc(50% - 8px); min-width:0; }
  .cal-day-row { grid-template-columns:1fr; }
  .cd-side { grid-column:1; }
  .cal-attn-grid { grid-template-columns:1fr; }
}

/* Daftar Jadwal: avatar inisial klien (scoped) */
.sched-cli { display:flex; align-items:center; gap:10px; }
.sched-av { width:30px; height:30px; border-radius:50%; flex:none; display:inline-grid; place-items:center; font-size:12px; font-weight:700; color:var(--ink); background:var(--paper-warm2); border:1px solid var(--line); }

/* ---------- SCHEDULE: Export Jadwal Harian (F4, Ref daily export) ---------- */
.sx-overlay { position:fixed; inset:0; z-index:200; background:rgba(18,18,20,.55); display:flex; flex-direction:column; }
.sx-toolbar { display:flex; align-items:center; gap:12px; padding:11px 16px; background:var(--paper); border-bottom:1px solid var(--line); flex-wrap:wrap; }
.sx-tdate { display:flex; align-items:center; gap:8px; margin:0; }
.sx-tdate label { font-size:12px; color:var(--muted); }
.sx-tdate input { width:auto; }
.sx-toggle { display:inline-flex; align-items:center; gap:7px; font-size:12.5px; color:var(--graphite); cursor:pointer; }
.sx-scroll { flex:1; overflow:auto; padding:20px; display:flex; justify-content:center; align-items:flex-start; }
.sx-sheet { background:#fff; width:100%; max-width:780px; border-radius:var(--r-md); box-shadow:var(--shadow-2); padding:22px 22px 18px; color:var(--ink); }
.sx-empty { padding:40px; text-align:center; color:var(--muted); }
.sx-head { display:flex; justify-content:space-between; align-items:center; gap:12px; padding:14px 18px; margin:-22px -22px 16px; background:var(--ink); color:#fff; border-radius:var(--r-md) var(--r-md) 0 0; }
.sx-brand { font-family:var(--font-display,var(--font-sans)); font-size:16px; font-weight:800; line-height:1.1; display:flex; flex-direction:column; color:#fff; }
.sx-wordmark { letter-spacing:.02em; }
.sx-wordmark b { color:var(--identity-yellow); font-weight:800; }
.sx-brand small { font-size:10px; font-weight:600; letter-spacing:.16em; color:rgba(255,255,255,.7); text-transform:uppercase; margin-top:4px; }
.sx-meta { text-align:right; }
.sx-date { font-size:14px; font-weight:700; color:#fff; }
.sx-updated { font-size:10.5px; color:rgba(255,255,255,.7); font-family:var(--font-mono); margin-top:2px; }
.sx-table { width:100%; border-collapse:separate; border-spacing:3px; table-layout:fixed; }
.sx-table th, .sx-table td { font-size:10px; }
.sx-corner { width:52px; background:var(--paper-warm2); border-radius:6px; font-weight:700; color:var(--graphite); vertical-align:middle; }
.sx-space { background:var(--ink); color:#fff; font-size:10px; font-weight:700; letter-spacing:.07em; padding:5px; border-radius:6px; text-transform:uppercase; }
.sx-room { background:var(--paper-warm); border:1px solid var(--line); border-radius:6px; padding:5px 4px; font-weight:660; color:var(--ink); }
.sx-rowtime { background:var(--paper-warm2); border-radius:6px; font-family:var(--font-mono); font-weight:640; color:var(--graphite); padding:4px; }
.sx-cell { border:1px solid transparent; border-radius:6px; padding:5px 4px; text-align:center; line-height:1.25; vertical-align:middle; }
.sx-cell .sx-lbl { display:block; font-weight:700; font-size:10px; }
.sx-cell .sx-slot { display:block; font-family:var(--font-mono); font-size:8.5px; opacity:.8; margin-top:1px; }
.sx-cell .sx-name { display:block; font-size:8.5px; font-weight:600; margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sx-cell.sx-avail { background:var(--pst-success-bg); color:var(--pst-success-text); border-color:var(--pst-success-border); }
.sx-cell.sx-blocked { color:var(--pst-neutral-text); border-color:var(--pst-neutral-border); background:repeating-linear-gradient(45deg,var(--pst-neutral-bg),var(--pst-neutral-bg) 5px,#fff 5px,#fff 10px); }
.sx-legend { display:flex; flex-wrap:wrap; gap:6px 16px; margin-top:14px; padding-top:12px; border-top:1px solid var(--line-soft); font-size:11px; color:var(--graphite); }
.sx-leg { display:inline-flex; align-items:center; gap:6px; }
.sx-dot { width:10px; height:10px; border-radius:3px; }
@media (max-width:560px){ .sx-sheet { padding:16px 12px; } .sx-table th, .sx-table td { font-size:9px; } .sx-table { border-spacing:2px; } .sx-cell .sx-slot { font-size:7.5px; } }

@media print {
  body.sx-printing { background:#fff !important; }
  body.sx-printing > *:not(.sx-overlay) { display:none !important; }
  body.sx-printing .sx-overlay { position:static; inset:auto; background:none; display:block; }
  body.sx-printing .sx-toolbar { display:none !important; }
  body.sx-printing .sx-scroll { overflow:visible; padding:0; display:block; }
  body.sx-printing .sx-sheet { box-shadow:none; max-width:none; width:auto; border-radius:0; padding:0; }
  @page { margin:12mm; }
}

/* ---------- ROOM MANAGEMENT ---------- */
.res-name { font-weight:600; display:flex; align-items:center; gap:8px; }
.res-code { font-size:11px; color:var(--muted); background:var(--paper-warm2); padding:1px 6px; border-radius:5px; }
tr.res-off { opacity:.55; }
.rel-type { font-family:var(--font-mono); font-size:11px; padding:2px 8px; border-radius:100px; }
.rel-contains { color:var(--pst-blue-text); background:var(--pst-blue-bg); border:1px solid var(--pst-blue-border); }
.rel-exclusive { color:var(--pst-danger-text); background:var(--pst-danger-bg); border:1px solid var(--pst-danger-border); }
.rel-bundle { color:var(--pst-purple-text); background:var(--pst-purple-bg); border:1px solid var(--pst-purple-border); }
.rel-partial_block { color:var(--pst-orange-text); background:var(--pst-orange-bg); border:1px solid var(--pst-orange-border); }
.rel-shared_dependency { color:var(--pst-neutral-text); background:var(--pst-neutral-bg); border:1px solid var(--pst-neutral-border); }
.dot-on { font-size:11.5px; color:var(--ok); font-weight:600; }
.dot-off { font-size:11.5px; color:var(--muted); }

/* ============================================================
   TAMPILAN — theme editor + live preview
   ============================================================ */
.theme-editor { display:grid; grid-template-columns: minmax(0,1fr) minmax(0,440px); gap:20px; align-items:start; }
.theme-controls { min-width:0; }
.theme-preview { position:sticky; top:14px; }
.th-prev-bar { display:flex; align-items:center; gap:8px; margin-bottom:10px; }
.th-prev-title { display:inline-flex; align-items:center; gap:6px; font-size:13px; font-weight:650; color:var(--ink); }
.th-prev-title svg { width:15px; height:15px; }
/* device segmented switcher (mobile/tablet/desktop) */
.th-dev-seg { display:inline-flex; gap:2px; padding:2px; background:var(--paper-warm); border:1px solid var(--line); border-radius:9px; }
.th-dev { width:30px; height:26px; display:inline-flex; align-items:center; justify-content:center; border:0; background:transparent; color:var(--graphite); border-radius:7px; cursor:pointer; transition:background .14s,color .14s; padding:0; }
.th-dev svg { width:15px; height:15px; }
.th-dev:hover { color:var(--ink); }
.th-dev.active { background:var(--ink); color:#fff; }
.th-prev-stage {
  border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper-warm2);
  padding:14px; display:flex; justify-content:center; align-items:flex-start; overflow:hidden;
  transition:height .22s ease;
}
/* frame dirender pada lebar device asli, lalu di-scale agar muat → reflow akurat */
.th-frame { flex:none; transform-origin:top center; transition:transform .22s ease, width .22s ease;
  background:#fff; border-radius:14px; box-shadow:0 8px 30px rgba(10,10,10,.14); overflow:hidden; border:1px solid rgba(10,10,10,.08); }
.th-frame iframe { display:block; width:100%; height:100%; border:0; background:#fff; }
.th-prev-meta { margin-top:9px; text-align:center; font-family:var(--font-mono); font-size:10.5px; letter-spacing:.04em; color:var(--muted); }
.th-prev-meta span { color:var(--graphite); }

/* color swatch rows */
.th-color .swatch, .frow .swatch { display:flex; align-items:center; gap:10px; }
.th-color input[type=color], .swatch input[type=color] {
  width:42px; height:38px; padding:0; border:1px solid var(--line); border-radius:var(--r-sm);
  background:none; cursor:pointer; flex:none;
}
.th-color .ctrl { max-width:140px; }
.swatch input[type=file] { font-size:12px; }

/* toggles */
.th-checks { display:flex; flex-wrap:wrap; gap:10px 18px; }
.th-toggle { display:inline-flex; align-items:center; gap:8px; font-size:13px; font-weight:540; color:var(--ink); cursor:pointer; }
.th-toggle input { width:16px; height:16px; accent-color:var(--ink); cursor:pointer; }

/* accent quick-pick */
.th-accs { display:flex; flex-wrap:wrap; gap:7px; }
.th-acc { width:26px; height:26px; border-radius:7px; border:1px solid rgba(10,10,10,.12); cursor:pointer; padding:0; transition:transform .12s; }
.th-acc:hover { transform:scale(1.12); }

/* sub-heading + range slider (kontrol lebar hero) */
.th-subh { display:flex; align-items:center; gap:7px; font-size:12px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--graphite); margin:16px 0 6px; padding-top:12px; border-top:1px dashed var(--line); }
.th-subh svg { width:14px; height:14px; }
.th-slider label { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.th-slider-val { font-family:var(--font-mono, monospace); font-size:12px; font-weight:700; color:var(--ink); background:var(--paper-warm, #F7F8FA); border:1px solid var(--line); border-radius:6px; padding:1px 7px; }
.th-range { -webkit-appearance:none; appearance:none; width:100%; height:6px; border-radius:100px; background:var(--line); outline:none; margin:8px 0 2px; cursor:pointer; }
.th-range::-webkit-slider-thumb { -webkit-appearance:none; appearance:none; width:18px; height:18px; border-radius:50%; background:var(--ink); border:2px solid #fff; box-shadow:0 1px 3px rgba(0,0,0,.25); cursor:pointer; }
.th-range::-moz-range-thumb { width:18px; height:18px; border-radius:50%; background:var(--ink); border:2px solid #fff; box-shadow:0 1px 3px rgba(0,0,0,.25); cursor:pointer; }

/* slider foto — slot editor (storefront beranda) */
.th-slide-edit { position:relative; padding:14px 14px 4px; margin-top:12px; border:1px solid var(--line); border-radius:12px; background:var(--paper-warm, #F7F8FA); }
.th-slide-edit:first-of-type { margin-top:6px; }
.th-slide-no { position:absolute; top:-9px; left:12px; width:22px; height:22px; border-radius:50%; display:grid; place-items:center; background:var(--ink); color:#fff; font-size:11px; font-weight:700; }

@media (max-width: 980px) {
  .theme-editor { grid-template-columns: 1fr; }
  .theme-preview { position:static; }
}

/* ============================================================
   RBAC — Role, Hak Akses & Modul Pengaturan (PRD 12.04)
   ============================================================ */
.set-subnav { display:flex; gap:6px; overflow-x:auto; padding:2px 0 12px; margin-bottom:14px; border-bottom:1px solid var(--line-soft); -webkit-overflow-scrolling:touch; }
.set-subnav::-webkit-scrollbar { height:0; }
.set-subnav a { display:inline-flex; align-items:center; gap:7px; white-space:nowrap; padding:8px 13px; border-radius:999px; font-size:13px; font-weight:560; color:var(--muted); border:1px solid var(--line); background:var(--paper); }
.set-subnav a:hover { color:var(--ink); }
.set-subnav a.active { background:var(--ink); color:#fff; border-color:var(--ink); }
.set-body { margin-top:2px; }
/* PRD 12.18 (D1): subnav Katalog 3 klaster — label grup + pemisah */
.cat-subnav { align-items:center; }
.cat-subnav-grp { align-self:center; white-space:nowrap; font-size:11px; font-weight:560; color:var(--muted); padding:0 4px 0 2px; text-transform:none; }
.cat-subnav-sep { flex:0 0 auto; align-self:center; width:1px; height:20px; background:var(--line); margin:0 6px; }
/* PRD 12.18 (A2): tab Kategori — filter brand, kartu, chip brand multi */
.catcat-filter { display:flex; gap:7px; flex-wrap:wrap; margin-bottom:12px; }
.catcat-pill { cursor:pointer; font-size:13px; padding:6px 13px; border-radius:999px; border:1px solid var(--line); background:var(--paper); color:var(--muted); white-space:nowrap; }
.catcat-pill:hover { color:var(--ink); }
.catcat-pill.active { background:var(--ink); color:#fff; border-color:var(--ink); }
.catcat-card { border:1px solid var(--line); border-radius:12px; padding:14px 16px; margin-bottom:10px; background:var(--paper); }
.catcat-brandchips { display:flex; gap:6px; flex-wrap:wrap; align-items:center; }
.catcat-bc { cursor:pointer; font-size:11.5px; font-weight:560; padding:3px 11px; border-radius:999px; border:1px solid var(--line); background:var(--paper); color:var(--muted); user-select:none; }
.catcat-bc:hover { color:var(--ink); }
.catcat-bc.on { background:var(--pst-info-bg); color:var(--pst-info-text); border-color:var(--pst-info-border); }
.catcat-uni { font-size:11.5px; color:var(--muted); }
.catcat-foot { display:flex; align-items:center; justify-content:space-between; margin-top:10px; padding-top:10px; border-top:1px solid var(--line-soft); }
.catcat-meta { font-size:12px; color:var(--muted); }
/* PRD 12.18 (A3): Storefront — kartu tampilan per halaman */
.catdisp-h { font-size:14px; font-weight:600; margin:6px 0 10px; display:flex; align-items:center; gap:7px; }
.catdisp-card { border:1px solid var(--line); border-radius:12px; padding:13px 15px; margin-bottom:10px; background:var(--paper); }
.catdisp-head { display:flex; align-items:flex-start; justify-content:space-between; gap:10px; margin-bottom:10px; }
.catdisp-fld { display:flex; flex-wrap:wrap; align-items:center; gap:14px; padding:9px 0; border-top:1px solid var(--line-soft); }
.catdisp-flabel { font-size:12.5px; color:var(--muted); display:inline-flex; align-items:center; gap:6px; min-width:160px; }
.catdisp-ctl { font-size:12.5px; color:var(--muted); display:inline-flex; align-items:center; gap:7px; }
.catdisp-ctl select { min-width:150px; }
/* PRD 12.18 (B4): Wizard Produk 6 tahap */
.wz-stepper { display:flex; gap:6px; flex-wrap:wrap; padding:4px 0 10px; }
.wz-step { font-size:12px; padding:6px 11px; border-radius:999px; border:1px solid var(--line); background:var(--paper); color:var(--muted); cursor:pointer; }
.wz-step.ok { color:var(--ok); border-color:var(--ok); }
.wz-step.cur { background:var(--ink); color:#fff; border-color:var(--ink); }
.wz-step:disabled { opacity:.45; cursor:not-allowed; }
.wz-meter { display:flex; align-items:center; gap:10px; padding:0 0 12px; }
.wz-meter-bar { flex:1; height:6px; background:var(--line-soft); border-radius:999px; overflow:hidden; }
.wz-meter-bar > span { display:block; height:100%; background:var(--accent); transition:width .2s; }
.wz-meter-t { font-size:12px; color:var(--muted); min-width:110px; text-align:right; }
.wz-seg { display:flex; gap:6px; flex-wrap:wrap; }
.wz-chip { cursor:pointer; font-size:13px; padding:7px 13px; border-radius:8px; border:1px solid var(--line); background:var(--paper); color:var(--ink); }
.wz-chip.on { background:var(--pst-info-bg); color:var(--pst-info-text); border-color:var(--pst-info-border); font-weight:560; }
.wz-comprow { display:flex; gap:6px; align-items:center; margin-bottom:6px; flex-wrap:wrap; }
.wz-comprow .ctrl[data-cf=label] { flex:1 1 120px; }
.wz-tayang { display:flex; align-items:center; justify-content:space-between; margin-top:14px; padding-top:12px; border-top:1px solid var(--line-soft); }
.wz-gate { font-size:12.5px; color:var(--muted); display:inline-flex; align-items:center; gap:6px; }
.wz-gate--err { color:var(--danger); font-weight:560; }
.cat-dorrow { display:flex; align-items:center; gap:8px; font-size:13.5px; padding:5px 0; }
.cat-dorrow--sug { color:var(--muted); }
.cat-dor-ok { color:var(--ok); font-style:normal; font-weight:700; }
.cat-dor-no { color:var(--danger); font-style:normal; font-weight:700; }
.cat-dor { font-size:11px; font-weight:560; padding:2px 8px; border-radius:999px; }
.cat-dor--ok { background:var(--ok-bg); color:var(--ok); }
.cat-dor--warn { background:var(--pst-identity-bg); color:var(--pst-identity-text); }
.cat-dor--danger { background:var(--danger-bg); color:var(--danger); }

.set-cards { display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:12px; margin-bottom:20px; }
.set-card { display:flex; align-items:center; gap:13px; padding:15px 16px; background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md); transition:border-color .15s, transform .12s; }
.set-card:hover { border-color:var(--ink); transform:translateY(-1px); }
.set-card .sc-ic { width:38px; height:38px; flex:none; border-radius:10px; display:grid; place-items:center; background:var(--paper-warm2); color:var(--ink); }
.set-card .sc-main { min-width:0; flex:1; }
.set-card .sc-t { font-weight:680; font-size:14px; }
.set-card .sc-d { font-size:12px; color:var(--muted); margin-top:2px; line-height:1.45; }
.set-card .sc-cta { display:inline-flex; align-items:center; gap:3px; font-size:11.5px; font-weight:620; color:var(--ink); white-space:nowrap; }

/* badges */
.role-badge { display:inline-flex; align-items:center; padding:2px 9px; border-radius:999px; font-size:11px; font-weight:680; letter-spacing:.01em; background:var(--paper-warm2); color:var(--ink); border:1px solid var(--line); }
.role-badge.role-super_admin { background:var(--ink); color:#fff; border-color:var(--ink); }
.role-badge.role-owner { background:var(--pst-purple-bg); color:var(--pst-purple-text); border-color:var(--pst-purple-border); }
.role-badge.role-finance { background:var(--pst-success-bg); color:var(--pst-success-text); border-color:var(--pst-success-border); }
.role-badge.role-staf { background:var(--pst-blue-bg); color:var(--pst-blue-text); border-color:var(--pst-blue-border); }
.role-badge.role-intern { background:var(--paper-warm2); color:var(--muted); }
.st-badge { display:inline-flex; padding:2px 9px; border-radius:999px; font-size:11px; font-weight:640; background:var(--paper-warm2); color:var(--muted); border:1px solid var(--line); }
.st-badge.st-active { background:var(--pst-success-bg); color:var(--pst-success-text); border-color:var(--pst-success-border); }
.st-badge.st-susp { background:var(--pst-danger-bg); color:var(--pst-danger-text); border-color:var(--pst-danger-border); }

.row-acts { display:inline-flex; gap:6px; justify-content:flex-end; flex-wrap:wrap; }

/* role grid + matrix */
.role-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:12px; }
.role-card-box { background:var(--paper); border:1px solid var(--line); border-radius:var(--r-md); padding:14px 15px; }
.rcb-top { display:flex; align-items:flex-start; justify-content:space-between; gap:10px; }
.rcb-desc { font-size:12.5px; color:var(--muted); margin:9px 0; line-height:1.5; }
.rcb-meta { display:flex; gap:14px; font-size:11.5px; color:var(--muted); font-weight:560; border-top:1px solid var(--line-soft); padding-top:9px; }
/* PRD 12.12 F2: matriks RBAC tetap tabel, dirapikan — kolom modul sticky tak overlap,
   sel lega, checkbox jadi toggle-pill yang mudah di-scan (CSS-only, state/markup tetap). */
.rm-wrap { max-height:58vh; overflow:auto; border:1px solid var(--line); border-radius:var(--r-sm); }
.rm-table { width:100%; border-collapse:separate; border-spacing:0; }
.rm-table td { padding:8px 10px; border-bottom:1px solid var(--line-soft); vertical-align:middle; }
.rm-table td.rm-cell { border-left:1px solid var(--line-100); min-width:96px; text-align:center; }
.rm-table tr:last-child td { border-bottom:0; }
.rm-mod { font-weight:660; font-size:12.5px; white-space:nowrap; background:var(--paper-warm);
  position:sticky; left:0; z-index:2; border-right:1px solid var(--line); }
/* toggle-pill: checkbox asli disembunyikan, label-span jadi pill (off = ghost, on = pst-success) */
.rm-chk { display:inline-flex; align-items:center; cursor:pointer; position:relative; }
.rm-chk input { position:absolute; opacity:0; width:0; height:0; margin:0; }
.rm-chk span { display:inline-flex; align-items:center; padding:4px 11px; border-radius:var(--radius-pill,100px);
  font-size:11.5px; font-weight:540; white-space:nowrap; border:1px solid var(--line-200);
  background:transparent; color:var(--muted); transition:background .12s,border-color .12s,color .12s; }
.rm-chk:hover span { border-color:var(--ink-500); color:var(--ink); }
.rm-chk input:checked + span { background:var(--pst-success-bg); border-color:var(--pst-success-border); color:var(--pst-success-text); }
.rm-chk input:focus-visible + span { outline:2px solid var(--ink-900); outline-offset:2px; }

/* log tabs */
.set-tabs { display:inline-flex; gap:4px; padding:4px; background:var(--paper-warm2); border-radius:999px; margin-bottom:14px; }
.set-tab { display:inline-flex; align-items:center; gap:6px; padding:7px 15px; border-radius:999px; font-size:13px; font-weight:580; color:var(--muted); background:transparent; }
.set-tab.active { background:var(--paper); color:var(--ink); box-shadow:0 1px 2px rgba(0,0,0,.06); }

/* profil saya */
.prof-head { display:flex; align-items:center; gap:14px; margin-bottom:16px; }
.prof-av { width:54px; height:54px; flex:none; border-radius:50%; background:var(--ink); color:#fff; display:grid; place-items:center; font-weight:700; font-size:18px; overflow:hidden; }
.prof-av img { width:100%; height:100%; object-fit:cover; }
.prof-name { font-weight:720; font-size:16px; }

.th-toggle.is-disabled { opacity:.5; cursor:not-allowed; }

/* ============================================================
   MODUL KATALOG — Fase 1 (Overview, Costing, Brand, Page Map, recipe/HPP)
   ============================================================ */
.cat-note { display:flex; gap:8px; align-items:flex-start; font-size:12.5px; color:var(--graphite); background:var(--paper-warm); border:1px solid var(--line-soft); border-radius:10px; padding:9px 12px; margin-bottom:12px; }
.cat-note code { font-family:var(--font-mono); background:var(--paper); padding:1px 5px; border-radius:5px; border:1px solid var(--line); }
.cat-empty { color:var(--muted); font-size:13px; text-align:center; padding:18px 6px; }
.cat-muted { color:var(--muted); }
.cat-sub { font-size:11.5px; color:var(--muted); margin-top:2px; }
.cat-neg { color:var(--danger); }

/* Review chips */
.cat-rv { display:inline-block; font-size:11px; font-weight:650; padding:2px 8px; border-radius:999px; border:1px solid var(--line); }
.cat-rv--ok { background:var(--ok-bg); color:var(--ok); border-color:transparent; }
.cat-rv--below_floor { background:var(--pst-danger-bg); color:var(--pst-danger-text); border-color:var(--pst-danger-border); }
.cat-rv--low_margin { background:var(--pst-info-bg); color:var(--pst-info-text); border-color:var(--pst-info-border); }
.cat-rv--needs_review { background:var(--pst-neutral-bg); color:var(--pst-neutral-text); border-color:var(--pst-neutral-border); }
.cat-rv--stale { background:var(--paper-warm2); color:var(--graphite); }

/* Overview KPIs */
.cat-kpis { display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:10px; margin-bottom:16px; }
.cat-kpi { display:flex; gap:10px; align-items:center; background:var(--paper); border:1px solid var(--line); border-radius:12px; padding:12px 14px; }
.cat-kpi svg { color:var(--muted); flex:none; }
.cat-kpi--danger { border-color:var(--pst-danger-border); background:var(--pst-danger-bg); }
.cat-kpi--warn { border-color:var(--pst-info-border); background:var(--pst-info-bg); }
.cat-kpi .ck-v { font-size:22px; font-weight:760; line-height:1; }
.cat-kpi .ck-l { font-size:12px; color:var(--graphite); margin-top:3px; }
.cat-kpi .ck-s { font-size:11px; color:var(--muted); margin-top:1px; }
.cat-2col { display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-bottom:14px; }
@media (max-width:720px){ .cat-2col { grid-template-columns:1fr; } }
.cat-panel { background:var(--paper); border:1px solid var(--line); border-radius:12px; padding:13px 15px; }
.cat-panel h4 { margin:0 0 9px; font-size:13px; }
.cat-rankrow { display:flex; align-items:center; gap:10px; padding:6px 0; border-top:1px solid var(--line-soft); font-size:13px; }
.cat-rankrow:first-of-type { border-top:0; }
.cat-rankrow .cr-name { flex:1; font-weight:560; }
.cat-rankrow .cr-brand { font-size:11px; color:var(--muted); }
.cat-quick { display:flex; gap:8px; flex-wrap:wrap; }

/* Tables */
.cat-tablewrap { overflow-x:auto; border:1px solid var(--line); border-radius:12px; }
.cat-table { width:100%; border-collapse:collapse; font-size:13px; }
.cat-table th { text-align:left; font-size:11px; text-transform:uppercase; letter-spacing:.04em; color:var(--muted); padding:9px 12px; border-bottom:1px solid var(--line); background:var(--paper-warm); }
.cat-table td { padding:10px 12px; border-bottom:1px solid var(--line-soft); vertical-align:middle; }
.cat-table tr:last-child td { border-bottom:0; }
.cat-table .mono { font-family:var(--font-mono); }

/* Costing section inside item editor */
.cat-costsec { margin-top:6px; padding:14px; border:1px dashed var(--line); border-radius:12px; background:var(--paper-warm); }
.cat-costsec-h { display:flex; align-items:center; gap:7px; font-weight:650; font-size:13px; margin-bottom:10px; }
.cat-costsec .req { color:var(--danger); }
.cat-recipe { margin-top:6px; }
.cat-recipe-h { display:flex; align-items:center; justify-content:space-between; font-size:12.5px; font-weight:600; margin:6px 0; }
.cat-comprow { display:flex; gap:6px; align-items:center; margin-bottom:6px; flex-wrap:wrap; }
.cat-comprow .ctrl { padding:6px 8px; font-size:12.5px; }
.cat-comprow select.ctrl { max-width:120px; }
.cat-actsw { display:inline-flex; align-items:center; gap:4px; font-size:11.5px; color:var(--graphite); white-space:nowrap; }
.cat-costsum { display:flex; gap:18px; flex-wrap:wrap; align-items:center; margin-top:12px; padding:10px 12px; background:var(--paper); border:1px solid var(--line); border-radius:10px; }
.cat-costsum > div { display:flex; flex-direction:column; gap:2px; }
.cat-costsum span { font-size:10.5px; text-transform:uppercase; letter-spacing:.04em; color:var(--muted); }
.cat-costsum b { font-size:14px; }
.cat-belowreason { margin-top:10px; }
.cat-costhint { font-size:11px; color:var(--muted); margin-top:8px; display:flex; gap:5px; align-items:flex-start; }

/* PRD 12.36 — controller Dynamic Pricing (aturan harga per tier/mode) */
.dp-row { border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:8px; background:var(--paper); }
.dp-row-head { display:flex; gap:6px; align-items:center; }
.dp-row-head select.ctrl { padding:6px 8px; font-size:12.5px; }
.dp-row-head .dp-del { margin-left:auto; color:var(--danger); padding:6px 8px; }
.dp-row-fields { display:flex; gap:14px; flex-wrap:wrap; margin-top:10px; }
.dp-f { display:flex; flex-direction:column; gap:3px; }
.dp-f > span { font-size:10.5px; text-transform:uppercase; letter-spacing:.04em; color:var(--muted); }
.dp-f .ctrl { padding:6px 8px; font-size:12.5px; }
.dp-actions { display:flex; gap:8px; align-items:center; margin-top:6px; }
.dp-actions #i_dynsave { margin-left:auto; }

/* Brand registry editor — grid agar header & input sejajar kolom */
.cat-brandhead, .cat-brandrow { display:grid; grid-template-columns:84px minmax(140px,1fr) 96px 92px auto 36px; gap:8px; align-items:center; }
.cat-brandhead { font-size:11px; text-transform:uppercase; letter-spacing:.04em; color:var(--muted); padding:0 2px 6px; line-height:1.2; }
.cat-brandrow { margin-bottom:7px; }
.cat-brandrow .ctrl { width:100%; min-width:0; }
.cat-brandrow .cat-actsw { justify-self:start; white-space:nowrap; }
@media (max-width:640px){
  .cat-brandhead { display:none; }
  .cat-brandrow { grid-template-columns:1fr 1fr; }
}

/* Multi-select resource (Connect Resource / Room) di editor produk */
/* .cat-resmulti (grid checkbox lama) di-deprecate PRD 12.12 F1/F3 — diganti .chip-field. */
.cat-rescount { font-size:11px; color:var(--graphite); margin-top:4px; }

/* ── Chip Selector (Notion-style multi/single) — PRD 12.12 F1 ── */
.chip-field { display:flex; flex-wrap:wrap; align-items:center; gap:6px; min-height:40px; padding:6px 8px;
  border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); }
.chip-field:focus-within { border-color:var(--ink-900); }
.chip-empty { font-size:12.5px; color:var(--muted); padding:2px 4px; }
.chip { display:inline-flex; align-items:center; gap:6px; padding:4px 7px 4px 9px; border-radius:var(--radius-pill);
  font-size:12.5px; font-weight:560; line-height:1; white-space:nowrap;
  background:var(--pst-neutral-bg); border:1px solid var(--pst-neutral-border); color:var(--pst-neutral-text); }
.chip__dot { width:7px; height:7px; border-radius:50%; background:currentColor; opacity:.8; flex:none; }
.chip__x { display:inline-flex; align-items:center; justify-content:center; background:transparent; border:0;
  color:inherit; opacity:.55; padding:1px; margin-left:1px; border-radius:50%; cursor:pointer; }
.chip__x:hover { opacity:1; background:rgba(0,0,0,.10); }
.chip--mini { font-size:12px; padding:3px 9px; }
.chip--mini .chip__dot { width:6px; height:6px; }
.chip--success { background:var(--pst-success-bg); border-color:var(--pst-success-border); color:var(--pst-success-text); }
.chip--mint    { background:var(--pst-mint-bg);    border-color:var(--pst-mint-border);    color:var(--pst-mint-text); }
.chip--info    { background:var(--pst-info-bg);    border-color:var(--pst-info-border);    color:var(--pst-info-text); }
.chip--blue    { background:var(--pst-blue-bg);    border-color:var(--pst-blue-border);    color:var(--pst-blue-text); }
.chip--purple  { background:var(--pst-purple-bg);  border-color:var(--pst-purple-border);  color:var(--pst-purple-text); }
.chip--pink    { background:var(--pst-pink-bg);    border-color:var(--pst-pink-border);    color:var(--pst-pink-text); }
.chip--warning { background:var(--pst-warning-bg); border-color:var(--pst-warning-border); color:var(--pst-warning-text); }
.chip--orange  { background:var(--pst-orange-bg);  border-color:var(--pst-orange-border);  color:var(--pst-orange-text); }
.chip--danger  { background:var(--pst-danger-bg);  border-color:var(--pst-danger-border);  color:var(--pst-danger-text); }
.chip--neutral { background:var(--pst-neutral-bg); border-color:var(--pst-neutral-border); color:var(--pst-neutral-text); }
.chip--identity{ background:var(--pst-identity-bg);border-color:var(--pst-identity-border);color:var(--pst-identity-text); }
.chip-add { display:inline-flex; align-items:center; gap:5px; padding:4px 10px 4px 8px; border-radius:var(--radius-pill);
  border:1px dashed var(--line-200); background:transparent; color:var(--muted); font:inherit; font-size:12.5px; font-weight:540; cursor:pointer; }
.chip-add:hover { border-style:solid; border-color:var(--ink-500); color:var(--ink); }
.chip-add svg { opacity:.8; }
.chip-add:focus-visible { outline:2px solid var(--ink-900); outline-offset:2px; }
.chip-pop { position:fixed; z-index:9999; min-width:240px; max-width:340px; background:var(--surface-0);
  border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-pop); padding:6px; }
.chip-pop__search { display:flex; align-items:center; gap:7px; padding:5px 8px; margin-bottom:4px;
  border-bottom:1px solid var(--line-100); color:var(--muted); }
.chip-pop__search input { flex:1; border:0; outline:none; background:transparent; font:inherit; font-size:13px; color:var(--ink); }
.chip-pop__list { max-height:260px; overflow:auto; display:flex; flex-direction:column; gap:2px; }
.chip-pop__opt { display:flex; align-items:center; justify-content:space-between; gap:8px;
  padding:5px 7px; border-radius:8px; cursor:pointer; }
.chip-pop__opt:hover, .chip-pop__opt.is-active { background:var(--surface-50); }
.chip-pop__chk { display:inline-flex; color:var(--ink); opacity:0; flex:none; }
.chip-pop__opt.is-sel .chip-pop__chk { opacity:1; }
.chip-pop__empty { padding:10px 8px; font-size:12.5px; color:var(--muted); text-align:center; }
@media (max-width:640px){ .chip-pop { left:8px !important; right:8px; width:auto !important; max-width:none; } }

/* ── Action chips (preset buttons ala chip) — PRD 12.12, dipakai Finance "Aksi cepat" ── */
.chip-act-row { display:flex; flex-wrap:wrap; gap:7px; }
.chip-act { display:inline-flex; align-items:center; gap:7px; padding:6px 12px; border-radius:var(--radius-pill);
  border:1px solid var(--line-200); background:var(--surface-0); color:var(--ink); font:inherit; font-size:12.5px;
  font-weight:540; cursor:pointer; transition:background .12s,border-color .12s,color .12s,transform .04s; }
.chip-act:hover { border-color:var(--ink-500); background:var(--surface-50); }
.chip-act:active { transform:translateY(1px); }
.chip-act:focus-visible { outline:2px solid var(--ink-900); outline-offset:2px; }
.chip-act__dot { width:7px; height:7px; border-radius:50%; flex:none; background:var(--ink-400); }
.chip-act--in .chip-act__dot { background:var(--pst-success-text); }
.chip-act--out .chip-act__dot { background:var(--pst-danger-text); }
.chip-act--in:hover { background:var(--pst-success-bg); border-color:var(--pst-success-border); color:var(--pst-success-text); }
.chip-act--out:hover { background:var(--pst-danger-bg); border-color:var(--pst-danger-border); color:var(--pst-danger-text); }

/* ── In/out toggle (uang masuk hijau · uang keluar merah) — scoped, tak ganggu .seg lain ── */
.seg--io .seg-btn::before { content:''; width:7px; height:7px; border-radius:50%; flex:none; background:var(--ink-400); }
.seg--io .seg-btn[data-fin-dir="in"]::before { background:var(--pst-success-text); }
.seg--io .seg-btn[data-fin-dir="out"]::before { background:var(--pst-danger-text); }
.seg--io .seg-btn[data-fin-dir="in"].active { background:var(--pst-success-bg); color:var(--pst-success-text); box-shadow:none; }
.seg--io .seg-btn[data-fin-dir="out"].active { background:var(--pst-danger-bg); color:var(--pst-danger-text); box-shadow:none; }

/* Page map */
.cat-pchip { display:inline-block; font-size:11.5px; padding:2px 9px; border-radius:999px; background:var(--paper-warm2); color:var(--ink); margin:2px 4px 2px 0; }
.cat-pchip--feat { background:var(--identity-yellow-soft); }
/* .cat-pmrow di-deprecate PRD 12.12 F2 — modal page-map kini pakai .chip-field. */

/* ══ Pedoman / Guides (in-app wiki) — Finance + generik ══════════════ */
.fin-guide-wrap { display:grid; grid-template-columns:264px 1fr; gap:16px; align-items:start; }
/* R-14 — nav sticky WAJIB punya batas tinggi + gulir sendiri; tanpa itu daftar
   artikel yang panjang tidak bisa dijangkau sama sekali. Ambangnya diukur dari
   kontainer modul (D-06), bukan viewport. */
.fin-guide-nav { position:sticky; top:76px; margin-bottom:0;
  max-height:calc(100dvh - 96px); overflow:auto; overscroll-behavior:contain; }
.fin-guide-nav .panel-body { padding:8px; }
@container finroot (max-width: 860px) {
  .fin-guide-wrap { grid-template-columns:1fr; }
  .fin-guide-nav { position:static; max-height:none; overflow:visible; }
}
/* Tabel di dalam artikel Pedoman lolos dari mesin card-mode; beri wadah gulir
   sendiri supaya tidak mendorong lebar halaman. */
.fin-md table { display:block; max-width:100%; overflow-x:auto; }

/* Category color tag (Fresh Tag pastel) */
.fin-cat-chip { display:inline-flex; align-items:center; font-family:var(--font-mono); font-size:10px; font-weight:600;
  letter-spacing:.09em; text-transform:uppercase; padding:3px 9px; border-radius:var(--radius-pill); border:1px solid transparent; margin:13px 0 7px 4px; }
.fin-cat-chip:first-child { margin-top:2px; }

/* Generic pastel palette helpers */
.pst-neutral  { background:var(--pst-neutral-bg);  border-color:var(--pst-neutral-border);  color:var(--pst-neutral-text); }
.pst-blue     { background:var(--pst-blue-bg);     border-color:var(--pst-blue-border);     color:var(--pst-blue-text); }
.pst-mint     { background:var(--pst-mint-bg);     border-color:var(--pst-mint-border);     color:var(--pst-mint-text); }
.pst-info     { background:var(--pst-info-bg);     border-color:var(--pst-info-border);     color:var(--pst-info-text); }
.pst-purple   { background:var(--pst-purple-bg);   border-color:var(--pst-purple-border);   color:var(--pst-purple-text); }
.pst-warning  { background:var(--pst-warning-bg);  border-color:var(--pst-warning-border);  color:var(--pst-warning-text); }
.pst-identity { background:var(--pst-identity-bg); border-color:var(--pst-identity-border); color:var(--pst-identity-text); }

/* Article link */
.fin-guide-link { display:flex; align-items:center; gap:9px; padding:8px 10px; border-radius:var(--r-sm);
  color:var(--graphite); font-size:13px; font-weight:520; text-decoration:none; line-height:1.35; transition:background .12s,color .12s; }
.fin-guide-link svg { flex:none; color:var(--muted); transition:color .12s; }
.fin-guide-link:hover { background:var(--paper-warm); color:var(--ink); }
.fin-guide-link.active { background:var(--ink-950); color:#fff; font-weight:640; box-shadow:var(--shadow-card); }
.fin-guide-link.active svg { color:var(--identity-yellow); }

/* Article header */
.fin-guide-head { align-items:flex-start; }
.fin-guide-title h2 { font-family:var(--font-heading); font-size:18px; font-weight:760; letter-spacing:-.01em; }
.fin-guide-sum { font-size:12.5px; color:var(--muted); margin-top:4px; max-width:62ch; line-height:1.5; }
.fin-guide-actions { display:flex; gap:6px; flex:none; }

/* ── Rendered markdown body ─────────────────────────────────────── */
.fin-md { font-size:13.5px; line-height:1.7; color:var(--ink-900); max-width:76ch; }
.fin-md > :first-child { margin-top:0; }
.fin-md > :last-child { margin-bottom:0; }
.fin-md h2 { font-family:var(--font-heading); font-size:16px; font-weight:720; letter-spacing:-.01em;
  margin:22px 0 9px; padding-bottom:6px; border-bottom:1px solid var(--line); }
.fin-md h3 { font-size:14px; font-weight:700; margin:18px 0 6px; color:var(--ink); }
.fin-md h4 { font-size:12.5px; font-weight:700; margin:16px 0 5px; color:var(--graphite); }
.fin-md p { margin:0 0 11px; }
.fin-md ul, .fin-md ol { margin:0 0 12px; padding-left:22px; }
.fin-md li { margin:5px 0; padding-left:3px; }
.fin-md li::marker { color:var(--muted); }
.fin-md ol li::marker { color:var(--electric-blue); font-weight:700; }
.fin-md strong { font-weight:680; color:var(--ink); }
.fin-md em { font-style:italic; }
.fin-md a { color:var(--electric-blue); text-decoration:underline; text-underline-offset:2px; }
.fin-md a:hover { color:var(--ink); }
.fin-md code { font-family:var(--font-mono); font-size:.86em; background:var(--pst-neutral-bg);
  border:1px solid var(--line); border-radius:5px; padding:1px 5px; color:var(--ink-900); }
.fin-md pre.md-pre { background:var(--ink-950); color:#eaeaea; border-radius:var(--r-sm); padding:12px 14px; overflow:auto; margin:0 0 12px; }
.fin-md pre.md-pre code { background:none; border:0; padding:0; color:inherit; font-size:12px; }
.fin-md blockquote.md-quote { margin:0 0 12px; padding:10px 14px; background:var(--pst-info-bg);
  border-left:3px solid var(--pst-info-border); border-radius:0 var(--r-sm) var(--r-sm) 0; color:var(--pst-info-text); font-size:13px; }
.fin-md blockquote.md-quote a { color:var(--pst-info-text); }
.fin-md hr.md-hr { border:0; border-top:1px solid var(--line); margin:18px 0; }
.fin-md table.fin-tbl { width:100%; border-collapse:collapse; margin:0 0 14px; font-size:12.5px;
  border:1px solid var(--line); border-radius:var(--r-sm); overflow:hidden; }
.fin-md table.fin-tbl th { background:var(--paper-warm); text-align:left; font-weight:680; font-size:11px;
  text-transform:uppercase; letter-spacing:.04em; color:var(--graphite); padding:9px 12px; border-bottom:1px solid var(--line); }
.fin-md table.fin-tbl td { padding:9px 12px; border-bottom:1px solid var(--line-soft); vertical-align:top; }
.fin-md table.fin-tbl tr:last-child td { border-bottom:0; }

@media (max-width:860px){
  .fin-guide-wrap { grid-template-columns:1fr; }
  .fin-guide-nav { position:static; }
}

/* Header "Pedoman" tab per modul (PRD 12.16 D1-b) */
.guide-tab { display:inline-flex; align-items:center; gap:6px; padding:6px 12px; border-radius:var(--radius-pill);
  border:1px solid var(--line); background:var(--paper); color:var(--graphite); font-size:12.5px; font-weight:600;
  text-decoration:none; white-space:nowrap; transition:background .12s,color .12s,border-color .12s; }
.guide-tab svg { color:var(--muted); }
.guide-tab:hover { background:var(--paper-warm); color:var(--ink); border-color:var(--ink-400); }
.guide-tab.active { background:var(--ink-950); color:#fff; border-color:var(--ink-950); }
.guide-tab.active svg { color:var(--identity-yellow); }

/* Draft (unpublished) article in nav */
.fin-guide-link.is-draft span { opacity:.6; font-style:italic; }
.fin-guide-link.is-draft::after { content:"draft"; margin-left:auto; font-size:9.5px; font-weight:600; text-transform:uppercase;
  letter-spacing:.06em; color:var(--pst-warning-text); background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border);
  padding:1px 6px; border-radius:var(--radius-pill); }

/* Settings → Pedoman: baris toggle visibilitas per modul */
.guide-vis-row { display:flex; align-items:center; justify-content:space-between; gap:14px; padding:12px 2px; border-bottom:1px solid var(--line-soft); }
.guide-vis-row:last-child { border-bottom:0; }
.guide-vis-row .gv-name { font-weight:640; font-size:13.5px; }
.guide-vis-row .gv-sub { font-size:11.5px; margin-top:2px; }
.gv-toggle { min-width:52px; text-align:center; flex:none; }

/* ══ Asisten Onboarding (PRD 12.30) — launcher = tombol topbar #asstTopBtn; panel dropdown kanan-atas ══ */
#bgAsst { position:fixed; z-index:1200; }   /* wadah panel; tak ada lagi FAB mengambang */
/* Lebar fluid (vw) + batas rem — sebelumnya 380px mati. Token DS disamakan
   dgn drawer lain (surface-0 / line-200 / radius-lg). */
.asst-panel { position:fixed; top:62px; right:18px; width:clamp(18rem,26vw,23.75rem); max-width:calc(100vw - 32px); height:520px; max-height:calc(100vh - 92px);
  background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-lg,var(--r-lg)); box-shadow:var(--shadow-pop); display:flex; flex-direction:column; overflow:hidden; z-index:1200; }
.asst-panel[hidden] { display:none; }
.asst-head { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; padding:13px 15px; background:var(--ink-950); color:#fff; }
.asst-head b { font-size:14px; font-weight:700; }
.asst-sub { font-size:11px; color:#B8B8B4; margin-top:2px; }
.asst-x { background:none; border:0; color:#fff; cursor:pointer; opacity:.8; }
.asst-x:hover { opacity:1; }
.asst-msgs { flex:1; overflow-y:auto; padding:14px; display:flex; flex-direction:column; gap:10px; background:var(--app-bg); }
.asst-msg { max-width:90%; font-size:13px; line-height:1.55; padding:9px 12px; border-radius:14px; }
.asst-msg.user { align-self:flex-end; background:var(--ink-950); color:#fff; border-bottom-right-radius:4px; }
.asst-msg.bot { align-self:flex-start; background:var(--paper); border:1px solid var(--line); border-bottom-left-radius:4px; }
.asst-msg.bot p { margin:0 0 6px; } .asst-msg.bot :last-child { margin-bottom:0; }
.asst-msg.bot strong { font-weight:680; }
.asst-msg.bot code { font-family:var(--font-mono); font-size:.85em; background:var(--pst-neutral-bg); border:1px solid var(--line); border-radius:5px; padding:1px 5px; }
.asst-typing { color:var(--muted); letter-spacing:2px; }
.asst-srcs { display:flex; flex-direction:column; gap:4px; margin-top:8px; }
.asst-src { display:inline-flex; align-items:center; gap:6px; font-size:11.5px; font-weight:600; color:var(--electric-blue);
  background:var(--pst-blue-bg); border:1px solid var(--pst-blue-border); border-radius:var(--radius-pill); padding:3px 10px; text-decoration:none; }
.asst-src:hover { background:var(--pst-blue-border); color:var(--ink); }
.asst-fb { display:flex; flex-wrap:wrap; gap:6px; align-self:flex-start; }
.asst-input { display:flex; gap:8px; padding:10px; border-top:1px solid var(--line); background:var(--paper); }
.asst-input .ctrl { flex:1; }
.asst-input .abtn { flex:none; padding:8px 12px; }
.asst-foot { font-size:10.5px; color:var(--muted); padding:6px 12px 9px; background:var(--paper); text-align:center; }
.asst-foot a { color:var(--electric-blue); }
@media (max-width:520px){ .asst-panel { top:56px; left:8px; right:8px; width:auto; max-width:none; height:auto; max-height:calc(100dvh - 150px); } }

/* Inbox tiket — chip gap analitik */
.gap-row { display:flex; flex-wrap:wrap; gap:8px; }
.gap-chip { font-size:12px; padding:4px 11px; border-radius:var(--radius-pill); background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border); color:var(--pst-warning-text); }
.ht-q { background:var(--paper-warm); border:1px solid var(--line); border-radius:var(--r-sm); padding:10px 13px; margin-bottom:12px; font-size:13px; }

/* ============================================================
   PRD 12.26 — Workspace Forum & Internal Chat
   ============================================================ */
.ws-top-cluster{ display:inline-flex; gap:4px; align-items:center; }
.ws-top-btn{ position:relative; display:inline-grid; place-items:center; width:34px; height:34px; border-radius:9px;
  border:1px solid var(--line,#e6e8ee); background:var(--paper,#fff); color:var(--ink,#1a1a2e); cursor:pointer; transition:background .15s ease; }
.ws-top-btn:hover{ background:var(--paper-warm,#f7f8fa); }
.ws-badge{ position:absolute; top:-5px; right:-5px; min-width:16px; height:16px; padding:0 4px; border-radius:9px;
  background:var(--danger,#dc2626); color:#fff; font-size:10px; font-weight:700; line-height:16px; text-align:center; }
.ws-ch .ws-badge{ position:static; }

/* Launcher chat = tombol topbar #wsChatBtn (bubble mengambang dipensiunkan). */

/* Notif bell popover */
.ws-bell-pop{ position:fixed; right:18px; top:62px; z-index:76; width:340px; max-width:calc(100vw - 24px); max-height:70vh; overflow:auto;
  background:var(--paper,#fff); border:1px solid var(--line,#e6e8ee); border-radius:14px; box-shadow:0 16px 48px rgba(5,5,5,.18); }
.ws-pop-head{ display:flex; align-items:center; justify-content:space-between; gap:8px; padding:12px 14px; border-bottom:1px solid var(--line,#e6e8ee); }
.ws-pop-body{ padding:6px; }
.ws-noti{ display:block; padding:9px 10px; border-radius:9px; text-decoration:none; color:var(--ink,#1a1a2e); }
.ws-noti:hover{ background:var(--paper-warm,#f7f8fa); }
.ws-noti.is-unread{ background:rgba(79,70,229,.06); }
.ws-noti-t{ font-weight:650; font-size:13px; }
.ws-noti-b{ font-size:12px; color:var(--muted,#6b7280); margin-top:1px; }
.ws-noti-time{ font-size:11px; color:var(--muted,#9aa0ab); margin-top:2px; }
.ws-empty{ padding:18px; text-align:center; color:var(--muted,#6b7280); font-size:13px; }

/* ══ Notifikasi tindakan booking — nav badge + bell. Reuse anatomi .ws-* (bell/pop). ══ */
/* vs-badge — DS primitif (12.04.00 data-display/Badge.jsx): hitungan/dot untuk nav, tab, icon. */
.vs-badge{ display:inline-flex; align-items:center; justify-content:center; min-width:20px; height:20px;
  padding:0 6px; border-radius:var(--radius-pill); font-family:var(--font-mono); font-size:11px; font-weight:600;
  line-height:1; font-variant-numeric:tabular-nums; box-sizing:border-box; }
.vs-badge--sm{ min-width:16px; height:16px; font-size:10px; padding:0 4px; }
.vs-badge--dot{ min-width:0; width:8px; height:8px; padding:0; }
.vs-badge--ink{ background:var(--primary); color:var(--primary-contrast); }
.vs-badge--brand{ background:var(--brand); color:var(--brand-ink); }
.vs-badge--danger{ background:var(--accent-red); color:#fff; }
.vs-badge--neutral{ background:var(--ink-100); color:var(--text-muted); }

/* Badge hitungan pada item nav (desktop): dorong ke ujung kanan saat sidebar terbuka. */
.nav a .nav-badge{ margin-left:auto; display:inline-flex; flex:0 0 auto; }
@media (min-width:861px){
  /* Rail tertutup: tak ada ruang angka → badge jadi dot di pojok ikon. */
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .nav a{ overflow:visible; }
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .nav a .nav-badge{
    position:absolute; top:6px; right:16px; margin:0; }
  .admin-shell.is-rail .sidebar:not(:hover):not(:focus-within) .nav a .nav-badge .vs-badge{
    min-width:9px; width:9px; height:9px; padding:0; font-size:0; box-shadow:0 0 0 2px var(--paper,#fff); }
}
/* Badge pada nav mobile: dot/hitungan di pojok kanan-atas item. */
.mnav a{ position:relative; }
.mnav a .nav-badge{ position:absolute; top:4px; right:12px; }
.mnav a .nav-badge .vs-badge{ box-shadow:0 0 0 2px var(--paper,#fff); }

/* Baris notifikasi booking di popover (komposit = grid auto|minmax(0,1fr)|auto). */
.bk-notice-row{ display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:11px;
  padding:9px 10px; border-radius:var(--radius-sm); text-decoration:none; color:var(--ink); }
.bk-notice-row:hover{ background:var(--paper-warm,#f7f8fa); }
.bk-notice-ic{ width:32px; height:32px; border-radius:9px; display:grid; place-items:center; }
.bk-notice-ic--danger{ background:var(--tag-danger-bg); color:var(--tag-danger-text); }
.bk-notice-ic--warning{ background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.bk-notice-ic--neutral{ background:var(--surface-50); color:var(--text-muted); }
.bk-notice-tt{ font-weight:640; font-size:13px; }
.bk-notice-sb{ font-size:11.5px; color:var(--muted); margin-top:1px; }
.bk-notice-empty{ padding:22px 14px; text-align:center; color:var(--muted); font-size:13px; }
.bk-notice-foot{ padding:9px 12px 11px; border-top:1px solid var(--line); }
.bk-notice-foot .abtn{ width:100%; justify-content:center; }

/* Isi popover = booking nyata, bukan cuma angka. Popover ini sedikit lebih lebar dari
   .ws-bell-pop bawaan supaya nama klien + subline muat satu baris; scope ke #bkNoticePop
   saja agar popover lonceng WSComm tidak ikut berubah. */
#bkNoticePop{ width:382px; }
/* Judul + petunjuk ditumpuk: dua-duanya di satu baris flex bikin keduanya terjepit
   jadi 2 baris masing-masing di lebar 382px. */
#bkNoticePop .ws-pop-head{ display:block; }
.bk-notice-hint{ display:block; margin-top:2px; font-size:10.5px; color:var(--muted); font-weight:500; }
/* Judul + subline kategori: keduanya span; tanpa display:block mereka mengalir jadi
   satu kalimat ("…diproses7 overdue (>12 jam)"). */
.bk-notice-tt{ display:block; }
.bk-notice-sb{ display:block; }
.bk-notice-grp{ padding-bottom:4px; }
.bk-notice-grp + .bk-notice-grp{ margin-top:2px; border-top:1px solid var(--line-100); padding-top:4px; }
/* Baris item: nama | kode  ·  detail di baris kedua (span penuh).
   TANPA garis warna di pinggir — warna kategori cukup hidup di fill ikon kategori.
   Indent 43px = lebar ikon kategori (32) + gap (11), jadi item lurus di bawah judulnya. */
.bk-notice-item{ display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline;
  column-gap:8px; row-gap:1px; margin:1px 0 1px 43px; padding:5px 9px;
  border-radius:var(--radius-sm); text-decoration:none; color:var(--ink); }
.bk-notice-item:hover{ background:var(--paper-warm,#f7f8fa); }
.bk-notice-item__tt{ min-width:0; font-size:12.5px; font-weight:600;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bk-notice-item__id{ font-size:10.5px; color:var(--text-muted); white-space:nowrap; }
.bk-notice-item__sb{ grid-column:1 / -1; min-width:0; font-size:11px; color:var(--muted);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bk-notice-more{ display:block; margin:2px 0 0 43px; padding:5px 9px; border-radius:var(--radius-sm);
  font-size:11px; font-weight:600; color:var(--text-muted); text-decoration:none; }
.bk-notice-more:hover{ background:var(--paper-warm,#f7f8fa); color:var(--text-strong); }
.bk-notice-load{ padding:10px 12px; font-size:11.5px; color:var(--muted); display:flex; align-items:center; gap:6px; }

/* Chat slide-over */
.ws-chat-overlay{ position:fixed; inset:0; z-index:70; background:rgba(10,10,10,.28); }
/* Lebar fluid (vw) + batas rem — sebelumnya 440px mati. Token DS disamakan. */
.ws-chat-panel{ position:fixed; top:0; right:0; bottom:0; z-index:72; width:clamp(20rem,30vw,27.5rem); max-width:100vw; display:flex; flex-direction:column;
  background:var(--surface-0,var(--paper,#fff)); border-left:1px solid var(--line-200,var(--line,#e6e8ee)); box-shadow:-12px 0 36px rgba(5,5,5,.14); }
/* `display:flex` di atas mengalahkan UA `[hidden]{display:none}`, jadi atribut hidden harus ditegaskan
   ulang — kalau tidak, panel chat kosong nyangkut sbg lapisan blank di kanan tiap modul. (lih. pola .pos-*-menu[hidden]) */
.ws-chat-overlay[hidden], .ws-chat-panel[hidden]{ display:none !important; }
.ws-chat-head{ display:flex; align-items:center; gap:8px; padding:12px 14px; border-bottom:1px solid var(--line,#e6e8ee); }
.ws-x{ display:inline-grid; place-items:center; width:30px; height:30px; border-radius:8px; border:none; background:transparent; cursor:pointer; color:var(--ink,#1a1a2e); }
.ws-x:hover{ background:var(--paper-warm,#f7f8fa); }
.ws-chat-body{ flex:1; display:flex; min-height:0; }
.ws-chat-list{ width:160px; border-right:1px solid var(--line,#e6e8ee); overflow:auto; padding:6px; }
.ws-ch{ display:flex; align-items:center; gap:6px; width:100%; padding:8px; border:none; background:transparent; border-radius:9px; cursor:pointer; text-align:left; color:var(--ink,#1a1a2e); }
.ws-ch:hover{ background:var(--paper-warm,#f7f8fa); }
.ws-ch.is-active{ background:rgba(79,70,229,.1); }
.ws-ch-nm{ flex:1; font-size:12.5px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ws-chat-main{ flex:1; display:flex; flex-direction:column; min-width:0; }
.ws-msgs{ flex:1; overflow:auto; padding:12px; display:flex; flex-direction:column; gap:8px; }
.ws-msg{ max-width:84%; align-self:flex-start; }
.ws-msg--own{ align-self:flex-end; text-align:right; }
.ws-msg--del{ align-self:center; color:var(--muted,#9aa0ab); font-size:12px; font-style:italic; }
.ws-msg-meta{ font-size:10.5px; color:var(--muted,#9aa0ab); margin-bottom:2px; }
.ws-msg-body{ display:inline-block; padding:8px 11px; border-radius:12px; background:var(--paper-warm,#f1f2f5); font-size:13.5px; line-height:1.45; text-align:left; word-break:break-word; }
.ws-msg--own .ws-msg-body{ background:var(--accent,#4f46e5); color:#fff; }
.ws-msg-acts{ display:flex; gap:6px; align-items:center; margin-top:3px; flex-wrap:wrap; font-size:11px; }
.ws-msg--own .ws-msg-acts{ justify-content:flex-end; }
.ws-react{ background:var(--paper-warm,#f1f2f5); border:1px solid var(--line,#e6e8ee); border-radius:20px; padding:1px 7px; cursor:pointer; }
.ws-react-add,.ws-mini,.ws-mini-act{ cursor:pointer; color:var(--muted,#6b7280); display:inline-flex; align-items:center; gap:3px; }
.ws-react-add:hover,.ws-mini:hover,.ws-mini-act:hover{ color:var(--accent,#4f46e5); }
.ws-composer{ display:flex; gap:8px; padding:10px; border-top:1px solid var(--line,#e6e8ee); align-items:flex-end; }
.ws-composer textarea{ flex:1; resize:none; max-height:120px; }
.ws-pick-list{ display:flex; flex-direction:column; gap:4px; max-height:200px; overflow:auto; border:1px solid var(--line,#e6e8ee); border-radius:9px; padding:8px; }
.ws-pick{ display:flex; align-items:center; gap:8px; font-size:13px; }

/* Forum */
.ws-forum-mini{ padding:4px; }
.ws-forum-mini-row{ display:flex; align-items:center; gap:6px; padding:8px 10px; border-radius:8px; text-decoration:none; color:var(--ink,#1a1a2e); }
.ws-forum-mini-row:hover{ background:var(--paper-warm,#f7f8fa); }
.ws-forum-mini-row.is-unread .ws-fm-title{ font-weight:700; }
.ws-fm-title{ flex:1; font-size:13px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ws-fm-meta{ font-size:11px; color:var(--muted,#9aa0ab); display:inline-flex; gap:4px; align-items:center; }
.ws-forum-mini-foot{ padding:8px 10px; }
.ws-cat-list{ display:flex; flex-direction:column; gap:6px; }
.ws-cat-card{ display:flex; align-items:center; gap:10px; padding:10px 12px; border:1px solid var(--line,#e6e8ee); border-radius:11px; text-decoration:none; color:var(--ink,#1a1a2e); }
.ws-cat-card:hover{ background:var(--paper-warm,#f7f8fa); }
.ws-cat-ic{ display:grid; place-items:center; width:34px; height:34px; border-radius:9px; background:rgba(79,70,229,.1); color:var(--accent,#4f46e5); }
.ws-cat-nm{ font-weight:650; font-size:14px; }
.ws-cat-ct{ font-weight:700; color:var(--muted,#6b7280); font-size:13px; }
.ws-thread-list{ display:flex; flex-direction:column; }
.ws-thread-row{ display:block; padding:11px 14px; border-bottom:1px solid var(--line,#eef0f3); text-decoration:none; color:var(--ink,#1a1a2e); }
.ws-thread-row:hover{ background:var(--paper-warm,#f7f8fa); }
.ws-tr-main{ display:flex; align-items:center; gap:6px; }
.ws-tr-title{ font-weight:620; font-size:14px; }
.ws-thread-row.is-unread .ws-tr-title{ font-weight:800; }
.ws-tr-meta{ font-size:11.5px; color:var(--muted,#9aa0ab); margin-top:2px; }
.ws-thread-top{ display:flex; align-items:center; gap:8px; margin-bottom:12px; }
.ws-thread-h h2{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:19px; margin:0; }
.ws-posts{ display:flex; flex-direction:column; gap:10px; margin:14px 0; }
.ws-post{ background:var(--paper,#fff); border:1px solid var(--line,#e6e8ee); border-radius:12px; padding:13px 15px; }
.ws-post.is-answer{ border-color:var(--ok,#16a34a); box-shadow:0 0 0 1px var(--ok,#16a34a) inset; }
.ws-post--del{ color:var(--muted,#9aa0ab); font-style:italic; }
.ws-post-head{ display:flex; align-items:center; gap:8px; margin-bottom:6px; }
.ws-post-body{ font-size:14px; line-height:1.6; word-break:break-word; }
.ws-post-acts{ display:flex; gap:12px; align-items:center; margin-top:9px; flex-wrap:wrap; font-size:12px; }
.ws-answer-tag{ display:inline-flex; align-items:center; gap:3px; color:var(--ok,#16a34a); font-weight:650; font-size:12px; }
.ws-locked{ display:flex; align-items:center; gap:8px; color:var(--muted,#6b7280); font-size:13px; padding:8px 0; }

@media (max-width:640px){
  .ws-chat-panel{ width:100vw; }
}

/* 12.26 F4 — thread↔entity link card */
.ws-link-card{ display:inline-flex; align-items:center; gap:7px; margin-top:8px; padding:7px 12px; border-radius:10px;
  border:1px solid var(--line,#e6e8ee); background:var(--paper-warm,#f7f8fa); text-decoration:none; color:var(--ink,#1a1a2e); font-size:13px; }
.ws-link-card:hover{ border-color:var(--accent,#4f46e5); }
.ws-link-card .meta{ color:var(--muted,#9aa0ab); }

/* PRD 12.28 Customer Trust Engine — badge standing & conduct */
.pay-chip.trust-st{font-weight:700}
.pay-chip.trust-green{background:#e7f7ed;color:#0f7a3d;border:1px solid #bfe8cf}
.pay-chip.trust-neutral{background:#eef0f3;color:#555c68;border:1px solid #dfe2e8}
.pay-chip.trust-red{background:#fdeaea;color:#b3261e;border:1px solid #f3c4c0}
.pay-chip.trust-conduct{font-weight:700}
.pay-chip.trust-c-watchlist{background:#fff3e0;color:#b7791f;border:1px solid #f3dcae}
.pay-chip.trust-c-suspended{background:#fdeaea;color:#b3261e;border:1px solid #f3c4c0}

/* ============================================================
   Reception Station (PRD 12.32) — kiosk lock-screen, badge, PIN
   ============================================================ */
.station-lock{ position:fixed; inset:0; z-index:9000; display:none; align-items:center; justify-content:center; padding:24px; background:rgba(8,8,12,.72); backdrop-filter:blur(8px); }
body.station-locked{ overflow:hidden; }
body.station-locked .admin-shell, body.station-locked .admin-main{ filter:blur(3px); pointer-events:none; }
.station-lock .st-card{ width:min(440px,94vw); border-radius:22px; padding:30px 26px 22px; color:#fff; text-align:center; box-shadow:0 30px 80px rgba(0,0,0,.5); }
.st-card .st-brand{ font-family:var(--font-heading); font-weight:800; letter-spacing:.16em; font-size:13px; opacity:.8; text-transform:uppercase; }
.st-card .st-label{ font-size:20px; font-weight:700; margin-top:2px; }
.st-card .st-clock{ font-family:var(--font-mono); font-size:40px; font-weight:700; margin:10px 0 14px; letter-spacing:.04em; }
.st-card .st-qr{ background:#fff; border-radius:16px; padding:14px; width:248px; height:248px; margin:0 auto; display:flex; align-items:center; justify-content:center; }
.st-card .st-qr svg{ width:100%; height:100%; display:block; }
.st-qr-fallback{ font-family:var(--font-mono); font-size:11px; color:#111; word-break:break-all; }
.st-card .st-help{ display:flex; gap:8px; align-items:center; justify-content:center; font-size:13px; opacity:.92; margin-top:16px; line-height:1.4; }
.st-card .st-help svg{ flex:0 0 auto; }
.st-card .st-foot{ font-size:11px; opacity:.6; margin-top:8px; }
.st-card .st-op{ display:inline-flex; gap:6px; align-items:center; font-size:13px; background:rgba(255,255,255,.12); padding:5px 12px; border-radius:999px; margin:8px 0 14px; }
.st-card--pin .st-altrow{ display:flex; gap:8px; justify-content:center; margin-top:14px; }
.st-spin{ width:30px; height:30px; border:3px solid var(--ink-100); border-top-color:var(--ink-950); border-radius:50%; animation:stspin .7s linear infinite; margin:6px auto; }
@keyframes stspin{ to{ transform:rotate(360deg); } }

/* operator badge (floating, active state) */
.station-badge{ position:fixed; top:10px; right:14px; z-index:8000; display:none; align-items:center; gap:8px; background:var(--panel,#fff); border:1px solid var(--line,#e6e6ea); border-radius:999px; padding:5px 6px 5px 12px; box-shadow:0 6px 20px rgba(0,0,0,.1); font-size:13px; }
.station-badge .stb-dot{ width:8px; height:8px; border-radius:50%; background:#22c55e; box-shadow:0 0 0 3px rgba(34,197,94,.18); }
.station-badge .stb-name{ display:inline-flex; gap:5px; align-items:center; font-weight:600; color:var(--ink,#111); }
.station-badge .stb-menu{ display:inline-flex; align-items:center; justify-content:center; width:30px; height:30px; border:none; background:transparent; border-radius:999px; cursor:pointer; color:var(--muted,#666); }
.station-badge .stb-menu:hover{ background:rgba(0,0,0,.06); }
.st-menu{ display:flex; flex-direction:column; gap:8px; }
.st-menu .abtn{ justify-content:flex-start; }

/* PIN pad */
.pinpad{ max-width:248px; margin:0 auto; }
.pin-dots{ display:flex; gap:10px; justify-content:center; margin:4px 0 14px; min-height:14px; }
.pin-dots span{ width:12px; height:12px; border-radius:50%; border:2px solid rgba(255,255,255,.5); }
.pin-dots span.on{ background:#fff; border-color:#fff; }
.pin-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:10px; }
.pin-key{ height:54px; border-radius:14px; border:1px solid rgba(255,255,255,.16); background:rgba(255,255,255,.08); color:#fff; font-size:22px; font-weight:600; cursor:pointer; display:flex; align-items:center; justify-content:center; }
.pin-key:active{ transform:scale(.96); }
.pin-key.pin-ok{ background:#fff; color:#111; border-color:#fff; }
.pin-key.pin-min{ font-size:18px; }
.pin-hint{ font-size:12px; opacity:.8; text-align:center; margin-top:12px; }
/* PIN pad inside white modal (switch operator) → dark keys */
.mc-body .pinpad .pin-dots span{ border-color:rgba(0,0,0,.3); }
.mc-body .pinpad .pin-dots span.on{ background:#111; border-color:#111; }
.mc-body .pinpad .pin-key{ border-color:var(--line,#e6e6ea); background:#f6f6f8; color:#111; }
.mc-body .pinpad .pin-key.pin-ok{ background:#111; color:#fff; }
.mc-body .pinpad .pin-hint{ color:var(--muted,#666); }

/* Pusat Kendali Stasiun rows */
.stn-row{ display:flex; align-items:center; gap:12px; padding:12px 16px; border-bottom:1px solid var(--line,#eee); }
.stn-row:last-child{ border-bottom:none; }
.stn-row .stn-main{ flex:1; min-width:0; }
.stn-row .stn-name{ display:flex; gap:6px; align-items:center; font-weight:600; }
.stn-row .stn-sub{ font-size:12px; margin-top:2px; }
.stn-row .stn-act{ display:flex; gap:6px; white-space:nowrap; }
@media (max-width:520px){ .stn-row{ flex-wrap:wrap; } .station-badge{ top:auto; bottom:12px; } }

/* ============================================================
   STOREFRONT PAGE BUILDER (PRD 12.45) — komposer visual
   ============================================================ */
.pb-badge{ display:inline-block; font-size:11px; font-weight:600; padding:2px 7px; border-radius:999px; background:var(--pst-neutral-bg); color:var(--pst-neutral-text); border:1px solid var(--pst-neutral-border); vertical-align:middle; margin-left:6px; }
.pb-badge--draft{ background:var(--pst-warning-bg); color:var(--pst-warning-text); border-color:var(--pst-warning-border); }
.pb-badge--off{ opacity:.6; }
.pb-switch{ display:flex; align-items:center; gap:10px; cursor:pointer; font-size:14px; }
.pb-switch input{ width:0; height:0; opacity:0; position:absolute; }
.pb-switch-ui{ width:40px; height:22px; border-radius:999px; background:var(--line); position:relative; transition:.18s; flex:none; }
.pb-switch-ui::after{ content:''; position:absolute; top:2px; left:2px; width:18px; height:18px; border-radius:50%; background:#fff; transition:.18s; box-shadow:var(--shadow-1); }
.pb-switch input:checked + .pb-switch-ui{ background:var(--ink); }
.pb-switch input:checked + .pb-switch-ui::after{ transform:translateX(18px); }

.pb-topbar{ display:flex; align-items:center; gap:10px; padding:10px 14px; border-bottom:1px solid var(--line); background:var(--paper); position:sticky; top:0; z-index:5; flex-wrap:wrap; }
.pb-topbar .grow{ flex:1; }
.pb-topbar .back{ display:inline-flex; align-items:center; gap:5px; font-size:13px; color:var(--muted); text-decoration:none; }
.pb-layertabs{ display:flex; gap:2px; flex-wrap:wrap; }
.pb-layertabs a{ display:inline-flex; align-items:center; gap:5px; padding:6px 11px; border-radius:var(--r-sm); font-size:13px; font-weight:500; color:var(--muted); text-decoration:none; border:1px solid transparent; }
.pb-layertabs a.active{ background:var(--ink); color:#fff; }
.pb-layertabs a:not(.active):hover{ background:var(--paper-warm); }
.pb-status{ font-size:12px; color:var(--muted); }
.pb-status.is-dirty{ color:var(--danger); font-weight:600; }

.pb-shell{ display:grid; grid-template-columns:210px minmax(280px,1fr) minmax(360px,1.2fr); gap:0; height:calc(100vh - 120px); min-height:520px; }
.pb-pane-h{ display:flex; align-items:center; gap:6px; font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--muted); padding:11px 13px; border-bottom:1px solid var(--line); position:sticky; top:0; background:var(--paper); z-index:2; }
.pb-palette{ border-right:1px solid var(--line); display:flex; flex-direction:column; min-height:0; background:var(--paper-warm); }
.pb-pal-scroll{ overflow:auto; padding:8px; }
.pb-pal-grp{ margin-bottom:12px; }
.pb-pal-h{ font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:.04em; margin:4px 4px 6px; }
.pb-pal-items{ display:flex; flex-direction:column; gap:4px; }
.pb-pal-item{ display:flex; align-items:center; gap:8px; width:100%; text-align:left; padding:8px 9px; border:1px solid var(--line); border-radius:var(--r-sm); background:#fff; cursor:pointer; font-size:13px; color:var(--ink); transition:.12s; }
.pb-pal-item:hover{ border-color:var(--ink); background:var(--paper-warm2); transform:translateY(-1px); }
.pb-pal-item svg{ color:var(--muted); flex:none; }

.pb-canvas{ border-right:1px solid var(--line); display:flex; flex-direction:column; min-height:0; }
.pb-canvas-scroll{ overflow:auto; padding:10px; flex:1; }
.pb-canvas-empty{ text-align:center; color:var(--muted); padding:48px 20px; }
.pb-canvas-empty svg{ color:var(--line); margin-bottom:10px; }
.pb-canvas-empty p{ font-size:14px; }

.pb-card{ border:1px solid var(--line); border-radius:var(--r-md); background:#fff; margin-bottom:8px; overflow:hidden; }
.pb-card.is-sel{ border-color:var(--ink); box-shadow:0 0 0 2px rgba(0,0,0,.06); }
.pb-card.is-container{ background:var(--paper-warm); }
.pb-card.is-dragging{ opacity:.45; }
.pb-card.pb-dropover{ border-color:var(--ink); border-style:dashed; }
.pb-card-hd{ display:flex; align-items:center; gap:8px; padding:9px 10px; cursor:pointer; user-select:none; }
.pb-drag{ color:var(--line); cursor:grab; display:inline-flex; }
.pb-card-ic{ color:var(--muted); display:inline-flex; }
.pb-card-lb{ font-size:13.5px; font-weight:600; flex:1; }
.pb-visoff{ color:var(--muted); display:inline-flex; }
.pb-card-acts{ display:flex; gap:2px; }
.pb-mini{ width:26px; height:26px; display:inline-flex; align-items:center; justify-content:center; border:1px solid transparent; border-radius:var(--r-sm); background:transparent; cursor:pointer; color:var(--muted); }
.pb-mini:hover{ background:var(--paper-warm2); color:var(--ink); }
.pb-mini--del:hover{ color:var(--danger); }
.pb-inspector{ padding:12px 12px 14px; border-top:1px solid var(--line); background:var(--paper-warm); }
.pb-f{ display:block; margin-bottom:10px; }
.pb-f > span{ display:block; font-size:12px; font-weight:600; color:var(--muted); margin-bottom:4px; }
.pb-f .ctrl{ width:100%; }
.pb-f-chk{ display:flex; align-items:center; gap:8px; }
.pb-f-chk > span{ margin:0; }
.pb-help{ font-size:12px; color:var(--muted); background:#fff; border:1px dashed var(--line); border-radius:var(--r-sm); padding:8px 10px; margin-top:2px; }
.pb-hr{ border:0; border-top:1px solid var(--line); margin:12px 0; }
.pb-vis{ display:flex; gap:12px; }
.pb-vischk{ display:flex; align-items:center; gap:5px; font-size:12.5px; color:var(--ink); }
.pb-children{ padding:6px 10px 10px 20px; border-left:2px solid var(--line); margin:0 10px 8px; }
.pb-empty-child{ font-size:12px; color:var(--muted); padding:10px; text-align:center; border:1px dashed var(--line); border-radius:var(--r-sm); }
.pb-addchild{ margin-top:6px; font-size:12px; color:var(--muted); background:transparent; border:1px dashed var(--line); border-radius:var(--r-sm); padding:6px 10px; cursor:pointer; display:inline-flex; align-items:center; gap:5px; }
.pb-addchild:hover{ border-color:var(--ink); color:var(--ink); }

.pb-preview{ display:flex; flex-direction:column; min-height:0; background:var(--paper-warm2); }
.pb-prev-bar{ display:flex; align-items:center; gap:8px; padding:9px 12px; border-bottom:1px solid var(--line); background:var(--paper); }
.pb-prev-bar .grow{ flex:1; }
.pb-prev-t{ font-size:12px; font-weight:600; color:var(--muted); display:inline-flex; align-items:center; gap:5px; }
.pb-dev-seg{ display:flex; gap:2px; background:var(--paper-warm); border-radius:var(--r-sm); padding:2px; }
.pb-dev{ width:30px; height:26px; display:inline-flex; align-items:center; justify-content:center; border:0; border-radius:5px; background:transparent; cursor:pointer; color:var(--muted); }
.pb-dev.active{ background:#fff; color:var(--ink); box-shadow:var(--shadow-1); }
.pb-prev-stage{ flex:1; overflow:auto; display:flex; justify-content:center; padding:16px; }
.pb-frame{ width:1180px; max-width:100%; height:100%; min-height:480px; background:#fff; border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden; box-shadow:var(--shadow-1); transition:width .2s; }
.pb-frame iframe{ width:100%; height:100%; min-height:640px; border:0; display:block; }

@media (max-width:1100px){
  .pb-shell{ grid-template-columns:1fr; height:auto; }
  .pb-palette,.pb-canvas{ border-right:0; border-bottom:1px solid var(--line); }
  .pb-pal-scroll{ max-height:220px; }
  .pb-prev-stage{ min-height:520px; }
}

/* Page Builder — Advanced Controller (nav editor) */
.pbg-nav{ display:flex; flex-direction:column; gap:8px; margin-bottom:10px; }
.pbg-navrow{ display:flex; align-items:center; gap:10px; padding:8px 10px; border:1px solid var(--line); border-radius:var(--r-sm); background:#fff; }
.pbg-navrow .pbg-drag{ color:var(--line); display:inline-flex; }
.pbg-navrow .ctrl{ flex:1; }
.pbg-navrow .pbg-tab{ font-size:11px; color:var(--muted); font-family:var(--font-mono); background:var(--paper-warm); padding:2px 7px; border-radius:999px; }
.pbg-navrow .pbg-ord{ display:flex; gap:2px; }
.pbg-manage{ margin-top:6px; }

/* Page Builder — hub headers & Form Builder (F5) */
.pb-hub-h{ display:flex; align-items:center; gap:6px; font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--muted); margin:6px 2px 8px; }
.fb-shell{ grid-template-columns:minmax(320px,1fr) minmax(380px,1.05fr) !important; }
.fb-2col{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.fb-step{ border:1px solid var(--line); border-radius:var(--r-md); background:var(--paper-warm); margin-bottom:10px; overflow:hidden; }
.fb-step-hd{ display:flex; align-items:center; gap:8px; padding:8px 10px; background:#fff; border-bottom:1px solid var(--line); }
.fb-step-hd .fb-drag{ color:var(--line); }
.fb-step-label{ flex:1; font-weight:600; max-width:220px; }
.fb-step-key{ font-size:11px; font-family:var(--font-mono); color:var(--muted); background:var(--paper-warm); padding:2px 7px; border-radius:999px; }
.fb-step-acts{ display:flex; gap:2px; margin-left:auto; }
.fb-step-body{ padding:8px 10px; display:flex; flex-direction:column; gap:6px; }
.fb-field{ border:1px solid var(--line); border-radius:var(--r-sm); background:#fff; }
.fb-field.is-sel{ border-color:var(--ink); box-shadow:0 0 0 2px rgba(0,0,0,.05); }
.fb-field-hd{ display:flex; align-items:center; gap:8px; padding:7px 9px; cursor:pointer; }
.fb-field-ic{ color:var(--muted); display:inline-flex; }
.fb-field-lb{ font-size:13px; font-weight:600; flex:1; }
.fb-field-type{ font-size:11px; color:var(--muted); }
.fb-req{ font-size:10px; font-weight:700; color:var(--danger); background:var(--pst-danger-bg); padding:1px 6px; border-radius:999px; text-transform:uppercase; }
.fb-field-insp{ padding:10px; border-top:1px solid var(--line); background:var(--paper-warm); }
.fb-empty-fields{ font-size:12px; color:var(--muted); text-align:center; padding:8px; border:1px dashed var(--line); border-radius:var(--r-sm); }
.fb-addfield{ font-size:12px; color:var(--muted); background:transparent; border:1px dashed var(--line); border-radius:var(--r-sm); padding:6px 10px; cursor:pointer; display:inline-flex; align-items:center; gap:5px; align-self:flex-start; }
.fb-addfield:hover{ border-color:var(--ink); color:var(--ink); }
.fb-schedule{ font-size:12.5px; color:var(--muted); padding:10px; background:#fff; border:1px dashed var(--line); border-radius:var(--r-sm); display:flex; align-items:center; gap:8px; }
.fb-step-txt{ display:grid; grid-template-columns:1fr 1.4fr; gap:6px; }
.fb-step-txt .ctrl{ font-size:12.5px; }
@media (max-width:900px){ .fb-step-txt{ grid-template-columns:1fr; } }

/* Kebijakan Reschedule dinamis (cond-if) — baris aturan di tab Halaman */
.rsch-list{ display:flex; flex-direction:column; gap:8px; }
.rsch-rule{ display:grid; grid-template-columns:auto 1.5fr .6fr .8fr 1.2fr auto; gap:8px; align-items:end; padding:10px; border:1px solid var(--line); border-radius:var(--r-sm); background:var(--paper-warm); }
.rsch-rule .frow{ margin:0; }
.rsch-rule .frow label{ font-size:11px; }
.rsch-rule .fhint{ font-size:10.5px; margin-top:2px; }
.rsch-if{ font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--muted); padding-bottom:10px; }
.rsch-rule .rdel{ margin-bottom:4px; }
@media (max-width:900px){ .rsch-rule{ grid-template-columns:1fr 1fr; } .rsch-if{ display:none; } }

/* Form Builder — tab pengaturan terpadu (12.45 merge pageEditor) */
.fb-tabs{ margin-left:6px; }
.fb-set-wrap{ max-width:920px; margin:0 auto; padding:18px 16px 40px; }
.fb-set-wrap .panel{ margin-bottom:14px; }
.fb-schedule a{ color:inherit; }

/* ============================================================
   12.47 — Workspace UI Refresh (DS v2.0): alias token + komponen
   Nilai --pst-* / --surface-* / --line-* / --text-* berasal dari app.css.
   ============================================================ */
:root{
  --vs-yellow: var(--brand, #FFF700);
  --accent-blue: var(--pst-blue-text);   --accent-violet: var(--pst-purple-text);
  --accent-orange: var(--pst-orange-text); --accent-red: var(--pst-danger-text);
  --accent-pink: var(--pst-pink-text);    --accent-mint: var(--pst-mint-text);
  --ws-ink-100: var(--line-100);          --ws-ink-300: var(--line-200);
  --ws-text-disabled: var(--text-subtle);
}

/* Subnav modul (pill row) */
.ws-subnav{ display:flex; gap:8px; flex-wrap:wrap; margin-bottom:14px; }
.ws-pill{ display:inline-flex; align-items:center; gap:7px; height:36px; padding:0 15px; border-radius:100px;
  background:var(--surface-0); color:var(--text-muted); border:1px solid var(--line-200);
  font-size:13px; font-weight:500; white-space:nowrap; text-decoration:none; transition:background .12s ease, color .12s ease; }
.ws-pill:hover{ border-color:var(--ink, #050505); color:var(--text-strong); }
.ws-pill.is-on{ background:#050505; color:#fff; border-color:#050505; font-weight:700; }
.ws-pill__badge{ font-family:var(--font-mono); font-size:9.5px; font-weight:700; padding:2px 7px; border-radius:100px; background:var(--vs-yellow); color:#050505; }
.ws-pill.is-on .ws-pill__badge{ background:var(--vs-yellow); color:#050505; }

/* Tag tone-tetap */
.ws-tag{ display:inline-flex; align-items:center; gap:5px; padding:2.5px 9px; border-radius:100px; font-size:10.5px; font-weight:600; white-space:nowrap; }
.ws-tag--success{ background:var(--pst-success-bg); border:1px solid var(--pst-success-border); color:var(--pst-success-text); }
.ws-tag--mint{ background:var(--pst-mint-bg); border:1px solid var(--pst-mint-border); color:var(--pst-mint-text); }
.ws-tag--info{ background:var(--pst-info-bg); border:1px solid var(--pst-info-border); color:var(--pst-info-text); }
.ws-tag--blue{ background:var(--pst-blue-bg); border:1px solid var(--pst-blue-border); color:var(--pst-blue-text); }
.ws-tag--purple{ background:var(--pst-purple-bg); border:1px solid var(--pst-purple-border); color:var(--pst-purple-text); }
.ws-tag--pink{ background:var(--pst-pink-bg); border:1px solid var(--pst-pink-border); color:var(--pst-pink-text); }
.ws-tag--warning{ background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border); color:var(--pst-warning-text); }
.ws-tag--orange{ background:var(--pst-orange-bg); border:1px solid var(--pst-orange-border); color:var(--pst-orange-text); }
.ws-tag--danger{ background:var(--pst-danger-bg); border:1px solid var(--pst-danger-border); color:var(--pst-danger-text); }
.ws-tag--neutral{ background:var(--pst-neutral-bg); border:1px solid var(--pst-neutral-border); color:var(--pst-neutral-text); }
.ws-tag--identity{ background:var(--pst-identity-bg); border:1px solid var(--pst-identity-border); color:var(--pst-identity-text); }

/* Kartu statistik */
.ws-statgrid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:12px; }
.ws-statcard{ background:var(--surface-0); border:1px solid var(--line-200); border-radius:14px; padding:14px 16px; }
.ws-statcard__ico{ width:34px; height:34px; border-radius:10px; display:flex; align-items:center; justify-content:center; background:var(--surface-1); color:var(--text-muted); margin-bottom:10px; }
.ws-statcard__val{ font-size:24px; font-weight:800; color:var(--text-strong); line-height:1.1; }
.ws-statcard__lbl{ font-size:12px; color:var(--text-muted); margin-top:2px; }
.ws-statcard__foot{ font-size:11px; color:var(--text-subtle); margin-top:4px; }

/* Hero presensi */
.ws-hero{ background:var(--surface-0); border:1px solid var(--line-200); border-radius:16px; padding:18px 20px; }
.ws-hero__clock{ font-family:var(--font-mono); font-size:34px; font-weight:800; color:var(--text-strong); letter-spacing:.02em; }
.ws-hero__cap{ font-size:12px; color:var(--text-subtle); }

/* Slide-over kanan */
.ws-slideover-bd{ position:fixed; inset:0; background:rgba(5,5,5,.42); z-index:1200; opacity:0; animation:wsfade .16s ease forwards; }
.ws-slideover{ position:fixed; top:0; right:0; height:100%; width:clamp(20rem,32vw,27.5rem); max-width:94vw; background:var(--surface-0); border-left:1px solid var(--line-200);
  box-shadow:-14px 0 40px rgba(5,5,5,.16); z-index:1201; display:flex; flex-direction:column; transform:translateX(100%); animation:wsslide .2s cubic-bezier(.2,.8,.2,1) forwards; }
.ws-slideover__head{ display:flex; align-items:center; gap:10px; padding:14px 16px; border-bottom:1px solid var(--line-100); }
.ws-slideover__head h3{ font-size:15px; font-weight:700; margin:0; flex:1; }
.ws-slideover__body{ padding:16px; overflow-y:auto; flex:1; }
.ws-slideover__foot{ padding:12px 16px; border-top:1px solid var(--line-100); display:flex; gap:8px; justify-content:flex-end; }
@keyframes wsslide{ to{ transform:translateX(0); } }
@keyframes wsfade{ to{ opacity:1; } }

/* Kanban */
.ws-kanban{ display:flex; gap:12px; overflow-x:auto; padding-bottom:8px; }
.ws-kcol{ flex:0 0 272px; border-radius:14px; background:var(--surface-1); border:1px solid var(--line-100); transition:background .14s ease, border-color .14s ease; }
.ws-kcol.is-over{ background:var(--brand-soft); border:1px dashed var(--brand-line); }
.ws-kcol__head{ display:flex; align-items:center; gap:8px; padding:10px 12px; }
.ws-kcol__dot{ width:9px; height:9px; border-radius:100px; }
.ws-kcard{ background:var(--surface-0); border:1px solid var(--line-200); border-radius:11px; padding:10px 11px; margin:0 8px 8px; cursor:grab; }
.ws-kcard:active{ cursor:grabbing; }
.ws-kcard__code{ font-family:var(--font-mono); font-size:10px; color:var(--text-subtle); }
.ws-kcard__title{ font-size:12.5px; color:var(--text-body); margin:3px 0 6px; line-height:1.4; }

/* Roster grid — sel penuh warna */
.ws-roster{ width:100%; border-collapse:separate; border-spacing:0; }
.ws-roster th, .ws-roster td{ border-bottom:1px solid var(--line-100); }
.ws-roster th{ padding:8px 6px; font-size:11px; color:var(--text-muted); font-weight:600; text-align:center; }
.ws-roster th.ws-roster__demand--hot{ color:var(--pst-danger-text); font-weight:800; }
.ws-roster__namecol{ text-align:left; min-width:180px; padding-left:14px; }
.ws-cell{ text-align:center; padding:0; }
.ws-cell__inner{ display:block; width:100%; border:0; cursor:default; padding:13px 4px; font-family:var(--font-mono); font-size:12px; font-weight:800; }
.ws-cell--clickable .ws-cell__inner{ cursor:pointer; }
.ws-cell--P .ws-cell__inner{ background:var(--pst-success-bg); color:var(--pst-success-text); }
.ws-cell--M .ws-cell__inner{ background:var(--pst-blue-bg); color:var(--pst-blue-text); }
.ws-cell--S .ws-cell__inner{ background:var(--pst-purple-bg); color:var(--pst-purple-text); }
.ws-cell--OFF .ws-cell__inner{ background:var(--surface-1); color:var(--text-subtle); }
.ws-cell--CT .ws-cell__inner{ background:var(--pst-orange-bg); color:var(--pst-orange-text); }
.ws-cell--ED .ws-cell__inner{ background:var(--pst-pink-bg); color:var(--pst-pink-text); }
.ws-cell--empty .ws-cell__inner{ color:var(--text-subtle); }
.ws-demandrow td{ font-family:var(--font-mono); font-size:9px; text-align:center; color:var(--text-subtle); padding:2px 0 6px; }

/* Step tracker Post-Pro */
.ws-steps{ display:flex; align-items:flex-start; gap:0; }
.ws-step{ flex:1; text-align:center; position:relative; }
.ws-step__dot{ width:12px; height:12px; border-radius:100px; margin:0 auto 5px; background:var(--line-200); }
.ws-step--done .ws-step__dot{ background:#050505; }
.ws-step--cur .ws-step__dot{ background:var(--vs-yellow); border:2px solid #050505; }
.ws-step__lbl{ font-family:var(--font-mono); font-size:8.5px; letter-spacing:.05em; text-transform:uppercase; color:var(--text-subtle); }
.ws-step--cur .ws-step__lbl{ color:var(--text-strong); font-weight:700; }

/* Timeline agenda */
.ws-timeline{ display:flex; flex-direction:column; gap:2px; }
.ws-tl{ display:flex; gap:11px; padding:9px 0; border-bottom:1px solid var(--line-100); }
.ws-tl__time{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); min-width:44px; }
.ws-tl__dot{ width:8px; height:8px; border-radius:100px; margin-top:4px; flex:0 0 auto; }

/* Antrean approval / list rows */
.ws-appr{ display:flex; align-items:center; gap:10px; padding:11px 0; border-bottom:1px solid var(--line-100); }
.ws-appr__body{ flex:1; min-width:0; }
.ws-appr__who{ font-weight:600; font-size:13px; color:var(--text-strong); }
.ws-appr__detail{ font-size:12px; color:var(--text-muted); }

/* ===== 12.47 polish 2 — parity prototype: home 2 kolom + hero gelap + subtab ===== */
.ws-home{ display:grid; grid-template-columns:minmax(0,1fr) 380px; gap:14px; align-items:start; }
@media (max-width: 1100px){ .ws-home{ grid-template-columns:1fr; } }
.ws-home__main > *, .ws-home__aside > *{ margin-bottom:14px; }

.ws-kicker{ font-family:var(--font-mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; }

.ws-hero--dark{ position:relative; background:#050505; border:1px solid #050505; border-radius:16px; padding:20px 22px; overflow:hidden; }
.ws-hero--dark::before{ content:""; position:absolute; top:0; left:0; right:0; height:4px; background:var(--vs-yellow); }
.ws-hero--dark .ws-kicker{ color:rgba(255,255,255,.5); }
.ws-hero--dark .ws-hero__clock{ color:#fff; font-size:44px; letter-spacing:.03em; }
.ws-hero--dark .ws-hero__cap{ color:rgba(255,255,255,.55); }
.ws-hero__meta{ font-size:12.5px; color:rgba(255,255,255,.78); line-height:1.7; text-align:right; }
.ws-hero__meta b{ color:#fff; }
.ws-btn-brand{ display:inline-flex; align-items:center; gap:8px; height:44px; padding:0 22px; border-radius:100px; border:0; cursor:pointer;
  background:var(--vs-yellow); color:#050505; font-weight:800; font-size:14px; font-family:inherit; }
.ws-btn-brand:hover{ filter:brightness(.96); }
.ws-btn-ghostdark{ display:inline-flex; align-items:center; gap:6px; height:34px; padding:0 14px; border-radius:100px; cursor:pointer;
  background:transparent; color:rgba(255,255,255,.85); border:1px dashed rgba(255,255,255,.35); font-weight:600; font-size:12px; font-family:inherit; }
.ws-btn-ghostdark:hover{ border-color:rgba(255,255,255,.65); color:#fff; }
.ws-btn-darksm{ display:inline-flex; align-items:center; gap:6px; height:34px; padding:0 14px; border-radius:100px; cursor:pointer;
  background:rgba(255,255,255,.1); color:rgba(255,255,255,.85); border:1px solid rgba(255,255,255,.22); font-size:12px; font-family:inherit; }
.ws-btn-darksm:hover{ background:rgba(255,255,255,.18); }

.ws-statcard__top{ display:flex; align-items:center; gap:7px; font-family:var(--font-mono); font-size:9.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); margin-bottom:10px; }

.ws-badge-count{ font-family:var(--font-mono); font-size:11px; font-weight:800; min-width:22px; height:22px; padding:0 7px; border-radius:100px;
  background:var(--vs-yellow); color:#050505; display:inline-flex; align-items:center; justify-content:center; }

.ws-appr2{ padding:12px 0; border-bottom:1px solid var(--line-100); }
.ws-appr2:last-child{ border-bottom:0; }
.ws-appr2__head{ display:flex; align-items:center; gap:8px; }
.ws-appr2__who{ font-weight:700; font-size:13.5px; color:var(--text-strong); }
.ws-appr2__detail{ font-size:12.5px; color:var(--text-muted); margin-top:4px; line-height:1.5; }
.ws-appr2__actions{ display:flex; gap:8px; margin-top:10px; }
.ws-appr2__actions .abtn{ flex:1; justify-content:center; }

.ws-taskrow{ display:flex; align-items:center; gap:12px; padding:12px 0; border-bottom:1px solid var(--line-100); cursor:pointer; }
.ws-taskrow:last-child{ border-bottom:0; }
.ws-taskrow__code{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); min-width:52px; }
.ws-taskrow__title{ flex:1; min-width:0; font-size:13.5px; font-weight:600; color:var(--text-strong); }
.ws-taskrow__due{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); min-width:44px; text-align:right; }

.ws-jrcards{ display:flex; gap:10px; overflow-x:auto; padding-bottom:4px; }
.ws-jrcard{ flex:0 0 210px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:12px; padding:11px 12px; }
.ws-jrcard__title{ font-size:12.5px; font-weight:600; color:var(--text-strong); margin-top:7px; line-height:1.4; }

.ws-subtabs{ display:inline-flex; gap:4px; padding:4px; margin-bottom:14px; background:var(--surface-0);
  border:1px solid var(--line-200); border-radius:12px; overflow-x:auto; max-width:100%; }
.ws-subtab{ display:inline-flex; align-items:center; gap:7px; height:32px; padding:0 13px; border-radius:9px; text-decoration:none;
  background:transparent; color:var(--text-muted); font-size:12.5px; font-weight:500; border:0; cursor:pointer; white-space:nowrap; flex:0 0 auto; }
.ws-subtab:hover{ color:var(--text-strong); background:var(--surface-1); }
.ws-subtab.is-on{ background:#050505; color:#fff; font-weight:700; }
.ws-subtab__badge{ font-family:var(--font-mono); font-size:9.5px; font-weight:700; padding:1px 6px; border-radius:100px;
  background:var(--tag-warning-bg); color:var(--tag-warning-text); border:1px solid var(--tag-warning-border); }
.ws-subtab.is-on .ws-subtab__badge{ background:var(--vs-yellow); color:#050505; border-color:transparent; }

/* ===== 12.47 polish 3 — kartu project, avatar, kanban rapi ===== */
.ws-projrow{ display:grid; grid-auto-flow:column; grid-auto-columns:minmax(210px,1fr); gap:12px; overflow-x:auto; padding-bottom:10px; scrollbar-width:thin; }
@media (max-width:900px){ .ws-projrow{ grid-auto-columns:80%; } }
.ws-projcard{ background:var(--surface-0); border:1px solid var(--line-200); border-radius:14px; padding:14px 15px; display:flex; flex-direction:column; }
.ws-projbar{ height:6px; border-radius:100px; background:var(--line-100); overflow:hidden; margin-top:10px; }
.ws-projbar > span{ display:block; height:100%; background:#050505; border-radius:100px; }
.ws-avarow{ display:inline-flex; align-items:center; }
.ws-ava{ width:22px; height:22px; border-radius:100px; background:#050505; color:#fff; font-size:9px; font-weight:800; display:inline-flex; align-items:center; justify-content:center; border:2px solid var(--surface-0); margin-left:-6px; }
.ws-ava:first-child{ margin-left:0; }
.ws-kanban{ align-items:stretch; }
.ws-kcol{ display:flex; flex-direction:column; min-height:120px; }
.ws-kcard{ display:flex; flex-direction:column; }

/* == WS-REFRESH2:BEGIN =========================================================
   Workspace redesign — selaras library 12.04.03 Workspace Component Library.
   Blok additive & reversible: menumpuk di atas refresh 12.47 tanpa menyentuh
   markup/JS. Fase 0 (fondasi) menormalkan "pulau" legacy (bell/chat/forum) yang
   masih pakai indigo lama + px radius keras ke token DS v2.0 (yellow/black),
   radius selalu via token agar shape-controller (SF-SHAPE) tetap jalan, dan
   angka dinamis pakai tabular-nums (aturan Geist-only). Fase lanjut menumpuk
   di sini per bagian: [WS2-HOME] [WS2-TASKS] [WS2-POSTPRO] [WS2-EOFFICE]
   [WS2-ROSTER] [WS2-FORUM] [WS2-JURNAL].
   ============================================================================= */

/* --- [WS2-BASE] Normalisasi pulau legacy: buang sisa indigo #4f46e5 → aksen DS --- */
.ws-noti.is-unread{ background:var(--identity-yellow-soft); box-shadow:inset 3px 0 0 var(--identity-yellow); }
.ws-ch.is-active{ background:var(--ink-050); color:var(--text-strong); font-weight:700; }
.ws-cat-ic{ background:var(--ink-050); color:var(--text-strong); border-radius:var(--radius-sm); }
.ws-msg--own .ws-msg-body{ background:var(--vs-black); color:#fff; }

/* --- [WS2-BASE] Radius via token (shape-controller aman) --- */
.ws-top-btn{ border-radius:var(--radius-sm); }
.ws-bell-pop{ border-radius:var(--radius-md); box-shadow:var(--shadow-pop); }
.ws-noti{ border-radius:var(--radius-sm); }
.ws-x{ border-radius:var(--radius-xs); }
.ws-ch{ border-radius:var(--radius-sm); }
.ws-msg-body{ border-radius:var(--radius-md); }
.ws-react{ border-radius:var(--radius-pill); }
.ws-pick-list{ border-radius:var(--radius-sm); }
.ws-forum-mini-row{ border-radius:var(--radius-sm); }
.ws-cat-card{ border-radius:var(--radius-sm); }
.ws-post{ border-radius:var(--radius-md); }
.ws-link-card{ border-radius:var(--radius-sm); }

/* --- [WS2-BASE] Overlay chat selaras slide-over (backdrop + blur konsisten) --- */
.ws-chat-overlay{ background:rgba(5,5,5,.42); backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px); }
.ws-chat-panel{ box-shadow:-14px 0 40px rgba(5,5,5,.16); }

/* --- [WS2-BASE] Angka dinamis: tabular-nums (Geist) biar digit tidak loncat --- */
.ws-hero__clock, .ws-statcard__val, .ws-cell__inner, .ws-badge, .ws-badge-count,
.ws-pill__badge, .ws-subtab__badge, .ws-kcard__code, .ws-taskrow__code, .ws-taskrow__due,
.ws-tl__time, .ws-demandrow td, .ws-noti-time, .ws-msg-meta{ font-variant-numeric:tabular-nums; }

/* --- [WS2-HOME] Ringkasan: avatar di antrean approval, kartu shadow-over-border,
       hover interaktif (make-interfaces-feel-better) --- */
.ws-ava--lg{ width:28px; height:28px; font-size:10px; }
.ws-appr2__head{ align-items:center; }
.ws-statcard, .ws-jrcard, .ws-projcard{ box-shadow:var(--shadow-card); }
.ws-projcard{ transition:transform .15s ease, box-shadow .15s ease, border-color .15s ease; }
.ws-projcard:hover{ transform:translateY(-2px); box-shadow:var(--shadow-2); border-color:var(--ink-200); }
.ws-taskrow{ transition:background .12s ease; }
.ws-taskrow:hover{ background:var(--surface-50); }
.ws-taskrow:hover .ws-taskrow__title{ color:var(--vs-black); }

/* --- [WS2-TASKS] Kanban & Project: radius token, grip handle, hover-lift kartu,
       header kolom (count pill + tombol tambah), empty placeholder (parity 06 Kanban) --- */
.ws-kcol{ border-radius:var(--radius-md); }
.ws-kcard{ border-radius:var(--radius-sm); box-shadow:var(--shadow-xs); transition:box-shadow .14s ease, border-color .14s ease; }
.ws-kcard:hover{ box-shadow:var(--shadow-card); border-color:var(--ink-200); }
.ws-kcard__top{ display:flex; align-items:center; gap:6px; }
.ws-kcard__grip{ display:inline-flex; color:var(--text-disabled); opacity:0; transition:opacity .14s ease; cursor:grab; }
.ws-kcard:hover .ws-kcard__grip{ opacity:1; }
.ws-kcol__count{ font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:11px; font-weight:600; color:var(--text-subtle);
  min-width:20px; height:20px; padding:0 6px; border-radius:var(--radius-pill); background:var(--ink-050); display:inline-flex; align-items:center; justify-content:center; }
.ws-kcol__add{ display:inline-grid; place-items:center; width:24px; height:24px; border:0; background:transparent; color:var(--text-subtle);
  border-radius:var(--radius-xs); cursor:pointer; transition:background .12s ease, color .12s ease; }
.ws-kcol__add:hover{ background:var(--vs-yellow); color:#050505; }
.ws-kcol__empty{ margin:0 8px 8px; padding:16px 10px; text-align:center; font-size:11.5px; color:var(--text-subtle);
  border:1px dashed var(--line-200); border-radius:var(--radius-sm); }

/* --- [WS2-POSTPRO] Post-Pro Hub: kartu antrian pakai treatment kanban (.ws-kcard),
       tapi navigasi antar-status via tombol (bukan drag) --- */
.ws-ppcard{ cursor:default; }
.ws-ppcard .ws-kcard__code{ display:inline-flex; align-items:center; }
.ws-ppcard__nav{ display:flex; justify-content:space-between; align-items:center; gap:4px; margin-top:8px; }
.ws-ppcard__nav .abtn{ min-width:34px; justify-content:center; }
.ws-ppcard__nav > span:empty{ flex:0 0 auto; }

/* --- [WS2-EOFFICE] E-Office: sel identitas (avatar + nama) di semua tabel orang,
       baris "perlu tinjau" pakai token danger (parity 12 Attendance / directory) --- */
.ws-idcell{ display:flex; align-items:center; gap:9px; min-width:0; }
.ws-idcell > span{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ws-idcell__txt{ min-width:0; }
.ws-idcell .ws-ava{ flex:0 0 auto; }
.ws-row-suspect{ background:color-mix(in srgb, var(--pst-danger-bg) 45%, var(--surface-0)); }
.ws-row-suspect:hover{ background:color-mix(in srgb, var(--pst-danger-bg) 65%, var(--surface-0)); }
.ws-row-suspect td:first-child{ box-shadow:inset 3px 0 0 var(--pst-danger-text); }

/* --- [WS2-ROSTER] Roster: avatar di kolom nama, affordance hover pada sel editable --- */
.ws-roster__namecol .ws-idcell{ min-width:160px; }
.ws-cell--clickable:hover .ws-cell__inner{ box-shadow:inset 0 0 0 2px var(--ink-900); }

/* --- [WS2-FORUM] Forum & Chat: avatar penulis di thread row, post, & pesan masuk
       (parity library 08 Channels & Chat / 09 Threads) --- */
.ws-tr-row{ display:flex; gap:10px; align-items:center; }
.ws-tr-body{ flex:1; min-width:0; }
.ws-tr-count{ font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:11px; color:var(--text-subtle);
  display:inline-flex; align-items:center; gap:4px; flex:0 0 auto; }
.ws-post-head .ws-ava{ flex:0 0 auto; }
.ws-msg{ display:flex; gap:8px; align-items:flex-start; }
.ws-msg .ws-ava{ flex:0 0 auto; }
.ws-msg-main{ min-width:0; display:flex; flex-direction:column; }
.ws-msg--own{ flex-direction:row-reverse; }
.ws-msg--own .ws-msg-main{ align-items:flex-end; }
.ws-msg--del{ display:block; }

/* --- [WS2-SHELL] Satu language visual untuk seluruh layer Workspace --------- */
/* CATATAN: kelas .workspace-layer dipasang di BANYAK elemen (main.content, tapi
   JUGA backdrop .modal-back / .uic-back yang di-suffix layer di adminModal/uiConfirm).
   Karena itu rule dasar ini HANYA boleh menaruh custom-property yang aman diwarisi —
   JANGAN taruh max-width / background di sini: keduanya bocor ke backdrop fixed
   sehat (mengekang lebar backdrop ke 1480px → strip kanan tak ter-dim di layar
   lebar, dan menimpa dim gelap uiConfirm dengan gradient terang). Lebar & latar
   konten asli sudah diatur `.content.workspace-layer` di bawah. */
.workspace-layer{
  --ws-content-gap:16px;
  --ws-panel-radius:var(--radius-md);
  --ws-control-radius:var(--radius-sm);
}
.workspace-layer .sr-only{
  position:absolute!important; width:1px!important; height:1px!important; padding:0!important; margin:-1px!important;
  overflow:hidden!important; clip:rect(0,0,0,0)!important; white-space:nowrap!important; border:0!important;
}
/* Switcher modul = tab strip menyatu dengan halaman (BUKAN pill mengambang).
   Dulu position:sticky + bg translucent + shadow besar → terlihat melayang &
   menutupi hero saat konten scroll di bawahnya. Sekarang inline + solid. */
.workspace-layer .ws-subnav{
  display:flex; flex-wrap:nowrap; gap:4px; max-width:100%;
  margin:0 0 18px; padding:4px; overflow-x:auto; overscroll-behavior-x:contain; scrollbar-width:none;
  background:var(--surface-0); border:1px solid var(--line-200); border-radius:12px; box-shadow:none;
}
.workspace-layer .ws-subnav::-webkit-scrollbar{ display:none; }
.workspace-layer .ws-pill{
  flex:0 0 auto; min-height:40px; height:40px; padding:0 13px; border:0; border-radius:8px;
  background:transparent; color:var(--text-muted); font-size:12.5px; font-weight:550;
}
.workspace-layer .ws-pill:hover{ background:var(--surface-50); color:var(--text-strong); }
.workspace-layer .ws-pill.is-on{ background:var(--vs-black); color:#fff; box-shadow:none; }
.workspace-layer .ws-pill:active{ transform:translateY(.5px); }

/* Panel, data table, form, action — shared family lintas Home/E-Office/Jurnal. */
.workspace-layer .panel{
  margin-bottom:var(--ws-content-gap); border-color:var(--line-200); border-radius:var(--ws-panel-radius);
  background:var(--surface-0); box-shadow:none;
}
.workspace-layer .panel-head{ min-height:58px; padding:13px 16px; border-bottom-color:var(--line-100); background:var(--surface-0); }
.workspace-layer .panel-head h2{ display:flex; align-items:center; gap:8px; margin:0; font-size:14px; font-weight:720; letter-spacing:-.01em; }
.workspace-layer .panel-head h2 svg{ color:var(--text-subtle); }
.workspace-layer .panel-head .meta{ font-family:var(--font-mono); font-size:10.5px; font-variant-numeric:tabular-nums; }
.workspace-layer .panel-body{ padding:16px; }
.workspace-layer .panel-body.flush{ padding:0; overflow-x:auto; }
.workspace-layer .panel-foot{ border-top:1px solid var(--line-100); background:var(--surface-0); }
.workspace-layer .filters{
  min-height:54px; padding:9px 10px; gap:8px; border:1px solid var(--line-200); border-radius:var(--radius-md);
  background:var(--surface-0); box-shadow:none;
}
.workspace-layer .ctrl{ min-height:40px; border-color:var(--border-input); border-radius:var(--ws-control-radius); background:var(--surface-0); }
.workspace-layer textarea.ctrl{ padding-block:10px; }
.workspace-layer .frow > label{ margin-bottom:6px; font-size:11.5px; font-weight:650; color:var(--text-muted); }
.workspace-layer .abtn{
  min-height:36px; border-color:var(--line-200); border-radius:8px; font-weight:620;
  transition:background .14s ease,color .14s ease,border-color .14s ease,transform .14s ease,box-shadow .14s ease;
}
.workspace-layer .abtn:hover{ border-color:var(--ink-400); background:var(--surface-50); }
.workspace-layer .abtn--dark{ border-color:var(--vs-black); background:var(--vs-black); color:#fff; }
.workspace-layer .abtn--dark:hover{ border-color:#1b1c1f; background:#1b1c1f; }
.workspace-layer .abtn:active{ transform:translateY(.5px); }
.workspace-layer :is(a,button,input,select,textarea):focus-visible,
.modal-center.workspace-layer :is(a,button,input,select,textarea):focus-visible{
  outline:none; box-shadow:var(--shadow-focus-brand,0 0 0 3px rgba(255,247,0,.55));
}
.workspace-layer .tbl{ min-width:680px; }
.workspace-layer .tbl th{
  padding:10px 13px; border-bottom-color:var(--line-200); background:var(--surface-50);
  font-family:var(--font-mono); font-size:9.5px; font-weight:700; letter-spacing:.08em;
}
.workspace-layer .tbl td{ padding:12px 13px; border-bottom-color:var(--line-100); }
.workspace-layer .tbl tr.clickable:hover td{ background:var(--surface-50); }

/* State contract: skeleton, empty, forbidden/error. */
.ws-loading{
  display:flex; align-items:center; gap:14px; min-height:112px; padding:20px; border:1px solid var(--line-200);
  border-radius:var(--radius-md); background:var(--surface-0);
}
.ws-loading__copy{ flex:1; display:flex; flex-direction:column; gap:10px; }
.ws-skeleton{ display:block; border-radius:var(--radius-pill); background:linear-gradient(90deg,var(--ink-100) 25%,var(--ink-050) 50%,var(--ink-100) 75%); background-size:200% 100%; animation:wsShimmer 1.35s ease infinite; }
.ws-skeleton--icon{ width:48px; height:48px; border-radius:var(--radius-sm); flex:0 0 auto; }
.ws-skeleton--title{ width:min(240px,65%); height:12px; }
.ws-skeleton--line{ width:min(420px,90%); height:10px; }
@keyframes wsShimmer{ to{ background-position:-200% 0; } }
.ws-state,.workspace-layer .ws-empty{
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:9px; min-height:180px;
  padding:32px 24px; text-align:center; color:var(--text-subtle); border:1px dashed var(--line-200); border-radius:var(--radius-md); background:var(--surface-0);
}
.ws-state > svg,.workspace-layer .ws-empty > svg{ opacity:.65; }
.ws-state h3{ margin:2px 0 0; font-family:var(--font-display); font-size:15px; color:var(--text-strong); }
.ws-state p{ max-width:48ch; margin:0; font-size:12.5px; line-height:1.55; }
.ws-state--error{ color:var(--pst-danger-text); border-style:solid; border-color:var(--pst-danger-border); background:var(--pst-danger-bg); }

/* Cards/boards/roster: affordance dan density yang konsisten. */
.workspace-layer .ws-statgrid{ gap:10px; }
.workspace-layer .ws-statcard{ border-color:var(--line-200); border-radius:var(--radius-md); box-shadow:none; }
.workspace-layer .ws-statcard__val{ font-family:var(--font-mono); font-variant-numeric:tabular-nums; }
.workspace-layer .ws-projcard,.workspace-layer .ws-jrcard{ box-shadow:none; }
.workspace-layer .ws-kanban{ gap:12px; padding:2px 2px 14px; scroll-snap-type:x proximity; }
.workspace-layer .ws-kcol{ flex-basis:292px; min-height:220px; scroll-snap-align:start; background:var(--surface-50); border-color:var(--line-200); }
.workspace-layer .ws-kcol__head{ min-height:48px; padding:10px 11px; border-bottom:1px solid var(--line-100); }
.workspace-layer .ws-kcol__head h2{ min-width:0; flex:1; margin:0; overflow:hidden; font-size:12.5px; text-overflow:ellipsis; white-space:nowrap; }
.workspace-layer .ws-kcol__body{ flex:1; padding:8px 0; }
.workspace-layer .ws-kcard{ padding:11px 12px; margin:0 8px 8px; cursor:pointer; box-shadow:none; }
.workspace-layer .ws-kcard:hover{ transform:translateY(-1px); border-color:var(--ink-300); box-shadow:var(--shadow-card); }
.workspace-layer .ws-kcard__top{ align-items:flex-start; }
.workspace-layer .ws-kcard__title{ flex:1; margin:0 0 7px; font-size:12.5px; line-height:1.45; }
.workspace-layer .ws-kcol.is-over{ background:var(--identity-yellow-soft); border-color:var(--identity-yellow); box-shadow:inset 0 0 0 1px var(--identity-yellow); }
.workspace-layer .ws-roster{ min-width:880px; }
.workspace-layer .ws-roster th{ position:sticky; top:0; z-index:2; background:var(--surface-50); }
.workspace-layer .ws-cell__inner{ transition:box-shadow .14s ease,filter .14s ease; }

/* Workspace dialogs inherit the same component family. */
.modal-center.workspace-layer{
  max-width:640px; overflow:hidden; border:1px solid var(--line-200); border-radius:var(--radius-lg);
  background:var(--surface-0); box-shadow:0 28px 80px rgba(5,5,5,.24);
}
.modal-center.workspace-layer.wide{ max-width:860px; }
.modal-center.workspace-layer .mc-head{ min-height:64px; padding:14px 18px; border-bottom:1px solid var(--line-100); background:var(--surface-0); }
.modal-center.workspace-layer .mc-head h3{ margin:0; font-family:var(--font-display); font-size:18px; letter-spacing:-.02em; }
.modal-center.workspace-layer .mc-head .x{ display:grid; place-items:center; width:34px; height:34px; padding:0; border:1px solid var(--line-200); border-radius:8px; background:var(--surface-0); }
.modal-center.workspace-layer .mc-body{ padding:18px; }
.modal-center.workspace-layer .mc-foot{ min-height:64px; padding:13px 18px; border-top:1px solid var(--line-100); background:var(--surface-0); }
.modal-center.workspace-layer .ctrl{ min-height:42px; border-color:var(--border-input); border-radius:var(--radius-sm); }
.uic-card.workspace-layer{ max-width:460px; padding:22px; border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:0 28px 80px rgba(5,5,5,.24); }
.uic-card.workspace-layer .uic-title{ font-family:var(--font-display); font-size:18px; letter-spacing:-.02em; }

@media (max-width:860px){
  .workspace-layer{ padding-top:20px; }
  .workspace-layer .ws-subnav{ top:70px; margin-inline:-4px; }
  .workspace-layer .filters{ align-items:stretch; }
  .workspace-layer .filters .ctrl{ width:100%; max-width:none!important; }
  .workspace-layer .ws-home{ grid-template-columns:1fr; }
  .workspace-layer .ws-kcol{ flex-basis:min(82vw,292px); }
}
@media (max-width:520px){
  .workspace-layer .ws-pill{ min-height:38px; height:38px; padding-inline:11px; }
  .workspace-layer .panel-head{ align-items:flex-start; flex-wrap:wrap; min-height:54px; }
  .workspace-layer .panel-head > .abtn{ margin-left:auto; }
  .modal-center.workspace-layer{ width:calc(100vw - 20px); max-height:calc(100dvh - 20px); border-radius:var(--radius-md); }
  .modal-center.workspace-layer .mc-body{ padding:15px; }
}
@media (prefers-reduced-motion:reduce){
  .ws-skeleton{ animation:none; }
  .workspace-layer *,.modal-center.workspace-layer *{ scroll-behavior:auto!important; transition-duration:.01ms!important; animation-duration:.01ms!important; animation-iteration-count:1!important; }
}

/* --- [WS3-WORKBENCH] Adopsi penuh Workspace Component Library --------------- */
/* flex:1 WAJIB. .main adalah flex column setinggi shell; tanpa ini .content hanya
   setinggi isinya (mis. 388px di layar 994px) sehingga gradient berhenti di tengah
   layar dan sisanya memperlihatkan latar .admin-shell yang warnanya beda — itu
   "background terpotong". Sekaligus gradient jadi punya ruang penuh untuk membentang. */
.content.workspace-layer{
  flex:1 1 auto; min-height:0;
  max-width:none; padding:34px clamp(18px,3vw,52px) 84px; overflow:clip;
  background:
    radial-gradient(circle at 82% -8%,rgba(255,247,0,.13),transparent 28rem),
    linear-gradient(180deg,#f5f5f8 0,#efeff4 42%,#f5f5f8 100%);
}
.ws-workbench{ position:relative; width:min(100%,1560px); margin-inline:auto; }
/* Command-search & focus-toggle sekarang hidup di header.admin-top (bukan hero per-halaman). */
.ws-command-trigger{
  display:inline-flex; align-items:center; gap:8px; min-height:34px; padding:0 6px 0 11px; border:1px solid var(--line-200);
  border-radius:9px; color:var(--text-muted); background:rgba(255,255,255,.72); box-shadow:var(--shadow-xs); cursor:pointer;
  font:600 12px/1 var(--font-body); transition:transform .16s ease,border-color .16s ease,background .16s ease;
}
.ws-command-trigger:hover{ transform:translateY(-1px); border-color:var(--ink-400); background:#fff; color:var(--text-strong); }
.ws-command-trigger kbd,.ws-command-search kbd,.ws-command-item kbd{
  display:inline-flex; align-items:center; justify-content:center; min-width:26px; height:22px; padding:0 6px; border:1px solid var(--line-200);
  border-radius:6px; color:var(--text-subtle); background:var(--surface-50); font:600 9.5px/1 var(--font-mono); box-shadow:inset 0 -1px 0 var(--line-200);
}
.ws-icon-action{
  display:inline-grid; place-items:center; width:34px; height:34px; padding:0; border:1px solid var(--line-200); border-radius:9px;
  color:var(--text-muted); background:rgba(255,255,255,.78); cursor:pointer; transition:all .16s ease;
}
.ws-icon-action:hover,.ws-icon-action.is-on{ color:var(--text-strong); border-color:var(--ink-500); background:#fff; transform:translateY(-1px); }
.ws-icon-action.is-on{ color:var(--vs-black); background:var(--vs-yellow); border-color:var(--vs-yellow); }

/* Workspace switcher: bernomor, responsif, inline (menyatu, tanpa float). */
.workspace-layer .ws-subnav{
  display:grid; grid-template-columns:repeat(7,minmax(124px,1fr)); gap:0; margin-bottom:22px; padding:0;
  border-radius:16px; overflow-x:auto; background:var(--surface-0); box-shadow:none;
}
.workspace-layer .ws-pill{
  position:relative; display:grid; grid-template-columns:auto 28px minmax(0,1fr) auto; align-items:center; gap:8px;
  min-width:124px; height:58px; padding:0 12px; border-right:1px solid var(--line-100); border-radius:0; text-decoration:none;
}
.workspace-layer .ws-pill:first-child{ border-radius:15px 0 0 15px; }
.workspace-layer .ws-pill:last-child{ border-right:0; border-radius:0 15px 15px 0; }
.ws-pill__index{ font:600 9px/1 var(--font-mono); color:var(--text-disabled); }
.ws-pill__icon{ display:grid; place-items:center; width:28px; height:28px; border-radius:8px; color:var(--text-subtle); background:var(--surface-50); }
.ws-pill__label{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.workspace-layer .ws-pill.is-on{ color:#fff; background:var(--vs-black); }
.workspace-layer .ws-pill.is-on .ws-pill__index{ color:rgba(255,255,255,.42); }
.workspace-layer .ws-pill.is-on .ws-pill__icon{ color:var(--vs-black); background:var(--vs-yellow); }
.workspace-layer .ws-pill:hover:not(.is-on){ background:#fff; }

/* ── [WS4-SUBRAIL] Rail anak Workspace, tepat di sebelah sidebar utama ── */
.ws-subrail{ display:none; }
@media (min-width:1100px){
  .admin-shell.has-ws-subrail{ grid-template-columns:248px 68px minmax(0,1fr); }
  .admin-shell.has-ws-subrail.is-rail{ grid-template-columns:68px 68px minmax(0,1fr); }
  .ws-subrail{
    /* Rail selalu memusatkan daftar modul di sumbu-y viewport (flex center),
       dengan clearance header di atas. Konten pendek → center; tak akan overflow (8 modul). */
    display:flex; flex-direction:column; justify-content:center; align-items:center;
    position:sticky; top:0; width:68px; height:100dvh; padding:78px 9px 14px;
    overflow-y:auto; background:var(--surface-0); border-right:1px solid var(--line-200); z-index:19;
  }
  .content.workspace-layer .ws-shell{ display:block; }
  .content.workspace-layer .ws-shell__main{ flex:1; min-width:0; }
  /* strip horizontal di dalam body diganti oleh sub-rail */
  .content.workspace-layer .ws-shell__main .ws-workbench > .ws-subnav{ display:none; }
  /* workbench mengisi kolom utama (tak perlu center 1560) */
  .content.workspace-layer .ws-shell__main .ws-workbench{ width:100%; max-width:none; margin-inline:0; }
  /* switcher selalu berupa rail ikon; label tersedia lewat tooltip + aria-label */
  .ws-subrail .ws-subnav{
    display:flex; flex-direction:column; gap:0; margin:0; padding:0; width:100%; align-items:center;
    background:transparent; border:0; border-radius:0; box-shadow:none; overflow:visible;
  }
  .ws-subrail .ws-pill{
    position:relative; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px;
    width:50px; min-width:50px; height:58px; min-height:58px; margin:3px 0; padding:6px 2px 5px;
    border:0; border-radius:11px;
  }
  /* Garis tipis pemisah antar-pill (kecuali item terakhir). */
  .ws-subrail .ws-pill:not(:last-child)::after{
    content:''; position:absolute; left:50%; bottom:-3px; width:34px; height:1px;
    transform:translateX(-50%); background:var(--line-200);
  }
  .ws-subrail .ws-pill:first-child,
  .ws-subrail .ws-pill:last-child{ border-radius:11px; }
  .ws-subrail .ws-pill__icon{ flex:0 0 auto; width:28px; height:28px; }
  .ws-subrail .ws-pill__label{
    display:block; width:100%; overflow:hidden; color:inherit; font:600 7.5px/1.05 var(--font-body);
    letter-spacing:-.01em; text-align:center; text-overflow:ellipsis; white-space:nowrap;
  }
  .ws-subrail .ws-pill__index{ display:none; }
  .ws-subrail .ws-pill__badge{
    position:absolute; top:2px; right:1px; min-width:16px; height:16px; padding:0 4px;
    display:grid; place-items:center; border:2px solid var(--surface-0); font-size:8px;
  }
}

/* View toolbar, modular launchpad, dan section header. */
.ws-viewbar{
  display:flex; align-items:center; justify-content:space-between; gap:14px; margin:0 0 18px; padding:10px 12px;
  border:1px solid var(--line-200); border-radius:14px; background:rgba(255,255,255,.78); box-shadow:var(--shadow-xs);
}
.ws-viewbar__switch,.ws-viewbar__tools{ display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.ws-viewchip{ display:inline-flex; align-items:center; gap:7px; min-height:38px; padding:0 12px; border-radius:9px; color:var(--text-muted); font-size:12.5px; font-weight:650; text-decoration:none; }
.ws-viewchip:hover{ color:var(--text-strong); background:var(--surface-50); }
.ws-viewchip.is-on{ color:#fff; background:var(--vs-black); }
.ws-compact-field{ display:flex; align-items:center; gap:8px; }
.ws-compact-field > span{ font:650 9.5px/1 var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.ws-compact-field .ctrl{ width:min(240px,28vw); }
.ws-section-heading{ display:flex; align-items:end; justify-content:space-between; gap:24px; margin-bottom:13px; }
.ws-section-heading h2,.ws-board-head h2{ margin:3px 0 0; font-family:var(--font-display); font-size:20px; line-height:1.1; letter-spacing:-.025em; }
.ws-section-heading p{ max-width:54ch; margin:0; color:var(--text-subtle); font-size:12.5px; line-height:1.5; }
.ws-kicker{ font:700 9.5px/1.2 var(--font-mono); letter-spacing:.13em; text-transform:uppercase; color:var(--text-subtle); }
/* .ws-launchpad / .ws-modulecard DIHAPUS di F2 — launchpad Ringkasan lama
   diganti anatomi master (blok WORKSPACE-HOME). Tidak ada pemakai tersisa. */

/* Project gallery + work board dari komponen Projects/Kanban. */
.workspace-layer .ws-projrow{ display:grid; grid-template-columns:repeat(4,minmax(220px,1fr)); gap:10px; margin:0 0 18px; overflow-x:auto; }
.workspace-layer .ws-projcard{ min-width:220px; padding:15px; border:1px solid var(--line-200); border-radius:14px; background:rgba(255,255,255,.86); }
.ws-projcard__top,.ws-projcard__foot{ display:flex; align-items:center; gap:8px; }
.ws-projcard__code{ font:650 9.5px/1 var(--font-mono); letter-spacing:.08em; color:var(--text-subtle); }
.workspace-layer .ws-projcard h3{ margin:13px 0 4px; font-size:14px; line-height:1.35; }
.workspace-layer .ws-projcard p{ margin:0 0 14px; color:var(--text-subtle); font-size:11.5px; }
.ws-projcard__progress{ display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:9px; }
.ws-projcard__progress > span{ height:5px; overflow:hidden; border-radius:99px; background:var(--ink-100); }
.ws-projcard__progress i{ display:block; height:100%; border-radius:inherit; background:var(--vs-black); }
.ws-projcard__progress b{ font:650 10px/1 var(--font-mono); }
.ws-projcard__foot{ margin-top:13px; padding-top:11px; border-top:1px solid var(--line-100); }
.ws-projcard__foot > span:not(.ws-ava):not(.grow):not(.ws-tag){ overflow:hidden; font-size:10.5px; color:var(--text-subtle); text-overflow:ellipsis; white-space:nowrap; }
.ws-board-shell{ margin-bottom:20px; overflow:hidden; border:1px solid var(--line-200); border-radius:18px; background:rgba(255,255,255,.72); box-shadow:0 18px 50px rgba(30,31,35,.07); }
.ws-board-head{ display:flex; align-items:center; gap:20px; padding:18px 20px; border-bottom:1px solid var(--line-200); background:rgba(255,255,255,.9); }
.ws-board-head > div:first-child{ min-width:180px; }
.ws-board-head p{ margin:5px 0 0; color:var(--text-subtle); font:500 10.5px/1.3 var(--font-mono); }
.ws-board-head__people{ display:flex; align-items:center; gap:9px; margin-left:auto; color:var(--text-subtle); font-size:10.5px; }
.ws-board-head__tools{ display:flex; align-items:center; gap:8px; margin-left:auto; }
.ws-board-head__people + .ws-board-head__tools{ margin-left:0; }
.ws-board-search{ display:flex; align-items:center; gap:7px; min-width:210px; height:40px; padding:0 10px; border:1px solid var(--line-200); border-radius:10px; color:var(--text-subtle); background:var(--surface-0); }
.ws-board-search:focus-within{ border-color:var(--ink-500); box-shadow:var(--shadow-focus-brand,0 0 0 3px rgba(255,247,0,.5)); }
.ws-board-search input{ min-width:0; width:100%; border:0; outline:0; background:transparent; font:500 12px/1 var(--font-body); }
.ws-priority-filter{ width:150px; }
.workspace-layer .ws-board-shell .ws-kanban{ gap:0; margin:0; padding:0; background:#ececf1; scroll-snap-type:x proximity; }
.workspace-layer .ws-board-shell .ws-kcol{ flex-basis:310px; min-height:520px; margin:0; border:0; border-right:1px solid var(--line-200); border-radius:0; background:transparent; }
.workspace-layer .ws-board-shell .ws-kcol:last-child{ border-right:0; }
.workspace-layer .ws-kcol__head{ min-height:68px; padding:13px 14px; background:rgba(255,255,255,.62); }
.workspace-layer .ws-kcol__head > div{ flex:1; min-width:0; }
.workspace-layer .ws-kcol__head h2{ font-size:12.5px; }
.workspace-layer .ws-kcol__head small{ display:block; margin-top:3px; color:var(--text-disabled); font:500 9px/1.2 var(--font-mono); }
.workspace-layer .ws-kcol__dot{ width:8px; height:8px; border-radius:50%; background:var(--ink-300); box-shadow:0 0 0 4px rgba(120,124,132,.1); }
.workspace-layer .ws-kcol--in_progress .ws-kcol__dot{ background:var(--accent-blue); }
.workspace-layer .ws-kcol--review .ws-kcol__dot{ background:var(--accent-orange); }
.workspace-layer .ws-kcol--done .ws-kcol__dot{ background:var(--accent-mint); }
.workspace-layer .ws-kcol__body{ min-height:160px; padding:10px 0 24px; }
.workspace-layer .ws-kcard{
  position:relative; padding:13px; margin:0 10px 9px; border:1px solid rgba(214,216,222,.92); border-radius:12px; background:rgba(255,255,255,.96);
  box-shadow:0 4px 12px rgba(30,31,35,.035); transition:transform .18s ease,opacity .18s ease,box-shadow .18s ease,border-color .18s ease;
}
.workspace-layer .ws-kcard:hover{ transform:translateY(-2px); box-shadow:0 10px 24px rgba(30,31,35,.1); }
.workspace-layer .ws-kcard.is-dragging{ opacity:.34; transform:rotate(1.2deg) scale(.985); box-shadow:0 18px 42px rgba(30,31,35,.16); }
.workspace-layer .ws-kcard.is-saving::after{ content:'Menyimpan'; position:absolute; right:9px; bottom:9px; padding:4px 7px; border-radius:6px; color:#fff; background:var(--vs-black); font:600 8.5px/1 var(--font-mono); animation:wsPulse .8s ease infinite alternate; }
.workspace-layer .ws-kcard.is-settled{ animation:wsSettle .4s cubic-bezier(.2,.9,.2,1); }
.workspace-layer .ws-kcard.is-filtered{ display:none; }
.workspace-layer .ws-kcard__code{ font:650 9.5px/1 var(--font-mono); letter-spacing:.06em; color:var(--text-subtle); }
.workspace-layer .ws-kcard__title{ margin:9px 0 8px; font-size:13px; font-weight:650; line-height:1.42; }
.ws-kcard__labels{ display:flex; gap:4px; margin-top:8px; }
.ws-kcard__labels span{ width:28px; height:3px; overflow:hidden; border-radius:99px; color:transparent; background:var(--accent-blue); }
.ws-kcard__labels span:nth-child(2){ background:var(--accent-orange); }.ws-kcard__labels span:nth-child(3){ background:var(--accent-mint); }
.ws-kcard__project{ display:flex; align-items:center; gap:5px; margin:-1px 0 8px; color:var(--text-subtle); font-size:10.5px; }
.ws-kcard__meta{ display:flex; align-items:center; justify-content:space-between; gap:8px; min-height:24px; }
.ws-duechip{ display:inline-flex; align-items:center; gap:4px; padding:4px 6px; border-radius:6px; color:var(--text-muted); background:var(--surface-50); font:550 9.5px/1 var(--font-mono); }
.ws-duechip.is-muted{ color:var(--text-disabled); background:transparent; }
.workspace-layer .ws-kanban.is-compact .ws-kcol{ flex-basis:260px; }
.workspace-layer .ws-kanban.is-compact .ws-kcard{ padding:10px; margin-inline:8px; }
.workspace-layer .ws-kanban.is-compact .ws-kcard__project,.workspace-layer .ws-kanban.is-compact .ws-kcard__labels{ display:none; }
@keyframes wsPulse{ to{ opacity:.62; } }
@keyframes wsSettle{ 0%{ transform:scale(.97); } 55%{ transform:scale(1.015); } 100%{ transform:scale(1); } }

/* Command center + work windows + seluruh form Workspace. */
.modal-back.center.workspace-layer{ padding:22px; background:rgba(10,10,12,.48); backdrop-filter:blur(9px) saturate(120%); -webkit-backdrop-filter:blur(9px) saturate(120%); }
.modal-center.workspace-layer.ws-command-window{ width:min(640px,calc(100vw - 30px)); max-width:640px; max-height:min(860px,calc(100dvh - 38px)); border-radius:18px; }
.modal-center.workspace-layer.ws-command-window.wide{ width:min(980px,calc(100vw - 30px)); max-width:980px; }
.modal-center.workspace-layer .mc-head{ display:grid; grid-template-columns:42px minmax(0,1fr) 36px; gap:12px; min-height:76px; padding:14px 18px; }
.ws-window-mark{ display:grid; place-items:center; width:42px; height:42px; border-radius:11px; color:var(--vs-black); background:var(--vs-yellow); }
.ws-window-title{ display:flex; flex-direction:column; justify-content:center; min-width:0; }
.ws-window-title small{ margin-bottom:4px; color:var(--text-subtle); font:650 9px/1 var(--font-mono); letter-spacing:.11em; text-transform:uppercase; }
.ws-window-title h3{ overflow:hidden; font-size:19px!important; text-overflow:ellipsis; white-space:nowrap; }
.modal-center.workspace-layer .mc-head .x{ grid-column:3; }
.modal-center.workspace-layer .ws-form-canvas{ max-height:calc(100dvh - 190px); padding:22px; overflow-y:auto; background:linear-gradient(180deg,var(--surface-0),#fafafd); }
.modal-center.workspace-layer.wide .ws-form-canvas{ padding:24px 26px 28px; }
.modal-center.workspace-layer .frow{ margin-bottom:16px; }
.modal-center.workspace-layer .frow > label{ display:flex; align-items:center; justify-content:space-between; margin-bottom:7px; color:var(--text-muted); font:650 10px/1.2 var(--font-mono); letter-spacing:.055em; text-transform:uppercase; }
.modal-center.workspace-layer .ctrl{
  min-height:44px; padding-inline:12px; border:1px solid var(--line-200); border-radius:10px; color:var(--text-strong); background:var(--surface-0);
  transition:border-color .16s ease,box-shadow .16s ease,background .16s ease;
}
.modal-center.workspace-layer textarea.ctrl{ min-height:92px; padding-block:11px; resize:vertical; }
.modal-center.workspace-layer .ctrl:hover{ border-color:var(--ink-400); }
.modal-center.workspace-layer .ctrl:focus{ border-color:var(--vs-black); background:#fff; box-shadow:0 0 0 3px rgba(255,247,0,.48); }
.modal-center.workspace-layer .dgroup-label{ margin:22px 0 11px; padding-top:16px; border-top:1px solid var(--line-100); color:var(--text-subtle); font:700 9.5px/1.2 var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.modal-center.workspace-layer .ws-window-actions{ min-height:70px; padding:14px 18px; background:#f7f7fa; }
.modal-center.workspace-layer .ws-window-actions .abtn{ min-height:40px; padding-inline:15px; }
.ws-command-search{ display:grid; grid-template-columns:22px minmax(0,1fr) auto; align-items:center; gap:9px; height:50px; padding:0 10px 0 13px; border:1px solid var(--ink-400); border-radius:12px; background:#fff; box-shadow:0 0 0 4px rgba(255,247,0,.24); }
.ws-command-search input{ width:100%; border:0; outline:0; background:transparent; font:600 14px/1 var(--font-body); }
.ws-command-label{ margin:20px 4px 8px; color:var(--text-subtle); font:700 9px/1 var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.ws-command-list{ display:flex; flex-direction:column; gap:4px; }
.ws-command-item{ display:grid; grid-template-columns:40px minmax(0,1fr) auto; align-items:center; gap:11px; width:100%; padding:9px; border:0; border-radius:10px; color:var(--text-strong); background:transparent; cursor:pointer; text-align:left; }
.ws-command-item:hover,.ws-command-item:focus-visible{ outline:0; background:var(--surface-50); }
.ws-command-item__icon{ display:grid; place-items:center; width:40px; height:40px; border:1px solid var(--line-100); border-radius:10px; background:#fff; }
.ws-command-item > span:nth-child(2){ display:flex; flex-direction:column; gap:3px; min-width:0; }
.ws-command-item strong{ font-size:13px; }.ws-command-item small{ color:var(--text-subtle); font-size:11px; }
.ws-command-empty{ padding:24px; text-align:center; color:var(--text-subtle); font-size:12.5px; }

/* Detail drawer, subtabs, tabel, dan layers lain mengikuti pola yang sama. */
.ws-slideover{ width:clamp(21rem,38vw,32.5rem); max-width:96vw; border-left:0; box-shadow:-28px 0 80px rgba(5,5,5,.18); }
.ws-slideover__head{ min-height:72px; padding:14px 18px; background:var(--vs-black); border:0; }
.ws-slideover__head::before{ content:''; width:8px; height:28px; border-radius:99px; background:var(--vs-yellow); }
.ws-slideover__head h3{ color:#fff; font-family:var(--font-display); font-size:18px; letter-spacing:-.02em; }
.ws-slideover__head .abtn{ color:#fff; border-color:rgba(255,255,255,.18); background:rgba(255,255,255,.07); }
.ws-slideover__body{ padding:20px; background:#fafafd; }
.ws-slideover__foot{ min-height:68px; padding:13px 18px; background:#fff; }
.workspace-layer .ws-subtabs{ display:flex; width:100%; padding:0; gap:0; overflow-x:auto; border:0; border-bottom:1px solid var(--line-200); border-radius:0; background:transparent; box-shadow:none; }
.workspace-layer .ws-subtab{ min-height:46px; padding:0 16px; border-bottom:2px solid transparent; border-radius:0; white-space:nowrap; }
.workspace-layer .ws-subtab.is-on{ color:var(--text-strong); background:transparent; border-bottom-color:var(--vs-black); }
.workspace-layer .panel{ overflow:hidden; border:1px solid var(--line-200); border-radius:16px; background:rgba(255,255,255,.84); }
.workspace-layer .panel-head{ min-height:64px; padding:15px 18px; }
.workspace-layer .panel-head h2{ font-size:14.5px; }
.workspace-layer .tbl th{ position:sticky; top:0; z-index:2; height:38px; background:#f4f4f7; }
.workspace-layer .tbl td{ height:50px; }
.workspace-layer .filters{ min-height:62px; padding:11px 12px; border-radius:14px; background:rgba(255,255,255,.84); }

/* Focus mode adalah fitur nyata, bukan state dekoratif.
   HATI-HATI dengan grid-template-columns di sini: .admin-shell hanya punya 2 track
   (sidebar | main; .mnav ikut track ke-2 dan display:none di desktop). Menulis 3 track
   membuat .main jatuh ke track 0px → SELURUH konten app kolaps jadi sepotong sidebar.
   Override hanya berlaku ≥861px; di bawah itu .sidebar sudah display:none dan shell
   jadi 1 kolom, jadi menimpa track di sana justru mengolapskan .main lagi. */
@media (min-width:861px){
  .ws-focus-mode .admin-shell{ grid-template-columns:0 minmax(0,1fr); }
  /* specificity harus >= .admin-shell.is-rail .sidebar (width:68px), kalau tidak
     sidebar tetap 68px dan meluber menimpa konten walau tak terlihat. */
  .ws-focus-mode .admin-shell .sidebar{ width:0; min-width:0; padding-inline:0; overflow:hidden; }
}
.ws-focus-mode .sidebar,.ws-focus-mode .ws-subrail{ opacity:0; visibility:hidden; transform:translateX(-24px); pointer-events:none; }
.ws-focus-mode .content.workspace-layer{ padding-inline:clamp(24px,5vw,84px); }

@media (max-width:1180px){
  .workspace-layer .ws-subnav{ grid-template-columns:repeat(7,minmax(138px,1fr)); }
  .workspace-layer .ws-projrow{ grid-template-columns:repeat(4,minmax(220px,1fr)); }
  .ws-board-head{ flex-wrap:wrap; }
  .ws-board-head__tools{ width:100%; margin-left:0; }
  .ws-board-search{ flex:1; }
}
@media (max-width:760px){
  .content.workspace-layer{ padding:22px 12px 78px; }
  .workspace-layer .ws-subnav{ display:flex; top:68px; margin-inline:-2px; }
  .workspace-layer .ws-pill{ min-width:148px; border-right:1px solid var(--line-100); }
  .ws-viewbar,.ws-section-heading{ align-items:stretch; flex-direction:column; }
  .ws-viewbar__tools,.ws-compact-field{ width:100%; }
  .ws-compact-field .ctrl{ width:100%; }
  .workspace-layer .ws-projrow{ display:flex; }
  .ws-board-head__people{ margin-left:0; }
  .ws-board-head__tools{ align-items:stretch; flex-direction:column; }
  .ws-board-search,.ws-priority-filter{ width:100%; min-width:0; }
  .workspace-layer .ws-board-shell .ws-kcol{ flex-basis:min(84vw,310px); min-height:470px; }
  .modal-back.center.workspace-layer{ align-items:end; padding:10px; }
  .modal-center.workspace-layer.ws-command-window,.modal-center.workspace-layer.ws-command-window.wide{ width:100%; max-height:calc(100dvh - 12px); border-radius:18px 18px 12px 12px; }
  .modal-center.workspace-layer .mc-head{ grid-template-columns:38px minmax(0,1fr) 34px; padding:12px 14px; }
  .ws-window-mark{ width:38px; height:38px; }
  .modal-center.workspace-layer .ws-form-canvas{ padding:17px 15px; }
}

/* == [WS3-PROJ] Project Overview — adaptasi 12.04.03 (ProjectCard + OverviewPanel) === */
/* Section header di atas baris kartu proyek */
.workspace-layer .ws-projsec{ margin:0 0 20px; }
.ws-projsec__h{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; margin:0 2px 11px; }
.ws-projsec__h .ws-kicker{ display:inline-flex; align-items:center; gap:6px; margin:0; }
.ws-projsec__h small{ font-size:11px; color:var(--text-subtle); }

/* Kartu proyek yang diperkaya: rule health di tepi kiri + interaktif */
.workspace-layer .ws-projcard{ position:relative; overflow:hidden; cursor:pointer; }
.ws-projcard::before{ content:""; position:absolute; left:0; top:0; bottom:0; width:3px; background:var(--ink-200); border-radius:3px 0 0 3px; }
.ws-projcard--on::before{ background:var(--accent-mint); }
.ws-projcard--risk::before{ background:var(--accent-orange); }
.ws-projcard--off::before{ background:var(--accent-red); }
.ws-projcard:focus-visible{ outline:none; box-shadow:var(--shadow-card),0 0 0 3px var(--focus-ring); border-color:var(--ink-300); }
.ws-projcard__solo{ font-size:10.5px; color:var(--text-subtle); }

/* Health chip (dot + label) */
.ws-healthchip{ display:inline-flex; align-items:center; gap:5px; padding:3px 8px 3px 7px; border-radius:100px; font-size:10.5px; font-weight:650; line-height:1; border:1px solid var(--line-200); background:var(--surface-1); color:var(--text-muted); white-space:nowrap; }
.ws-healthchip i{ width:7px; height:7px; border-radius:100px; background:var(--ink-300); flex:0 0 auto; }
.ws-healthchip--on{ color:var(--accent-mint); border-color:color-mix(in srgb,var(--accent-mint) 32%,transparent); background:color-mix(in srgb,var(--accent-mint) 9%,var(--surface-0)); }
.ws-healthchip--on i{ background:var(--accent-mint); }
.ws-healthchip--risk{ color:#9a6100; border-color:color-mix(in srgb,var(--accent-orange) 40%,transparent); background:color-mix(in srgb,var(--accent-orange) 12%,var(--surface-0)); }
.ws-healthchip--risk i{ background:var(--accent-orange); }
.ws-healthchip--off{ color:var(--accent-red); border-color:color-mix(in srgb,var(--accent-red) 36%,transparent); background:color-mix(in srgb,var(--accent-red) 10%,var(--surface-0)); }
.ws-healthchip--off i{ background:var(--accent-red); }

/* Bar rincian tugas (segmented) */
.ws-projbreak{ display:flex; gap:2px; height:7px; margin:11px 0 0; border-radius:100px; overflow:hidden; background:var(--ink-100); }
.ws-projbreak__seg{ min-width:3px; border-radius:2px; }
.ws-ava--more{ background:var(--ink-100); color:var(--text-muted); }
.ws-duechip.is-late{ color:var(--accent-red); background:color-mix(in srgb,var(--accent-red) 10%,transparent); }

/* Avatar group tumpang tindih di footer kartu */
.ws-projcard__foot .ws-avarow .ws-ava{ margin-left:-6px; }
.ws-projcard__foot .ws-avarow .ws-ava:first-child{ margin-left:0; }

/* ── Project Overview panel (di dalam wsSlideOver) ─────────────────────────── */
.ws-ovhero{ padding:0 0 16px; border-bottom:1px solid var(--line-100); }
.ws-ovhero__badges{ display:flex; align-items:center; flex-wrap:wrap; gap:8px; }
.ws-ovstage{ display:inline-flex; align-items:center; gap:5px; padding:3px 9px; border-radius:100px; font-size:10.5px; font-weight:600; color:var(--text-muted); background:var(--surface-1); border:1px solid var(--line-200); }
.ws-ovhero__meta{ display:flex; align-items:center; flex-wrap:wrap; gap:7px; margin-top:12px; font-size:12px; color:var(--text-muted); }
.ws-ovhero__meta svg{ opacity:.65; }
.ws-ovhero__meta b{ color:var(--text-strong); font-weight:650; }
.ws-ovhero__meta span[aria-hidden]{ color:var(--ink-200); }

.ws-ovprogress{ display:flex; align-items:center; gap:20px; padding:18px 0; border-bottom:1px solid var(--line-100); }
.ws-ovring{ position:relative; flex:0 0 auto; display:grid; place-items:center; }
.ws-ring__trk{ stroke:var(--ink-100); }
.ws-ovring__num{ position:absolute; font:800 20px/1 var(--font-display,var(--font-sans)); letter-spacing:-.03em; color:var(--text-strong); font-variant-numeric:tabular-nums; }
.ws-ovring__num i{ font-size:11px; font-weight:700; color:var(--text-subtle); font-style:normal; }
.ws-ovprogress__side{ min-width:0; }
.ws-ovprogress__side .ws-kicker{ margin:0 0 6px; }
.ws-ovprogress__side p{ margin:0; font-size:14px; color:var(--text-body); }
.ws-ovprogress__side p b{ font-weight:750; color:var(--text-strong); font-variant-numeric:tabular-nums; }
.ws-ovhealth{ display:inline-flex; align-items:center; gap:8px; margin-top:10px; font-size:12px; font-weight:600; color:var(--text-muted); }
.ws-healthbar{ display:inline-flex; gap:4px; }
.ws-healthbar i{ width:16px; height:5px; border-radius:100px; background:var(--ink-100); }

.ws-ovsec{ padding:16px 0; border-bottom:1px solid var(--line-100); }
.ws-ovsec:last-child{ border-bottom:0; }
.ws-ovsec__h{ display:flex; align-items:center; gap:7px; margin:0 0 12px; font-size:11px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--text-subtle); }
.ws-ovsec__h svg{ opacity:.7; }
.ws-ovsec__count{ margin-left:auto; padding:1px 8px; border-radius:100px; background:var(--ink-050); color:var(--text-muted); font-size:10.5px; font-weight:700; letter-spacing:0; }
.ws-ovlegend{ display:flex; flex-wrap:wrap; gap:6px 16px; margin-top:11px; }
.ws-ovlegend__item{ display:inline-flex; align-items:center; gap:6px; font-size:11.5px; color:var(--text-muted); }
.ws-ovlegend__item i{ width:9px; height:9px; border-radius:3px; }
.ws-ovlegend__item b{ color:var(--text-strong); font-variant-numeric:tabular-nums; }

.ws-ovrisk{ display:flex; align-items:center; gap:10px; width:100%; text-align:left; padding:10px 11px; margin-bottom:7px; border:1px solid var(--line-200); border-left:3px solid var(--accent-red); border-radius:var(--radius-sm); background:var(--surface-0); cursor:pointer; transition:background .14s ease; }
.ws-ovrisk:last-child{ margin-bottom:0; }
.ws-ovrisk:hover{ background:var(--surface-1); }
.ws-ovrisk__dot{ display:none; }
.ws-ovrisk__main{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
.ws-ovrisk__main b{ font-size:12.5px; font-weight:600; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ws-ovrisk__main small{ display:inline-flex; align-items:center; gap:4px; font-size:10.5px; color:var(--accent-red); }
.ws-ovrisk__main small svg{ opacity:.8; }
.ws-ovempty{ display:flex; align-items:center; gap:8px; padding:14px; border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-muted); font-size:12.5px; }
.ws-ovempty svg{ color:var(--accent-mint); }

.ws-ovteam{ display:flex; flex-direction:column; gap:9px; }
.ws-ovteam__m{ display:inline-flex; align-items:center; gap:9px; }
.ws-ovteam__nm{ font-size:12.5px; color:var(--text-body); }
.ws-ovteam__nm em{ margin-left:6px; padding:1px 6px; border-radius:100px; background:var(--vs-yellow); color:var(--vs-black); font:700 8.5px/1.4 var(--font-mono); font-style:normal; letter-spacing:.06em; text-transform:uppercase; vertical-align:middle; }

.ws-ovgroup{ margin-bottom:14px; }
.ws-ovgroup:last-child{ margin-bottom:0; }
.ws-ovgroup__h{ display:flex; align-items:center; gap:7px; margin-bottom:7px; font-size:12px; font-weight:700; color:var(--text-strong); }
.ws-ovgroup__h::before{ content:""; width:8px; height:8px; border-radius:100px; background:var(--ink-300); }
.ws-ovgroup__h--in_progress::before{ background:var(--accent-blue); }
.ws-ovgroup__h--review::before{ background:var(--accent-orange); }
.ws-ovgroup__h--done::before{ background:var(--accent-mint); }
.ws-ovgroup__n{ margin-left:auto; color:var(--text-subtle); font-size:11px; font-weight:600; font-variant-numeric:tabular-nums; }
.ws-ovtask{ display:flex; align-items:center; gap:9px; width:100%; text-align:left; padding:8px 10px; margin-bottom:5px; border:1px solid var(--line-100); border-radius:var(--radius-xs); background:var(--surface-0); cursor:pointer; transition:background .14s ease,border-color .14s ease; }
.ws-ovtask:hover{ background:var(--surface-1); border-color:var(--line-200); }
.ws-ovtask__code{ font:650 9px/1 var(--font-mono); letter-spacing:.06em; color:var(--text-subtle); flex:0 0 auto; }
.ws-ovtask__title{ flex:1; min-width:0; overflow:hidden; font-size:12px; color:var(--text-body); text-overflow:ellipsis; white-space:nowrap; }
/* == [WS3-PROJ] END ============================================================ */

/* ============ DISCOVER ADMIN (PRD 12.50) ============ */
.sf-badge-chip{ display:inline-flex; align-items:center; padding:1px 7px; border-radius:100px; font-size:10px; font-weight:700; line-height:1.6; margin-left:4px; border:1px solid transparent; vertical-align:middle; }
.sf-badge-chip.is-verified{ background:var(--pst-info-bg,#D4F1FD); color:var(--pst-info-text,#0C7090); border-color:var(--pst-info-border,#6BCBEC); }
.sf-badge-chip.is-partner{ background:var(--pst-purple-bg,#E7DDFF); color:var(--pst-purple-text,#6636D6); border-color:var(--pst-purple-border,#B093FF); }
.sf-badge-chip.is-official{ background:var(--pst-identity-bg,#FFFBD6); color:var(--pst-identity-text,#050505); border-color:var(--pst-identity-border,#FFF700); }
.sf-badge-chip.is-pending{ background:var(--pst-warning-bg,#FFEFBE); color:var(--pst-warning-text,#8A5E00); border-color:var(--pst-warning-border,#F2C233); }
.sf-disc-dot{ width:12px; height:12px; border-radius:50%; flex:0 0 auto; }
.sf-disc-dot.on{ background:var(--pst-mint-border,#54DDA0); box-shadow:0 0 0 3px var(--pst-mint-bg,#C8F7DC); }
.sf-disc-dot.off{ background:var(--ink-400,#9AA0AA); box-shadow:0 0 0 3px var(--line-100,#F0F2F5); }
.sf-disc-st{ display:inline-flex; padding:2px 9px; border-radius:100px; font-size:11px; font-weight:700; }
.sf-disc-st.st-published{ background:var(--pst-mint-bg,#C8F7DC); color:var(--pst-mint-text,#047857); }
.sf-disc-st.st-review{ background:var(--pst-warning-bg,#FFEFBE); color:var(--pst-warning-text,#8A5E00); }
.sf-disc-st.st-draft{ background:var(--pst-neutral-bg,#ECEEF3); color:var(--pst-neutral-text,#59616E); }
.sf-disc-st.st-hidden{ background:var(--pst-neutral-bg,#ECEEF3); color:var(--ink-400,#9AA0AA); }
.disc-pf-grid{ display:grid; grid-template-columns:repeat(3,72px); gap:8px; margin-top:8px; }
.disc-pf-cell{ position:relative; width:72px; height:72px; border-radius:10px; background:var(--surface-50,#F7F8FA); background-size:cover; background-position:center; display:grid; place-items:center; border:1px solid var(--line-200,#E6E8EE); }
.disc-pf-cell.add{ cursor:pointer; color:var(--ink-400,#9AA0AA); border-style:dashed; }
.disc-pf-cell.add:hover{ color:var(--ink-900,#111214); border-color:var(--ink-400,#9AA0AA); }
.disc-pf-rm{ position:absolute; top:-6px; right:-6px; width:22px; height:22px; border:0; border-radius:50%; background:var(--ink-900,#111214); color:#fff; cursor:pointer; display:grid; place-items:center; }
.disc-lstack{ display:flex; flex-direction:column; gap:8px; }
.disc-lrow{ border:1px solid var(--line-200,#E6E8EE); border-radius:10px; overflow:hidden; }
.disc-lrow-hd{ display:flex; align-items:center; justify-content:space-between; gap:8px; padding:8px 12px; background:var(--surface-50,#F7F8FA); }
.disc-lrow-bd{ padding:10px 12px; }
.disc-lrow-bd .ctrl{ width:100%; }

/* — Tipografi Global (Tampilan): details Advanced ukuran per elemen — */
.th-typo-adv { margin-top: 4px; border: 1px solid var(--line-200, #E6E8EE); border-radius: 10px; padding: 0 12px; background: var(--surface-50, #F7F8FA); }
.th-typo-adv summary { cursor: pointer; padding: 10px 0; font-size: 12.5px; font-weight: 700; color: var(--ink-700, #3A3D45); user-select: none; }
.th-typo-adv[open] { padding-bottom: 12px; background: var(--surface-0, #fff); }
.th-typo-adv[open] summary { border-bottom: 1px solid var(--line-100, #F0F2F5); margin-bottom: 8px; }

/* ============================================================
   BOOKING MODULE FRONT-END REFRESH  (BK-REFRESH)
   Blok additive: Overview, Database, attention model, modal terpusat.
   Semua warna via token DS v2.0 (--tag-*, --line, --surface). Boxy, hairline,
   Identity Yellow hanya untuk indicator tab aktif. Tanpa mengubah tipografi.
   ============================================================ */

/* ---- tab underline Overview / Database ---- */
.bk-tabs { display:flex; gap:4px; border-bottom:1px solid var(--line); margin:0 0 16px; }
.bk-tab { padding:10px 14px; font-size:14px; font-weight:640; color:var(--muted); border-bottom:2px solid transparent; margin-bottom:-1px; text-decoration:none; transition:color .15s ease, border-color .15s ease; }
.bk-tab:hover { color:var(--text-strong, var(--ink)); }
.bk-tab.is-on { color:var(--text-strong, var(--ink)); border-bottom-color:var(--brand, #F5C518); }

/* ---- universal date filter (sticky) ---- */
.bk-datebar { position:sticky; top:0; z-index:20; display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;
  padding:10px 12px; background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:14px; margin-bottom:16px; box-shadow:var(--shadow-card, var(--shadow-1)); }
.bk-datebar-nav { display:flex; align-items:center; gap:8px; }
.bk-navbtn { padding:0; width:36px; height:36px; display:inline-flex; align-items:center; justify-content:center; }
.bk-datepick { position:relative; display:inline-flex; }
.bk-datebtn { font-weight:640; min-height:40px; }
.bk-date-input { position:absolute; inset:0; opacity:0; width:100%; height:100%; border:0; cursor:pointer; }
.bk-datebar-meta { font-size:12px; color:var(--muted); }
.bk-datebar-meta .mono { font-variant-numeric:tabular-nums; }

/* ---- StatCards ---- */
.bk-stats { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:12px; margin-bottom:16px; }
.bk-stat { display:grid; grid-template-columns:42px minmax(0,1fr); align-items:start; gap:12px; min-height:94px; padding:16px; text-align:left;
  color:var(--text-strong, var(--ink)); background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:14px; cursor:pointer; box-shadow:var(--shadow-card, var(--shadow-1)); transition:transform .15s ease, border-color .15s ease, box-shadow .15s ease; }
.bk-stat:hover { transform:translateY(-2px); box-shadow:var(--shadow-pop, var(--shadow-card)); }
.bk-stat.is-on { border-color:var(--primary); box-shadow:0 0 0 1px var(--primary) inset; }
.bk-stat-icon { display:inline-flex; align-items:center; justify-content:center; width:42px; height:42px; border-radius:12px; color:var(--primary); background:var(--canvas); border:1px solid var(--line); }
.bk-stat-copy { min-width:0; display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline; gap:3px 8px; }
.bk-stat-lbl { font-size:12.5px; font-weight:700; color:var(--muted); }
.bk-stat-num { grid-column:2; grid-row:1 / span 2; align-self:center; font-size:27px; font-weight:760; font-variant-numeric:tabular-nums; line-height:1; }
.bk-stat-desc { min-width:0; font-size:11.5px; line-height:1.3; color:var(--muted); }
.bk-stat.tone-info .bk-stat-icon { color:var(--tag-info-text); background:var(--tag-info-bg); border-color:var(--tag-info-border); }
.bk-stat.tone-live .bk-stat-icon { color:var(--tag-info-text); background:var(--tag-info-bg); border-color:var(--tag-info-border); }
.bk-stat.tone-ok .bk-stat-icon { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }

/* ---- overview layout ---- */
.bk-ov-grid { display:grid; grid-template-columns:minmax(0,2.2fr) minmax(280px,1fr); gap:16px; align-items:start; margin-bottom:16px; }
.bk-ov-side { display:flex; flex-direction:column; gap:16px; }
.bk-panel { min-width:0; background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:14px; padding:18px; box-shadow:var(--shadow-card, var(--shadow-1)); }
.bk-panel-head { display:flex; align-items:flex-start; justify-content:space-between; gap:12px; margin-bottom:14px; }
.bk-panel-title { min-width:0; display:flex; align-items:center; gap:10px; }
.bk-panel-icon { flex:none; display:inline-flex; align-items:center; justify-content:center; width:36px; height:36px; border-radius:10px; color:var(--primary); background:var(--canvas); border:1px solid var(--line); }
.bk-panel-icon--success { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.bk-panel-head h2 { margin:0; font-size:15px; font-weight:720; line-height:1.25; }
.bk-panel-head p { margin:3px 0 0; font-size:11.5px; color:var(--muted); line-height:1.3; }
.bk-count { flex:none; display:inline-flex; align-items:center; min-height:26px; padding:3px 9px; font-size:11.5px; font-weight:650; color:var(--muted); background:var(--canvas); border:1px solid var(--line); border-radius:100px; font-variant-numeric:tabular-nums; }
.bk-localfilter { display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-bottom:12px; }
.bk-localfilter--wrap { gap:6px; }
.bk-localfilter-sp { flex:1 1 12px; }
.bk-chip { padding:6px 11px; font-size:12.5px; font-weight:600; color:var(--muted); background:transparent; border:1px solid var(--line); border-radius:100px; cursor:pointer; transition:all .15s ease; }
.bk-chip:hover { color:var(--text-strong, var(--ink)); border-color:var(--muted); }
.bk-chip.is-on { color:#fff; background:var(--primary); border-color:var(--primary); }
.bk-chip b { font-variant-numeric:tabular-nums; margin-left:3px; }
.bk-chip--warn { color:var(--tag-warning-text); border-color:var(--tag-warning-border); background:var(--tag-warning-bg); }
.bk-mini-sel { height:32px; max-width:180px; color:var(--text-strong, var(--ink)); border:1px solid var(--line); border-radius:8px; background:var(--surface-0, var(--paper)); font-size:12.5px; padding:0 28px 0 9px; }

/* ---- session card / finished / queue row ---- */
.bk-scard-list, .bk-qrow-list { display:grid; grid-template-columns:repeat(auto-fill, minmax(min(100%, 320px), 1fr)); gap:12px; align-items:stretch; }
.bk-scard-list .bk-empty, .bk-qrow-list .bk-empty { grid-column:1 / -1; }
/* Kartu sesi = unit library GUI/15/CARD varian "default" (kartu detail comfy).
   Anatomi tetap: head · grid detail · baris tag · divider · footer (total + aksi).
   Semua baris komposit memakai grid (bukan flex) supaya kolom tak pernah saling
   menindih saat teks panjang; kartu jadi container agar tiap blok bisa melipat
   sendiri mengikuti lebar KARTU, bukan lebar layar. */
.bk-scard { display:flex; flex-direction:column; gap:12px; padding:15px 16px; height:100%;
  container-type:inline-size; container-name:scard;
  background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:12px; cursor:pointer;
  transition:transform .15s ease, box-shadow .15s ease, border-color .15s ease; }
.bk-scard:hover { transform:translateY(-1px); border-color:var(--muted); box-shadow:var(--shadow-card, var(--shadow-1)); }
/* Head: avatar · identitas · badge. Di kartu sempit badge turun ke barisnya sendiri
   supaya nama & SID tidak tergencet jadi 2 baris terpotong. */
.bk-scard-head { display:grid; grid-template-columns:auto minmax(0,1fr); grid-template-areas:"av id" "st st"; align-items:center; gap:8px 11px; }
.bk-scard-av { grid-area:av; width:38px; height:38px; border-radius:100px; background:var(--ink-050); border:1px solid var(--line-200, var(--line));
  display:inline-flex; align-items:center; justify-content:center; font-family:var(--font-mono); font-size:12.5px; font-weight:600; color:var(--text-muted, var(--muted)); }
.bk-scard-idlabel { grid-area:id; display:grid; gap:2px; min-width:0; }
.bk-scard-name { font-size:14.5px; font-weight:600; line-height:1.25; color:var(--text-strong, var(--ink)); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.bk-scard-sid { font-family:var(--font-mono); font-size:11px; line-height:1.2; color:var(--text-subtle, var(--muted)); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.bk-scard-head .badge-st { grid-area:st; justify-self:start; white-space:nowrap; }
/* Badge dibiarkan selebar labelnya (tak pernah dipotong); yang menyusut adalah kolom
   identitas. Ambang container dipilih agar nama masih dapat ±150px saat sebaris. */
@container scard (min-width: 360px) {
  .bk-scard-head { grid-template-columns:auto minmax(0,1fr) auto; grid-template-areas:"av id st"; }
  .bk-scard-head .badge-st { justify-self:end; }
}
/* Detail: satu kolom penuh secara default (teks utuh), dua kolom saat kartu lega. */
.bk-scard-grid { display:grid; grid-template-columns:minmax(0,1fr); gap:7px 16px; font-size:13px; line-height:1.35; color:var(--text-muted, var(--muted)); }
@container scard (min-width: 400px) { .bk-scard-grid { grid-template-columns:minmax(0,1fr) minmax(0,1fr); } }
.bk-scard-cell { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:7px; min-width:0; }
.bk-scard-cell svg { opacity:.72; }
.bk-scard-cell-tx { min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.bk-scard-div { flex:none; height:1px; background:var(--line-100, var(--line)); margin-top:auto; }
/* Footer: total (kiri) · aksi (kanan) — dua kolom tegas, tombol tak pernah menempel
   ke angka. Kartu sempit: aksi pindah ke baris bawah, tetap rata kanan. */
.bk-scard-foot { display:grid; grid-template-columns:minmax(0,1fr); justify-items:end; align-items:end; gap:10px 12px; }
@container scard (min-width: 240px) { .bk-scard-foot { grid-template-columns:minmax(0,auto) minmax(0,1fr); } }
.bk-scard-foot--end { grid-template-columns:minmax(0,1fr); }
.bk-scard-total { display:grid; gap:1px; justify-self:start; min-width:0; }
.bk-scard-total-lbl { font-size:10px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle, var(--muted)); }
.bk-scard-total-val { font-size:15px; font-weight:700; line-height:1.2; color:var(--text-strong, var(--ink)); }
.bk-meta-item { display:inline-flex; align-items:center; gap:4px; min-width:0; }
.bk-meta-item svg, .bk-frow-meta svg { flex:none; opacity:.72; }
.bk-meta-sep { opacity:.45; margin:0 3px; }
/* Baris tag: chip pembayaran/attention/bypass punya barisnya sendiri agar tak lagi
   berebut tempat dengan total & tombol. Chip boleh menyusut, tak boleh terpotong. */
.bk-scard-tags, .bk-qrow-tags { display:flex; align-items:center; gap:6px; flex-wrap:wrap; min-width:0; }
.bk-scard-tags > * { max-width:100%; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bk-scard-act, .bk-qrow-act { display:flex; gap:6px; flex-wrap:wrap; justify-content:flex-end; min-width:0; }
.bk-scard-act .abtn { flex:0 1 auto; min-width:0; }
.bk-frow-list { display:flex; flex-direction:column; gap:4px; }
.bk-frow { display:flex; align-items:center; gap:9px; padding:9px 10px; border-radius:9px; cursor:pointer; font-size:13px; }
.bk-frow:hover { background:var(--canvas); }
.bk-frow-check { display:inline-flex; color:var(--tag-success-text); }
.bk-frow-time { font-variant-numeric:tabular-nums; font-weight:700; color:var(--muted); }
.bk-frow-name { font-weight:600; }
.bk-frow-meta { display:inline-flex; align-items:center; gap:3px; color:var(--muted); font-size:12px; margin-left:auto; }
.bk-intake-kpi { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:8px; margin-bottom:14px; }
.bk-intake-stat { display:flex; align-items:center; gap:9px; min-width:0; padding:10px; text-align:left; color:var(--text-strong, var(--ink)); background:var(--canvas); border:1px solid var(--line); border-radius:11px; cursor:pointer; transition:border-color .15s ease, transform .15s ease; }
.bk-intake-stat:hover { transform:translateY(-1px); border-color:var(--muted); }
.bk-intake-stat.is-on { border-color:var(--primary); box-shadow:0 0 0 1px var(--primary) inset; }
.bk-intake-icon { flex:none; display:inline-flex; align-items:center; justify-content:center; width:32px; height:32px; border-radius:9px; color:var(--muted); background:var(--surface-0, var(--paper)); border:1px solid var(--line); }
.bk-intake-stat > span:last-child { min-width:0; display:flex; flex-direction:column; }
.bk-intake-stat b { font-size:16px; line-height:1.1; font-variant-numeric:tabular-nums; }
.bk-intake-stat small { margin-top:2px; overflow:hidden; color:var(--muted); font-size:10.5px; line-height:1.2; text-overflow:ellipsis; white-space:nowrap; }
.bk-intake-stat.tone-warning .bk-intake-icon { color:var(--tag-warning-text); background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.bk-intake-stat.tone-info .bk-intake-icon { color:var(--tag-info-text); background:var(--tag-info-bg); border-color:var(--tag-info-border); }
.bk-intake-stat.tone-danger .bk-intake-icon { color:var(--tag-danger-text); background:var(--tag-danger-bg); border-color:var(--tag-danger-border); }
/* Kartu ikut warna statusnya — digradasikan ke putih (150deg → surface 62%), rumus
   yang sama dengan kartu Daftar Jadwal & galeri Customers. */
.bk-intake-stat.tone-warning { background:linear-gradient(150deg,var(--tag-warning-bg),var(--surface-0,var(--paper)) 62%); border-color:var(--tag-warning-border); }
.bk-intake-stat.tone-info    { background:linear-gradient(150deg,var(--tag-info-bg),var(--surface-0,var(--paper)) 62%); border-color:var(--tag-info-border); }
.bk-intake-stat.tone-danger  { background:linear-gradient(150deg,var(--tag-danger-bg),var(--surface-0,var(--paper)) 62%); border-color:var(--tag-danger-border); }
.bk-intake-stat:not([class*="tone-"]) { background:linear-gradient(150deg,var(--tag-neutral-bg,var(--surface-1)),var(--surface-0,var(--paper)) 62%); }
.bk-qrow { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:12px; align-items:center; padding:12px 14px; background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:12px; cursor:pointer; transition:transform .15s ease, box-shadow .15s ease, border-color .15s ease; }
.bk-qrow:hover { transform:translateY(-1px); border-color:var(--muted); box-shadow:var(--shadow-card, var(--shadow-1)); }
.bk-qrow-top { display:flex; align-items:baseline; gap:8px; }
.bk-qrow-name { font-weight:640; font-size:14px; }
.bk-qrow-sid { font-size:11px; color:var(--muted); }
.bk-qrow-age { font-size:11px; color:var(--muted); margin-left:auto; }
.bk-qrow-meta { font-size:12.5px; color:var(--muted); margin:3px 0 7px; display:flex; align-items:center; gap:8px 12px; flex-wrap:wrap; }
.bk-note { margin-top:12px; padding:9px 12px; border-radius:10px; font-size:12.5px; display:flex; align-items:center; gap:8px; }
.bk-note--warn { background:var(--tag-warning-bg); color:var(--tag-warning-text); border:1px solid var(--tag-warning-border); }
.bk-empty { text-align:center; color:var(--muted); padding:28px 12px; display:flex; flex-direction:column; align-items:center; gap:8px; }
.bk-empty svg { opacity:.4; }
.bk-empty--sm { padding:14px; }

/* ---- attention tag + rail + tint (icon+label, jangan warna-saja) ---- */
.bk-attn { display:inline-flex; align-items:center; gap:4px; padding:2px 8px; height:22px; border-radius:100px; font-size:11.5px; font-weight:600; line-height:1; white-space:nowrap; }
.bk-attn svg { flex:none; }
.bk-attn--danger { background:var(--tag-danger-bg); color:var(--tag-danger-text); border:1px solid var(--tag-danger-border); }
.bk-attn--warning { background:var(--tag-warning-bg); color:var(--tag-warning-text); border:1px solid var(--tag-warning-border); }
.bk-attn--info { background:var(--tag-info-bg); color:var(--tag-info-text); border:1px solid var(--tag-info-border); }
.bk-attn--success { background:var(--tag-success-bg); color:var(--tag-success-text); border:1px solid var(--tag-success-border); }
.bk-attn--neutral { background:var(--tag-neutral-bg); color:var(--tag-neutral-text); border:1px solid var(--tag-neutral-border); }
.bk-rail { position:relative; }
.bk-rail::before { content:''; position:absolute; left:0; top:0; bottom:0; width:3px; border-radius:12px 0 0 12px; }
.bk-rail--danger::before { background:var(--tag-danger-text); }
.bk-rail--warning::before { background:var(--tag-warning-text); }
.bk-rail--danger { background:var(--surface-0, var(--paper)); border-color:var(--tag-danger-border); }
.bk-rail--warning { background:var(--surface-0, var(--paper)); border-color:var(--tag-warning-border); }
.bk-attn-dot { display:inline-block; width:7px; height:7px; border-radius:50%; margin-right:6px; vertical-align:middle; }
.bk-attn-dot--danger { background:var(--tag-danger-text); }
.bk-attn-dot--warning { background:var(--tag-warning-text); }
tr.bk-tr-attn--danger td { background:var(--surface-0, var(--paper)); background:color-mix(in srgb, var(--tag-danger-bg) 42%, var(--surface-0, #fff)); }
tr.bk-tr-attn--warning td { background:var(--surface-0, var(--paper)); background:color-mix(in srgb, var(--tag-warning-bg) 48%, var(--surface-0, #fff)); }
tr.bk-tr-attn td:first-child { position:relative; }
tr.bk-tr-attn td:first-child::before { content:''; position:absolute; inset:0 auto 0 0; width:3px; }
tr.bk-tr-attn--danger td:first-child::before { background:var(--tag-danger-text); }
tr.bk-tr-attn--warning td:first-child::before { background:var(--tag-warning-text); }

/* ---- Database: quick views, status multi-select, active chips ---- */
.bk-quickviews { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:12px; }
.bk-qv { padding:6px 12px; font-size:12.5px; font-weight:600; color:var(--muted); background:transparent; border:1px solid var(--line); border-radius:100px; cursor:pointer; transition:all .15s ease; }
.bk-qv:hover { color:var(--text-strong, var(--ink)); border-color:var(--muted); }
.bk-qv.is-on { color:#fff; background:var(--primary); border-color:var(--primary); }
.bk-statusms { position:relative; }
.bk-ms-badge { display:inline-flex; align-items:center; justify-content:center; min-width:17px; height:17px; padding:0 4px; margin-left:2px; border-radius:100px; background:var(--primary); color:#fff; font-size:10.5px; font-variant-numeric:tabular-nums; }
.bk-status-pop { position:absolute; top:calc(100% + 6px); left:0; z-index:40; width:260px; max-height:320px; overflow:auto;
  background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:12px; box-shadow:var(--shadow-pop); padding:6px; }
.bk-status-opt { display:flex; align-items:center; gap:8px; padding:6px 8px; border-radius:8px; cursor:pointer; font-size:13px; }
.bk-status-opt:hover { background:var(--canvas); }
.bk-status-opt b { margin-left:auto; color:var(--muted); font-size:11.5px; }
.bk-activechips { display:flex; flex-wrap:wrap; gap:6px; align-items:center; margin-bottom:12px; }
.bk-filter-chip { display:inline-flex; align-items:center; gap:5px; padding:4px 10px; font-size:12px; font-weight:600; color:var(--text-strong, var(--ink));
  background:var(--canvas); border:1px solid var(--line); border-radius:100px; cursor:pointer; }
.bk-filter-chip:hover { border-color:var(--danger); color:var(--danger); }
.bk-filter-chip svg { opacity:.6; }
.bk-clearall { padding:4px 10px; font-size:12px; font-weight:600; color:var(--muted); background:transparent; border:0; cursor:pointer; text-decoration:underline; }

/* ---- Detail modal terpusat ---- */
.bk-detail-back { position:fixed; inset:0; z-index:1200; display:flex; align-items:center; justify-content:center; padding:24px;
  background:rgba(5,5,5,.42); -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px); animation:bkFade .16s ease; }
/* Lebar fluid (% dari .bk-detail-back yang sudah ber-padding 24px), bukan px mati
   → ikut ukuran layar. Batas atas tetap ada dalam rem: tanpa itu, di layar lebar
   grid 2fr/1fr melar dan baris teks jadi terlalu panjang untuk dibaca. */
.bk-detail { width:92%; max-width:70rem; min-width:0; max-height:90vh; display:flex; flex-direction:column;
  text-align:left; color:var(--text-strong, var(--ink)); background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:20px; box-shadow:var(--shadow-pop); overflow:hidden; animation:bkRise .16s ease; }
.bk-detail-head { display:flex; align-items:flex-start; gap:16px; padding:20px 22px; background:var(--surface-0, var(--paper)); border-bottom:1px solid var(--line); }
.bk-detail-head-main { min-width:0; flex:1; display:grid; grid-template-columns:minmax(0,1fr) minmax(280px,360px); align-items:center; gap:22px; }
.bk-detail-identity { min-width:0; }
.bk-detail-sid { display:inline-flex; align-items:center; gap:4px; max-width:100%; font-size:11px; color:var(--muted); }
.bk-detail-sid span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bk-detail .bk-detail-title { display:block; margin:5px 0 9px; font-family:var(--font-sans); font-size:21px; font-weight:760; line-height:1.18; letter-spacing:-.025em; text-transform:none; color:var(--text-strong, var(--ink)); }
.bk-detail-chips { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.bk-detail-schedule { min-width:0; display:grid; grid-template-columns:38px minmax(0,1fr); align-items:start; gap:11px; padding:12px 13px; background:var(--canvas); border:1px solid var(--line); border-radius:12px; }
.bk-detail-schedule-ic { display:inline-flex; align-items:center; justify-content:center; width:38px; height:38px; color:var(--text-strong, var(--ink)); background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:10px; }
.bk-detail-schedule-copy { min-width:0; display:flex; flex-direction:column; align-items:flex-start; }
.bk-detail-schedule-label { margin-bottom:2px; font-size:10px; font-weight:700; letter-spacing:.07em; text-transform:uppercase; color:var(--muted); }
.bk-detail-schedule-copy strong { max-width:100%; overflow:hidden; font-size:12.5px; font-weight:700; line-height:1.3; text-overflow:ellipsis; white-space:nowrap; }
.bk-detail-schedule-meta { width:100%; display:flex; align-items:center; gap:6px 10px; flex-wrap:wrap; margin-top:5px; font-size:11px; color:var(--muted); }
.bk-detail-schedule-meta span { min-width:0; display:inline-flex; align-items:center; gap:4px; }
.bk-detail-schedule-meta svg { flex:none; }
.bk-detail-head .x { flex:none; width:36px; height:36px; display:inline-flex; align-items:center; justify-content:center; border:1px solid transparent; background:transparent; border-radius:9px; cursor:pointer; color:var(--muted); }
.bk-detail-head .x:hover { background:var(--canvas); color:var(--text-strong, var(--ink)); }
.bk-detail-body { overflow-y:auto; overflow-x:hidden; padding:18px 22px; flex:1; }
.bk-detail-grid { display:grid; grid-template-columns:2fr 1fr; gap:18px; align-items:start; }
.bk-detail-main { min-width:0; display:flex; flex-direction:column; gap:14px; }
.bk-detail-side { display:flex; flex-direction:column; gap:12px; position:sticky; top:0; }
.bk-sec { background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:12px; overflow:hidden; }
.bk-sec-h { display:flex; align-items:center; gap:9px; padding:10px 13px; background:var(--canvas); border-bottom:1px solid var(--line); }
.bk-sec-ic { flex:none; display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; color:var(--muted); background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:8px; }
.bk-sec-h h3 { min-width:0; margin:0; flex:1; text-align:left; font-size:13px; font-weight:700; line-height:1.3; }
.bk-sec--coll .bk-sec-h { cursor:pointer; user-select:none; }
.bk-sec--coll:not(.is-open) .bk-sec-h { border-bottom:0; }
.bk-sec-chev { color:var(--muted); transition:transform .15s ease; }
.bk-sec.is-open .bk-sec-chev { transform:rotate(180deg); }
.bk-sec-b { padding:6px 14px; }
.bk-sec--coll .bk-sec-b { display:none; }
.bk-sec--coll.is-open .bk-sec-b { display:block; }
.bk-sec-div { height:1px; background:var(--line); margin:10px 0; }
.bk-detail .kv { display:grid; grid-template-columns:minmax(118px,30%) minmax(0,1fr); align-items:start; gap:16px; padding:10px 0; }
.bk-detail .kv .k { width:auto; text-align:left; font-size:12px; line-height:1.45; color:var(--muted); }
.bk-detail .kv .v { min-width:0; text-align:left; font-size:13px; font-weight:600; line-height:1.45; word-break:break-word; }
.bk-detail .pax-warn { margin-top:4px; text-align:left; line-height:1.4; }
.bk-detail .inline-alert { margin-top:10px; text-align:left; }
.bk-side-card { border:1px solid var(--line); border-radius:12px; padding:13px 14px; background:var(--surface-0, var(--paper)); }
.bk-side-attn { border-color:var(--tag-warning-border); background:color-mix(in srgb, var(--tag-warning-bg) 72%, var(--surface-0, #fff)); }
.bk-side-h { display:flex; align-items:center; gap:6px; margin-bottom:10px; font-size:10.5px; font-weight:750; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); }
.bk-side-h svg { flex:none; }
.bk-attn-line { margin-bottom:7px; text-align:left; }
.bk-attn-line:last-child { margin-bottom:0; }
.bk-side-pay { display:flex; justify-content:space-between; align-items:center; gap:12px; font-size:13px; padding:4px 0; }
.bk-side-pay--due { color:var(--tag-warning-text); font-weight:700; }
.bk-side-pay .mono { font-variant-numeric:tabular-nums; }
.bk-detail-foot { display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:14px 22px; border-top:1px solid var(--line); background:var(--surface-0, var(--paper)); }
.bk-detail-foot .bk-primary { margin-right:auto; }
.bk-primary--blocked { display:inline-flex; align-items:center; gap:8px; min-width:0; }
.bk-primary--blocked .abtn[disabled] { opacity:.55; cursor:not-allowed; }
.bk-primary-reason { font-size:11.5px; color:var(--tag-warning-text); max-width:260px; line-height:1.3; }
.bk-more { position:relative; }
.bk-more-menu { position:absolute; bottom:calc(100% + 6px); right:0; z-index:50; min-width:220px; background:var(--surface-0, var(--paper)); border:1px solid var(--line); border-radius:12px; box-shadow:var(--shadow-pop); padding:6px; }
.bk-more-item { display:flex; align-items:center; gap:8px; width:100%; padding:9px 10px; font-size:13px; font-weight:600; color:var(--text-strong, var(--ink)); background:transparent; border:0; border-radius:8px; cursor:pointer; text-align:left; }
.bk-more-item:hover { background:var(--canvas); }
.bk-more-danger { color:var(--danger); }

@keyframes bkFade { from { opacity:0; } to { opacity:1; } }
@keyframes bkRise { from { opacity:0; transform:translateY(8px); } to { opacity:1; transform:translateY(0); } }

/* ---- responsive ---- */
@media (max-width:1024px) {
  .bk-ov-grid { grid-template-columns:1fr; }
  .bk-intake-kpi { grid-template-columns:repeat(2,minmax(0,1fr)); }
  .bk-detail-grid { grid-template-columns:1fr; }
  .bk-detail-side { position:static; }
}
@media (max-width:768px) {
  .bk-stats { grid-template-columns:repeat(2,1fr); }
  .bk-datebar { padding-top:8px; padding-bottom:8px; }
  .bk-datebar-nav { width:100%; }
  .bk-datepick { flex:1; min-width:0; }
  .bk-datebtn { width:100%; justify-content:flex-start; overflow:hidden; }
  .bk-datebtn span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .bk-panel { padding:14px; }
  .bk-qrow { grid-template-columns:1fr; }
  .bk-qrow-act { justify-content:flex-start; }
  .bk-frow { flex-wrap:wrap; }
  .bk-frow-meta { order:5; width:100%; margin-left:39px; }
  .bk-detail-back { padding:0; }
  .bk-detail { width:100vw; max-width:100vw; height:100vh; max-height:100vh; border-radius:0; border:0; }
  .bk-detail-head { padding-top:16px; padding-bottom:16px; }
  .bk-detail-head-main { grid-template-columns:1fr; gap:12px; }
  .bk-detail-schedule { width:100%; }
  .bk-detail-schedule-copy strong { white-space:normal; }
  .bk-detail-foot { padding-bottom:calc(14px + env(safe-area-inset-bottom)); position:sticky; bottom:0; }
  .bk-detail-foot .bk-primary { flex:1 0 100%; width:100%; margin-right:0; }
  .bk-primary--blocked { flex:1 0 100%; width:100%; }
  .bk-status-pop { width:min(280px, calc(100vw - 32px)); }
}
@media (max-width:480px) {
  .bk-stat { grid-template-columns:36px minmax(0,1fr); gap:9px; min-height:86px; padding:12px; }
  .bk-stat-icon { width:36px; height:36px; border-radius:10px; }
  .bk-stat-num { font-size:23px; }
  .bk-stat-desc { font-size:10.5px; }
  .bk-intake-kpi { grid-template-columns:1fr 1fr; }
  .bk-intake-stat { padding:8px; }
  .bk-localfilter-sp { display:none; }
  .bk-mini-sel { flex:1 1 calc(50% - 6px); min-width:0; max-width:none; }
  .bk-detail-head, .bk-detail-body, .bk-detail-foot { padding-left:14px; padding-right:14px; }
  .bk-detail .bk-detail-title { font-size:19px; }
  .bk-detail-schedule { grid-template-columns:34px minmax(0,1fr); padding:10px; }
  .bk-detail-schedule-ic { width:34px; height:34px; }
  .bk-detail .kv { grid-template-columns:1fr; gap:3px; padding:9px 0; }
  .bk-detail .kv .k { font-size:11px; }
  .bk-sec-h { padding:9px 10px; }
  .bk-sec-b { padding-left:11px; padding-right:11px; }
}

/* ---- motion/a11y ---- */
.bk-tab:focus-visible, .bk-chip:focus-visible, .bk-qv:focus-visible, .bk-stat:focus-visible,
.bk-scard:focus-visible, .bk-qrow:focus-visible, .bk-filter-chip:focus-visible {
  outline:2px solid var(--brand, #F5C518); outline-offset:2px; }
@media (prefers-reduced-motion: reduce) {
  .bk-detail-back, .bk-detail { animation:none; }
  .bk-stat, .bk-scard, .bk-qrow { transition:none; }
}

/* ---- Bookings workspace · VIRCANSA OS component library alignment ---- */
.bk-workspace { --bk-radius:12px; min-width:0; }
/* Hero .bk-page-head dihapus (2026-07-22, permintaan owner): judul modul sudah ada di
   topbar, hero-nya cuma menambah tinggi sebelum konten kerja. Kicker tetap dipakai toolbox. */
.bk-kicker, .bk-toolbox-kicker {
  display:block; margin-bottom:8px; font-family:var(--font-mono); font-size:10px; font-weight:650;
  letter-spacing:.13em; line-height:1.3; text-transform:uppercase; color:var(--text-subtle, var(--muted));
}

/* Tab dipertegas: teks naik ke ukuran/berat bodi, inactive dipindah dari --muted ke
   --text-muted biar kebaca, indikator aktif jadi rail 3px penuh di atas hairline. */
.bk-workspace > .bk-tabs { gap:26px; margin:0 0 18px; padding-top:0; border-bottom-color:var(--line-200, var(--line)); }
.bk-workspace > .bk-tabs .bk-tab {
  padding:12px 0 12px; font-size:14px; font-weight:680; letter-spacing:-.01em;
  color:var(--text-muted, var(--muted)); border-bottom-width:3px; margin-bottom:-1px;
}
.bk-workspace > .bk-tabs .bk-tab:hover { color:var(--text-strong, var(--ink)); border-bottom-color:var(--line-200, var(--line)); }
.bk-workspace > .bk-tabs .bk-tab.is-on { color:var(--text-strong, var(--ink)); font-weight:740; border-bottom-color:var(--ink); }
/* Datebar dikembalikan ke lebar kontainer (bukan full-bleed) dan memakai radius +
   hairline yang sama dengan .bk-stat / .bk-panel di bawahnya, supaya tepi kiri-kanan
   dan sudutnya sejajar dengan kartu — satu kolom, bukan bar yang menggantung. */
.bk-datebar {
  top:0; margin:0 0 16px; padding:9px 14px;
  border-width:1px; border-radius:var(--bk-radius);
  border-color:var(--line-200, var(--line));
  box-shadow:none; background:rgba(255,255,255,.96); backdrop-filter:blur(10px);
}
/* Anatomi referensi: dua panah jadi satu segmen, tanggal = teks tebal (bukan tombol
   berkotak), penanda "Hari ini" identity-yellow, meta kanan = ringkasan konten mono
   tanpa kotak chip. */
.bk-datebar-nav { gap:12px; }
.bk-navgroup { display:inline-flex; gap:6px; }
.bk-navbtn { min-height:36px; height:36px; width:36px; border-radius:var(--radius-sm,10px); }
.bk-datebtn { display:inline-flex; align-items:center; min-height:36px; padding:0 2px; color:var(--text-strong,var(--ink));
  background:none; border:0; cursor:pointer; font-family:inherit; font-size:15px; font-weight:700; letter-spacing:-.01em; }
.bk-datebtn:hover { text-decoration:underline; text-underline-offset:3px; }
.bk-today-tag { display:inline-flex; align-items:center; padding:4px 10px; color:var(--tag-identity-text);
  background:var(--identity-yellow,#FFF700); border:1px solid var(--identity-yellow,#FFF700);
  border-radius:var(--radius-pill,100px); font-size:11.5px; font-weight:700; }
.bk-datebar-meta { color:var(--text-subtle,var(--ink-400)); font-family:var(--font-mono); font-size:10.5px; letter-spacing:.04em; }

/* StatCard tanpa ikon-box: kicker → angka → subline, tone dibawa fill+border kartu. */
.bk-stats { gap:10px; margin-bottom:18px; }
.bk-stat {
  grid-template-columns:minmax(0,1fr); gap:0; min-height:112px; padding:16px 18px;
  border-color:var(--line-200, var(--line)); border-radius:var(--bk-radius); box-shadow:none;
}
.bk-stat:hover { transform:translateY(-2px); border-color:var(--ink-400, var(--muted)); box-shadow:0 10px 26px rgba(17,18,20,.06); }
.bk-stat-copy { display:flex; flex-direction:column; align-items:flex-start; gap:0; }
.bk-stat-lbl { font-family:var(--font-mono); font-size:10px; font-weight:650; letter-spacing:.08em; text-transform:uppercase; }
.bk-stat-num { order:2; margin:10px 0 6px; font-size:32px; font-weight:650; letter-spacing:-.045em; }
.bk-stat-desc { order:3; font-size:11px; }
.bk-stat.tone-attn { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); }
.bk-stat.tone-attn .bk-stat-num { color:var(--tag-danger-text); }
.bk-stat.tone-live { background:var(--tag-info-bg); border-color:var(--tag-info-border); }
.bk-stat.tone-ok { background:var(--tag-success-bg); border-color:var(--tag-success-border); }
/* Kartu terpilih ditandai ring ink (bukan fill hitam) supaya tone tetap terbaca. */
.bk-stat.is-on { border-color:var(--ink, #050505); box-shadow:0 0 0 1px var(--ink, #050505) inset; }

.bk-panel { border-color:var(--line-200, var(--line)); border-radius:var(--bk-radius); box-shadow:none; }
.bk-panel--sessions { min-height:420px; }
/* Antrean intake: tinggi kontainer dikunci pada rentang tetap (min 2 baris kartu,
   maks 2 baris lalu scroll di dalam) supaya berpindah quick filter — 14 item ke 2
   item — tidak membuat panel melonjak/mengempis dan halaman ikut bergeser. */
.bk-panel--intake { min-height:560px; }
.bk-panel--intake .bk-qrow-list { min-height:566px; max-height:566px; overflow-y:auto; padding-right:4px; align-content:start; }
.bk-panel--intake .bk-qrow-list .bk-empty { align-self:start; }
@media (max-width:768px) {
  .bk-panel--intake { min-height:0; }
  .bk-panel--intake .bk-qrow-list { min-height:0; max-height:none; overflow:visible; padding-right:0; }
}
.bk-panel-head { padding-bottom:13px; border-bottom:1px solid var(--line-100, var(--line)); }
.bk-panel-icon { border-radius:9px; }
.bk-panel-head h2 { font-size:15px; letter-spacing:-.01em; }
.bk-localfilter { padding-bottom:2px; }
.bk-chip, .bk-qv { border-radius:7px; }
.bk-chip.is-on, .bk-qv.is-on { color:#fff; background:var(--ink, #050505); border-color:var(--ink, #050505); }
.bk-scard, .bk-qrow { border-radius:10px; box-shadow:none; }
.bk-scard:hover, .bk-qrow:hover { box-shadow:none; border-color:var(--ink-400, var(--muted)); }
.bk-intake-stat { border-radius:9px; }
.bk-intake-stat.is-on { border-color:var(--ink); box-shadow:0 0 0 1px var(--ink) inset; }

/* Fill kartu = tone tag statusnya (triad --pst-* yang sama dipakai badge .st-*),
   supaya status kebaca sekilas tanpa harus menyisir badge. Warna tetap didampingi
   label badge (§7.3: tak pernah warna-saja).
   Dipakai bersama oleh kartu booking (.bk-scard) dan kartu queue POS (.pqm) —
   satu peta warna, bukan dua. Konsumennya membaca --sc-fill/--sc-line/--sc-text. */
.bk-scard[data-st] { background:var(--sc-fill, var(--surface-0, var(--paper))); border-color:var(--sc-line, var(--line)); }
.bk-scard[data-st]:hover { border-color:var(--sc-text, var(--ink-400, var(--muted))); }
.bk-scard[data-st="new"],
.pqm[data-st="new"] { --sc-fill:var(--pst-success-bg); --sc-line:var(--pst-success-border); --sc-text:var(--pst-success-text); }
.bk-scard[data-st="reviewing"],
.pqm[data-st="reviewing"] { --sc-fill:var(--pst-purple-bg);  --sc-line:var(--pst-purple-border);  --sc-text:var(--pst-purple-text); }
.bk-scard[data-st="contacted"],
.pqm[data-st="contacted"] { --sc-fill:var(--pst-info-bg);    --sc-line:var(--pst-info-border);    --sc-text:var(--pst-info-text); }
.bk-scard[data-st="tentative"],
.pqm[data-st="tentative"],
.bk-scard[data-st="pending_payment"],
.pqm[data-st="pending_payment"] { --sc-fill:var(--pst-warning-bg); --sc-line:var(--pst-warning-border); --sc-text:var(--pst-warning-text); }
.bk-scard[data-st="partially_paid"],
.pqm[data-st="partially_paid"],
.bk-scard[data-st="rescheduled"],
.pqm[data-st="rescheduled"] { --sc-fill:var(--pst-orange-bg);  --sc-line:var(--pst-orange-border);  --sc-text:var(--pst-orange-text); }
.bk-scard[data-st="paid"],
.pqm[data-st="paid"] { --sc-fill:var(--pst-mint-bg);    --sc-line:var(--pst-mint-border);    --sc-text:var(--pst-mint-text); }
.bk-scard[data-st="confirmed"],
.pqm[data-st="confirmed"] { --sc-fill:var(--pst-blue-bg);    --sc-line:var(--pst-blue-border);    --sc-text:var(--pst-blue-text); }
.bk-scard[data-st="cancelled"],
.pqm[data-st="cancelled"] { --sc-fill:var(--pst-danger-bg);  --sc-line:var(--pst-danger-border);  --sc-text:var(--pst-danger-text); }
.bk-scard[data-st="payment_expired"],
.pqm[data-st="payment_expired"],
.bk-scard[data-st="completed"],
.pqm[data-st="completed"] { --sc-fill:var(--pst-neutral-bg); --sc-line:var(--pst-neutral-border); --sc-text:var(--pst-neutral-text); }
/* Elemen dalam kartu ikut tone: avatar & divider pakai garis tone, badge/chip
   dinaikkan ke surface polos supaya tetap kontras di atas fill berwarna. */
.bk-scard[data-st] .bk-scard-av { background:var(--surface-0, var(--paper)); border-color:var(--sc-line, var(--line)); color:var(--sc-text, var(--text-muted, var(--muted))); }
.bk-scard[data-st] .bk-scard-div { background:var(--sc-line, var(--line)); }
.bk-scard[data-st] .badge-st { background:var(--surface-0, var(--paper)); }
/* Rail attention (danger/warning) tetap menang di border supaya sinyalnya tak hilang. */
.bk-scard[data-st].bk-rail--danger  { border-color:var(--tag-danger-border); }
.bk-scard[data-st].bk-rail--warning { border-color:var(--tag-warning-border); }
.bk-scard[data-st].bk-rail--danger:hover  { border-color:var(--tag-danger-text); }
.bk-scard[data-st].bk-rail--warning:hover { border-color:var(--tag-warning-text); }

.bk-toolbox {
  padding:18px; margin-bottom:14px; background:var(--surface-0, var(--paper));
  border:1px solid var(--line-200, var(--line)); border-radius:var(--bk-radius);
}
.bk-toolbox-head { display:flex; align-items:flex-end; justify-content:space-between; gap:20px; margin-bottom:13px; }
.bk-toolbox-head .bk-toolbox-kicker { margin-bottom:5px; }
.bk-toolbox-head h3 { margin:0; font-size:15px; font-weight:720; letter-spacing:-.01em; }
.bk-toolbox-hint { color:var(--text-subtle, var(--muted)); font-family:var(--font-mono); font-size:10px; }
.bk-toolbox .bk-quickviews { gap:6px; padding-bottom:14px; margin-bottom:14px; border-bottom:1px solid var(--line-100, var(--line)); }
.bk-toolbox .bk-qv { padding:7px 11px; font-size:12px; }
/* Quick view membawa warna status filternya (triad --tag-* dari DS): urgensi kebaca
   sebelum teks dibaca. Chip aktif tetap ink solid supaya "yang sedang dipakai" satu
   bahasa dengan chip lain di modul ini. */
.bk-toolbox .bk-qv[data-qv="action"]           { color:var(--tag-danger-text);  background:var(--tag-danger-bg);  border-color:var(--tag-danger-border); }
.bk-toolbox .bk-qv[data-qv="issue"]            { color:var(--tag-pink-text);    background:var(--tag-pink-bg);    border-color:var(--tag-pink-border); }
.bk-toolbox .bk-qv[data-qv="payment_due"]      { color:var(--tag-warning-text); background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.bk-toolbox .bk-qv[data-qv="needs_scheduling"] { color:var(--tag-orange-text);  background:var(--tag-orange-bg);  border-color:var(--tag-orange-border); }
.bk-toolbox .bk-qv[data-qv="intake_today"]     { color:var(--tag-blue-text);    background:var(--tag-blue-bg);    border-color:var(--tag-blue-border); }
.bk-toolbox .bk-qv[data-qv="session_today"]    { color:var(--tag-info-text);    background:var(--tag-info-bg);    border-color:var(--tag-info-border); }
.bk-toolbox .bk-qv[data-qv="upcoming7"]        { color:var(--tag-purple-text);  background:var(--tag-purple-bg);  border-color:var(--tag-purple-border); }
.bk-toolbox .bk-qv[data-qv="completed"]        { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.bk-toolbox .bk-qv[data-qv="archived"]         { color:var(--tag-neutral-text); background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); }
.bk-toolbox .bk-qv[data-qv]:hover              { border-color:currentColor; }
.bk-toolbox .bk-qv.is-on { color:#fff; background:var(--ink, #050505); border-color:var(--ink, #050505); }
.bk-filter-grid { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:0; }
.bk-filter-grid > * { flex:0 1 auto; }
.bk-filter-grid .bk-search-wide { flex:1 1 300px; min-width:240px; }
.bk-filter-grid select { flex:1 1 145px; min-width:130px; }
.bk-filter-grid .filter-date { flex:0 1 155px; }
.bk-filter-grid .search-box, .bk-filter-grid select, .bk-filter-grid .filter-date,
.bk-filter-grid .abtn, .bk-filter-grid .seg, .bk-filter-grid .db-size select { min-height:38px; border-color:var(--border-input, var(--line)); border-radius:8px; }
.bk-filter-grid .seg { padding:3px; }
.bk-toolbox .bk-activechips { margin:12px 0 0; padding-top:12px; border-top:1px dashed var(--line-200, var(--line)); }
.bk-status-pop { top:calc(100% + 8px); border-radius:10px; border-color:var(--line-200, var(--line)); box-shadow:0 18px 48px rgba(17,18,20,.14); }
.bk-database-panel { border-color:var(--line-200, var(--line)); border-radius:var(--bk-radius); box-shadow:none; }
.bk-database-panel .panel-head { min-height:65px; padding:14px 18px; }
.bk-database-panel .panel-head .bk-toolbox-kicker { margin-bottom:3px; }
.bk-database-panel .panel-head h2 { font-size:15px; }
.bk-database-panel .tbl th { background:var(--surface-50, var(--paper-warm)); }
.bk-database-panel .tbl td { padding-top:14px; padding-bottom:14px; }
.bk-database-panel .tbl tr.clickable:hover td { background:var(--surface-50, var(--paper-warm)); }
.booking-card, .booking-col { border-color:var(--line-200, var(--line)); box-shadow:none; }
/* Kolom board diwarnai statusnya: judul kolom pakai badge-st (triad --tag-* per status)
   dan kepala kolom mengambil hairline yang sama, jadi kanban terbaca per warna. */
.booking-col .board-head { gap:8px; background:var(--surface-0,var(--paper)); }
.booking-col .board-head .badge-st { font-size:11.5px; }
.booking-card:hover { transform:translateY(-2px); box-shadow:0 10px 26px rgba(17,18,20,.06); }
/* Grid kartu Database Booking memakai unit .sl-board-card (lihat bookingCard() di
   admin.js) — samakan perilaku kontainernya dengan .sl-gallery: tinggi kartu
   diratakan per baris. Kelas .booking-card lama tinggal dipakai board/kanban. */
.booking-card-grid > .sl-board-card { height:100%; }

/* ---- Tabel Database Booking: kolom bernapas, sel tidak saling tabrak ----
   Sebelumnya kode submission & label jadwal pecah 2 baris sementara sel Payment
   dan Status menumpuk chip tanpa jarak, jadi tinggi baris tak beraturan. */
.bk-database-panel .tbl td { padding:14px; vertical-align:middle; }
.bk-database-panel .tbl th { padding:12px 14px; white-space:nowrap; }
.bk-database-panel .tbl .sid { display:inline-flex; align-items:center; white-space:nowrap; letter-spacing:-.01em; }
.bk-database-panel .tbl td[data-l="Submission"] { width:1%; white-space:nowrap; }
.bk-database-panel .tbl td[data-l="Klien"] { min-width:170px; }
.bk-database-panel .tbl td[data-l="Layanan"] { min-width:190px; }
.bk-database-panel .tbl td[data-l="Jadwal"] { width:1%; white-space:nowrap; font-variant-numeric:tabular-nums; }
.bk-database-panel .tbl td[data-l="Payment"] { width:1%; }
.bk-database-panel .tbl td[data-l="Payment"] .sub { display:block; margin-top:4px; white-space:nowrap; }
/* Sel status = baris chip: jarak tetap 6px & boleh turun baris tanpa menempel. */
.bk-database-panel .tbl td[data-l="Status"] { min-width:190px; }
.bk-database-panel .tbl td[data-l="Status"] > * { vertical-align:middle; }
.bk-database-panel .tbl td[data-l="Status"] { line-height:2.1; }
.bk-database-panel .tbl td[data-l="Status"] .badge-st,
.bk-database-panel .tbl td[data-l="Status"] .bk-attn,
.bk-database-panel .tbl td[data-l="Status"] .pay-chip { margin-right:6px; }
.bk-database-panel .tbl .nm { line-height:1.35; }
.bk-database-panel .tbl .sub { margin-top:3px; line-height:1.35; }
/* Rail perhatian diberi jarak dari kolom centang supaya tidak menempel isi sel. */
.bk-database-panel tr.bk-tr-attn td:first-child { padding-left:18px; }

/* Detail booking dan seluruh popup turunannya berbagi satu bahasa layer. */
.bk-detail-back, .modal-back.center.booking-layer, .uic-back.booking-layer { background:rgba(17,18,20,.48); backdrop-filter:blur(6px); }
.bk-detail { width:1040px; border-color:var(--line-200, var(--line)); border-radius:16px; box-shadow:0 28px 80px rgba(17,18,20,.24); }
.bk-detail-head { padding:18px 20px; background:var(--surface-0, var(--paper)); }
.bk-detail-body { padding:18px 20px 22px; background:var(--surface-50, #f7f8fa); }
.bk-detail-schedule { border-radius:10px; }
.bk-sec, .bk-side-card { border-color:var(--line-200, var(--line)); border-radius:10px; }
.bk-sec-h { padding:11px 13px; background:var(--surface-0, var(--paper)); }
.bk-sec-ic { background:var(--surface-50, var(--paper-warm)); }
.bk-side-card--payment { color:#fff; background:var(--ink, #050505); border-color:var(--ink, #050505); padding:16px; }
.bk-side-card--payment .bk-side-h { color:#b9bdc6; }
.bk-side-card--payment .bk-side-pay { color:#fff; }
.bk-side-card--payment .bk-side-pay--due { margin-top:8px; padding-top:11px; border-top:1px solid #35373d; color:var(--identity-yellow, #FFF700); }
.bk-side-card--status { background:var(--surface-0, var(--paper)); }
.bk-detail-foot { padding:13px 20px; background:var(--surface-0, var(--paper)); }
.bk-more-menu { border-radius:10px; border-color:var(--line-200, var(--line)); box-shadow:0 18px 48px rgba(17,18,20,.16); }

.modal-center.booking-layer {
  max-width:600px; overflow:hidden; background:var(--surface-0, var(--paper));
  border:1px solid var(--line-200, var(--line)); border-radius:16px; box-shadow:0 28px 80px rgba(17,18,20,.24);
}
.modal-center.booking-layer.wide { max-width:720px; }
.modal-center.booking-layer .mc-head { min-height:64px; padding:15px 18px; background:var(--surface-0, var(--paper)); }
.modal-center.booking-layer .mc-head h3 { font-family:var(--font-display, var(--font-sans)); font-size:17px; letter-spacing:-.015em; }
.modal-center.booking-layer .mc-head .x { display:inline-flex; align-items:center; justify-content:center; width:34px; height:34px; padding:0; border:1px solid var(--line-200, var(--line)); border-radius:8px; }
.modal-center.booking-layer .mc-body { padding:20px; background:var(--surface-50, #f7f8fa); }
.modal-center.booking-layer .mc-foot { min-height:64px; padding:13px 18px; background:var(--surface-0, var(--paper)); }
.modal-center.booking-layer .frow { margin-bottom:14px; }
.modal-center.booking-layer .frow label { margin-bottom:7px; font-size:11.5px; font-weight:650; color:var(--text-muted, var(--muted)); }
.modal-center.booking-layer .ctrl { min-height:42px; border-color:var(--border-input, var(--line)); border-radius:8px; background:var(--surface-0, var(--paper)); }
.modal-center.booking-layer .fhint { border-radius:8px; }
.uic-card.booking-layer { max-width:440px; padding:22px; border:1px solid var(--line-200, var(--line)); border-radius:14px; box-shadow:0 28px 80px rgba(17,18,20,.24); }
.uic-card.booking-layer .uic-title { font-family:var(--font-display, var(--font-sans)); font-size:18px; letter-spacing:-.02em; }

@media (max-width:900px) {
  .bk-filter-grid .bk-search-wide { flex-basis:100%; }
}
@media (max-width:768px) {
  .bk-workspace > .bk-tabs { overflow-x:auto; flex-wrap:nowrap; }
  .bk-stats { gap:8px; }
  .bk-stat { min-height:112px; padding:13px; }
  .bk-stat-num { margin-top:12px; font-size:29px; }
  .bk-toolbox { padding:14px; }
  .bk-toolbox-head { align-items:flex-start; }
  .bk-toolbox-hint { display:none; }
  .bk-toolbox .bk-quickviews { flex-wrap:nowrap; overflow-x:auto; margin-left:-14px; margin-right:-14px; padding-left:14px; padding-right:14px; scrollbar-width:none; }
  .bk-toolbox .bk-qv { flex:none; }
  .bk-filter-grid > *, .bk-filter-grid select, .bk-filter-grid .filter-date { flex:1 1 calc(50% - 4px); min-width:0; }
  .bk-filter-grid .bk-search-wide { flex-basis:100%; min-width:100%; }
  .bk-detail-body { background:var(--surface-50, #f7f8fa); }
  .modal-center.booking-layer { max-width:100%; border-radius:16px 16px 0 0; }
}
@media (max-width:480px) {
  .bk-stat { grid-template-columns:minmax(0,1fr) 34px; min-height:106px; }
  .bk-stat-icon { width:34px; height:34px; }
  .bk-stat-desc { max-width:16ch; }
  .bk-filter-grid > *, .bk-filter-grid select, .bk-filter-grid .filter-date { flex-basis:100%; }
  .bk-filter-grid .seg { width:100%; }
  .bk-filter-grid .seg-btn { flex:1; justify-content:center; }
  .bk-database-panel { border-radius:10px; }
  .modal-center.booking-layer .mc-body { padding:16px; }
  .modal-center.booking-layer .mc-foot { flex-wrap:wrap; }
  .modal-center.booking-layer .mc-foot .abtn { flex:1; justify-content:center; }
  .uic-card.booking-layer { border-radius:14px 14px 0 0; }
}

/* ══ PRD 12.55 — Booking Order (Order Group v2) ══
   Chip Order pada list/drawer Bookings + tone blok HOLD di kalender resource.
   Additive; tanpa flag ON tak ada elemen yang memakai kelas ini. */
/* Chip Order = Fresh Tag varian ink (fill gelap) — token, bukan #fff/--r-chip legacy. */
.ord-chip{display:inline-flex;align-items:center;gap:4px;color:var(--primary-contrast,var(--paper));background:var(--primary,var(--ink));border-color:var(--primary,var(--ink));border-radius:var(--radius-pill,100px)}
.cal-res-ev.ev-hold{background:repeating-linear-gradient(45deg,rgba(0,0,0,.05),rgba(0,0,0,.05) 6px,rgba(0,0,0,.12) 6px,rgba(0,0,0,.12) 12px);border-left-style:dashed;opacity:.85}
.cal-res-ev.ev-hold .rev-n{font-style:italic}

/* ============================================================
   SCHEDULE — VIRCANSA_OS component-library alignment (2026-07)
   Calendar, list, global blocks, popovers, dialogs, export layer.
   ============================================================ */
.sched-workspace { width:100%; max-width:1480px; margin:0 auto; }
.sched-page-signal { flex:none; display:flex; align-items:center; gap:10px; min-width:218px; padding:11px 13px; color:#fff; background:var(--ink); border:1px solid var(--ink); border-radius:12px; box-shadow:var(--shadow-card); }
.sched-page-signal > svg { flex:none; color:var(--identity-yellow); }
.sched-page-signal span { display:flex; flex-direction:column; gap:1px; }
.sched-page-signal small { color:rgba(255,255,255,.58); font-family:var(--font-mono); font-size:9px; letter-spacing:.09em; text-transform:uppercase; }
.sched-page-signal b { color:#fff; font-size:12px; font-weight:650; }

.sched-subnav { margin:0 0 18px; padding:4px; border:1px solid var(--line-200, var(--line)); border-radius:11px; background:var(--surface-0, var(--paper)); box-shadow:var(--shadow-card); }
.sched-subnav a { min-height:38px; border-radius:8px; transition:background .16s ease,color .16s ease,box-shadow .16s ease,transform .12s ease; }
.sched-subnav a:hover { background:var(--surface-50, var(--paper-warm)); }
.sched-subnav a:active { transform:translateY(1px); }
.sched-subnav a.active { color:#fff; background:var(--ink); box-shadow:var(--shadow-1); }
.sched-subnav a.active svg { color:var(--identity-yellow); }
.sched-subnav a:focus-visible { outline:2px solid var(--electric-blue); outline-offset:2px; }
.sched-view { min-width:0; }

/* Brand context + calendar control deck */
.sched-view--calendar .cal-context-card { margin-bottom:16px; padding:18px 20px; border-radius:14px; box-shadow:var(--shadow-card); }
.sched-view--calendar .cal-context-copy h2 { margin-top:5px; font-family:var(--font-display, var(--font-sans)); font-size:21px; letter-spacing:-.025em; }
.sched-view--calendar .cal-context-copy p { margin-top:4px; max-width:58ch; }
.sched-control-deck { margin-bottom:14px; padding:15px 16px 14px; background:var(--surface-0, var(--paper)); border:1px solid var(--line-200, var(--line)); border-radius:14px; box-shadow:var(--shadow-card); }
.sched-control-label { display:flex; align-items:end; justify-content:space-between; gap:18px; margin-bottom:13px; padding-bottom:11px; border-bottom:1px solid var(--line-100, var(--line-soft)); }
.sched-control-label p { margin:0; color:var(--text-subtle, var(--muted)); font-size:11.5px; }
.sched-control-deck .cal-toolbar { margin-bottom:12px; }
.sched-control-deck .cal-filterbar--row { margin:0; padding-top:12px; border-top:1px solid var(--line-100, var(--line-soft)); }
.sched-control-deck .cal-navico,.sched-control-deck .cal-datepill,.sched-control-deck .cal-filterbar select,.sched-control-deck .cal-filter-reset { min-height:36px; border-color:var(--border-input, var(--line)); border-radius:8px; }
.sched-control-deck .cal-datepill { height:36px; padding-inline:13px; }
.sched-control-deck .cal-navico { width:36px; height:36px; }
.sched-control-deck .seg { padding:3px; background:var(--surface-50, var(--paper-warm)); border:1px solid var(--line-100, var(--line-soft)); border-radius:10px; }
.sched-control-deck .seg-btn { min-height:32px; border-radius:7px; }
.sched-control-deck .seg-btn.active { color:#fff; background:var(--ink); }
.sched-control-deck .seg-btn.active svg { color:var(--identity-yellow); }
.sched-control-deck :is(button,select):focus-visible { outline:2px solid var(--electric-blue); outline-offset:2px; }

.cal-main-panel { overflow:hidden; border-color:var(--line-200, var(--line)); border-radius:14px; box-shadow:var(--shadow-card); }
.cal-main-head { min-height:68px; padding:13px 16px; background:var(--surface-0, var(--paper)); }
.cal-main-head h3 { margin:4px 0 0; color:var(--text-strong, var(--ink)); font-family:var(--font-display, var(--font-sans)); font-size:18px; letter-spacing:-.02em; }
.sched-live-chip { display:inline-flex; align-items:center; gap:6px; padding:5px 8px; color:var(--pst-success-text); background:var(--pst-success-bg); border:1px solid var(--pst-success-border); border-radius:7px; font-family:var(--font-mono); font-size:9.5px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; }
.sched-live-chip svg { color:var(--pst-success-text); }
.cal-main-panel .cal-month,.cal-main-panel .cal-week,.cal-main-panel .cal-res-wrap { border:0; border-radius:0; }
.cal-main-panel .cal-wdrow { background:var(--surface-50, var(--paper-warm)); }
.cal-main-panel .cal-wd { padding-block:10px; font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-align:center; }
.cal-main-panel .cal-cell { transition:background .16s ease,box-shadow .16s ease; }
.cal-main-panel .cal-cell:hover { background:var(--surface-50, var(--paper-warm)); box-shadow:inset 0 0 0 1px var(--line-200, var(--line)); }
.cal-main-panel :is(.cal-ev,.cal-scard,.cal-day-row,.cal-res-ev) { transition:transform .16s ease,box-shadow .16s ease,filter .16s ease; }
.cal-main-panel :is(.cal-ev,.cal-scard,.cal-day-row,.cal-res-ev):hover { transform:translateY(-1px); filter:saturate(.96); }
.cal-main-panel :is(.cal-ev,.cal-scard,.cal-day-row,.cal-res-ev):focus-visible { outline:2px solid var(--electric-blue); outline-offset:2px; }
.cal-legend.cal-legend-card { margin-top:12px; padding:11px 14px; border-color:var(--line-200, var(--line)); border-radius:10px; background:var(--surface-0, var(--paper)); box-shadow:none; }
.minical-pop { width:280px; padding:14px; border-color:var(--line-200, var(--line)); border-radius:14px; box-shadow:0 24px 70px rgba(17,18,20,.2); }
.mc-day.sel { color:var(--ink); background:var(--identity-yellow); box-shadow:inset 0 0 0 1px var(--identity-yellow-shadow); }
.mc-day:focus-visible,.mc-mon:focus-visible,.mc-today:focus-visible { outline:2px solid var(--electric-blue); outline-offset:1px; }

/* Attention and data-oriented schedule views */
.sched-view--calendar .cal-attn-shell { margin-bottom:16px; border-left-width:3px; border-radius:14px; box-shadow:var(--shadow-card); }
.sched-view--calendar .cal-attn-item { border-radius:9px; box-shadow:none; }
.sched-notice { margin-bottom:14px; padding:12px 14px; border:1px solid var(--line-200, var(--line)); border-left:3px solid var(--identity-yellow-shadow); border-radius:10px; background:var(--identity-yellow-soft); color:var(--text-muted, var(--ink-soft)); }
/* FE-10 — kicker kini boleh berupa <h3> (heading nyata untuk daftar landmark
   pembaca layar), jadi margin bawaan heading harus dinolkan di sini; kalau tidak,
   setiap seksi composer mendapat jarak atas/bawah yang tidak diminta desain. */
.sched-kicker { display:block; margin:0; color:var(--text-subtle, var(--ink-400)); font-family:var(--font-mono); font-size:10px; font-weight:700; letter-spacing:.14em; line-height:1.3; text-transform:uppercase; }
.sched-list-deck,.sched-block-tools { margin-bottom:14px; padding:15px; background:var(--surface-0, var(--paper)); border:1px solid var(--line-200, var(--line)); border-radius:14px; box-shadow:var(--shadow-card); }
.sched-list-deck-head,.sched-block-tools { display:flex; align-items:flex-end; justify-content:space-between; gap:18px; }
.sched-list-deck-head h3,.sched-block-tools h3 { margin:4px 0 0; color:var(--text-strong, var(--ink)); font-size:15px; letter-spacing:-.01em; }
.sched-list-deck-head > span { color:var(--text-subtle, var(--muted)); font-family:var(--font-mono); font-size:10px; }
.sched-status-strip { flex-wrap:nowrap; overflow-x:auto; margin:13px -2px 0; padding:0 2px 11px; border-bottom:1px solid var(--line-100, var(--line-soft)); scrollbar-width:none; }
.sched-status-strip::-webkit-scrollbar { display:none; }
.sched-status-strip .status-chip { flex:none; min-height:36px; border-radius:8px; }
.sched-status-strip .status-chip.active { border-color:var(--ink); background:var(--ink); color:#fff; }
.sched-status-strip .status-chip.active b { color:var(--identity-yellow); }
.sched-list-filters { margin:12px 0 0; }
.sched-list-filters .search-box { flex:1 1 300px; min-width:240px; }
.sched-list-filters select,.sched-list-filters .filter-date { min-height:38px; border-color:var(--border-input, var(--line)); border-radius:8px; }
.sched-block-tools { align-items:center; }
.sched-block-tools > .filters { margin:0; }
.sched-data-panel { overflow:hidden; border-color:var(--line-200, var(--line)); border-radius:14px; box-shadow:var(--shadow-card); }
.sched-data-panel .panel-head { min-height:66px; padding:13px 16px; }
.sched-data-panel .panel-head h2 { margin:4px 0 0; font-family:var(--font-display, var(--font-sans)); font-size:17px; letter-spacing:-.015em; }
.sched-data-panel .tbl thead th { background:var(--surface-50, var(--paper-warm)); font-family:var(--font-mono); font-size:9.5px; letter-spacing:.07em; text-transform:uppercase; }
.sched-data-panel .tbl tbody tr { transition:background .15s ease; }
.sched-data-panel .tbl tbody tr:hover { background:var(--surface-50, var(--paper-warm)); }
.sched-av { border-radius:8px; background:var(--identity-yellow-soft); border-color:var(--identity-yellow-shadow); }

/* Schedule-owned layers: block form, day list, confirm, export. */
.modal-back.center.schedule-layer,.uic-back.schedule-layer,.sx-overlay.schedule-layer { background:rgba(5,5,5,.42); backdrop-filter:blur(3px); }
.modal-center.schedule-layer { width:min(94vw,580px); max-height:min(88dvh,820px); overflow:hidden; border:1px solid rgba(255,255,255,.22); border-radius:20px; box-shadow:0 30px 90px rgba(5,5,5,.3); }
.modal-center.schedule-layer.wide { width:min(94vw,920px); max-width:920px; }
.modal-center.schedule-layer .mc-head,.modal-center.schedule-layer .modal-head { min-height:66px; padding:15px 18px; background:var(--surface-0, var(--paper)); border-bottom:1px solid var(--line-100, var(--line-soft)); }
.modal-center.schedule-layer :is(.mc-head,.modal-head) h3,.modal-center.schedule-layer .modal-head h2 { margin:0; font-family:var(--font-display, var(--font-sans)); font-size:19px; letter-spacing:-.02em; }
.modal-center.schedule-layer .mc-body,.modal-center.schedule-layer .modal-body { overflow:auto; padding:20px; background:var(--surface-50, #f7f8fa); }
.modal-center.schedule-layer .mc-foot { min-height:66px; padding:13px 18px; background:var(--surface-0, var(--paper)); border-top:1px solid var(--line-100, var(--line-soft)); }
.modal-center.schedule-layer .x,.modal-center.schedule-layer .icon-btn { display:inline-flex; align-items:center; justify-content:center; width:34px; height:34px; padding:0; border:1px solid var(--line-200, var(--line)); border-radius:8px; background:var(--surface-0, var(--paper)); }
.modal-center.schedule-layer .ctrl { min-height:42px; border-color:var(--border-input, var(--line)); border-radius:8px; background:var(--surface-0, var(--paper)); }
.modal-center.schedule-layer .frow > label { margin-bottom:7px; color:var(--text-muted, var(--muted)); font-size:11.5px; font-weight:650; }
.modal-center.schedule-layer .wd-chip { border-radius:8px; }
.modal-center.schedule-layer .wd-chip.on { color:#fff; background:var(--ink); border-color:var(--ink); }
.sched-modal-intro { display:flex; align-items:flex-start; gap:10px; margin-bottom:17px; padding:12px; color:var(--text-muted, var(--muted)); background:var(--identity-yellow-soft); border:1px solid var(--identity-yellow-shadow); border-radius:9px; }
.sched-modal-intro > svg { flex:none; color:var(--ink); }
.sched-modal-intro span { display:block; color:var(--ink); font-family:var(--font-mono); font-size:9.5px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; }
.sched-modal-intro p { margin:3px 0 0; font-size:11.5px; line-height:1.45; }
.uic-card.schedule-layer { max-width:460px; padding:22px; border:1px solid var(--line-200, var(--line)); border-radius:16px; box-shadow:0 28px 80px rgba(5,5,5,.28); }
.uic-card.schedule-layer .uic-title { font-family:var(--font-display, var(--font-sans)); font-size:19px; letter-spacing:-.02em; }
.cal-day-modal { grid-template-columns:repeat(auto-fit,minmax(250px,1fr)); }

.sx-overlay.schedule-layer { z-index:220; }
.sx-overlay.schedule-layer .sx-toolbar { min-height:64px; padding:10px 16px; border-bottom-color:var(--line-200, var(--line)); box-shadow:0 8px 30px rgba(5,5,5,.08); }
.sx-overlay.schedule-layer .sx-scroll { padding:24px; }
.sx-overlay.schedule-layer .sx-sheet { max-width:840px; border:1px solid var(--line-200, var(--line)); border-radius:16px; box-shadow:0 28px 80px rgba(5,5,5,.28); }
.sx-overlay.schedule-layer .sx-head { border-radius:12px 12px 0 0; }

@media (max-width:900px) {
  .sched-page-signal { min-width:190px; }
  .sched-block-tools { align-items:flex-start; flex-direction:column; }
  .sched-block-tools > .filters { width:100%; }
}
@media (max-width:760px) {
  .sched-page-signal { width:100%; min-width:0; }
  .sched-subnav { display:flex; overflow-x:auto; scrollbar-width:none; }
  .sched-subnav::-webkit-scrollbar { display:none; }
  .sched-subnav a { flex:none; }
  .sched-view--calendar .cal-context-card { padding:15px; }
  .sched-control-deck { padding:14px; }
  .sched-control-label { align-items:flex-start; flex-direction:column; gap:3px; }
  .sched-control-deck .cal-filterbar { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); }
  .sched-control-deck .cal-filter-kicker { grid-column:1/-1; }
  .sched-control-deck .cal-color-control { grid-column:1/-1; }
  .sched-control-deck .cal-filter-reset { justify-content:center; }
  .sched-list-deck-head { align-items:flex-start; }
  .sched-list-filters .search-box { flex-basis:100%; min-width:100%; }
  .sched-data-panel .panel-body { overflow-x:auto; }
  .modal-center.schedule-layer { align-self:flex-end; width:100%; max-width:100%; max-height:92dvh; border-radius:18px 18px 0 0; }
  .modal-center.schedule-layer.wide { width:100%; max-width:100%; }
  .uic-card.schedule-layer { align-self:flex-end; width:100%; max-width:100%; margin:0; border-radius:16px 16px 0 0; }
  .sx-overlay.schedule-layer .sx-toolbar { align-items:stretch; }
  .sx-overlay.schedule-layer .sx-toolbar .grow { display:none; }
  .sx-overlay.schedule-layer .sx-scroll { padding:12px; }
}
@media (max-width:480px) {
  .sched-list-deck { padding:14px; }
  .sched-list-deck-head > span { display:none; }
  .sched-control-deck .cal-filterbar select { width:100%; }
  .cal-main-head { min-height:62px; }
  .sched-live-chip { display:none; }
  .modal-center.schedule-layer .mc-body,.modal-center.schedule-layer .modal-body { padding:16px; }
  .modal-center.schedule-layer .mc-foot { flex-wrap:wrap; }
  .modal-center.schedule-layer .mc-foot .abtn { flex:1; justify-content:center; }
  .cal-day-modal { grid-template-columns:1fr; }
  .sx-overlay.schedule-layer .sx-toolbar > .abtn { flex:1 1 calc(50% - 8px); justify-content:center; }
  .sx-overlay.schedule-layer .sx-tdate,.sx-overlay.schedule-layer .sx-toggle { flex:1 1 100%; }
}

/* Schedule v4 — direct component mapping to section 14 / App Shell. */

.sched-subnav { display:flex; gap:24px; margin:0 0 16px; padding:0; background:transparent; border:0; border-bottom:1px solid var(--line-200, var(--line)); border-radius:0; box-shadow:none; }
.sched-subnav a { position:relative; display:inline-flex; min-height:42px; padding:0 1px 11px; color:var(--text-subtle, var(--muted)); border:0; border-radius:0; background:transparent; font-size:13px; font-weight:600; }
.sched-subnav a:hover { color:var(--ink); background:transparent; }
.sched-subnav a.active { color:var(--ink); background:transparent; box-shadow:none; }
.sched-subnav a.active svg { color:var(--ink); }
.sched-subnav a.active::after { content:""; position:absolute; right:0; bottom:-1px; left:0; height:2px; background:var(--ink); border-radius:2px 2px 0 0; }
.sched-subnav a.active::before { display:none; }

.sched-calendar-card { overflow:hidden; padding:24px; background:var(--surface-0, var(--paper)); border:1px solid var(--line-200, var(--line)); border-radius:14px; box-shadow:var(--shadow-card); }
.sched-calendar-head { display:flex; align-items:flex-start; justify-content:space-between; gap:20px; padding-bottom:16px; }
.sched-calendar-head h3 { margin:4px 0 0; color:var(--text-strong, var(--ink)); font-family:var(--font-display, var(--font-sans)); font-size:19px; font-weight:700; letter-spacing:-.01em; }
.sched-calendar-toolbar { display:flex; align-items:center; gap:14px; padding:14px 0; border-top:1px solid var(--line-100, var(--line-soft)); border-bottom:1px solid var(--line-100, var(--line-soft)); }
.sched-calendar-toolbar .seg { flex:none; padding:3px; border:1px solid var(--line-100, var(--line-soft)); border-radius:10px; background:var(--surface-50, var(--paper-warm)); }
.sched-calendar-toolbar .seg-btn { min-height:32px; border-radius:7px; }
.sched-calendar-toolbar .seg-btn.active { color:#fff; background:var(--ink); }
.sched-calendar-toolbar .seg-btn.active svg { color:var(--identity-yellow); }
.sched-calendar-card .cal-filterbar { margin:0; padding:12px 0; border-bottom:1px solid var(--line-100, var(--line-soft)); }
.sched-calendar-card :is(.cal-navico,.cal-datepill,.cal-filterbar select,.cal-filter-reset) { min-height:34px; border-color:var(--border-input, var(--line)); border-radius:8px; background:var(--surface-0, var(--paper)); }
.sched-calendar-frame { overflow:auto; margin-top:16px; border:1px solid var(--line-200, var(--line)); border-radius:10px; background:var(--surface-0, var(--paper)); }
.sched-calendar-frame > :is(.cal-month,.cal-week,.cal-res-wrap) { border:0; border-radius:0; }
.sched-calendar-frame .cal-wdrow { background:var(--surface-50, var(--paper-warm)); }
.sched-calendar-frame .cal-wd { padding-block:10px; font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-align:center; }
.sched-calendar-frame :is(.cal-ev,.cal-scard,.cal-day-row,.cal-day-block,.cal-res-ev) { transition:transform .15s ease,box-shadow .15s ease; }
.sched-calendar-frame :is(.cal-ev,.cal-scard,.cal-day-row,.cal-day-block,.cal-res-ev):hover { transform:translateY(-1px); box-shadow:var(--shadow-pop); }
.sched-calendar-card > .cal-legend { margin:16px 0 0; padding-top:14px; border-top:1px solid var(--line-100, var(--line-soft)); }

.cal-day-timeline { display:grid; grid-template-columns:58px minmax(520px,1fr); min-height:var(--day-height); padding:18px 18px 24px 8px; }
.cal-day-gutter { position:relative; height:var(--day-height); }
.cal-day-gutter > span { position:absolute; right:10px; color:var(--ink-300); font-family:var(--font-mono); font-size:9.5px; transform:translateY(-50%); }
.cal-day-track { position:relative; height:var(--day-height); border-left:1px solid var(--line-100); background-image:repeating-linear-gradient(to bottom,var(--line-100) 0 1px,transparent 1px 64px); }
.cal-day-block { position:absolute; right:8px; left:7px; display:flex; flex-direction:column; align-items:flex-start; justify-content:center; gap:2px; overflow:hidden; padding:7px 10px; text-align:left; color:var(--sched-text); background:var(--sched-bg); border:1px solid var(--sched-border); border-radius:8px; cursor:pointer; font:inherit; }
.cal-day-block-top { display:flex; align-items:center; gap:9px; width:100%; color:var(--sched-text); font-size:9.5px; opacity:.78; }
.cal-day-block-top em { display:inline-flex; align-items:center; gap:5px; margin-left:auto; color:var(--ink-800); font-family:var(--font-mono); font-size:8.5px; font-style:normal; font-weight:700; letter-spacing:.06em; text-transform:uppercase; }
.cal-day-block-top i { width:6px; height:6px; background:var(--accent-mint, var(--mint-green)); border-radius:50%; animation:vs-pulse-g 2s infinite; }
.cal-day-block > b { max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:12.5px; }
.cal-day-block > small { max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:10.5px; opacity:.8; }
.cal-day-now { position:absolute; right:0; left:0; z-index:3; height:2px; background:var(--hot-red); pointer-events:none; }
.cal-day-now em { position:absolute; right:5px; top:-16px; padding:1px 5px; color:#fff; background:var(--hot-red); border-radius:4px; font-family:var(--font-mono); font-size:9px; font-style:normal; }

.sched-empty { display:flex; align-items:center; gap:14px; min-height:138px; padding:24px; }
.sched-empty-icon { display:inline-flex; align-items:center; justify-content:center; width:44px; height:44px; flex:none; color:var(--ink-600); background:var(--surface-50, var(--paper-warm)); border:1px solid var(--line-200, var(--line)); border-radius:10px; }
.sched-empty > div { flex:1; min-width:0; }
.sched-empty h3 { margin:0 0 3px; font-size:14px; }
.sched-empty p { margin:0; color:var(--text-subtle, var(--muted)); font-size:12px; }

.sched-view--calendar .cal-attn-shell { margin-bottom:16px; padding:0; overflow:hidden; border:1px solid var(--line-200, var(--line)); border-left:0; border-radius:14px; background:var(--surface-0, var(--paper)); box-shadow:var(--shadow-card); }
.cal-attn-shell .cal-attn-top { align-items:center; margin:0; padding:14px 16px; border-bottom:1px solid var(--line-100, var(--line-soft)); }
.cal-attn-list { display:flex; flex-direction:column; }
.sched-view--calendar .cal-attn-item { display:grid; grid-template-columns:32px minmax(0,1fr) auto; align-items:center; gap:12px; padding:12px 16px; background:var(--surface-0, var(--paper)); border:0; border-bottom:1px solid var(--line-100, var(--line-soft)); border-left:3px solid var(--attn-border); border-radius:0; }
.cal-attn-item:last-child { border-bottom:0; }
.cal-attn-mark { display:inline-flex; align-items:center; justify-content:center; width:30px; height:30px; color:var(--attn-text); background:var(--attn-bg); border:1px solid var(--attn-border); border-radius:8px; }
.cal-attn-copy { min-width:0; }
.cal-attn-copy .cal-attn-type { display:block; margin-bottom:2px; font-family:var(--font-mono); font-size:9px; }
.cal-attn-copy h3 { margin:0; overflow:hidden; color:var(--ink); font-size:12.5px; text-overflow:ellipsis; white-space:nowrap; }
.cal-attn-copy p { margin:3px 0 0; overflow:hidden; color:var(--ink-500); font-size:10.5px; text-overflow:ellipsis; white-space:nowrap; }
.cal-attn-actions { display:flex; align-items:center; justify-content:flex-end; gap:6px; }

.sched-notice { display:flex; align-items:flex-start; gap:9px; }
.sched-notice > svg { flex:none; margin-top:1px; }
.sched-danger-action { color:var(--pst-danger-text)!important; border-color:var(--pst-danger-border)!important; background:var(--pst-danger-bg)!important; }
.admin-top__tools .sched-action.abtn--dark { color:#fff; background:var(--ink); border-color:var(--ink); }
.admin-top__tools .sched-action.abtn--dark:hover { color:#fff; background:var(--ink-800, #242424); }
.sched-table-empty { display:flex; align-items:center; justify-content:center; gap:11px; min-height:132px; padding:24px; text-align:left; }
.sched-table-empty > span { display:inline-flex; align-items:center; justify-content:center; width:38px; height:38px; color:var(--ink-500); background:var(--surface-50, var(--paper-warm)); border:1px solid var(--line-200, var(--line)); border-radius:9px; }
.sched-table-empty b,.sched-table-empty small { display:block; }
.sched-table-empty b { color:var(--ink); font-size:13px; }
.sched-table-empty small { margin-top:3px; color:var(--ink-400); font-size:11px; }

.bk-detail-back.schedule-detail-layer { align-items:stretch; justify-content:flex-end; padding:0; background:rgba(5,5,5,.42); backdrop-filter:blur(3px); }
.schedule-detail-layer .bk-detail { width:min(620px,100vw); max-width:100vw; max-height:100dvh; height:100dvh; border-width:0 0 0 1px; border-radius:0; box-shadow:-24px 0 70px rgba(5,5,5,.2); animation:schedDrawerIn .18s ease-out; }
.schedule-detail-layer .bk-detail-head-main { grid-template-columns:1fr; gap:12px; }
.schedule-detail-layer .bk-detail-grid { grid-template-columns:1fr; }
.schedule-detail-layer .bk-detail-side { position:static; display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); }
.schedule-detail-layer .bk-side-attn { grid-column:1/-1; }
@keyframes schedDrawerIn { from { transform:translateX(28px); opacity:.65; } to { transform:none; opacity:1; } }

@media (max-width:900px) {
  .sched-calendar-head { flex-direction:column; }
  .sched-calendar-toolbar { align-items:flex-start; flex-direction:column; }
  .sched-calendar-toolbar .grow { display:none; }
  .sched-calendar-toolbar .seg { width:100%; overflow-x:auto; }
}
@media (max-width:760px) {
  .sched-subnav { gap:20px; margin-inline:-2px; }
  .sched-calendar-card { padding:16px; }
  .sched-calendar-head .cal-datenav { width:100%; }
  .sched-calendar-head .cal-datepill { flex:1; min-width:0; }
  .sched-calendar-card .cal-filterbar { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); }
  .sched-calendar-card .cal-filter-kicker,.sched-calendar-card .cal-color-control { grid-column:1/-1; }
  .sched-calendar-card .cal-filterbar .grow { display:none; }
  .sched-view--calendar .cal-attn-item { grid-template-columns:30px minmax(0,1fr); }
  .cal-attn-actions { grid-column:2; justify-content:flex-start; }
  .schedule-detail-layer .bk-detail { width:100vw; }
}
@media (max-width:480px) {
  .sched-subnav a { font-size:12px; }
  .sched-calendar-card .cal-filterbar { grid-template-columns:1fr; }
  .sched-calendar-card .cal-filter-kicker,.sched-calendar-card .cal-color-control { grid-column:1; }
  .sched-calendar-toolbar .seg-btn { flex:1 0 auto; }
  .sched-empty { align-items:flex-start; flex-wrap:wrap; }
  .sched-empty .abtn { width:100%; justify-content:center; }
  .schedule-detail-layer .bk-detail-side { grid-template-columns:1fr; }
}

/* ══ PRD 12.43.02 — Akun Klien v2: badge multi-sumbu, thumbnail tier, Customer Overview ══
   Additive; hanya dipakai tab Overview/Members/Temporary/Pending/Conflicts + drawer akun.
   Badge = ikon + teks + SHAPE (bukan warna saja, §14.1); kontras teks ≥ AA. */
.acct-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;line-height:1;
  padding:4px 8px;margin:2px 3px 2px 0;border:1.5px solid currentColor;white-space:nowrap}
.acct-badge svg{width:12px;height:12px;flex:none}
.acct-badge.sh-pill,.acct-badge.sh-pill-outline{border-radius:999px}
.acct-badge.sh-rect,.acct-badge.sh-rect-outline{border-radius:6px}
.acct-badge.sh-shield{border-radius:10px 10px 12px 12px}
.acct-badge.sh-bevel{border-radius:2px;clip-path:polygon(6px 0,100% 0,100% calc(100% - 6px),calc(100% - 6px) 100%,0 100%,0 6px)}
.acct-badge.sh-pill-outline,.acct-badge.sh-rect-outline{background:transparent}
.acct-badge.tn-red{color:#b42318;background:#fef3f2}
.acct-badge.tn-orange{color:#b93815;background:#fff4ed}
.acct-badge.tn-amber{color:#b54708;background:#fffaeb}
.acct-badge.tn-mint{color:#067647;background:#ecfdf3}
.acct-badge.tn-green{color:#085d3a;background:#dcfae6}
.acct-badge.tn-blue{color:#175cd3;background:#eff8ff}
.acct-badge.tn-neutral,.acct-badge.tn-slate{color:#475467;background:#f9fafb}
.acct-badge.tn-indigo{color:#3538cd;background:#eef4ff}
.acct-badge.tn-gold{color:#854d0e;background:#1d2939;color:#fbbf24}
.acct-badge.tn-gold svg{color:#fbbf24}
/* Thumbnail tier — default sistem deterministik per tier (§15.2) + initials fallback */
.acct-thumb{border-radius:8px;object-fit:cover;flex:none;display:inline-flex;align-items:center;justify-content:center}
.acct-thumb--ini{font-weight:700;font-size:12px;letter-spacing:.02em;color:#fff;background:#475467}
.acct-thumb--ini.tier-regular{background:linear-gradient(135deg,#64748b,#94a3b8)}
.acct-thumb--ini.tier-member_basic{background:linear-gradient(135deg,#444ce7,#12b76a)}
.acct-thumb--ini.tier-member_exclusive{background:linear-gradient(135deg,#1d2939,#4a1d96);color:#fbbf24}
/* Customer Overview (§18.1): grid widget + chart ringan tanpa library */
.cov-kpi{margin-bottom:14px}
.cov-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}
@media(max-width:1100px){.cov-grid{grid-template-columns:1fr}}
.cov-delta{font-weight:700;margin-left:4px}
.cov-delta.up{color:#067647}.cov-delta.down{color:#b42318}
.cov-trend{display:flex;align-items:flex-end;gap:2px;height:96px;padding:4px 0;overflow-x:auto}
.cov-col{display:flex;flex-direction:column-reverse;width:100%;min-width:5px;max-width:26px;flex:1;cursor:pointer}
.cov-col-t{background:#94a3b8}
.cov-col-m{background:var(--brand,#F5C518);border-bottom:1px solid rgba(0,0,0,.15)}
.cov-col:hover .cov-col-t{background:#64748b}
.cov-legend{display:flex;gap:14px;flex-wrap:wrap;margin-top:8px;font-size:11.5px;color:#475467}
.cov-legend span{display:inline-flex;align-items:center;gap:5px}
.cov-sw{width:10px;height:10px;display:inline-block;border-radius:2px}
.cov-sw-t{background:#94a3b8}.cov-sw-m{background:var(--brand,#F5C518)}
.cov-row{display:flex;align-items:center;gap:10px;padding:5px 0;cursor:pointer}
.cov-row-l{flex:0 0 150px;font-size:12.5px;color:#344054}
.cov-row-v{flex:0 0 auto;font-size:12px;font-weight:600;color:#101828}
.cov-bar{flex:1;height:14px;background:#f2f4f7;border-radius:4px;overflow:hidden;display:flex}
.cov-bar i{display:block;height:100%;border-radius:4px}
.cov-bar i.tier-regular{background:#94a3b8}
.cov-bar i.tier-member_basic{background:#444ce7}
.cov-bar i.tier-member_exclusive{background:#1d2939}
.cov-funnel{background:var(--ink,#050505)}
.cov-bar--stack{gap:1px}
.cov-age{height:100%}
.cov-age-0{background:#12b76a}.cov-age-1{background:#F5C518}.cov-age-2{background:#f79009}.cov-age-3{background:#b93815}.cov-age-4{background:#b42318}
.cov-age-empty{flex:1;background:#f2f4f7}
.acct-check{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:#344054}
.pos-pax-warn { margin-top:6px; padding:7px 8px; border:1px solid #e8cb78; border-radius:6px; background:#fff8e4; color:#6b4900; line-height:1.45; }
.pos-pax-bad { margin-top:6px; padding:7px 8px; border:1px solid #efaaa5; border-radius:6px; background:#fff1f0; color:#8a2119; }
.pos-pax-upgrade { margin-left:5px; border:0; border-radius:5px; padding:4px 7px; background:#07563b; color:#fff; font:inherit; font-weight:800; cursor:pointer; }

/* ============================================================
   POSQ1 / POSLINEPAX (additive) — rail queue ber-tab + kartu ala
   rich-card kalender week (sched56), kartu identitas+detail merged,
   pax per kantong item. Semua selector baru — nol override destruktif.
   ============================================================ */
/* Rail queue diciutkan, register diberi ruang paling besar, kolom Detail
   (Total/Ringkasan) disempitkan lagi (feedback owner 14 Jul: kanan terlalu lebar). */
.pos-shell.pos-shell--3col { grid-template-columns: minmax(228px,.8fr) minmax(0,2.35fr) minmax(0,1.06fr); }

/* Tab Booking / Trx / Invoice */


/* Kartu queue terstruktur (grid internal, aksen kiri status) */

.pqr-top { display:flex; align-items:baseline; justify-content:space-between; gap:8px; min-width:0; }
.pqr-top b { min-width:0; font-size:12.5px; font-weight:760; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pqr-top em { flex:none; font-style:normal; font-size:11px; color:var(--muted); }
.pqr-tags { display:flex; flex-wrap:wrap; gap:4px; align-items:center; }
.pqr-chip { font-size:10.5px; padding:2px 7px; border:1px solid var(--line); border-radius:999px; background:var(--paper); color:var(--muted); max-width:150px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pqr-client, .pqr-when { display:flex; align-items:center; gap:6px; font-size:11.5px; color:var(--ink-700,#333); min-width:0; }
.pqr-client b { min-width:0; font-weight:680; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pqr-when { color:var(--muted); }
.pqr-state { display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-top:1px; }
.pqr-state .badge-st { font-size:10.5px; padding:2.5px 8px; }
.pqr-code { font-size:10px; color:var(--muted); letter-spacing:.02em; }
.pqr--trx .pqr-top b { font-size:13px; }

/* Kartu identitas + detail booking merged — KOMPAK (feedback owner 14 Jul:
   kurangi tinggi kartu ini biar kontainer Cart di bawah lebih lega/tinggi).
   Padding & gap dirapatkan, grid detail auto-fit packing biar lebih sedikit baris. */
.pos-detailcard--merged .pos-card__head { padding:8px 14px 6px; }
.pos-detailcard--merged .pos-ident-wrap { padding:8px 14px; }
.pos-detailcard--merged .pos-ident-fields { gap:8px; }
.pos-detailcard--merged .pos-ident--linked { padding:8px 12px; }
.pos-detailcard--merged .pos-detail-grid {
  grid-template-columns:repeat(auto-fit,minmax(148px,1fr));
  padding:8px 14px 11px; gap:7px 10px;
}
.pos-detailcard--merged .pos-detail-grid .frow { margin-bottom:0; }
/* Layanan ikut mengalir (tidak lagi span penuh) → [Layanan|Room|Tipe] + [Channel|Tanggal]
   = 2 baris saja, hemat 1 baris tinggi kartu. Override rule lama :first-child. */
.pos-detailcard--merged .pos-detail-grid .frow:first-child { grid-column:auto; }
.pos-detailcard--merged .frow label { font-size:10px; margin-bottom:2px; letter-spacing:.02em; }
.pos-detailcard--merged .ctrl { padding:6px 9px; font-size:12.5px; }

/* Pax per kantong item */
.pos-line-paxwrap small.pos-line-paxinfo { display:block; margin-top:3px; font-size:10.5px; color:var(--muted); }
.pos-line-paxwrap small.pos-line-paxinfo.is-over { color:#6b4900; font-weight:700; }
.pos-paxhint-cart { margin:0 14px 12px; }
.pos-paxhint-cart:empty { display:none; }

/* ============================================================
   FIN-V2 — Modul Finance, redesign penuh
   Brief "Finance Familiar & Booking Schedule" R2 (2026-08-11) §2.1/§2.5 +
   AUDIT UX Modul Finance 2026-08-11 (D-01..D-17, B-01..B-06, R-01..R-15).

   Anatomi direproduksi dari master 12.04.02 `Finance & Metrics.dc.html`
   (kini terindeks: `GUI/F1..F3/*` di design-system/library-index.md):
     · GUI/F1/KPI-CARDS        → .fin-kpi-row (primitive .vs-stat)
     · GUI/F3/LEDGER           → .fin-ledger (grid 4 kolom + toolbar + baris net)
     · GUI/F3/APPROVAL         → .fin-review-item (kartu + stepper + baris)
     · GUI/F3/CASH-FLOW        → .fin-cash-card
   Aturan mutlak blok ini:
     1. NOL literal warna — termasuk sebagai fallback var() (D-11, memori
        `vs-yellow-brand-token-cycle`: rantai token berakhir di tokens.css).
     2. NOL `@media (max-width:…)` baru — ambang diukur dari kontainer #finBody
        (D-06). `@media` yang tersisa hanya untuk hal non-layout (reduced motion).
     3. Pasangan teks/latar ≥4.5:1. Master memakai --text-subtle (#777D88 = 4.14:1)
        untuk label kolom; label kolom membawa makna, jadi dipakai --text-muted
        (10.86:1). --accent-red (#F5365E = 3.77:1) hanya untuk grafis non-teks;
        nominal keluar memakai --tag-danger-text (5.61:1).
   ============================================================ */

/* ── fondasi: kontainer, bukan viewport (D-06) ───────────────────────────── */
/* Dua kontainer bersarang, masing-masing menjawab pertanyaan yang berbeda:
     finroot — lebar kolom konten modul (shell, filter, target sentuh)
     finbody — lebar badan tab (ambang tabel → kartu, grid halaman)        */
.fin-root { container-type: inline-size; container-name: finroot; min-width: 0; }
#finBody { container-type: inline-size; container-name: finbody; }

/* ── shell: tab primer + disclosure "Lainnya" (D-04, R-04, F-10) ─────────── */
/* Strip tab + badge + disclosure duduk di satu baris; hanya STRIP-nya yang
   bergulir, sehingga pintu ke 11 tab sekunder tidak pernah ikut hanyut keluar
   layar seperti <select> lama di ujung kanan (R-04). */
.fin-shellnav { display:flex; align-items:center; gap:var(--space-2); min-width:0;
  padding-bottom:var(--space-2); }
.fin-shellnav > .fin-tabs { flex:1 1 auto; }
/* Label tersembunyi untuk pembaca layar (kontrol filter tanpa label terlihat). */
#finShell .sr-only, #finBody .sr-only, .fin-filterbar .sr-only {
  position:absolute; width:1px; height:1px; margin:-1px; padding:0;
  overflow:hidden; clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap; border:0;
}
/* Dua sumbu status SELALU berdampingan sebagai dua label terpisah (D-11). */
.fin-axes { display:inline-flex; align-items:center; gap:6px; flex-wrap:wrap; justify-content:flex-end; }
.fin-proof { margin-bottom:var(--space-4); }
.fin-tabs { display:flex; align-items:center; gap:var(--space-2); min-width:0;
  overflow-x:auto; max-width:100%; -webkit-overflow-scrolling:touch;
  scrollbar-width:none; }
.fin-tabs::-webkit-scrollbar { display:none; }
.fin-tabs .vs-tab { flex:0 0 auto; white-space:nowrap; }
/* Label tab/sub-nav Finance SELALU tampil — di lebar sempit strip BERGULIR, teks
   tidak pernah dihapus. Aturan global `@media (max-width:600px){ .seg-btn span
   { display:none } }` membuat 14 tombol sub-navigasi jadi kotak kosong 20×16px
   tanpa ikon pengganti; ketiga strip itu kini memakai primitive Tabs, dan aturan
   di bawah menjaga sisa markup `.seg` legacy yang masih ada di Finance (B-04). */
#finShell .seg-btn span, #finBody .seg-btn span, .fin-filterbar .seg-btn span { display:inline; }
/* Sub-nav dalam badan tab: satu baris bergulir, tidak pernah membungkus jadi
   dua baris yang memakan tinggi layar mobile (R-13). */
.fin-subnav { min-width:0; max-width:100%; margin-bottom:var(--space-4);
  overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
.fin-subnav::-webkit-scrollbar { display:none; }
.fin-subnav .vs-tab { flex:0 0 auto; white-space:nowrap; }

.fin-more { position:relative; flex:0 0 auto; margin-left:var(--space-2); }
.fin-more > summary { display:inline-flex; align-items:center; gap:6px; cursor:pointer;
  min-height:38px; padding:0 12px; border:1px solid var(--border-default);
  border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-body);
  font:650 12.5px var(--font-body); white-space:nowrap; list-style:none; }
.fin-more > summary::-webkit-details-marker { display:none; }
.fin-more[open] > summary, .fin-more.is-active > summary { border-color:var(--ink-900); font-weight:700; }
.fin-more__panel { position:absolute; z-index:1200; top:calc(100% + 6px); right:0;
  min-width:232px; max-height:min(60vh, 420px); overflow:auto; padding:var(--space-2);
  background:var(--surface-0); border:1px solid var(--border-default);
  border-radius:var(--radius-sm); box-shadow:var(--shadow-pop); }
.fin-more__panel a { display:block; padding:9px 10px; min-height:40px; border-radius:var(--radius-xs);
  color:var(--text-body); font-size:12.5px; text-decoration:none; }
.fin-more__panel a:hover, .fin-more__panel a:focus-visible { background:var(--surface-1); }
.fin-more__panel a[aria-current="page"] { background:var(--surface-1); font-weight:700; }

/* Grup aksi kepala: satu baris, bergulir bila sempit — tidak pernah wrap (R-13). */
.fin-headacts { display:flex; align-items:center; gap:var(--space-3); min-width:0; max-width:100%;
  flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
.fin-headacts::-webkit-scrollbar { display:none; }
.fin-headacts > * { flex:0 0 auto; }

.fin-validasi-badge { display:inline-flex; align-items:center; gap:5px; flex:0 0 auto;
  min-height:30px; margin-left:var(--space-2); padding:0 10px; border-radius:var(--radius-pill);
  border:1px solid var(--tag-warning-border); background:var(--tag-warning-bg);
  color:var(--tag-warning-text); font:650 11.5px var(--font-body); text-decoration:none; white-space:nowrap; }
.fin-validasi-badge b { font-family:var(--font-mono); }

/* ── control plane: filter yang ditampilkan = filter yang dikirim (D-03) ─── */
.fin-filterbar { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap;
  margin:var(--space-3) 0; min-width:0; }
.fin-filterbar .fin-ranges { display:flex; gap:var(--space-2); min-width:0; max-width:100%;
  overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
.fin-filterbar .fin-ranges::-webkit-scrollbar { display:none; }
.fin-filterbar .fin-ranges .vs-viewchip, .fin-filterbar .fin-ranges .seg-btn { white-space:nowrap; flex:0 0 auto; }
/* Grup tanggal Custom. Versi lama `inline-flex` + `flex-wrap:wrap` + lebar mati
   158px: begitu strip preset memakan baris, kedua input membungkus sendiri-sendiri
   dan "s/d" terlempar ke samping input pertama — tampak seperti dua kontrol yang
   tidak berhubungan. Sekarang grupnya TIDAK pernah membungkus di dalam; ia yang
   pindah baris sebagai satu kesatuan (flex-basis 300px), dan kedua input berbagi
   lebar yang tersisa secara fluid. */
.fin-custom { display:flex; align-items:center; gap:var(--space-2); flex-wrap:nowrap;
  min-width:0; flex:1 1 300px; }
.fin-custom .ctrl { flex:1 1 0; min-width:0; max-width:200px; }
.fin-custom .sub { flex:0 0 auto; white-space:nowrap; }
/* Input periode lain ikut fluid — sebelumnya lebarnya ditulis inline di markup. */
.fin-period-input { flex:1 1 150px; min-width:0; max-width:180px; }
.fin-period-input--year { flex:0 1 110px; max-width:110px; }
.fin-filterbar > .fin-subnav { flex:1 1 auto; }
/* Chip lingkup aktif — empty state WAJIB menyebut lingkup yang berlaku (B-03). */
.fin-scope { display:flex; align-items:center; gap:var(--space-2); flex-wrap:wrap; min-width:0; }
.fin-scope__chip { display:inline-flex; align-items:center; gap:5px; min-height:26px;
  padding:2px 9px; border-radius:var(--radius-pill); border:1px solid var(--tag-neutral-border);
  background:var(--tag-neutral-bg); color:var(--tag-neutral-text); font:650 11px var(--font-body); }

/* ── grid halaman: satu ambang, diukur dari kontainer (D-06, D-08, R-03) ─── */
.fin-grid { display:grid; grid-template-columns:1fr; gap:var(--space-5); align-items:start; }
.fin-2col { display:grid; grid-template-columns:1fr; gap:var(--space-5); align-items:start; }
@container finbody (min-width: 900px) {
  .fin-grid { grid-template-columns:2fr minmax(320px, 1fr); }
  .fin-2col { grid-template-columns:1fr 1fr; }
}
/* Pengganti grid inline `repeat(auto-fit,minmax(150px,1fr))` (D-07). */
.fin-autofit { display:grid; grid-template-columns:repeat(auto-fit, minmax(150px, 1fr));
  gap:var(--space-4); margin:var(--space-4) 0; }
/* Mode tabel hanya saat kolomnya benar-benar muat; di bawahnya kartu berlabel. */
#finBody table.tbl { min-width:0; }
#finBody .panel-body.flush { overflow-x:auto; }
@container finbody (min-width: 721px) { #finBody table.tbl { min-width:560px; } }

/* ── target sentuh & fokus (D-16, B5.1) ─────────────────────────────────── */
/* Diukur dari finroot supaya tab primer + chip periode (yang berada DI LUAR
   #finBody) ikut memenuhi 44px, bukan hanya kontrol di dalam badan tab. */
@container finroot (max-width: 900px) {
  .fin-root .abtn, .fin-root .seg-btn, .fin-root .ctrl, .fin-root .icon-btn,
  .fin-root .vs-viewchip, .fin-root .vs-tab, .fin-root .fin-more > summary,
  .fin-root select, .fin-root input:not([type="checkbox"]):not([type="radio"]),
  .fin-root .fin-more__panel a { min-height:44px; }
  .fin-root .fin-more__panel a { display:flex; align-items:center; }
  .fin-root .fin-guide-link, .fin-root .fin-guide-nav a { min-height:44px; }
  .fin-root .tbl tbody tr { min-height:44px; }
}
/* Pola fokus mengikuti app (box-shadow ring), bukan outline: --focus-ring adalah
   warna ring ber-alpha rendah dan tidak terbaca sebagai outline solid. */
#finBody :is(a, button, select, input, textarea, summary, [tabindex]):focus-visible {
  outline:none; box-shadow:0 0 0 3px var(--focus-ring); border-radius:var(--radius-xs);
}

/* ── state eksklusif: loading | error | permission | empty | data (D-01) ── */
.fin-state { display:flex; flex-direction:column; align-items:center; gap:var(--space-3);
  padding:var(--space-8) var(--space-5); text-align:center; }
.fin-state__icon { display:inline-flex; align-items:center; justify-content:center;
  width:44px; height:44px; border-radius:var(--radius-sm); background:var(--ink-050); color:var(--text-muted); }
.fin-state__title { font:700 14px var(--font-heading, var(--font-display)); color:var(--text-strong); }
.fin-state__msg { max-width:52ch; font-size:12.5px; line-height:1.5; color:var(--text-muted); }
.fin-state__code { font:500 10.5px var(--font-mono); letter-spacing:.04em; color:var(--text-muted); }
.fin-state--error .fin-state__icon { background:var(--tag-danger-bg); color:var(--tag-danger-text); }
.fin-state--permission .fin-state__icon { background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.fin-state__actions { display:flex; gap:var(--space-3); flex-wrap:wrap; justify-content:center; }

/* ── GUI/F1/KPI-CARDS ───────────────────────────────────────────────────── */
.fin-kpi-row { display:grid; grid-template-columns:repeat(auto-fit, minmax(220px, 1fr));
  gap:var(--space-5); margin-bottom:var(--space-5); }
.fin-kpi { min-width:0; }
.fin-kpi .vs-stat__value { overflow:hidden; text-overflow:ellipsis; }
@container finbody (max-width: 480px) { .fin-kpi .vs-stat__value { font-size:22px; } }
.fin-kpi--click { cursor:pointer; text-align:left; width:100%; font:inherit; }
.fin-kpi--warn .vs-stat__value { color:var(--tag-warning-text); }
.fin-kpi--bad .vs-stat__value  { color:var(--tag-danger-text); }
.fin-kpi--ok .vs-stat__value   { color:var(--accent-mint); }
/* delta tren — `.up`/`.down` dipakai di markup tetapi tidak pernah didefinisikan (DS-3) */
.fin-delta { display:inline-flex; align-items:center; gap:4px; font:600 12px var(--font-mono); }
.fin-delta.up   { color:var(--accent-mint); }
.fin-delta.down { color:var(--tag-danger-text); }
.fin-delta.flat { color:var(--text-muted); }

/* ── R3 · Bento transaksi: lima fakta harian, bukan mode dashboard ───────── */
.fin-bento { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,210px),1fr));
  gap:var(--space-4); margin-bottom:var(--space-5); }
.fin-bento__card { display:flex; flex-direction:column; align-items:flex-start; min-width:0;
  min-height:132px; padding:var(--space-4); text-align:left; cursor:pointer;
  border:1px solid var(--border-default); border-top-width:3px; border-radius:var(--radius-sm);
  background:var(--surface-0); color:var(--text-body); }
.fin-bento__card:hover { box-shadow:var(--shadow-xs); }
.fin-bento__card .vs-stat__label { font:650 10.5px var(--font-mono); letter-spacing:.08em;
  text-transform:uppercase; color:var(--text-muted); }
.fin-bento__card .vs-stat__value { margin-top:var(--space-3); font:700 24px var(--font-display);
  font-variant-numeric:tabular-nums; color:var(--text-strong); overflow-wrap:anywhere; }
.fin-bento__card .vs-stat__foot { margin-top:auto; padding-top:var(--space-3);
  font-size:11.5px; line-height:1.4; color:var(--text-muted); }
.fin-bento__card--primary { border-top-color:var(--identity-yellow); background:var(--ink-900); }
.fin-bento__card--primary .vs-stat__label, .fin-bento__card--primary .vs-stat__foot { color:var(--text-on-dark-muted); }
.fin-bento__card--primary .vs-stat__value { color:var(--text-on-dark); }
.fin-bento__card--ok { border-top-color:var(--tag-success-text); background:var(--tag-success-bg); }
.fin-bento__card--info { border-top-color:var(--tag-blue-text); background:var(--tag-blue-bg); }
.fin-bento__card--warn { border-top-color:var(--tag-warning-text); background:var(--tag-warning-bg); }
.fin-bento__card--danger { border-top-color:var(--tag-danger-text); background:var(--tag-danger-bg); }

/* ── R3 · Log familiar per tanggal: inti selalu terlihat, metadata dilipat ─ */
.fin-log-tools { display:flex; align-items:flex-start; gap:var(--space-3); flex-wrap:wrap;
  margin-bottom:var(--space-5); }
.fin-log-search { display:flex; align-items:center; gap:var(--space-2); flex:1 1 280px;
  min-width:min(100%,220px); color:var(--text-muted); }
.fin-log-search .ctrl { width:100%; }
.fin-log-filter { position:relative; flex:0 0 auto; }
.fin-log-filter > summary { display:inline-flex; align-items:center; gap:var(--space-2); min-height:38px;
  padding:0 var(--space-4); border:1px solid var(--border-default); border-radius:var(--radius-sm);
  background:var(--surface-0); color:var(--text-body); font-weight:650; cursor:pointer; list-style:none; }
.fin-log-filter > summary::-webkit-details-marker { display:none; }
.fin-log-filter[open] > summary { border-color:var(--ink-900); }
.fin-log-filter > div { position:absolute; z-index:20; top:calc(100% + var(--space-2)); right:0;
  display:grid; gap:var(--space-2); min-width:min(82vw,260px); padding:var(--space-3);
  border:1px solid var(--border-default); border-radius:var(--radius-sm); background:var(--surface-0);
  box-shadow:var(--shadow-pop); }
.fin-log-filter .ctrl { max-width:none; width:100%; }
.fin-log-head { display:flex; align-items:flex-end; justify-content:space-between; gap:var(--space-4);
  margin-bottom:var(--space-3); }
.fin-log-head h2 { margin:0; font:700 18px var(--font-display); color:var(--text-strong); }
.fin-log-head span { font-size:11.5px; color:var(--text-muted); }
.fin-log { display:flex; flex-direction:column; gap:var(--space-5); }
.fin-day { border:1px solid var(--border-default); border-radius:var(--radius-sm);
  background:var(--surface-0); overflow:hidden; }
.fin-day__head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-4);
  flex-wrap:wrap; padding:var(--space-4); border-bottom:1px solid var(--line-100); background:var(--surface-1); }
.fin-day__head > div:first-child { display:flex; flex-direction:column; gap:2px; }
.fin-day__head strong { color:var(--text-strong); }
.fin-day__head span { font-size:11.5px; color:var(--text-muted); }
.fin-day__totals { display:flex; align-items:center; gap:var(--space-4); flex-wrap:wrap;
  font-family:var(--font-mono); font-variant-numeric:tabular-nums; }
.fin-day__totals b { color:var(--text-strong); }
.fin-entry-list { display:flex; flex-direction:column; }
.fin-entry { border-bottom:1px solid var(--line-100); }
.fin-entry:last-child { border-bottom:0; }
.fin-entry.is-void { opacity:.64; }
/* ── Baris ledger: TIGA ZONA BERBOBOT (redesign 2026-08-12) ────────────────
   Versi lama `repeat(auto-fit,minmax(210px,1fr))` memberi bobot SAMA kepada tiga
   zona yang isinya tidak setara: identitas (teks panjang, elastis) diperlakukan
   sama dengan nominal (pendek, presisi) dan status (chip). Akibatnya di lebar
   menengah nominal & status berdesakan, sementara identitas justru kekurangan
   ruang lalu dipotong elipsis.
   Sekarang: identitas MENGAMBIL sisa ruang (minmax(0,1fr)), nominal & status
   hanya selebar isinya (auto) dan tidak pernah membungkus di dalam dirinya. */
.fin-entry__main { display:grid;
  grid-template-columns:minmax(0,1fr) auto auto;
  grid-template-areas:'identity money status';
  gap:var(--space-3) var(--space-4); align-items:start; padding:var(--space-4); }
.fin-entry__identity { grid-area:identity; }
.fin-entry__money { grid-area:money; }
.fin-entry__status { grid-area:status; }
/* align-items:flex-start WAJIB: tanpa itu anak kolom flex melar selebar zona —
   persis yang membuat chip brand jadi pita kuning selebar baris. */
.fin-entry__identity, .fin-entry__money { display:flex; flex-direction:column;
  align-items:flex-start; gap:4px; min-width:0; }
/* Judul MEMBUNGKUS, tidak dipotong. Elipsis satu baris menyembunyikan nama
   customer & nomor Order yang justru dipakai untuk mencocokkan transaksi. */
.fin-entry__identity strong { white-space:normal; overflow-wrap:anywhere;
  line-height:1.35; color:var(--text-strong); }
.fin-entry__tags { display:flex; align-items:center; gap:6px; flex-wrap:wrap; min-width:0; }
.fin-entry__dest, .fin-entry__money > span { display:flex; align-items:center;
  gap:4px; min-width:0; overflow-wrap:anywhere; font-size:11.5px; color:var(--text-muted); }
.fin-entry__source { flex:0 0 auto; width:max-content; max-width:100%; padding:2px 7px;
  border-radius:var(--radius-pill);
  background:var(--tag-neutral-bg); border:1px solid var(--tag-neutral-border);
  color:var(--tag-neutral-text); font:650 10px var(--font-mono); text-transform:uppercase; }
.fin-entry__money { align-items:flex-end; text-align:right; }
/* Nominal & waktunya presisi — keduanya tidak boleh patah di tengah angka. */
.fin-entry__money .fin-amt, .fin-entry__money > span { white-space:nowrap; }
.fin-entry__status { display:flex; justify-content:flex-end; min-width:0; }
.fin-entry__status .fin-axes { justify-content:flex-end; }
/* Sempit: identitas memakai baris penuh, nominal & status berbagi baris kedua —
   nominal kembali rata kiri karena tidak lagi ada kolom di sebelah kirinya. */
@media (max-width:820px){
  .fin-entry__main { grid-template-columns:minmax(0,1fr) auto;
    grid-template-areas:'identity identity' 'money status'; }
  .fin-entry__money { align-items:flex-start; text-align:left; }
}
.fin-entry__more { border-top:1px dashed var(--line-100); }
.fin-entry__more > summary { display:flex; align-items:center; gap:var(--space-2); width:max-content;
  padding:var(--space-3) var(--space-4); color:var(--text-muted); font-size:11.5px;
  cursor:pointer; list-style:none; }
.fin-entry__more > summary::-webkit-details-marker { display:none; }
.fin-entry__more[open] > summary { color:var(--text-strong); }
.fin-entry__detail { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,180px),1fr));
  gap:var(--space-3); padding:0 var(--space-4) var(--space-3); }
.fin-entry__detail > div { display:flex; flex-direction:column; gap:2px; min-width:0; }
.fin-entry__detail span { font:650 10px var(--font-mono); letter-spacing:.06em;
  text-transform:uppercase; color:var(--text-muted); }
.fin-entry__detail b { overflow-wrap:anywhere; font-size:12px; color:var(--text-strong); }
.fin-entry__actions { display:flex; gap:var(--space-2); flex-wrap:wrap; padding:0 var(--space-4) var(--space-4); }

.fin-evidence-row { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3);
  align-items:center; padding:var(--space-3); border:1px solid var(--border-default);
  border-radius:var(--radius-sm); background:var(--surface-1); }
.fin-evidence-row img, .fin-evidence-row__icon { width:44px; height:44px; border-radius:var(--radius-xs); }
.fin-evidence-row img { object-fit:cover; }
.fin-evidence-row__icon { display:grid; place-items:center; background:var(--surface-0); color:var(--text-muted); }
/* Thumbnail 44px hanya menyatakan "ada bukti". Sekali klik ia membesar DI TEMPAT
   (di dalam modal, lightbox tidak bisa ditumpuk — lihat finEntryDetailModal). */
.fin-evidence-row__zoom { display:block; padding:0; border:0; background:none;
  cursor:zoom-in; line-height:0; border-radius:var(--radius-xs); }
.fin-evidence-row__zoom:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.fin-evidence-row.is-open { grid-template-columns:minmax(0,1fr); }
.fin-evidence-row.is-open .fin-evidence-row__zoom { cursor:zoom-out; width:100%; }
.fin-evidence-row.is-open img { width:100%; height:auto; max-height:60vh; object-fit:contain;
  background:var(--surface-0); border:1px solid var(--border-default); }
.fin-evidence-row > span:last-child { display:flex; flex-direction:column; gap:2px; min-width:0; }
.fin-evidence-row b { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--text-strong); }
.fin-evidence-row small { color:var(--text-muted); }
.fin-native-evidence { display:flex; flex-direction:column; gap:var(--space-3); margin-top:var(--space-4); }

/* ── Brand transaksi ────────────────────────────────────────────────────────
   Warna melekat pada FILL chip kategori, BUKAN garis tepi baris (aturan owner:
   baris item polos & ringkas). Paletnya kanon yang sama dengan POS & Schedule. */
.fin-brand-chip { display:inline-flex; align-items:center; flex:0 0 auto; min-height:17px;
  padding:1px 7px; border-radius:var(--radius-pill);
  font:700 9.5px var(--font-mono); letter-spacing:.06em; }
.fin-brand-chip[data-brand="vs"]    { background:var(--identity-yellow); color:var(--ink-900); }
.fin-brand-chip[data-brand="luxa"]  { background:var(--ink-900); color:var(--surface-0); }
.fin-brand-chip[data-brand="nussa"] { background:var(--sunset-orange); color:var(--ink-900); }

/* ── Dokumen terkait: kartu backlink ────────────────────────────────────────
   Menggantikan deret kode mono yang dulu hanya bisa disalin lalu dicari manual.
   Tiap kartu menyebut BENDA-nya dulu, kodenya sekunder, seluruh kartu diklik. */
.fin-rels { margin-top:var(--space-4); }
.fin-rels .dgroup-label { margin-bottom:var(--space-2); }
.fin-rels__grid { display:grid; gap:var(--space-2);
  grid-template-columns:repeat(auto-fill,minmax(min(100%,258px),1fr)); }
.fin-rel { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-3);
  align-items:center; width:100%; text-align:left; cursor:pointer;
  padding:var(--space-3) var(--space-4); border:1px solid var(--border-default);
  border-radius:var(--radius-sm); background:var(--surface-0); color:inherit; font:inherit; }
.fin-rel:hover { border-color:var(--ink-900); background:var(--surface-1); }
.fin-rel:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.fin-rel__ic { display:grid; place-items:center; width:30px; height:30px; flex:0 0 auto;
  border-radius:var(--radius-xs); background:var(--surface-1); color:var(--text-muted); }
.fin-rel:hover .fin-rel__ic { background:var(--ink-900); color:var(--surface-0); }
.fin-rel__txt { display:flex; flex-direction:column; gap:1px; min-width:0; }
.fin-rel__txt b { font-size:12.5px; font-weight:700; color:var(--text-strong); }
.fin-rel__txt small { font-size:11px; line-height:1.35; color:var(--text-muted); overflow-wrap:anywhere; }
.fin-rel__txt code { margin-top:2px; font-size:10.5px; color:var(--text-muted); overflow-wrap:anywhere; }
.fin-rel__go { color:var(--text-muted); flex:0 0 auto; }
.fin-rel:hover .fin-rel__go { color:var(--text-strong); }
/* Chip filter akun aktif di Laporan — filter yang berlaku harus TERLIHAT. */
.fin-chip-x { display:inline-flex; align-items:center; margin-left:4px; padding:0;
  border:0; background:none; color:inherit; cursor:pointer; line-height:0; }
.fin-chip-x:focus-visible { outline:none; box-shadow:var(--shadow-focus); border-radius:var(--radius-pill); }

/* ── Badan disclosure: SATU tepi, hierarki bertingkat ──────────────────────
   Cacat yang diperbaiki: empat blok di dalam <details> punya inset berbeda —
   `.fin-entry__detail` dan `.fin-entry__actions` ber-padding --space-4,
   sedangkan `.fin-rels` & `.fin-billing` nol (hanya margin-top). Hasilnya tiga
   tepi kiri berbeda dalam satu panel, dan mata tidak menemukan garis baca.
   Sekarang padding dimiliki SATU kontainer; anak-anaknya nol, jadi mustahil
   ada blok baru yang lupa ikut inset. Jarak antar-seksi (--space-5) sengaja
   lebih besar dari jarak dalam-seksi (--space-3) supaya kelompok terbaca
   sebagai kelompok tanpa perlu kotak tambahan. */
/* padding-x WAJIB sama dengan `.fin-entry__main` (--space-4) supaya badan
   disclosure sebaris dengan ringkasan di atasnya — bukan menjorok sendiri. */
.fin-entry__body { display:flex; flex-direction:column; gap:var(--space-5);
  padding:var(--space-4) var(--space-4) var(--space-5); }
.fin-entry__body > * { margin:0; padding:0; }
/* Garis rambut memisahkan seksi — pemisah paling ringan yang masih terbaca. */
.fin-entry__body > .fin-rels, .fin-entry__body > .fin-billing,
.fin-entry__body > .fin-entry__actions {
  border-top:1px solid var(--line-100); padding-top:var(--space-4); }
/* Grid fakta lebih lega — keluhan owner: dinding label kapital memicu burnout. */
.fin-entry__detail { gap:var(--space-4) var(--space-5); }
/* Kicker seksi: penanda kelompok, bukan judul yang berteriak. */
.fin-entry__body .dgroup-label { margin-bottom:var(--space-3); }
@media (max-width:600px){
  .fin-entry__body { padding:var(--space-4); gap:var(--space-4); }
}

/* Rincian "membayar apa" — dipakai kartu Validasi & baris Log Transaksi. */
.fin-billing { margin-top:var(--space-4); }
.fin-billing .dgroup-label { margin-bottom:var(--space-2); }
.fin-billing .fin-review-kv { margin-top:var(--space-3); margin-bottom:0; }
.fin-billing .sd2-tx-card:last-of-type { margin-bottom:0; }

/* ── GUI/F3/LEDGER — toolbar + grid 4 kolom + baris arus kas bersih ─────── */
.fin-ledger { display:flex; flex-direction:column; gap:var(--space-4); }
.fin-ledger__bar { display:flex; align-items:center; justify-content:space-between;
  gap:var(--space-4); flex-wrap:wrap; }
.fin-ledger__sums { display:flex; align-items:center; gap:var(--space-5);
  font:500 12px var(--font-mono); color:var(--text-muted); font-variant-numeric:tabular-nums; }
.fin-ledger__sums b { font-weight:600; }
.fin-ledger__sums .in  { color:var(--accent-mint); }
.fin-ledger__sums .out { color:var(--tag-danger-text); }
.fin-ledger__net { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-4);
  align-items:baseline; padding:var(--space-4) var(--space-4) 2px;
  border-top:1px solid var(--line-200); }
.fin-ledger__net span { font:500 11px var(--font-mono); letter-spacing:.1em;
  text-transform:uppercase; color:var(--text-muted); }
.fin-ledger__net b { font:700 15px var(--font-mono); color:var(--text-strong);
  font-variant-numeric:tabular-nums; text-align:right; }
/* nominal bertanda — warna SELALU berpasangan dengan tanda/kata (D-12) */
.fin-amt { font-family:var(--font-mono); font-weight:600; font-variant-numeric:tabular-nums; white-space:nowrap; }
.fin-amt--in  { color:var(--accent-mint); }
.fin-amt--out { color:var(--tag-danger-text); }
.fin-amt--neutral { color:var(--text-muted); }

/* ── GUI/F3/APPROVAL — antrean Validasi ─────────────────────────────────── */
.fin-review-item { border:1px solid var(--border-default); border-radius:var(--radius-sm);
  margin-bottom:var(--space-3); background:var(--surface-0); overflow:hidden; }
.fin-review-item.open { border-color:var(--ink-900); }
/* kepala = <button aria-expanded>, bukan div ber-onclick (D-10b) */
.fin-review-head { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-4);
  align-items:center; width:100%; padding:var(--space-4); text-align:left;
  background:none; border:0; cursor:pointer; font:inherit; color:inherit; }
.fin-review-head:hover { background:var(--surface-1); }
.fin-review-head__end { display:flex; flex-direction:column; align-items:flex-end; gap:4px; }
.fin-review-detail { border-top:1px solid var(--line-100); padding:var(--space-4); }
.fin-review-detail img { max-width:100%; max-height:340px; border-radius:var(--radius-xs);
  border:1px solid var(--border-default); }
/* Bukti = alat kerja: pratinjau 340px hanya untuk mengenali, membacanya lewat
   lightbox. Pembungkus <button> menjadikannya terjangkau keyboard, bukan hanya
   mouse — sejalan D-10b yang menjadikan kepala akordeon <button>. */
.fin-proof__btn { display:inline-block; padding:0; border:0; background:none;
  cursor:zoom-in; max-width:100%; text-align:left; border-radius:var(--radius-xs); }
.fin-proof__btn:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.fin-proof__hint { display:inline-flex; align-items:center; gap:6px; margin-top:var(--space-2);
  font:500 11.5px var(--font-mono); color:var(--text-muted); }
.fin-proof__btn:hover .fin-proof__hint { color:var(--text-strong); }
/* Lightbox bukti (dipakai Bookings + Finance) — token, bukan angka di markup. */
.lightbox-body { text-align:center; }
.lightbox-img { max-width:100%; max-height:70vh; border-radius:var(--radius-xs);
  border:1px solid var(--border-default); background:var(--surface-1); }
.fin-review-kv { display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:var(--space-3) var(--space-5); margin-bottom:var(--space-4); }
.fin-review-kv .k { font:650 10.5px var(--font-mono); text-transform:uppercase;
  letter-spacing:.06em; color:var(--text-muted); }
.fin-review-kv .v { font-weight:600; font-variant-numeric:tabular-nums; color:var(--text-strong); }
.fin-review-actions { display:flex; gap:var(--space-3); flex-wrap:wrap; margin-top:var(--space-4); }
/* stepper tiga tahap (anatomi GUI/F3/APPROVAL) */
.fin-steps { display:flex; align-items:center; gap:0; margin-bottom:var(--space-5); }
.fin-steps__node { display:flex; flex-direction:column; align-items:center; gap:8px; flex:0 0 auto; }
.fin-steps__dot { display:inline-flex; align-items:center; justify-content:center;
  width:34px; height:34px; border-radius:var(--radius-pill); background:var(--surface-0);
  border:1px solid var(--border-default); color:var(--text-muted);
  font:600 13px var(--font-mono); }
.fin-steps__node.is-done .fin-steps__dot { background:var(--ink-900); border-color:var(--ink-900); color:var(--surface-0); }
.fin-steps__node.is-now  .fin-steps__dot { background:var(--brand); border-color:var(--brand-line); color:var(--brand-ink); }
.fin-steps__lbl { font:500 11px var(--font-mono); color:var(--text-muted); }
.fin-steps__node.is-done .fin-steps__lbl, .fin-steps__node.is-now .fin-steps__lbl { color:var(--text-strong); }
.fin-steps__line { flex:1 1 auto; height:2px; margin:0 8px 22px; background:var(--line-200); }
.fin-steps__line.is-done { background:var(--ink-900); }

/* ── GUI/F3/CASH-FLOW — kartu rekening ──────────────────────────────────── */
.fin-cash-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
  gap:var(--space-4); margin-bottom:var(--space-5); }
.fin-cash-card { border:1px solid var(--border-default); border-radius:var(--radius-sm);
  padding:var(--space-4) var(--space-5); background:var(--surface-0); min-width:0; }
.fin-cash-card .nm { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-3);
  align-items:center; font-weight:700; }
.fin-cash-card .bal { margin:6px 0 2px; font:700 22px var(--font-display);
  font-variant-numeric:tabular-nums; color:var(--text-strong); overflow-wrap:anywhere; }
.fin-cash-card .row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-3);
  font-size:12px; color:var(--text-muted); font-variant-numeric:tabular-nums; }
.fin-cash-card .row b { color:var(--text-strong); }
.fin-cash-card .row .pend { color:var(--tag-warning-text); font-weight:700; }

/* ── tren (sementara SVG in-app; label sumbu tidak ikut skala — R-01) ───── */
.fin-trend svg { width:100%; height:auto; display:block; }
.fin-trend svg text { font-size:11px; }
.fin-leg { display:inline-flex; align-items:center; gap:4px; margin-left:6px; }
.fin-leg i { width:8px; height:8px; border-radius:2px; display:inline-block; }
.fin-leg i.fin-leg-line { width:12px; height:2px; border-radius:1px; background:var(--ink-900); }
#finBody .sub { font-size:11.5px; color:var(--text-muted); }
.fin-trend .sub { margin-top:4px; }

/* ── editor baris Purchasing: repeater grid, bukan tabel (B-06) ─────────── */
.fin-lines { display:flex; flex-direction:column; gap:var(--space-3); }
.fin-line { display:grid; grid-template-columns:1fr; gap:var(--space-3);
  padding:var(--space-3); border:1px solid var(--border-default); border-radius:var(--radius-xs); }
.fin-line > label { display:flex; flex-direction:column; gap:4px; min-width:0; }
/* Tipografi label melekat pada <span>, bukan pada <label>, supaya kontrol di
   dalamnya tidak ikut mewarisi mono/uppercase. */
.fin-line > label > span { font:650 10.5px var(--font-mono); text-transform:uppercase;
  letter-spacing:.06em; color:var(--text-muted); }
.fin-line .ctrl { font-size:12.5px; width:100%; min-width:0; }
.fin-line__del { justify-self:end; align-self:end; flex:0 0 auto; }
@container finbody (min-width: 721px) {
  .fin-line { grid-template-columns:minmax(0,1fr) 130px minmax(0,1fr) 80px 150px auto; align-items:end; }
}
/* modal dimount ke #adminOverlay (BUKAN #finBody) → container query tidak berlaku
   di sana; ambangnya diukur dari lebar modal lewat container-nya sendiri. */
.mc-body { container-type: inline-size; container-name: mcbody; }
@container mcbody (min-width: 640px) {
  .fin-line { grid-template-columns:minmax(0,1fr) 130px minmax(0,1fr) 80px 150px auto; align-items:end; }
}
.fin-badge-cat { display:inline-flex; align-items:center; min-height:22px; padding:2px 8px;
  border:1px solid var(--tag-neutral-border); border-radius:var(--radius-pill);
  background:var(--tag-neutral-bg); color:var(--tag-neutral-text);
  font:650 10px var(--font-body); text-transform:uppercase; letter-spacing:.04em; }

/* ── pita batas baris jujur (D-13) ──────────────────────────────────────── */
.fin-limit-note { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap;
  padding:var(--space-3) var(--space-4); border-top:1px solid var(--line-100);
  font:500 11.5px var(--font-mono); color:var(--text-muted); }

/* ── motion: satu-satunya @media yang tersisa di blok ini ───────────────── */
@media (prefers-reduced-motion: reduce) {
  #finBody *, #finBody *::before, #finBody *::after {
    animation-duration:.001ms !important; animation-iteration-count:1 !important;
    transition-duration:.001ms !important; scroll-behavior:auto !important;
  }
}

/* == DASH:BEGIN ==============================================================
   DASHBOARD (Ringkasan + Floor Directing) — konform design system 12.04.
   Komponen = primitive vs- (adapter di blok POS-CL-REFRESH); kelas dash- dan
   floor- murni hook komposisi. Anatomi mengikuti master 12.04.02:
   GUI/05/KPI-DASHBOARD, GUI/04/STAT-SPARKLINE, GUI/01 (chart bar),
   GUI/07 (status indicator), GUI/08 (tabs underline), GUI/09 (skeleton, empty,
   error), GUI/11 (list), plus komposisi halaman Studio Dashboard.dc.html.
   Semua nilai via var() dari app.css (kanon: design-system/tokens.css).
   Riwayat: layer dashx + DASH-REFRESH + V2 COMPOSITION dilebur 2026-07-19
   pada redesign fase 0-6 (audit & plan: design-system/, CLAUDE.md).
   ============================================================================ */

/* Tab shell (Ringkasan | Floor Directing) — primitive .vs-tabs--underline; hook margin saja */
.dash-tabs { margin:0 0 18px; }
.dash-tabs .vs-tab { text-decoration:none; min-height:44px; }

/* CTA bar (role-aware; mobile = geser horizontal) — tombol = .vs-btn */
.dash-actions { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:18px; }
.dash-actions .vs-btn { text-decoration:none; }
@media (max-width:640px){
  .dash-actions { flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; padding-bottom:2px; }
  .dash-actions::-webkit-scrollbar { display:none; }
  .dash-actions > * { flex:0 0 auto; }
}

/* KPI bento (GUI/05/KPI-DASHBOARD + StatCard GUI/04) — layout INTRINSIK.
   auto-fit/minmax menggantikan grid 5-kolom + breakpoint ad hoc: jumlah metrik
   ditentukan server per role (≤5), jadi kolom tidak boleh dipatok angka tetap. */
/* min(100%, X) WAJIB: tanpa itu track auto-fit tidak boleh menyusut di bawah X,
   sehingga viewport < X memaksa overflow horizontal (terbukti di 320px). */
.dc-daily { display:flex; flex-direction:column; gap:12px; }
.dc-daily__head { display:flex; align-items:flex-end; justify-content:space-between; gap:16px; }
.dc-daily__head > div { display:flex; flex-direction:column; gap:3px; }
.dc-daily__head strong { font-family:var(--font-display); font-size:18px; line-height:1.2; color:var(--text-strong); }
.dc-daily__date { font-size:11px; color:var(--text-subtle); }
.dc-money-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,230px),1fr)); gap:12px; }
.dc-money { display:flex; flex-direction:column; gap:10px; min-width:0; min-height:142px; padding:16px; text-decoration:none; border-top:3px solid var(--identity-yellow); }
.dc-money__top { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.dc-money__label { font-family:var(--font-mono); font-size:10.5px; line-height:1.4; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.dc-money__icon { width:30px; height:30px; display:grid; place-items:center; flex:0 0 auto; border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-muted); }
.dc-money__amount { margin-top:2px; font:700 25px/1.05 var(--font-display); letter-spacing:-.025em; color:var(--text-strong); white-space:nowrap; font-variant-numeric:tabular-nums; }
.dc-money__meta { display:flex; flex-direction:column; gap:3px; margin-top:auto; min-width:0; }
.dc-money__meta b { font-size:12px; color:var(--text-strong); }
.dc-money__meta > span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:10.5px; color:var(--text-subtle); }
.vs-card.dc-money.dc-money--primary { background:var(--ink); border-color:var(--identity-yellow); }
.dc-money--primary .dc-money__label, .dc-money--primary .dc-money__meta > span { color:var(--ink-300); }
.dc-money--primary .dc-money__amount, .dc-money--primary .dc-money__meta b { color:var(--text-on-dark); }
.dc-money--primary .dc-money__icon { background:var(--identity-yellow); color:var(--ink); }
.dc-money--warn { border-top-color:var(--accent-orange); }
.dc-money--danger { border-top-color:var(--accent-red); }
.dc-money--ok { border-top-color:var(--accent-mint); }
/* Warna nominal mengikuti arti bisnis yang diminta owner, memakai token DS. */
.dc-money[data-money-key="booking_today_value"] { border-top-color:var(--tag-success-text); }
.dc-money[data-money-key="booking_today_value"] .dc-money__amount { color:var(--tag-success-text); }
.dc-money[data-money-key="booking_today_outstanding"] { border-top-color:var(--tag-danger-text); }
.dc-money[data-money-key="booking_today_outstanding"] .dc-money__amount { color:var(--tag-danger-text); }
.dc-money[data-money-key="booking_pending_payment"] { border-top-color:var(--tag-orange-text); }
.dc-money[data-money-key="booking_pending_payment"] .dc-money__amount { color:var(--tag-orange-text); }
.dc-opstats { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,190px),1fr)); gap:8px; padding:8px; border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-1); }
.dc-opstat { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:9px; min-width:0; min-height:56px; padding:8px 10px; border-radius:var(--radius-sm); color:var(--ink); text-decoration:none; }
.dc-opstat:hover, .dc-opstat:focus-visible { background:var(--surface-0); box-shadow:var(--shadow-xs); }
.dc-opstat__icon { width:30px; height:30px; display:grid; place-items:center; border-radius:var(--radius-xs); background:var(--surface-0); border:1px solid var(--line-200); color:var(--text-muted); }
.dc-opstat__body { display:flex; flex-direction:column; gap:2px; min-width:0; }
.dc-opstat__body > span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font:500 9.5px/1.3 var(--font-mono); letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); }
.dc-opstat__body b { font:700 17px/1.1 var(--font-display); color:var(--text-strong); }
.dc-opstat__body small { font:500 11px/1 var(--font-body); color:var(--text-muted); }
.dc-opstat__arrow { display:flex; color:var(--ink-300); }
.dc-opstat--danger .dc-opstat__icon { background:var(--tag-danger-bg); color:var(--tag-danger-text); border-color:var(--tag-danger-border); }
.dc-opstat--warn .dc-opstat__icon { background:var(--tag-warning-bg); color:var(--tag-warning-text); border-color:var(--tag-warning-border); }
.dc-opstat--ok .dc-opstat__icon { background:var(--tag-success-bg); color:var(--tag-success-text); border-color:var(--tag-success-border); }
.dc-kpis { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap:12px; align-items:stretch; }
.dc-kpis > * { min-width:0; }
.dash-kpi { display:block; min-height:132px; padding:16px; text-decoration:none; }
.dash-kpi .vs-stat { display:flex; flex-direction:column; gap:7px; height:100%; }
.dash-kpi .vs-stat__foot { margin-top:auto; }
.dash-kpi .vs-stat__value { font-size:30px; line-height:1.05; }
.dc-kpi__foot { display:flex; flex-direction:column; align-items:flex-start; gap:2px; margin-top:auto; min-width:0; }
.dc-kpi__foot .vs-stat__foot { min-width:0; margin:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.dc-kpi__foot .dc-kpi__amt { flex:0 0 auto; }

/* Hero tile bento (GUI/05/KPI-DASHBOARD, tile "Revenue bulan ini"): span 2 kolom,
   angka display dominan, ikon ber-brand. Memberi hierarki pada baris KPI yang
   sebelumnya rata 5 kartu seukuran. TANPA sparkline — dashboard = snapshot
   tanggal terpilih, bukan tren, jadi tidak ada seri yang sah untuk digambar. */
.dash-kpi--hero { grid-column:span 2; }
.dash-kpi--hero .vs-stat__label { font-size:11px; }
.dc-kpi__hero-val { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
.dc-kpi__hero-val b { font-family:var(--font-display); font-size:44px; font-weight:700; line-height:1; letter-spacing:-.02em; color:var(--text-strong); font-variant-numeric:tabular-nums; }
.dash-kpi--hero .dc-kpi__unit { font-size:14px; }
.dc-kpi__ic--hero { background:var(--brand); border:1px solid var(--brand-line); color:var(--brand-ink); }
.dc-kpi__amt { font-family:var(--font-mono); font-size:12.5px; color:var(--text-muted); font-variant-numeric:tabular-nums; }
.dash-kpi--hero .dc-kpi__amt { font-size:14px; color:var(--text-strong); }
.dash-kpi--warn .dc-kpi__hero-val b { color:var(--tag-warning-text); }
.dash-kpi--danger .dc-kpi__hero-val b { color:var(--tag-danger-text); }
/* Guard, BUKAN kebijakan kolom: pada satu track, span 2 akan membuat kolom
   implisit dan memicu overflow horizontal. */
@media (max-width:560px){ .dash-kpi--hero { grid-column:auto; } .dc-kpi__hero-val b { font-size:34px; } }
.dash-kpi .vs-stat__value { display:flex; align-items:baseline; gap:6px; overflow-wrap:anywhere; }
.dc-kpi__unit { font-family:var(--font-body); font-size:13px; font-weight:500; color:var(--text-subtle); }
.dash-kpi--warn .vs-stat__icon { background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.dash-kpi--warn .vs-stat__value { color:var(--tag-warning-text); }
.dash-kpi--ok .vs-stat__icon { background:var(--tag-success-bg); color:var(--tag-success-text); }
.dash-kpi--ok .vs-stat__value { color:var(--tag-success-text); }
.dash-kpi--danger .vs-stat__icon { background:var(--tag-danger-bg); color:var(--tag-danger-text); }
.dash-kpi--danger .vs-stat__value { color:var(--tag-danger-text); }

/* KPI multi-angka — dua fakta terpisah dalam satu StatCard. Kartu KPI hanya
   ~190px, jadi label TIDAK boleh sebaris dengan angka (itu sumber label
   terpotong + tabrakan teks): label mono di atas, lalu baris angka utama +
   nominal. Hierarki: count = angka dominan, nominal = penjelas. */
.dash-kpi--multi .vs-stat { gap:10px; }
.dc-kpi__figs { display:grid; align-content:start; border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.dc-kpi__fig { display:grid; gap:2px; padding:9px 12px; min-width:0; }
.dc-kpi__fig + .dc-kpi__fig { border-top:1px solid var(--line-100); }
.dc-kpi__fig-lbl { font-family:var(--font-mono); font-size:9.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); line-height:1.35; }
.dc-kpi__fig-val { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:baseline; gap:8px; }
.dc-kpi__fig-val b { font-family:var(--font-mono); font-size:18px; font-weight:700; line-height:1.15; color:var(--text-strong); font-variant-numeric:tabular-nums; }
.dc-kpi__fig-val em { font-style:normal; font-family:var(--font-mono); font-size:11px; color:var(--text-muted); font-variant-numeric:tabular-nums; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* Baris list panel — anatomi row master Studio Dashboard ("Jadwal hari ini"):
   hover surface-1 membulat, margin -8px, waktu mono 44px + rail 2px, Tag dot. */
.dash-timeline .tl-row, .dash-recent-row, .dash-fin-row {
  display:flex; align-items:center; gap:12px; width:auto; text-align:left;
  padding:9px 8px; margin:0 -8px; min-height:44px; border:0; border-radius:var(--radius-xs);
  background:transparent; cursor:pointer; text-decoration:none; color:var(--ink);
}
.dash-timeline .tl-time { font-family:var(--font-mono); font-size:12px; color:var(--text-strong); width:44px; flex:0 0 auto; }
.tl-rail { width:2px; align-self:stretch; border-radius:var(--radius-pill); background:var(--line-200); flex:0 0 auto; }
.dash-timeline .tl-mainline { display:flex; flex-direction:column; gap:1px; flex:1; min-width:0; }
.dash-timeline .tl-mainline b { font-size:13px; font-weight:600; color:var(--text-strong); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dash-timeline .tl-mainline em { font-style:normal; font-size:11px; color:var(--text-subtle); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dash-timeline .tl-rem { flex:0 0 auto; font-size:11px; padding:4px 8px; border-radius:var(--radius-pill); background:var(--tag-warning-bg); color:var(--tag-warning-text); }

/* Booking Terbaru = daftar baris (anatomi row yang sama) */
.dash-recent-row .rc-main { display:flex; flex-direction:column; gap:1px; min-width:0; flex:1; }
.dash-recent-row .rc-main b { font-size:13px; font-weight:600; color:var(--text-strong); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dash-recent-row .rc-main em { font-style:normal; font-size:11px; color:var(--text-subtle); }
.dash-recent-row .rc-side { display:flex; align-items:center; gap:8px; flex:0 0 auto; }
.dash-recent-row .rc-when { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); }
.dash-recent-row .rc-rem { font-size:11px; color:var(--tag-warning-text); }
@media (max-width:520px){ .dash-recent-row .rc-when { display:none; } }

/* Finance mini */
.dash-fin-row { justify-content:space-between; }
.dash-fin-row .fin-lbl { font-size:13px; font-weight:600; color:var(--text-strong); }
.dash-fin-row .fin-val { display:flex; align-items:center; gap:10px; }
.dash-fin-row .fin-cnt { font-family:var(--font-mono); font-size:14px; font-weight:600; }
.dash-fin-row .fin-amt { font-family:var(--font-mono); font-size:13px; color:var(--graphite); }
.dash-welcome { margin:0; color:var(--muted); font-size:13px; line-height:1.6; }

/* ============================================================================
   COMMAND CENTER (#/dashboard) — reproduksi anatomi unit library 12.04.02.
   Semua nilai via var() dari app.css (kanon: design-system/tokens.css).
   Layout INTRINSIK: auto-fit/minmax + wrap; TIDAK menambah breakpoint kolom.
   Baris komposit (ikon|teks|aksi) memakai grid auto|minmax(0,1fr)|auto sesuai
   aturan owner, supaya teks panjang & nominal besar tidak pernah tumpang tindih.
   ============================================================================ */
.dc { gap:18px; }
.dash-page-head.dc-head { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:32px; }
.dc-head__main { min-width:0; }
.dc-meta { display:flex; flex-wrap:wrap; gap:6px 14px; margin-top:8px; }
.dc-meta__i { display:inline-flex; align-items:center; gap:6px; font-size:12px; color:var(--text-subtle); }
.dc-meta__i.mono, .dc-meta__i .mono { font-family:var(--font-mono); }
.dc-live { min-width:250px; padding-left:28px; border-left:1px solid var(--line-200); text-align:right; }
.dc-live__date { display:block; margin-bottom:5px; font:500 10px/1.2 var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.dc-live__row { display:flex; align-items:center; justify-content:flex-end; gap:10px; }
.dc-live__clock { font:700 36px/.95 var(--font-mono); letter-spacing:-.045em; font-variant-numeric:tabular-nums; color:var(--text-strong); }
.dc-live__zone { display:flex; flex-direction:column; align-items:flex-start; gap:3px; font:600 10px/1 var(--font-mono); color:var(--text-muted); }
.dc-live__zone i { display:inline-flex; align-items:center; gap:4px; font:600 8px/1 var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--tag-success-text); }
.dc-live__zone i::before { content:""; width:5px; height:5px; border-radius:var(--radius-pill); background:currentColor; }
@media (max-width:620px){
  .dash-page-head.dc-head { grid-template-columns:minmax(0,1fr); gap:14px; }
  .dc-live { min-width:0; width:100%; padding:12px 0 0; border-left:0; border-top:1px solid var(--line-200); text-align:left; }
  .dc-live__date { margin-bottom:4px; }
  .dc-live__row { justify-content:space-between; }
  .dc-live__clock { font-size:30px; }
  .dc-live__zone { align-items:flex-end; }
}

/* Banner degraded (GUI/09/ALERTS) — aksi retry di ujung, tidak menutup teks */
.dc-alert { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:12px; }
.dc-alert .vs-alert__icon { display:flex; }
.dc-alert .vs-alert__body { display:flex; flex-direction:column; gap:2px; min-width:0; }
.dc-alert .vs-btn { flex:0 0 auto; white-space:nowrap; }

/* Command bar (GUI/08/COMMAND-BAR) */
.dc-cmd { display:flex; flex-direction:column; gap:8px; }
.dc-cmd__kicker { font-family:var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.dc-cmd__row { display:flex; flex-wrap:wrap; gap:8px; }
.dc-cmd__btn { text-decoration:none; min-height:44px; }
@media (max-width:640px){
  .dc-cmd__row { flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; padding-bottom:2px; }
  .dc-cmd__row::-webkit-scrollbar { display:none; }
  .dc-cmd__row > * { flex:0 0 auto; }
}

/* Cockpit dua kolom: antrean fokus + rail harian. Rail mengisi ruang yang dulu
   kosong di bawah agenda dan menyatukan jadwal, staf, serta resource. */
.dc-work { display:grid; grid-template-columns:minmax(0,1.08fr) minmax(380px,.92fr); grid-template-areas:"attention rail"; gap:16px; align-items:start; }
.dc-work__attention { grid-area:attention; min-width:0; }
.dc-work__rail { grid-area:rail; display:flex; flex-direction:column; gap:16px; min-width:0; }
.dc-work__attention > .dc-panel, .dc-work__rail > .dc-panel { width:100%; }
@media (max-width:900px){
  .dc-work { grid-template-columns:minmax(0,1fr); grid-template-areas:"rail" "attention"; }
}
.dc-panel { margin:0; min-width:0; }
.dc-panel--atn { border-top:3px solid var(--identity-yellow); }
.dc-panel-note { padding:10px 2px 0; color:var(--text-subtle); font-size:11.5px; }
.dc-prio-chips { display:flex; flex-wrap:wrap; gap:6px; }
/* Tab kategori antrean = BARIS KEDUA dari head panel yang sama (pola .ops-toolbar
   .grp-ctrl). Varian underline, minimal: label + jumlah saja, tanpa latar pill dan
   tanpa ikon; garis bawah tab sekaligus jadi pemisah head ↔ daftar.
   Digulir horizontal kalau kategorinya banyak. */
.dc-atn-tabs {
  flex:1 1 100%; margin:0;
  max-width:100%; overflow-x:auto; scrollbar-width:none;
}
/* Selektor gabungan: primitive .vs-tabs--underline mematok gap:2px dan
   dideklarasikan setelah blok ini, jadi hook per-modul harus lebih spesifik.
   Tab tanpa padding dalam butuh jarak antar label, kalau tidak akan menempel. */
.dc-atn-tabs.vs-tabs--underline { gap:var(--space-4); }
.dc-atn-tabs::-webkit-scrollbar { display:none; }
.dc-atn-tabs .vs-tab { min-height:32px; padding-inline:0; gap:6px; font-weight:var(--fw-medium); }
/* Stepper halaman panel antrean: pager kanon .db-pager, dirapatkan ke ritme panel. */
.dc-panel--atn .db-pager { justify-content:space-between; padding:var(--space-3) 0 0; }

/* Baris antrean kerja (GUI/23/INBOX + priority badge GUI/24) */
.dc-atn-list { display:flex; flex-direction:column; }
.dc-atn {
  display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:12px;
  width:auto; text-align:left; padding:11px 8px; margin:0 -8px; min-height:44px;
  border:0; border-top:1px solid var(--line-100); border-radius:var(--radius-xs);
  background:transparent; cursor:pointer; color:var(--ink);
}
.dc-atn-list > .dc-atn:first-child { border-top:0; }
.dc-atn:hover, .dc-atn:focus-visible { background:var(--surface-1); }
.dc-atn__prio { width:9px; height:9px; border-radius:var(--radius-pill); flex:0 0 auto; background:var(--ink-300); }
.dc-prio--P0 .dc-atn__prio { background:var(--accent-red); }
.dc-prio--P1 .dc-atn__prio { background:var(--accent-orange); }
.dc-prio--P2 .dc-atn__prio { background:var(--accent-blue); }
.dc-atn__body { display:flex; flex-direction:column; gap:3px; min-width:0; }
.dc-atn__title { font-size:13px; font-weight:600; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.dc-atn__sum { font-size:12px; color:var(--text-muted); line-height:1.45; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.dc-atn__foot { display:flex; align-items:center; flex-wrap:wrap; gap:6px; }
.dc-atn__dom { font-family:var(--font-mono); font-size:10.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); }
.dc-atn__more { font-size:11px; color:var(--text-subtle); }
.dc-atn__side { display:flex; align-items:center; gap:8px; flex:0 0 auto; color:var(--text-subtle); }
.dc-atn__age { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); font-variant-numeric:tabular-nums; }
.dc-atn-more { padding:10px 0 0; font-size:12px; color:var(--text-subtle); }

/* ---------- Halaman Utility: view group & board ---------- */
.util-tags { display:flex; flex-wrap:wrap; gap:4px; margin-top:3px; }
.util-card-acts { display:flex; flex-wrap:wrap; gap:6px; margin-top:8px; }
.util-cover { width:100% !important; height:104px !important; border-radius:var(--radius-sm) !important; }
/* Seksi grup — head kicker mono + judul, senapas dengan .ops-data-head */
.util-group { display:flex; flex-direction:column; gap:0; border-top:1px solid var(--line-100); }
.util-group:first-child { border-top:0; }
.util-group__head { display:flex; align-items:center; gap:10px; padding:12px 16px; background:var(--surface-1); }
.util-group__kicker { font-family:var(--font-mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.util-group__ttl { font-size:13px; font-weight:700; color:var(--text-strong); }
.util-subgroup { display:flex; flex-direction:column; }
.util-subgroup__ttl { padding:9px 16px; font-family:var(--font-mono); font-size:10.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); border-top:1px solid var(--line-100); }
/* Board per status stok — kolom intrinsik, tanpa breakpoint */
.util-board { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap:14px; }
.util-board__col { display:flex; flex-direction:column; gap:10px; min-width:0; padding:12px; border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-1); }
.util-board__head { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.util-board__ttl { font-family:var(--font-mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.util-board__body { display:flex; flex-direction:column; gap:8px; min-width:0; }
.util-board__card { display:flex; flex-direction:column; gap:6px; padding:12px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); }

/* Details Utility — daftar pemilih + panel detail (description list GUI/13 + riwayat) */
.util-details { display:grid; grid-template-columns:minmax(0,260px) minmax(0,1fr); gap:0; align-items:start; }
.util-details__list { display:flex; flex-direction:column; border-right:1px solid var(--line-100); max-height:520px; overflow-y:auto; }
.util-pick { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:10px; width:100%; text-align:left; padding:11px 14px; border:0; border-bottom:1px solid var(--line-100); background:transparent; cursor:pointer; font:inherit; }
.util-pick:hover { background:var(--surface-1); }
.util-pick.is-on { background:var(--surface-1); box-shadow:inset 3px 0 0 var(--identity-yellow); }
.util-pick__txt { display:flex; flex-direction:column; gap:1px; min-width:0; }
.util-pick__txt b { font-size:12.5px; font-weight:600; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.util-pick__txt .sub { font-size:11px; color:var(--text-subtle); }
.util-details__panel { display:flex; flex-direction:column; gap:16px; padding:16px; min-width:0; }
.util-details__head { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:start; gap:14px; }
.util-details__id h3 { margin:2px 0 6px; font-family:var(--font-display); font-size:17px; font-weight:700; color:var(--text-strong); }
.util-dl { display:flex; flex-direction:column; border:1px solid var(--line-200); border-radius:var(--radius-sm); padding:0 14px; }
.util-dl__row { display:grid; grid-template-columns:minmax(0,160px) minmax(0,1fr); gap:14px; padding:11px 0; border-bottom:1px solid var(--line-100); }
.util-dl__row:last-child { border-bottom:0; }
.util-dl__k { font-family:var(--font-mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.util-dl__v { font-size:13px; color:var(--text-strong); min-width:0; }
.util-details__hist { display:flex; flex-direction:column; gap:8px; min-width:0; }
@media (max-width:820px){
  .util-details { grid-template-columns:minmax(0,1fr); }
  .util-details__list { border-right:0; border-bottom:1px solid var(--line-100); max-height:220px; }
}

/* Sel item Utility — grid auto|minmax(0,1fr) (aturan baris komposit owner):
   thumbnail tidak boleh mendorong teks sampai tumpang tindih. */
.util-item { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:10px; }
.util-item__txt { display:flex; flex-direction:column; gap:1px; min-width:0; }
.util-item__txt b { font-size:13px; font-weight:600; color:var(--text-strong); }
.util-item__txt .sub { font-size:11px; color:var(--text-subtle); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.util-item .img-thumb { width:38px; height:38px; border-radius:var(--radius-xs); background-size:cover; background-position:center; flex:0 0 auto; }

/* ---------- Chip recall (shortcut chip GUI/18) ----------
   Anatomi unit: pill mono 32px, border 1px, klik = jalan pintas mengisi input —
   yang otoritatif tetap teks bebas di input, chip hanya mempercepat. State aktif
   memakai warna primary (ink) penuh seperti chip terpilih pada unit master. */
.ut-chips { display:flex; flex-wrap:wrap; gap:6px; margin-top:6px; }
.ut-chip {
  display:inline-flex; align-items:center; min-height:32px; padding:0 13px;
  border:1px solid var(--line-200); border-radius:var(--radius-pill);
  background:var(--surface-0); color:var(--text-muted);
  font:400 11.5px/1 var(--font-mono); cursor:pointer;
  transition:background .14s ease, color .14s ease, border-color .14s ease;
}
.ut-chip:hover { border-color:var(--ink-300); color:var(--text-strong); background:var(--surface-1); }
.ut-chip:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.ut-chip.is-on { background:var(--primary); border-color:var(--primary); color:var(--primary-contrast); font-weight:600; }

/* Baris occurrence "Operasi hari ini" — reproduksi GUI/15/CARD varian compact:
   kartu ber-border radius 12, stack jam mono + durasi, divider 1px vertikal,
   judul/sub ellipsis, lalu cluster nominal + tag + chevron di ujung.
   Grid (bukan flex) sesuai aturan baris komposit owner. */
.dc-ops { display:flex; flex-direction:column; gap:8px; }
.dc-op {
  display:grid; grid-template-columns:auto auto minmax(0,1fr) auto; align-items:center; gap:12px;
  width:100%; text-align:left; padding:11px 14px; min-height:52px;
  border:1px solid var(--line-200); border-radius:var(--radius-md);
  background:var(--surface-0); color:var(--ink); cursor:pointer; font:inherit;
  transition:border-color .14s ease, background .14s ease;
}
.dc-op:hover, .dc-op:focus-visible { border-color:var(--ink-300); background:var(--surface-1); }
.dc-op__time { display:flex; flex-direction:column; align-items:flex-start; flex:0 0 auto; }
/* Rentang jam mulai–selesai WAJIB terbaca utuh (aturan owner): satu baris mono
   nowrap, durasi jadi sub-baris — bukan jam mulai saja seperti varian compact. */
.dc-op__t { font-family:var(--font-mono); font-size:12.5px; font-weight:700; color:var(--text-strong); font-variant-numeric:tabular-nums; white-space:nowrap; }
.dc-op__dur { font-family:var(--font-mono); font-size:9.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); white-space:nowrap; }
.dc-op__sep { width:1px; align-self:stretch; background:var(--line-200); }
.dc-op__main { display:flex; flex-direction:column; gap:1px; min-width:0; }
.dc-op__main b { font-size:13.5px; font-weight:600; color:var(--text-strong); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dc-op__main em { font-style:normal; font-size:11.5px; color:var(--text-subtle); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dc-op__side { display:flex; align-items:center; gap:8px; flex:0 0 auto; }
.dc-op__amt { font-family:var(--font-mono); font-size:12.5px; color:var(--text-strong); white-space:nowrap; font-variant-numeric:tabular-nums; }
.dc-op__rem { font-family:var(--font-mono); font-size:11px; padding:3px 8px; border-radius:var(--radius-pill); background:var(--tag-warning-bg); color:var(--tag-warning-text); white-space:nowrap; font-variant-numeric:tabular-nums; }
.dc-op__chev { display:flex; color:var(--ink-400); }
@media (max-width:560px){
  .dc-op { grid-template-columns:auto auto minmax(0,1fr); grid-template-rows:auto auto; gap:5px 9px; }
  .dc-op__time { grid-column:1; grid-row:1 / span 2; }
  .dc-op__sep { grid-column:2; grid-row:1 / span 2; }
  .dc-op__main { grid-column:3; grid-row:1; }
  .dc-op__side { grid-column:3; grid-row:2; min-width:0; max-width:100%; flex-wrap:wrap; }
  .dc-op__chev { display:none; }
}

/* Presensi staf — compact operational rows. Satu staf tetap satu card, namun
   fakta utama dibaca horizontal agar daftar banyak staf tidak menghabiskan rail. */
.dc-staff-grid { display:grid; grid-template-columns:minmax(0,1fr); gap:6px; align-items:start; }
.dash-panel.dc-panel--attendance { padding:16px; gap:10px; }
.dc-panel--attendance .dash-panel__title { font-size:16px; }
.dc-panel--attendance .dash-panel__kicker { font-size:10px; }
.dc-staff-card { display:grid; grid-template-columns:minmax(0,1fr) auto; grid-template-rows:auto auto; gap:5px 12px; width:100%; min-width:0; padding:8px 10px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--ink); text-align:left; cursor:pointer; font:inherit; }
.dc-staff-card:hover, .dc-staff-card:focus-visible { border-color:var(--ink-300); background:var(--surface-1); }
.dc-staff-card__head { grid-column:1 / -1; display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:8px; min-width:0; }
.dc-att__avatar { width:26px; height:26px; display:grid; place-items:center; border-radius:var(--radius-pill); background:var(--ink); color:var(--text-on-dark); font:700 9px/1 var(--font-mono); letter-spacing:.04em; }
.dc-staff-card__identity { display:flex; flex-direction:column; gap:2px; min-width:0; }
.dc-staff-card__identity b { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:12px; color:var(--text-strong); }
.dc-staff-card__identity em { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-style:normal; font-size:9.5px; color:var(--text-subtle); }
.dc-staff-card__details { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px; min-width:0; padding-left:34px; }
.dc-staff-card__details > span { display:flex; align-items:baseline; gap:4px; min-width:0; }
.dc-staff-card__details em { flex:0 0 auto; font:500 8px/1.2 var(--font-mono); letter-spacing:.05em; text-transform:uppercase; color:var(--text-subtle); }
.dc-staff-card__details b { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:9.5px; color:var(--text-strong); }
.dc-staff-card__foot { display:flex; align-items:center; justify-content:flex-end; gap:5px; font-size:9px; color:var(--tag-success-text); white-space:nowrap; }
.dc-staff-card__foot > span { margin-left:3px; color:var(--text-muted); }
.dc-staff-card__foot.is-late { color:var(--tag-danger-text); }

/* Resource heatmap — 7 bucket dua-jam, skala warna hanya memakai token brand/DS. */
.dc-heat { display:flex; flex-direction:column; gap:6px; }
.dc-heat__axis, .dc-heat__row { display:grid; grid-template-columns:minmax(88px,130px) minmax(140px,1fr) 38px; align-items:center; gap:10px; }
.dc-heat__axis { color:var(--text-subtle); font:500 9px/1 var(--font-mono); }
.dc-heat__axis > div { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); text-align:center; }
.dc-heat__row { min-height:30px; width:100%; padding:2px 0; border:0; border-radius:var(--radius-xs); background:transparent; color:var(--ink); cursor:pointer; text-align:left; }
.dc-heat__row:hover, .dc-heat__row:focus-visible { background:var(--surface-1); }
.dc-heat__name { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:11.5px; font-weight:600; color:var(--text-strong); }
.dc-heat__cells { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:3px; }
.dc-heat__cell, .dc-heat__legend i { display:block; height:18px; border:1px solid; border-radius:4px; }
.dc-heat__cell--free { background:var(--surface-1); border-color:var(--line-200) !important; }
.dc-heat__cell--partial { background:var(--tag-warning-bg); border-color:var(--tag-warning-border) !important; }
.dc-heat__cell--busy { background:var(--ink); border-color:var(--ink) !important; }
.dc-heat__pct { text-align:right; font-size:10.5px; color:var(--text-muted); }
.dc-heat__legend { display:flex; align-items:center; justify-content:flex-end; flex-wrap:wrap; gap:10px; padding-top:6px; color:var(--text-subtle); font-size:9.5px; }
.dc-heat__legend span { display:inline-flex; align-items:center; gap:4px; }
.dc-heat__legend i { width:12px; height:12px; }
@media (max-width:560px){
  .dc-heat__axis, .dc-heat__row { grid-template-columns:78px minmax(126px,1fr) 32px; gap:7px; }
  .dc-heat__cells { gap:2px; }
  .dc-staff-card .vs-tag { max-width:108px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .dc-staff-card { gap:5px 8px; }
  .dc-staff-card__details { gap:7px; padding-left:34px; }
  .dc-staff-card__foot > span { display:none; }
}

/* Due-date indicator (GUI/24) */
.dc-due { display:inline-flex; align-items:center; gap:5px; padding:4px 9px; border-radius:var(--radius-sm); border:1px solid; font-size:11.5px; font-weight:600; white-space:nowrap; }
.dc-due--late { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); color:var(--tag-danger-text); }
.dc-due--now  { background:var(--tag-orange-bg); border-color:var(--tag-orange-border); color:var(--tag-orange-text); }
.dc-due--next { background:var(--tag-blue-bg);   border-color:var(--tag-blue-border);   color:var(--tag-blue-text); }
@media (max-width:560px){ .dc-atn__age { display:none; } }

/* Kesehatan modul — sel bento (GUI/05) + Tag status */
.dc-sec { display:flex; flex-direction:column; gap:10px; }
.dc-sec__head { display:flex; align-items:baseline; justify-content:space-between; gap:12px; }
.dc-sec__meta { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); }
.dc-pulses { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap:14px; }
.dc-pulse { display:grid; grid-template-rows:auto auto auto; gap:12px; padding:16px; min-width:0; text-decoration:none; align-content:start; }
.dc-pulse__top { display:grid; grid-template-columns:minmax(0,1fr) auto auto; align-items:center; gap:8px; }
.dc-pulse__kicker { display:inline-flex; align-items:center; gap:6px; min-width:0; font-family:var(--font-mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.dc-pulse__kicker svg { flex:0 0 auto; }
.dc-pulse__head { font-size:13.5px; font-weight:600; color:var(--text-strong); line-height:1.4; }
/* Detail kartu = grid key-value GUI/13/METADATA di dalam kontainer ber-border grey:
   label mono uppercase | nilai mono kanan, tiap baris dipisah border-bottom. */
.dc-pulse__counts { display:grid; align-content:start; padding:2px 12px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); }
.dc-pulse__c { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:12px; padding:8px 0; border-bottom:1px solid var(--line-100); }
.dc-pulse__c:last-child { border-bottom:0; }
.dc-pulse__lbl { font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.dc-pulse__v { font-family:var(--font-mono); font-size:13px; font-weight:700; color:var(--text-strong); font-variant-numeric:tabular-nums; }
/* Detail tertutup default — display:grid mengalahkan [hidden] bawaan UA, jadi
   aturan ini WAJIB ada (gotcha yang sama seperti komponen POS). */
.dc-pulse__counts[hidden] { display:none; }
/* Satu kontrol untuk seluruh seksi (bukan per kartu) */
.dc-sec__tools { display:inline-flex; align-items:center; gap:10px; }
.dc-sec__tg {
  display:inline-flex; align-items:center; gap:6px; min-height:32px; padding:0 10px;
  border:1px solid var(--border-input); border-radius:var(--radius-xs);
  background:var(--surface-0); color:var(--text-muted); font:600 11.5px/1 var(--font-body); cursor:pointer;
  transition:background .14s ease, color .14s ease, border-color .14s ease;
}
.dc-sec__tg:hover, .dc-sec__tg:focus-visible { background:var(--surface-1); color:var(--text-strong); border-color:var(--ink-300); }
.dc-sec__tg[aria-expanded="true"] { color:var(--text-strong); }
/* Jalan keluar eksplisit ke modul — bukan seluruh kartu yang meloncat halaman. */
.dc-pulse__go {
  display:inline-flex; align-items:center; gap:6px; align-self:start; justify-self:start;
  min-height:32px; padding:0 10px; border:1px solid var(--border-input); border-radius:var(--radius-xs);
  background:var(--surface-0); color:var(--text-muted); font:600 11.5px/1 var(--font-body); cursor:pointer;
  transition:background .14s ease, color .14s ease, border-color .14s ease;
}
.dc-pulse__go:hover, .dc-pulse__go:focus-visible { background:var(--surface-1); color:var(--text-strong); border-color:var(--ink-300); }
.dc-pulse--deg { border-color:var(--tag-danger-border); }
.dc-pulse--deg .dc-pulse__head { color:var(--tag-danger-text); }

/* Activity feed (GUI/23/ACTIVITY-FEED) — dot + rail + teks + waktu mono */
.dc-feed { display:flex; flex-direction:column; }
.dc-feed__row { display:grid; grid-template-columns:auto minmax(0,1fr); gap:12px; }
.dc-feed__rail { display:flex; flex-direction:column; align-items:center; }
.dc-feed__dot { width:28px; height:28px; border-radius:var(--radius-pill); display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto; background:var(--tag-neutral-bg); border:1px solid var(--tag-neutral-border); color:var(--tag-neutral-text); }
.dc-feed__line { flex:1; width:2px; min-height:14px; margin:3px 0; background:var(--line-200); }
.dc-feed__body { display:flex; flex-direction:column; gap:2px; padding-bottom:14px; min-width:0; }
.dc-feed__txt { font-size:13px; color:var(--text-body,var(--ink)); line-height:1.4; }
.dc-feed__txt b { font-weight:600; color:var(--text-strong); }
.dc-feed__time { font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle); }

/* Empty state panel (GUI/09/EMPTY-STATE) — varian ringkas di dalam panel */
.dc-empty { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:12px; padding:20px 16px; border:1.5px dashed var(--line-200); border-radius:var(--radius-md); }
.dc-empty__ic { width:40px; height:40px; display:grid; place-items:center; border-radius:var(--radius-pill); background:var(--ink-050); color:var(--text-muted); }
.dc-empty__txt { display:flex; flex-direction:column; gap:2px; min-width:0; }
.dc-empty__txt b { font-family:var(--font-display); font-size:14px; font-weight:700; color:var(--text-strong); }
.dc-empty__txt span { font-size:12.5px; color:var(--text-muted); }

/* Skeleton (GUI/09/SKELETON) — memakai shimmer yang sama dengan .dash-skeleton */
.dc-skel { display:grid; gap:16px; }
.dc-skel i { display:block; border:0; border-radius:var(--radius-sm); background:linear-gradient(90deg, var(--line-100) 25%, var(--ink-100) 37%, var(--line-100) 63%); background-size:400% 100%; animation:dash-shimmer 1.4s ease infinite; }
.dc-skel--cards { grid-template-columns:repeat(auto-fit, minmax(min(100%, 190px), 1fr)); }
.dc-skel--cards i { height:150px; }
.dc-skel--panels { grid-template-columns:repeat(auto-fit, minmax(min(100%, 340px), 1fr)); }
.dc-skel--panels i { height:230px; }

/* ---------- FLOOR DIRECTING ---------- */
.floor-datebar { display:flex; align-items:center; gap:8px; margin-bottom:14px; flex-wrap:wrap; }
.floor-clock { margin-left:auto; font-size:12px; color:var(--muted); display:inline-flex; align-items:center; gap:5px; }
.floor-filters { display:flex; flex-direction:column; gap:8px; margin-bottom:16px; }
.floor-chips { display:flex; flex-wrap:wrap; gap:6px; }
@media (max-width:640px){ .floor-chips { flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; } .floor-chips::-webkit-scrollbar { display:none; } }
.floor-chip { flex:0 0 auto; display:inline-flex; align-items:center; gap:6px; padding:8px 12px; min-height:40px; border:1px solid var(--line); border-radius:var(--radius-pill); background:var(--paper); color:var(--ink); font-size:12px; font-weight:600; cursor:pointer; }
.floor-chip:hover { border-color:var(--ink); }
.floor-chip.active { background:var(--ink); color:var(--text-on-dark); border-color:var(--ink); }
.floor-chip--clear { color:var(--muted); }
.floor-chip--st::before { content:""; width:8px; height:8px; border-radius:50%; background:var(--fst-bd,var(--line)); flex:0 0 auto; }

/* Palet status — triad kanon Fresh Tag (token pst dan tag dijamin ada di app.css).
   Turnover: dipetakan ke triad tag-purple (keputusan owner 2026-07-19; menunggu token
   status resmi di project design upstream, lalu re-import). */
.floor-st--available, .floor-st--ready { --fst-bg:var(--pst-success-bg); --fst-bd:var(--pst-success-border); --fst-tx:var(--pst-success-text); }
.floor-st--upcoming    { --fst-bg:var(--pst-info-bg); --fst-bd:var(--pst-info-border); --fst-tx:var(--pst-info-text); }
.floor-st--preparing   { --fst-bg:var(--pst-warning-bg); --fst-bd:var(--pst-warning-border); --fst-tx:var(--pst-warning-text); }
.floor-st--occupied    { --fst-bg:var(--ink); --fst-bd:var(--ink); --fst-tx:var(--text-on-dark); }
.floor-st--turnover    { --fst-bg:var(--tag-purple-bg); --fst-bd:var(--tag-purple-border); --fst-tx:var(--tag-purple-text); }
.floor-st--blocked     { --fst-bg:var(--pst-neutral-bg); --fst-bd:var(--pst-neutral-border); --fst-tx:var(--pst-neutral-text); }
.floor-st--maintenance { --fst-bg:var(--pst-danger-bg); --fst-bd:var(--pst-danger-border); --fst-tx:var(--pst-danger-text); }

.floor-space { margin-bottom:18px; }
.floor-space-head { display:flex; align-items:center; gap:8px; font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); margin-bottom:10px; }
.floor-space-dot { width:9px; height:9px; border-radius:50%; background:var(--ink); }
.floor-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(230px,1fr)); gap:12px; }
@media (max-width:560px){ .floor-grid { grid-template-columns:1fr; } }

.floor-card { padding:13px 14px; display:flex; flex-direction:column; gap:8px; cursor:pointer; }
.floor-card-head { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; }
.floor-card-name { font-size:14px; font-weight:700; display:flex; flex-direction:column; gap:2px; }
.floor-card-kind { font-size:11px; font-weight:500; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; }
.floor-badge { flex:0 0 auto; font-size:11px; font-weight:600; padding:4px 9px; border-radius:var(--radius-pill); background:var(--fst-bg); color:var(--fst-tx); border:1px solid var(--fst-bd); white-space:nowrap; }
.floor-cur, .floor-next { display:flex; flex-direction:column; gap:1px; font-size:13px; }
.floor-line-lbl { font-size:11px; text-transform:uppercase; letter-spacing:.05em; color:var(--muted); font-weight:600; }
.floor-cur b, .floor-next b { font-size:13px; }
.floor-line-t { font-size:11px; color:var(--graphite); }
.floor-next--none { color:var(--muted); font-size:12px; }
.floor-conflict { display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:600; color:var(--pst-danger-text); }
.floor-evnote { font-size:11px; color:var(--muted); display:inline-flex; align-items:center; gap:5px; }

.floor-actwrap { margin-top:2px; }
.floor-actbtn { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:600; color:var(--ink); cursor:pointer; list-style:none; padding:8px 0; min-height:40px; }
.floor-actbtn::-webkit-details-marker { display:none; }
.floor-acts { display:flex; flex-wrap:wrap; gap:6px; padding-top:8px; border-top:1px dashed var(--line); }
/* .floor-act = .vs-btn--secondary --sm (primitive); modifier grup saja di sini */
.floor-act--session { border-color:var(--border-strong); }
.floor-act--clear { color:var(--text-muted); }

/* Floor Directing v2 — komposisi GUI/14 Timeline Scheduler + GUI/15 Booking Card.
   Seluruh warna/radius/shadow memakai token DS; hook fd-* hanya mengatur komposisi. */
.floor-wrap { display:flex; flex-direction:column; gap:var(--space-5); }
.fd-head-actions { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; }
.fd-command { padding:var(--space-5); }
.fd-command .floor-datebar { margin:0; }
.fd-command__push { flex:1 1 auto; }
.fd-command .floor-clock { margin-left:0; }
.fd-metrics { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr)); gap:var(--space-3); padding-top:var(--space-5); margin-top:var(--space-5); border-top:1px solid var(--line-100); }
.fd-metric { min-height:54px; display:flex; align-items:center; gap:var(--space-3); padding:var(--space-3) var(--space-4); border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-50); }
.fd-metric__ic { width:32px; height:32px; display:grid; place-items:center; flex:none; border-radius:var(--radius-sm); color:var(--text-muted); background:var(--surface-0); border:1px solid var(--line-100); }
.fd-metric > span:last-child { display:flex; flex-direction:column; gap:var(--space-1); min-width:0; }
.fd-metric small { font:var(--fw-medium,500) 10px var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.fd-metric b { font:700 18px var(--font-display); color:var(--text-strong); }
.fd-metric.is-live .fd-metric__ic { color:var(--pst-success-text); background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.fd-metric.is-danger .fd-metric__ic { color:var(--pst-danger-text); background:var(--pst-danger-bg); border-color:var(--pst-danger-border); }
.fd-metric.is-warning .fd-metric__ic { color:var(--pst-warning-text); background:var(--pst-warning-bg); border-color:var(--pst-warning-border); }
.floor-filters.vs-viewbar { justify-content:space-between; padding:var(--space-3) 0; margin:0; border-bottom:1px solid var(--line-100); }
.floor-filters.vs-viewbar .floor-chips { min-width:0; }

.fd-panel-head { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-5); flex-wrap:wrap; }
.fd-panel-head h3 { margin:var(--space-2) 0 0; font:700 19px var(--font-display); color:var(--text-strong); }
.fd-timeline { padding:var(--space-7); }
.fd-legend { display:flex; align-items:center; gap:var(--space-5); flex-wrap:wrap; font-size:12px; color:var(--text-muted); }
.fd-legend span { display:inline-flex; align-items:center; gap:var(--space-3); }
.fd-legend i { width:14px; height:2px; border-radius:var(--radius-pill); background:var(--accent-red); }
.fd-legend .fd-legend__conflict { height:10px; background:var(--pst-danger-bg); border:1px solid var(--pst-danger-border); }
.fd-timeline__scroll { margin-top:var(--space-5); overflow-x:auto; overscroll-behavior-inline:contain; scrollbar-width:thin; }
.fd-timeline__grid { min-width:calc(var(--space-14) * 7); display:grid; grid-template-columns:170px minmax(0,1fr); }
.fd-timeline__ticks { position:relative; height:24px; border-bottom:1px solid var(--line-200); }
.fd-timeline__ticks span { position:absolute; top:var(--space-1); transform:translateX(-50%); font:9.5px var(--font-mono); color:var(--ink-300); }
.fd-timeline__label { min-height:54px; display:flex; flex-direction:column; justify-content:center; gap:var(--space-1); padding:var(--space-3) var(--space-4) var(--space-3) 0; border-bottom:1px solid var(--line-100); }
.fd-timeline__label b { font-size:13px; font-weight:600; color:var(--text-strong); }
.fd-timeline__label span { font-size:11px; color:var(--text-subtle); }
.fd-timeline__track { position:relative; min-height:54px; border-bottom:1px solid var(--line-100); }
.fd-timeline__track > i { position:absolute; inset-block:0; width:1px; background:var(--line-100); }
.fd-timeline__block { position:absolute; left:var(--fd-left); width:var(--fd-width); top:var(--space-3); bottom:var(--space-3); display:flex; flex-direction:column; justify-content:center; gap:var(--space-1); min-width:var(--space-6); overflow:hidden; padding:var(--space-2) var(--space-3); border:1px solid var(--pst-info-border); border-radius:var(--radius-xs); background:var(--pst-info-bg); color:var(--pst-info-text); text-align:left; cursor:pointer; }
.fd-timeline__block:hover { box-shadow:var(--shadow-pop); }
.fd-timeline__block span,.fd-timeline__block small { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.fd-timeline__block span { font-size:11px; font-weight:600; }
.fd-timeline__block small { font:9px var(--font-mono); opacity:.8; }
.fd-timeline__block.is-conflict { border-style:dashed; border-color:var(--pst-danger-border); background:var(--pst-danger-bg); color:var(--pst-danger-text); }

.fd-space-count { margin-left:auto; font-size:10px; color:var(--text-subtle); }
.floor-wrap .floor-grid { grid-template-columns:repeat(auto-fit,minmax(min(100%,340px),1fr)); gap:var(--space-5); align-items:start; }
.floor-wrap .floor-card { padding:var(--space-5); gap:var(--space-4); cursor:default; min-width:0; }
.floor-wrap .floor-card-name { gap:var(--space-1); }
.floor-wrap .floor-card-name span { font:700 17px var(--font-display); color:var(--text-strong); }
.floor-wrap .floor-card-name small { font:10px var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.fd-resource-tags { display:flex; align-items:center; justify-content:flex-end; gap:var(--space-2); flex-wrap:wrap; }
.fd-resource-stats { display:flex; align-items:center; gap:var(--space-5); font-size:11px; color:var(--text-muted); }
.fd-resource-stats b { color:var(--text-strong); font-family:var(--font-mono); }
.fd-util,.fd-session__progress { height:8px; overflow:hidden; border-radius:var(--radius-pill); background:var(--line-100); }
.fd-util span,.fd-session__progress i { display:block; height:100%; width:var(--fd-progress); border-radius:inherit; background:var(--fst-bd,var(--ink-500)); transition:width .25s ease; }
.floor-evnote { align-items:flex-start; padding:var(--space-3); border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-50); line-height:1.45; }
.fd-session-list { display:flex; flex-direction:column; gap:var(--space-3); }
.fd-session { display:flex; flex-direction:column; gap:var(--space-3); padding:var(--space-4); border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); }
.fd-session:hover { border-color:var(--ink-300); box-shadow:var(--shadow-card); }
.fd-session.is-conflict { border-color:var(--pst-danger-border); background:var(--pst-danger-bg); }
.fd-session__main { display:flex; align-items:center; gap:var(--space-3); min-width:0; }
.fd-session__avatar { width:38px; height:38px; flex:none; display:grid; place-items:center; border:1px solid var(--line-200); border-radius:var(--radius-pill); background:var(--ink-050); color:var(--ink-600); font:600 12px var(--font-mono); }
.fd-session__who { min-width:0; flex:1; display:flex; flex-direction:column; gap:var(--space-1); }
.fd-session__who b { overflow:hidden; color:var(--text-strong); font-size:14px; text-overflow:ellipsis; white-space:nowrap; }
.fd-session__who span { overflow:hidden; color:var(--text-subtle); font-size:10px; text-overflow:ellipsis; white-space:nowrap; }
.fd-session__meta { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,150px),1fr)); gap:var(--space-3); font-size:12px; color:var(--text-muted); }
.fd-session__meta span { display:flex; align-items:center; gap:var(--space-2); min-width:0; }
.fd-session__count { display:flex; flex-direction:column; gap:var(--space-2); }
.fd-countdown { display:inline-flex; align-items:center; gap:var(--space-2); font:11px var(--font-mono); color:var(--text-muted); }
.fd-countdown.is-upcoming { color:var(--pst-info-text); }
.fd-countdown.is-live { color:var(--pst-success-text); }
.fd-countdown.is-overtime { color:var(--pst-danger-text); }
.fd-countdown.is-done { color:var(--text-subtle); }
.fd-session__progress i { background:var(--pst-success-text); }
.fd-session__actions { display:flex; align-items:center; justify-content:flex-end; gap:var(--space-3); padding-top:var(--space-3); border-top:1px solid var(--line-100); }
.fd-empty { padding:var(--space-5); }
.floor-actwrap { border-top:1px solid var(--line-100); padding-top:var(--space-2); }
.fd-support { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,340px),1fr)); gap:var(--space-5); align-items:start; }
.fd-support > .vs-card { padding:var(--space-7); display:flex; flex-direction:column; gap:var(--space-5); }
.fd-support .dc-feed__body small { color:var(--text-muted); font-size:11px; }
.fd-closing-summary,.fd-report-kpis { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,110px),1fr)); gap:var(--space-3); }
.fd-closing-summary > span,.fd-report-kpis > span { display:flex; flex-direction:column; gap:var(--space-2); padding:var(--space-4); border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-50); }
.fd-closing-summary small,.fd-report-kpis small { font:10px var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.fd-closing-summary b,.fd-report-kpis b { font:700 19px var(--font-display); color:var(--text-strong); }
.fd-closing-note { margin:0; color:var(--text-muted); font-size:12px; line-height:1.5; }

/* Reschedule/approval/report dialogs — exact surface/field/button primitives. */
.fd-current-slot { display:flex; align-items:center; gap:var(--space-4); padding:var(--space-4); margin-bottom:var(--space-5); border:1px dashed var(--line-200); border-radius:var(--radius-sm); background:var(--surface-50); }
.fd-current-slot > span:nth-child(2) { min-width:0; flex:1; display:flex; flex-direction:column; gap:var(--space-1); }
.fd-current-slot small { font:10px var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.fd-current-slot b { color:var(--text-strong); font-size:14px; }
.fd-current-slot em { color:var(--text-muted); font-size:12px; font-style:normal; }
.fd-adjust-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr)); gap:var(--space-4); }
.fd-approval-note { display:flex; align-items:flex-start; gap:var(--space-3); padding:var(--space-4); margin-top:var(--space-4); border:1px solid var(--pst-info-border); border-radius:var(--radius-sm); background:var(--pst-info-bg); color:var(--pst-info-text); font-size:12px; line-height:1.5; }
.fd-approval-note svg { flex:none; margin-top:var(--space-1); }
.fd-approval-card { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-4); padding:var(--space-5); margin-bottom:var(--space-5); border:1px solid var(--pst-warning-border); border-radius:var(--radius-md); background:var(--pst-warning-bg); }
.fd-approval-card__ic { width:40px; height:40px; display:grid; place-items:center; border-radius:var(--radius-pill); background:var(--surface-0); color:var(--pst-warning-text); }
.fd-approval-card b { color:var(--text-strong); }
.fd-approval-card p { margin:var(--space-2) 0 var(--space-3); color:var(--text-muted); font-size:12px; line-height:1.5; }
.fd-full-btn { width:100%; justify-content:center; margin-top:var(--space-4); }
.fd-approval-divider { display:flex; align-items:center; gap:var(--space-3); margin:var(--space-5) 0; color:var(--text-subtle); font:10px var(--font-mono); letter-spacing:.08em; text-transform:uppercase; }
.fd-approval-divider::before,.fd-approval-divider::after { content:""; flex:1; height:1px; background:var(--line-100); }
.fd-report-kpis { margin-bottom:var(--space-5); }
.fd-report-table { overflow-x:auto; border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.fd-report-table table { width:100%; min-width:calc(var(--space-14) * 5); border-collapse:collapse; }
.fd-report-table th,.fd-report-table td { padding:var(--space-3) var(--space-4); border-bottom:1px solid var(--line-100); text-align:left; font-size:12px; white-space:nowrap; }
.fd-report-table th { font:10px var(--font-mono); letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); background:var(--surface-50); }

@media (max-width:720px){
  .dash-page-head--floor { align-items:flex-start; }
  .fd-head-actions { width:100%; }
  .fd-head-actions .vs-btn,.fd-head-actions .dash-primary { flex:1 1 0; justify-content:center; }
  .fd-command { padding:var(--space-4); }
  .fd-command .floor-datebar { flex-wrap:nowrap; overflow-x:auto; padding-bottom:var(--space-2); scrollbar-width:none; }
  .fd-command .floor-datebar::-webkit-scrollbar { display:none; }
  .fd-command__push { display:none; }
  .fd-command .floor-clock { flex:none; }
  .fd-metrics { grid-auto-flow:column; grid-auto-columns:170px; grid-template-columns:none; overflow-x:auto; scrollbar-width:none; }
  .fd-metrics::-webkit-scrollbar { display:none; }
  .floor-filters.vs-viewbar { flex-wrap:nowrap; overflow-x:auto; align-items:flex-start; scrollbar-width:none; }
  .floor-filters.vs-viewbar::-webkit-scrollbar { display:none; }
  .floor-filters.vs-viewbar .floor-chips { flex-wrap:nowrap; overflow:visible; }
  .fd-timeline { padding:var(--space-5); }
  .floor-wrap .floor-grid { display:flex; overflow-x:auto; scroll-snap-type:x mandatory; gap:var(--space-4); scrollbar-width:none; }
  .floor-wrap .floor-grid::-webkit-scrollbar { display:none; }
  .floor-wrap .floor-card { flex:0 0 min(88vw,340px); scroll-snap-align:start; }
  .fd-session__actions .vs-btn { min-height:44px; flex:1 1 auto; justify-content:center; }
  .fd-current-slot { align-items:flex-start; flex-wrap:wrap; }
}

/* ---- Data-display rows (GUI/07) — hover surface, angka tabular ---- */
.dash-wrap .alert-row, .dash-wrap .tl-row, .dash-wrap .dash-recent-row, .dash-wrap .dash-fin-row { transition:background .14s ease; }
.dash-wrap .alert-row:hover, .dash-wrap .tl-row:hover, .dash-wrap .dash-recent-row:hover, .dash-wrap .dash-fin-row:hover { background:var(--surface-50); }
.dash-wrap .tl-time, .dash-wrap .tl-rem, .dash-wrap .rc-when, .dash-wrap .rc-rem, .dash-wrap .fin-cnt, .dash-wrap .fin-amt { font-variant-numeric:tabular-nums; }
.dash-wrap .alert-row svg:first-child { color:var(--graphite); }
.dash-wrap .al-high svg:first-child { color:var(--hot-red); }

/* ---- FLOOR (16 Scheduling support) ---- date bar = IconButton/Button/Input primitives. */
.floor-datebar .floor-datepick { width:auto; min-height:44px; background:var(--surface-1); }
/* Filter chips = Tag (.vs-tag pill, hairline); aktif = ink fill. */
.floor-filters .floor-chip { height:32px; padding:0 13px; border:1px solid var(--line); border-radius:var(--radius-pill); background:var(--paper); color:var(--graphite); font-size:13px; font-weight:600; transition:background .14s ease, border-color .14s ease, color .14s ease; }
.floor-filters .floor-chip:hover { border-color:var(--ink-400); color:var(--ink); }
.floor-filters .floor-chip.active { background:var(--ink); border-color:var(--ink); color:var(--text-on-dark); }
.floor-filters .floor-chip--st::before { width:7px; height:7px; }
/* Space header = mono kicker. */
.floor-wrap .floor-space-head { font-family:var(--font-mono); font-size:11px; letter-spacing:.10em; color:var(--muted); }
/* Space card = .vs-card--card --interactive (primitive); tick status kiri via hook. */
.floor-wrap .floor-card { border-left:4px solid var(--fst-bd,var(--line)); }
.floor-wrap .floor-card--conflict { border-color:var(--pst-danger-border); border-left-color:var(--pst-danger-border); }
.floor-wrap .floor-card-name { font-family:var(--font-heading); font-weight:700; font-size:14px; letter-spacing:-.01em; }
/* Status = anatomi STATUS-INDICATOR (GUI/07): pill triad + dot currentColor. */
.floor-wrap .floor-badge { display:inline-flex; align-items:center; gap:5px; height:26px; padding:0 11px; border-radius:var(--radius-pill); font-size:12px; font-weight:600; }
.floor-wrap .floor-badge::before { content:""; width:6px; height:6px; border-radius:var(--radius-pill); background:currentColor; flex:0 0 auto; }
.floor-wrap .floor-line-t { font-variant-numeric:tabular-nums; }
.floor-wrap .floor-clock { font-variant-numeric:tabular-nums; }

/* ---- Komposisi halaman (master Studio Dashboard.dc.html): page head editorial,
   toolbar aksi, grid KPI, grid panel, states ---- */
.dash-page-head {
  display:flex; align-items:flex-end; justify-content:space-between; gap:24px; margin-bottom:20px;
}
.dash-kicker {
  display:block; font-family:var(--font-mono); font-size:11px; font-weight:500;
  letter-spacing:var(--ls-label); text-transform:uppercase; color:var(--text-subtle);
}
.dash-page-head h2 {
  margin:6px 0 0; font-family:var(--font-display); font-size:30px;
  line-height:1.05; font-weight:700; letter-spacing:-.02em; color:var(--text-strong); text-wrap:balance;
}
.dash-page-head p { margin:8px 0 0; max-width:62ch; color:var(--text-muted); font-size:14px; line-height:1.55; }
/* CTA halaman = .vs-btn (primary/secondary); .dash-primary tinggal hook layout */
.dash-primary { flex:0 0 auto; text-decoration:none; }
.dash-primary:focus-visible { outline:none; box-shadow:var(--shadow-focus-brand); }

.dash-tabs { margin-bottom:18px; }
.dash-wrap { display:flex; flex-direction:column; gap:16px; }
.dash-toolbar {
  display:flex; align-items:center; justify-content:space-between; gap:22px; padding:16px 18px;
  border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-0);
  box-shadow:var(--shadow-card);
}
.dash-toolbar__intro { flex:0 0 auto; max-width:260px; }
.dash-toolbar__intro p { margin:4px 0 0; color:var(--text-subtle); font-size:12px; line-height:1.4; }
.dash-toolbar .dash-actions { justify-content:flex-end; margin:0; }
.dash-toolbar .vs-btn { min-height:40px; padding:0 13px; }

.dash-panel-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 320px), 1fr)); gap:16px; align-items:start; }
.dash-panel-grid .dash-panel { margin:0; min-width:0; }
/* Panel = .vs-card--card + hook dash-panel__* — anatomi head master Studio Dashboard:
   kicker mono + title display; link "more" = teks ghost. (17px master → 18px --text-h4,
   12.5px → 13px: token 12.04.00 menang atas nilai inline master, per USAGE.md) */
.dash-panel { padding:24px; display:flex; flex-direction:column; gap:14px; }
.dash-panel__head { display:flex; align-items:flex-start; justify-content:space-between; gap:12px; flex-wrap:wrap; }
.dash-panel__titles { display:flex; flex-direction:column; gap:3px; }
.dash-panel__kicker { font-family:var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.dash-panel__title { font-family:var(--font-display); font-size:18px; font-weight:700; color:var(--text-strong); }
.dash-panel__more { font-size:13px; font-weight:600; color:var(--text-muted); text-decoration:none; transition:color .14s ease; }
.dash-panel__more:hover { color:var(--text-strong); }
.dash-panel__body { display:flex; flex-direction:column; }
.dash-panel__meta {
  padding:3px 8px; border:1px solid var(--line-200); border-radius:var(--radius-pill);
  background:var(--surface-50); font-family:var(--font-mono); font-size:11px; color:var(--text-subtle);
}
.dash-panel--alerts { border-top:3px solid var(--identity-yellow); }
.dash-wrap .alert-row { display:flex; align-items:center; gap:12px; padding:9px 8px; margin:0 -8px; min-height:44px; border:0; border-radius:var(--radius-xs); background:transparent; cursor:pointer; text-align:left; }
.dash-wrap .alert-row span { line-height:1.45; }
.dash-wrap .alert-empty { padding:12px 0; color:var(--text-muted); }

/* Skeleton (GUI/09/SKELETON) — shimmer gradient library */
.dash-skeleton { display:flex; flex-direction:column; gap:16px; }
.dash-skeleton__bar, .dash-skeleton__cards i, .dash-skeleton__panels i {
  display:block; border:0; border-radius:var(--radius-sm);
  background:linear-gradient(90deg, var(--line-100) 25%, var(--ink-100) 37%, var(--line-100) 63%);
  background-size:400% 100%; animation:dash-shimmer 1.4s ease infinite;
}
.dash-skeleton__bar { height:76px; }
.dash-skeleton__cards { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 190px), 1fr)); gap:16px; }
.dash-skeleton__cards i { height:158px; }
.dash-skeleton__panels { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 320px), 1fr)); gap:16px; }
.dash-skeleton__panels i { height:230px; }
@keyframes dash-shimmer { 0% { background-position:100% 0; } 100% { background-position:-100% 0; } }

/* Empty/error state (GUI/09/EMPTY-STATE) — dashed, terpusat */
.dash-state {
  display:flex; flex-direction:column; align-items:center; gap:12px; text-align:center;
  padding:32px 24px; border:1.5px dashed var(--line-200); border-radius:var(--radius-md);
  background:var(--surface-0);
}
.dash-state__icon { width:48px; height:48px; display:grid; place-items:center; flex:0 0 auto; border-radius:var(--radius-pill); background:var(--ink-050); color:var(--text-muted); }
.dash-state h3 { margin:0; font-family:var(--font-display); font-size:16px; font-weight:700; color:var(--text-strong); }
.dash-state p { margin:0; font-size:13px; color:var(--text-muted); max-width:340px; }
.dash-state .vs-btn { margin:0; flex:0 0 auto; }
.dash-state--error { border-style:solid; border-color:var(--tag-danger-border); background:var(--tag-danger-bg); }
.dash-state--error .dash-state__icon { background:rgba(255,255,255,.62); color:var(--tag-danger-text); }
.dash-wrap .empty.mini, .floor-wrap .empty.mini {
  border:1.5px dashed var(--line-200); border-radius:var(--radius-md); padding:32px 24px;
  text-align:center; color:var(--text-muted);
}

/* Breakpoint kolom untuk KPI/panel/skeleton DIHAPUS: layout kini intrinsik
   (auto-fit/minmax), jadi kolom menyesuaikan lebar kontainer tanpa nilai patokan.
   Breakpoint yang tersisa hanya untuk perilaku non-grid (padding, wrap, ikon-saja). */
@media (max-width:1200px) {
  .dash-toolbar { align-items:flex-start; flex-direction:column; }
  .dash-toolbar__intro { max-width:none; }
  .dash-toolbar .dash-actions { justify-content:flex-start; }
}
@media (max-width:720px) {
  .dash-page-head { align-items:flex-start; }
  .dash-page-head p { font-size:13px; }
  .dash-primary { width:44px; padding:0; justify-content:center; }
  .dash-primary span { display:none; }
  .dash-toolbar { padding:14px; }
  .dash-toolbar .dash-actions { flex-wrap:nowrap; width:100%; overflow-x:auto; }
  .dash-wrap .dash-timeline .tl-row { flex-wrap:wrap; }
}
@media (max-width:480px) {
  .dash-page-head h2 { font-size:28px; }
  .dash-state { align-items:flex-start; flex-wrap:wrap; }
  .dash-state .vs-btn { width:100%; margin:0; justify-content:center; }
}
@media (prefers-reduced-motion:reduce) {
  .dash-skeleton__bar,.dash-skeleton__cards i,.dash-skeleton__panels i { animation:none; }
}
/* == DASH:END ================================================================ */

/* == POS-CL-REFRESH:BEGIN ===================================================
   POS → VIRCANSA_OS Component Library 12.04.02 mapping.
   Vanilla component adapter plus POS composition, token-bridged to app.css.
   Shared `vs-*` primitives own component appearance; `pos-*` selectors only
   arrange those primitives inside the register. Design intent is a quieter,
   structured, tabular
   editorial treatment — restrained ink/dark hero (spec 11), mono-style
   eyebrows, pastel Fresh Tags, concentric radii, soft shadows over hard
   borders. NO Fivo / Geist Mono (Geist-only + tabular-nums). No literal `* /`
   inside comments.
   Scope prefix: .content--pos (on #view) to win the cascade cleanly.
   ─────────────────────────────────────────────────────────────────────── */

/* Library→app bridge tokens (--primary-contrast, --text-on-dark, --bg-ink,
   --space-5/7, --shadow-focus, --shadow-focus-brand) kini didefinisikan global
   di app.css § "library bridge" — bukan lagi milik blok POS ini. */

/* VIRCANSA_OS vanilla component adapter.
   The source library exports React primitives while production admin uses
   vanilla DOM. Page-specific .pos-* classes remain composition hooks only. */
.vs-card { position:relative; box-sizing:border-box; color:var(--text-body); background:var(--surface-0); border:1px solid var(--border-default); border-radius:var(--radius-md); transition:border-color .18s ease, box-shadow .18s ease, transform .18s ease; }
.vs-card--card { box-shadow:var(--shadow-card); }
.vs-card--flat { box-shadow:none; }
.vs-card--p0 { padding:0; }
.vs-card--p-sm { padding:var(--space-5); }
.vs-card--p-md { padding:var(--space-7); }
.vs-card--ink { color:var(--text-on-dark); background:var(--bg-ink); border-color:transparent; }
.vs-card--interactive { cursor:pointer; }
.vs-card--interactive:hover { border-color:var(--ink-200); box-shadow:var(--shadow-pop); transform:translateY(-2px); }

.vs-btn, .vs-iconbtn { appearance:none; display:inline-flex; align-items:center; justify-content:center; gap:8px; min-height:44px; border:1px solid transparent; border-radius:var(--radius-sm); font:600 13px/1 var(--font-body); cursor:pointer; transition:background .16s ease, border-color .16s ease, color .16s ease, box-shadow .16s ease, transform .04s ease; }
.vs-btn { padding:0 16px; }
.vs-btn--sm { min-height:36px; padding:0 12px; border-radius:var(--radius-xs); font-size:12px; }
.vs-btn--primary { color:var(--primary-contrast); background:var(--primary); border-color:var(--primary); }
.vs-btn--primary:hover:not(:disabled) { background:var(--primary-hover); border-color:var(--primary-hover); }
.vs-btn--secondary { color:var(--text-strong); background:var(--surface-0); border-color:var(--border-input); }
.vs-btn--secondary:hover:not(:disabled) { background:var(--surface-1); border-color:var(--ink-300); }
.vs-btn--ghost { color:var(--text-muted); background:transparent; }
.vs-btn--ghost:hover:not(:disabled) { color:var(--text-strong); background:var(--surface-1); }
.vs-iconbtn { width:44px; padding:0; color:var(--text-strong); background:var(--surface-0); border-color:var(--border-input); }
.vs-iconbtn--sm { width:36px; min-height:36px; border-radius:var(--radius-xs); }
.vs-btn:active:not(:disabled), .vs-iconbtn:active:not(:disabled) { transform:translateY(.5px); }
.vs-btn:focus-visible, .vs-iconbtn:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.vs-btn:disabled, .vs-iconbtn:disabled { opacity:.42; cursor:not-allowed; }

.vs-field { display:flex; flex-direction:column; gap:6px; min-width:0; }
.vs-field__label { font-size:10px; font-weight:600; letter-spacing:.04em; text-transform:uppercase; color:var(--text-subtle); }
.vs-field__control { width:100%; min-height:44px; box-sizing:border-box; padding:8px 12px; color:var(--text-strong); background:var(--surface-0); border:1px solid var(--border-input); border-radius:var(--radius-sm); font:500 13px/1.35 var(--font-body); transition:border-color .16s ease, box-shadow .16s ease, background .16s ease; }
.vs-field__control:hover:not(:disabled) { border-color:var(--ink-300); }
.vs-field__control:focus { outline:none; border-color:var(--ink-900); box-shadow:var(--shadow-focus); }
.vs-field__control:disabled, .vs-field__control[readonly] { color:var(--text-muted); background:var(--surface-1); }

.vs-tabs { display:flex; align-items:center; min-width:0; }
.vs-tabs--segmented { gap:2px; padding:3px; background:var(--surface-1); border:1px solid var(--border-default); border-radius:var(--radius-sm); }
.vs-tabs--underline { gap:2px; border-bottom:1px solid var(--border-default); }
.vs-tab { appearance:none; display:inline-flex; align-items:center; justify-content:center; gap:7px; min-height:40px; padding:0 13px; color:var(--text-muted); background:transparent; border:0; border-radius:var(--radius-xs); font:600 12.5px/1 var(--font-body); cursor:pointer; }
.vs-tabs--underline .vs-tab { border-radius:0; border-bottom:2px solid transparent; margin-bottom:-1px; }
.vs-tab:hover { color:var(--text-strong); }
.vs-tab[aria-selected="true"] { color:var(--text-strong); background:var(--surface-0); box-shadow:var(--shadow-xs); }
.vs-tabs--underline .vs-tab[aria-selected="true"] { background:transparent; border-bottom-color:var(--ink-900); box-shadow:none; }
.vs-tab:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
/* Badge di dalam tab (hitungan / penanda). Bagian kontrak VS.Tabs yang belum di-port. */
.vs-tab__badge { display:inline-grid; place-items:center; min-height:18px; padding:0 5px; border-radius:var(--radius-pill);
  background:var(--ink-100); color:var(--text-muted); font-family:var(--font-mono); font-size:10px; font-weight:600; }

/* Tab modul Workspace — geometri master Workspace.dc.html (VS.Tabs underline, 42px).
   Di-scope ke .ws-modtabs supaya .vs-tabs dasar (dipakai Dashboard & Bookings) TIDAK berubah. */
.ws-modtabs { gap:4px; margin-bottom:16px; overflow-x:auto; scrollbar-width:none; }
.ws-modtabs::-webkit-scrollbar { display:none; }
.ws-modtabs .vs-tab { min-height:42px; padding:11px 14px; gap:8px; font-size:14px; font-weight:600;
  color:var(--text-subtle); text-decoration:none; white-space:nowrap; }
.ws-modtabs .vs-tab:hover { color:var(--text-strong); }
.ws-modtabs .vs-tab[aria-selected="true"] { color:var(--ink-950); border-bottom-color:var(--ink-950); }

.vs-tag { display:inline-flex; align-items:center; gap:5px; min-height:26px; padding:3px 10px; border:1px solid var(--tag-neutral-border); border-radius:var(--radius-pill); color:var(--tag-neutral-text); background:var(--tag-neutral-bg); font:650 11px/1.2 var(--font-body); }
.vs-tag--sm { min-height:22px; padding:2px 8px; font-size:10px; }
.vs-tag--neutral { color:var(--tag-neutral-text); background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); }
.vs-tag--success { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.vs-tag--mint { color:var(--tag-mint-text); background:var(--tag-mint-bg); border-color:var(--tag-mint-border); }
.vs-tag--warning { color:var(--tag-warning-text); background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.vs-tag--danger { color:var(--tag-danger-text); background:var(--tag-danger-bg); border-color:var(--tag-danger-border); }
.vs-tag--blue { color:var(--tag-blue-text); background:var(--tag-blue-bg); border-color:var(--tag-blue-border); }
.vs-tag--info { color:var(--tag-info-text); background:var(--tag-info-bg); border-color:var(--tag-info-border); }
.vs-tag--orange { color:var(--tag-orange-text); background:var(--tag-orange-bg); border-color:var(--tag-orange-border); }
.vs-tag--purple { color:var(--tag-purple-text); background:var(--tag-purple-bg); border-color:var(--tag-purple-border); }
.vs-tag--pink { color:var(--tag-pink-text); background:var(--tag-pink-bg); border-color:var(--tag-pink-border); }
.vs-tag--identity { color:var(--tag-identity-text); background:var(--tag-identity-bg); border-color:var(--tag-identity-border); }
.vs-tag__dot { width:6px; height:6px; border-radius:var(--radius-pill); background:currentColor; flex:0 0 auto; }

/* ViewBar — baris chip "VIEWS" pada unit GUI/12/TOOLBAR (Filtering) · port 1:1.
   Dipakai bersama oleh papan Timeline & grid resource Kalender ("Tampilan resource").
   Warna, radius, tipografi, dan fokus dari token; padding chip mengikuti angka unit
   (6/13px) seperti reproduksi .vs-tag/.vs-tab. */
.vs-viewbar { display:flex; min-width:0; align-items:center; gap:var(--space-3); flex-wrap:wrap; }
.vs-viewbar__label { flex:0 0 auto; margin-right:2px; color:var(--text-subtle); font:var(--fw-semibold,600) 10.5px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.vs-viewbar__list { display:flex; min-width:0; flex:1 1 auto; align-items:center; gap:var(--space-2); flex-wrap:wrap; }
.vs-viewchip {
  display:inline-flex; max-width:100%; align-items:center; gap:7px; padding:6px 13px;
  color:var(--text-muted); background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--radius-pill,100px); cursor:pointer;
  font:var(--fw-medium,500) 12.5px var(--font-body);
  transition:color .12s ease,background .12s ease,border-color .12s ease;
}
.vs-viewchip:hover { color:var(--text-strong); border-color:var(--border-strong); }
.vs-viewchip:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.vs-viewchip > svg { flex:0 0 auto; }
.vs-viewchip > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.vs-viewchip[aria-selected="true"],.vs-viewchip.is-on {
  color:var(--primary-contrast); background:var(--primary); border-color:var(--primary);
  font-weight:var(--fw-semibold,600);
}
/* Hitungan = badge mono unit (ink fill). Di chip aktif warnanya dibalik agar tetap terbaca. */
.vs-viewchip__n {
  display:inline-flex; min-width:18px; height:18px; flex:0 0 auto; align-items:center; justify-content:center;
  padding:0 5px; color:var(--primary-contrast); background:var(--primary);
  border-radius:var(--radius-pill,100px); font:var(--fw-bold,700) 10.5px var(--font-mono); font-style:normal;
}
.vs-viewchip[aria-selected="true"] .vs-viewchip__n { color:var(--primary); background:var(--primary-contrast); }
.vs-viewchip--add { color:var(--text-muted); background:transparent; border-style:dashed; border-color:var(--ink-300); font-weight:var(--fw-semibold,600); }
.vs-viewchip--add:hover { color:var(--text-strong); border-color:var(--ink-900); }
.vs-viewchip__x { display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto; margin-left:2px; padding:1px; border-radius:var(--radius-pill,100px); color:currentColor; cursor:pointer; opacity:.7; }
.vs-viewchip__x:hover,.vs-viewchip__x:focus-visible { opacity:1; color:var(--tag-danger-text); background:var(--tag-danger-bg); outline:none; }
/* Penempatan per konteks — komponennya sendiri sengaja TANPA margin, jadi tiap
   pemakai yang mengatur jaraknya (dulu margin ini menempel di .cal-resource-controls
   yang sudah dicabut, akibatnya bar menempel ke tabel). */
.sched-calendar-frame > .vs-viewbar { margin-bottom:var(--space-4); }
.sched-calendar-toolbar > .vs-viewbar { flex:1 1 auto; min-width:0; }
/* Layar sempit: chip menggulir mendatar (sama dengan bar brand), bukan menumpuk
   jadi enam baris yang menghabiskan tinggi layar. */
@media (max-width:760px) {
  .vs-viewbar__list { flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none; }
  .vs-viewbar__list::-webkit-scrollbar { display:none; }
  .vs-viewbar__list > .vs-viewchip { flex:0 0 auto; }
}
/* Card accent — 3px Identity-Yellow top rule (library Card `accent`) */
.vs-card--accent { border-top:3px solid var(--identity-yellow); }

/* StatCard (library surfaces/StatCard.jsx — .vs-stat) · port 1:1, token-bridged */
.vs-stat { display:flex; flex-direction:column; gap:10px; }
.vs-stat__top { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.vs-stat__label { font-family:var(--font-mono); font-size:11px; letter-spacing:var(--ls-label-sm); text-transform:uppercase; color:var(--text-subtle); }
.vs-stat__icon { display:inline-flex; align-items:center; justify-content:center; width:34px; height:34px; border-radius:var(--radius-xs); background:var(--ink-050); color:var(--text-strong); flex:0 0 auto; }
.vs-stat__icon svg { width:18px; height:18px; }
.vs-stat__value { font-family:var(--font-display); font-weight:700; font-size:32px; line-height:1; letter-spacing:-0.02em; color:var(--text-strong); font-variant-numeric:tabular-nums; }
.vs-stat__foot { display:flex; align-items:center; gap:6px; font-size:13px; color:var(--text-muted); }
.vs-stat__delta { display:inline-flex; align-items:center; gap:3px; font-weight:600; font-variant-numeric:tabular-nums; }
.vs-stat__delta svg { width:14px; height:14px; }
.vs-stat__delta--up { color:var(--accent-mint); }
.vs-stat__delta--down { color:var(--accent-red); }
/* Varian di atas permukaan ink (Card ink) */
.vs-card--ink .vs-stat__label { color:var(--text-on-dark-muted); }
.vs-card--ink .vs-stat__value { color:var(--text-on-dark); }
.vs-card--ink .vs-stat__icon { background:rgba(255,255,255,.10); color:var(--identity-yellow); }
.vs-card--ink .vs-stat__foot { color:var(--text-on-dark-muted); }
.vs-avatar { display:inline-grid; place-items:center; flex:none; width:36px; height:36px; border:1px solid var(--border-default); border-radius:var(--radius-pill); color:var(--text-muted); background:var(--surface-1); font:700 12px/1 var(--font-body); }

.vs-alert { display:flex; align-items:flex-start; gap:10px; padding:11px 13px; border:1px solid; border-radius:var(--radius-sm); font-size:12px; line-height:1.5; }
.vs-alert--warning { color:var(--tag-warning-text); background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.vs-alert--success { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.vs-alert--info { color:var(--tag-blue-text); background:var(--tag-blue-bg); border-color:var(--tag-blue-border); }
.vs-dialog { background:var(--surface-0); border:1px solid var(--border-default); border-radius:var(--radius-lg); box-shadow:var(--shadow-pop); }

/* ── Shared library primitives (eyebrows, tabular figures, surfaces) ─────── */
.content--pos .pos-mini-label,
.content--pos .pos-card > .pos-mini-label,
.content--pos .pos-preview-head .pos-mini-label {
  font-size:10px; font-weight:650; letter-spacing:.1em; text-transform:uppercase;
  color:var(--text-subtle); font-variant-numeric:tabular-nums;
}
.content--pos .mono,
.content--pos .pos-docnum-input,
.content--pos .pos-line-total,
.content--pos .pos-sum-row b,
.content--pos .pos-foot-total strong,
.content--pos .pqr-code,
.content--pos .pos-method-dp b { font-variant-numeric:tabular-nums; letter-spacing:0; }
/* Section eyebrow used across P1–P4 cards */
.content--pos .pos-card__head .pos-mini-label { margin:0; }

/* ═══ P1 — App Shell · Brand Switcher · Booking Queue · Register Header ═══ */

/* App Shell — canvas + panels: library uses app-bg canvas with soft-shadow cards */
.content.content--pos { background:var(--app-bg); }
.content--pos .pos-queue { background:var(--surface-0); border:1px solid var(--line-200); box-shadow:var(--shadow-card); }
.content--pos .pos-panel-head { border-bottom:1px solid var(--line-100); }
.content--pos .pos-panel-head h2 { font-size:14px; font-weight:700; letter-spacing:-.01em; color:var(--text-strong); }
.content--pos .pos-panel-head span { font-size:11px; color:var(--text-subtle); font-variant-numeric:tabular-nums; }

/* Brand Switcher — gradient hologram + thumb geser; lihat blok utama .pos-hdr-brands.
   (override lama solid-ink dihapus agar tampilan gradient tidak tertimpa) */
.content--pos .pos-hdr-brands .pos-brand-pill { font-weight:700; }
.content--pos .pos-hdr-brands .pos-brand-pill:hover:not(.active):not(:disabled) { background:transparent; }
.content--pos .pos-hdr-brands .pos-brand-pill.active { background:transparent; }

/* Queue tabs — underline tabs (library 08 Navigation) */


/* Queue search + all-brand toggle */
.content--pos .pos-queue-search { border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-50); }

/* Quick-jump bento — outline icon cells */
.content--pos .pos-qj-bento { border-bottom:1px solid var(--line-100); }
.content--pos .pos-qj-cell { border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-muted); transition:border-color .14s, color .14s, background .14s, transform .08s; }
.content--pos .pos-qj-cell:hover:not(:disabled) { border-color:var(--ink-950); color:var(--text-strong); background:var(--surface-50); }
.content--pos .pos-qj-cell:active:not(:disabled) { transform:scale(.96); }

/* Queue legend dots */


/* Booking Queue card (.pqr) — library list-row treatment: 3px status accent,
   avatar-less tight grid, tabular code, quiet borders, ink active ring */

.content--pos .pqr-top b { font-size:12.5px; font-weight:650; color:var(--text-strong); }
.content--pos .pqr-top em, .content--pos .pqr-code { color:var(--text-subtle); font-size:10.5px; }
.content--pos .pqr-client b { font-size:12px; color:var(--text-strong); }
.content--pos .pqr-when, .content--pos .pqr-when span { color:var(--text-muted); font-size:11px; }
.content--pos .pqr-chip {
  display:inline-flex; align-items:center; font-size:9.5px; letter-spacing:.02em; padding:2px 7px; border-radius:var(--radius-pill);
  background:var(--surface-50); border:1px solid var(--line-200); color:var(--text-muted); font-variant-numeric:tabular-nums;
}

/* Register Header — Context card: doc type segmented, doc number mono, actions */
.content--pos .pos-ctxcard .pos-context-id { color:var(--text-subtle); font-size:11px; letter-spacing:.02em; font-variant-numeric:tabular-nums; }
.content--pos .pos-ctxcard__name { font-family:inherit; font-weight:800; letter-spacing:-.02em; color:var(--text-strong); }
.content--pos .pos-mode-seg.seg { background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-sm); padding:3px; gap:2px; }
.content--pos .pos-mode-seg .seg-btn { border:none; background:transparent; color:var(--text-muted); font-size:12px; font-weight:600; border-radius:var(--radius-xs); }
.content--pos .pos-mode-seg .seg-btn.active { background:var(--surface-0); color:var(--text-strong); box-shadow:var(--shadow-xs); }
.content--pos .pos-docnum { display:inline-flex; align-items:center; gap:4px; }
.content--pos .pos-docnum-input { background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-xs); color:var(--text-strong); font-size:11.5px; }
.content--pos .pos-mini-edit { border:1px solid var(--line-200); border-radius:var(--radius-xs); background:var(--surface-0); color:var(--text-muted); width:26px; height:26px; display:grid; place-items:center; cursor:pointer; }
.content--pos .pos-mini-edit:hover { border-color:var(--ink-400); color:var(--text-strong); }

/* ═══ P2 — Customer · Detail form · Quick Catalog · Cart · Options ═══ */

/* Customer identity chip (linked) — avatar + tier tag (library customer selector) */
.content--pos .pos-ident--linked { display:flex; align-items:center; gap:11px; padding:11px 12px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-50); }
.content--pos .pos-ident-avatar {
  width:36px; height:36px; border-radius:var(--radius-pill); flex:none; display:grid; place-items:center;
  background:var(--ink-050); border:1px solid var(--line-200); color:var(--ink-700); font-size:12px; font-weight:700;
  letter-spacing:.02em; font-variant-numeric:tabular-nums;
}
.content--pos .pos-ident--linked .pos-ident-main { flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
.content--pos .pos-ident-tagrow { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.content--pos .pos-ident-tag { display:inline-flex; align-items:center; gap:4px; font-size:10px; font-weight:650; letter-spacing:.02em; color:var(--pst-success-text); }
.content--pos .pos-ident-tier {
  display:inline-flex; align-items:center; font-size:9px; letter-spacing:.04em; text-transform:uppercase; padding:2px 7px;
  border-radius:var(--radius-pill); background:var(--pst-info-bg,var(--surface-50)); border:1px solid var(--pst-info-border,var(--line-200)); color:var(--pst-info-text,var(--text-muted));
}
.content--pos .pos-ident--linked .pos-ident-main b { font-size:13.5px; font-weight:650; color:var(--text-strong); }
.content--pos .pos-ident--linked .pos-ident-main .mono { font-size:11px; color:var(--text-subtle); }

/* Detail booking form — library form fields */
.content--pos .pos-detailcard .frow > label { font-size:10px; font-weight:600; letter-spacing:.03em; text-transform:uppercase; color:var(--text-subtle); }
.content--pos .pos-detail-sum { color:var(--text-subtle); font-variant-numeric:tabular-nums; }

/* Quick Catalog — category chips + product card grid + count badge */
.content--pos .pos-cat-chip { border:1px solid var(--line-200); border-radius:var(--radius-pill); background:var(--surface-0); color:var(--text-muted); font-weight:600; }
.content--pos .pos-cat-chip:hover:not(.active) { border-color:var(--ink-400); color:var(--text-strong); }
.content--pos .pos-cat-chip.active { background:var(--ink-950); color:#fff; border-color:var(--ink-950); }
.content--pos .pos-cat-chip em { color:inherit; opacity:.62; font-variant-numeric:tabular-nums; }
.content--pos .pos-cat-sep { display:inline-flex; align-items:center; gap:5px; font-size:10px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; color:var(--text-subtle); padding:0 4px; }
.content--pos .pos-product {
  min-height:76px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0);
  padding:12px 12px 12px 14px; box-shadow:none; transition:border-color .14s, box-shadow .14s, transform .08s;
}
.content--pos .pos-product::before { width:3px; background:var(--prod-tone,var(--line-200)); }
.content--pos .pos-product:hover { border-color:var(--ink-400); box-shadow:var(--shadow-card); }
.content--pos .pos-product:active { transform:scale(.985); }
.content--pos .pos-product b { font-size:13px; font-weight:600; color:var(--text-strong); }
.content--pos .pos-product span { color:var(--text-muted); font-size:11.5px; }
/* whole card acts as add button → quiet "+ Tambah" affordance (library) */
.content--pos .pos-product::after {
  content:'+ Tambah'; align-self:flex-start; margin-top:2px; font-size:11px; font-weight:600; color:var(--text-subtle);
  padding:4px 9px; border:1px solid var(--line-200); border-radius:var(--radius-xs); background:var(--surface-50); transition:background .14s, color .14s, border-color .14s;
}
.content--pos .pos-product:hover::after { background:var(--surface-0); color:var(--text-strong); border-color:var(--ink-400); }
/* in-cart state (JS adds .is-incart + data-qty) → dark "Keranjang · n" pill */
.content--pos .pos-product.is-incart { border-color:var(--ink-300,var(--line-200)); background:var(--surface-50); }
.content--pos .pos-product.is-incart::after {
  content:'✓ Keranjang · ' attr(data-qty); background:var(--ink-950); color:#fff; border-color:var(--ink-950);
}
.content--pos .pos-prod-kind { font-size:9.5px; font-weight:700; text-transform:uppercase; letter-spacing:.06em; color:var(--text-subtle); }

/* Add-item button count badge (JS: #posCartCount) */
.content--pos .pos-addbtn { position:relative; }
.content--pos .pos-addbtn-badge {
  display:none; min-width:18px; height:18px; padding:0 5px; margin-left:2px; border-radius:var(--radius-pill);
  background:rgba(0,0,0,.22); color:inherit; font-size:10.5px; font-weight:700; align-items:center; justify-content:center; font-variant-numeric:tabular-nums;
}
.content--pos .pos-addbtn-badge:not(:empty) { display:inline-flex; }

/* Cart line — library line-item: quiet surface, qty/duration steppers, tabular total */
.content--pos .pos-line { border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); }
.content--pos .pos-line::before { width:3px; background:var(--ln-tone,var(--line-200)); }
.content--pos .pos-line-name { font-weight:600; color:var(--text-strong); }
.content--pos .pos-line-total { color:var(--text-strong); font-weight:700; font-variant-numeric:tabular-nums; }
.content--pos .pos-line-total small { color:var(--text-subtle); font-weight:600; }
.content--pos .pos-line-del { border:1px solid var(--line-200); border-radius:var(--radius-xs); background:var(--surface-0); color:var(--text-muted); }
.content--pos .pos-line-del:hover { border-color:var(--pst-danger-border,var(--hot-red)); background:var(--pst-danger-bg); color:var(--pst-danger-text,var(--hot-red)); }
.content--pos .pos-line-mini > span { font-size:9.5px; font-weight:600; text-transform:uppercase; letter-spacing:.04em; color:var(--text-subtle); }
.content--pos .pos-stepper { display:inline-flex; align-items:center; border:1px solid var(--border-input); border-radius:var(--radius-xs); overflow:hidden; background:var(--surface-0); }
.content--pos .pos-stepper .pos-step { width:44px; min-width:44px; min-height:44px; border:none; background:transparent; color:var(--text-strong); cursor:pointer; font-size:15px; line-height:1; }
.content--pos .pos-stepper .pos-step:hover { background:var(--surface-50); }
.content--pos .pos-stepper .ctrl, .content--pos .pos-stepper .vs-field__control { border:0; text-align:center; background:transparent; box-shadow:none; }
.content--pos .pos-line-paxinfo { font-size:9.5px; color:var(--text-subtle); }
.content--pos .pos-line-paxinfo.is-over { color:var(--pst-warning-text); font-weight:600; }
.content--pos .pos-line-sched { border-top:1px dashed var(--line-200); }
.content--pos .pos-line-sched-tag { color:var(--text-muted); font-weight:600; }
.content--pos .pos-line-schedbtn { border:1px dashed var(--line-200); border-radius:var(--radius-pill); background:var(--surface-0); color:var(--text-muted); }
.content--pos .pos-line-schedbtn:hover { border-color:var(--ink-950); color:var(--text-strong); border-style:solid; }

/* Studio Option Selector — pill options, selected = dark */
.content--pos #posOptionBox .pos-line-sched-tag { color:var(--text-strong); }

/* Empty states (cart / catalog / queue) — library empty pattern */
.content--pos .pos-empty { border:1px dashed var(--line-200); border-radius:var(--radius-sm); color:var(--text-subtle); background:var(--surface-50); }
.content--pos .pos-empty b { color:var(--text-muted); }

/* ═══ P3 — Billing Summary · Voucher · Payment method · Status · Verify ═══ */

/* Total hero — RESTRAINED DARK INK CARD (spec 11 + library checkout hero).
   Replaces the expressive per-brand gradient; keeps a 3px brand accent strip
   at the top for identity, tabular white total. Overrides deep 12.37 rules. */
.content--pos .pos-detail-total,
.content--pos .pos-detail .pos-detail-total {
  background:var(--ink-950); border:1px solid var(--ink-950); border-radius:var(--radius-md);
  box-shadow:var(--shadow-card); position:relative; overflow:hidden;
}
.content--pos .pos-detail-total::before {
  content:''; position:absolute; left:0; right:0; top:0; height:3px; background:var(--brand-accent,var(--identity-yellow));
}
.content--pos .pos-detail-total .pos-foot-total span { color:rgba(255,255,255,.55); font-size:10px; letter-spacing:.1em; text-transform:uppercase; font-variant-numeric:tabular-nums; }
.content--pos .pos-detail .pos-detail-total .pos-foot-total strong { color:#fff; font-weight:800; letter-spacing:-.02em; font-variant-numeric:tabular-nums; }
.content--pos .pos-detail-total .pos-total-due { color:rgba(255,255,255,.72); font-size:11.5px; font-variant-numeric:tabular-nums; }
.content--pos .pos-detail-total .pos-total-due.is-partial { color:#FFD166; }
.content--pos .pos-detail-total .pos-total-due.is-paid { color:#7CE0B0; }
.content--pos .pos-detail-total__ico { background:rgba(255,255,255,.1); border-radius:var(--radius-xs); color:#fff; }

/* Billing Summary rows — tabular, quiet dividers, emphasized total, pst due */
.content--pos .pos-summary { border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.content--pos .pos-sum-row { border-bottom:1px solid var(--line-100); font-size:12.5px; color:var(--text-muted); }
.content--pos .pos-sum-row span { color:var(--text-muted); }
.content--pos .pos-sum-row b { color:var(--text-strong); font-variant-numeric:tabular-nums; }
.content--pos .pos-sum-row.total { background:var(--surface-50); color:var(--text-strong); font-weight:700; }
.content--pos .pos-sum-row.total b { font-size:13px; }
.content--pos .pos-sum-row.due { background:var(--pst-warning-bg); color:var(--pst-warning-text); font-weight:700; }
.content--pos .pos-sum-row.due b { color:var(--pst-warning-text); }
/* voucher line → inline tag chip via JS wraps code in .pos-sum-vtag */
.content--pos .pos-sum-vtag { display:inline-flex; align-items:center; margin-left:6px; font-size:9px; letter-spacing:.04em; padding:2px 7px; border-radius:var(--radius-pill); background:var(--identity-yellow-soft,#FFFDE6); border:1px solid var(--identity-yellow-shadow,#E6DC00); color:var(--ink-900); }

/* Summary action buttons */
.content--pos .pos-sum-actions .abtn { border-radius:var(--radius-sm); }

/* Method summary tile */
.content--pos .pos-method-summary { background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.content--pos .pos-method-ico { background:var(--ink-950); border-radius:var(--radius-xs); color:#fff; }
.content--pos .pos-method-txt b { color:var(--text-strong); }
.content--pos .pos-method-txt span { color:var(--text-subtle); }
.content--pos .pos-method-dp b { color:var(--text-strong); font-variant-numeric:tabular-nums; }

/* Payment method selector — library 18 method tiles (icon + label + desc + radio) */
.content--pos .pos-pay-methods { display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:10px; }
.content--pos .pos-pay-method { display:flex; flex-direction:column; gap:9px; padding:13px 14px; border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); cursor:pointer; text-align:left; font-family:var(--font-body); transition:border-color .14s ease, box-shadow .14s ease; }
.content--pos .pos-pay-method:hover:not(.active) { border-color:var(--ink-400); }
/* background/border explicit: overrides dead legacy .pos-pay-methods button.active
   (segmented control, blocks ~1097/1717) that otherwise paints the tile ink-black. */
.content--pos .pos-pay-methods .pos-pay-method { background:var(--surface-0); }
.content--pos .pos-pay-methods .pos-pay-method.active { background:var(--surface-0); border-color:var(--ink-950); box-shadow:0 0 0 1px var(--ink-950); color:var(--text-strong); }
.content--pos .pos-pay-method__top { display:flex; align-items:center; justify-content:space-between; color:var(--text-body); }
.content--pos .pos-pay-method__radio { width:16px; height:16px; flex:none; border-radius:var(--radius-pill); border:1.5px solid var(--ink-300); position:relative; transition:border-color .14s ease; }
.content--pos .pos-pay-method.active .pos-pay-method__radio { border-color:var(--ink-950); }
.content--pos .pos-pay-method.active .pos-pay-method__radio::after { content:''; position:absolute; inset:0; margin:auto; width:8px; height:8px; border-radius:var(--radius-pill); background:var(--ink-950); }
.content--pos .pos-pay-method__txt { display:flex; flex-direction:column; gap:1px; min-width:0; }
.content--pos .pos-pay-method__txt b { font-size:13.5px; font-weight:600; color:var(--text-strong); }
.content--pos .pos-pay-method__txt span { font-size:11px; color:var(--text-subtle); line-height:1.35; }

/* DP quick chips — pill; active dark */
.content--pos .pos-dp-chip { border:1px solid var(--line-200); border-radius:var(--radius-pill); background:var(--surface-0); color:var(--text-muted); }
.content--pos .pos-dp-chip:hover:not(.active) { border-color:var(--ink-400); color:var(--text-strong); }
.content--pos .pos-dp-chip.active { background:var(--ink-950); border-color:var(--ink-950); color:#fff; }

/* Cash keypad + kembalian + QRIS waiting (JS renders into #posPayExtra) */
.content--pos .pos-pay-extra { display:flex; flex-direction:column; gap:10px; margin-top:12px; }
.content--pos .pos-cash-label { font-size:10px; font-weight:650; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.content--pos .pos-cash-quick { display:grid; grid-template-columns:repeat(2,1fr); gap:8px; }
.content--pos .pos-cash-quick button {
  height:38px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-strong);
  font-size:12.5px; font-weight:600; cursor:pointer; font-variant-numeric:tabular-nums; transition:border-color .14s, background .14s;
}
.content--pos .pos-cash-quick button:hover { border-color:var(--ink-400); background:var(--surface-50); }
.content--pos .pos-cash-change { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:14px 16px; background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.content--pos .pos-cash-change .pos-cash-change-l { display:flex; flex-direction:column; gap:1px; }
.content--pos .pos-cash-change .pos-cash-received { font-size:12px; color:var(--text-muted); font-variant-numeric:tabular-nums; }
.content--pos .pos-cash-change .pos-cash-label { letter-spacing:.1em; }
.content--pos .pos-cash-change strong { font-size:24px; font-weight:700; color:var(--text-strong); font-variant-numeric:tabular-nums; letter-spacing:-0.01em; }
.content--pos .pos-qris-wait { display:flex; align-items:center; gap:11px; padding:13px 15px; background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.content--pos .pos-qris-txt { flex:1; min-width:0; }
.content--pos .pos-qris-txt b { display:block; font-size:12.5px; color:var(--text-strong); }
.content--pos .pos-qris-txt span { font-size:11px; color:var(--text-subtle); }
.content--pos .pos-qris-badge { flex:none; font-size:9.5px; letter-spacing:.06em; padding:3px 8px; border-radius:var(--radius-pill); background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border); color:var(--pst-warning-text); white-space:nowrap; }

/* Payment Status chip + kebab override menu */
.content--pos .pos-status-chip { gap:5px; font-size:11.5px; }
.content--pos .pos-status-chip.is-paid { color:var(--tag-success-text); background:var(--tag-success-bg); border-color:var(--tag-success-border); }
.content--pos .pos-status-chip.is-partial { color:var(--tag-warning-text); background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.content--pos .pos-status-chip.is-unpaid, .content--pos .pos-status-chip.is-draft { color:var(--tag-neutral-text); background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); }
.content--pos .pos-status-chip.is-sent { color:var(--tag-blue-text); background:var(--tag-blue-bg); border-color:var(--tag-blue-border); }
.content--pos .pos-status-chip.is-void { color:var(--tag-danger-text); background:var(--tag-danger-bg); border-color:var(--tag-danger-border); }
.content--pos .pos-status-chip .pos-status-auto, .content--pos .pos-status-chip .pos-status-manual { font-style:normal; font-size:9px; text-transform:uppercase; letter-spacing:.05em; opacity:.7; }
.content--pos .pos-kebab { border:1px solid var(--line-200); border-radius:var(--radius-xs); background:var(--surface-0); color:var(--text-muted); }
.content--pos .pos-kebab:hover { border-color:var(--ink-400); color:var(--text-strong); }
.content--pos .pos-kebab-menu { background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-sm); box-shadow:var(--shadow-pop,var(--shadow-card)); }

/* Payment Verification alert (JS: #posVerifyAlert → library Alert warning) */
.content--pos .pos-verify-alert { margin-top:12px; font-size:11.5px; }
.content--pos .pos-verify-alert svg { flex:none; margin-top:1px; }
.content--pos .pos-verify-alert.is-verified { background:var(--pst-success-bg); border-color:var(--pst-success-border); color:var(--pst-success-text); }

/* ═══ P4 — Document preview · Actions · Dialogs · Feedback ═══ */

/* Document preview — WA text + visual receipt */
.content--pos .pos-doc-toggle { border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-0); color:var(--text-strong); }
.content--pos .pos-doc-sum { color:var(--text-subtle); }
.content--pos .pos-preview-head .seg { background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-sm); padding:3px; }
.content--pos .pos-preview-head .seg-btn { border:none; background:transparent; color:var(--text-muted); border-radius:var(--radius-xs); font-weight:600; }
.content--pos .pos-preview-head .seg-btn.active { background:var(--surface-0); color:var(--text-strong); box-shadow:var(--shadow-xs); }
.content--pos .pos-wa-text { background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-sm); color:var(--text-muted); font-variant-numeric:tabular-nums; }
/* `:not(.vs-receipt)` — selektor dua-kelas ini (0,2,0) mengalahkan .vs-receipt (0,1,0)
   dan diam-diam memaksa radius struk kanonik kembali ke --radius-sm. Batasi ke kartu lama. */
.content--pos .pos-receipt-card:not(.vs-receipt) { border:1px solid var(--line-200); border-radius:var(--radius-sm); }

/* Document actions row */
.content--pos .pos-action-grid .abtn { border-radius:var(--radius-sm); }

/* Dialogs / modals — library overlay */
.content--pos ~ .pos-modal .pos-modal__card,
.pos-modal .pos-modal__card { border-radius:var(--radius-lg); box-shadow:var(--shadow-pop,var(--shadow-card)); }
.pos-modal .pos-modal__head { border-bottom:1px solid var(--line-100); }
.pos-modal .pos-modal__title b { font-family:inherit; font-weight:800; color:var(--text-strong); }
.pos-modal .pos-modal__title span { color:var(--text-subtle); }
.pos-modal .pos-modal__x { border:1px solid var(--border-input); border-radius:var(--radius-xs); background:var(--surface-0); color:var(--text-muted); }
.pos-modal .pos-modal__x:hover { border-color:var(--ink-400); color:var(--text-strong); background:var(--surface-50); }

/* Feedback — inline invalid, validation checklist (library Alert) */
.content--pos .pos-invalid { border-color:var(--pst-danger-border,var(--hot-red)) !important; box-shadow:0 0 0 3px var(--pst-danger-bg) !important; }
.content--pos .pos-validate-hint { border:1px solid var(--pst-warning-border); background:var(--pst-warning-bg); border-radius:var(--radius-sm); }
.content--pos .pos-validate-hint span { color:var(--pst-warning-text); }

/* Min hit target 44px on icon-only controls (a11y) + reduced motion respect */
.content--pos .pos-qj-cell, .content--pos .pos-line-del, .content--pos .pos-mini-edit, .content--pos .pos-kebab { min-width:44px; min-height:44px; }
.content--pos .vs-btn--sm, .content--pos .vs-iconbtn--sm, .pos-modal .vs-btn--sm, .pos-modal .vs-iconbtn--sm { min-height:44px; }
.content--pos .vs-iconbtn--sm, .pos-modal .vs-iconbtn--sm { width:44px; }

/* Queue tab strip (Booking · Trx · Invoice) sits in a ~228px rail. The generic
   .vs-tabs primitive is display:flex, so the three tabs sized to content and
   overflowed the rail — the "Invoice" tab clipped to "Invo…". Distribute them
   as equal, shrinkable columns (POSQ1's original grid intent) so all three fit. */

@media (max-width:760px){
  .content--pos .pos-qj-cell { min-height:44px; }
  .content--pos .pos-hdr-brands .pos-brand-pill { min-height:40px; }
}
@media (prefers-reduced-motion:reduce){
  .content--pos .pos-product, .content--pos .pos-qj-cell { transition:none; }
}

/* Responsive 3 → 2 → 1 columns (library layout requirement). POSQ1 re-added a
   non-media 3-col grid that otherwise forces 3 columns at every width and
   crushes register/detail on tablet & mobile — re-establish the collapse here
   (higher specificity + last in file → wins), and release the full-height /
   inner-scroll constraints so stacked columns size to content. */
@media (max-width:1200px){
  .content--pos .pos-shell.pos-shell--3col { grid-template-columns:minmax(0,1fr) minmax(0,1.5fr); }
  .content--pos .pos-shell--3col .pos-detail { grid-column:1 / -1; position:static; height:auto; max-height:none; }
  /* Release the register's sticky pin + fixed 100dvh height at 2-col. The
     register is `position:sticky` for the 3-col desktop rail; once .pos-detail
     drops to a full-width row BELOW it, a still-sticky register floats on top
     of (overlaps ~580px into) that detail row while scrolling. Make it a
     natural, content-sized column like the ≤860 rule already does. */
  .content--pos .pos-shell--3col .pos-register { position:static; height:auto; max-height:none; }
  .content--pos .pos-reg-body { overflow:visible; }
  .content--pos .pos-cartcard { min-height:0; }
  .content--pos .pos-cartcard .pos-cart { overflow:visible; }
}
@media (max-width:860px){
  .content--pos .pos-shell.pos-shell--3col { grid-template-columns:1fr; }
  .content--pos .pos-shell--3col .pos-queue,
  .content--pos .pos-shell--3col .pos-register,
  .content--pos .pos-shell--3col .pos-detail { position:static; height:auto; max-height:none; grid-column:auto; }
  .content--pos .pos-reg-body { overflow:visible; }
  .content--pos .pos-cartcard { min-height:0; }
  .content--pos .pos-cartcard .pos-cart { overflow:visible; }
  .content--pos .pos-shell--3col .pos-queue-list { grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); }
}
/* == POS-CL-REFRESH:END ===================================================== */


/* == POS-KANTONG:BEGIN =======================================================
   POS "Kantong sesi" (Order session pockets) -> prototype "POS Booking Gateway".
   Pill-tab session switcher above the register + restyled block/policy options
   panel. Library 12.04.02 treatment, token-bridged (Geist-only + tabular-nums,
   concentric radii, soft shadows, pastel Fresh Tags). Additive; scoped to
   .content--pos. Hooks preserved: #posSessionTabs, #posOrderPanel, #posSessAdd,
   #posOrderAdd, #posOrderAddBlock, #posOrderSubmit, #posOrderClear,
   data-pos-block-*, data-pos-ord-del, data-pos-pricing.
   --------------------------------------------------------------------------- */
/* Fix (poskantong1): kolom Booking Queue membawa class .vs-card, dan
   .vs-card{position:relative} (didefinisikan lebih akhir di POS-CL-REFRESH)
   menimpa .pos-queue{position:sticky} sementara top:74px tetap berlaku →
   kolom queue turun 74px (area kosong di atas kartu). Tegaskan sticky lagi. */
.content--pos .pos-queue{ position:sticky; }

.content--pos .pos-sess-host[hidden]{ display:none; }
.content--pos .pos-sess-host{ margin:2px 0; }

/* --- pill-tab row (kantong sesi switcher) --- */
.content--pos .pos-sess-row{ display:flex; align-items:center; flex-wrap:wrap; gap:8px; }
.content--pos .pos-sess-kicker{ display:inline-flex; align-items:center; gap:6px; font:600 10px/1 var(--font-body); letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); margin-right:2px; }
.content--pos .pos-sess-kicker svg{ color:var(--text-subtle); }
.content--pos .pos-sess-tab{ display:inline-flex; align-items:center; gap:8px; padding:6px 12px 6px 7px; border:1px solid var(--line-200); border-radius:var(--radius-pill); background:var(--surface-0); color:var(--text-strong); font:600 12px/1 var(--font-body); font-variant-numeric:tabular-nums; cursor:default; transition:border-color .14s ease, background .14s ease, box-shadow .14s ease; }
.content--pos .pos-sess-tab__n{ display:inline-flex; align-items:center; justify-content:center; width:19px; height:19px; border-radius:var(--radius-pill); background:var(--ink-050); color:var(--text-muted); font:700 10px/1 var(--font-body); flex:none; }
.content--pos .pos-sess-tab__l{ max-width:150px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.content--pos .pos-sess-tab__badge{ display:inline-flex; align-items:center; justify-content:center; min-width:17px; height:17px; padding:0 5px; border-radius:var(--radius-pill); background:var(--identity-yellow); color:var(--ink-950); font:700 10px/1 var(--font-body); }
.content--pos .pos-sess-tab__x{ display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px; margin-left:1px; padding:0; border:0; border-radius:var(--radius-pill); background:transparent; color:var(--text-subtle); cursor:pointer; transition:background .14s ease, color .14s ease; }
.content--pos .pos-sess-tab__x:hover{ background:var(--pst-danger-bg); color:var(--pst-danger-text); }
.content--pos .pos-sess-tab--active{ background:var(--ink-950); border-color:var(--ink-950); color:#fff; box-shadow:var(--shadow-card); }
.content--pos .pos-sess-tab--active .pos-sess-tab__n{ background:var(--identity-yellow); color:var(--ink-950); }
.content--pos .pos-sess-tab--add{ padding:7px 13px; border:1px dashed var(--ink-300); background:var(--surface-0); color:var(--text-strong); cursor:pointer; gap:5px; transition:border-color .14s ease; }
.content--pos .pos-sess-tab--add:hover{ border-color:var(--ink-900); }
.content--pos .pos-sess-dot{ width:6px; height:6px; border-radius:var(--radius-pill); background:var(--pst-danger-text); flex:none; }
.content--pos .pos-sess-hint{ margin-left:auto; font:500 10.5px/1.3 var(--font-body); color:var(--text-subtle); }

/* --- options panel (blocks + dynamic-pricing policy) --- */
.content--pos .pos-sess-panel{ margin-top:2px; background:var(--surface-0); border:1px solid var(--line-200); border-top:3px solid var(--brand-accent); border-radius:var(--radius-md); box-shadow:var(--shadow-card); overflow:hidden; }
.content--pos .pos-sess-panel__hd{ display:flex; align-items:center; gap:12px; padding:13px 16px; border-bottom:1px solid var(--line-100); background:var(--surface-50); }
.content--pos .pos-sess-panel__hl{ display:flex; flex-direction:column; gap:2px; }
.content--pos .pos-sess-panel__title{ font:700 14px/1.2 var(--font-body); letter-spacing:-.01em; color:var(--text-strong); }
.content--pos .pos-sess-panel__sub{ font:500 11px/1.4 var(--font-body); color:var(--text-subtle); }
.content--pos .pos-sess-panel__body{ display:flex; flex-direction:column; gap:14px; padding:14px 16px; }

.content--pos .pos-sess-saved{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:9px 12px; border:1px solid var(--line-100); border-radius:var(--radius-sm); background:var(--surface-50); font:600 12px/1.2 var(--font-body); color:var(--text-muted); }
.content--pos .pos-sess-saved__amt{ font-variant-numeric:tabular-nums; color:var(--text-strong); }

.content--pos .pos-sess-primary{ display:flex; flex-direction:column; gap:4px; padding:11px 12px; border:1px solid var(--line-100); border-radius:var(--radius-sm); background:var(--surface-50); }
.content--pos .pos-sess-primary b{ font:600 13px/1.35 var(--font-body); color:var(--text-strong); font-variant-numeric:tabular-nums; }

.content--pos .pos-sess-actions{ display:flex; align-items:center; flex-wrap:wrap; gap:9px; }
.content--pos .pos-sess-actions .pos-sess-clear{ margin-left:auto; }

.content--pos .pos-sess-note{ font:500 11px/1.5 var(--font-body); color:var(--text-subtle); margin:0; }
.content--pos .pos-sess-note--muted{ color:var(--ink-400); }
.content--pos .pos-sess-empty{ padding:16px 12px; text-align:center; font:500 12.5px/1.5 var(--font-body); color:var(--text-subtle); border:1px dashed var(--line-200); border-radius:var(--radius-sm); }
/* == POS-KANTONG:END ========================================================= */

/* ============================================================================
   POS MONEY-FIRST — prototype "POS Money-First (1b)" (full-bleed).
   Struktur: MONEY BAR (dark, sticky) · KOLOM NEMPEL (Queue 296px putih +
   Work di canvas) · ACTION BAR (light, sticky bottom, tile metode 4 ikon).
   Semua rule di-scope .pos-shell--money / .content--pos agar additive.
   == POS-MONEY:BEGIN ========================================================= */

/* Full-bleed: money bar & action bar menempel tepi area konten */
.content.content--pos { max-width:none; padding:0; background:var(--canvas); }

/* App-shell POS (owner 2026-08-06): tinggi DIKUNCI setinggi viewport, bukan
   `min-height` yang membiarkan halaman memanjang. `auto minmax(0,1fr)` = money
   bar diam di atas, area kolom mengisi sisa. `minmax(0,…)` wajib — dengan `1fr`
   polos, track tetap melar mengikuti isi dan scroll internal tak pernah aktif. */
/* `grid-template-columns` WAJIB di-reset ke satu kolom: `.pos-shell` dasar
   mendeklarasikan `300px minmax(0,1fr)`, sehingga tanpa reset ini money bar dan
   area kolom duduk di BARIS YANG SAMA (kolom 1 & 2) — baris pertama membengkak
   ke 809px dan bar terlihat setinggi setengah layar. */
/* Money bar dibubarkan → shell tinggal SATU baris: area kolom yang mengisi
   seluruh tinggi viewport. */
.pos-shell.pos-shell--money { display:grid; grid-template-columns:minmax(0,1fr); grid-template-rows:minmax(0,1fr);
  gap:0; align-items:stretch; height:calc(100dvh - 64px); min-height:0; overflow:hidden; }
/* [hidden] harus menang atas display grid/flex rule di bawah (Detail lanjutan, dsb.) */
.pos-shell--money [hidden] { display:none !important; }
/* aksen "uang" + aksen brand (tombol Add item) per brand aktif */
.pos-shell--money { --money-accent:#FFF700; --money-brand:#FFF700; --money-brand-ink:#050505; }
/* VER-3 #4 — brand NUSSA memakai token. --money-accent #FF7A3C adalah varian TERANG
   yang belum punya token per-brand; dibiarkan literal dan dicatat sebagai utang
   token upstream, bukan disnap ke accent (itu akan mengubah warnanya). */
.pos-shell--money[data-pos-brand-active="nussa"] { --money-accent:#FF7A3C; --money-brand:var(--brand-nussa-accent); --money-brand-ink:#fff; }
.pos-shell--money[data-pos-brand-active="luxa"]  { --money-accent:#EDEAE3; --money-brand:#3A3A3A; --money-brand-ink:#fff; }

/* label mono mikro (prototype .flbl) + field standar (prototype .fld) */
.pos-shell--money .pos-flbl { display:block; margin:0 0 7px; font:500 10.5px/1 var(--font-mono); letter-spacing:.12em; text-transform:uppercase; color:var(--ink-500); }
.pos-shell--money .pos-fld { min-width:0; }
.pos-shell--money .pos-fld .vs-field__control { height:44px; width:100%; border:1px solid var(--border-input,#DDE1E8); border-radius:10px; background:var(--surface-0); padding:0 13px; font-size:14px; color:var(--ink-900); box-shadow:none; }
.pos-shell--money .pos-fld select.vs-field__control { font-size:13.5px; padding:0 10px; }
.pos-shell--money .pos-fld--auto.vs-field__control { background:var(--surface-1); color:var(--ink-600); font-size:13px; }

/* ── MONEY BAR ─────────────────────────────────────────────────────────────
   Grid kolom tetap: Dokumen | spacer(1fr) | DP | Sisa | divider | Total.
   Track DP/Sisa/Total ber-min-width → posisi terkunci, tak bergeser saat nominal
   berubah; Total selalu rata kanan (1fr menyerap sisa ruang). */
.pos-moneybar {
  /* `static`, bukan `sticky` (2026-08-06): bar kini track grid pertama di shell
     bertinggi-viewport yang TIDAK menggulir, jadi ia sudah diam dengan sendirinya.
     Sticky justru menggesernya turun 64px sehingga menimpa kolom di bawahnya. */
  position:static; z-index:18;
  display:grid;
  /* +1 track (owner 2026-08-06): No. dokumen pindah ke bar, tepat setelah tab
     mode — keduanya identitas dokumen. Urutan: Mode | No.dok | spacer | DP |
     Sisa | divider | Total. */
  grid-template-columns:auto auto minmax(20px,1fr) max-content max-content 1px max-content;
  /* Gap lebar & lega (~80px di monitor lebar) tapi menyusut mulus di layar kecil
     agar kolom uang tak meluber (min-width tiap track sudah memakan lebar). */
  align-items:center; column-gap:clamp(32px, 3.8vw, 80px);
  background:var(--ink-900,#050505); color:#fff;
  border-radius:0; padding:16px 28px;
}
.pos-moneybar__spacer { min-width:20px; }
.pos-moneybar__dp    { min-width:252px; }
.pos-moneybar__sisa  { min-width:132px; }
.pos-moneybar__grand { min-width:160px; }
.pos-moneybar__seg { display:flex; flex-direction:column; gap:8px; }
.pos-moneybar__cap { margin:0; color:rgba(255,255,255,.5); letter-spacing:.12em; }
.pos-moneybar__doc .pos-moneybar__cap { color:rgba(255,255,255,.4); }
.pos-moneybar__cap--accent { color:var(--money-accent); }
/* DICABUT (ADR D-11): segmented "Mode dokumen" (Receipt/Quotation/Invoice/Custom)
   di money bar. POS tidak lagi punya mode DOKUMEN — mode operasi ditampilkan
   sebagai `.pos-modechip` read-only, dan pemilihnya adalah landing `.pos-modesel`.
   Aturan `.pos-moneybar .pos-mode-seg` karena itu tidak punya markup lagi. */

/* DP block: "DP 50%  Rp 150.000" + chip 25/50/75/100% + input Rp pill */
.pos-dp-line { display:flex; align-items:baseline; gap:8px; }
.pos-dp-amt { font-family:var(--font-mono); font-size:19px; font-weight:600; color:#fff; letter-spacing:0; }
.pos-dp-pct { font-weight:inherit; font-family:inherit; color:inherit; }
.pos-dp-chips--bar { display:flex; align-items:center; gap:5px; flex-wrap:wrap; }
.pos-dp-chips--bar .pos-dp-chip {
  border:0; background:rgba(255,255,255,.1); color:rgba(255,255,255,.7);
  border-radius:100px; padding:6px 11px; font:600 11px/1 var(--font-mono); cursor:pointer;
  transition:all .14s ease;
}
.pos-dp-chips--bar .pos-dp-chip:hover { background:rgba(255,255,255,.16); color:#fff; }
.pos-dp-chips--bar .pos-dp-chip.active { background:#fff; color:var(--ink-900); }
.pos-dp-inputwrap { display:inline-flex; align-items:center; gap:5px; background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.15); border-radius:100px; padding:0 11px; height:28px; }
.pos-dp-inputwrap:focus-within { border-color:var(--money-accent); }
.pos-dp-rp { font-size:11px; color:rgba(255,255,255,.5); }
.pos-dp-input { width:80px; border:0; background:transparent; color:#fff; font-family:var(--font-mono); font-size:12px; padding:0; outline:none; }
.pos-dp-input:focus { outline:none; box-shadow:none; }
.pos-dp-input::placeholder { color:rgba(255,255,255,.42); }

/* Sisa (aksen brand) · divider · Total (display besar, kanan) */
.pos-moneybar__sisa { gap:5px; }
.pos-sisa-amt { font-family:var(--font-mono); font-size:19px; font-weight:600; color:var(--money-accent); letter-spacing:0; }
.pos-sisa-amt.is-paid { color:#7CE0A6; }
.pos-moneybar__divider { width:1px; height:48px; background:rgba(255,255,255,.14); flex:none; }
.pos-moneybar__grand { flex:none; text-align:right; gap:2px; }
.pos-grandtotal { font-family:var(--font-display); font-weight:800; font-size:34px; line-height:1.05; letter-spacing:-.02em; color:#fff; }

/* ── KOLOM NEMPEL (Queue + Work) ───────────────────────────────────────── */
/* ── KERANGKA POS: money bar terpaku, tiga kolom mengisi sisa tinggi layar ────
   Owner 2026-08-06. Sebelumnya halaman yang menggulir utuh sementara money bar &
   action bar `position:sticky`, sehingga keduanya terlihat terlepas dari isinya
   saat digulir. Sekarang shell mengunci tinggi viewport: bar diam karena ia
   track `auto` di grid, dan MASING-MASING kolom menggulir di dalam dirinya.
   `min-height:0` wajib di setiap tingkat — tanpa itu track `1fr` melar mengikuti
   isi dan scroll internal tidak pernah aktif. */
/* Dua kolom (2026-08-06): rail Jadwal sudah melebur jadi accordion di kolom
   kerja, jadi kolomnya sendiri dicabut — ia memakan ~296px permanen padahal
   hanya relevan di satu mode. */
.pos-shell--money .pos-cols { display:grid; grid-template-columns:minmax(0,1fr) 340px; gap:0;
  align-items:stretch; min-height:0; overflow:hidden; }
.pos-shell--money .pos-cols > * { min-height:0; }
/* ── KOLOM 3 · PANEL GELAP (owner 2026-08-06) ─────────────────────────────────
   Melebur money bar + kolom rincian. Latar gelap dipilih owner sebagai KONTRAS:
   kolom kiri (putih) = menyusun dokumen, kolom kanan (hitam) = uang & keputusan.
   Warna diambil dari token yang sama dengan money bar lama supaya tidak ada
   palet baru; teks di atasnya memakai skala alpha putih yang sudah dipakai bar. */
.pos-side { display:grid; grid-template-rows:minmax(0,1fr) auto; min-height:0;
  background:var(--ink-900,#050505); color:#fff; }
.pos-side-body { display:flex; flex-direction:column; gap:var(--space-7); padding:var(--space-6);
  min-height:0; overflow:auto; }
.pos-sidecard { display:grid; gap:var(--space-4); align-content:start; }
.pos-sidecard__head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-3); }
.pos-side .pos-mini-label, .pos-side .pos-flbl { color:rgba(255,255,255,.5); }
/* Blok identitas: tab mode + nomor dokumen, dipisah garis tipis dari angka. */
.pos-sidecard--ident { gap:var(--space-5); padding-bottom:var(--space-6);
  border-bottom:1px solid rgba(255,255,255,.12); }
.pos-sidecard--ident .pos-moneybar__seg { display:grid; gap:var(--space-3); }
/* `.pos-sidecard--ident .pos-modetab*` DICABUT 2026-08-07 bersama tiga tab
   "Selesaikan sebagai". Tidak ada lagi markup yang menghasilkannya. */
/* Baris angka — label kiri, nominal kanan, angka rata kanan (grid, bukan flex). */
.pos-money { display:grid; gap:var(--space-4); }
.pos-mrow { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline; gap:var(--space-4); }
.pos-mrow__line { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline; gap:var(--space-4); }
.pos-mrow--dp { display:grid; gap:var(--space-3); grid-template-columns:minmax(0,1fr); }
.pos-mrow__cap { font:500 10.5px/1.3 var(--font-mono); letter-spacing:.12em; text-transform:uppercase; color:rgba(255,255,255,.5); }
.pos-mrow__val { font-size:14px; color:#fff; text-align:right; }
.pos-mrow.is-accent .pos-mrow__val { color:var(--money-accent); }
/* AUDIT UX P2-3 — "belum ada Order" adalah KEADAAN, bukan nominal ter-mask.
   Nilainya karena itu teks biasa, bukan angka mono yang menyaru jadi uang. */
.pos-mrow--none .pos-mrow__val { font-family:var(--font-body); font-size:12px; color:rgba(255,255,255,.62); }
/* Baris skema pembayaran di panel gelap POS (owner 12 Agu): kap · nominal · aksi
   pada grid tiga kolom (aturan owner "baris komposit = grid"), sub-label skema
   turun di bawah kap supaya nominalnya tetap rata kanan dan tak pernah terdorong. */
.pos-mrow--scheme { grid-template-columns:minmax(0,1fr) auto auto; align-items:center; }
.pos-mrow__sub { display:block; margin-top:2px; font:500 11px/1.3 var(--font-body);
  letter-spacing:0; text-transform:none; color:rgba(255,255,255,.72); }
.pos-mrow__act {
  display:inline-flex; align-items:center; gap:4px; margin-left:var(--space-3);
  padding:4px 8px; min-height:28px; background:transparent; color:rgba(255,255,255,.82);
  border:1px solid rgba(255,255,255,.28); border-radius:var(--radius-xs,6px);
  font:600 11px/1 var(--font-body); cursor:pointer;
}
.pos-mrow__act:hover { color:#fff; border-color:rgba(255,255,255,.6); }
.pos-mrow__act:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.pos-mrule { height:1px; background:rgba(255,255,255,.12); }
/* Rincian (posSummaryRowsHTML) di panel gelap — SATU-SATUNYA daftar angka
   dokumen; `.pos-bd-grand` jadi angka jangkar, tidak diulang di tempat lain. */
/* ── Netralisasi komponen TERANG di panel gelap ──────────────────────────────
   Diaudit di runtime, bukan ditebak: tiga kebocoran nyata ditemukan —
   `.content--pos .pos-docnum-input` (bg surface-50), `.pos-mini-edit` (bg putih),
   dan teks `.pos-bd-row` (ink-950). Ketiganya menang karena selectornya lebih
   spesifik dari aturan gelap. Diperbaiki dengan MENYAMAKAN spesifisitas lewat
   prefix `.pos-shell--money .pos-side`, bukan menambah !important. */
.pos-shell--money .pos-side .pos-summary { display:grid; gap:var(--space-3); border:0; padding:0; background:transparent; }
.pos-shell--money .pos-side .pos-bd-row,
.pos-shell--money .pos-side .pos-bd-grand,
.pos-shell--money .pos-side .pos-bd-out { background:transparent; border-color:rgba(255,255,255,.12); }
/* Rincian memakai ANATOMI YANG SAMA dengan baris Ringkasan Order di atasnya:
   grid `1fr auto`, label mono-caps, nominal mono rata kanan. Sebelumnya label
   rincian tampil sebagai teks kalimat biasa sementara tetangganya mono-caps —
   dua bahasa visual di satu kartu. */
.pos-shell--money .pos-side .pos-bd-row {
  display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline; gap:var(--space-4); }
.pos-shell--money .pos-side .pos-bd-row > span {
  font:500 10.5px/1.3 var(--font-mono); letter-spacing:.12em; text-transform:uppercase; color:rgba(255,255,255,.5); }
.pos-shell--money .pos-side .pos-bd-row > b {
  font-family:var(--font-mono); font-size:13px; font-weight:600; color:#fff; }
.pos-shell--money .pos-side .pos-bd-row.is-credit > b { color:var(--money-accent); }
/* Satu garis pemisah sebelum angka jangkar — bukan dua (money rows + summary
   sama-sama menyuntik `.pos-bd-rule`/`.pos-mrule`). */
.pos-shell--money .pos-side .pos-money + .pos-summary { margin-top:var(--space-5);
  padding-top:var(--space-5); border-top:1px solid rgba(255,255,255,.12); }
.pos-shell--money .pos-side .pos-bd-rule { height:1px; background:rgba(255,255,255,.12); margin:var(--space-3) 0 0; }
.pos-shell--money .pos-side .pos-bd-grand { border:0; padding:var(--space-3) 0 0; }
.pos-shell--money .pos-side .pos-bd-grand > span { color:rgba(255,255,255,.5); }
.pos-shell--money .pos-side .pos-bd-grand > b { color:#fff; }
/* Input & tombol edit nomor dokumen — varian gelap. */
.pos-shell--money .pos-side .pos-bar-input,
.pos-shell--money .pos-side .pos-docnum-input {
  height:38px; width:100%; padding:0 var(--space-4); border:1px solid rgba(255,255,255,.16);
  border-radius:var(--radius-xs); background:rgba(255,255,255,.06); color:#fff; font-size:12px; }
.pos-shell--money .pos-side .pos-bar-iconbtn,
.pos-shell--money .pos-side .pos-mini-edit {
  width:38px; height:38px; border:1px solid rgba(255,255,255,.16); border-radius:var(--radius-xs);
  background:rgba(255,255,255,.06); color:rgba(255,255,255,.72); }
.pos-shell--money .pos-side .pos-bar-iconbtn:hover,
.pos-shell--money .pos-side .pos-mini-edit:hover { background:rgba(255,255,255,.12); color:#fff; }
/* Tanggal dokumen PINDAH ke kartu identitas (owner 2026-08-07). Ia memakai
   `.pos-bar-input` yang sama dengan nomor dokumen supaya keduanya terbaca sebagai
   satu pasangan identitas, bukan dua kontrol yang kebetulan bertetangga.
   Ikon kalender bawaan browser gelap di atas panel gelap → dibalik jadi terang.
   Caption tanggal diberi jarak atas supaya tidak menempel ke baris nomor. */
.pos-shell--money .pos-side .pos-docdate__cap { margin-top:var(--space-2); }
.pos-shell--money .pos-side .pos-docdate::-webkit-calendar-picker-indicator {
  filter:invert(1); opacity:.62; cursor:pointer; }
.pos-shell--money .pos-side .pos-docdate::-webkit-calendar-picker-indicator:hover { opacity:1; }
.pos-side .pos-bd-row { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline;
  gap:var(--space-4); font-size:12.5px; color:rgba(255,255,255,.66); }
.pos-side .pos-bd-row b { color:#fff; font-weight:600; }
.pos-side .pos-bd-row.is-credit b { color:var(--money-accent); }
.pos-side .pos-bd-rule { height:1px; background:rgba(255,255,255,.12); margin:var(--space-2) 0; }
.pos-side .pos-bd-grand { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline; gap:var(--space-4); }
.pos-side .pos-bd-grand > span { font:500 10.5px/1.3 var(--font-mono); letter-spacing:.12em; text-transform:uppercase; color:rgba(255,255,255,.5); }
.pos-side .pos-bd-grand > b { font-family:var(--font-display); font-size:26px; font-weight:800; letter-spacing:-.02em; color:#fff; }
.pos-side .pos-bd-out { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:var(--space-4);
  padding-top:var(--space-3); border-top:1px solid rgba(255,255,255,.12); }
.pos-side .pos-bd-out__cap { font:500 10px/1.3 var(--font-mono); letter-spacing:.12em; color:rgba(255,255,255,.5); }
.pos-side .pos-bd-out__amt { font-size:15px; color:var(--money-accent); }
/* Fluid, bukan tile 64px tetap: di panel 340px, lebar tetap menyisakan ruang
   kosong di kanan yang terbaca seperti blok belum jadi. */
.pos-side-pay { display:grid; gap:var(--space-4); justify-items:stretch; }
.pos-shell--money .pos-side .pos-pay-grid { grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--space-2); width:100%; }
.pos-shell--money .pos-side .pos-pay-tile { width:100%; height:60px; }
.pos-shell--money .pos-side #posRecordPayment { width:100%; justify-content:center; height:40px; }
/* Aksi dokumen: grid 2 kolom yang PASTI — bukan flex-wrap yang menghasilkan
   3 baris tak rata di panel 340px. Tombol berlabel, tinggi seragam. */
.pos-side-acts { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-2); }
.pos-shell--money .pos-side .pos-act-btn {
  display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:var(--space-3);
  height:40px; padding:0 var(--space-4); border-radius:var(--radius-xs); cursor:pointer;
  background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.16); color:rgba(255,255,255,.82);
  font:500 12px/1 var(--font-body); text-align:left; transition:background .16s ease, color .16s ease, border-color .16s ease; }
.pos-shell--money .pos-side .pos-act-btn svg { width:16px; height:16px; flex:none; }
.pos-shell--money .pos-side .pos-act-btn span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-shell--money .pos-side .pos-act-btn:hover:not(:disabled) { background:rgba(255,255,255,.12); color:#fff; border-color:rgba(255,255,255,.3); }
.pos-shell--money .pos-side .pos-act-btn:disabled { opacity:.34; cursor:not-allowed; }
/* Tombol & tile di panel gelap: varian gelap, bukan komponen terang di atas hitam. */
.pos-side .pos-pay-tile, .pos-side .pos-act-ico, .pos-side .vs-btn--secondary {
  background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.16); color:rgba(255,255,255,.82); }
.pos-side .pos-pay-tile:hover:not(:disabled), .pos-side .pos-act-ico:hover:not(:disabled),
.pos-side .vs-btn--secondary:hover:not(:disabled) { background:rgba(255,255,255,.12); color:#fff; }
.pos-side .pos-pay-tile.active { background:var(--money-brand); border-color:var(--money-brand); color:var(--money-brand-ink); }
.pos-side .pos-pay-tile:disabled, .pos-side .pos-act-ico:disabled, .pos-side .vs-btn--secondary:disabled { opacity:.34; }
.pos-side .pos-act-sep { background:rgba(255,255,255,.16); }
/* Chip DP: varian gelap. Tanpa ini chip putih menempel di panel hitam dan
   terbaca sebagai kotak terang yang tidak disengaja. */
.pos-side .pos-dp-chips { display:flex; flex-wrap:wrap; gap:var(--space-2); align-items:center; }
.pos-side .pos-dp-chip { background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.16);
  color:rgba(255,255,255,.78); }
.pos-side .pos-dp-chip:hover { background:rgba(255,255,255,.12); color:#fff; }
.pos-side .pos-dp-chip.is-on, .pos-side .pos-dp-chip.active {
  background:var(--money-brand); border-color:var(--money-brand); color:var(--money-brand-ink); }
.pos-side .pos-dp-rp { color:rgba(255,255,255,.5); }
.pos-side .pos-dp-input { background:transparent; border:0; color:#fff; }
/* ══ TAHAP 3 — blok TUJUAN di dasar kolom keputusan ══════════════════════════
   Pindah dari puncak rail. Di puncak ia memakan 258px dari 743px tinggi terlihat
   (32%) untuk kontrol yang dulu disentuh sekali di awal; di dasar ia justru
   berada tepat di tempat keputusannya diambil, dan ruang yang dikembalikan
   mengangkat seksi Pembayaran & Dokumen ke atas garis lipat. */
/* Footer ringkas: CTA utama + satu disclosure "Alur lain" dalam SATU baris.
   Pilihan workflow tetap tersedia tanpa membentuk kartu tujuan permanen. */
.pos-side-foot { padding:var(--space-4); border-top:1px solid rgba(255,255,255,.12); display:grid; gap:var(--space-2); }
.pos-side-foot__row { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:start; gap:var(--space-2); min-width:0; }
.pos-side-foot__act { display:grid; gap:var(--space-2); min-width:0; }
.pos-side-foot__act .pos-side-foot__note { margin:0; }
.pos-side-foot .pos-moneybar__seg,
.pos-side-foot .pos-moneybar__doc { display:grid; gap:var(--space-3); width:100%; min-width:0; max-width:100%; flex:none; margin:0; }
.pos-flowmenu { position:relative; }
.pos-flowmenu > summary { list-style:none; }
.pos-flowmenu > summary::-webkit-details-marker { display:none; }
.pos-flowmenu__trigger { display:grid; grid-template-columns:auto auto; align-items:center; justify-content:center;
  gap:var(--space-2); min-height:var(--field-h,44px); padding:0 var(--space-4); cursor:pointer;
  border-radius:var(--radius-xs); border:1px solid rgba(255,255,255,.16); background:rgba(255,255,255,.06);
  color:rgba(255,255,255,.76); font:var(--fw-medium) var(--text-2xs)/var(--lh-normal) var(--font-body); }
.pos-flowmenu__trigger:hover, .pos-flowmenu[open] .pos-flowmenu__trigger { background:rgba(255,255,255,.12); color:#fff; }
.pos-flowmenu__panel { position:absolute; right:0; bottom:calc(100% + var(--space-2)); z-index:30;
  width:240px; display:grid; gap:var(--space-3); padding:var(--space-4); border:1px solid rgba(255,255,255,.16);
  border-radius:var(--radius-sm); background:var(--ink-800,#17181b); box-shadow:var(--shadow-pop); }
.pos-flowmenu__panel .pos-mini-label { margin:0; }
.pos-dest__ways { display:grid; grid-template-columns:minmax(0,1fr); gap:var(--space-2); }
.pos-dest__way { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:var(--space-3);
  min-height:var(--field-h-sm,36px); padding:var(--space-3) var(--space-4); text-align:left;
  border-radius:var(--radius-xs); border:1px solid rgba(255,255,255,.16); background:rgba(255,255,255,.06);
  color:rgba(255,255,255,.82); font:var(--fw-medium) var(--text-2xs)/var(--lh-normal) var(--font-body);
  cursor:pointer; min-width:0; transition:background .16s ease, color .16s ease, border-color .16s ease; }
.pos-dest__way span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-dest__way svg { flex:none; }
.pos-dest__way:hover:not(:disabled) { background:rgba(255,255,255,.12); color:#fff; border-color:rgba(255,255,255,.3); }
.pos-dest__way:disabled { opacity:.34; cursor:not-allowed; }
.pos-side-foot .pos-cta { width:100%; justify-content:center; }
/* A11Y 2026-08-07 — CTA mati kini `aria-disabled`, bukan `disabled`, supaya tetap
   dapat difokus keyboard dan alasannya (aria-describedby → catatan) terbaca.
   Tampilannya harus tetap sama dengan tombol mati, termasuk kursornya. */
.pos-cta[aria-disabled="true"] { opacity:.42; cursor:not-allowed; }
.pos-cta[aria-disabled="true"]:hover { background:var(--ink-900); }
/* AUDIT UX P1-1 — alasan CTA mati harus MENETAP di bawah tombolnya, bukan lewat
   sebagai toast. Baris komposit ikon+teks = grid (aturan owner). */
.pos-side-foot__note { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start;
  gap:var(--space-2); margin:var(--space-3) 0 0; font-size:var(--text-2xs); line-height:var(--lh-normal);
  color:rgba(255,255,255,.62); }
.pos-side-foot__note svg { margin-top:1px; }
/* ── Pusat pemberitahuan POS (owner 2026-08-12) ────────────────────────────
   Satu daftar di kartu klien menggantikan peringatan yang dulu tersebar di
   kotak sesi, kaki kolom kanan, dan panel validasi sisipan. Tiap baris membawa
   tombol "Tunjukkan" supaya terkumpul TIDAK berarti jauh dari penyebabnya. */
.pos-notices { display:flex; flex-direction:column; gap:6px; margin-top:var(--space-3);
  padding:10px 12px; border:1px solid var(--tag-warning-border);
  border-radius:var(--radius-sm); background:var(--tag-warning-bg); }
.pos-notices__head { display:flex; align-items:center; gap:6px;
  font:700 11px var(--font-mono); letter-spacing:.06em; text-transform:uppercase;
  color:var(--tag-warning-text); }
.pos-notice { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:8px;
  align-items:start; font:500 12px var(--font-body); color:var(--text-strong); }
.pos-notice > span { min-width:0; overflow-wrap:anywhere; line-height:1.45; }
.pos-notice--info { color:var(--text-muted); }
.pos-notice__go { flex:0 0 auto; padding:2px 8px; border:1px solid var(--border-default);
  border-radius:var(--radius-pill); background:var(--surface-0); cursor:pointer;
  font:650 10.5px var(--font-body); color:var(--text-strong); white-space:nowrap; }
.pos-notice__go:hover { border-color:var(--ink-900); }
.pos-notice__go:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
/* Semua peringatan info → kotak tenang; hanya ada warning → kotak kuning. */
.pos-notices:not(:has(.pos-notice--warn)) { border-color:var(--border-default); background:var(--surface-1); }
.pos-notices:not(:has(.pos-notice--warn)) .pos-notices__head { color:var(--text-muted); }

.pos-sr-only { position:absolute!important; width:1px!important; height:1px!important; padding:0!important;
  margin:-1px!important; overflow:hidden!important; clip:rect(0,0,0,0)!important; white-space:nowrap!important; border:0!important; }
/* ≤1180px: shell bertinggi-viewport + 3 kolom tidak masuk akal di layar sempit —
   kolom saling menimpa dan isinya terpotong. Di bawah breakpoint ini kerangkanya
   dilepas: tinggi mengikuti isi, kolom menumpuk, dan HALAMAN yang menggulir
   (bukan tiap kontainer). Money bar kembali sticky supaya angka tetap terlihat. */
@media (max-width:1180px) {
  .pos-shell.pos-shell--money { display:flex; flex-direction:column; height:auto; min-height:calc(100dvh - 64px); overflow:visible; }
  .pos-shell--money .pos-cols { grid-template-columns:minmax(0,1fr); overflow:visible; }
  .pos-shell--money .pos-work { overflow:visible; }
  .pos-shell--money .pos-work-body { overflow:visible; }
  .pos-shell--money .pos-work-body .pos-clientcard,
  .pos-shell--money .pos-work-body .pos-cartsec { max-height:none; overflow:visible; }
  .pos-shell--money .pos-queue__in { max-height:none; overflow:visible; }
  .pos-side { border-left:0; border-top:1px solid var(--line-200); grid-template-rows:auto auto; }
  .pos-side-body { overflow:visible; }
  .pos-moneybar { position:sticky; top:64px; }
  /* Segmen bar wajib boleh menyusut: tanpa `min-width:0`, strip tab (3 tab
     bersebelahan) memaksa lebar 450px di layar 375px → halaman meluber ke
     samping. Strip-nya sendiri digulir mendatar, bukan dipaksa wrap — tiga mode
     tetap terbaca sebagai satu kelompok. */
  .pos-moneybar__seg, .pos-moneybar__cap, .pos-moneybar__docnum .pos-docnum { min-width:0; max-width:100%; }
  /* Menu workflow tetap memenuhi target sentuh minimum. */
  .pos-dest__way { min-height:var(--field-h,44px); }
  .pos-bar-input { max-width:100%; }
}
/* Sticky+max-height warisan layout lama dinetralkan: kolom kini anak grid yang
   tingginya sudah dikunci shell, jadi sticky hanya membuat mereka melompat. */
.pos-shell--money .pos-queue,
.pos-shell--money .pos-colbody { flex:1 1 auto; min-height:0; overflow:auto; }
/* Dock peringatan tidak lagi sticky-ke-viewport: kartu klien punya scroll sendiri,
   jadi offset 104px (tinggi action bar lama) sudah tidak relevan. */
.pos-shell--money .pos-clientcard .pos-alertdock { position:static; bottom:auto; }
.pos-shell--money .pos-queue {
  position:static; max-height:none; overflow:visible; min-width:0;
  background:var(--surface-0); border:0; border-right:1px solid var(--line-200);
  border-radius:0; box-shadow:none;
}
/* Rail: sticky+offset 180px warisan layout lama dicabut — kolom ini sudah setinggi
   shell, jadi isinya cukup menggulir di dalam dirinya sendiri (2026-08-06). */
.pos-shell--money .pos-queue__in { position:static; top:auto; display:flex; flex-direction:column; max-height:100%; min-height:0; overflow:auto; }
.pos-queue-hd { flex:none; padding:18px 16px 12px; display:flex; flex-direction:column; gap:12px; }
.pos-queue-hd__row { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.pos-queue-hd__right { display:flex; align-items:center; gap:8px; flex:none; }
.pos-queue-title { font-family:var(--font-display); font-size:18px; font-weight:700; letter-spacing:-.01em; color:var(--ink-900); }
.pos-queue-count { font-size:11px; color:var(--ink-500); letter-spacing:0; }
/* Histori draft POS — dipindah dari action bar ke header Booking Queue (lebih relevan) */
/* DICABUT: `.pos-queue-histbtn` — tombol Histori draft dulu menempel di kepala rail
   kiri, padahal draft adalah fitur mode "Buat Quotation" yang TIDAK punya rail.
   Tombolnya pindah ke action bar sebagai `.pos-act-ico` (di samping Simpan draft),
   jadi gaya khusus ini tidak punya markup lagi. */
/* DICABUT 2026-08-07: `.pos-shell--money .pos-queue-search` / `.pos-queue-list`.
   Pemilih Jadwal kini combobox (`.pos-schedcombo`, lihat blok di bawah) — shell
   money tidak lagi merender kedua kelas itu.
   CATATAN: `.pos-queue-list`/`.pos-queue-search` versi shell LAMA (`.pos-shell--3col`,
   `.pos-detail`) masih tersisa di file ini dan sudah mati sejak sebelum perubahan
   ini — nol pemakai di admin.js. Tidak ikut disapu di sini supaya pencabutannya
   punya verifikasi sendiri. */

/* Kartu queue: head (judul | uang) · metas (ikon+fakta) · chips · footer (kode | konteks).
   Fill kartu = tone status (triad --pst-*, peta app-wide) — sama bahasa warnanya dengan
   kartu booking di modul Bookings; rail kiri 3px tetap aksen status. */
/* ══ KARTU JADWAL = GRID 2 KOLOM (owner 2026-08-07) ═══════════════════════════
   `main | tail` — kerja menyusut, ekor tidak. Menggantikan tumpukan 4 blok yang
   memakan 179px (terukur) untuk isi yang muat di bawah 100px. Aturan owner "baris
   komposit = grid" berlaku di sini DAN di dalam tiap barisnya. */
.pqm {
  display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:start;
  text-align:left; gap:4px 12px; min-width:0;
  padding:10px 12px; border:1px solid var(--sc-line, var(--line-200)); border-left:3px solid var(--stc,var(--ink-400));
  border-radius:12px; background:var(--sc-fill, var(--surface-0)); cursor:pointer; font-family:var(--font-body); color:var(--ink-900);
  transition:border-color .14s ease, background .14s ease;
}
.pqm > * { min-width:0; max-width:100%; }
.pqm:hover { border-color:var(--sc-text, var(--ink-300)); border-left-color:var(--stc,var(--ink-400)); }
.pqm.active { border-color:var(--ink-900); border-left-color:var(--stc,var(--ink-400)); box-shadow:0 0 0 1px var(--ink-900) inset; }
/* Kolom kerja: nama → metas mendatar → chips + kode. Menyusut duluan. */
.pqm-main { display:grid; gap:5px; min-width:0; }
/* Kolom ekor: uang + kanal. `justify-items:end` supaya keduanya rata kanan dan
   `flex:none` secara efektif — uang tidak boleh terpotong (aturan lama dipertahankan). */
.pqm-tail { display:grid; justify-items:end; align-content:start; gap:5px; white-space:nowrap; }
.pqm-name { font-size:14px; font-weight:600; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.pqm-money { display:grid; justify-items:end; gap:1px; text-align:right; }
.pqm-money small { font-size:9px; font-weight:650; letter-spacing:.08em; text-transform:uppercase; color:var(--ink-500); }
.pqm-money--due .pqm-sisa { color:var(--pst-danger-text); }
.pqm-money--part .pqm-sisa { color:var(--pst-orange-text); }
.pqm-money--settled .pqm-sisa { color:var(--pst-mint-text); }
.pqm-sisa { font-family:var(--font-mono); font-size:13.5px; font-weight:700; letter-spacing:0; white-space:nowrap; }
/* Metas MENDATAR + wrap (owner 2026-08-07). Dulu `display:grid` satu kolom, jadi
   tiga fakta pendek masing-masing memakai baris penuh 732px (terukur) — 51px dari
   179px tinggi kartu hanya untuk itu. Sekarang mengalir sebaris dan baru turun
   kalau memang tidak muat; tiap fakta tetap grid `auto|1fr` di dalamnya supaya
   ikonnya utuh dan teksnya yang di-ellipsis (aturan owner: baris komposit = grid). */
.pqm-metas { display:flex; flex-wrap:wrap; align-items:center; gap:2px 12px; min-width:0; }
.pqm-meta { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:6px;
  min-width:0; max-width:100%; font-size:11.5px; line-height:1.3; color:var(--ink-500, var(--ink-400)); }
.pqm-meta svg { opacity:.7; }
.pqm-meta > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* Chips + kode booking berbagi SATU baris; kode didorong ke kanan kolom kerja
   (`margin-left:auto`) supaya tetap terbaca sebagai identitas, bukan chip keempat. */
.pqm-chips { display:flex; align-items:center; gap:6px; min-width:0; flex-wrap:wrap; }
.pqm-chips:empty { display:none; }
.pqm-chips .pqm-code { margin-left:auto; padding-left:var(--space-3); }
/* Chip status: naik ke surface polos supaya tetap kontras di atas fill berwarna. */
.pqm-status {
  display:inline-flex; align-items:center; gap:6px; font-family:var(--font-mono); font-size:10px; font-style:normal;
  letter-spacing:.05em; text-transform:uppercase; padding:4px 9px; border-radius:100px;
  background:var(--surface-0); border:1px solid var(--sc-line, var(--line-200)); color:var(--sc-text, var(--stc,var(--ink-400)));
}
.pqm-status i { width:6px; height:6px; border-radius:100px; background:var(--stc,var(--ink-400)); flex:none; }
.pqm-room { font-family:var(--font-mono); font-size:10px; font-style:normal; letter-spacing:.04em; text-transform:uppercase; padding:4px 8px; border-radius:6px; background:var(--surface-0); color:var(--ink-500,var(--ink-400)); border:1px solid var(--sc-line, var(--line-200)); }
/* `.pqm-foot` DICABUT 2026-08-07 — garis pemisah + baris sendiri untuk dua fakta
   pendek; keduanya kini duduk di baris yang sudah ada (kode di chips, kanal di ekor). */
.pqm-code { font-size:10px; color:var(--ink-600); min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; letter-spacing:0; }
.pqm-date { font-size:10.5px; color:var(--ink-600); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0; letter-spacing:0; }

/* ── WORK (kanan, di canvas) ───────────────────────────────────────────── */
/* `flex` kolom, bukan `block` (2026-08-06): kolom ini harus meneruskan batas
   tinggi dari shell ke work-body. Dengan `block`, work-body bebas memanjang
   melewati layar dan scroll internal kartu tidak pernah aktif. */
.pos-shell--money .pos-work { position:static; max-height:none; overflow:hidden; min-width:0; min-height:0; background:transparent; border:0; box-shadow:none; border-radius:0; display:flex; flex-direction:column; }
/* Work area 2-kolom: kiri = client card, kanan = cart (paling kanan, lebih lega);
   strip verifikasi membentang penuh di bawah keduanya. Kolaps ke 1-kolom di ≤1400px. */
/* KOREKSI 2026-08-06 — scroll pindah ke KARTU, bukan ke kolom (permintaan owner:
   "kontainer dalam ini yang dapat fungsi scroll").
   Catatan lama menyebut `overflow:visible` WAJIB demi sticky yang relatif ke
   viewport. Alasan itu gugur: shell POS sekarang mengunci tinggi viewport sendiri
   dan tidak ada lagi elemen sticky di dalam work-body (dock peringatan sudah
   dijadikan statis, action bar sudah dibubarkan jadi kolom ke-3). Membiarkan
   `visible` di shell bertinggi-tetap justru membuat isi panjang TERPOTONG —
   memanjang sampai 3770px lalu terpangkas, bukan bisa digulir. */
/* KOREKSI 2026-08-06b (AUDIT UX P0-1) — SATU pemilik scroll per kolom.
   Versi sebelumnya memberi `overflow:auto` ke kartu klien DAN kartu item
   sekaligus, di dalam work-body yang `overflow:hidden`, di dalam shell yang
   mengunci tinggi viewport. Hasil terukur pada 1280x800: halaman tidak
   menggulir sama sekali (scrollHeight == clientHeight) sementara kartu klien
   menyembunyikan 266px, kartu item 532px, dan rail kanan 371px — total ±1.170px
   konten tak terjangkau, tanpa scrollbar (lebar terukur 2px/0px), tanpa
   bayangan, tanpa fade. Kasir menambah item lalu tidak melihat apa pun berubah.
   Sekarang: work-body yang menggulir (satu region, urutan baca utuh), kartu di
   dalamnya tumbuh apa adanya. Rail kanan tetap punya scroll sendiri karena CTA
   -nya memang harus tetap menempel di dasar kolom. */
/* Baris 1 = accordion Jadwal (membentang 2 kolom, tinggi mengikuti isi);
   baris 2 = kartu klien | kartu item. */
/* KOREKSI 2026-08-06d — BARIS DIUKUR DARI ISI, dan item tidak boleh menyusut.
   `min-content` + `align-items:start` menggantikan `auto` + `stretch`: dengan
   tinggi kontainer yang definit (ia scrollport), baris `auto` sempat terkompres
   (terukur 332/246/244 = 824px untuk isi 1.133px) sehingga kartu klien dipaksa
   247px padahal isinya 431px. Lihat catatan `min-height` di bawah. */
.pos-shell--money .pos-work-body { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.3fr); grid-template-rows:min-content min-content; align-content:start; gap:20px 26px; align-items:start; padding:26px 30px 30px; overflow:auto; min-height:0; }
.pos-shell--money .pos-work-body .pos-queue-acc { grid-column:1 / -1; grid-row:1; }
/* Kartu klien: `start` — pendek saat isinya pendek (tidak ada rongga kosong).
   TIDAK menggulir sendiri lagi; work-body pemiliknya. */
/* AKAR TUMPANG TINDIH (diperbaiki 2026-08-06d) — `min-height:0` di sini adalah
   sisa dari masa kedua kartu ini MEMILIKI scrollport sendiri: properti itu ada
   justru supaya sebuah item boleh menyusut di bawah isinya AGAR BISA DIGULIR.
   Waktu scrollport-nya dicabut (D-U1) `min-height:0` ikut tertinggal, jadi kartu
   tetap boleh menyusut — hanya saja sekarang isinya MELUBER, bukan menggulir.
   Terukur: kartu klien 247px, isinya 431px, `.pos-client-grid` menembus 101px dan
   `.pos-alertdock` 166px ke dalam kartu item di bawahnya.
   Aturannya sekarang: item yang TIDAK memiliki scrollport tidak pernah menyusut
   di bawah isinya. */
.pos-shell--money .pos-work-body .pos-clientcard { grid-column:1; grid-row:2; align-self:start; max-height:none; min-height:auto; overflow:visible; }
.pos-shell--money .pos-work-body .pos-cartsec { grid-column:2; grid-row:2; align-self:start; min-height:auto; overflow:visible; }
/* Afordans gulir: scrollbar yang benar-benar terlihat, memakai konvensi yang
   sudah dipakai `.nav` (admin.css:326). Tanpa ini kotak gulir tidak terbaca
   sebagai kotak gulir. `overscroll-behavior` menahan scroll-chaining ke shell. */
/* `scrollbar-width:thin` SENGAJA TIDAK dipakai di dua kontainer ini. Di macOS ia
   menghasilkan overlay scrollbar yang hanya muncul saat digulir — lebar terukur
   tetap 0px, jadi kotak gulir tetap tidak terbaca sebagai kotak gulir (persis
   keluhan P0-1). Lebih penting: sejak Chrome mendukung properti standar
   `scrollbar-width`/`scrollbar-color`, menyetel salah satunya MEMATIKAN seluruh
   styling `::-webkit-scrollbar` pada elemen yang sama — diverifikasi di runtime
   (lebar tetap 0px selama keduanya berdampingan). Jadi di sini hanya pseudo-
   element webkit yang dipakai, dan track-nya permanen. Konvensi ini sudah ada di
   file ini (.ed-tabs, .set-subnav, .workspace-layer .ws-subnav). */
.pos-shell--money .pos-work-body,
.pos-shell--money .pos-side-body { overscroll-behavior:contain; }
.pos-shell--money .pos-work-body::-webkit-scrollbar,
.pos-shell--money .pos-side-body::-webkit-scrollbar { width:10px; }
.pos-shell--money .pos-work-body::-webkit-scrollbar-track,
.pos-shell--money .pos-side-body::-webkit-scrollbar-track { background:transparent; }
.pos-shell--money .pos-work-body::-webkit-scrollbar-thumb { background:var(--line-200); border-radius:100px; border:3px solid transparent; background-clip:padding-box; }
.pos-shell--money .pos-side-body::-webkit-scrollbar-thumb { background:rgba(255,255,255,.24); border-radius:100px; border:3px solid transparent; background-clip:padding-box; }

/* ══ ≤1180px: KEMBALIKAN GULIR KE HALAMAN (perbaikan 2026-08-07) ═════════════
   Gejala: pada layout satu kolom, roda mouse MATI TOTAL di seluruh area konten
   walau halamannya panjang (terukur 1100×800: `documentElement.scrollHeight`
   2289 vs `clientHeight` 800). Gulir programatik tetap jalan — itulah yang
   membuatnya terlihat seperti "halaman tidak panjang", padahal bukan.

   Sebabnya dua lapis, dan keduanya soal URUTAN SUMBER:

   1. Blok `@media (max-width:1180px)` di atas sudah menyatakan `.pos-work`,
      `.pos-work-body`, dan `.pos-side-body` menjadi `overflow:visible`. Tetapi
      `.pos-shell--money .pos-colbody { overflow:auto }` (baris ~7485) dan
      `.pos-shell--money .pos-work { overflow:hidden }` (~7556) dideklarasikan
      SESUDAHNYA dengan spesifisitas SAMA (0,2,0) → yang belakangan menang.
      Maksud blok media itu karena itu tidak pernah benar-benar berlaku.
   2. Yang mematikan roda mouse: `overscroll-behavior:contain` (~7613) pada dua
      kontainer yang di layar sempit BERISI TIDAK MELIMPAH. Kontainer
      `overflow:auto` tanpa isi berlebih SELALU berada di batas gulirnya, dan
      `contain` melarang gulir diteruskan ke induk — jadi setiap event roda di
      atasnya ditelan, tidak diteruskan ke halaman. Di layout tiga kolom
      (>1180px) properti itu BENAR dan tetap dipertahankan: di sana kedua
      kontainer memang punya scrollport sendiri yang tidak boleh menyeret shell.

   Blok ini sengaja diletakkan SESUDAH ketiga aturan itu supaya menang tanpa
   perang spesifisitas, dan hanya membalik yang perlu dibalik. */
@media (max-width:1180px) {
  .pos-shell--money .pos-work,
  .pos-shell--money .pos-colbody,
  .pos-shell--money .pos-work-body,
  .pos-shell--money .pos-side-body { overflow:visible; overscroll-behavior:auto; }
  /* Popover Jadwal TETAP punya scrollport sendiri (daftarnya bisa panjang), tapi
     tanpa `contain` — di layar sempit ia harus meneruskan gulir ke halaman begitu
     daftarnya habis, bukan menahannya. */
  .pos-schedcombo__pop { overscroll-behavior:auto; }
  /* Popover di layar sempit: batasi tinggi ke viewport, bukan ke tinggi kolom. */
  .pos-schedcombo__pop { max-height:60vh; }
}

/* ── Pemilih Jadwal = COMBOBOX (owner 2026-08-07) ───────────────────────────
   Menggantikan `.pos-queue-acc*` (accordion) yang DICABUT. Accordion memakan 470px
   (terukur) bahkan saat isinya "tidak ada Jadwal hari ini"; combobox idle = satu
   field 44px dan hasilnya di popover, jadi nol biaya ruang saat tidak dipakai.
   Basisnya komponen `.vs-combo` yang SUDAH ada (dipakai pencarian pelanggan di
   Booking Composer) — di sini hanya popover-nya yang dilebarkan supaya muat kartu
   `.pqm`, karena kartu itulah yang membawa status/brand/chip Parent-Child-Split. */
.pos-schedcombo { width:100%; }
.pos-schedcombo .vs-combo__shell { background:var(--surface-0); }
/* Jumlah hasil duduk di dalam field, sebagai keterangan — bukan kontrol. */
.pos-schedcombo #posSchedCount { flex:none; font-size:var(--text-2xs); color:var(--text-subtle); }
/* Spesifisitas SENGAJA dinaikkan (0,2,0): `.vs-combo__pop` dideklarasikan JAUH di
   bawah file ini dengan `max-height:236px` — pas untuk baris opsi 42px, tapi kartu
   `.pqm` tingginya 179px (terukur), jadi popover hanya memuat SATU kartu.
   Menaikkan spesifisitas lebih jujur daripada memindahkan blok komponen bersama. */
.vs-combo.pos-schedcombo .vs-combo__pop { display:grid; gap:var(--space-3); padding:var(--space-4);
  max-height:52vh; overscroll-behavior:contain; }
.pos-schedcombo__head { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center;
  gap:var(--space-3); padding-bottom:var(--space-3); border-bottom:1px solid var(--line-100); }
.pos-schedcombo__head .mono { font-size:var(--text-2xs); color:var(--text-subtle); }
/* Pintasan "Jadwal baru" (owner 2026-08-12) — melekat di dasar popover supaya
   selalu terjangkau, termasuk saat daftar kosong ("tidak ketemu" justru saat
   kasir paling butuh membuat baru). */
.pos-schedcombo__new { position:sticky; bottom:0; display:grid;
  grid-template-columns:auto minmax(0,1fr); gap:9px; align-items:center; width:100%;
  padding:10px 12px; border:0; border-top:1px solid var(--line-100);
  background:var(--surface-0); cursor:pointer; text-align:left; color:var(--text-strong); }
.pos-schedcombo__new:hover { background:var(--surface-1); }
.pos-schedcombo__new:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.pos-schedcombo__new span { display:flex; flex-direction:column; gap:1px; min-width:0; }
.pos-schedcombo__new b { font:650 12.5px var(--font-body); }
.pos-schedcombo__new small { font:400 11px var(--font-body); color:var(--text-subtle); overflow-wrap:anywhere; }
/* Kartu di dalam popover tidak lagi punya wadah `.pos-queue-list`; jaraknya diatur
   grid popover-nya sendiri supaya tidak ada dua sumber spacing. */
.pos-schedcombo__pop .pqm { width:100%; }
/* KOREKSI 2026-08-06b (AUDIT UX P0-2) — ambang pecah-2-kolom 1400 → 1700.
   Bukan breakpoint baru: nilai ambang yang SUDAH ada digeser ke titik gagalnya
   isi yang sebenarnya. Terukur: pada viewport 1440px kolom kartu klien hanya
   369px, sedangkan `.pos-clientcard__acts` (Ganti klien + ikon + Reset) selebar
   276px dan tidak pernah menyusut — track identitas tersisa 77px (avatar 48 +
   17px untuk nama/chip) sehingga isinya meluber 148px dan nama klien, chip
   tertaut, nomor dokumen, serta nomor HP saling menimpa. Pada 1600px masih
   meluber 78px; bersih pertama kali pada ~1700px (kolom ≈540px, sisa track
   identitas ≈248px > 225px yang dibutuhkan). Perlindungan 1-kolom yang lama
   baru aktif di 760px — jauh di bawah pita yang rusak. */
@media (max-width:1700px) {
  /* TIGA baris, bukan dua. Versi sebelumnya menaruh kartu klien di baris 1 —
     baris yang SUDAH ditempati accordion Jadwal (`grid-column:1/-1; grid-row:1`),
     sehingga keduanya bertumpuk persis (terukur: rect identik t:93 b:566). Cacat
     itu tak terlihat selama accordion masih tertutup & pendek; ia muncul begitu
     pemilih Jadwal hidup di semua tujuan. */
  .pos-shell--money .pos-work-body { grid-template-columns:minmax(0,1fr); grid-template-rows:min-content min-content min-content; min-height:0; }
  .pos-shell--money .pos-work-body .pos-queue-acc { grid-column:1; grid-row:1; }
  .pos-shell--money .pos-work-body .pos-clientcard { grid-column:1; grid-row:2; align-self:auto; }
  .pos-shell--money .pos-work-body .pos-cartsec { grid-column:1; grid-row:3; align-self:auto; }
}

/* ══ CLIENT CARD — anatomi identitas ═══════════════════════════════════════
   Zona, dari atas ke bawah: judul (kicker + nama) → pil status → meta berlabel
   → field → dock peringatan. Satu sumber jarak per tingkat.

   RAPIKAN 2026-08-09 (owner: "layout __who tidak rapi di desktop, fieldnya dan
   layoutnya"). Tiga cacat TERUKUR yang diperbaiki di anatominya, bukan ditambal:

   1. PROPORSI KEPALA TERBALIK. `__acts` (Ganti klien + ikon + Reset) adalah
      track `auto` selebar 276px yang TIDAK PERNAH menyusut. Pada viewport 1920
      kolom kerja memakai 2 kolom (`1fr | 1.3fr`, baris 7554) sehingga kartu ini
      hanya 542px — terukur `__who` 208px vs `__acts` 276px: tiga tombol sekunder
      lebih lebar daripada identitas yang notabene judul kartunya. Nama klien
      26px hanya kebagian 208-48-12 = 148px.
      Media query TIDAK bisa menangkap ini: lebar VIEWPORT dan lebar KARTU
      bergerak BERLAWANAN di sini (1920 → kartu 542px; 1320 → kartu 662px karena
      ambang 1700px menjadikan kolom kerja satu kolom). Karena itu kepala kartu
      diukur dengan container query — kartu mengukur DIRINYA sendiri.
   2. BARIS PIL JADI LACI SERBAGUNA. `.pos-client-chips` mencampur tiga jenis
      benda dalam satu flex-wrap: pil status, nomor dokumen (teks mono), dan
      input WhatsApp (garis putus-putus tanpa label). Pada track 268px ia pecah
      jadi 2 baris — dan separator " ·" yang ditempel di ekor kode menggantung
      tanpa apa pun sesudahnya begitu input turun baris (persis tangkapan layar
      owner). Kini pil TETAP pil; kode & WhatsApp turun ke `.pos-client-meta`,
      grid pasangan label→nilai, jadi tidak ada lagi separator yatim.
   3. TANGGA FIELD TANPA ATAP. `minmax(min(100%,260px),1fr)` menghasilkan SATU
      kolom selebar 500px pada kartu 542px (terukur di 1920) — tiga select
      raksasa bertumpuk. Ambang yang sama melompat ke 6 kolom saat kartu ±1.270px
      di pita 1180–1700. Kini jumlah kolom punya ATAP (maks 3) sekaligus lantai
      lebar-baca (200px). */
.pos-clientcard {
  container-type:inline-size; container-name:posclient;
  display:grid; align-content:start; gap:var(--space-5);
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--radius-md); padding:var(--space-6);
}
/* Baris komposit = GRID (aturan owner), bukan flex + space-between + wrap.
   Dengan flex, kolom aksi ikut melar/turun sendiri saat nama klien panjang dan
   jarak antar bagian jadi tidak terduga. Grid mengunci: identitas mengisi sisa
   ruang (`minmax(0,1fr)` supaya boleh menyusut), aksi selebar isinya. */
/* `start`, bukan `center` (2026-08-06): dengan `center`, avatar melayang di
   tengah blok identitas yang tinggi dan tombol aksi turun ikut titik tengahnya —
   keduanya tampak tidak sebaris dengan judulnya. Semua rata ATAS. */
/* column-gap 24px, bukan 16px: pil status berakhir 12px dari nama dan dulu hanya
   16px dari tombol "Ganti klien" — dua jarak yang nyaris sama membuat pil terbaca
   ikut kelompok TOMBOL, padahal ia status milik nama. 12px di dalam kelompok vs
   24px antar kelompok menjadikan pengelompokannya tidak ambigu (terukur). */
.pos-clientcard__head { display:grid; grid-template-columns:minmax(0,1fr) auto;
  align-items:start; column-gap:var(--space-7); row-gap:var(--space-5); }
/* Avatar = `var(--space-10)` (48px) — token, bukan angka lepas, supaya indent
   baris aksi di bawah bisa memakai ukuran yang SAMA persis. */
.pos-clientcard__who { display:grid; grid-template-columns:var(--space-10) minmax(0,1fr);
  align-items:start; column-gap:var(--space-4); min-width:0; }
/* Stack identitas 2 tingkat: judul (nama + lencana status) → meta. Jarak dimiliki
   grid induknya; versi lama menumpuk margin-top lalu menolkannya lagi lewat
   selector yang lebih kuat (dua sumber jarak untuk satu celah). */
.pos-client-main { display:grid; row-gap:var(--space-4); align-content:start; min-width:0; }
/* Baris judul = nama + pil status, SEBARIS (owner 2026-08-09: pil "Belum tertaut"
   minta posisi yang lebih rapi). Sebagai baris sendiri ia jadi tingkat ketiga
   yang isinya cuma satu pil kecil — banyak tinggi untuk sedikit informasi. Pola
   judul+lencana mengikatnya ke benda yang ia jelaskan. Grid, bukan flex (aturan
   owner untuk baris komposit).
   Track nama = `minmax(0,max-content)`, BUKAN `1fr`: dengan `1fr` nama merebut
   seluruh sisa baris dan pil terlempar ke tepi kanan kartu — terukur 584px jauh
   dari nama yang ia jelaskan, yaitu cacat yang sama (pil terpisah dari nama)
   dalam bentuk mendatar. `max-content` membuat track selebar isinya sehingga pil
   selalu menempel 12px di belakang nama, baik nama panjang, pendek, maupun saat
   ia berupa input walk-in; `min` 0 menjaganya tetap boleh menyusut. `start`
   melengkapi: tanpa itu track `auto` milik pil ikut melar mengisi sisa baris. */
.pos-client-title { display:grid; grid-template-columns:minmax(0,max-content) auto;
  justify-content:start; align-items:center;
  column-gap:var(--space-4); row-gap:var(--space-3); min-width:0; }
/* Pertahanan lapis kedua P0-2: kalau ambang kelak digeser lagi, isi identitas
   MENYUSUT — tidak meluber menimpa tombol aksi seperti sebelumnya. */
.pos-client-main > * { min-width:0; max-width:100%; }
.pos-client-avatar { width:var(--space-10); height:var(--space-10); flex:none;
  border-radius:var(--radius-pill); background:var(--ink-900); color:var(--surface-0);
  display:flex; align-items:center; justify-content:center;
  font-weight:var(--fw-bold); font-size:var(--text-sm); }
/* Satu baris + ellipsis (mengikuti master prototipe): pil status disejajarkan
   `center` terhadap nama, jadi nama yang pecah dua baris membuat pil melayang di
   tengah tumpukan — terbaca tidak menempel ke apa pun. Nama penuh tetap terbaca
   lewat atribut `title` (hover) dan record CRM. */
.pos-client-name { font-family:var(--font-display); font-size:26px; font-weight:800;
  letter-spacing:var(--ls-display); line-height:1.12; margin:0; color:var(--ink-900);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* Lebar penuh selnya, bukan `min(420px,100%)`: sekarang lebar nama SUDAH dibatasi
   track judul (pil status memakai sisa kanannya), jadi cap kedua hanya membuat
   garis putus-putus berhenti di tengah sel dan tampak seperti field terpotong. */
input.pos-client-name--input { display:block; width:100%; min-width:0; border:0; border-bottom:1px dashed transparent; border-radius:0; background:transparent; padding:0; outline:none; }
input.pos-client-name--input::placeholder { color:var(--ink-200); }
input.pos-client-name--input:hover, input.pos-client-name--input:focus { border-bottom-color:var(--ink-300); box-shadow:none; }
/* Pil status SAJA — tinggi seragam, jadi wrap-nya rata dan terbaca sebagai satu
   kelompok. Kode/WhatsApp sudah pindah ke `.pos-client-meta`, tombol CRM ke
   `.pos-clientcard__acts`. Rata KIRI: pil mengekor nama (lihat catatan track
   `max-content` di `.pos-client-title`), tidak melayang ke tepi kanan. */
.pos-client-chips { display:flex; align-items:center; flex-wrap:wrap;
  justify-content:flex-start; gap:var(--space-2) var(--space-3); margin:0; min-width:0; }
.pos-clientcard__acts { display:flex; align-items:center; flex-wrap:wrap;
  justify-content:flex-end; gap:var(--space-3); min-width:0; }
.pos-chip { display:inline-flex; align-items:center; gap:4px; font-family:var(--font-mono); font-size:10px; letter-spacing:.06em; text-transform:uppercase; padding:3px 8px; border-radius:100px; border:0; }
.pos-chip svg { flex:none; }
.pos-chip--linked { background:color-mix(in srgb, var(--accent-mint,#047857) 14%, white); color:var(--accent-mint,#047857); }
.pos-chip--tier { background:color-mix(in srgb, var(--accent-blue,#2F63B7) 12%, white); color:var(--accent-blue,#2F63B7); }
.pos-chip--walkin { background:var(--surface-1); color:var(--ink-600); border:1px solid var(--line-200); }
.pos-chip--btn { background:var(--surface-1); color:var(--ink-600); border:1px solid var(--line-200); cursor:pointer; transition:all .14s ease; }
.pos-chip--btn:hover { border-color:var(--ink-900); color:var(--ink-900); }

/* ── Meta identitas: pasangan label→nilai ────────────────────────────────────
   Menggantikan "kode + separator + input telanjang" yang dulu menumpang di
   baris pil. Tiap fakta punya label mono sendiri (`.pos-flbl`, idiom label yang
   SAMA dengan field di bawahnya), jadi tidak ada lagi tanda "·" yang harus
   menjelaskan hubungan antar potongan teks — dan tidak ada yang bisa yatim.
   `auto-FILL`, bukan `auto-fit`: saat isinya cuma satu item (walk-in tanpa
   booking → hanya WhatsApp), `auto-fit` mengempeskan track kosong dan menyisakan
   SATU track selebar 410px — garis putus-putus sepanjang 410px untuk 13 digit
   nomor (terukur). `auto-fill` mempertahankan irama kolomnya, jadi satu item
   tetap selebar satu kolom (±197px) dan sisanya dibiarkan kosong. */
.pos-client-meta { display:grid; grid-template-columns:repeat(auto-fill,minmax(min(100%,168px),1fr));
  column-gap:var(--space-5); row-gap:var(--space-4); margin:0; min-width:0; }
.pos-client-meta__item { display:grid; row-gap:var(--space-2); align-content:start; min-width:0; }
.pos-client-meta dt, .pos-client-meta dd { margin:0; min-width:0; }
/* `.pos-shell--money .pos-flbl` membawa `margin:0 0 7px` (baris 7149) dan menang
   spesifisitas atas `.pos-client-meta dt`. Tanpa penolan ini celah label→nilai
   jadi 4px + 7px = 11px: dua sumber jarak untuk satu celah, persis pola yang
   dibersihkan di blok ini. Terukur: tinggi item 39px → 30px setelah dinolkan. */
.pos-client-meta .pos-flbl { margin:0; }
.pos-client-code { display:block; font-family:var(--font-mono); font-size:12.5px;
  line-height:var(--lh-snug); color:var(--ink-600); letter-spacing:var(--ls-normal);
  overflow-wrap:anywhere; }
/* Input WhatsApp mengisi selnya penuh — lebar tidak lagi ditawar-menawar dengan
   pil di sebelahnya (dulu `flex:1 1 100px; max-width:180px` di dalam baris pil,
   yang membuatnya jatuh sendirian ke baris kedua seperti field yatim). */
input.pos-client-phone { display:block; width:100%; min-width:0; max-width:none; border:0;
  border-bottom:1px dashed var(--ink-300); border-radius:0; background:transparent;
  font-family:var(--font-mono); font-size:12.5px; line-height:var(--lh-snug);
  color:var(--ink-800); padding:0 0 var(--space-1); outline:none; }
input.pos-client-phone:hover { border-bottom-color:var(--ink-600); }
input.pos-client-phone:focus { border-bottom-color:var(--ink-900); box-shadow:none; }
input.pos-client-phone::placeholder { color:var(--ink-200); }

/* ── Kegagalan isi diukur pada KARTU, bukan pada layar ───────────────────────
   Ambang = jumlah anggaran isinya, bukan angka bulat yang enak dilihat:
     avatar          48  (var(--space-10))
   + jarak           12
   + nama display   300  ("Rakha Pratama Wijaya" @26px/800 ≈ 280px)
   + jarak           12
   + pil status     200  (tertaut + tier; walk-in hanya 104)
   + jarak antar-kelompok 24
   + `__acts`       322  (CRM + Ganti klien + Reset — track `auto`, TIDAK menyusut)
   ------------------------------------------------------------------
   = 918 → dibulatkan 920.
   Di bawah itu aksi turun ke barisnya sendiri dan identitas memakai lebar kartu
   penuh. Terukur pada ambang lama (660px) kartu 802px tetap sebaris dan nama
   klien tergencet jadi 142px — terpotong ellipsis padahal kartunya lapang.
   Rata TEPI KARTU, bukan di-indent sejajar teks identitas: indent menambah GARIS
   RATA KIRI KETIGA (tepi kartu untuk field di bawah, teks identitas untuk nama,
   dan indent untuk tombol) — tiga tepi bertingkat di satu kolom sempit terbaca
   berantakan. Pemisahnya sudah ada: `border-top` milik `.pos-client-grid`
   menandai batas kepala ↔ field. */
@container posclient (max-width:920px) {
  .pos-clientcard__head { grid-template-columns:minmax(0,1fr); }
  .pos-clientcard__acts { justify-content:flex-start; }
}
/* Nama + pil sebaris butuh ±200px untuk nama dan ±104–200px untuk pil (satu pil
   di walk-in, dua saat tertaut). Di bawah ±460px pil turun ke bawah nama —
   sebaris di situ hanya menyisakan nama selebar dua kata. */
@container posclient (max-width:460px) {
  .pos-client-title { grid-template-columns:minmax(0,1fr); }
}
/* Kartu benar-benar sempit (mobile / kolom terjepit): tombol berbagi lebar rata
   supaya tidak menyisakan ekor ruang kosong yang ganjil di kanan. */
@container posclient (max-width:400px) {
  .pos-clientcard__acts .pos-abtn { flex:1 1 auto; }
  .pos-clientcard__acts .pos-abtn--icon { flex:0 0 auto; }
}

/* Tombol sekunder prototype (.abtn) */
.pos-abtn { display:inline-flex; align-items:center; justify-content:center; gap:8px; height:40px; padding:0 16px; border-radius:10px; border:1px solid var(--line-200); background:var(--surface-0); cursor:pointer; font:500 13.5px/1 var(--font-body); color:var(--ink-900); transition:background .14s ease, border-color .14s ease; }
.pos-abtn:hover { background:var(--surface-1); }
.pos-abtn--icon { width:40px; padding:0; }
.pos-abtn svg { flex:none; width:15px; height:15px; }

/* ── Grid field kartu klien ──────────────────────────────────────────────────
   Rapikan 2026-08-06: `align-items:start` supaya field TIDAK saling meregang —
   sebelumnya satu field ber-hint (Mode POS) membuat seluruh sel di barisnya ikut
   tinggi, dan kontrolnya melayang di tengah. Row-gap dibuat lebih besar dari
   column-gap agar baris terbaca sebagai baris, bukan kisi rata. */
.pos-client-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  column-gap:var(--space-4); row-gap:var(--space-5); align-items:start;
  border-top:1px solid var(--line-100); padding-top:var(--space-5); }
.pos-client-grid--adv { border-top:0; padding-top:0; }
/* KOREKSI 2026-08-06b (AUDIT UX P1-2) — alasan "kolom kerja ini sempit" sudah
   TIDAK berlaku: sejak P0-2 area kerja single-column sampai 1700px, jadi kartu
   klien selebar ±1.270px. Memaksa 1 field per baris di sana merentang sebuah
   <select> berisi kata "Personal" sampai ~950px dan mendorong Layanan, Tanggal,
   serta strip peringatan keluar layar. Tangga 3 → 2 → 1 milik `.pos-client-grid`
   sudah ada (≤1180 dan ≤760) — modifier ini cukup mewarisinya, dengan lebar baca
   dibatasi token kontainer supaya kontrol tidak pernah melar melewati ukuran
   yang wajar dibaca. */
/* Aturan KEGAGALAN ISI, bukan label perangkat: kolom terbentuk sebanyak yang
   muat pada lebar kartu yang sebenarnya. Itu menutup jebakan yang sama dua kali
   — tangga 3→2→1 lama memakai lebar VIEWPORT, padahal yang sempit adalah KARTU
   (pada 1784px kartu klien hanya ±560px meskipun layarnya lebar).
   Catatan: `max-width:var(--container-md)` sempat dicoba dan MATI — token itu
   ada di design-system/tokens.css tetapi tidak pernah dialiaskan ke app.css,
   jadi computed value-nya `none`. Diverifikasi di runtime, bukan lewat grep. */
/* KOREKSI 2026-08-09 — `minmax(min(100%,260px),1fr)` memakai lantai 260px untuk
   MENAHAN jumlah kolom di 3 saat kartunya lebar. Cara itu punya dua sisi rugi
   yang terukur:
     · kartu 542px (viewport 1920, kolom kerja 2 kolom) → 542 < 2×260+12, jadi
       hasilnya SATU kolom selebar 500px: tiga <select> raksasa bertumpuk.
     · kartu ±1.270px (pita 1180–1700, kolom kerja 1 kolom) → 4 kolom, bukan 3.
   Lantai lebar TIDAK BISA merangkap jadi atap jumlah kolom. Karena itu keduanya
   ditulis terpisah:
     atap  = (100% − gap×(N−1)) / N  → track tak pernah lebih sempit dari 1/3
             ruang, jadi kolom berhenti di 3 berapa pun lebar kartunya;
     lantai= 180px                   → lebar baca minimum sebuah select. Diuji,
             bukan ditebak: pada 184px ketiga select ("VIRCANSASTUDIO",
             "Personal", "Walk-in") masih memuat teksnya tanpa terpotong
             (scrollWidth == clientWidth). Lantai 200px sempat dipakai dan
             menjatuhkan kartu 578px — lebar kartu di layar 1920 — ke 2 kolom,
             menyisakan "Channel" sendirian di baris kedua.
   `max()` mengambil yang lebih besar (atap menang di kartu lebar, lantai menang
   di kartu sempit); `min(100%, …)` menjaga kartu <200px tidak meluber.
   `− 1px` itu KELONGGARAN, bukan hiasan: tanpa itu 3 track + 2 gap berjumlah
   PERSIS 100%, dan pembulatan pecahan menjatuhkannya ke 2 kolom. Terukur pada
   kartu 1.010px: atap 328,67px → 1022/340,67 = 3,0000 → dibulatkan turun jadi
   2 kolom selebar 499px. Dengan kelonggaran 1px hasilnya 3 kolom 328px.
   Hasil terukur: kartu 309px → 1 kolom, 578px → 3 kolom 184px, 760px → 3 kolom,
   1.010px → 3 kolom 328px. */
.pos-client-grid--rows { row-gap:var(--space-5);
  grid-template-columns:repeat(auto-fit,
    minmax(min(100%, max(180px, (100% - 2 * var(--space-4) - 1px) / 3)), 1fr)); }
/* Kontainer field = grid stack (label → kontrol → hint) dengan jarak tunggal,
   menggantikan margin-bottom label. Satu sumber jarak, bukan dua yang bertumpuk. */
.pos-client-grid .pos-fld { display:grid; row-gap:var(--space-3); align-content:start; min-width:0; }
.pos-client-grid .pos-fld > .pos-flbl { margin:0; }
/* Hint field: turunan visual dari kontrolnya, bukan pesaingnya. */
.pos-client-grid .pos-fld > .fhint { margin:0; font-size:11.5px; line-height:1.45; color:var(--ink-500); }
/* No. dokumen = baris komposit (input + tombol edit) → grid, bukan flex.
   Border/latar kontainer luar DICABUT: `.content--pos .pos-docnum-input` sudah
   membawa styling field sendiri, jadi versi lama merender kotak-di-dalam-kotak
   dan menyisakan input yang terpotong. Kini input mengisi sisa ruang penuh dan
   tingginya disamakan dengan `.vs-field__control` di sebelahnya. */
.pos-client-grid .pos-docnum { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center;
  gap:var(--space-2); border:0; background:none; padding:0; border-radius:0; }
.pos-client-grid .pos-docnum .pos-docnum-input { width:100%; min-width:0; height:44px; padding:0 13px; }
.pos-client-grid .pos-docnum .pos-mini-edit { height:44px; width:44px; flex:none; }
/* Dock status & peringatan di dalam client card: nempel dasar card + sticky ke dasar
   viewport → selalu terlihat tanpa scroll (menggantikan sticky grid-item lama).
   Offset bottom melewati .pos-actionbar yang sticky (±89px) agar tidak tertutup. */
/* `margin-top:auto` DICABUT 2026-08-06: dipasangkan dengan card yang meregang
   setinggi kolom cart, ia mendorong dock ke dasar dan meninggalkan rongga kosong
   besar di tengah kartu. Dock kini menempel tepat di bawah grid field; sticky-nya
   tetap agar peringatan tidak tertutup action bar saat halaman digulir. */
.pos-clientcard .pos-alertdock { position:sticky; bottom:104px; display:flex; flex-direction:column; gap:var(--space-4); z-index:6; }
@media (max-width:760px) { .pos-clientcard .pos-alertdock { bottom:14px; } }   /* actionbar mobile = static */
.pos-clientcard .pos-verify-alert { margin-top:0; }
.pos-clientcard .pos-paxhint-cart { margin:0; background:var(--surface-0); border-radius:8px; }

/* ── CART SECTION — kontainer ber-border (grid) agar hierarki jelas, sejajar client card.
   Header dipisah divider; sub-elemen (Jadwal sesi, line items) jadi panel di dalamnya. ── */
.pos-cartsec { display:grid; gap:14px; min-width:0; background:var(--surface-0); border:1px solid var(--line-200); border-radius:14px; padding:16px 18px 18px; align-content:start; }
/* child kosong (paxhint/order panel/cart tanpa item) tak boleh menyisakan gap grid */
.pos-cartsec > :empty { display:none; }
.pos-cartsec__head { display:flex; justify-content:space-between; align-items:center; gap:12px; padding-bottom:14px; border-bottom:1px solid var(--line-100); flex-wrap:wrap; }
.pos-cartsec__title { display:flex; align-items:center; gap:9px; min-width:0; }
.pos-cartsec__ico { width:20px; height:20px; flex:none; color:var(--ink-900); }
.pos-cartsec__title h2 { font-family:var(--font-display); font-size:18px; font-weight:700; letter-spacing:-.01em; margin:0; color:var(--ink-900); }
.pos-cart-count { background:var(--ink-050,#F2F4F7); border-radius:100px; min-width:22px; height:22px; display:inline-flex; align-items:center; justify-content:center; font-size:11px; padding:0 6px; color:var(--ink-800); letter-spacing:0; }
.pos-cartsec__acts { display:flex; gap:9px; flex:none; }
.pos-cartsec__acts .pos-abtn { height:44px; padding:0 18px; }
.pos-addbtn { display:inline-flex; align-items:center; gap:8px; height:44px; padding:0 18px; border:0; border-radius:10px; background:var(--money-brand); color:var(--money-brand-ink); font:700 13.5px/1 var(--font-body); cursor:pointer; transition:filter .14s ease; }
.pos-addbtn:hover { filter:brightness(.95); }
.pos-addbtn svg { width:16px; height:16px; flex:none; stroke:currentColor; }

/* Box "Jadwal sesi" — global (rental + paket fixed-duration + manual "Butuh jadwal")
   + pill kantong sesi (Order). 12.58: SATU-SATUNYA tempat tanggal/jam/resource/selesai.
   Sizing brief: field TIDAK memenuhi lebar kartu — resource ≤420px, date ~160px,
   time/end ~140–152px; gap 8–10px; padding kartu 12px; kontrol tetap 44px. */
.pos-sesbox { border:1px solid var(--line-200); border-radius:12px; padding:12px; background:var(--surface-1); display:flex; flex-direction:column; gap:10px; }
.pos-sesbox__top { display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:10px; }
.pos-sesbox__cap { display:flex; align-items:center; gap:9px; color:var(--ink-900); }
.pos-sesbox__cap svg { flex:none; }
.pos-sesbox__cap .pos-mini-label { margin:0; }
.pos-ses-pills { display:flex; gap:6px; flex-wrap:wrap; align-items:center; }
.pos-ses-pill { display:inline-flex; align-items:center; gap:7px; padding:8px 15px; border-radius:100px; font:500 13px/1 var(--font-body); background:color-mix(in srgb, var(--sesc,var(--accent-cyan)) 14%, white); color:var(--ink-900); border:1px solid transparent; transition:all .14s ease; }
.pos-ses-pill i { width:7px; height:7px; border-radius:100px; background:var(--sesc,var(--accent-cyan)); flex:none; }
.pos-ses-pill--active { font-weight:700; border-color:var(--sesc,var(--accent-cyan)); box-shadow:0 0 0 2px color-mix(in srgb, var(--sesc,var(--accent-cyan)) 30%, white); }
/* Tab dinamis: pill kantong tersimpan bisa diklik utk kembali mengedit. */
.pos-ses-pill[data-pos-ord-sel] { cursor:pointer; }
.pos-ses-pill[data-pos-ord-sel]:not(.pos-ses-pill--active):hover { border-color:var(--sesc,var(--accent-cyan)); }
.pos-ses-pill__x { border:0; background:transparent; color:var(--ink-400); cursor:pointer; padding:0 0 0 2px; display:inline-flex; align-items:center; }
.pos-ses-pill__x:hover { color:var(--accent-red,#F5365E); }
.pos-ses-pill__badge { font-style:normal; font-family:var(--font-mono); font-size:10px; background:#fff; border-radius:100px; padding:2px 6px; }
.pos-ses-add { display:inline-flex; align-items:center; gap:6px; padding:8px 14px; border-radius:100px; border:1px dashed var(--ink-300); background:transparent; cursor:pointer; font:500 13px/1 var(--font-body); color:var(--ink-600); transition:all .14s ease; }
.pos-ses-add:hover { border-color:var(--ink-900); color:var(--ink-900); }
.pos-ses-add svg { flex:none; width:14px; height:14px; }
/* 12.58: baris field kompak — flex wrap, lebar terukur per field (desktop 4-up →
   wrap alami 3 → 2 → 1 saat sempit; mobile full-width di media query bawah). */
/* Grid rapi: Room satu baris penuh; Tanggal · Jam · Selesai berbagi baris kedua
   rata — tidak ada field jatuh sendirian / label wrap saat kolom cart sempit. */
.pos-sesbox__fields { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px; align-items:start; }
.pos-sesbox__room { grid-column:1 / -1; }
/* KOREKSI 2026-08-06b (AUDIT UX P2-7) — "Selesai (auto - 1 jam)" butuh 166px
   pada sel 150px; `nowrap` + `clip` memotong tulisannya, bukan meringkasnya. */
.pos-sesbox__end .pos-flbl { white-space:normal; }
.pos-sesbox .pos-fld .vs-field__control { background:var(--surface-0); }
.pos-ses-end { height:44px; display:flex; align-items:center; padding:0 13px; border:1px solid var(--border-input,#DDE1E8); border-radius:10px; background:var(--surface-0); color:var(--ink-600); font-size:14px; letter-spacing:0; }
/* Keterangan status resource sesi: Dari katalog item / kandidat / wajib pilih */
.pos-res-note { display:block; margin-top:5px; font:500 11px/1.4 var(--font-body); color:var(--ink-500); }
.pos-res-note.is-lock { color:var(--tag-mint-text,#047857); }
/* AUDIT UX P2-5 — dua kontrol jadwal yang saling mencerminkan, dikatakan. */
/* ink-600, bukan ink-500: kotak sesi berlatar surface-1, dan pada latar itu
   ink-500 turun ke 3,9:1. Kalimat instruksi wajib lolos AA. */
.pos-sesbox__mirror { margin:0 0 var(--space-3); font-size:var(--text-2xs); line-height:var(--lh-normal); color:var(--ink-600); }
/* AUDIT UX P0-4 — keranjang lintas-tanggal: peringatan, bukan catatan netral. */
.pos-ses-multidate { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start;
  gap:var(--space-2); margin-top:var(--space-3); color:var(--tag-warning-text); }
.pos-ses-multidate svg { margin-top:1px; }
/* AUDIT UX P2-4 — kerangka kotak tetap ada di DIRECT, isinya satu baris. */
.pos-sesbox--collapsed .pos-sesbox__hint { margin-top:var(--space-2); }
/* Room yang sudah ditentukan katalog item tidak tampil sebagai field (owner 2026-08-12):
   satu baris fakta menggantikan select mati. Grid — bukan flex — supaya ikon dan teks
   panjang tidak pernah saling tindih. */
.pos-locked-line { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center;
  gap:var(--space-2); min-height:38px; padding:var(--space-2) 0;
  font:500 var(--text-xs)/var(--lh-normal) var(--font-body); color:var(--ink-700); }
.pos-locked-line svg { color:var(--ink-500); }
.pos-res-note.is-choice { color:var(--tag-info-text,#1D4ED8); }
.pos-res-note.is-warn { color:var(--accent-orange,#F97316); }
/* Warning konflik room antar item (simpan ditolak sampai dipisah ke sesi lain) */
.pos-ses-warn { display:flex; gap:8px; align-items:flex-start; padding:10px 12px; border:1px solid var(--tag-warning-border,#F5C518); border-radius:10px; background:var(--tag-warning-bg,#FFF8DB); color:var(--tag-warning-text,#8A6D00); font:500 12px/1.5 var(--font-body); }
.pos-ses-warn svg { flex:none; margin-top:1px; }

/* Kartu line item (prototype): border kiri hitam · nama · total+meta · grid 4 */
.pos-shell--money .pos-cart { display:flex; flex-direction:column; gap:11px; }
.pos-shell--money .pos-line { border:1px solid var(--line-200); border-left:3px solid var(--ink-900); border-radius:12px; padding:14px 16px; background:var(--surface-0); display:flex; flex-direction:column; gap:14px; box-shadow:none; }
/* 12.67 F6 — baris komposit WAJIB grid auto|minmax(0,1fr)|auto (aturan owner
   "baris komposit = grid"); flex lama membuat kolom tidak pernah sejajar antar
   kartu karena tiap jenis item merender subset sel berbeda (audit 12.67 K-10). */
.pos-shell--money .pos-line-main { display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:var(--space-4); align-items:center; }
.pos-shell--money .pos-line-id { min-width:0; display:grid; gap:var(--space-1); }
.pos-shell--money .pos-line-main .pos-line-name { width:100%; min-width:0; height:var(--field-h); border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); padding:0 var(--space-4); font-size:var(--text-md); font-weight:var(--fw-semibold); color:var(--text-strong); box-shadow:none; }
/* Nama item katalog: read-only (hanya baris manual yang isinya dipakai server,
   orders.php:4880) — tampil sebagai teks, bukan kotak isian palsu. */
.pos-shell--money .pos-line-main .pos-line-name[readonly] { border-color:transparent; background:transparent; padding-left:0; }
.pos-line-sub { display:block; font-size:var(--text-2xs); color:var(--text-subtle); line-height:var(--lh-snug); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-line-amt { text-align:right; flex:none; }
.pos-shell--money .pos-line-total { font-family:var(--font-mono); font-size:17px; font-weight:700; color:var(--ink-900); }
.pos-line-meta { display:block; font-size:11px; color:var(--ink-600); margin-top:1px; font-family:var(--font-body); }
/* 12.67 F6 — 38px/9px diganti token + ambang sentuh 44px yang memang sudah
   ditegakkan modul ini di tempat lain (audit 12.67 T-24, T-28). */
.pos-shell--money .pos-line-del { width:var(--field-h); height:var(--field-h); flex:none; display:flex; align-items:center; justify-content:center; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); cursor:pointer; color:var(--accent-red); transition:background .14s ease; padding:0; }
.pos-shell--money .pos-line-del:hover { background:var(--surface-1); }
/* 12.58: baris kontrol item = flex wrap, lebar terukur (tier/durasi 140–180px) —
   field tak lagi dipaksa memenuhi lebar kartu; wrap alami 3 → 2 → 1. */
.pos-line-grid { display:flex; flex-wrap:wrap; gap:10px; align-items:flex-start; }
.pos-line-grid .pos-fld { flex:0 0 auto; }
.pos-line-grid .pos-fld--room { flex:1 1 240px; min-width:200px; max-width:420px; }
.pos-line-grid .pos-fld--tier { flex:0 1 auto; min-width:180px; }
.pos-line-grid .pos-fld--tier select.vs-field__control { width:170px; }
.pos-line-grid .pos-fld--price { flex:0 0 160px; }
.pos-line-grid .pos-fld--dur { flex:0 0 auto; min-width:150px; }
/* Jadwal per kantong item (rental multi-room): tanggal · jam mulai · selesai auto. */
.pos-line-grid .pos-fld--ldate { flex:0 0 150px; }
.pos-line-grid .pos-fld--ltime { flex:0 0 118px; }
.pos-line-grid .pos-fld--lend { flex:0 0 108px; }
.pos-line-grid .pos-fld--qty { flex:0 0 150px; }
.pos-line-grid .pos-fld--pax { flex:0 0 170px; }
.pos-line-grid .pos-fld--needsched { flex:0 0 auto; }
.pos-line-grid .pos-line-paxinfo { display:block; margin-top:4px; font-size:10.5px; color:var(--ink-600); }
.pos-line-grid .pos-line-paxinfo.is-over { color:var(--accent-orange,#F97316); }

/* 12.58 adapter primitive — switch GUI/03 + pill tag GUI/07 (tone pastel) untuk
   kontrol "Resource katalog" / "Tier khusus" / "Butuh jadwal" per kantong item. */
.pos-res-ctl, .pos-tier-ctl { display:flex; align-items:center; gap:9px; min-height:44px; flex-wrap:wrap; }
.pos-res-pill {
  display:inline-flex; align-items:center; gap:6px; max-width:100%; min-height:28px;
  font-family:var(--font-mono); font-size:10.5px; font-style:normal; letter-spacing:.05em;
  text-transform:uppercase; padding:5px 10px; border-radius:100px;
  background:var(--tag-mint-bg,#E7F6EE); border:1px solid var(--tag-mint-border,#BFE6D2); color:var(--tag-mint-text,#047857);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.pos-res-pill svg { flex:none; }
.pos-res-pill--follow { background:var(--surface-1); border-color:var(--line-200); color:var(--ink-600); text-transform:none; letter-spacing:0; font-family:var(--font-body); font-weight:500; font-size:12px; }
.pos-res-pill--choice { background:var(--tag-info-bg,#E8F0FE); border-color:var(--tag-info-border,#C3D7FB); color:var(--tag-info-text,#1D4ED8); }
.pos-res-pill--dur { background:var(--surface-1); border-color:var(--line-200); color:var(--ink-600); }
.pos-tier-pill {
  display:inline-flex; align-items:center; min-height:28px; padding:5px 11px; border-radius:100px;
  font:500 12px/1.2 var(--font-body); background:var(--tag-identity-bg,#FFFBD6); border:1px solid var(--tag-identity-border,#EFE38A); color:var(--ink-800);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:100%;
}
.pos-tier-ovlbl { font:500 11px/1.2 var(--font-body); color:var(--ink-500); white-space:nowrap; }
.pos-tier-ctl .switch, .pos-res-ctl .switch { flex:none; }

/* Stepper (− nilai +) dalam bingkai field */
.pos-shell--money .pos-stepper { display:flex; align-items:center; gap:4px; border:1px solid var(--border-input,#DDE1E8); border-radius:10px; padding:2px; height:44px; box-sizing:border-box; background:var(--surface-0); }
.pos-shell--money .pos-step { border:0; width:36px; height:36px; flex:none; display:flex; align-items:center; justify-content:center; border-radius:9px; background:transparent; cursor:pointer; font-size:19px; line-height:1; color:var(--ink-800); transition:background .14s ease; padding:0; }
.pos-shell--money .pos-step:hover { background:var(--surface-1); }
.pos-step-val { flex:1; min-width:0; display:flex; align-items:center; justify-content:center; gap:4px; }
.pos-shell--money .pos-stepper .vs-field__control { height:36px; width:3.6em; flex:none; border:0; background:transparent; padding:0; text-align:center; font-family:var(--font-mono); font-size:14px; font-weight:600; box-shadow:none; }
.pos-step-suffix { font-style:normal; font-family:var(--font-mono); font-size:14px; font-weight:600; color:var(--ink-800); }

/* 12.58: jadwal per-line DIHAPUS — tanggal/jam/selesai hanya hidup di Kantong Sesi
   (blok .pos-line-grid--sched tidak dirender lagi; #posOptionBox tetap pakai .pos-line-sched). */

/* Strip draft/verifikasi (prototype: brand-soft, selalu tampil) */
.pos-shell--money .pos-verify-alert { display:flex; gap:11px; align-items:flex-start; background:var(--brand-soft,#FFFDE6); border:1px solid var(--brand-line,#E6DC00); border-radius:12px; padding:14px 16px; font-size:12.5px; line-height:1.5; color:var(--ink-800); }
.pos-shell--money .pos-verify-alert > svg { flex:none; color:var(--brand-line,#E6DC00); margin-top:1px; width:18px; height:18px; }
.pos-shell--money .pos-verify-alert.is-verified { background:color-mix(in srgb, var(--accent-mint,#047857) 8%, white); border-color:color-mix(in srgb, var(--accent-mint,#047857) 35%, white); }
.pos-shell--money .pos-verify-alert.is-verified > svg { color:var(--accent-mint,#047857); }

/* ── ACTION BAR (Metode tile 4 ikon · aksi · CTA) ──────────────────────── */
.pos-actionbar {
  position:sticky; bottom:0; z-index:18;
  display:flex; align-items:center; gap:16px; flex-wrap:wrap;
  background:var(--surface-0); border:0; border-top:1px solid var(--line-200);
  border-radius:0; padding:14px 28px; box-shadow:0 -8px 24px rgba(5,5,5,.06);
}
.pos-actionbar__cap { margin:0; }
.pos-actionbar__spacer { flex:1; min-width:20px; }
.pos-pay-grid { display:grid; grid-template-columns:repeat(3,64px); gap:8px; }
.pos-pay-tile {
  display:flex; flex-direction:column; align-items:center; gap:6px; padding:11px 6px;
  border-radius:10px; cursor:pointer; border:1px solid var(--line-200); background:var(--surface-0);
  color:var(--ink-600); font:600 11.5px/1 var(--font-body); transition:all .14s ease;
}
.pos-pay-tile:hover:not(.active) { border-color:var(--ink-900); color:var(--ink-900); }
.pos-pay-tile.active { border-color:var(--ink-900); background:var(--ink-900); color:#fff; }
.pos-pay-tile svg { width:18px; height:18px; flex:none; }
/* Aksi = satu baris rapi (grid auto-flow kolom): ikon-ikon + CTA sejajar, tak membungkus. */
.pos-actionbar__acts { display:grid; grid-auto-flow:column; grid-auto-columns:max-content; align-items:center; gap:8px; }
.pos-act-ico { width:46px; height:46px; border-radius:10px; border:1px solid var(--line-200); background:var(--surface-0); color:var(--ink-900); display:inline-flex; align-items:center; justify-content:center; cursor:pointer; transition:background .14s ease; padding:0; }
.pos-act-ico:hover { background:var(--surface-1); }
.pos-act-ico:disabled { opacity:.4; cursor:not-allowed; }
.pos-act-sep { width:1px; height:26px; background:var(--line-200); margin:0 3px; }
.pos-cta { display:inline-flex; align-items:center; justify-content:center; gap:8px; height:46px; padding:0 18px; border:0; border-radius:11px; background:var(--ink-900); color:#fff; font:700 14px/1 var(--font-body); white-space:nowrap; cursor:pointer; transition:background .14s ease; }
.pos-cta:hover { background:var(--primary-hover,#1B1C1F); }
.pos-cta svg { stroke:#fff; flex:none; }

/* ── DRAWER DOKUMEN (slide-over) — status · rincian · notes · preview ──────
   Menggantikan metacard inline; dipicu tombol receipt di .pos-actionbar__acts. */
.pos-drawer[hidden] { display:none; }
.pos-drawer { position:fixed; inset:0; z-index:60; }
.pos-drawer__scrim { position:absolute; inset:0; background:rgba(5,5,5,.42); backdrop-filter:blur(3px) saturate(120%); -webkit-backdrop-filter:blur(3px) saturate(120%); animation:posScrimIn .2s ease; }
.pos-drawer__panel { position:absolute; top:0; right:0; height:100dvh; width:clamp(20rem,34vw,29.25rem); max-width:94vw; display:flex; flex-direction:column; background:var(--surface-0); border-left:1px solid var(--line-200); box-shadow:-18px 0 52px rgba(5,5,5,.24); animation:posDrawerIn .26s cubic-bezier(.22,.61,.36,1); }
@keyframes posDrawerIn { from { transform:translateX(100%); } to { transform:translateX(0); } }
@keyframes posScrimIn { from { opacity:0; } to { opacity:1; } }
@media (prefers-reduced-motion:reduce) { .pos-drawer__panel, .pos-drawer__scrim { animation:none; } }
.pos-drawer__head { flex:none; display:flex; align-items:center; justify-content:space-between; gap:12px; padding:17px 20px; border-bottom:1px solid var(--line-200); }
.pos-drawer__title { display:flex; align-items:center; gap:9px; font-family:var(--font-display); font-size:16px; font-weight:700; color:var(--ink-900); }
.pos-drawer__title svg { color:var(--ink-600); flex:none; }
.pos-drawer__body { flex:1; min-height:0; overflow:auto; padding:18px 20px 26px; display:flex; flex-direction:column; gap:16px; }
.pos-drawer__body .pos-status-row { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.pos-drawer__body .pos-meta-summary { display:flex; flex-direction:column; gap:8px; }
.pos-drawer__body .vs-field { margin:0; }

/* Tools header modul ("Baru" + "Semua brand" pindah dari konten prototype) */
.pos-hdr-tools { display:inline-flex; gap:8px; align-items:center; }

/* Input .mono di POS pakai Geist Mono (No.Dok/telepon/nominal) */
.content--pos .vs-field__control.mono, .content--pos .pos-docnum-input, .content--pos input.mono { font-family:var(--font-mono); }

/* ── OVERLAY — scrim dalam + blur premium, dialog radius besar ── */
.content--pos .pos-modal { background:rgba(5,5,5,.56); backdrop-filter:blur(8px) saturate(120%); -webkit-backdrop-filter:blur(8px) saturate(120%); }
.content--pos .pos-modal__card, .content--pos .vs-dialog { border-radius:var(--r-lg); box-shadow:0 24px 70px rgba(5,5,5,.34); border:1px solid var(--line-100); }
.content--pos .pos-modal__title b { font-family:var(--font-display); }


/* ══════════════════════════════════════════════════════════════════════════
   POS — TIGA MODE OPERASI (brief Finalisasi Composer/Drawer/POS 2026-08-05)
   Rail Queue (Booking/Trx/Invoice) dicabut; yang tersisa di kolom kiri adalah
   PEMILIH JADWAL untuk mode "Tambah ke Jadwal". Semua nilai dari tokens.css.
   ══════════════════════════════════════════════════════════════════════════ */

/* Mode tanpa rail (Buat Quotation · Penjualan Langsung) = satu kolom penuh. */
.pos-shell--money .pos-cols--single { grid-template-columns:minmax(0,1fr); }

/* ── LANDING: kartu GUI/04/CARD-INTERACTIVE dalam grid ala GUI/18/METHOD-SELECTOR ──
   `.vs-card`/`.vs-card--interactive` dipakai apa adanya (hover/shadow/radius milik
   primitive). Yang ditambahkan hanya grid pembungkus + anatomi isi kartu. */
.pos-shell--landing { display:block; padding:var(--space-8) var(--space-7) var(--space-10); }
.pos-landing { max-width:var(--container-md); margin:0 auto; display:grid; gap:var(--space-7); }
.pos-landing__head { display:grid; gap:var(--space-2); }
.pos-landing__title { font-family:var(--font-display); font-size:var(--text-h2); font-weight:var(--fw-bold); letter-spacing:var(--ls-tight); color:var(--text-strong); margin:0; }
.pos-landing__sub { margin:0; font-size:var(--text-xs); line-height:var(--lh-relaxed); color:var(--text-muted); }
/* Grid kartu = pola master `04 Cards`: repeat(auto-fit,minmax(...,1fr)) + gap 16.
   Kolom bertambah/berkurang mengikuti lebar kanvas, jadi TIDAK ada breakpoint
   (source Design System memang tidak mendefinisikan media query sama sekali).
   `min(...,100%)` menjaga track tidak pernah lebih lebar dari induknya. */
.pos-modesel { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(calc(var(--container-sm) / 3),100%),1fr)); gap:var(--space-5); }
/* Baris komposit ikon + teks + aksi = GRID (aturan owner), bukan flex. */
.pos-modecard {
  display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:start;
  gap:var(--space-4); text-align:left; padding:var(--space-6); width:100%;
  font:inherit; color:var(--text-body);
}
.pos-modecard__ic {
  width:var(--space-9); height:var(--space-9); display:inline-flex; align-items:center; justify-content:center;
  border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-strong);
}
.pos-modecard__body { display:grid; gap:var(--space-2); min-width:0; }
.pos-modecard__t { font-family:var(--font-display); font-size:var(--text-md); font-weight:var(--fw-bold); color:var(--text-strong); }
.pos-modecard__d { font-size:var(--text-xs); line-height:var(--lh-normal); color:var(--text-muted); }
.pos-modecard__go { color:var(--text-subtle); margin-top:var(--space-1); }
.pos-modecard:hover:not(:disabled) .pos-modecard__ic { background:var(--bg-ink); color:var(--text-on-dark); }
.pos-modecard:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.pos-modecard:disabled { opacity:.5; cursor:not-allowed; }

/* Money bar varian ORDER — enam sel bernilai (Mode · Total Order · Terbayar ·
   Menunggu verifikasi · Sisa · Perkiraan batch). Grid 6-track money bar lama
   dikunci untuk varian QUOTE dan tidak muat di sini.
   Lebarnya diputus INTRINSIK: `auto-fit` menambah/mengurangi kolom mengikuti
   lebar bar (6 kolom di monitor lebar, 2 kolom di ponsel) sehingga varian ini
   TIDAK memerlukan breakpoint sama sekali — sesuai source Design System yang
   memang tidak mendefinisikan media query. Ambang track memakai min-width sel
   Total yang sudah ada di file ini (`.pos-moneybar__grand{min-width:160px}`),
   bukan angka baru; `min(...,100%)` menjaga track tidak melebihi induknya.
   Selector DIKUALIFIKASI `.pos-moneybar.pos-moneybar--order` (0-2-0) supaya
   aturan responsif money bar lama (0-1-0, letaknya lebih bawah) tidak menang
   hanya karena urutan — kecuali `position`/`padding` mobile yang memang ingin
   diwarisi apa adanya. */
/* Koreksi 2026-08-06: `auto-fit` membagi lebar RATA, sehingga sejak tab mode &
   No. dokumen pindah ke bar, track identitas kesempitan dan tab membungkus —
   tinggi bar melonjak 105px → 507px saat mode berpindah, persis "layout berubah
   tiap mode" yang diperbaiki. Sekarang track identitas content-sized dan spacer
   yang menyerap sisa ruang, sama seperti varian QUOTE.
   Urutan: Mode | No.dok | spacer | Total Order | Terbayar | Menunggu | Sisa | Total. */
.pos-moneybar.pos-moneybar--order {
  display:grid;
  grid-template-columns:auto auto minmax(20px,1fr) max-content max-content max-content max-content max-content;
  align-items:center; column-gap:clamp(20px, 2.2vw, 48px); row-gap:var(--space-5);
}
/* `margin-left:auto` milik money bar lama (dipakai untuk mendorong sel ke kanan
   pada layout FLEX) mendorong sel ke tepi kanan track-nya di grid ini → sel Sisa
   tampak tidak sebaris dengan sel lain. Dinetralkan untuk varian Order. */
.pos-moneybar--order .pos-moneybar__seg { min-width:0; margin-left:0; }
.pos-moneybar--order .pos-sisa-amt { font-size:var(--text-md); color:var(--text-on-dark); }
.pos-moneybar--order .pos-moneybar__sisa .pos-sisa-amt { color:var(--money-accent); }
.pos-moneybar--order .pos-grandtotal { font-size:var(--text-h3); }
.pos-moneybar--order .pos-moneybar__note { color:var(--text-on-dark-muted); }

/* Chip mode aktif di money bar (menggantikan segmented "Tipe Dokumen"). */
/* ── Kontrol di dalam money bar (owner 2026-08-06) ───────────────────────────
   Money bar kini kontainer IDENTITAS DOKUMEN + uang: tab mode dan nomor dokumen
   pindah ke sini dari kartu klien. Karena bar berlatar gelap, kontrolnya butuh
   varian gelap sendiri — `.vs-field__control` di sini akan tampil putih menyala
   dan merusak hierarki bar. */
/* Bentuk SELARAS (2026-08-06): dulu tab aktif berbentuk pill sementara kontainer
   dan tab non-aktif berbentuk kotak — tiga bentuk berbeda di satu kelompok, jadi
   penanda aktifnya terbaca sebagai anomali, bukan status. Sekarang kontainer dan
   semua tab memakai keluarga radius yang sama; yang membedakan aktif hanya ISIAN
   warna, bukan bentuk. Radius dari token — kontrak bentuk sudut (shape_contract)
   melarang nilai literal. */
/* `.pos-modetabs` / `.pos-modetab` DICABUT 2026-08-07. Tujuan tidak lagi berupa
   tiga tab jenis dokumen; penggantinya `.pos-dest*` di blok `.pos-side-foot`. */
.pos-moneybar__docnum .pos-docnum { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center;
  gap:var(--space-2); border:0; background:none; padding:0; }
.pos-bar-input { height:32px; width:100%; min-width:0; padding:0 10px; border:1px solid rgba(255,255,255,.16);
  border-radius:var(--radius-xs); background:rgba(255,255,255,.06); color:#fff; font-size:12px; outline:none; }
.pos-bar-input:focus { border-color:var(--money-accent); }
.pos-bar-iconbtn { display:inline-flex; align-items:center; justify-content:center; width:32px; height:32px;
  flex:none; border:1px solid rgba(255,255,255,.16); border-radius:var(--radius-xs);
  background:rgba(255,255,255,.06); color:rgba(255,255,255,.7); cursor:pointer; transition:all .16s ease; }
.pos-bar-iconbtn:hover { color:#fff; border-color:rgba(255,255,255,.34); }

/* Rail & kotak jadwal versi NONAKTIF — dirender di semua mode supaya kerangka
   halaman tidak berubah; hanya isinya yang mati (owner: "tinggal non aktifkan
   field sesuai kebutuhan"). */
.pos-queue--off .pos-queue__in { opacity:.55; }
.pos-queue-search.is-off input { cursor:not-allowed; }
.pos-queue-empty { display:flex; flex-direction:column; align-items:center; gap:var(--space-3);
  padding:var(--space-8) var(--space-5); text-align:center; color:var(--text-muted); }
.pos-queue-empty b { font-size:13px; color:var(--text-strong); }
.pos-queue-empty span { font-size:12px; line-height:1.5; max-width:34ch; }
.pos-sesbox.is-off { opacity:.6; }

.pos-modechip {
  display:inline-flex; align-items:center; gap:var(--space-2);
  padding:var(--space-2) var(--space-4); border-radius:var(--radius-pill);
  border:1px solid var(--border-default); background:var(--surface-1);
  font-family:var(--font-body); font-size:var(--text-xs); font-weight:var(--fw-semibold); line-height:1;
  color:var(--text-strong);
}
.pos-modechip svg { width:var(--text-sm); height:var(--text-sm); flex:none; }
.pos-moneybar__note { display:block; margin-top:var(--space-1); font-size:var(--text-2xs); color:var(--text-subtle); }

/* ── STRIP KONTEKS ORDER (mode Tambah ke Jadwal / Penjualan Langsung) ────── */
/* Baris komposit ikon | teks | aksi mengikuti grid unit library. Track tengah
   menyerap penyempitan; grup aksi membungkus tanpa breakpoint improvisasi. */
.pos-ctxbar {
  display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center;
  gap:var(--space-4); padding:var(--space-4) var(--space-5); margin-bottom:var(--space-5);
  border:1px solid var(--border-default); border-radius:var(--radius-md); background:var(--surface-1);
}
.pos-ctxbar > svg { width:var(--text-md); height:var(--text-md); flex:none; color:var(--text-muted); }
.pos-ctxbar__txt { display:grid; gap:var(--space-1); min-width:0; }
.pos-ctxbar__txt b { font-size:var(--text-xs); color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-ctxbar__txt span { font-size:var(--text-2xs); color:var(--text-muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* Kolom aksi tetap track ke-3 `auto` (aturan owner: baris komposit = grid
   auto|minmax(0,1fr)|auto). Penyempitan layar diserap INTRINSIK: `flex-wrap`
   menumpuk tombol lalu tiap tombol membungkus labelnya sendiri. JANGAN memberi
   `min-width:0` di sini — itu menurunkan kontribusi min-content kolom ke 0 dan
   tombol akan menimpa kolom teks. */
.pos-ctxbar__acts { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; justify-content:flex-end; }
.pos-ctxbar--empty { background:var(--surface-0); border-style:dashed; grid-template-columns:auto minmax(0,1fr); }
.pos-ctxbar--locked { border-color:var(--pst-warning-border); background:var(--pst-warning-bg); }
.pos-ctxbar--locked > svg { color:var(--pst-warning-text); }
/* Baris kunci ledger = ikon + teks + aksi → GRID auto|minmax(0,1fr)|auto
   (aturan owner untuk baris komposit), bukan flex. */
.pos-ctxbar__lock {
  grid-column:1 / -1; display:grid; grid-template-columns:auto minmax(0,1fr) auto;
  align-items:center; gap:var(--space-3);
  font-size:var(--text-2xs); line-height:var(--lh-normal); color:var(--pst-warning-text);
}
.pos-ctxbar__lock svg { flex:none; }

/* Ikon judul cart kini datang dari icon() (bukan <svg> inline di markup). */
.pos-cartsec__ico { display:inline-flex; align-items:center; justify-content:center; }
.pos-cartsec__ico svg { width:var(--text-h4); height:var(--text-h4); }

/* Catatan read-only pada blok jadwal mode Tambah ke Jadwal — baris ikon + teks
   memakai GRID auto|minmax(0,1fr) (aturan owner), jadi teks panjang membungkus
   tanpa pernah mendorong ikonnya. */
.pos-sesbox__hint { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:var(--space-2); margin:var(--space-3) 0 0; font-size:var(--text-2xs); line-height:var(--lh-normal); color:var(--text-muted); }
.pos-sesbox__hint svg { flex:none; margin-top:var(--space-1); }

/* ══ KANTONG SESI POS — framework Satu Alur (owner 2026-08-12 sore) ══════════
   Anatomi baris dari GUI/17/BOOKING-SELECTOR: dot · body · tail pada grid
   auto|minmax(0,1fr)|auto (aturan owner: baris komposit = grid). Status hanya
   fill dot/teks — tanpa garis warna pinggir (aturan owner). Token dengan
   fallback literal mengikuti konvensi `.vs-combo__shell` (--field-h dkk tidak
   dideklarasikan app-wide). */
.pos-pockets { margin:var(--space-3) 0 0; border:1px solid var(--border-default); border-radius:var(--radius-sm,10px); background:var(--bg-card); }
.pos-pockets__head { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:var(--space-3); padding:var(--space-3) var(--space-4); border-bottom:1px solid var(--border-faint); }
.pos-pockets__head .pos-mini-label { display:inline-flex; align-items:center; gap:var(--space-2); margin:0; flex-wrap:wrap; }
/* Chip "1 invoice · N sesi" — fill lembut, tanpa garis warna pinggir (aturan owner). */
.pos-pockets__inv { display:inline-flex; align-items:center; gap:4px; padding:2px 8px;
  background:var(--bg-inset); border-radius:var(--radius-pill,999px);
  font:600 var(--text-2xs)/1.4 var(--font-body); letter-spacing:0; text-transform:none;
  color:var(--text-muted); }
.pos-pockets__acts { display:inline-flex; gap:var(--space-2); }
.pos-abtn--ghost { background:transparent; border-color:transparent; color:var(--text-muted); }
.pos-abtn--ghost:hover { color:var(--text-body); border-color:var(--border-default); }
.pos-pockets__list { display:grid; gap:var(--space-2); padding:var(--space-3) var(--space-4) var(--space-4); }
.pos-pocket { border:1px solid var(--border-faint); border-radius:var(--radius-sm,10px); background:var(--bg-subtle); }
.pos-pocket--new { background:var(--bg-card); border-color:var(--border-default); }
.pos-pocket__row { display:grid; grid-template-columns:auto minmax(0,1fr) auto auto; align-items:center; gap:var(--space-3); min-height:var(--field-h,44px); padding:var(--space-2) var(--space-3); }
.pos-pocket__dot { width:16px; height:16px; flex:none; border-radius:var(--radius-pill,999px); border:1px solid var(--border-default); display:inline-grid; place-items:center; background:var(--bg-card); }
.pos-pocket__dot.is-on::after { content:''; width:8px; height:8px; border-radius:var(--radius-pill,999px); background:var(--ink-900); }
.pos-pocket__main { min-width:0; display:grid; gap:2px; }
.pos-pocket__main b { font:600 var(--text-sm)/var(--lh-snug) var(--font-body); color:var(--text-body); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-pocket__main small { font-size:var(--text-2xs); line-height:var(--lh-normal); color:var(--text-subtle); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pos-pocket__meta { flex:none; font-size:var(--text-2xs); color:var(--text-muted); }
.pos-pocket__del { flex:none; }
.pos-pocket__form { display:grid; grid-template-columns:repeat(auto-fit, minmax(132px, 1fr)); gap:var(--space-3); padding:0 var(--space-3) var(--space-3); border-top:1px solid var(--border-faint); padding-top:var(--space-3); }
.pos-pocket__form .pos-fld { min-width:0; }
.pos-pocket__hint { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:var(--space-2); margin:0; padding:0 var(--space-3) var(--space-3); font-size:var(--text-2xs); line-height:var(--lh-normal); color:var(--text-muted); }
.pos-pocket__hint svg { flex:none; margin-top:var(--space-1); }
.pos-fld--pocket select { max-width:100%; }
/* Baris "Sesi ditagih" di kolom Rincian — pola label|nilai ala GUI/19/BREAKDOWN. */
.pos-billedses { margin:var(--space-3) 0; padding:var(--space-3) 0 0; border-top:1px solid var(--border-faint); display:grid; gap:var(--space-2); }
.pos-billedses .pos-mini-label { margin:0; }
.pos-billedses__row { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:baseline; gap:var(--space-3); font-size:var(--text-2xs); color:var(--text-muted); }
.pos-billedses__lbl { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* ── Responsive ────────────────────────────────────────────────────────── */
/* Laptop (≤1400px): kolom uang masih 2-kolom, tapi gap lega akan meluber →
   rapatkan gap & lepas min-width DP sebelum layout ganti ke 1-kolom di 1180. */
@media (max-width:1400px) {
  .pos-moneybar { column-gap:30px; }
  .pos-moneybar__dp { min-width:0; }
}
@media (max-width:1180px) {
  /* Money bar: grid 6-track (doc|spacer|dp|sisa|divider|grand) butuh ±1035px sementara
     kanvas hanya ±930px → segmen "Total tagihan" meluber keluar viewport (scrollWidth
     > clientWidth). Di bawah 1180 bar dipecah 2 baris: baris 1 = tab dokumen,
     baris 2 = DP · Sisa · Total (Total didorong ke kanan). */
  .pos-moneybar {
    display:flex; flex-wrap:wrap; align-items:center;
    column-gap:18px; row-gap:12px; padding:14px 18px;
  }
  .pos-moneybar__spacer, .pos-moneybar__divider { display:none; }
  .pos-moneybar__doc { flex:1 1 100%; }
  .pos-moneybar__dp { flex:0 1 auto; min-width:0; max-width:440px; }
  /* chip DP default flex:1 → di bar flex-wrap ia ikut melar; kunci ke lebar isinya. */
  .pos-moneybar__dp .pos-dp-chips--bar .pos-dp-chip { flex:0 0 auto; }
  .pos-moneybar__sisa { flex:0 0 auto; min-width:0; margin-left:auto; }
  .pos-moneybar__grand { flex:0 0 auto; min-width:0; text-align:right; }
  .pos-grandtotal { font-size:29px; }
  .pos-shell--money .pos-cols { grid-template-columns:minmax(0,1fr); }
  .pos-shell--money .pos-queue { border-right:0; border-bottom:1px solid var(--line-200); }
  .pos-shell--money .pos-queue__in { position:static; max-height:none; }
  /* DICABUT 2026-08-07: aturan tablet untuk `.pos-shell--money .pos-queue-list`
     (grid auto-fill + clamp tinggi + `.pqm-foot { margin-top:auto }`). Shell money
     tidak lagi merender `.pos-queue-list` — pemilih Jadwal kini combobox — dan
     `.pqm-foot` sudah tidak ada di markup kartu. Tinggi hasil pencarian kini diatur
     `.vs-combo.pos-schedcombo .vs-combo__pop`. */
  /* Band punya scroll internal → baris kartu terakhir selalu terpotong di tepi.
     Fade tipis membuatnya terbaca sebagai "masih ada lanjutannya", bukan kartu tersayat. */
  /* top:auto WAJIB — rule dasar money shell memberi top:180px untuk mode sticky;
     tanpa reset, position:relative menggeser band turun 180px. */
  .pos-shell--money .pos-queue__in { position:relative; top:auto; }
  .pos-shell--money .pos-queue__in::after {
    content:''; position:absolute; left:0; right:0; bottom:0; height:26px; z-index:2;
    pointer-events:none; background:linear-gradient(to top, var(--surface-0), transparent);
  }
  /* Sisakan ruang di bawah kolom kerja supaya kartu/cart terakhir tidak tertutup action bar. */
  .pos-shell--money .pos-work-body { padding-bottom:104px; }
  /* `:not(--rows)` — KOREKSI 2026-08-09. Aturan ini memakai lebar VIEWPORT,
     padahal yang menentukan muat/tidaknya field adalah lebar KARTU, dan di pita
     ini keduanya berlawanan: viewport 1180px justru memberi kartu 1.010px (kolom
     kerja jadi satu kolom di bawah 1180). Hasilnya ia mengalahkan formula
     berbasis isi di `.pos-client-grid--rows` (spesifisitas sama, tapi blok ini
     lebih belakang) dan memaksa 2 kolom selebar 499px di kartu yang sebenarnya
     muat 3 kolom 328px — terukur. Kartu POS kini satu-satunya pemakai grid ini
     dan ia SELALU membawa `--rows`; aturan viewport disisakan hanya untuk varian
     polos supaya pemakai lain di kemudian hari tidak kehilangan tangganya. */
  .pos-client-grid:not(.pos-client-grid--rows) { grid-template-columns:repeat(2,minmax(0,1fr)); }
  /* 12.58: field jadwal/kontrol item flex-wrap → wrap alami 3→2 kolom; cap resource 420px tetap */
}
@media (max-width:760px) {
  /* ≤760: bar sudah flex (lihat blok 1180) → tumpuk penuh 1 kolom. */
  .pos-moneybar { position:static; flex-direction:column; align-items:stretch; row-gap:14px; padding:16px 14px; }
  .pos-moneybar__doc, .pos-moneybar__dp, .pos-moneybar__sisa, .pos-moneybar__grand { flex:0 0 auto; margin-left:0; }
  .pos-moneybar__spacer, .pos-moneybar__divider { display:none; }
  .pos-moneybar__dp, .pos-moneybar__sisa, .pos-moneybar__grand { min-width:0; }
  .pos-moneybar__grand { text-align:left; }
  .pos-shell--money .pos-work-body { padding:16px 12px 24px; }
  /* Head kini grid (bukan flex): tumpuk jadi satu kolom, aksi rata kiri di bawah
     identitas. `align-items:start` supaya avatar tidak melar.
     Catatan: container query `posclient` sudah menumpuk kepala jauh sebelum
     titik ini; dua baris di bawah dibiarkan sebagai jaring pengaman kalau kelak
     kartu dipakai di luar konteks container-nya. */
  .pos-clientcard__head { grid-template-columns:minmax(0,1fr); align-items:start; }
  .pos-clientcard__acts { justify-content:flex-start; }
  /* Lihat catatan `:not(--rows)` di blok 1180: varian `--rows` diatur lebar
     KARTU, dan pada kartu 309px formulanya sudah menghasilkan 1 kolom sendiri. */
  .pos-client-grid:not(.pos-client-grid--rows) { grid-template-columns:1fr; }
  /* 12.58: mobile — semua field jadwal & kontrol item full-width (1 kolom) */
  .pos-sesbox__fields { grid-template-columns:1fr; }
  .pos-line-grid { flex-direction:column; align-items:stretch; }
  .pos-sesbox__room, .pos-sesbox__date, .pos-sesbox__time, .pos-sesbox__end,
  .pos-line-grid .pos-fld, .pos-line-grid .pos-fld--room, .pos-line-grid .pos-fld--tier,
  .pos-line-grid .pos-fld--price, .pos-line-grid .pos-fld--dur, .pos-line-grid .pos-fld--qty,
  .pos-line-grid .pos-fld--pax { flex:1 1 auto; width:100%; min-width:0; max-width:none; }
  .pos-line-grid .pos-fld--tier select.vs-field__control { width:100%; }
  .pos-shell--money .pos-line-main { flex-wrap:wrap; }
  .pos-actionbar { position:static; flex-direction:column; align-items:stretch; padding:12px 14px; gap:12px; }
  .pos-pay-grid { grid-template-columns:repeat(3,minmax(0,1fr)); }
  .pos-actionbar__acts { display:flex; flex-wrap:wrap; justify-content:flex-end; }
  .pos-actionbar .pos-cta { flex:1 1 100%; width:100%; justify-content:center; }
}
/* == POS-MONEY:END =========================================================== */

/* == POSDOC-REFRESH:BEGIN ====================================================
   Drawer "Dokumen & preview" ← library 12.04.05 Stand Alone Master HTML Library:
   #posSummaryRows = "Summary breakdown — Rincian tagihan" (baris polos, kredit
   hijau, rule ink sebelum grand total, callout SISA TAGIHAN); preview Visual =
   "Receipt — struk thermal 58 mm". Netralkan layer receipt lama (rule bar,
   margin anak, watermark) yang menyebabkan overlap. */
/* -- Rincian tagihan (breakdown) -- */
.pos-drawer__body .pos-summary { border:0; border-radius:0; box-shadow:none; margin:0; overflow:visible; display:flex; flex-direction:column; }
.pos-bd-row { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:5px 0; font-size:12.5px; color:var(--text-muted); }
.pos-bd-row b { font-family:var(--font-mono); font-weight:600; font-size:12.5px; color:var(--text-strong); font-variant-numeric:tabular-nums; white-space:nowrap; }
.pos-bd-row.is-sub span, .pos-bd-row.is-sub b { font-size:13px; font-weight:600; color:var(--text-strong); }
.pos-bd-row.is-credit b { color:var(--pst-success-text); }
.pos-bd-rule { height:1.5px; background:var(--ink-900); margin:8px 0 6px; }
.pos-bd-grand { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:2px 0; }
.pos-bd-grand span { font-size:15.5px; font-weight:700; letter-spacing:-.01em; color:var(--text-strong); }
.pos-bd-grand b { font-family:var(--font-mono); font-size:18px; font-weight:700; color:var(--text-strong); font-variant-numeric:tabular-nums; }
.pos-bd-out { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:6px; padding:13px 15px; border-radius:10px; background:var(--surface-50); border:1px solid var(--line-200); }
.pos-bd-out__l { display:flex; flex-direction:column; gap:3px; }
.pos-bd-out__cap { font-family:var(--font-mono); font-size:10px; letter-spacing:.1em; color:var(--text-subtle); }
.pos-bd-out__tag { font-family:var(--font-mono); font-size:9px; letter-spacing:.06em; text-transform:uppercase; padding:2px 7px; border-radius:100px; background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border); color:var(--pst-warning-text); align-self:flex-start; }
.pos-bd-out__tag.is-paid { background:var(--pst-success-bg); border-color:var(--pst-success-border); color:var(--pst-success-text); }
.pos-bd-out__amt { font-family:var(--font-mono); font-size:22px; font-weight:700; color:var(--text-strong); font-variant-numeric:tabular-nums; white-space:nowrap; }
/* -- Struk thermal 58 mm (preview Visual) -- */
/* ── vs-receipt · unit DS `GUI/19/RECEIPT` (Receipt — struk thermal 58 mm) ──────
   SATU tampilan struk untuk SELURUH VS OS: POS, drawer Booking/Schedule (Kwitansi),
   dan permukaan mana pun yang menampilkan struk. Sebelumnya ada dua desain terpisah
   (`pos-rc*` yang ter-scope `.content--pos`, dan `rcp-*` di drawer) — keduanya kini
   memakai blok ini. Anatomi mengikuti master 12.04.02 §19 Transaction summary:
   kertas mono sempit terpusat · pemisah DASHED ink-300 · meta rapat · TOTAL menonjol ·
   barcode dekoratif · footer brand.
   TIDAK ter-scope ke modul mana pun, dan nilai warna/spasi/radius/bayangan HANYA token. */
.vs-receipt {
  position:static; width:100%; max-width:264px; margin:6px auto; overflow:visible;
  display:flex; flex-direction:column; gap:8px;
  padding:18px 16px; border:1px solid var(--line-200); border-radius:var(--r-xs);
  background:var(--surface-0); box-shadow:var(--shadow-card);
  font-family:var(--font-mono); font-variant-numeric:tabular-nums;
}
.vs-receipt::before { display:none; }          /* tema kartu app tidak menempel pita/aksen di struk */
.vs-receipt > * { margin-left:0; margin-right:0; }
.vs-receipt__brand { font-weight:800; font-size:13px; letter-spacing:.02em; text-align:center; color:var(--ink-900); }
.vs-receipt__addr { font-size:9.5px; color:var(--text-subtle); text-align:center; line-height:1.5; }
.vs-receipt__sep { border-top:1px dashed var(--ink-300); }
.vs-receipt__meta { display:flex; flex-direction:column; gap:2px; font-size:9.5px; color:var(--text-muted); }
/* Status BERWARNA sesuai keadaannya (memakai token tag DS yang sama dengan chip
   status di modul lain) — supaya "belum bayar" vs "lunas" terbaca sekali lihat. */
.vs-receipt__status {
  align-self:flex-start; margin-top:2px; display:inline-flex; align-items:center; gap:5px;
  padding:2px 7px; border-radius:var(--radius-pill); border:1px solid var(--tag-neutral-border);
  background:var(--tag-neutral-bg); color:var(--tag-neutral-text);
  font-size:9px; font-weight:700; letter-spacing:.08em; text-transform:uppercase;
}
.vs-receipt__status[data-tone="success"] { background:var(--tag-success-bg); border-color:var(--tag-success-border); color:var(--tag-success-text); }
.vs-receipt__status[data-tone="warning"] { background:var(--tag-warning-bg); border-color:var(--tag-warning-border); color:var(--tag-warning-text); }
.vs-receipt__status[data-tone="orange"]  { background:var(--tag-orange-bg);  border-color:var(--tag-orange-border);  color:var(--tag-orange-text); }
.vs-receipt__status[data-tone="danger"]  { background:var(--tag-danger-bg);  border-color:var(--tag-danger-border);  color:var(--tag-danger-text); }
.vs-receipt__status[data-tone="blue"]    { background:var(--tag-blue-bg);    border-color:var(--tag-blue-border);    color:var(--tag-blue-text); }
.vs-receipt__items { display:flex; flex-direction:column; gap:5px; }
.vs-receipt__item { display:flex; justify-content:space-between; gap:8px; font-size:10.5px; color:var(--text-strong); }
.vs-receipt__item-l { min-width:0; display:flex; flex-direction:column; gap:1px; }
.vs-receipt__item-l small { font-size:9px; color:var(--text-subtle); }
.vs-receipt__item-a { white-space:nowrap; }
.vs-receipt__empty { font-size:10.5px; color:var(--text-subtle); }
.vs-receipt__row { display:flex; justify-content:space-between; gap:8px; font-size:10.5px; color:var(--text-muted); }
.vs-receipt__row.is-total { font-size:12.5px; font-weight:700; color:var(--text-strong); padding:2px 0; }
.vs-receipt__row.is-due { font-weight:600; color:var(--text-strong); }
.vs-receipt__notes { font-size:9.5px; color:var(--text-muted); line-height:1.5; }
.vs-receipt__bar { align-self:center; display:block; color:var(--ink-900); }
.vs-receipt__foot { font-size:9.5px; color:var(--text-muted); text-align:center; line-height:1.5; }

/* `pos-receipt-card pos-rc` tetap dipasang di elemen akar struk POS sebagai KAIT
   (penangkap PNG & uji kontrak), bukan sebagai gaya — seluruh tampilannya datang
   dari .vs-receipt di atas. Jangan menambahkan aturan visual ke nama lama itu:
   dua sumber gaya untuk satu elemen adalah cara desain ini menyimpang lagi. */
/* -- Header preview: label & toggle Text/Visual tidak saling timpa -- */
.pos-drawer__body .pos-preview-head { display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; margin:0; }
.pos-drawer__body .pos-preview-head .pos-mini-label { flex:1 1 auto; min-width:0; }
.pos-drawer__body .pos-preview-head .vs-tabs { flex:none; }
/* -- Aksi PNG di bawah struk (tab Visual) -- */
/* Aksi preview DIPISAH dari area gulir (owner 2026-08-06): sebelumnya ia ikut
   menggulir bersama struk sehingga tertutup begitu strukmya panjang. Sekarang
   pane preview jadi grid dua baris — struk menggulir di baris 1, tombol menempel
   di baris 2 dan selalu terjangkau. */
#posPreviewPane { display:grid; grid-template-rows:minmax(0,1fr) auto; min-height:0; overflow:hidden; }
#posPreviewPane > .pos-receipt-card,
#posPreviewPane > .pos-doc-preview { min-height:0; overflow:auto; }
.pos-preview-acts { display:grid; grid-auto-flow:column; justify-content:center; gap:var(--space-3);
  padding-top:var(--space-4); margin-top:var(--space-4); border-top:1px solid var(--line-200);
  background:var(--surface-0); position:sticky; bottom:0; z-index:2; }
/* == POSDOC-REFRESH:END ====================================================== */

/* == SCHEDULE-V5:BEGIN =======================================================
   Redesign final: filter berlabel, composer mandiri, dan enam mode database.
   Semua selector dibatasi ke komponen Schedule agar modul lain tetap stabil. */
.sched-calendar-toolbar { min-width:0; }
.sched-calendar-toolbar .cal-brand-tabs { min-width:0; max-width:100%; overflow-x:auto; scrollbar-width:none; }
.sched-calendar-toolbar .cal-brand-tabs::-webkit-scrollbar { display:none; }
.sched-filter-grid { display:grid!important; grid-template-columns:repeat(6,minmax(118px,1fr)); align-items:end!important; gap:9px!important; }
.sched-filter-grid .cal-filter-kicker { grid-column:1/-1; }
.sched-filter-field { display:flex; min-width:0; flex-direction:column; gap:5px; }
.sched-filter-field > span { color:var(--text-subtle,var(--muted)); font-family:var(--font-mono); font-size:9px; font-weight:650; letter-spacing:.08em; text-transform:uppercase; }
.sched-filter-field select { width:100%; min-width:0; }
.sched-filter-grid .cal-filter-reset { align-self:end; justify-content:center; }

.cal-attn-summary { width:100%; border:0; background:transparent; color:inherit; cursor:pointer; font:inherit; text-align:left; }
.cal-attn-summary:hover { background:var(--surface-50,var(--paper-warm)); }
.cal-attn-summary:focus-visible { outline:2px solid var(--ink); outline-offset:-3px; }
.cal-attn-summary .cal-attn-pills { display:flex; align-items:center; justify-content:flex-end; gap:7px; flex-wrap:wrap; }
.cal-attn-chevron { display:inline-flex; align-items:center; gap:5px; margin-left:4px; color:var(--ink-500); font-size:11px; font-weight:650; }
.cal-attn-shell--safe .cal-attn-title svg { color:var(--accent-mint,var(--mint-green)); }
.cal-attn-pill.success { color:var(--pst-success-text); background:var(--pst-success-bg); border:1px solid var(--pst-success-border); }
.cal-attn-shell--safe .cal-attn-top { border-bottom:0; }

/* Booking composer */
.sched-composer-head > div { display:flex; flex-direction:column; gap:3px; }
.sched-composer-body { display:flex; flex-direction:column; gap:14px; }
.sched-composer-error { padding:11px 13px; color:var(--pst-danger-text); background:var(--pst-danger-bg); border:1px solid var(--pst-danger-border); border-radius:9px; font-size:12px; font-weight:620; }
.sched-composer-section { padding:16px; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:12px; }
/* F-39 — .sched-composer-label dan .sched-composer-more DIHAPUS: nol markup
   pemakai di js/html/php (diverifikasi grep). */
.sched-composer-section .fgrid:last-child .frow { margin-bottom:0; }
/* F-21 — panel pratinjau composer BERLATAR TERANG.
   Deklarasi gelap lama (`color:#fff; background:var(--ink)`) dihapus karena sudah
   ditimpa 100% oleh aturan .sched-composer-preview di blok SCHEDULE-PROTOTYPE-OVERLAYS
   (selector identik, urutan lebih belakang → menang) yang menyetel latar
   var(--sched-brand-soft). Menyimpannya hanya menyesatkan: itulah asal-usul asumsi
   "latar gelap" yang membuat ketiga state ketersediaan tak terbaca. */
.sched-composer-preview #scSummary { display:flex; flex-direction:column; gap:4px; margin-top:7px; }
#scAvailability { margin-top:10px; }
.sched-slot-state { display:inline-flex; align-items:center; gap:6px; padding:5px 8px; border:1px solid transparent; border-radius:6px; font-size:10px; font-weight:650; }
/* Ketiga state memakai pasangan pastel semantik (bg/border/text) yang memang
   dirancang untuk permukaan terang — pasangan yang sama dipakai chip status di
   seluruh app, jadi satu keadaan = satu warna. Dulu teksnya #c9f4de/#ffe4b8/#ffd1d1
   di atas rgba gelap tipis: praktis tak terbaca begitu panelnya jadi terang. */
.sched-slot-state.is-ok { color:var(--pst-success-text); background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.sched-slot-state.is-warning { color:var(--pst-warning-text); background:var(--pst-warning-bg); border-color:var(--pst-warning-border); }
.sched-slot-state.is-danger { color:var(--pst-danger-text); background:var(--pst-danger-bg); border-color:var(--pst-danger-border); }

/* Detail drawer tabs + transaction document overlays */
.schedule-detail-tabs { display:flex; flex:none; gap:4px; overflow-x:auto; padding:10px 16px 0; background:var(--paper); border-bottom:1px solid var(--line-200,var(--line)); scrollbar-width:none; }
.schedule-detail-tabs::-webkit-scrollbar { display:none; }
.schedule-detail-tabs button { position:relative; display:inline-flex; align-items:center; justify-content:center; gap:5px; min-height:39px; flex:1 0 auto; padding:0 11px; color:var(--ink-400); background:transparent; border:0; border-bottom:2px solid transparent; cursor:pointer; font:650 11.5px var(--font-body); }
.schedule-detail-tabs button:hover { color:var(--ink); }
.schedule-detail-tabs button.active { color:var(--ink); border-bottom-color:var(--ink); }
.schedule-detail-tabs button.active::after { content:""; position:absolute; bottom:-2px; left:50%; width:18px; height:2px; background:var(--identity-yellow); transform:translateX(-50%); }
.schedule-detail-tabs i { display:inline-flex; align-items:center; justify-content:center; width:15px; height:15px; color:#fff; background:var(--hot-red); border-radius:50%; font:700 8px var(--font-mono); }
.schedule-detail-tabs i.dot { width:6px; height:6px; background:var(--active-cyan); }
.schedule-detail-layer [data-bk-pane][hidden],.schedule-detail-layer .bk-detail-side[hidden] { display:none!important; }
.schedule-detail-layer .bk-detail-grid.schedule-pane-wide { grid-template-columns:minmax(0,1fr); }
.sched-history { position:relative; display:flex; flex-direction:column; gap:0; padding-left:14px; }
.sched-history::before { content:""; position:absolute; top:10px; bottom:10px; left:4px; width:1px; background:var(--line-200,var(--line)); }
.sched-history > div { position:relative; display:flex; flex-direction:column; gap:2px; padding:5px 0 14px 14px; }
.sched-history > div > span { position:absolute; top:9px; left:-14px; width:7px; height:7px; background:var(--paper); border:2px solid var(--ink-500); border-radius:50%; }
.sched-history b { color:var(--ink); font-size:11.5px; }
.sched-history small { color:var(--ink-400); font-size:10px; }
.sched-doc-actions { margin-top:14px; padding-top:13px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-doc-actions > .sched-kicker { display:block; margin-bottom:8px; }
.sched-doc-actions > small { display:flex; align-items:center; gap:5px; margin-top:8px; color:var(--ink-400); font-size:9.5px; }
.schedule-doc { max-width:660px; margin:0 auto; padding:26px; color:var(--ink); background:#fff; border:1px solid var(--line-200,var(--line)); border-radius:12px; box-shadow:var(--shadow-card); }
.schedule-doc > header { display:flex; align-items:flex-start; justify-content:space-between; gap:20px; padding-bottom:20px; border-bottom:2px solid var(--ink); }
.schedule-doc > header > div { display:flex; align-items:flex-end; flex-direction:column; gap:3px; text-align:right; }
.schedule-doc > header > div:first-child { align-items:flex-start; text-align:left; }
.schedule-doc > header b { font-size:16px; }
.schedule-doc > header span { font-family:var(--font-mono); font-size:9px; font-weight:700; letter-spacing:.12em; }
.schedule-doc > header small { color:var(--ink-400); font-size:10px; }
.schedule-doc > section { padding:22px 0 16px; }
.schedule-doc > section > span { color:var(--ink-400); font-family:var(--font-mono); font-size:9px; text-transform:uppercase; }
.schedule-doc > section h2 { margin:5px 0 2px; font-size:20px; }
.schedule-doc > section p { margin:0; color:var(--ink-500); font-size:11px; }
.schedule-doc dl { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:9px; margin:0 0 18px; }
.schedule-doc dl > div { padding:10px; background:var(--surface-50,var(--paper-warm)); border-radius:8px; }
.schedule-doc dt { color:var(--ink-400); font-family:var(--font-mono); font-size:8px; text-transform:uppercase; }
.schedule-doc dd { margin:4px 0 0; font-size:10.5px; font-weight:600; }
.schedule-doc table { width:100%; border-collapse:collapse; font-size:11px; }
.schedule-doc th,.schedule-doc td { padding:9px 6px; text-align:left; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.schedule-doc th:last-child,.schedule-doc td:last-child { text-align:right; }
.schedule-doc tfoot .due { color:var(--ink); background:var(--identity-yellow-soft); }
.schedule-doc-received { display:flex; align-items:center; flex-direction:column; gap:7px; padding:30px 18px; text-align:center; background:var(--identity-yellow-soft); border:1px solid var(--identity-yellow-shadow); border-radius:10px; }
.schedule-doc-received span { color:var(--ink-500); font-family:var(--font-mono); font-size:9px; text-transform:uppercase; }
.schedule-doc-received b { font-size:28px; }
.schedule-doc-received small { color:var(--ink-500); font-size:10px; }
.schedule-doc > footer { display:flex; align-items:flex-end; justify-content:space-between; gap:20px; margin-top:24px; padding-top:15px; border-top:1px solid var(--line-200,var(--line)); }
.schedule-doc > footer span { max-width:70%; color:var(--ink-400); font-size:9px; line-height:1.45; }
.schedule-doc > footer b { font-size:10px; }

/* Daftar Jadwal — toolbar & filter lama (.sl-command/.sl-view-tabs/.sl-filter-*/
   .sl-custom-period) dicabut 2026-07-25: modul kini memakai pola `.ops-toolbar`. */
.sl-period-hint { display:flex; align-items:center; gap:9px; margin-top:10px; padding:10px 12px; color:var(--ink-700); background:var(--identity-yellow-soft); border:1px solid var(--identity-yellow-shadow); border-radius:9px; font-size:11px; }
.sl-period-hint > span { flex:1; }
.sl-deck-foot { display:flex; align-items:center; gap:8px; margin-top:11px; }

/* Daftar Jadwal: shared cards + group */
.sl-view-host { min-width:0; }
.sl-group { margin-bottom:14px; overflow:hidden; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:13px; box-shadow:var(--shadow-card); }
.sl-group > header { display:flex; align-items:center; justify-content:space-between; gap:12px; min-height:58px; padding:10px 14px; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sl-group > header h3 { margin:3px 0 0; color:var(--ink); font-size:14px; }
.sl-group > header > b { display:inline-flex; align-items:center; justify-content:center; min-width:25px; height:25px; color:var(--ink-600); background:var(--surface-50,var(--paper-warm)); border-radius:7px; font-family:var(--font-mono); font-size:10px; }
.sl-group .sched-data-panel { margin:0; border:0; border-radius:0; box-shadow:none; }
.sl-list { display:flex; flex-direction:column; }
.sl-card { position:relative; min-width:0; color:var(--ink); background:var(--surface-0,var(--paper)); cursor:pointer; }
.sl-card--list { display:grid; grid-template-columns:56px minmax(0,1fr) auto; align-items:center; gap:13px; min-height:96px; padding:13px 15px 13px 48px; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sl-card--list:last-child { border-bottom:0; }
.sl-card:hover { background:var(--surface-50,var(--paper-warm)); }
.sl-card-check { position:absolute; top:14px; left:15px; z-index:2; display:inline-flex; cursor:pointer; }
.sl-card-date { display:flex; min-height:54px; flex-direction:column; align-items:center; justify-content:center; background:var(--sched-bg); border:1px solid var(--sched-border); border-radius:9px; }
.sl-card-date b { color:var(--sched-text); font:700 20px/1 var(--font-mono); }
.sl-card-date span { margin-top:3px; color:var(--sched-text); font-size:9px; font-weight:700; text-transform:uppercase; }
.sl-card-main { min-width:0; }
.sl-card-code { display:block; margin-bottom:3px; color:var(--ink-400); font-size:9px; }
.sl-card-main h3 { margin:0; overflow:hidden; color:var(--ink); font-size:13.5px; text-overflow:ellipsis; white-space:nowrap; }
.sl-card-main p,.sl-card-main small { display:block; margin:3px 0 0; overflow:hidden; color:var(--ink-500); font-size:10.5px; text-overflow:ellipsis; white-space:nowrap; }
.sl-card-tags { display:flex; align-items:flex-end; justify-content:center; flex-direction:column; gap:6px; }
.sl-card-tags > b { color:var(--ink-700); font-size:10px; }
.sl-gallery { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:12px; padding:13px; }
.sl-card--gallery,.sl-card--board { display:grid; grid-template-columns:48px minmax(0,1fr); gap:10px; padding:15px 13px; border:1px solid var(--line-200,var(--line)); border-radius:11px; box-shadow:var(--shadow-1); }
.sl-card--gallery { padding-left:40px; }
.sl-card--gallery .sl-card-tags,.sl-card--board .sl-card-tags { grid-column:1/-1; align-items:center; justify-content:flex-start; flex-direction:row; flex-wrap:wrap; padding-top:4px; }
.sl-card--gallery .sl-card-date,.sl-card--board .sl-card-date { min-height:48px; }

/* Board */
.sl-board { display:flex; gap:12px; min-height:320px; overflow-x:auto; padding:2px 1px 14px; }
.sl-board-col { width:296px; min-width:296px; max-height:640px; overflow:hidden; background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:12px; }
.sl-board-col > header { position:sticky; top:0; z-index:2; display:flex; align-items:center; justify-content:space-between; gap:10px; min-height:48px; padding:0 12px; background:var(--surface-0,var(--paper)); border-bottom:1px solid var(--line-200,var(--line)); font-size:12px; font-weight:700; }
.sl-board-col > header b { color:var(--ink-400); font-family:var(--font-mono); font-size:10px; }
.sl-board-col > div { display:flex; max-height:590px; overflow-y:auto; flex-direction:column; gap:8px; padding:9px; }
.sl-card--board { background:var(--paper); }

/* Timeline */
.sl-timeline { position:relative; padding:8px 14px 16px 32px; }
.sl-timeline::before { content:""; position:absolute; top:11px; bottom:20px; left:20px; width:1px; background:var(--line-200,var(--line)); }
.sl-timeline-row { position:relative; display:grid; grid-template-columns:118px minmax(0,1fr) auto; align-items:center; gap:14px; width:100%; padding:11px 10px; color:var(--ink); text-align:left; background:transparent; border:0; border-bottom:1px solid var(--line-100,var(--line-soft)); cursor:pointer; font:inherit; }
.sl-timeline-row:hover { background:var(--surface-50,var(--paper-warm)); }
.sl-timeline-mark { position:absolute; left:-18px; width:9px; height:9px; background:var(--sched-accent); border:2px solid var(--paper); border-radius:50%; box-shadow:0 0 0 1px var(--sched-border); }
.sl-timeline-row > .mono { display:flex; flex-direction:column; gap:3px; color:var(--ink-400); font-size:9px; }
.sl-timeline-row > .mono b { color:var(--ink-700); font-size:11px; }
.sl-timeline-row > span:nth-child(3) { display:flex; min-width:0; flex-direction:column; gap:3px; }
.sl-timeline-row > span:nth-child(3) b { overflow:hidden; font-size:12.5px; text-overflow:ellipsis; white-space:nowrap; }
.sl-timeline-row > span:nth-child(3) small { overflow:hidden; color:var(--ink-400); font-size:10px; text-overflow:ellipsis; white-space:nowrap; }

/* Database calendar */
.sl-calendar { overflow-x:auto; overflow-y:hidden; overscroll-behavior-inline:contain; background:var(--paper); border:1px solid var(--line-200,var(--line)); border-radius:13px; box-shadow:var(--shadow-card); -webkit-overflow-scrolling:touch; }
.sl-calendar > header { display:flex; align-items:center; justify-content:center; gap:9px; min-height:60px; padding:0 14px; border-bottom:1px solid var(--line-200,var(--line)); }
.sl-calendar > header h3 { min-width:170px; margin:0; text-align:center; font-size:15px; }
.sl-month-wrap { min-width:760px; overflow:visible; }
.sl-month-wd,.sl-month-grid { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); }
.sl-month-wd { background:var(--surface-50,var(--paper-warm)); border-bottom:1px solid var(--line-200,var(--line)); }
.sl-month-wd span { padding:9px; color:var(--ink-400); font-family:var(--font-mono); font-size:9px; text-align:center; text-transform:uppercase; }
.sl-month-cell { min-height:112px; padding:7px; border-right:1px solid var(--line-100,var(--line-soft)); border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sl-month-cell:nth-child(7n) { border-right:0; }
.sl-month-cell > span { display:inline-flex; width:22px; height:22px; align-items:center; justify-content:center; color:var(--ink-600); font:600 10px var(--font-mono); border-radius:50%; }
.sl-month-cell.today > span { color:#fff; background:var(--ink); }
.sl-month-cell.out { background:var(--surface-50,var(--paper-warm)); opacity:.55; }
.sl-month-cell > div { display:flex; flex-direction:column; gap:3px; margin-top:4px; }
.sl-month-cell > div button { display:flex; align-items:center; gap:5px; width:100%; overflow:hidden; padding:4px 6px; color:var(--sched-text,var(--ink)); text-align:left; text-overflow:ellipsis; white-space:nowrap; background:var(--sched-bg,var(--paper-warm)); border:1px solid var(--sched-border,var(--line)); border-radius:5px; cursor:pointer; font:600 9.5px var(--font-body); }
.sl-month-cell > div button b { flex:none; font-size:8.5px; }
.sl-month-cell > div .sl-month-more { color:var(--ink-500); background:transparent; border-color:transparent; }
.sched-view--list .db-bulk { position:sticky; top:8px; z-index:12; margin-bottom:12px; color:#fff; background:var(--ink); border-color:var(--ink); box-shadow:0 12px 32px rgba(5,5,5,.18); }
.sched-view--list .db-bulk .abtn { color:#fff; background:rgba(255,255,255,.08); border-color:rgba(255,255,255,.22); }
.sched-view--list .db-bulk select { color:var(--ink); background:#fff; }

@media (max-width:1100px) {
  .sched-filter-grid { grid-template-columns:repeat(3,minmax(140px,1fr)); }
}
@media (max-width:760px) {
  .sched-filter-grid { grid-template-columns:repeat(2,minmax(0,1fr))!important; }
  .sched-filter-grid .cal-filter-kicker { grid-column:1/-1!important; }
  .sched-filter-grid .sched-filter-field,.sched-filter-grid .cal-color-control { grid-column:auto!important; }
  .cal-attn-summary { align-items:flex-start!important; flex-direction:column; }
  .cal-attn-summary .cal-attn-pills { justify-content:flex-start; }
  .sl-card--list { grid-template-columns:48px minmax(0,1fr); }
  .sl-card--list .sl-card-tags { grid-column:1/-1; align-items:center; flex-direction:row; justify-content:flex-start; padding-left:60px; }
  .sl-timeline-row { grid-template-columns:92px minmax(0,1fr); }
  .sl-timeline-row > .badge-st { grid-column:2; justify-self:start; }
  .sl-view-host--calendar { overflow-x:auto; }
}
@media (max-width:480px) {
  .sched-filter-grid { grid-template-columns:1fr!important; }
  .sched-filter-grid .cal-filter-kicker { grid-column:1!important; }
  .sched-composer-section { padding:14px; }
  .sched-composer-body .fgrid { grid-template-columns:1fr; }
  .sched-composer-body .fcol { min-width:0; }
  .schedule-detail-tabs button { min-width:86px; }
  .schedule-doc { padding:18px 14px; }
  .schedule-doc dl { grid-template-columns:1fr; }
  .sl-period-hint { align-items:flex-start; flex-wrap:wrap; }
  .sl-period-hint .abtn { width:100%; justify-content:center; }
  .sl-card--list { padding:13px 12px 13px 42px; }
  .sl-card--list .sl-card-date { display:none; }
  .sl-card--list .sl-card-tags { padding-left:0; }
  .sl-gallery { grid-template-columns:1fr; }
  .sl-timeline { padding-left:24px; }
  .sl-timeline::before { left:14px; }
  .sl-timeline-mark { left:-16px; }
  .sl-timeline-row { grid-template-columns:1fr; gap:7px; }
  .sl-timeline-row > .badge-st { grid-column:1; }
}
@media print {
  body.schedule-doc-printing #admin * { visibility:hidden!important; }
  body.schedule-doc-printing #scheduleDocPrint,body.schedule-doc-printing #scheduleDocPrint * { visibility:visible!important; }
  body.schedule-doc-printing #scheduleDocPrint { position:fixed; inset:0; width:auto; max-width:none; margin:0; padding:20mm; border:0; border-radius:0; box-shadow:none; }
body.schedule-doc-printing .mc-head,body.schedule-doc-printing .mc-foot { display:none!important; }
}

/* == SCHEDULE-CALENDAR-PROTOTYPE:BEGIN ======================================
   Literal Calendar-tab composition from Schedule Module.html. */
.sched-view--calendar {
  --cal-band-0:#111114; --cal-band-1:var(--violet); --cal-band-2:var(--active-cyan);
  --cal-band-3:var(--sunset-orange); --cal-band-4:var(--neon-pink);
}
.sched-view--calendar .sched-calendar-card { overflow:visible; padding:0; border:1px solid var(--line-200); border-radius:20px; background:var(--surface-0); box-shadow:var(--shadow-card); }
.sched-view--calendar .sched-calendar-head { align-items:flex-end; padding:16px 18px 14px; }
.sched-view--calendar .sched-calendar-head h3 { margin-top:3px; font-size:24px; font-weight:800; letter-spacing:-.02em; }
.sched-view--calendar .sched-calendar-toolbar { align-items:center; justify-content:space-between; padding:0 18px 14px; border:0; }
.sched-view--calendar .sched-calendar-toolbar .cal-brand-tabs { justify-content:flex-start; gap:6px; max-width:100%; overflow:visible; padding:0; flex-wrap:wrap; }
/* Chip brand memakai komponen ViewBar (.vs-viewchip); sisanya khas brand saja. */
.cal-brand-icon { display:inline-flex; width:var(--brand-icon-size,18px); height:var(--brand-icon-size,18px); flex:0 0 var(--brand-icon-size,18px); align-items:center; justify-content:center; color:#fff; background:var(--ink-500); border-radius:4px; font-family:var(--font-display); font-size:calc(var(--brand-icon-size,18px) * .6); font-style:normal; font-weight:800; line-height:1; letter-spacing:-.03em; }
/* F-23 — warna diambil dari token brand di app.css (--brand-*-accent), bukan hex
   mentah. Nilainya identik dengan hex lama (#FFF700 / #3A3A3A / #F2541B), jadi
   tokenisasi ini nol perubahan visual — yang berubah hanya sumber kebenarannya:
   ganti brand di registry cukup menyentuh token, bukan berburu hex per modul. */
.cal-brand-icon--vs { color:var(--text-body); background:var(--brand-vs-accent); box-shadow:inset 0 0 0 1px rgba(0,0,0,.12); }
.cal-brand-icon--luxa { background:var(--brand-luxa-accent); }
.cal-brand-icon--nussa { background:var(--brand-nussa-accent); }
.sched-view--calendar .sched-calendar-toolbar .seg { padding:3px; border:1px solid var(--line-100); border-radius:10px; background:var(--surface-1,var(--paper-warm)); }
.sched-view--calendar .sched-calendar-toolbar .seg-btn { min-height:32px; border-radius:7px; }
.sched-view--calendar .sched-calendar-toolbar .seg-btn.active { color:#fff; background:var(--ink); }
.sched-view--calendar .sched-calendar-toolbar .seg-btn.active svg { color:var(--identity-yellow); }
.sched-view--calendar .sched-filter-grid { grid-template-columns:repeat(auto-fit,minmax(146px,1fr))!important; gap:8px!important; width:100%; padding:12px 18px; background:var(--surface-1,var(--paper-warm)); border-top:1px solid var(--line-100); border-bottom:0; }
.sched-view--calendar .sched-filter-field { gap:4px; }
.sched-view--calendar .sched-filter-field > span { display:inline-flex; align-items:center; gap:4px; font-size:9px; font-weight:600; letter-spacing:.1em; }
.sched-view--calendar .sched-filter-field select,.sched-view--calendar .sched-filter-field .cal-filter-reset { width:100%; height:34px; min-height:34px; padding-inline:10px 30px; border:1px solid var(--border-input,var(--line-200)); border-radius:10px; background:var(--surface-0); color:var(--text-strong,var(--ink)); font-size:12.5px; }
.sched-view--calendar .sched-filter-reset .cal-filter-reset { display:flex; align-items:center; justify-content:center; padding:0 10px; color:var(--text-muted,var(--ink-500)); cursor:pointer; font-weight:600; }
.sched-view--calendar .cal-color-control { display:flex; min-height:0; padding:0; border:0; }
.sched-view--calendar .sched-calendar-frame { overflow:auto; margin:0; padding:14px 16px; background:var(--surface-0); border:0; border-top:1px solid var(--line-100); border-radius:0; }
.sched-view--calendar .sched-calendar-card > .cal-legend { gap:8px 16px; margin:0; padding:12px 18px; border-top:1px solid var(--line-100); }
.sched-view--calendar .cal-legend .cal-leg-item { gap:6px; color:var(--text-muted,var(--ink-500)); font-size:12px; }
.sched-view--calendar .cal-legend .leg-dot { width:9px; height:9px; flex:none; background:var(--legend-color); border:0; border-radius:3px; }
.sched-view--calendar .cal-legend .leg-dot.is-ring { box-shadow:inset 0 0 0 1px rgba(0,0,0,.15); }
.sched-view--calendar .cal-legend .leg-dot.ev-conflict-dot { background:transparent; border:2px solid var(--hot-red); }
.sched-view--calendar .cal-leg-kicker { font-family:var(--font-mono); font-size:10.5px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; }
.minical-pop .mc-day { position:relative; display:flex; align-items:center; justify-content:center; }
.mc-event-mark { position:absolute; right:2px; bottom:2px; display:inline-flex; align-items:center; gap:1px; font-style:normal; }
.mc-event-mark b { width:4px; height:4px; background:currentColor; border-radius:50%; }
.mc-event-mark em { font:700 6.5px var(--font-mono); }

/* Attention strip */
.sched-view--calendar .cal-attn-shell { overflow:hidden; margin-bottom:14px; padding:0; background:var(--surface-0); border:1px solid var(--line-200); border-left:3px solid var(--hot-red); border-radius:14px; box-shadow:var(--shadow-xs); }
.sched-view--calendar .cal-attn-summary { display:flex; width:100%; align-items:center; gap:10px; margin:0; padding:11px 16px; background:transparent; border:0; cursor:pointer; text-align:left; }
.sched-view--calendar .cal-attn-summary > svg { color:var(--hot-red); }
.sched-view--calendar .cal-attn-summary .cal-attn-title { color:var(--text-strong,var(--ink)); font-family:var(--font-display); font-size:15px; font-weight:700; letter-spacing:-.01em; }
.sched-view--calendar .cal-attn-summary > i { flex:1; }
.sched-view--calendar .cal-attn-pills { display:flex; gap:6px; }
.sched-view--calendar .cal-attn-chevron { display:inline-flex; align-items:center; gap:6px; margin:0; color:var(--text-subtle,var(--ink-400)); font-size:12.5px; font-weight:500; }
.sched-view--calendar .cal-attn-list { display:grid; grid-template-columns:repeat(auto-fill,minmax(248px,1fr)); gap:8px; padding:0 14px 12px; }
.sched-view--calendar .cal-attn-item { display:flex; min-width:0; flex-direction:column; gap:5px; padding:9px 11px; text-align:left; background:var(--pst-neutral-bg); border:1px solid var(--pst-neutral-border); border-radius:10px; cursor:pointer; font:inherit; transition:box-shadow .14s ease,transform .14s ease; }
.sched-view--calendar .cal-attn-item:hover { transform:translateY(-1px); box-shadow:var(--shadow-pop); }
.sched-view--calendar .cal-attn-item.tone-danger { color:var(--pst-danger-text); background:var(--pst-danger-bg); border-color:var(--pst-danger-border); }
.sched-view--calendar .cal-attn-item.tone-orange { color:var(--pst-orange-text); background:var(--pst-orange-bg); border-color:var(--pst-orange-border); }
.sched-view--calendar .cal-attn-item.tone-blue { color:var(--pst-blue-text); background:var(--pst-blue-bg); border-color:var(--pst-blue-border); }
.cal-attn-card-head { display:flex; min-width:0; align-items:center; gap:7px; }
.cal-attn-card-head b { overflow:hidden; flex:1; color:var(--text-strong,var(--ink)); font-size:12.5px; text-overflow:ellipsis; white-space:nowrap; }
.cal-attn-card-head em { padding:2px 6px; border:1px solid currentColor; border-radius:6px; font-size:9.5px; font-style:normal; font-weight:700; }
.cal-attn-card-meta { display:block; overflow:hidden; max-width:100%; color:var(--text-subtle,var(--ink-400)); font-size:10px; text-overflow:ellipsis; white-space:nowrap; }
.cal-attn-card-lines { display:grid; grid-template-columns:4px minmax(0,1fr); align-items:center; gap:3px 6px; padding-top:5px; color:var(--text-body,var(--ink-700)); border-top:1px solid var(--line-100); font-size:11px; }
.cal-attn-card-lines i { width:4px; height:4px; background:var(--hot-red); border-radius:50%; }
.cal-attn-card-lines span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cal-attn-card-foot { display:flex; min-width:0; align-items:center; justify-content:space-between; gap:8px; padding-top:5px; border-top:1px solid var(--line-100); }
.cal-attn-card-foot > span { display:inline-flex; min-width:0; flex:1; align-items:center; gap:5px; overflow:hidden; color:var(--text-subtle,var(--ink-400)); font-size:11px; text-overflow:ellipsis; white-space:nowrap; }
.cal-attn-card-foot > b { color:var(--text-strong,var(--ink)); font-family:var(--font-mono); font-size:12px; white-space:nowrap; }
.sched-view--calendar .cal-attn-shell--safe { display:flex; align-items:center; gap:10px; padding:11px 16px; border-left:1px solid var(--line-200); }
.cal-attn-safe-icon { display:inline-flex; width:26px; height:26px; align-items:center; justify-content:center; color:var(--pst-success-text); background:var(--pst-success-bg); border-radius:10px; }
.cal-attn-shell--safe > b { color:var(--text-strong,var(--ink)); font-size:13.5px; }
.cal-attn-shell--safe > span { color:var(--text-subtle,var(--ink-400)); font-size:12.5px; }

/* Month */
.sched-view--calendar .cal-month { min-width:0; }
.sched-view--calendar .cal-month .cal-wdrow { background:var(--surface-1,var(--paper-warm)); border-bottom:1px solid var(--line-200); }
.sched-view--calendar .cal-wd { padding:9px 12px; color:var(--text-subtle,var(--ink-400)); font-family:var(--font-mono); font-size:11px; font-weight:600; letter-spacing:.08em; text-align:left; }
.sched-view--calendar .cal-wd-sun { color:var(--hot-red); }
.sched-view--calendar .cal-grid { grid-auto-rows:minmax(112px,auto); }
.sched-view--calendar .cal-cell { min-height:112px; gap:0; padding:7px 8px 8px; background:var(--surface-0); }
.sched-view--calendar .cal-cell.out { background:var(--surface-1,var(--paper-warm)); }
.sched-view--calendar .cal-cell:not(.out):not(.blocked):hover { background:var(--surface-1,var(--paper-warm)); }
.cal-cell-top { display:flex; align-items:center; justify-content:space-between; margin-bottom:5px; }
.cal-cell-top > span:last-child { display:inline-flex; align-items:center; gap:5px; }
.cal-cell-top > span:last-child > em { color:var(--text-disabled,var(--ink-300)); font-family:var(--font-mono); font-size:10px; font-style:normal; font-weight:600; }
.cal-cell-conflict { display:inline-flex; width:15px; height:15px; align-items:center; justify-content:center; color:#fff; background:var(--hot-red); border-radius:50%; }
.sched-view--calendar .cal-date { min-width:22px; width:auto; height:22px; padding:0 5px; font-family:var(--font-mono); font-size:12.5px; font-weight:500; }
.sched-view--calendar .cal-cell.today .cal-date { font-weight:700; border-radius:999px; }
.sched-view--calendar .cal-ev { display:flex; min-height:0; align-items:center; gap:6px; padding:3px 7px; border:1px solid var(--sched-border); border-left:3px solid var(--sched-accent); border-radius:6px; }
.sched-view--calendar .cal-ev .evt-t { flex:none; color:var(--sched-text); font-size:10.5px; font-weight:600; }
.sched-view--calendar .cal-ev .evt-n { color:var(--sched-text); font-size:11.5px; font-weight:600; }
.sched-view--calendar .cal-more { padding:2px 4px; color:var(--text-muted,var(--ink-500)); font-size:11px; font-weight:600; }

/* Week */
.sched-view--calendar .cal-week { min-width:0; grid-template-columns:repeat(7,1fr); overflow:hidden; background:transparent; border:0; border-radius:0; }
.sched-view--calendar .cal-wcol { min-height:260px; display:flex; flex-direction:column; background:var(--surface-0); }
.sched-view--calendar .cal-wcol-head { display:flex; min-height:0; align-items:center; justify-content:space-between; padding:10px; color:var(--text-subtle,var(--ink-400)); background:var(--surface-1,var(--paper-warm)); }
.sched-view--calendar .cal-wcol-head > span { display:flex; align-items:baseline; gap:6px; }
.sched-view--calendar .cal-wcol-head em { color:inherit; font-family:var(--font-mono); font-size:10.5px; font-style:normal; font-weight:400; letter-spacing:.06em; }
.sched-view--calendar .cal-wcol-head b { display:inline; width:auto; height:auto; color:var(--text-strong,var(--ink)); background:transparent; font-family:var(--font-display); font-size:16px; font-weight:700; }
.sched-view--calendar .cal-wcol-head.today { color:var(--text-subtle,var(--ink-400)); background:var(--identity-yellow-soft); }
.sched-view--calendar .cal-wcol-head.today b { color:var(--text-strong,var(--ink)); background:transparent; }
.sched-view--calendar .cal-wcol-head small { color:var(--text-disabled,var(--ink-300)); font-family:var(--font-mono); font-size:10.5px; }
.sched-view--calendar .cal-wcol-body { min-height:210px; flex:1; gap:5px; padding:8px; }
.sched-view--calendar .cal-wempty { padding:16px 4px; color:var(--text-disabled,var(--ink-300)); font-size:11.5px; }
.sched-view--calendar .cal-scard { gap:4px; padding:8px 9px; border:1px solid var(--sched-border); border-left:3px solid var(--sched-accent); border-radius:10px; background:var(--sched-bg); box-shadow:none; }
.cal-weekcard-time { display:flex; align-items:center; gap:6px; color:var(--sched-text); font-size:10.5px; font-weight:700; }
/* HANYA teks jam yang flex:1 — ikon brand tetap ukuran tetap. Kalau `> span` (semua span),
   ikon brand ikut melar & jam "14:00–16:00" kebagian ½ lebar lalu wrap 2 baris → kartu tinggi. */
.cal-weekcard-time > span.mono { flex:1; min-width:0; color:color-mix(in srgb, var(--sched-text) 78%, transparent); }
.cal-weekcard-time > .cal-brand-icon { flex:0 0 auto; }
.cal-weekcard-time > i { width:7px; height:7px; flex:none; border-radius:50%; }
.cal-weekcard-time > em { flex:none; font-style:normal; font-size:9.5px; font-weight:600; opacity:.66; }
.sched-view--calendar .cal-scard > strong { color:var(--sched-text); font-size:12px; line-height:1.25; }
.sched-view--calendar .cal-scard > small { overflow:hidden; color:var(--sched-text); font-size:10.5px; text-overflow:ellipsis; white-space:nowrap; opacity:.78; }
/* Meta kartu week: satu baris per fakta (room · layanan · crew), tak pernah duplikat.
   Tiap baris grid `auto | minmax(0,1fr)` supaya ikon tetap utuh & teks di-ellipsis. */
.cal-wcard-metas { display:grid; gap:2px; min-width:0; max-width:100%; }
.sched-view--calendar .cal-scard--week { min-width:0; overflow:hidden; }
.sched-view--calendar .cal-scard--week > * { min-width:0; max-width:100%; }
.cal-wcard-meta { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:5px; min-width:0;
  color:var(--sched-text); font-size:10.5px; line-height:1.3; opacity:.78; }
.cal-wcard-meta svg { opacity:.8; }
.cal-wcard-meta > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* Week card punya ruang: rincian dibiarkan wrap penuh (tanpa potong) dan catatan
   internal dapat kontainer highlight sendiri. */
/* Anatomi kartu week (lebar efektif ±166px → satu kolom):
   head (ikon brand | jam | dot) → nama → blok fakta bergaris → catatan internal → footer. */
.sched-view--calendar .cal-scard--week { display:grid; gap:6px; padding:9px 10px; }
/* Fill = skin brand (soft + border brand), menang atas .sched-colored yang memakai
   tone status. Status tetap hadir lewat titik aksen & chip di footer. */
.sched-view--calendar .cal-scard--week.sched-colored,
.sched-view--calendar .cal-scard--week { background:linear-gradient(150deg,var(--sched-brand-soft,var(--surface-0)),var(--surface-0,var(--paper)) 62%);
  border-color:var(--sched-brand-border,var(--line-200)); border-left:3px solid var(--sched-accent,var(--ink-400)); }
.sched-view--calendar .cal-scard--week .cal-weekcard-pay { border-top-color:color-mix(in srgb,var(--sched-brand-rule,var(--ink-900)) 18%,transparent); color:var(--text-body); }
.sched-view--calendar .cal-scard--week .cal-wcard-metas { border-top-color:color-mix(in srgb,var(--sched-brand-rule,var(--ink-900)) 14%,transparent); }
.sched-view--calendar .cal-scard--week .cal-wcard-st { color:var(--sched-text); }
.sched-view--calendar .cal-scard--week .cal-weekcard-time { font-size:11px; }
.sched-view--calendar .cal-scard--week .cal-wcard-metas { gap:5px; padding-top:7px; border-top:1px solid color-mix(in srgb,var(--sched-text) 18%,transparent); }
/* Rincian dibuat terbaca: opacity dilepas (warna penuh --sched-text), ukuran naik
   10,5→11,5px, leading 1,4 — sebelumnya 10,5px @ .78 alpha di atas fill bertone. */
/* Rincian pakai warna teks NETRAL, bukan warna tone: teks kecil berwarna
   (biru/hijau/oranye) di atas fill setone hanya 4,6–5,4:1 dan melelahkan dibaca.
   Tone tetap hidup lewat fill kartu, chip status, dan titik aksen. */
.sched-view--calendar .cal-scard--week .cal-wcard-meta { align-items:start; opacity:1; color:var(--text-body); font-size:11.5px; line-height:1.4; }
.sched-view--calendar .cal-scard--week .cal-wcard-meta > svg { opacity:1; color:var(--text-subtle); }
.sched-view--calendar .cal-scard--week > strong { color:var(--text-strong); font-size:13px; line-height:1.3; }
.sched-view--calendar .cal-scard--week .cal-weekcard-time > span.mono { color:var(--text-body); }
.sched-view--calendar .cal-scard--week .cal-wcard-meta > svg { margin-top:2px; }
.sched-view--calendar .cal-scard--week .cal-wcard-meta > span { overflow:visible; white-space:normal; overflow-wrap:anywhere; }
/* Mini-card klien: avatar berskin tier customer + nama + subline tier/booking.
   Warna --t-tint sejalan dengan kartu galeri Customers, jadi tier yang sama tampil
   dengan warna yang sama di dua modul. */
.cal-cust-chip { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:6px; padding:4px 6px;
  background:linear-gradient(150deg,color-mix(in srgb,var(--t-tint,#c9cdd6) 16%,var(--surface-0)),var(--surface-0) 62%);
  border:1px solid color-mix(in srgb,var(--t-tint,#c9cdd6) 34%,var(--surface-0)); border-radius:8px; text-align:left; }
.cal-cust-av { display:inline-flex; align-items:center; justify-content:center; width:20px; height:20px; flex:none; border-radius:50%;
  color:var(--primary-contrast,#fff); background:linear-gradient(135deg,var(--t-tint,#9aa0aa),color-mix(in srgb,var(--t-tint,#9aa0aa) 55%,var(--ink-900)));
  font:700 8px var(--font-mono); letter-spacing:.02em; }
.cal-cust-main { min-width:0; display:grid; }
.cal-cust-main > b { min-width:0; color:var(--text-strong,var(--ink)); font-size:12px; line-height:1.2; overflow-wrap:anywhere; }
/* Blok Klien memakai unit gcard: wrapper .cust2 hanya untuk mengaktifkan CSS ber-scope,
   gallery-grid dimatikan supaya kartunya tunggal & selebar kolom. */
.sd2-clientwrap { display:grid; gap:10px; }
.sd2-clientwrap .gcard { width:100%; }
.sd2-client-actions { display:flex; flex-wrap:wrap; gap:8px; }
.sd2-client-actions .abtn { flex:1 1 auto; justify-content:center; }
/* Kartu Klien di drawer: skin tier customer + badge tier & trust (sejalan dengan
   mini-card klien di kalender — satu tier, satu warna, di mana pun tampil). */
.sd2-client-card { background:linear-gradient(150deg,color-mix(in srgb,var(--t-tint,#c9cdd6) 16%,var(--surface-0)),var(--surface-0) 62%); border-color:color-mix(in srgb,var(--t-tint,#c9cdd6) 34%,var(--surface-0)); }
.sd2-client-card .sd2-avatar { background:linear-gradient(135deg,var(--t-tint,#9aa0aa),color-mix(in srgb,var(--t-tint,#9aa0aa) 55%,var(--ink-900))); color:var(--primary-contrast,#fff); }
.sd2-client-badges { display:flex; flex-wrap:wrap; align-items:center; gap:5px; margin-top:5px; }
.sd2-client-badges > em { display:inline-flex; align-items:center; padding:2px 8px; border-radius:var(--radius-pill,100px);
  font:700 9.5px var(--font-mono); font-style:normal; letter-spacing:.07em; text-transform:uppercase; }
.sd2-tierbadge { background:color-mix(in srgb,var(--t-tint,#c9cdd6) 24%,var(--surface-0)); color:var(--text-body); border:1px solid color-mix(in srgb,var(--t-tint,#c9cdd6) 42%,var(--surface-0)); }
.sd2-trustbadge { background:var(--tag-neutral-bg,var(--ink-050)); color:var(--text-muted); border:1px solid var(--tag-neutral-border,var(--line-200)); }
.sd2-trustbadge.ct-success { background:var(--tag-success-bg); color:var(--tag-success-text); border-color:var(--tag-success-border); }
.sd2-trustbadge.ct-warning { background:var(--tag-warning-bg); color:var(--tag-warning-text); border-color:var(--tag-warning-border); }
.sd2-trustbadge.ct-danger  { background:var(--tag-danger-bg);  color:var(--tag-danger-text);  border-color:var(--tag-danger-border); }
.sd2-client-card.cc-silver   { --t-tint:#c9cdd6; }
.sd2-client-card.cc-ocean    { --t-tint:#1f79c0; }
.sd2-client-card.cc-cosmic   { --t-tint:#6d28d9; }
.sd2-client-card.cc-golden   { --t-tint:#e9c02a; }
.sd2-client-card.cc-emerald  { --t-tint:#0f9d6e; }
.sd2-client-card.cc-graphite { --t-tint:#5a5a5a; }
/* Wadah badge diberi kelas .cust2-ov supaya komponen .tg / .tier-badge (holografis)
   dari modul Customers berlaku apa adanya — tidak ada pill tiruan di sini. */
.cal-cust-badges { display:flex; flex-wrap:wrap; align-items:center; gap:3px; margin-top:2px; }
.cal-cust-badges .tg { font-size:8.5px; font-weight:700; letter-spacing:.02em; padding:0 5px; gap:3px; line-height:1.5; }
/* Ikon bintang di badge tier dilepas pada chip — di lebar 166px setiap piksel dihitung. */
.cal-cust-badges .tg svg { display:none; }
/* Chip yang tertaut CRM bisa diklik → drawer customer. */
.cal-cust-chip[data-open-cust] { cursor:pointer; transition:border-color .14s ease, box-shadow .14s ease; }
.cal-cust-chip[data-open-cust]:hover { border-color:var(--ink-900); box-shadow:var(--shadow-xs,0 1px 2px rgba(5,5,5,.08)); }
.cal-cust-chip[data-open-cust]:focus-visible { outline:2px solid var(--ink-900); outline-offset:1px; }
.cal-cust-chip.is-unlinked .cal-cust-badges { opacity:.75; }
.cal-cust-chip.cc-silver   { --t-tint:#c9cdd6; }
.cal-cust-chip.cc-ocean    { --t-tint:#1f79c0; }
.cal-cust-chip.cc-cosmic   { --t-tint:#6d28d9; }
.cal-cust-chip.cc-golden   { --t-tint:#e9c02a; }
.cal-cust-chip.cc-emerald  { --t-tint:#0f9d6e; }
.cal-cust-chip.cc-graphite { --t-tint:#5a5a5a; }
.cal-wcard-note { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:5px; margin-top:2px; padding:4px 6px;
  background:var(--tag-warning-bg); border:1px dashed var(--tag-warning-border); border-radius:6px;
  color:var(--tag-warning-text); font-size:9.5px; line-height:1.35; text-align:left; }
.cal-wcard-note > em { font-style:normal; font-family:var(--font-mono); font-size:8px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; opacity:.75; padding-top:1px; }
.cal-wcard-note > span { min-width:0; overflow-wrap:anywhere; }
/* Field catatan selalu tampil; saat kosong tampil netral (bukan tone warning). */
.cal-wcard-note.is-empty { background:transparent; border-color:color-mix(in srgb,var(--sched-brand-rule,var(--ink-900)) 22%,transparent); color:var(--text-muted); }
/* Footer: status (kiri) + pembayaran & nominal (kanan) — dua kolom, tak saling dorong. */
.cal-weekcard-pay { display:grid; grid-template-columns:minmax(0,auto) minmax(0,1fr); align-items:baseline; gap:6px; min-width:0; max-width:100%;
  margin-top:1px; padding-top:4px; color:color-mix(in srgb,var(--sched-text) 78%,transparent);
  border-top:1px solid color-mix(in srgb,var(--sched-text) 22%,transparent);
  font-family:var(--font-mono); font-size:9px; font-weight:600; letter-spacing:.04em; }
.cal-wcard-st { font-weight:700; letter-spacing:.06em; text-transform:uppercase; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* width:100% + text-align:right, BUKAN justify-self:end — grid item yang di-end
   memakai lebar max-content, jadi teks panjang meluber keluar kartu alih-alih di-ellipsis. */
.cal-wcard-pay-v { width:100%; min-width:0; text-align:right; opacity:.85; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* Day + Agenda */
.cal-day-list { overflow:hidden; }
.sched-view--calendar .cal-day-row { display:flex; align-items:center; gap:14px; padding:13px 16px; background:var(--surface-0); border:0; border-top:1px solid var(--line-100); border-left:3px solid var(--sched-accent); border-radius:0; box-shadow:none; }
.sched-view--calendar .cal-day-row:first-child { border-top:0; }
.sched-view--calendar .cal-day-row:hover { background:var(--surface-1,var(--paper-warm)); }
.sched-view--calendar .cd-time { width:96px; color:var(--text-strong,var(--ink)); font-size:13px; font-weight:600; }
.sched-view--calendar .cd-main { gap:1px; }
.sched-view--calendar .cd-main > span { display:flex; align-items:center; gap:8px; }
.sched-view--calendar .cd-main b { color:var(--text-strong,var(--ink)); font-size:14.5px; font-weight:600; }
.sched-view--calendar .cd-main em { color:var(--text-subtle,var(--ink-400)); font-size:12.5px; }
.cal-status-tag,.cal-pay-tag,.cal-today-tag { display:inline-flex; align-items:center; gap:5px; padding:3px 7px; border:1px solid var(--pst-neutral-border); border-radius:999px; color:var(--pst-neutral-text); background:var(--pst-neutral-bg); font-size:10px; font-weight:650; white-space:nowrap; }
.cal-status-tag i { width:5px; height:5px; background:currentColor; border-radius:50%; }
/* Ikut peta warna status app-wide (app.css § status chip aliases). */
.cal-status-tag:is(.st-new) { color:var(--pst-success-text); background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.cal-status-tag:is(.st-confirmed) { color:var(--pst-blue-text); background:var(--pst-blue-bg); border-color:var(--pst-blue-border); }
.cal-status-tag:is(.st-paid) { color:var(--pst-mint-text); background:var(--pst-mint-bg); border-color:var(--pst-mint-border); }
.cal-status-tag:is(.st-contacted) { color:var(--pst-info-text); background:var(--pst-info-bg); border-color:var(--pst-info-border); }
.cal-status-tag:is(.st-partially_paid,.st-rescheduled) { color:var(--pst-orange-text); background:var(--pst-orange-bg); border-color:var(--pst-orange-border); }
.cal-status-tag:is(.st-reviewing) { color:var(--pst-purple-text); background:var(--pst-purple-bg); border-color:var(--pst-purple-border); }
.cal-status-tag:is(.st-tentative,.st-pending_payment) { color:var(--pst-warning-text); background:var(--pst-warning-bg); border-color:var(--pst-warning-border); }
.cal-status-tag:is(.st-cancelled) { color:var(--pst-danger-text); background:var(--pst-danger-bg); border-color:var(--pst-danger-border); }
.cal-pay-tag { border-radius:6px; }
.cal-pay-tag--paid { color:var(--pst-success-text); background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.cal-pay-tag--dp { color:var(--pst-blue-text); background:var(--pst-blue-bg); border-color:var(--pst-blue-border); }
.cal-pay-tag--unpaid { color:var(--pst-orange-text); background:var(--pst-orange-bg); border-color:var(--pst-orange-border); }
.cal-agenda { display:flex; flex-direction:column; gap:16px; padding:4px 2px; }
.cal-agenda-group > header { display:flex; align-items:center; gap:10px; margin-bottom:8px; }
.cal-agenda-group > header > b { color:var(--text-strong,var(--ink)); font-family:var(--font-display); font-size:15px; }
.cal-agenda-group > header > i { height:1px; flex:1; background:var(--line-200); }
.cal-agenda-group > header > small { color:var(--text-subtle,var(--ink-400)); font-family:var(--font-mono); font-size:10.5px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; }
.cal-today-tag { color:var(--pst-identity-text); background:var(--pst-identity-bg); border-color:var(--pst-identity-border); }
.cal-agenda-group > div { display:flex; flex-direction:column; gap:6px; }
.cal-agenda-group .cal-day-row { border:1px solid var(--line-200); border-left:3px solid var(--sched-accent); border-radius:14px; box-shadow:var(--shadow-xs); }

/* Resource presets, custom picker, and exact 08:00–21:00 grid. */
.cal-resource-picker { margin-bottom:var(--space-4); padding:var(--space-5); background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-xs); }
.cal-resource-picker > header { display:flex; align-items:center; justify-content:space-between; gap:var(--space-3); margin-bottom:var(--space-4); flex-wrap:wrap; }
.cal-resource-picker > header > div { display:flex; gap:6px; }
.cal-resource-picker-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:var(--space-5) var(--space-6); }
.cal-resource-picker fieldset { min-width:0; margin:0; padding:0; border:0; }
.cal-resource-picker legend { display:flex; align-items:center; gap:6px; margin-bottom:8px; color:var(--text-strong,var(--ink)); font-size:12px; font-weight:700; }
.cal-resource-picker legend i { width:8px; height:8px; border-radius:2px; }
.cal-resource-picker fieldset label { display:flex; align-items:center; gap:8px; margin-bottom:8px; color:var(--text-body,var(--ink-700)); cursor:pointer; font-size:12.5px; }
.cal-resource-picker fieldset label > i { width:8px; height:8px; flex:none; border-radius:2px; }
.cal-resource-picker fieldset label span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cal-resource-picker > p { margin:var(--space-4) 0 0; color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs); }
.cal-resource-alert { display:flex; align-items:center; gap:8px; margin-bottom:10px; padding:10px 12px; color:var(--pst-danger-text); background:var(--pst-danger-bg); border:1px solid var(--pst-danger-border); border-radius:10px; }
.cal-resource-alert > span { display:flex; align-items:center; gap:8px; color:var(--text-strong,var(--ink)); font-size:12px; font-weight:650; }
.cal-resource-alert > span b { padding:2px 6px; color:var(--pst-danger-text); border:1px solid var(--pst-danger-border); border-radius:6px; font:700 9px var(--font-mono); }
.cal-resource-alert > small { color:var(--text-subtle,var(--ink-400)); font-size:11px; }
.cal-resource-panel { max-height:636px; overflow:auto; overscroll-behavior:contain; background:var(--surface-0); -webkit-overflow-scrolling:touch; }
.cal-resource-head { position:sticky; top:0; z-index:6; display:flex; min-width:max-content; background:var(--surface-1,var(--paper-warm)); border-bottom:1px solid var(--line-200); }
.cal-resource-head > span { width:58px; flex:0 0 58px; border-right:1px solid var(--line-200); }
.cal-resource-head > div { display:flex; flex:1; }
.cal-resource-head-group { display:flex; min-width:124px; flex-direction:column; border-right:2px solid var(--line-200); }
.cal-resource-band { display:flex; align-items:center; gap:7px; padding:6px 12px; color:var(--text-strong,var(--ink)); background:color-mix(in srgb,var(--band-tone) 9%,var(--surface-0)); border-bottom:1px solid color-mix(in srgb,var(--band-tone) 28%,var(--line-100)); }
.cal-resource-band > i { width:8px; height:8px; background:var(--band-tone); border-radius:2px; }
.cal-resource-band b { font-family:var(--font-display); font-size:13px; font-weight:700; }
.cal-resource-band small { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; }
.cal-resource-head-group > div { display:flex; }
.cal-resource-head-group section { min-width:124px; flex:1 1 0; padding:7px 12px 8px; background:color-mix(in srgb,var(--room-hue) 8%,var(--surface-0)); border-top:3px solid var(--room-hue); border-right:1px solid var(--line-100); }
.cal-resource-head-group section > span { display:flex; align-items:center; gap:6px; }
.cal-resource-head-group section > span i { width:8px; height:8px; flex:none; background:var(--room-hue); border-radius:2px; }
.cal-resource-head-group section b { color:var(--text-strong,var(--ink)); font-size:12.5px; }
.cal-resource-head-group section small { display:block; margin-left:14px; color:var(--text-subtle,var(--ink-400)); font-size:10.5px; }
.cal-resource-scroll { display:flex; max-height:none; min-width:max-content; overflow:visible; }
.cal-resource-scroll > aside { position:relative; width:58px; flex:0 0 58px; border-right:1px solid var(--line-200); }
.cal-resource-scroll > aside span { position:absolute; right:8px; color:var(--text-disabled,var(--ink-300)); font:10.5px var(--font-mono); }
.cal-resource-body { position:relative; display:flex; flex:1; min-width:max-content; }
.cal-resource-body-group { display:flex; min-width:124px; border-right:2px solid var(--line-200); }
.cal-resource-body-group > div { position:relative; min-width:124px; flex:1 1 0; border-right:1px solid var(--line-100); }
.cal-resource-body .cal-res-track { position:absolute; inset:0; height:auto!important; cursor:pointer; background-image:repeating-linear-gradient(var(--line-100) 0 1px,transparent 1px var(--res-row-h)); }
.cal-res-track-status { position:absolute; top:4px; right:6px; left:6px; display:flex; align-items:center; gap:5px; color:var(--text-disabled,var(--ink-300)); font:9.5px var(--font-mono); pointer-events:none; }
.cal-res-track-status i { width:6px; height:6px; flex:none; background:var(--mint-green); border-radius:50%; }
.cal-resource-body .cal-res-block { position:absolute; right:0; left:0; display:flex; align-items:center; justify-content:center; background:repeating-linear-gradient(135deg,rgba(154,160,170,.1) 0 6px,rgba(154,160,170,.22) 6px 12px); border-top:1px dashed var(--ink-300); border-bottom:1px dashed var(--ink-300); pointer-events:none; }
.cal-resource-body .cal-res-block span { padding:1px 5px; color:var(--text-muted,var(--ink-500)); background:var(--surface-0); border-radius:3px; font:600 9.5px var(--font-mono); letter-spacing:.04em; text-transform:uppercase; }
.cal-resource-body .cal-res-ev { position:absolute; z-index:3; display:block; overflow:hidden; padding:5px 8px; text-align:left; background:var(--sched-bg); border:1px solid var(--sched-border); border-left:3px solid var(--sched-accent); border-radius:6px; cursor:pointer; }
.cal-resource-body .cal-res-ev .rev-t { display:flex; align-items:center; gap:4px; color:var(--sched-text); font:600 10px var(--font-mono); }
.cal-resource-body .cal-res-ev > b { display:block; overflow:hidden; color:var(--sched-text); font-size:12.5px; text-overflow:ellipsis; white-space:nowrap; }
.cal-resource-body .cal-res-ev > small { display:block; overflow:hidden; color:var(--sched-text); font-size:11px; text-overflow:ellipsis; white-space:nowrap; opacity:.78; }
.cal-resource-parent { position:absolute; z-index:2; overflow:hidden; padding:5px 10px; text-align:left; background:var(--pst-identity-bg); border:1px solid var(--pst-identity-border); border-left:4px solid var(--pst-identity-border); border-radius:6px; cursor:pointer; }
.cal-resource-parent > span { display:flex; align-items:center; gap:5px; color:var(--pst-identity-text); font-size:10px; }
.cal-resource-parent > b { display:block; color:var(--text-strong,var(--ink)); font-size:12.5px; }
.cal-resource-now { position:absolute; right:0; left:0; z-index:4; height:0; border-top:2px solid var(--hot-red); pointer-events:none; }
.cal-resource-now > i { position:absolute; top:-5px; left:-4px; width:9px; height:9px; background:var(--hot-red); border-radius:50%; }
.cal-resource-now > span { position:absolute; top:-8px; right:6px; padding:1px 5px; color:#fff; background:var(--hot-red); border-radius:3px; font:600 9.5px var(--font-mono); }

@media (max-width:900px) {
  .sched-view--calendar .sched-calendar-head { align-items:flex-start; }
  .sched-view--calendar .sched-calendar-toolbar { align-items:flex-start; }
  .sched-view--calendar .sched-calendar-toolbar .cal-brand-tabs { flex-wrap:nowrap; overflow-x:auto; }
  .sched-view--calendar .cal-week { min-width:980px; }
  .sched-view--calendar .cal-month { min-width:760px; }
}
@media (max-width:760px) {
  .sched-view--calendar .sched-calendar-head { padding:14px 14px 12px; }
  .sched-view--calendar .sched-calendar-toolbar { padding:0 14px 12px; }
  .sched-view--calendar .sched-filter-grid { padding:12px 14px; }
  .sched-view--calendar .sched-calendar-frame { padding:12px 14px; }
  .sched-view--calendar .cal-attn-summary { align-items:flex-start; flex-direction:row; flex-wrap:wrap; }
  .sched-view--calendar .cal-attn-summary > i { display:none; }
  .sched-view--calendar .cal-attn-chevron { margin-left:auto; }
  .sched-view--calendar .cal-attn-list { grid-template-columns:1fr; }
  .sched-view--calendar .cal-day-row { display:grid; grid-template-columns:90px minmax(0,1fr); }
  .sched-view--calendar .cd-side { grid-column:2; justify-content:flex-start; }
}
@media (max-width:480px) {
  .sched-view--calendar .sched-filter-grid { grid-template-columns:1fr!important; }
  .sched-view--calendar .cal-attn-shell--safe { align-items:flex-start; flex-wrap:wrap; }
  .sched-view--calendar .cal-attn-shell--safe > span { width:100%; padding-left:36px; }
  .sched-view--calendar .cal-day-row { grid-template-columns:1fr; }
  .sched-view--calendar .cd-side { grid-column:1; }
  .cal-resource-picker > header { align-items:flex-start; flex-direction:column; }
}
/* == SCHEDULE-CALENDAR-PROTOTYPE:END ======================================== */
/* == SCHEDULE-V5:END ========================================================= */

/* ── FE-5 (D5) — BRAND IDENTITY DI KEPALA DIALOG ─────────────────────────────
   Baris komposit (dot + nama + aksi) → grid `auto minmax(0,1fr) auto`, aturan owner.
   Titik warnanya mengambil --sched-brand-rule dari skin brand, jadi tidak ada hex
   baru: satu sumber warna brand untuk kalender, drawer, dan dialog ini. */
.bc-brandid { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center;
  gap:var(--space-3); margin-top:var(--space-3); padding:var(--space-3) var(--space-4);
  background:var(--surface-1); border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.bc-brandid__dot { width:10px; height:10px; border-radius:50%; background:var(--sched-brand-rule,var(--ink-400)); }
.bc-brandid__name { min-width:0; overflow:hidden; color:var(--text-strong);
  font-size:13.5px; font-weight:600; text-overflow:ellipsis; white-space:nowrap; }
.bc-brandid__lbl { grid-column:1 / -1; color:var(--ink-600); font-size:12px; font-weight:620; }
.bc-brandid .ctrl { grid-column:1 / -1; width:100%; min-height:40px; }
.bc-brandid .sched-field-error { grid-column:1 / -1; }

/* ── FE-8 (D7 / F-26) — RINGKASAN KONFIRMASI COMPOSER ────────────────────────
   Direproduksi dari unit `GUI/15/SCHEDULE-SUMMARY` (Component Library.dc.html:2628).
   Anatomi unit: [zona identitas: kicker + judul + subline] · [divider elemen 1px]
   · [zona metrik: kolom label-mono-uppercase + nilai-mono-besar].

   ADAPTASI YANG DISENGAJA, dicatat karena unitnya `type: composite` (= rujukan
   layout, bukan primitive yang wajib identik piksel):
   · Unit aslinya STRIP horizontal selebar dashboard; di sini ia tinggal di dialog
     480px, jadi zona metrik dibungkus grid auto-fit alih-alih satu baris flex.
     Tanpa itu delapan slot akan memaksa scroll horizontal — dilarang §Batasan.
   · Zona ketiga unit (bar progres + tautan) TIDAK direproduksi: composer tidak punya
     data progres maupun tujuan tautan. Menyalinnya berarti mengarang isi.
   · Nol angka uang (§Batasan 1) — unit aslinya pun hanya metrik operasional.

   Tinggi baris nilai dikunci supaya geometri tidak melompat saat field terisi satu
   per satu; slot kosong memakai --text-subtle + kata "belum diisi", bukan strip. */
.bc-summary { position:sticky; bottom:0; z-index:1; display:flex; flex-direction:column; gap:var(--space-3);
  margin-top:var(--space-3); padding:var(--space-5); background:var(--surface-0);
  border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-card); }
.bc-summary__kicker { font-family:var(--font-mono); font-size:11px; letter-spacing:.1em;
  text-transform:uppercase; color:var(--text-subtle); }
.bc-summary__title { font-family:var(--font-display); font-size:19px; font-weight:700;
  line-height:1.2; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bc-summary__sub { font-size:12px; color:var(--text-subtle); }
/* Divider = ELEMEN tersendiri, bukan border — mengikuti anatomi unit. */
.bc-summary__rule { height:1px; background:var(--line-200); }
.bc-summary__grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(96px,1fr)); gap:var(--space-5) var(--space-5); }
.bc-summary__cell { display:flex; flex-direction:column; gap:var(--space-2); min-width:0; }
.bc-summary__label { font-family:var(--font-mono); font-size:10px; letter-spacing:.08em;
  text-transform:uppercase; color:var(--text-subtle); }
.bc-summary__val { min-height:22px; font-family:var(--font-mono); font-size:15px; font-weight:700;
  line-height:22px; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bc-summary__val.is-empty { font-weight:500; color:var(--text-subtle); }

/* ── FE-3 (F-22 / D9) — SKIN BRAND SCHEDULE ──────────────────────────────────
   Warna brand dulu dikarang di JS (`scheduleBrandVisual` mengembalikan 12 hex) lalu
   disuntikkan sebagai style inline ke tiga permukaan. Akibatnya JS jadi otoritas
   warna kedua di samping CSS, dan brand baru yang dibuat owner di registry mustahil
   diwarnai tanpa menyunting JS.

   Sekarang JS hanya menyetel `data-brand`; warnanya tinggal di sini. Nilai
   dipertahankan PERSIS seperti sebelumnya — ini pemindahan otoritas, bukan
   perubahan desain.

   UTANG TOKEN (untuk project upstream 12.04.00): hanya `rule` LUXA & NUSSA yang
   punya token eksak (--brand-luxa-accent / --brand-nussa-accent). Triplet
   soft/border/text ketiga brand belum punya padanan token, jadi ditulis literal di
   sini dan SENGAJA tidak disnap ke --pst-* terdekat: itu akan mengubah warna.
   Begitu token per-brand tersedia upstream, blok ini tinggal menunjuk token. */
.sched-brandskin { --sched-brand-rule:var(--ink-400); --sched-brand-soft:var(--surface-1); --sched-brand-border:var(--line-200); --sched-brand-text:var(--ink-600); }
.sched-brandskin[data-brand="vs"]    { --sched-brand-rule:var(--text-body); --sched-brand-soft:#FEFBE8; --sched-brand-border:#EFE3A0; --sched-brand-text:#3B3400; }
.sched-brandskin[data-brand="luxa"]  { --sched-brand-rule:var(--brand-luxa-accent); --sched-brand-soft:#F3F3F4; --sched-brand-border:#D6D6DA; --sched-brand-text:#2A2A2E; }
.sched-brandskin[data-brand="nussa"] { --sched-brand-rule:var(--brand-nussa-accent); --sched-brand-soft:#FFF1EA; --sched-brand-border:#FFCBA9; --sched-brand-text:#9A3412; }

/* == SCHEDULE-PROTOTYPE-OVERLAYS ============================================= */
/* F-25 — `.schedule-layer` DILEPAS dari kelima selector di bawah.
   `adminModal()` menempelkan kelas layer dari ROUTE AKTIF (activeLayerClass:
   #/bookings → booking-layer, #/schedule → schedule-layer, selain itu ''), sedangkan
   composer hanya menambah `sched-composer-dialog` (+ `bc-dialog`). Akibatnya lebar
   dialog, padding head/body/foot, dan ukuran judul HANYA berlaku bila composer
   dibuka dari #/schedule — dibuka dari Bookings atau POS, dialog yang sama tampil
   berbeda. Composer adalah satu pintu (ADR: satu-satunya jalur create), jadi
   tampilannya tidak boleh bergantung pada dari mana ia dipanggil. */
.modal-center.sched-composer-dialog { width:100%; max-width:480px; max-height:calc(100dvh - 48px); border:0; border-radius:var(--radius-lg); background:var(--surface-0,var(--paper)); }
.modal-center.sched-composer-dialog .sched-composer-head { min-height:0; align-items:flex-start; padding:var(--space-6) var(--space-6) 0; border:0; }
.sched-composer-head > div { gap:4px; }
.modal-center.sched-composer-dialog .sched-composer-head h3 { font-size:20px; }
.sched-composer-head p { margin:0; color:var(--ink-500); font-size:13.5px; line-height:1.5; }
.modal-center.sched-composer-dialog .sched-composer-body { gap:var(--space-5); padding:var(--space-5) var(--space-6); background:var(--surface-0,var(--paper)); }
.modal-center.sched-composer-dialog .mc-foot { min-height:0; padding:var(--space-5) var(--space-6) var(--space-6); border:0; }
.sched-composer-section { display:flex; flex-direction:column; gap:12px; padding:0; background:transparent; border:0; border-radius:0; }
.sched-composer-row { display:flex; gap:12px; align-items:flex-start; }
.sched-composer-row > .frow { flex:1 1 200px; min-width:0; margin:0; }
.sched-composer-row > .sched-source-field { flex-basis:140px; }
.sched-time-row > .frow:first-child { flex-basis:160px; }
.sched-time-row > .frow:nth-child(2) { flex:0 1 120px; }
.sched-time-row > .frow:nth-child(3) { flex-basis:120px; }
.sched-composer-section > .frow { margin:0; }
.sched-composer-section .frow label { display:flex; align-items:center; gap:6px; margin-bottom:6px; color:var(--ink-600); font-size:12px; font-weight:620; }
.sched-composer-section .frow label em { color:var(--ink-300); font-size:10px; font-style:normal; font-weight:500; }
/* F-42 — `!important` dicabut. 14 tempat lain di berkas ini memakai min-height:40px
   polos, jadi tinggi kontrol tidak butuh senjata spesifisitas; menyimpannya hanya
   mengunci tinggi terhadap varian ukuran .ctrl yang sah di kemudian hari. */
.sched-composer-section .ctrl { width:100%; min-height:40px; }
.sched-input-icon { position:relative; }
.sched-input-icon > svg { position:absolute; top:50%; left:11px; z-index:1; color:var(--ink-400); transform:translateY(-50%); pointer-events:none; }
.sched-input-icon > .ctrl { padding-left:36px; }
.sched-composer-section .ctrl.is-invalid { border-color:var(--hot-red); box-shadow:0 0 0 2px color-mix(in srgb,var(--hot-red) 12%,transparent); }
.sched-composer-divider { height:1px; background:var(--line-100,var(--line-soft)); }
.sched-field-error { display:block; margin-top:5px; color:var(--hot-red); font-size:11px; }
.sched-field-hint { display:block; margin-top:5px; color:var(--text-subtle,var(--ink-400)); font-size:11px; line-height:1.4; }
.sched-composer-error { padding:9px 11px; font-size:11.5px; }
.sched-composer-preview { position:relative; display:flex; align-items:center; gap:12px; flex-wrap:wrap; padding:12px 14px; color:var(--sched-brand-text); background:var(--sched-brand-soft); border:1px solid var(--sched-brand-border); border-top:3px solid var(--sched-brand-rule); border-radius:8px; box-shadow:none; }
.sched-composer-branddot { width:10px; height:10px; flex:none; background:var(--sched-brand-rule); border-radius:50%; }
.sched-composer-preview #scSummary { display:flex; min-width:0; flex:1; flex-direction:column; gap:2px; margin:0; }
.sched-composer-preview #scSummary b { overflow:hidden; color:var(--ink); font-size:13.5px; font-weight:600; text-overflow:ellipsis; white-space:nowrap; }
.sched-composer-preview #scSummary span { color:var(--ink-400); font:12px var(--font-mono); }
.sched-composer-brandtag { flex:none; padding:3px 7px; color:var(--ink); background:var(--surface-0,var(--paper)); border:1px solid var(--sched-brand-border); border-radius:5px; font:700 9.5px var(--font-mono); }
.sched-composer-preview #scAvailability { position:static; width:100%; flex:1 0 100%; margin:0; }
.sched-composer-preview #scAvailability:empty { display:none; }
.sched-composer-preview .sched-slot-state { justify-content:center; width:100%; box-sizing:border-box; box-shadow:var(--shadow-card); }

/* Lebar mengikuti layar (vw) dgn batas dalam rem — bukan px mati. 52vw terlalu
   sempit: isinya 2 kolom (Jadwal | Pembayaran), di 1280–1440 kolomnya berdesakan.
   64vw memberi ruang baca, batas atas 72rem menjaga baris tak terlalu panjang. */
.schedule-detail-layer .bk-detail.sched-detail { width:clamp(34rem,64vw,72rem); max-width:96vw; height:100%; border:0; border-top:3px solid var(--sched-brand-rule); background:var(--surface-0,var(--paper)); box-shadow:var(--shadow-pop); animation:schedDrawerIn .24s cubic-bezier(.2,.7,.3,1); }
.sched-detail-head { flex:none; padding:13px 20px 0; background:var(--surface-0,var(--paper)); }
.sched-detail-meta { display:flex; align-items:center; gap:8px; min-width:0; }
.sched-brand-icon { display:inline-flex; width:28px; height:28px; flex:none; align-items:center; justify-content:center; color:var(--sched-brand-rule,#111); background:var(--sched-brand-soft,#f5f5f5); border:1px solid color-mix(in srgb,var(--sched-brand-rule,#111) 22%,transparent); border-radius:7px; font:750 8px var(--font-mono); }
.sched-detail-meta > b { overflow:hidden; color:var(--ink-400); font:650 10.5px var(--font-mono); letter-spacing:.08em; text-overflow:ellipsis; text-transform:uppercase; white-space:nowrap; }
.sched-detail-meta > span,.sched-detail-meta > code { color:var(--ink-300); font:10.5px var(--font-mono); }
.sched-detail-meta .sched-icon-btn { margin-left:auto; }
.sched-icon-btn { display:inline-flex; width:30px; height:30px; flex:none; align-items:center; justify-content:center; padding:0; color:var(--ink-500); background:transparent; border:0; border-radius:7px; cursor:pointer; }
.sched-icon-btn:hover { color:var(--ink); background:var(--surface-50,var(--paper-warm)); }
.sched-detail-title { display:flex; flex-direction:column; gap:7px; margin:8px 0 12px; }
.sched-detail-titlerow { display:flex; align-items:center; gap:10px; }
.sched-detail-title h2 { min-width:0; flex:1; overflow:hidden; margin:0; font-family:var(--font-display,var(--font-sans)); font-size:20px; letter-spacing:-.01em; text-overflow:ellipsis; white-space:nowrap; }
/* Judul booking / tag sesi (Prewedding, Family, dsb) — chip brand-tinted di atas nama klien */
.sched-detail-session { display:inline-flex; align-items:center; align-self:flex-start; gap:6px; max-width:100%; padding:3px 10px 3px 8px; border:1px solid var(--sched-brand-border,var(--identity-yellow-line,#E6DC00)); border-radius:var(--radius-pill,100px); background:var(--sched-brand-soft,var(--identity-yellow-soft,#FFFDE6)); color:var(--sched-brand-text,#4A4500); font:600 11.5px var(--font-body); }
.sched-detail-session > span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sched-detail-session svg { flex:none; opacity:.75; }
.sched-detail-quick { display:flex; gap:8px; margin-bottom:14px; }
.sched-detail-quick .abtn { flex:1; justify-content:center; }
/* Tab drawer: lebih lapang & lebih tegas — tinggi 52px, label 13px, indikator aktif
   3px, dan tiap tab dibatasi lebar wajar supaya tidak melar penuh di drawer lebar. */
.sched-detail .schedule-detail-tabs { margin:0; padding:0 24px; gap:6px; }
.sched-detail .schedule-detail-tabs button { min-width:0; min-height:52px; flex:0 1 auto; padding:0 20px; border-bottom-width:3px; color:var(--text-muted,var(--ink-500)); font:650 13px var(--font-body); letter-spacing:-.01em; transition:color .14s ease, border-color .14s ease; }
.sched-detail .schedule-detail-tabs button:hover { color:var(--text-strong,var(--ink)); border-bottom-color:var(--line-200); }
.sched-detail .schedule-detail-tabs button.active { color:var(--text-strong,var(--ink)); font-weight:750; border-bottom-color:var(--ink-900,var(--ink)); }
.sched-detail .schedule-detail-tabs button.active::after { bottom:-3px; width:22px; height:3px; }
.sched-detail-body { padding:18px 22px!important; background:var(--surface-0,var(--paper)); }
.sched-detail-body .bk-detail-grid,.sched-detail-body .bk-detail-main { display:block; }
.sched-drawer-pane { display:block; }
.sched-pane-title { display:block; margin-bottom:var(--space-3); }
/* Spec 12.56.B §D2 — override BER-SCOPE DRAWER untuk primitive yang dipakai bersama
   modul lain. `.note-area` dan `.bk-sec-*` hidup juga di Bookings/Workspace, jadi
   aturan dasarnya sengaja TIDAK disentuh; hanya di dalam drawer Schedule mereka
   ikut ritme token. Primitive design system (.abtn, .ctrl, .gcard, .tagchip) tetap
   dibiarkan — perbaikannya milik project upstream 12.04, bukan tambalan lokal. */
.sched-detail .note-area { padding:var(--space-4); }
.sched-detail .bk-sec-h { gap:var(--space-3); }

/* Spec 12.56.B §D2 — ritme tiga tingkat, semuanya dari skala token. Nilai lama
   10/14/18px TIDAK ADA di tokens.css (skalanya 2/4/8/12/16/20/24/32); itu sumber
   utama kesan "belum rapi" karena tiap blok memakai jarak karangannya sendiri. */
.sched-drawer-pane {
  --pane-gutter:var(--space-6);      /* 20px — satu-satunya gutter horizontal   */
  --rhythm-intra:var(--space-3);     /*  8px — baris di dalam satu kartu        */
  --rhythm-block:var(--space-4);     /* 12px — kartu ↔ kartu dalam satu seksi   */
  --rhythm-section:var(--space-7);   /* 24px — kicker seksi ↔ seksi sebelumnya  */
}
/* ── OTORITAS TUNGGAL RITME VERTIKAL PANE DRAWER ──────────────────────────────
   Aturan lama `.sched-drawer-pane > :not(:first-child) + .sched-pane-title` hanya
   cocok untuk ANAK LANGSUNG pane, jadi kicker yang bersarang (mis. "Dokumen" dan
   "Kirim ke klien" di dalam .sd2-pane-segment) dapat margin-top 0 dan menempel ke
   blok di atasnya. Ia juga dimatikan oleh wrapper <div> KOSONG yang merebut posisi
   :first-child.

   Sekarang jaraknya ditentukan satu aturan yang tidak peduli kedalaman, dan
   nilainya HANYA dari token. Karena aturan ini lebih spesifik daripada margin milik
   masing-masing komponen, margin lama DITIMPA — bukan dijumlahkan. Itu yang membuat
   jarak tidak pernah menumpuk lagi, dan kenapa memperbaikinya cukup di satu tempat. */
.sched-drawer-pane > div:empty { display:none; }          /* banner gate nonaktif */

/* Ritme dipegang SATU properti: margin-top pada elemen berikutnya. Campuran
   margin-bottom + margin-top adalah sumber dua cacat sekaligus — dempet (kalau
   dua-duanya nol) dan dobel (kalau dua-duanya terisi). Karena itu jarak antar-blok
   tingkat-pane ditetapkan di sini, bukan dititipkan ke masing-masing komponen.
   Ini juga menutup kasus yang sempat lolos: "Sesi" adalah anak PERTAMA .sd2-col,
   jadi aturan `* + .sched-pane-title` tak pernah kena — yang butuh jarak sebenarnya
   WADAHNYA (.sd2-cols), bukan kickernya. */
.sched-drawer-pane > * + * { margin-top:var(--rhythm-section); }
.sched-drawer-pane * + .sched-pane-title { margin-top:var(--rhythm-section); }
/* Kicker yang secara visual paling atas tidak boleh punya jarak: baik karena ia
   memang anak pertama, maupun karena yang mendahuluinya wrapper kosong tadi. */
.sched-drawer-pane .sched-pane-title:first-child,
.sched-drawer-pane > div:empty + .sched-pane-title { margin-top:0; }
/* Blok bersebelahan TANPA kicker di antaranya (mis. baris aksi klien → kartu
   Catatan internal) tetap punya nafas satu tingkat di bawah jarak seksi. */
.sched-drawer-pane .sd2-col > * + *:not(.sched-pane-title) { margin-top:var(--rhythm-block); }
/* Spec 12.56.B §D1 — dulu grid 2 kolom ("Jadwal kiri, Pembayaran & Klien kanan"),
   tapi Pembayaran sudah pindah ke pane Transaksi dan Klien dilipat ke kolom kiri,
   sehingga track kedua jadi yatim: 354px + 18px gap = 48,7% lebar pane terbuang
   jadi ruang kosong. Pane ini sekarang satu aliran kolom penuh. */
.sd2-cols { display:block; }
.sd2-col { min-width:0; }
.sd2-col > .sched-pane-title:first-child { margin-top:0; }
/* (jarak seksi di dalam kolom kini ditangani aturan alur tunggal di atas) */
/* Action bar: tombol proporsional — tinggi seragam 38px, dark primary di kiri. */
/* Master (drawer 480px) memakai 2 kolom + tombol ke-3 span penuh. Di drawer lebar
   ketiganya muat satu baris — span-nya dilepas supaya proporsinya rata. */
.sched-detail .sd2-actionbar .abtn { width:100%; min-height:44px; height:auto; justify-content:center; }
@media (min-width:1000px){
  .sched-detail .sd2-actionbar { grid-template-columns:repeat(3,minmax(0,1fr)); margin-bottom:18px; }
  .sched-detail .sd2-actionbar > :nth-child(3) { grid-column:auto; }
}
.sched-appt-card,.sched-customer-card { overflow:hidden; margin-bottom:16px; border:1px solid var(--line-200,var(--line)); border-radius:10px; }
.sched-appt-card > header { display:flex; align-items:center; gap:8px; padding:9px 13px; background:var(--sched-brand-soft); border-bottom:1px solid var(--sched-brand-border); }
.sched-appt-card > header .sched-brand-icon { width:20px; height:20px; }
.sched-appt-card > header b { min-width:0; flex:1; overflow:hidden; font-size:13px; text-overflow:ellipsis; white-space:nowrap; }
.sched-appt-card > header > span:last-child { color:var(--sched-brand-text); font-size:10.5px; }
.sched-appt-main { display:flex; gap:14px; padding:16px; }
.sched-date-tile { display:flex; width:60px; flex:none; flex-direction:column; align-items:center; justify-content:center; padding:8px 0; background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:8px; }
.sched-date-tile span { color:var(--sched-brand-rule); font:650 10px var(--font-mono); letter-spacing:.08em; }
.sched-date-tile b { font-family:var(--font-display,var(--font-sans)); font-size:26px; line-height:1; }
.sched-date-tile small { color:var(--ink-400); font:10px var(--font-mono); }
.sched-appt-facts { display:flex; min-width:0; flex:1; flex-direction:column; justify-content:center; gap:7px; }
.sched-appt-facts > div { display:flex; align-items:center; gap:8px; }
.sched-appt-facts strong { font-family:var(--font-display,var(--font-sans)); font-size:20px; }
.sched-duration-tag { padding:2px 6px; color:var(--ink-500); background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:5px; font:10px var(--font-mono); }
.sched-appt-facts p { display:flex; align-items:center; gap:6px; overflow:hidden; margin:0; color:var(--ink-500); font-size:13px; text-overflow:ellipsis; white-space:nowrap; }
.sched-appt-share { display:flex; align-items:center; gap:12px; padding:12px 14px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-appt-qr { display:flex; width:74px; height:74px; flex:none; align-items:center; justify-content:center; overflow:hidden; background:#fff; border:1px solid var(--line-200,var(--line)); border-radius:8px; }
.sched-appt-qr svg { width:70px; height:70px; }
.sched-appt-share > div { min-width:0; flex:1; }
.sched-appt-share a { display:block; overflow:hidden; margin:3px 0 8px; color:var(--active-cyan); font-size:11.5px; text-decoration:none; text-overflow:ellipsis; white-space:nowrap; }
.sched-appt-share > div > div { display:flex; gap:8px; }
.sched-customer-main { display:flex; align-items:center; gap:11px; padding:13px 14px; }
.sched-customer-avatar { display:inline-flex; width:36px; height:36px; flex:none; align-items:center; justify-content:center; color:#fff; background:var(--ink); border-radius:50%; font-weight:700; }
.sched-customer-main > div { min-width:0; flex:1; }
.sched-customer-main p { display:flex; align-items:center; gap:7px; margin:0; }
.sched-customer-main p b { overflow:hidden; font-size:14px; text-overflow:ellipsis; white-space:nowrap; }
.sched-customer-main small { display:block; overflow:hidden; margin-top:2px; color:var(--ink-400); font-size:11.5px; text-overflow:ellipsis; white-space:nowrap; }
.sched-tier { padding:2px 6px; color:var(--ink-600); background:var(--surface-50,var(--paper-warm)); border-radius:4px; font:650 9px var(--font-mono); }
.sched-tier.tier-vip { color:var(--pst-warning-text); background:var(--pst-warning-bg); }
.sched-tier.tier-loyal { color:var(--pst-purple-text); background:var(--pst-purple-bg); }
.sched-customer-metrics { display:grid; grid-template-columns:repeat(3,1fr); border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-customer-metrics > div { min-width:0; padding:10px 12px; border-left:1px solid var(--line-100,var(--line-soft)); }
.sched-customer-metrics > div:first-child { border-left:0; }
.sched-customer-metrics span { display:block; color:var(--ink-400); font:600 8.5px var(--font-mono); letter-spacing:.07em; text-transform:uppercase; }
.sched-customer-metrics b { display:block; overflow:hidden; margin-top:4px; font-size:13px; text-overflow:ellipsis; white-space:nowrap; }
.sched-fact-table { overflow:hidden; border:1px solid var(--line-200,var(--line)); border-radius:10px; }
.sched-fact-table > div { display:grid; grid-template-columns:132px minmax(0,1fr); align-items:center; gap:12px; padding:9px 13px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-fact-table > div:first-child { border-top:0; }
.sched-fact-table > div.alt { background:var(--surface-50,var(--paper-warm)); }
.sched-fact-table span { display:flex; align-items:center; gap:6px; color:var(--ink-400); font:600 9.5px var(--font-mono); letter-spacing:.07em; text-transform:uppercase; }
.sched-fact-table b { overflow:hidden; font-size:13px; text-align:right; text-overflow:ellipsis; white-space:nowrap; }
.sched-payment-metrics { display:grid; grid-template-columns:repeat(3,1fr); gap:8px; margin-bottom:16px; }
.sched-payment-metrics > div { padding:11px; background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-100,var(--line-soft)); border-radius:8px; }
.sched-payment-metrics span { display:block; color:var(--ink-400); font:600 9px var(--font-mono); letter-spacing:.09em; text-transform:uppercase; }
.sched-payment-metrics b { display:block; margin-top:6px; font-family:var(--font-display,var(--font-sans)); font-size:17px; }
.sched-payment-metrics b.paid,.sched-payment-total b.paid { color:var(--ok); }
.sched-payment-metrics b.due,.sched-payment-total b.due,.sched-doc-totals b.due { color:var(--warning); }
.sched-pay-progress-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:6px; color:var(--ink-500); font-size:12.5px; }
.sched-pay-progress { height:8px; overflow:hidden; margin-bottom:18px; background:var(--ink-100); border-radius:100px; }
.sched-pay-progress span { display:block; height:100%; background:var(--active-cyan); border-radius:inherit; }
.sched-charge-list,.sched-pay-lines,.sched-deliverables { overflow:hidden; margin-bottom:18px; border:1px solid var(--line-200,var(--line)); border-radius:9px; }
.sched-charge-row { display:flex; align-items:center; gap:11px; padding:10px 13px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-charge-row:first-child { border-top:0; }
.sched-charge-row > i,.sched-pay-line > i,.sched-deliverable > i { display:inline-flex; width:28px; height:28px; flex:none; align-items:center; justify-content:center; color:var(--active-cyan); background:var(--pst-info-bg); border-radius:6px; }
.sched-charge-row > div,.sched-pay-line > div,.sched-deliverable > div { min-width:0; flex:1; }
.sched-charge-row b,.sched-pay-line b,.sched-deliverable b { display:block; overflow:hidden; font-size:13px; text-overflow:ellipsis; white-space:nowrap; }
.sched-charge-row small,.sched-pay-line small,.sched-deliverable small { display:block; color:var(--ink-400); font-size:10.5px; }
.sched-charge-row > strong,.sched-pay-line > strong { flex:none; font-size:12.5px; }
.sched-charge-total { display:flex; align-items:center; justify-content:space-between; padding:11px 13px; background:var(--surface-50,var(--paper-warm)); border-top:1px solid var(--line-200,var(--line)); font-size:13px; font-weight:700; }
.sched-pay-lines { display:flex; overflow:visible; flex-direction:column; gap:8px; border:0; }
.sched-pay-line { display:flex; align-items:center; gap:10px; padding:10px 12px; border:1px solid var(--pst-warning-border); border-radius:8px; }
.sched-pay-line.done { border-color:var(--line-100,var(--line-soft)); }
.sched-pay-line.done > i { color:var(--ok); background:var(--pst-success-bg); }
.sched-pay-line > span { padding:2px 6px; color:var(--warning); background:var(--pst-warning-bg); border-radius:4px; font:650 9px var(--font-mono); }
.sched-pay-line.done > span { color:var(--ok); background:var(--pst-success-bg); }
.sched-payment-total { display:flex; align-items:center; justify-content:space-between; margin-bottom:18px; padding:12px 14px; background:var(--surface-50,var(--paper-warm)); border-radius:8px; }
.sched-payment-total span { color:var(--ink-500); font-size:13px; font-weight:600; }
.sched-payment-total b { font-size:16px; }
.sched-doc-tiles { display:grid; grid-template-columns:repeat(3,1fr); gap:8px; }
.sched-doc-tiles button { display:flex; min-height:82px; flex-direction:column; align-items:center; justify-content:center; gap:8px; padding:12px 7px; color:var(--ink); background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:9px; cursor:pointer; }
.sched-doc-tiles button svg { box-sizing:content-box; padding:8px; background:var(--surface-50,var(--paper-warm)); border-radius:7px; }
.sched-doc-tiles button span { font-size:12px; font-weight:600; }
.sched-doc-tiles button:disabled { opacity:.42; cursor:not-allowed; }
.sched-doc-guard { display:block; margin-top:8px; color:var(--ink-400); font-size:10.5px; }
/* == SCHED-EDIT:BEGIN (Schedule "pintu utama" — aksi edit di drawer) ========== */
.sched-actionbar { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px; }
.sched-actionbar--pay { margin:2px 0 16px; }
.sched-actionbar .abtn { flex:0 0 auto; }
.sched-customer-btns { display:flex; align-items:center; gap:2px; margin-left:auto; }
/* F-41 — baris komposit (ikon + teks + aksi) WAJIB grid `auto | minmax(0,1fr) | auto`,
   bukan flex + margin-left:auto. Dengan flex, kolom teks tidak punya batas atas yang
   dihormati saat nama klien panjang: tombol "Ganti" terdorong keluar atau menimpa
   teks. Track tengah `minmax(0,1fr)` memberi ellipsis titik potong yang pasti. */
.sched-edit-clientchip { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:12px; padding:11px 12px; background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:10px; }
.sched-edit-clientchip > .sched-customer-avatar { flex:none; }
.sched-edit-clientchip > div { display:flex; min-width:0; flex-direction:column; gap:1px; }
.sched-edit-clientchip b { overflow:hidden; font-size:13.5px; text-overflow:ellipsis; white-space:nowrap; }
.sched-edit-clientchip small { overflow:hidden; color:var(--ink-400); font-size:11.5px; text-overflow:ellipsis; white-space:nowrap; }
.sched-edit-clientchip .abtn { flex:none; }
.sched-rel-list { display:flex; flex-direction:column; gap:8px; margin-bottom:16px; }
.sched-rel-row { display:flex; align-items:center; gap:11px; padding:10px 12px; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:9px; }
.sched-rel-row > i { display:inline-flex; width:30px; height:30px; flex:none; align-items:center; justify-content:center; color:var(--ink-500); background:var(--surface-50,var(--paper-warm)); border-radius:7px; }
.sched-rel-row > div { display:flex; min-width:0; flex:1; flex-direction:column; gap:1px; }
.sched-rel-row b { overflow:hidden; font-size:13px; font-weight:600; text-overflow:ellipsis; white-space:nowrap; }
.sched-rel-row small { color:var(--ink-400); font-size:11px; }
.sched-rel-row .abtn { flex:none; }
.sched-rel-tag { display:inline-flex; align-items:center; justify-content:center; min-width:24px; height:22px; padding:0 7px; color:var(--sched-brand-text,var(--ink)); font:600 11px var(--font-mono); background:var(--sched-brand-soft,var(--surface-50,var(--paper-warm))); border:1px solid var(--sched-brand-border,var(--line-200,var(--line))); border-radius:6px; }
/* == SCHED-EDIT:END ========================================================== */
.sched-prod-banner { display:flex; align-items:center; gap:11px; margin-bottom:18px; padding:12px 13px; background:var(--pst-info-bg); border:1px solid var(--pst-info-border); border-radius:9px; }
.sched-prod-banner.pending { background:var(--surface-50,var(--paper-warm)); border-color:var(--line-200,var(--line)); }
.sched-prod-banner.done { background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.sched-prod-banner > i { display:inline-flex; width:36px; height:36px; flex:none; align-items:center; justify-content:center; color:var(--active-cyan); background:var(--paper); border-radius:8px; }
.sched-prod-banner.done > i { color:var(--ok); }
.sched-prod-banner b,.sched-prod-banner span { display:block; }
.sched-prod-banner b { font-size:13.5px; }
.sched-prod-banner span { margin-top:1px; color:var(--ink-500); font-size:12px; }
.sched-prod-steps { margin-bottom:8px; }
.sched-prod-step { display:flex; gap:12px; }
.sched-prod-step > div { display:flex; flex-direction:column; align-items:center; }
.sched-prod-step > div i { display:inline-flex; width:28px; height:28px; flex:none; align-items:center; justify-content:center; color:var(--ink-300); background:var(--ink-050); border-radius:50%; }
.sched-prod-step.current > div i { color:var(--ink); background:var(--identity-yellow); box-shadow:0 0 0 3px color-mix(in srgb,var(--identity-yellow) 30%,transparent); }
.sched-prod-step.done > div i { color:#fff; background:var(--ink); }
.sched-prod-step > div span { width:2px; min-height:14px; flex:1; background:var(--line-200,var(--line)); }
.sched-prod-step.done > div span { background:var(--ink-200); }
.sched-prod-step p { flex:1; margin:0; padding:4px 0 16px; }
.sched-prod-step p b,.sched-prod-step p small { display:block; }
.sched-prod-step p b { color:var(--ink-400); font-size:13.5px; }
.sched-prod-step.current p b,.sched-prod-step.done p b { color:var(--ink); }
.sched-prod-step p small { margin-top:2px; color:var(--ink-400); font-size:10.5px; }
.sched-deliverable { display:flex; align-items:center; gap:11px; padding:10px 13px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-deliverable:first-child { border-top:0; }
.sched-deliverable > i.done { color:var(--ok); background:var(--pst-success-bg); }
.sched-deliverable > span { padding:2px 6px; color:var(--ink-400); background:var(--surface-50,var(--paper-warm)); border-radius:4px; font:650 9px var(--font-mono); }
.sched-deliverable > span.done { color:var(--ok); background:var(--pst-success-bg); }
.sched-deliverable > span.current { color:var(--active-cyan); background:var(--pst-info-bg); }
.sched-empty-row { padding:16px; color:var(--ink-400); font-size:12px; text-align:center; }
.sched-history-timeline > div { display:flex; gap:12px; }
.sched-history-timeline > div > div { display:flex; flex-direction:column; align-items:center; }
.sched-history-timeline > div > div i { display:inline-flex; width:28px; height:28px; flex:none; align-items:center; justify-content:center; color:var(--ink-300); background:var(--ink-050); border-radius:50%; }
.sched-history-timeline > div.on > div i { color:#fff; background:var(--ink); }
.sched-history-timeline > div > div span { width:2px; min-height:16px; flex:1; background:var(--line-200,var(--line)); }
.sched-history-timeline > div.on > div span { background:var(--ink-200); }
.sched-history-timeline > div > section { min-width:0; flex:1; padding:3px 0 18px; }
.sched-history-timeline p { display:flex; align-items:baseline; justify-content:space-between; gap:10px; margin:0; }
.sched-history-timeline p b { font-size:13.5px; }
.sched-history-timeline time { color:var(--ink-400); font-size:10.5px; }
.sched-history-timeline footer { display:flex; align-items:center; gap:6px; margin-top:4px; }
.sched-history-timeline footer em { display:inline-flex; width:18px; height:18px; align-items:center; justify-content:center; color:var(--ink-600); background:var(--ink-100); border-radius:50%; font-size:9px; font-style:normal; font-weight:700; }
.sched-history-timeline footer span { color:var(--ink-500); font-size:12px; }
.sched-history-timeline footer small { padding:1px 5px; color:var(--ink-400); background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:100px; font:600 8.5px var(--font-mono); letter-spacing:.05em; text-transform:uppercase; }
/* Footer: aksi destruktif kiri, aksi utama kanan dengan lebar terkendali —
   sebelumnya tombol dark memakai flex:1 sehingga melar seluruh sisa drawer. */
.sched-detail-foot { display:flex; align-items:center; gap:10px; padding:14px 22px; }
.sched-detail-foot > .abtn--danger { margin-right:auto; }
.sched-detail-foot .abtn { min-height:44px; height:auto; }
.sched-detail-foot .abtn--danger { color:var(--hot-red); background:var(--paper); border-color:var(--pst-danger-border); }
.sched-detail-foot .abtn--dark { flex:0 1 240px; justify-content:center; }

/* z-index harus DI ATAS .bk-detail-back (1200): overlay ini dibuka DARI dalam drawer
   booking, jadi dengan 260 ia terselip di belakang backdrop drawer dan terlihat blur. */
.sched-doc-overlay { position:fixed; inset:0; z-index:1250; display:flex; align-items:center; justify-content:center; padding:20px; background:rgba(5,5,5,.5); backdrop-filter:blur(3px); animation:schedProtoFade .16s ease; }
.sched-doc-modal { display:flex; width:460px; max-width:94vw; max-height:88vh; flex-direction:column; overflow:hidden; background:var(--surface-0,var(--paper)); border-radius:16px; box-shadow:var(--shadow-pop); animation:schedProtoPop .2s ease; }
.sched-doc-modal > header { display:flex; align-items:center; gap:10px; padding:14px 18px; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sched-doc-modal-icon { display:inline-flex; width:30px; height:30px; align-items:center; justify-content:center; background:var(--ink-050); border-radius:8px; }
.sched-doc-modal > header h3 { min-width:0; flex:1; margin:0; font-family:var(--font-display,var(--font-sans)); font-size:15px; }
.sched-doc-x { display:inline-flex; width:30px; height:30px; align-items:center; justify-content:center; padding:0; color:var(--ink-500); background:transparent; border:0; border-radius:7px; cursor:pointer; }
.sched-doc-modal-body { flex:1; overflow:auto; padding:20px; }
.sched-doc-modal > footer { display:flex; gap:10px; padding:14px 18px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-doc-modal > footer .abtn { flex:1; justify-content:center; }
.sched-doc-preview { color:var(--ink); }
.sched-doc-preview > header { display:flex; align-items:flex-start; justify-content:space-between; gap:16px; margin-bottom:18px; }
.sched-doc-brand { display:flex; align-items:center; gap:10px; }
.sched-doc-brand .sched-brand-icon { width:34px; height:34px; }
.sched-doc-brand b,.sched-doc-brand small,.sched-doc-number b,.sched-doc-number span { display:block; }
.sched-doc-brand b { font-family:var(--font-display,var(--font-sans)); font-size:15px; }
.sched-doc-brand small { color:var(--ink-400); font-size:11.5px; }
.sched-doc-number { text-align:right; }
.sched-doc-number b { font-family:var(--font-display,var(--font-sans)); font-size:20px; }
.sched-doc-number span { color:var(--ink-400); font-size:11px; }
.sched-doc-client { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:16px; padding:14px 0; border-top:1px solid var(--line-100,var(--line-soft)); border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sched-doc-client > div:last-child { text-align:right; }
.sched-doc-client b,.sched-doc-client small { display:block; }
.sched-doc-client b { margin-top:5px; font-size:13.5px; }
.sched-doc-client small { margin-top:2px; color:var(--ink-400); font-size:11.5px; }
.sched-doc-lines,.sched-receipt-rows { overflow:hidden; margin-bottom:14px; border:1px solid var(--line-200,var(--line)); border-radius:9px; }
.sched-doc-line { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:10px 13px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-doc-line:first-child { border-top:0; }
.sched-doc-line b,.sched-doc-line small { display:block; }
.sched-doc-line b { font-size:13px; }
.sched-doc-line small { color:var(--ink-400); font-size:10.5px; }
.sched-doc-line strong { font-size:13px; }
.sched-doc-totals { display:flex; flex-direction:column; gap:7px; padding:0 4px; }
.sched-doc-totals > div { display:flex; justify-content:space-between; gap:12px; color:var(--ink-500); font-size:13px; }
.sched-doc-totals > div.total { margin-top:2px; padding-top:9px; color:var(--ink); border-top:1px solid var(--line-200,var(--line)); font-size:14px; font-weight:700; }
.sched-doc-note { margin:16px 0 0; padding:10px 12px; color:var(--ink-500); background:var(--surface-50,var(--paper-warm)); border-radius:8px; font-size:11.5px; line-height:1.5; }
.sched-receipt-title { text-align:center; }
.sched-receipt-title small { display:block; margin-top:4px; color:var(--ink-400); font-size:12px; }
.sched-received { margin:18px 0; padding:18px; text-align:center; background:var(--sched-brand-soft); border:1px solid var(--sched-brand-border); border-radius:9px; }
.sched-received span,.sched-received small { display:block; color:var(--ink-500); font-size:12px; }
.sched-received b { display:block; margin:4px 0; font-family:var(--font-display,var(--font-sans)); font-size:30px; }
.sched-receipt-row { display:flex; justify-content:space-between; gap:14px; padding:9px 13px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-receipt-row:first-child { border-top:0; }
.sched-receipt-row.alt { background:var(--surface-50,var(--paper-warm)); }
.sched-receipt-row span { color:var(--ink-400); font:600 10px var(--font-mono); letter-spacing:.07em; text-transform:uppercase; }
.sched-receipt-row b { font-size:13px; text-align:right; }
.sched-receipt > footer { margin-top:22px; text-align:right; }
.sched-receipt > footer span,.sched-receipt > footer b { display:block; }
.sched-receipt > footer span { color:var(--ink-500); font-size:12px; }
.sched-receipt > footer b { margin-top:26px; font-family:var(--font-display,var(--font-sans)); font-size:14px; }
.sched-share-copy { margin-bottom:16px; padding:13px; background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-100,var(--line-soft)); border-radius:9px; }
.sched-share-copy p { margin:0 0 6px; color:var(--ink-600); font-size:13px; line-height:1.55; }
.sched-share-copy b,.sched-share-copy span,.sched-share-copy a { display:block; }
.sched-share-copy b { font-size:13px; }
.sched-share-copy span { margin-top:2px; color:var(--ink-500); font-size:12.5px; }
.sched-share-copy a { margin-top:8px; color:var(--active-cyan); font:12px var(--font-mono); text-decoration:none; }
.sched-share-kicker { display:block; margin-bottom:10px; }
.sched-share-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.sched-share-grid button { display:flex; align-items:center; gap:10px; padding:12px 13px; color:var(--ink); background:var(--paper); border:1px solid var(--line-200,var(--line)); border-radius:9px; cursor:pointer; text-align:left; }
.sched-share-grid button i { display:inline-flex; width:32px; height:32px; align-items:center; justify-content:center; background:var(--ink-050); border-radius:7px; }
.sched-share-grid button b { font-size:13px; }

.schedule-toast-host { position:fixed; right:24px; bottom:24px; z-index:1600; }   /* umpan balik ≥ semua permukaan interaktif (tangga lapisan 2026-08-10) */
.schedule-toast { position:relative; display:flex; width:360px; max-width:92vw; align-items:flex-start; gap:12px; overflow:hidden; padding:14px 14px 14px 0; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:10px; box-shadow:var(--shadow-pop); }
.schedule-toast-bar { position:absolute; top:0; bottom:0; left:0; width:4px; background:var(--ink-400); }
.schedule-toast-icon { display:inline-flex; width:20px; height:20px; flex:none; margin-top:1px; margin-left:16px; color:var(--ink-400); }
.schedule-toast.tone-success .schedule-toast-bar,.schedule-toast.tone-success .schedule-toast-icon { color:var(--ok); background:var(--ok); }
.schedule-toast.tone-info .schedule-toast-bar,.schedule-toast.tone-info .schedule-toast-icon { color:var(--active-cyan); background:var(--active-cyan); }
.schedule-toast.tone-warning .schedule-toast-bar,.schedule-toast.tone-warning .schedule-toast-icon { color:var(--warning); background:var(--warning); }
.schedule-toast.tone-danger .schedule-toast-bar,.schedule-toast.tone-danger .schedule-toast-icon { color:var(--hot-red); background:var(--hot-red); }
.schedule-toast-icon svg { background:var(--surface-0,var(--paper)); }
.schedule-toast-body { display:flex; min-width:0; flex:1; flex-direction:column; gap:2px; }
.schedule-toast-body b { color:var(--ink); font-size:14px; line-height:1.35; }
.schedule-toast-body span { color:var(--ink-500); font-size:13px; line-height:1.45; }
.schedule-toast-close { flex:none; margin-right:0; padding:2px; color:var(--ink-400); background:transparent; border:0; border-radius:6px; cursor:pointer; }

.sx-overlay.schedule-layer.sx-overlay-prototype { z-index:220; display:flex; align-items:flex-start; justify-content:center; overflow:auto; padding:32px 24px; background:rgba(5,5,5,.48); backdrop-filter:blur(3px); }
.sx-overlay-prototype .sx-modal { width:980px; max-width:100%; overflow:hidden; background:var(--surface-0,var(--paper)); border-radius:16px; box-shadow:var(--shadow-pop); animation:schedProtoPop .2s cubic-bezier(.2,.7,.3,1); }
.sx-overlay-prototype .sx-controls { display:flex; align-items:center; gap:12px; padding:16px 20px; border-bottom:1px solid var(--line-200,var(--line)); }
.sx-export-title { min-width:180px; flex:1; }
.sx-export-title h2 { margin:3px 0 0; font-family:var(--font-display,var(--font-sans)); font-size:18px; letter-spacing:-.01em; }
.sx-date-input { height:38px; padding:0 11px; color:var(--ink); background:var(--paper); border:1px solid var(--line-200,var(--line)); border-radius:8px; font:13.5px var(--font-body); }
.sx-switch-label { display:inline-flex; height:38px; align-items:center; gap:9px; padding:0 11px; background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:8px; cursor:pointer; }
.sx-switch-label input { position:absolute; opacity:0; pointer-events:none; }
.sx-switch-label i { position:relative; width:32px; height:18px; flex:none; background:var(--ink-200); border-radius:20px; }
.sx-switch-label i::after { content:""; position:absolute; top:2px; left:2px; width:14px; height:14px; background:#fff; border-radius:50%; box-shadow:0 1px 3px rgba(0,0,0,.2); transition:transform .16s ease; }
.sx-switch-label input:checked + i { background:var(--ink); }
.sx-switch-label input:checked + i::after { transform:translateX(14px); }
.sx-switch-label input:focus-visible + i { outline:2px solid var(--electric-blue,#2563eb); outline-offset:3px; }
.sx-switch-label span { font-size:13px; font-weight:600; }
.sx-close { display:inline-flex; width:30px; height:30px; flex:none; align-items:center; justify-content:center; padding:0; color:var(--ink-500); background:transparent; border:0; border-radius:7px; cursor:pointer; }
.sx-overlay-prototype .sx-export-actions { gap:10px; padding:12px 20px; background:var(--surface-50,var(--paper-warm)); border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sx-export-actions small { color:var(--ink-400); font-size:12px; }
.sx-sheet-scroll { max-height:62vh; overflow:auto; padding:20px; }
.sx-overlay-prototype .sx-sheet { width:100%; max-width:none; overflow:hidden; padding:0; color:var(--ink); background:#fff; border:1px solid var(--line-200,var(--line)); border-radius:10px; box-shadow:none; }
.sx-overlay-prototype .sx-head { display:flex; align-items:center; justify-content:space-between; gap:12px; margin:0; padding:13px 17px; color:#fff; background:var(--ink); border-radius:0; }
.sx-overlay-prototype .sx-brand { display:flex; flex-direction:row; align-items:center; gap:10px; }
.sx-overlay-prototype .sx-brand small { margin:0; padding-left:10px; border-left:1px solid rgba(255,255,255,.25); font-family:var(--font-body); font-size:13px; font-weight:500; letter-spacing:0; text-transform:none; }
.sx-overlay-prototype .sx-wordmark b { color:var(--identity-yellow); }
.sx-grid-head { display:flex; background:var(--surface-50,var(--paper-warm)); border-bottom:2px solid var(--line-200,var(--line)); }
.sx-time-corner { width:58px; flex:0 0 58px; border-right:1px solid var(--line-200,var(--line)); }
.sx-band { min-width:0; }
.sx-band > b { display:block; padding:5px 8px; background:var(--ink-050); border-bottom:1px solid var(--line-100,var(--line-soft)); font-size:12px; text-align:center; }
.sx-band > b.alt { background:var(--pst-purple-bg); }
.sx-band > div { display:flex; }
.sx-band > div span { min-width:0; flex:1; padding:5px; overflow:hidden; font-size:10.5px; font-weight:600; text-align:center; text-overflow:ellipsis; white-space:nowrap; }
.sx-grid-row { display:flex; min-height:30px; }
.sx-grid-row > time { display:flex; width:58px; flex:0 0 58px; align-items:center; justify-content:flex-end; padding:0 8px; color:var(--ink-400); border-right:1px solid var(--line-200,var(--line)); font:10.5px var(--font-mono); }
.sx-row-band { display:flex; min-width:0; }
.sx-grid-cell { display:flex; min-width:0; flex:1; align-items:center; overflow:hidden; padding:2px 5px; }
.sx-grid-cell.free { background:var(--pst-success-bg); }
.sx-grid-cell.free i { width:5px; height:5px; background:var(--pst-success-border); border-radius:50%; }
.sx-grid-cell.block { background:repeating-linear-gradient(135deg,var(--surface-50,var(--paper-warm)) 0 5px,var(--pst-neutral-bg) 5px 10px); }
.sx-grid-cell.block b { overflow:hidden; color:var(--ink-500); font:600 8.5px var(--font-mono); letter-spacing:.04em; text-overflow:ellipsis; text-transform:uppercase; white-space:nowrap; }
.sx-grid-cell.book { color:var(--sx-cell-text); background:var(--sx-cell-bg); border-left:2px solid var(--sx-cell-border); }
.sx-grid-cell.book b { overflow:hidden; font-size:9.5px; text-overflow:ellipsis; white-space:nowrap; }
.sx-overlay-prototype .sx-legend { display:flex; align-items:center; gap:15px; margin:0; padding:9px 13px; background:var(--surface-50,var(--paper-warm)); border-top:2px solid var(--line-200,var(--line)); }
.sx-overlay-prototype .sx-leg { font-size:11.5px; }
.sx-overlay-prototype .sx-leg i { width:12px; height:12px; border:1px solid transparent; border-radius:3px; }
.sx-overlay-prototype .sx-leg i.free { background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.sx-overlay-prototype .sx-leg i.confirmed { background:var(--pst-success-bg); border-color:var(--ok); }
.sx-overlay-prototype .sx-leg i.unpaid { background:var(--pst-warning-bg); border-color:var(--warning); }
.sx-overlay-prototype .sx-leg i.blocked { background:var(--pst-neutral-bg); border-color:var(--ink-400); }
.sx-overlay-prototype .sx-legend > .mono { color:var(--ink-300); font-size:10px; }

@media (max-width:600px) {
  .modal-center.sched-composer-dialog { align-self:center; width:calc(100% - 24px); max-height:calc(100dvh - 24px); border-radius:var(--radius-lg); }
  .sched-composer-row { flex-wrap:wrap; }
  .sched-composer-row > .frow { flex:1 1 100%; }
  .schedule-detail-layer .bk-detail.sched-detail { width:100vw; max-width:100vw; }
  .sched-detail .schedule-detail-tabs button { min-width:82px; }
  .sd2-advanced-link { grid-template-columns:minmax(0,1fr); }
  .sd2-advanced-link .abtn { width:100%; }
  .sched-detail-foot { flex-wrap:wrap; }
  .sched-detail-foot > .grow { display:none; }
  .sched-detail-foot > .abtn--danger { margin-right:0; }
  .sched-appt-share { align-items:flex-start; }
  .sched-customer-metrics b { font-size:11.5px; }
  .sched-fact-table > div { grid-template-columns:112px minmax(0,1fr); }
  .sched-doc-overlay { align-items:flex-end; padding:0; }
  .sched-doc-modal { width:100%; max-width:100%; max-height:92vh; border-radius:16px 16px 0 0; }
  .schedule-toast-host { right:12px; bottom:12px; left:12px; }
  .schedule-toast { width:100%; max-width:none; box-sizing:border-box; }
  .sx-overlay.schedule-layer.sx-overlay-prototype { align-items:flex-start; padding:12px; }
  .sx-overlay-prototype .sx-controls { align-items:stretch; flex-wrap:wrap; }
  .sx-export-title { flex:1 1 calc(100% - 44px); order:0; }
  .sx-close { order:1; }
  .sx-date-input,.sx-switch-label { flex:1 1 100%; order:2; }
  .sx-export-actions .abtn { flex:1 1 calc(50% - 8px); justify-content:center; }
  .sx-export-actions small { flex:1 1 100%; }
  .sx-sheet-scroll { padding:10px; }
  .sx-overlay-prototype .sx-sheet { min-width:720px; }
}
@media print {
  body.sx-printing .sx-overlay-prototype .sx-controls { display:none!important; }
  body.sx-printing .sx-overlay-prototype .sx-modal { width:auto; box-shadow:none; }
  body.sx-printing .sx-sheet-scroll { max-height:none; overflow:visible; padding:0; }
  body.schedule-doc-printing .sched-doc-overlay { position:static; padding:0; background:none; }
  body.schedule-doc-printing .sched-doc-modal { width:auto; max-width:none; max-height:none; box-shadow:none; }
  body.schedule-doc-printing .sched-doc-modal > header,body.schedule-doc-printing .sched-doc-modal > footer { display:none!important; }
  body.schedule-doc-printing .sched-doc-modal-body { overflow:visible; padding:0; }

  /* ── Dokumen A4 print-ready (Invoice · Tagihan · Kwitansi) ────────────────────
     DULU blok cetak ini hanya "membuka" overlay: sisa aplikasi (sidebar, topbar,
     kalender, drawer) TIDAK disembunyikan, jadi hasil cetak ikut memuat seluruh
     dashboard dan dokumennya terpotong. Sekarang halaman cetak hanya berisi
     dokumen, di atas kertas A4 sungguhan. */
  body.schedule-doc-printing { background:#fff !important; margin:0; }
  body.schedule-doc-printing > *:not(#adminOverlay) { display:none !important; }
  /* Di dalam overlay, hanya overlay dokumen yang dicetak — drawer booking yang
     mungkin masih terbuka di belakangnya tidak ikut. */
  body.schedule-doc-printing #adminOverlay > *:not(.sched-doc-overlay) { display:none !important; }
  body.schedule-doc-printing #adminOverlay { position:static; inset:auto; display:block; }

  /* Kertas: A4 potret dgn margin cetak yang aman untuk printer rumahan. */
  @page { size:A4 portrait; margin:14mm; }

  /* Dokumen jadi lembar datar — tanpa kartu, bayangan, atau sudut membulat yang
     hanya masuk akal di layar. Warna status TETAP dicetak (ia membawa arti). */
  body.schedule-doc-printing #scheduleDocPrint {
    box-shadow:none !important; border:0 !important; border-radius:0 !important;
    padding:0 !important; margin:0 !important; width:auto !important; max-width:none !important;
    background:#fff !important; color:#000;
    -webkit-print-color-adjust:exact; print-color-adjust:exact;
    /* Spec 12.56.B §D12 — pratinjau layar men-scale lembar A4 agar muat di modal.
       Saat dicetak kertasnya SUDAH A4, jadi skala dan tinggi minimum wajib dilepas;
       tanpa ini dokumen tercetak mengecil sebesar --sheet-scale. */
    min-height:0 !important;
  }
  body.schedule-doc-printing #scheduleDocPrint * { -webkit-print-color-adjust:exact; print-color-adjust:exact; }

  /* Jangan memotong blok yang harus dibaca utuh di satu halaman. */
  body.schedule-doc-printing .inv2-head,
  body.schedule-doc-printing .inv2-masthead,
  body.schedule-doc-printing .inv2-docmeta,
  body.schedule-doc-printing .inv2-panel,
  body.schedule-doc-printing .inv2-session-row,
  body.schedule-doc-printing .inv2-tx-group,
  body.schedule-doc-printing .inv2-totals,
  body.schedule-doc-printing .inv2-terms,
  body.schedule-doc-printing .inv2-sign,
  body.schedule-doc-printing .inv2-foot,
  body.schedule-doc-printing .vs-receipt { break-inside:avoid; page-break-inside:avoid; }
  /* Header kolom ikut berulang bila tabel item melewati batas halaman. */
  body.schedule-doc-printing .inv2-line--head { break-after:avoid; page-break-after:avoid; }
  /* Judul dokumen tidak boleh berdiri sendirian di kaki halaman. */
  body.schedule-doc-printing .inv2-kicker { break-after:avoid; page-break-after:avoid; }
  /* Kwitansi (struk sempit) dicetak rata kiri di lembar A4, bukan mengambang. */
  body.schedule-doc-printing .vs-receipt { margin:0; max-width:78mm; }
}
@keyframes schedProtoFade { from { opacity:0; } }
@keyframes schedProtoPop { from { opacity:0; transform:translateY(8px) scale(.99); } }
/* == SCHEDULE-PROTOTYPE-OVERLAYS:END ========================================= */

/* == SCHEDULE-PROTOTYPE-1TO1: LIST + GLOBAL BLOCKS =========================== */
.sl-root,.sg-root { display:flex; min-width:0; flex-direction:column; gap:14px; }
.sg-toolbar > .grow,.sl-period-hint > .grow,.sl-bulk > .grow { flex:1 1 auto!important; }

/* Toolbar Daftar Jadwal memakai pola `.ops-toolbar` (lihat § ops-toolbar).
   Baris kedua = filter, mengikuti pola `.ops-toolbar .grp-ctrl` di modul lain. */
/* Baris filter fluid: tiap kontrol tumbuh mengisi lebar kontainer, jadi tidak ada
   ruang kosong menganga di ujung kanan saat jumlah filter berubah per mode view. */
.ops-toolbar .ops-filterrow {
  display:flex; flex:1 1 100%; flex-wrap:wrap; align-items:center; gap:var(--space-3);
  margin:0; padding:var(--space-3) 0 0; border-top:1px solid var(--line-100);
}
.ops-toolbar .ops-filterrow > * { flex:1 1 150px; min-width:130px; }
.ops-toolbar .ops-filterrow > .vs-tabs { flex:0 0 auto; }
.ops-toolbar .ops-filterrow > .vs-btn { flex:0 0 auto; }
.ops-toolbar--schedule .sl-scale-tabs { flex:none; max-width:100%; overflow-x:auto; scrollbar-width:none; }
/* Aksi (Import/Export/Booking) membungkus sebagai satu grup di kanan — tidak
   terpecah antar-baris saat toolbar sempit. */
.ops-toolbar .ops-actions { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; margin-left:auto; }
/* Di layar sempit toolbar Schedule menumpuk jadi tinggi (6 tab + 6 filter):
   sticky dimatikan supaya tidak menutupi hampir seluruh layar. */
@media (max-width:760px) {
  .ops-toolbar.ops-toolbar--schedule { position:static; }
  .ops-toolbar.ops-toolbar--schedule .ops-filterrow > * { flex:1 1 140px; }
}
.ops-toolbar--schedule .sl-period-root { flex:1 1 160px; width:auto; min-width:140px; }
.ops-toolbar--schedule .sl-period-trigger { width:100%; height:auto; min-height:44px; border-radius:var(--radius-sm); }

.sl-period-root { position:relative; width:100%; }
.sl-period-trigger { display:flex; width:100%; height:34px; align-items:center; gap:7px; padding:0 10px; color:var(--text-strong,var(--ink)); background:var(--surface-0,var(--paper)); border:1px solid var(--border-input,var(--line)); border-radius:var(--radius-sm,8px); cursor:pointer; font:600 12.5px var(--font-body); white-space:nowrap; }
.sl-period-trigger.active { background:var(--brand-soft,var(--identity-yellow-soft)); border-color:var(--brand-line,var(--identity-yellow-shadow)); }
.sl-period-trigger > span { min-width:0; flex:1; overflow:hidden; text-align:left; text-overflow:ellipsis; }
.sl-period-pop { position:absolute; top:calc(100% + 6px); right:0; z-index:70; width:224px; overflow:hidden; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); box-shadow:var(--shadow-pop,0 18px 50px rgba(5,5,5,.18)); animation:sx-pop .14s cubic-bezier(.2,.7,.3,1); }
.sl-period-presets { display:flex; flex-wrap:wrap; gap:5px; padding:9px 9px 8px; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sl-period-presets button { padding:4px 8px; color:var(--text-muted,var(--ink-500)); background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:999px; cursor:pointer; font:500 10.5px var(--font-body); white-space:nowrap; }
.sl-period-presets button.active { color:#fff; background:var(--vs-black,var(--ink)); border-color:var(--vs-black,var(--ink)); font-weight:600; }
.sl-period-cal { padding:9px; }
.sl-period-cal-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:5px; }
.sl-period-cal-head > b { color:var(--text-strong,var(--ink)); font:700 12.5px var(--font-display); letter-spacing:-.01em; }
.sl-period-cal-head > span { display:flex; gap:2px; }
.sl-period-cal-head button { display:inline-flex; width:24px; height:24px; align-items:center; justify-content:center; padding:0; color:var(--text-muted,var(--ink-500)); background:transparent; border:0; border-radius:var(--radius-xs,6px); cursor:pointer; }
.sl-period-week,.sl-period-days { display:grid; grid-template-columns:repeat(7,1fr); }
.sl-period-week { margin-bottom:2px; }
.sl-period-week span { color:var(--text-disabled,var(--ink-300)); font:600 9px var(--font-mono); text-align:center; }
.sl-period-week span:first-child { color:var(--accent-red,var(--danger)); }
.sl-period-days { gap:1px; }
.sl-period-day { height:25px; padding:0; color:var(--text-body,var(--ink-700)); background:transparent; border:0; border-radius:var(--radius-xs,6px); cursor:pointer; font:500 11px var(--font-mono); }
.sl-period-day:hover { background:var(--surface-1,var(--paper-warm)); }
.sl-period-day.out { color:var(--text-disabled,var(--ink-300)); }
.sl-period-day.range { background:var(--brand-soft,var(--identity-yellow-soft)); border-radius:0; }
.sl-period-day.end { color:var(--vs-black,var(--ink)); background:var(--vs-yellow,var(--identity-yellow)); font-weight:700; }
.sl-period-day.today:not(.end):not(.range) { box-shadow:inset 0 0 0 1px var(--brand-line,var(--identity-yellow-shadow)); font-weight:700; }
.sl-period-actions { display:flex; align-items:center; justify-content:space-between; margin-top:7px; padding-top:7px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sl-period-actions > button:first-child { display:inline-flex; align-items:center; gap:4px; padding:0; color:var(--text-muted,var(--ink-500)); background:transparent; border:0; cursor:pointer; font:600 11px var(--font-body); }
.sl-period-hint { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:0; padding:8px 12px; color:var(--text-strong,var(--ink)); background:var(--brand-soft,var(--identity-yellow-soft)); border:1px solid var(--brand-line,var(--identity-yellow-shadow)); border-radius:var(--radius-sm,8px); font-size:13px; }
.sl-period-hint > span { flex:none; color:var(--text-subtle,var(--ink-500)); font-size:12.5px; }
.sl-period-hint > button { display:inline-flex; align-items:center; gap:5px; padding:0; color:var(--text-muted,var(--ink-500)); background:transparent; border:0; cursor:pointer; font:600 12.5px var(--font-body); }

.sl-status-strip { display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.sl-status-strip button { display:inline-flex; height:28px; align-items:center; gap:6px; padding:0 11px; border-radius:999px; cursor:pointer; font:12px var(--font-body); }
.sl-status-all { color:var(--text-muted,var(--ink-500)); background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); }
.sl-status-all.active { color:#fff; background:var(--vs-black,var(--ink)); border-color:var(--vs-black,var(--ink)); }
.sl-status-pill { color:var(--text-muted,var(--ink-500)); background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); }
.sl-status-pill.active { box-shadow:inset 0 0 0 1.5px currentColor; }
.sl-status-pill > i.badge-st { display:block; width:6px; min-width:6px; height:6px; min-height:6px; padding:0; background:currentColor; border:0; border-radius:50%; }
.sl-status-strip b { font-family:var(--font-mono); font-weight:700; }
.sl-pay-chip { display:inline-flex; min-height:22px; align-items:center; padding:0 8px; border:1px solid; border-radius:999px; font-size:10.5px; font-weight:600; white-space:nowrap; }
.sl-pay-chip--paid { color:var(--tag-success-text,#067647); background:var(--tag-success-bg,#ecfdf3); border-color:var(--tag-success-border,#a6f0c6); }
.sl-pay-chip--dp { color:var(--tag-blue-text,#2f63b7); background:var(--tag-blue-bg,#eef4ff); border-color:var(--tag-blue-border,#baccf4); }
.sl-pay-chip--unpaid { color:var(--tag-orange-text,#c2470e); background:var(--tag-orange-bg,#fff4ed); border-color:var(--tag-orange-border,#fcd7b0); }

.sl-bulk { display:flex; align-items:center; gap:10px; padding:10px 14px; color:#fff; background:var(--vs-black,var(--ink)); border-radius:var(--radius-md,10px); }
.sl-bulk > b { font-size:13.5px; font-weight:600; }
.sl-bulk button { display:inline-flex; height:32px; align-items:center; gap:6px; padding:0 12px; color:#fff; background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.18); border-radius:var(--radius-sm,8px); cursor:pointer; font:600 13px var(--font-body); }
.sl-bulk button.danger { background:rgba(245,54,94,.22); }

.sl-table-card,.sg-table-card { overflow:hidden; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); box-shadow:var(--shadow-xs,var(--shadow-1)); }
.sl-table-scroll,.sg-table-scroll { overflow-x:auto; }
.sl-table,.sg-table { width:100%; border-collapse:collapse; color:var(--text-body,var(--ink-700)); font-family:var(--font-body); }
.sl-table thead tr,.sg-table thead tr { background:var(--surface-1,var(--paper-warm)); border-bottom:1px solid var(--line-200,var(--line)); }
.sl-table th,.sg-table th { padding:10px 14px; color:var(--text-subtle,var(--ink-400)); font:600 10.5px var(--font-mono); letter-spacing:.08em; text-align:left; text-transform:uppercase; white-space:nowrap; }
.sl-table th.right,.sg-table th.right,.sl-table td.right,.sg-table td.right { text-align:right; }
.sl-table th .sort-th { color:inherit; font:inherit; letter-spacing:inherit; text-transform:inherit; }
.sl-table tbody tr,.sg-table tbody tr { border-top:1px solid var(--line-100,var(--line-soft)); transition:background .12s ease; }
.sl-table tbody tr:first-child,.sg-table tbody tr:first-child { border-top:0; }
.sl-table tbody tr[data-open-sched] { cursor:pointer; }
.sl-table tbody tr[data-open-sched]:hover,.sl-table tbody tr.is-selected { background:var(--surface-1,var(--paper-warm)); }
.sl-table td,.sg-table td { padding:11px 14px; font-size:13px; vertical-align:middle; }
.sl-table td > b,.sl-table td > small { display:block; }
.sl-table td > small { margin-top:3px; color:var(--text-subtle,var(--ink-400)); font-size:11px; }
.sl-table td > small svg { width:10px; height:10px; vertical-align:-1px; }
.sl-code { color:var(--text-muted,var(--ink-500)); white-space:nowrap; }
.sl-client,.sl-room,.sg-title { display:flex; align-items:center; gap:10px; }
.sl-client > span:last-child,.sl-room > span:last-child,.sg-title > span:last-child { display:flex; min-width:0; flex-direction:column; gap:2px; }
.sl-client b,.sl-room b,.sg-title b { color:var(--text-strong,var(--ink)); font-size:13.5px; white-space:nowrap; }
.sl-client small,.sl-room small,.sg-title small { color:var(--text-subtle,var(--ink-400)); font-size:11px; white-space:nowrap; }
.sl-total { color:var(--text-strong,var(--ink)); font-size:13px; font-weight:600; white-space:nowrap; }
.sl-brand-dot { display:inline-block; width:8px; height:8px; flex:0 0 auto; background:var(--ink-400); border-radius:50%; }
/* F-24 — dot BRAND diwarnai per KUNCI brand, tidak pernah per indeks. Indeks
   berarti "brand ke-3 di registry", jadi menambah/menonaktifkan satu brand diam-diam
   menggeser warna semua brand sesudahnya. Kunci brand stabil terhadap urutan registry.
   Brand tak terselesaikan sengaja TIDAK jatuh ke warna VS — lihat D3. */
.sl-brand-dot--vs { background:var(--brand-vs-accent); }
.sl-brand-dot--luxa { background:var(--brand-luxa-accent); }
.sl-brand-dot--nussa { background:var(--brand-nussa-accent); }
.sl-brand-dot--unassigned { background:var(--ink-400); }
/* Palet BERINDEKS di bawah ini BUKAN milik brand — dipakai `schedBlockDotHTML`
   untuk membedakan resource root di blok kalender (indeks = posisi di RES.all()).
   Jangan dihapus saat merapikan dot brand: kelasnya sama, konsumennya berbeda. */
.sl-brand-dot--0 { background:var(--identity-yellow,#fff700); }
.sl-brand-dot--1 { background:var(--ink-900,#050505); }
/* Fallback SENGAJA disamakan dengan nilai tokennya (--sunset-orange #F97316).
   Sebelumnya fallback tertulis #f2541b = accent NUSSA, warna yang BERBEDA dari yang
   benar-benar dirender — membaca baris ini akan menyesatkan siapa pun yang menelusuri
   asal warna dot resource. */
.sl-brand-dot--2 { background:var(--sunset-orange,#F97316); }
.sl-brand-dot--3 { background:var(--accent-violet,#7c3aed); }
.sl-brand-dot--neutral { background:var(--ink-400,#9ca3af); }
.sl-table-group td { padding:9px 14px; background:var(--surface-1,var(--paper-warm)); border-top:1px solid var(--line-200,var(--line)); border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sl-table-group td { display:table-cell; }
.sl-table-group .sl-group-dot,.sl-group-section .sl-group-dot,.sl-board-col .sl-group-dot,.sl-gantt-secrow .sl-group-dot { display:inline-block; width:9px; height:9px; margin-right:8px; background:var(--sched-accent,var(--ink-400)); border-radius:50%; }
.sl-table-group b { color:var(--text-strong,var(--ink)); font-size:13px; }
.sl-table-group em,.sl-group-section header em,.sl-board-col header em { display:inline-flex; min-width:20px; height:18px; align-items:center; justify-content:center; margin-left:8px; padding:0 6px; color:var(--text-muted,var(--ink-500)); background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:999px; font:700 11px var(--font-mono); font-style:normal; }
.sl-table-pager { display:flex; align-items:center; justify-content:space-between; padding:11px 16px; color:var(--text-subtle,var(--ink-400)); border-top:1px solid var(--line-100,var(--line-soft)); font-size:12.5px; }
.sl-table-pager > div { display:flex; align-items:center; gap:6px; }
.sl-table-pager b { min-width:60px; color:var(--text-muted,var(--ink-500)); font-size:12.5px; text-align:center; }
.sl-empty { display:flex; min-height:180px; align-items:center; justify-content:center; flex-direction:column; gap:8px; padding:26px 16px; color:var(--text-subtle,var(--ink-400)); text-align:center; }
.sl-empty > b { color:var(--text-strong,var(--ink)); font-size:15px; }
.sl-empty > span { max-width:430px; font-size:12.5px; }

/* == SCHED-DATAGRID-REFRESH:BEGIN ==
   Daftar Jadwal "Tabel" = reproduksi anatomi GUI/11/DATA-GRID
   (12.04.02 Component Library § 11 Tables, "Data table — sort · search ·
   filter · seleksi · expand · edit"): head kicker + judul, sel satu baris,
   avatar initials (vs-avatar) + subline room · layanan, kolom DUR mono,
   TOTAL mono rata kanan, status/pay tag, subtotal halaman, pager bernomor.
   Token via bridge (design-system/USAGE.md); markup di admin.js. */
.sl-table-head { display:flex; align-items:flex-end; justify-content:space-between; gap:12px; padding:16px 16px 13px; border-bottom:1px solid var(--line-200,var(--line)); }
.sl-table-head > div { display:flex; flex-direction:column; gap:3px; }
.sl-table-kicker { color:var(--text-subtle,var(--ink-400)); font:600 10.5px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.sl-table-head > div > b { color:var(--text-strong,var(--ink)); font-size:17px; font-weight:700; letter-spacing:-.01em; }
.sl-table-meta { color:var(--text-subtle,var(--ink-400)); font-size:12.5px; white-space:nowrap; }
.sl-table th,.sl-table td { padding:9px 10px; }
.sl-table td { vertical-align:middle; }
.sl-table td > b,.sl-table td > small { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* checkbox 17px radius-5 ala library (menggantikan native look, input tetap) */
.sl-table input[type="checkbox"] { appearance:none; -webkit-appearance:none; width:17px; height:17px; margin:0; border:1.5px solid var(--ink-400,#9aa0aa); border-radius:5px; background:var(--surface-0,#fff); cursor:pointer; display:inline-block; vertical-align:middle; transition:border-color .12s ease, background .12s ease; }
.sl-table input[type="checkbox"]:hover { border-color:var(--ink-500,#777d88); }
.sl-table input[type="checkbox"]:checked { border-color:var(--ink-950,#050505); background:var(--ink-950,#050505) url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center/11px no-repeat; }
.sl-table input[type="checkbox"]:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
/* klien: Avatar size sm (32px) + nama medium + subline brand-dot room · layanan */
.sl-table .vs-avatar { width:32px; height:32px; font:600 11.5px/1 var(--font-body); letter-spacing:.02em; }
.sl-client b { font-weight:600; }
.sl-client > span:last-child { max-width:240px; }
.sl-client small { display:inline-flex; align-items:center; gap:6px; min-width:0; }
.sl-client small > span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* kolom waktu & angka — satu baris, muted, tabular */
.sl-table td[data-l="Jadwal"] { color:var(--text-muted,var(--ink-500)); font-size:12.5px; white-space:nowrap; }
.sl-table td[data-l="Dur"] { color:var(--text-muted,var(--ink-500)); font-size:12px; white-space:nowrap; }
.sl-table td[data-l="Dibuat"] { color:var(--text-subtle,var(--ink-400)); font-size:12px; white-space:nowrap; }
.sl-total { font-size:12.5px; font-weight:500; }
/* subtotal halaman (footer strip library) */
.sl-table tfoot td { padding:10px; background:var(--surface-50,var(--paper-warm)); border-top:1px solid var(--line-200,var(--line)); }
.sl-table tfoot td.sl-foot-label { color:var(--text-subtle,var(--ink-400)); font:600 10.5px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.sl-table tfoot td.sl-foot-sum { color:var(--text-strong,var(--ink)); font-size:13px; font-weight:600; text-align:right; white-space:nowrap; }
/* expandable row: chevron rotate 90° + panel detail 3 kolom (CATATAN dst.) */
.sl-table .sl-exp-col { width:34px; padding-left:2px; padding-right:2px; }
.sl-exp { width:22px; height:22px; border:none; background:transparent; cursor:pointer; display:inline-flex; align-items:center; justify-content:center; padding:0; color:var(--text-subtle,var(--ink-400)); border-radius:6px; transition:transform .16s ease, color .12s ease; }
.sl-exp:hover { color:var(--text-strong,var(--ink)); }
.sl-exp.open { transform:rotate(90deg); }
.sl-table tbody tr.sl-row-detail { border-top:0; }
.sl-table tbody tr.sl-row-detail > td { padding:14px 16px 14px 74px; background:var(--surface-50,var(--paper-warm)); border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sl-detail-grid { display:grid; grid-template-columns:1.5fr 1fr 1fr; gap:18px; }
.sl-detail-grid > div { display:flex; flex-direction:column; gap:4px; min-width:0; }
.sl-detail-kicker { color:var(--text-subtle,var(--ink-400)); font:600 10px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.sl-detail-grid p { margin:0; color:var(--text-body,var(--ink-700)); font-size:13px; line-height:1.5; overflow-wrap:break-word; }
/* pager bernomor ala library */
.sl-table-pager .sl-page-btn { min-width:34px; height:34px; padding:0 8px; border:1px solid var(--line-200,var(--line)); border-radius:8px; background:var(--surface-0,#fff); color:var(--text-muted,var(--ink-500)); font:500 12.5px var(--font-mono); cursor:pointer; transition:all .12s ease; }
.sl-table-pager .sl-page-btn:hover { background:var(--surface-50,var(--paper-warm)); }
.sl-table-pager .sl-page-btn.active { border-color:var(--ink-950,#050505); background:var(--ink-950,#050505); color:var(--primary-white,#fff); }
.sl-table-pager .sl-page-gap { min-width:20px; text-align:center; color:var(--text-subtle,var(--ink-400)); }
/* Pemilih jumlah baris per halaman (25/50/100) — bentuk select inline modul Schedule. */
.sl-page-size { display:inline-flex; align-items:center; gap:8px; margin-right:auto; margin-left:16px; color:var(--text-subtle,var(--ink-400)); }
.sl-page-size > span { font:600 9px/1 var(--font-mono); letter-spacing:.1em; text-transform:uppercase; }
.sl-page-size select { height:32px; padding:0 26px 0 10px; color:var(--text-strong,var(--ink)); background:var(--surface-0,var(--paper));
  border:1px solid var(--border-input,var(--line)); border-radius:var(--radius-xs,6px); font:500 12.5px var(--font-body); cursor:pointer; }
.sl-table-pager .cal-navico { width:34px; height:34px; border:1px solid var(--line-200,var(--line)); border-radius:8px; background:var(--surface-0,#fff); }
/* == SCHED-DATAGRID-REFRESH:END == */

/* == SCHED-DRAWER-V2:BEGIN ==
   Drawer detail booking Schedule = reproduksi "Booking Drawer v2"
   (claude.ai/design f0756478, Booking Drawer v2.dc.html): brandbar soft,
   judul = layanan + tag status, baris klien + chip, banner status pst-*,
   tab Ringkasan/Pembayaran/Aktivitas, kartu Jadwal (tile+QR+KV+strip aksi),
   ringkasan bayar (bar), kartu klien, stepper produksi, timeline, footer. */
.bk-detail.sched-detail { width:min(440px,100vw); max-width:min(440px,100vw); }
/* Drawer Bookings memakai shell sched-detail tapi kontennya dua kolom (ringkasan +
   kartu samping), jadi lebarnya dinaikkan; sisanya token/anatomi identik. */
.bk-detail.sched-detail.bk-detail--wide { width:min(680px,100vw); max-width:min(680px,100vw); }
/* Komposisi header drawer Bookings: padding penuh (atas–bawah–samping) mengikuti
   ritme badan drawer (22px), jarak antar-baris naik supaya kicker/judul/factstrip
   punya napas, dan factstrip tidak lagi menempel ke garis bawah header. */
.bk-detail--wide .sd2-headtop { padding:20px 22px 0; gap:16px; }
.bk-detail--wide .sd2-headmain { gap:10px; }
.bk-detail--wide .sd2-titlerow { gap:8px; row-gap:6px; }
.bk-detail--wide .sd2-factstrip { margin:4px 0 4px; }
.bk-detail--wide .sd2-head .schedule-detail-tabs { margin-top:12px; padding:0 22px; }
/* Factstrip 4 kolom: pemisah dibuat dari GAP 1px berlatar hairline, bukan border-left
   per sel — dengan border-left, sel yang turun baris kehilangan garis atas dan tampak
   menempel/tumpang tindih dengan baris di atasnya. */
.bk-detail--wide .sd2-factstrip { grid-template-columns:repeat(auto-fit,minmax(112px,1fr)); gap:1px; background:var(--line-100,var(--line-soft)); }
.bk-detail--wide .sd2-fact { padding:9px 13px; background:var(--surface-0,var(--paper)); }
.bk-detail--wide .sd2-fact + .sd2-fact { border-left:0; }
.bk-detail--wide .sd2-fact > div { min-width:0; }
.bk-detail--wide .sd2-fact .cval { font-size:12px; }
.bk-detail--wide .sd2-close { margin-top:2px; }
.bk-detail--wide .sched-detail-body { padding:18px 22px 22px!important; }
/* Footer satu baris: aksi kanan tidak boleh terdorong turun oleh alasan tombol
   utama — alasan itu yang menyusut & meng-ellipsis (teks penuh tetap di tooltip). */
.bk-detail--wide .bk-detail-foot { flex-wrap:nowrap; gap:8px; padding:12px 22px; }
.bk-detail--wide .bk-detail-foot .bk-primary { min-width:0; margin-right:auto; }
.bk-detail--wide .bk-primary--blocked { min-width:0; flex:1 1 auto; }
.bk-detail--wide .bk-primary--blocked .abtn { flex:0 0 auto; }
.bk-detail--wide .bk-primary-reason { min-width:0; max-width:none; flex:1 1 auto; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bk-detail--wide .bk-detail-foot > .abtn, .bk-detail--wide .bk-detail-foot .bk-more { flex:0 0 auto; }
@media (max-width:768px) {
  .bk-detail--wide .bk-detail-foot { flex-wrap:wrap; }
  .bk-detail--wide .bk-primary-reason { white-space:normal; }
}
/* Badan drawer: bar "perlu perhatian" selebar penuh, lalu dua kolom —
   kiri  = Ringkasan booking · Jadwal & resource · Pilihan & jawaban form
   kanan = Klien · Payment · Ubah status
   sisanya (Payment section, Progress, Reschedule, dst.) satu blok penuh di bawah. */
.sched-detail-body .bk-detail-grid.bkd-cols { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; align-items:start; }
.bkd-cols > .bk-attnbar, .bkd-cols > .bkd-full { grid-column:1 / -1; }
.bkd-cols > .bkd-col { display:flex; min-width:0; flex-direction:column; gap:12px; }
.sched-detail-body .bkd-full { display:flex; flex-direction:column; gap:12px; }
.sched-detail-body .bk-detail-side { position:static; }
/* Bar perhatian: satu baris — kicker kiri, semua tag berjejer di kanan. */
.bk-attnbar { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:12px; padding:var(--space-3) var(--space-4);
  border:1px solid var(--tag-warning-border); border-radius:var(--radius-md,14px); background:var(--tag-warning-bg); }
.bk-attnbar--danger { border-color:var(--tag-danger-border); background:var(--tag-danger-bg); }
.bk-attnbar-lbl { display:inline-flex; align-items:center; gap:var(--space-3); color:var(--text-muted,var(--ink-600));
  font-family:var(--font-mono); font-size:10px; font-weight:650; letter-spacing:.1em; text-transform:uppercase; white-space:nowrap; }
.bk-attnbar-tags { display:flex; min-width:0; align-items:center; justify-content:flex-end; gap:var(--space-3); flex-wrap:wrap; }
/* Baris tombol di dalam drawer mengisi penuh lebar barisnya: kolom sama besar
   (grid auto-flow column) supaya proporsinya rata, bukan menggantung di kiri. */
.sched-detail-body .row-btns { display:grid; grid-auto-flow:column; grid-auto-columns:minmax(0,1fr); gap:8px; margin-top:12px; }
.sched-detail-body .row-btns > .abtn, .sched-detail-body .row-btns > a.abtn { width:100%; min-height:42px; justify-content:center; }
/* Section kartu mengikuti .sd2-card: radius md, hairline line-200, kepala mono kicker. */
.sched-detail-body .bk-sec { margin:0; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,14px); box-shadow:var(--shadow-card); }
.sched-detail-body .bk-sec-h { padding:var(--space-4) 16px; }
.sched-detail-body .bk-sec-h h3 { font-family:var(--font-mono); font-size:10px; font-weight:650; letter-spacing:.1em; text-transform:uppercase; }
.sched-detail-body .bk-sec-b { padding:0 16px var(--space-4); }
/* padding-top:0 di atas mengasumsikan anak pertama punya padding sendiri (mis.
   baris .kv). .pill-list padding-nya 0, jadi chip-nya menempel persis di garis
   bawah header. Perbaiki HANYA kasus itu — pakai padding (bukan margin) supaya
   tidak collapse keluar container yang padding-top-nya 0. */
.sched-detail-body .bk-sec-b > .pill-list:first-child { padding-top:12px; }
/* Di kolom selebar ~312px, kv dua-kolom bikin nilai pecah 2–3 baris dan label
   berdempetan. Di dalam drawer, kv ditumpuk: label jadi kicker kecil di atas,
   nilai penuh selebar kartu (email/URL panjang boleh putus di mana saja). */
.sched-detail-body .bk-detail .kv,
.sched-detail-body .kv { display:grid; grid-template-columns:minmax(0,1fr); align-items:start; gap:2px; padding:9px 0; }
.sched-detail-body .kv .k { width:auto; font-family:var(--font-mono); font-size:9.5px; font-weight:650; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle,var(--ink-400)); }
.sched-detail-body .kv .v { min-width:0; font-size:13.5px; font-weight:600; line-height:1.45; overflow-wrap:anywhere; }
@media (max-width:768px) {
  .bk-detail.sched-detail.bk-detail--wide { width:100vw; max-width:100vw; }
  .sched-detail-body .bk-detail-side { grid-template-columns:1fr; }
  .sched-detail-body .bk-detail-grid.bkd-cols { grid-template-columns:1fr; }
  .sched-detail-body .row-btns { grid-auto-flow:row; grid-auto-columns:auto; }
  .bk-attnbar { grid-template-columns:1fr; gap:8px; }
  .bk-attnbar-tags { justify-content:flex-start; }
}
/* Header: seluruh blok memakai skin brand (bukan hanya strip atas), disusun grid
   dengan ruang napas lebih lega; tab menempel di dasar header sebagai batas. */
.sched-detail-head.sd2-head { padding:0; gap:0; border-bottom:1px solid var(--sched-brand-border,var(--line-200));
  background:linear-gradient(160deg,var(--sched-brand-soft,var(--identity-yellow-soft)),var(--surface-0,#fff) 78%); }
/* Fakta klien sebagai strip berlabel (anatomi .contact-strip di drawer customer) —
   tiap field punya kicker sendiri, jadi tidak lagi deretan chip tanpa keterangan. */
.sd2-factstrip { display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); background:var(--surface-0); border:1px solid var(--line-200); border-radius:10px; overflow:hidden; }
.sd2-fact { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:9px; padding:8px 12px; min-width:0; }
.sd2-fact + .sd2-fact { border-left:1px solid var(--line-100); }
.sd2-fact > svg { color:var(--text-subtle); }
.sd2-fact > div { min-width:0; display:grid; }
.sd2-fact .clab { font-family:var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.sd2-fact .cval { font-size:12.5px; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* Anatomi mengikuti .cust2-ov .drawer-head: [tile brand] [kicker+judul+meta] [close],
   lalu banner & tab selebar header. */
.sd2-headtop { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:start; gap:14px; padding:18px 24px 0; }
.sd2-headmain { min-width:0; display:grid; gap:7px; }
.sd2-kickrow { display:flex; align-items:center; gap:9px; min-width:0; }
.sd2-kickrow > b { color:var(--sched-brand-text,var(--text-strong)); font:800 11px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; }
.sd2-kickrow > code { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; letter-spacing:.08em; }
.sd2-headtop > .cal-brand-icon { --brand-icon-size:44px; font-size:17px; }
.sd2-head .sd2-banner { margin:14px 24px 0; }
.sd2-head .schedule-detail-tabs { margin-top:14px; padding:0 24px; background:transparent; }
.sd2-brandbar { display:grid; grid-template-columns:auto minmax(0,1fr) auto auto; align-items:center; gap:10px; padding:14px 24px 0; background:transparent; border-bottom:0; }
.sd2-brandbar > .grow { display:none; }
.sd2-brandbar > code { justify-self:end; }
.sd2-brandbar > b { color:var(--sched-brand-text,var(--text-strong)); font-size:12px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; }
.sd2-brandbar > code { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; letter-spacing:.08em; }
.sd2-close { display:inline-flex; align-items:center; justify-content:center; width:44px; height:44px; border:1px solid var(--line-100,var(--line-soft)); border-radius:var(--radius-pill,100px); background:var(--surface-0,var(--paper)); color:var(--text-muted,var(--ink-500)); cursor:pointer; transition:background .14s ease,border-color .14s ease; }
.sd2-close:hover { background:var(--surface-50,var(--paper-warm)); border-color:var(--line-200,var(--line)); }
.sd2-title-wrap { display:grid; gap:14px; padding:14px 24px 0; }
.sd2-titlerow { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.sd2-titlerow h2 { margin:0; color:var(--text-strong,var(--ink)); font-size:22px; font-weight:700; letter-spacing:-.02em; line-height:1.1; }
.sd2-client-meta { display:flex; align-items:center; gap:8px; flex-wrap:wrap; color:var(--text-subtle,var(--ink-400)); font-size:12.5px; }
.sd2-client-name { display:inline-flex; align-items:center; gap:6px; color:var(--text-strong,var(--ink)); font-size:13px; font-weight:600; }
.sd2-client-name svg { color:var(--text-muted,var(--ink-500)); }
.sd2-vdiv { width:1px; height:14px; background:var(--line-200,var(--line)); }
.sd2-chip { display:inline-flex; align-items:center; min-height:22px; padding:0 8px; border:1px solid; border-radius:var(--radius-pill,100px); font-size:11px; font-weight:600; white-space:nowrap; }
.sd2-chip--neutral { color:var(--pst-neutral-text); background:var(--pst-neutral-bg); border-color:var(--pst-neutral-border); }
.sd2-chip--blue { color:var(--pst-blue-text); background:var(--pst-blue-bg); border-color:var(--pst-blue-border); }
.sd2-chip--success { color:var(--pst-success-text); background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.sd2-banner { display:flex; gap:11px; padding:12px 14px; border:1px solid; border-radius:var(--radius-sm,10px); }
.sd2-banner > div { display:flex; flex-direction:column; gap:3px; }
.sd2-banner b { font-size:13px; font-weight:700; }
.sd2-banner span { font-size:12.5px; line-height:1.5; }
.sd2-banner svg { flex:none; margin-top:1px; }
.sd2-banner--danger { color:var(--pst-danger-text); background:var(--pst-danger-bg); border-color:var(--pst-danger-border); }
.sd2-banner--orange { color:var(--pst-orange-text,var(--pst-warning-text)); background:var(--pst-orange-bg,var(--pst-warning-bg)); border-color:var(--pst-orange-border,var(--pst-warning-border)); }
.sd2-banner--success { color:var(--pst-success-text); background:var(--pst-success-bg); border-color:var(--pst-success-border); }
.sd2-banner--mint { color:var(--pst-mint-text,var(--pst-success-text)); background:var(--pst-mint-bg,var(--pst-success-bg)); border-color:var(--pst-mint-border,var(--pst-success-border)); }
.sd2-card { display:flex; flex-direction:column; gap:12px; padding:16px; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,14px); box-shadow:var(--shadow-card); }
.sd2-card--flush { gap:0; padding:0; overflow:hidden; }
.sd2-jadwal-main { display:grid; grid-template-columns:52px minmax(0,1fr) auto; gap:var(--space-4); align-items:center; padding:var(--space-4) 16px; }
.sd2-date-tile { display:flex; width:52px; flex:none; flex-direction:column; align-items:center; padding:var(--space-3) 0; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px); }
.sd2-date-tile span { color:var(--text-subtle,var(--ink-400)); font:600 9.5px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.sd2-date-tile b { color:var(--text-strong,var(--ink)); font-size:20px; font-weight:700; line-height:1.1; }
.sd2-date-tile small { color:var(--text-subtle,var(--ink-400)); font-size:11px; }
.sd2-jadwal-facts { display:flex; min-width:0; flex:1; flex-direction:column; gap:var(--space-2); }
.sd2-date-long { color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:700; }
.sd2-time-row { display:flex; align-items:baseline; gap:8px; }
.sd2-time-row strong { color:var(--text-strong,var(--ink)); font-size:19px; font-weight:700; letter-spacing:-.01em; font-variant-numeric:tabular-nums; }
.sd2-dur-pill { padding:2px var(--space-3); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-pill,100px); color:var(--text-muted,var(--ink-500)); font-size:11px; }
.sd2-qr { display:flex; flex:none; flex-direction:column; align-items:center; gap:var(--space-2); }
.sd2-qr-img { display:block; width:52px; height:52px; overflow:hidden; background:#fff; border:1px solid var(--line-200,var(--line)); border-radius:8px; }
.sd2-qr-img svg { display:block; width:100%; height:100%; }
.sd2-qr-label { color:var(--text-subtle,var(--ink-400)); font:600 9px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
/* Kolom label DULU dipatok 74px mati. Label panjang ("TERBAYAR (TERVERIFIKASI)",
   "MENUNGGU VERIFIKASI") adalah satu token panjang di mono-uppercase ber-letter-spacing,
   jadi ia tidak muat, tidak bisa patah, lalu TUMPAH menimpa kolom nilai.
   Sekarang: track diberi batas atas (tidak bisa meledak), kata panjang boleh patah,
   dan baris di-align ke atas supaya label dua baris tetap sejajar rapi dgn nilainya. */
.sd2-kv { display:grid; grid-template-columns:minmax(0,124px) minmax(0,1fr); gap:12px; align-items:start; padding:var(--space-4) 16px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sd2-kv > span { min-width:0; overflow-wrap:anywhere; line-height:1.4; padding-top:1px; color:var(--text-subtle,var(--ink-400)); font:600 10px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.sd2-kv > b { min-width:0; overflow:hidden; color:var(--text-strong,var(--ink)); font-size:13px; font-weight:600; text-overflow:ellipsis; white-space:nowrap; }
.sd2-kv > b.mono,.sd2-kv > a.sd2-link { font-size:12px; }
.sd2-link { min-width:0; overflow:hidden; color:var(--text-strong,var(--ink)); text-overflow:ellipsis; white-space:nowrap; }
.sd2-action-strip { display:flex; gap:8px; padding:var(--space-4) 16px; background:var(--surface-50,var(--paper-warm)); border-top:1px solid var(--line-100,var(--line-soft)); }
/* Drawer lebar: kartu di pane Ringkasan dibuat lebih lapang — tile tanggal & QR naik
   52→60px, padding baris KV 9→13px, label KV 74→92px, strip aksi 10→13px. */
@media (min-width:1000px){
  .sched-detail .sd2-jadwal-main { grid-template-columns:60px minmax(0,1fr) auto; gap:var(--space-5); padding:var(--space-5) 20px; }
  .sched-detail .sd2-date-tile { width:60px; padding:var(--space-3) 0; }
  .sched-detail .sd2-date-tile b { font-size:23px; }
  .sched-detail .sd2-jadwal-facts { gap:var(--space-2); }
  .sched-detail .sd2-time-row strong { font-size:21px; }
  .sched-detail .sd2-qr-img { width:60px; height:60px; }
  .sched-detail .sd2-kv { grid-template-columns:92px minmax(0,1fr); padding:var(--space-4) 20px; }
  .sched-detail .sd2-kv > b { font-size:13.5px; }
  .sched-detail .sd2-action-strip { padding:var(--space-4) 20px; gap:var(--space-4); }
  .sched-detail .sd2-card { padding:var(--space-5) var(--pane-gutter,var(--space-6)); gap:var(--rhythm-block,var(--space-4)); }
  .sched-detail .sd2-card--flush { padding:0; gap:0; }
}
.sd2-tile-btn { display:flex; flex:1; flex-direction:column; align-items:center; gap:var(--space-2); padding:var(--space-3) 4px; background:var(--surface-0,#fff); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px); color:var(--text-muted,var(--ink-500)); font-size:11px; font-weight:600; cursor:pointer; transition:border-color .14s ease, background .14s ease; }
.sd2-tile-btn svg { color:var(--text-strong,var(--ink)); }
.sd2-tile-btn:hover:not(:disabled) { border-color:var(--ink-950,#050505); }
.sd2-tile-btn:disabled { cursor:not-allowed; opacity:.5; }
.sd2-pay-top { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:10px; align-items:center; }
.sd2-pay-top > div { display:flex; flex-direction:column; gap:2px; }
.sd2-pay-top span { color:var(--text-subtle,var(--ink-400)); font-size:12px; }
.sd2-pay-top b { color:var(--text-strong,var(--ink)); font-size:21px; font-weight:700; }
.sd2-bar { height:6px; overflow:hidden; background:var(--line-100,var(--line-soft)); border-radius:var(--radius-pill,100px); }
.sd2-bar > span { display:block; height:100%; background:var(--ink-900,#111214); border-radius:var(--radius-pill,100px); transition:width .18s ease; }
.sd2-bar > span.done { background:var(--mint-green,#3ecf8e); }
.sd2-pay-note { color:var(--text-muted,var(--ink-500)); font-size:12.5px; }
.sd2-btn-row { display:flex; gap:8px; }
.sd2-btn-row--wrap { flex-wrap:wrap; }
.sd2-client-row { display:grid; grid-template-columns:40px minmax(0,1fr) auto auto; gap:12px; align-items:center; }
.sd2-avatar { width:40px; height:40px; font:600 13px/1 var(--font-body); }
.sd2-client-id { display:flex; min-width:0; flex:1; flex-direction:column; gap:2px; }
.sd2-client-id p { display:flex; align-items:center; gap:8px; margin:0; }
.sd2-client-id b { color:var(--text-strong,var(--ink)); font-size:14px; font-weight:700; }
.sd2-client-id small { color:var(--text-muted,var(--ink-500)); font-size:12px; }
.sd2-client-foot { color:var(--text-subtle,var(--ink-400)); font-size:12.5px; border-top:1px solid var(--line-100,var(--line-soft)); padding-top:9px; }
/* stepper produksi vertikal: rail dot + garis, label + status (poin #4 owner) */
.sd2-vsteps { display:flex; flex-direction:column; }
.sd2-vstep { display:flex; gap:12px; }
.sd2-vstep-rail { display:flex; flex:none; width:18px; flex-direction:column; align-items:center; }
.sd2-vstep-rail i { display:inline-flex; flex:none; width:18px; height:18px; align-items:center; justify-content:center; border-radius:var(--radius-pill,100px); }
.sd2-vstep-rail > span { flex:1; width:1px; min-height:14px; margin:3px 0; background:var(--line-200,var(--line)); }
.sd2-vstep--done .sd2-vstep-rail i { background:var(--ink-950,#050505); color:#fff; }
.sd2-vstep--current .sd2-vstep-rail i { background:var(--identity-yellow,#fff700); border:1px solid var(--ink-950,#050505); }
.sd2-vstep--todo .sd2-vstep-rail i { background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); }
.sd2-vstep-body { display:flex; flex:1; align-items:baseline; gap:8px; min-width:0; padding-bottom:12px; }
.sd2-vstep:last-child .sd2-vstep-body { padding-bottom:0; }
.sd2-vstep-body b { flex:1; color:var(--text-strong,var(--ink)); font-size:12.5px; font-weight:600; }
.sd2-vstep--todo .sd2-vstep-body b { color:var(--text-subtle,var(--ink-400)); font-weight:500; }
.sd2-vstep-body small { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; letter-spacing:.04em; white-space:nowrap; }
.sd2-vstep--current .sd2-vstep-body small { color:var(--text-strong,var(--ink)); font-weight:600; }
.sd2-prod-note { color:var(--text-muted,var(--ink-500)); font-size:12.5px; line-height:1.5; }
.sd2-deliv { display:flex; flex-direction:column; gap:8px; border-top:1px solid var(--line-100,var(--line-soft)); padding-top:10px; }
.sd2-deliv--flat { border-top:0; padding-top:0; }
/* aksi booking (Edit detail / pelanggan / POS) — grid rapi (poin #2 owner) */
.sd2-actionbar { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.sd2-actionbar .abtn { width:100%; justify-content:center; margin:0; }
.sd2-actionbar > :nth-child(3) { grid-column:1 / -1; }
/* Booking Hub dipakai oleh entry point Schedule dan Bookings. Komposisi tambahan
   tetap mengikuti kartu/tokens drawer Schedule agar kedua route tidak membuat
   bahasa visual atau spacing baru. */
.booking-hub-stack { display:flex; flex-direction:column; gap:var(--space-5); margin-top:var(--space-5); }
.booking-hub-drawer .bk-attnbar { margin-bottom:0; }   /* idem: ritme milik aturan alur */
.booking-hub-drawer .bk-side-card--status { margin-top:var(--space-5); padding:var(--space-5); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,14px); box-shadow:var(--shadow-card); }
.booking-hub-drawer .bk-side-card--status .status-select { width:100%; min-height:44px; }
.booking-hub-drawer [data-bk-pane="operations"] > .bk-sec,
.booking-hub-drawer [data-bk-pane="activity"] > .bk-sec { margin-top:var(--space-5); }
.sd2-advanced-link { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:var(--space-5); margin-top:var(--space-5); padding:var(--space-5); background:var(--surface-50,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,14px); }
.sd2-advanced-link > span { display:flex; min-width:0; flex-direction:column; gap:4px; }
.sd2-advanced-link b { color:var(--text-strong,var(--ink)); font-size:13px; }
.sd2-advanced-link small { color:var(--text-muted,var(--ink-500)); font-size:12px; line-height:1.45; }
.sd2-advanced-link .abtn { min-height:44px; justify-content:center; }
/* sesi terkait: order induk + slot split resource (poin #5 owner).
   Aturan owner: baris komposit ikon+teks+aksi SELALU grid kolom eksplisit
   (auto | minmax(0,1fr) | auto) — bukan flex yang bisa saling desak. */
.sd2-rel-note { display:grid; grid-template-columns:16px minmax(0,1fr); gap:9px; align-items:start; padding:11px 16px; background:var(--surface-50,var(--paper-warm)); border-bottom:1px solid var(--line-100,var(--line-soft)); color:var(--text-muted,var(--ink-500)); font-size:12px; line-height:1.5; }
.sd2-rel-note svg { margin-top:2px; }
.sd2-rel-note b { color:var(--text-strong,var(--ink)); font-weight:600; }
.sd2-rel-row { display:grid; grid-template-columns:18px minmax(0,1fr) auto; gap:12px; align-items:center; padding:12px 16px; }
.sd2-rel-row + .sd2-rel-row { border-top:1px solid var(--line-100,var(--line-soft)); }
.sd2-rel-row > i { display:inline-flex; align-self:start; margin-top:2px; color:var(--text-subtle,var(--ink-400)); }
.sd2-rel-row > div { display:flex; min-width:0; flex-direction:column; gap:2px; }
.sd2-rel-row b { color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:600; }
.sd2-rel-row small { color:var(--text-subtle,var(--ink-400)); font-size:12px; line-height:1.45; }
.sd2-rel-row .abtn,.sd2-rel-row .sd2-chip { align-self:center; white-space:nowrap; margin:0; }
/* SoT 2026-07-30 Fase 1.2 — baris Appointment saudara dalam satu Order dapat dibuka.
   Tetap 3 kolom (aturan baris komposit: auto | minmax(0,1fr) | auto). */
.sd2-rel-row.is-clickable { cursor:pointer; }
.sd2-rel-row.is-clickable:hover { background:var(--surface-1); }
.sd2-rel-row.is-clickable:focus-visible { outline:2px solid var(--focus-ring); outline-offset:-2px; }
/* Spec 12.56.B §2.2 — angka uang WAJIB tabular. Digit proporsional membuat kolom
   nominal bergoyang antar-baris; itu penyebab langsung kesan "belum rapi" pada
   tabel uang, terpisah dari soal spacing. */
.sched-drawer-pane .mono,
.sched-drawer-pane .sd2-pay-cols b,
.sd2-charge-total b, .sd2-charge-total strong { font-variant-numeric:tabular-nums; }
/* Rata kanan HANYA untuk baris dua-kolom (label | nilai). Di .sd2-pay-cols label
   dan nilai bertumpuk rata kiri, jadi rata-kanan justru memutus pasangannya. */
.sd2-charge-total b, .sd2-charge-total strong { text-align:right; }

/* Spec 12.56.B §D5 — dulu flex dengan padding-left hanya pada `+ div`, jadi kolom
   pertama tanpa padding dan `flex:1` membagi sisa ruang timpang (169/184/184/184px).
   Grid 4×1fr menjamin lebar identik apa pun isinya; pemisah murni border. */
.sd2-pay-cols { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); }
/* `display:grid` di atas mengalahkan gaya UA `[hidden]{display:none}` (spesifisitas
   kelas > tipe), sehingga blok ini tetap terlihat walau di-set hidden. Aturan
   eksplisit ini yang membuat penyembunyian benar-benar bekerja. */
.sd2-pay-cols[hidden] { display:none; }
.sd2-pay-cols > div { display:flex; min-width:0; flex-direction:column; gap:var(--space-1); padding-inline:var(--space-4); }
.sd2-pay-cols > div:first-child { padding-inline-start:0; }
.sd2-pay-cols > div + div { border-left:1px solid var(--line-100,var(--line-soft)); }
.sd2-pay-cols span { color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.sd2-pay-cols b { color:var(--text-strong,var(--ink)); font-size:15px; font-weight:700; }
.sd2-pay-cols b.paid { color:var(--pst-success-text,#067647); }
.sd2-pay-pct { display:flex; align-items:center; gap:8px; }
.sd2-pay-pct > span:first-child { flex:1; color:var(--text-muted,var(--ink-500)); font-size:12.5px; }
/* rincian tagihan minimalis ala master v2: teks · nominal, tanpa ikon */
.sd2-charge-row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:12px; align-items:center; padding:12px 16px; }
.sd2-charge-row + .sd2-charge-row { border-top:1px solid var(--line-100,var(--line-soft)); }
.sd2-charge-row > div { display:flex; min-width:0; flex-direction:column; gap:2px; }
.sd2-charge-row > div > span { color:var(--text-body,var(--ink-700)); font-size:13.5px; }
.sd2-charge-row small { color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.sd2-charge-row > strong { color:var(--text-strong,var(--ink)); font-size:13px; font-weight:500; white-space:nowrap; }
/* Spec 12.56.B §D6 — dulu flex penuh 763px: label rata kiri, nilai rata kanan,
   ±650px kosong di antaranya. Pasangan label–nilai dibatasi 38ch dan didorong ke
   kanan, mengikuti pola .inv2-totals yang memang sudah benar. */
.sd2-charge-total { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:var(--space-4); max-width:38ch; margin-left:auto; padding:var(--space-4) var(--pane-gutter,var(--space-6)); background:var(--surface-50,var(--paper-warm)); border-top:1px solid var(--line-100,var(--line-soft)); }
.sd2-charge-total span { flex:1; color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:700; }
.sd2-charge-total b { color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:700; }
.sd2-pm-row { display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:12px; align-items:center; padding:12px 16px; }
.sd2-pm-row + .sd2-pm-row { border-top:1px solid var(--line-100,var(--line-soft)); }
.sd2-pm-row > div { display:flex; min-width:0; flex-direction:column; gap:2px; }
.sd2-pm-row b { color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:600; }
.sd2-pm-row small { color:var(--text-subtle,var(--ink-400)); font-size:12px; }
.sd2-pm-row strong { color:var(--text-strong,var(--ink)); font-size:13px; font-weight:700; white-space:nowrap; }
.sd2-empty-dash { display:flex; align-items:center; gap:10px; padding:16px; border:1px dashed var(--line-200,var(--line)); border-radius:var(--radius-md,14px); color:var(--text-subtle,var(--ink-400)); font-size:13px; }
.sd2-doc-row { display:grid; width:100%; grid-template-columns:16px minmax(0,1fr) 15px; gap:var(--space-4); align-items:center; padding:var(--space-4) var(--pane-gutter,var(--space-6)); background:transparent; border:none; color:var(--text-subtle,var(--ink-400)); cursor:pointer; text-align:left; transition:background .12s ease; }
.sd2-doc-row + .sd2-doc-row { border-top:1px solid var(--line-100,var(--line-soft)); }
.sd2-doc-row > div { display:flex; min-width:0; flex-direction:column; gap:1px; }
.sd2-doc-row b { color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:600; }
.sd2-doc-row small { color:var(--text-subtle,var(--ink-400)); font-size:12px; }
.sd2-doc-row:hover:not(:disabled) { background:var(--surface-50,var(--paper-warm)); }
.sd2-doc-row:disabled { cursor:not-allowed; opacity:.42; }
.sd2-textlink { align-self:flex-start; padding:0; background:none; border:none; color:var(--text-muted,var(--ink-500)); font-size:12.5px; font-weight:600; cursor:pointer; }
.sd2-textlink:hover { color:var(--text-strong,var(--ink)); }
.sd2-timeline { display:flex; flex-direction:column; }
.sd2-ev { display:flex; gap:12px; }
.sd2-ev-rail { display:flex; flex:none; width:18px; flex-direction:column; align-items:center; }
.sd2-ev-dot { width:9px; height:9px; margin-top:5px; background:var(--ink-950,#050505); border-radius:var(--radius-pill,100px); }
.sd2-ev-line { flex:1; width:1px; min-height:24px; margin:4px 0; background:var(--line-200,var(--line)); }
.sd2-ev-body { display:flex; flex:1; flex-direction:column; gap:4px; padding-bottom:20px; }
.sd2-ev-head { display:flex; align-items:baseline; gap:8px; }
.sd2-ev-head b { flex:1; color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:700; }
.sd2-ev-head time { color:var(--text-subtle,var(--ink-400)); font-size:11px; white-space:nowrap; }
.sd2-ev-meta { display:flex; align-items:center; gap:7px; }
.sd2-ev-meta span { color:var(--text-muted,var(--ink-500)); font-size:12.5px; }
.sd2-ev-meta small { padding:2px 6px; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-pill,100px); color:var(--text-subtle,var(--ink-400)); font-size:9.5px; letter-spacing:.1em; }

/* ── Brief Schedule-First 2026-08-05 — Jadwal Tertaut · Transaksi · Dokumen ──
   Tiga surface ini TIDAK punya unit persis di library 12.04.02/03. Owner menyetujui
   (5 Agu 2026) komposisi dari unit yang ada, bukan desain baru:
     · baris kartu  = GUI/15/CARD compact  · badge = pola GUI/18/STATUS (titik+ikon+teks)
     · aksi baris   = GUI/13/ATTACHMENTS   · chip skema = GUI/17/DISCOUNT-SELECTOR
     · readout DP   = GUI/18/DEPOSIT       · grup transaksi = GUI/04/CARD-DEFAULT
   Nilai warna/spacing/radius SELURUHNYA dari token; tidak ada literal baru. */

/* Badge tautan — sengaja membawa titik + ikon + TEKS, jadi statusnya terbaca tanpa
   mengandalkan warna sama sekali (brief §Phase 2.8 & §Phase 2.3). */
.sd2-linkbadge { display:inline-flex; align-items:center; gap:5px; padding:2px 8px; border:1px solid var(--pst-neutral-border); border-radius:var(--radius-pill,100px); background:var(--pst-neutral-bg); color:var(--pst-neutral-text); font-size:9.5px; font-weight:700; letter-spacing:.08em; white-space:nowrap; }
.sd2-linkbadge svg { width:12px; height:12px; }
.sd2-linkbadge-dot { width:6px; height:6px; border-radius:var(--radius-pill,100px); background:currentColor; }
.sd2-linkbadge.is-primary { border-color:var(--pst-identity-border); background:var(--pst-identity-bg); color:var(--pst-identity-text); }
.sd2-linkbadge.is-linked  { border-color:var(--pst-blue-border);     background:var(--pst-blue-bg);     color:var(--pst-blue-text); }
.sd2-linkbadge.is-split   { border-color:var(--pst-orange-border);   background:var(--pst-orange-bg);   color:var(--pst-orange-text); }
/* Varian mini — dipakai kalender (sel bulan, kartu minggu), tabel & kartu daftar
   supaya Parent/Child/Split terbaca TANPA bergantung warna (brief §Phase 2.C).
   Yang dipadatkan hanya JARAK (gap/padding/titik/ikon), semuanya dari token;
   ukuran huruf sengaja MEWARISI badge dasar — skala tipografi DS berhenti di
   --text-2xs (11px), jadi angka px sendiri di bawah itu = nilai karangan. */
.sd2-linkbadge--mini { gap:var(--space-1); padding:var(--space-1) var(--space-2); }
.sd2-linkbadge--mini svg { width:var(--text-2xs); height:var(--text-2xs); }
.sd2-linkbadge--mini .sd2-linkbadge-dot { width:var(--space-2); height:var(--space-2); }
/* Indikator bentrok pada kartu Jadwal Tertaut — dirender HANYA bila server
   menandainya (`conflict`), tidak pernah ditebak client. */
.sd2-rel-conflict { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); align-items:center; margin-top:var(--space-1); padding:var(--space-2) var(--space-3); border:1px solid var(--pst-danger-border); border-radius:var(--radius-xs); background:var(--pst-danger-bg); color:var(--pst-danger-text); font-size:var(--text-2xs); font-weight:var(--fw-semibold); }
.sd2-rel-conflict svg { width:var(--text-xs); height:var(--text-xs); }
.sd2-rel-row2.has-conflict { background:var(--pst-danger-bg); }
/* Tombol penulis uang legacy — tersembunyi sampai admin menekan "Ubah" (ADR D-16).
   `display:contents` mengalahkan UA `[hidden]{display:none}`, jadi atributnya
   ditegaskan ulang — tanpa ini tombol tulis legacy tetap terlihat sejak awal. */
.sd2-legacy-writers { display:contents; }
.sd2-legacy-writers[hidden] { display:none !important; }
/* Daftar issues[] dari order_validation_failed — inline di sheet, bukan toast. */
.als-issues { margin:var(--space-3) 0 0; padding-left:var(--space-6); }
.als-issues li { margin:var(--space-1) 0; font-size:var(--text-xs); line-height:var(--lh-normal); }
/* Baris penyesuaian batch (diskon/pajak) di kartu transaksi — sekunder, tetap terbaca. */
.sd2-tx-line.is-adj { color:var(--text-subtle,var(--ink-400)); }
.sd2-tx-line.is-adj b { font-weight:var(--fw-semibold); }
/* Badge Legacy Billing di kepala drawer (COPY-TK-03 / ADR D-16). */
.pay-chip.bk-legacy-chip { border-color:var(--pst-orange-border); background:var(--pst-orange-bg); color:var(--pst-orange-text); }
/* Penanda Order di kartu kalender minggu/hari — satu kolom, tidak ikut pola ikon+teks. */
.cal-wcard-meta.cal-wcard-ord { grid-template-columns:minmax(0,1fr); }
/* Kartu "Posisi tagihan" (tab Dokumen) memulai dengan .sd2-kv; tanpa ini garis
   atas baris pertama menumpuk dengan tepi kartu jadi garis ganda. */
.sd2-card--flush > .sd2-kv:first-child { border-top:0; }
/* Sel bulan: chip event berbaris; badge mini tidak boleh menyusut atau membungkus. */
.cal-ev .sd2-linkbadge { flex:none; }

/* Baris komposit = GRID auto | minmax(0,1fr) | auto (aturan owner: jangan flex —
   flex membuat kolom teks mendorong aksi keluar saat nama klien panjang). */
.sd2-rel-row2 { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:12px; align-items:start; padding:12px 16px; }
.sd2-rel-row2 + .sd2-rel-row2 { border-top:1px solid var(--line-100,var(--line-soft)); }
.sd2-rel-row2.is-current { background:var(--surface-1); }
.sd2-rel-ic { display:inline-flex; margin-top:2px; color:var(--text-subtle,var(--ink-400)); }
.sd2-rel-body { display:flex; min-width:0; flex-direction:column; gap:3px; }
.sd2-rel-head { display:flex; flex-wrap:wrap; align-items:center; gap:6px; }
.sd2-rel-you { color:var(--text-subtle,var(--ink-400)); font-size:10px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; }
.sd2-rel-body b { overflow:hidden; color:var(--text-strong,var(--ink)); font-size:13.5px; font-weight:600; text-overflow:ellipsis; }
.sd2-rel-body small { color:var(--text-subtle,var(--ink-400)); font-size:12px; line-height:1.45; }
.sd2-rel-tail { display:flex; flex-direction:column; align-items:flex-end; gap:6px; }
.sd2-rel-tail small { color:var(--text-muted,var(--ink-500)); font-size:12px; }
.sd2-rel-acts { display:flex; flex-wrap:wrap; justify-content:flex-end; gap:4px; }
.sd2-rel-act { display:inline-flex; align-items:center; gap:4px; min-height:32px; padding:4px 8px; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,6px); background:var(--surface-0,#fff); color:var(--text-muted,var(--ink-500)); font-size:11.5px; font-weight:600; cursor:pointer; }
.sd2-rel-act:hover { border-color:var(--line-300,var(--line)); background:var(--surface-1); color:var(--text-strong,var(--ink)); }
.sd2-rel-act.is-danger:hover { border-color:var(--pst-danger-border); background:var(--pst-danger-bg); color:var(--pst-danger-text); }
.sd2-rel-act svg { width:14px; height:14px; }
/* Penanda "keluarga sesi = satu invoice" (koreksi owner 12 Agu). Baris komposit
   ikon · teks · chip memakai GRID (aturan owner), tanpa garis warna di pinggir —
   statusnya diwakili fill chip, sama seperti penanda lain di drawer ini. */
.sd2-oneinv { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:10px; align-items:center;
  padding:12px 16px; border-bottom:1px solid var(--line-100,var(--line-soft)); background:var(--surface-1); }
.sd2-oneinv span { display:block; font-size:13px; color:var(--text-body,var(--ink-800)); }
.sd2-oneinv small { display:block; margin-top:2px; font-size:11.5px; color:var(--text-muted,var(--ink-600)); }
.sd2-oneinv svg { color:var(--text-muted,var(--ink-600)); }
.sd2-oneinv__chip { white-space:nowrap; }
.sd2-rel-banner { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:10px; align-items:center; padding:12px 16px; border-bottom:1px solid var(--line-100,var(--line-soft)); background:var(--pst-info-bg); color:var(--pst-info-text); }
.sd2-rel-banner b { display:block; font-size:13px; font-weight:600; }
.sd2-rel-banner small { color:var(--text-muted,var(--ink-500)); font-size:12px; }
.sd2-rel-summary { display:grid; grid-template-columns:repeat(auto-fit,minmax(96px,1fr)); gap:10px 14px; padding:12px 16px; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sd2-rel-summary > div { display:flex; min-width:0; flex-direction:column; gap:2px; }
.sd2-rel-summary span { color:var(--text-subtle,var(--ink-400)); font-size:10.5px; letter-spacing:.04em; text-transform:uppercase; }
.sd2-rel-summary b { overflow:hidden; color:var(--text-strong,var(--ink)); font-size:13px; font-weight:700; text-overflow:ellipsis; }
.sd2-rel-cta { display:flex; flex-wrap:wrap; gap:8px; padding:12px 16px; border-top:1px solid var(--line-100,var(--line-soft)); }

/* Transaksi bertanggal */
.sd2-tx-group { margin-bottom:var(--rhythm-block,var(--space-4)); }
/* Spec 12.56.B §D4 — kicker "Transaksi" dihapus, jadi .sd2-tx-daterule kini penanda
   seksi pertama di area projection dan butuh jarak seksi dari kartu Ringkasan. */
#dTxProjArea { margin-top:var(--rhythm-section,var(--space-7)); }
.sd2-tx-daterule { display:flex; align-items:center; gap:10px; margin:0 0 8px; color:var(--text-subtle,var(--ink-400)); font-size:11px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; }
.sd2-tx-daterule::after { flex:1; height:1px; background:var(--line-100,var(--line-soft)); content:''; }
.sd2-tx-card { margin-bottom:8px; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); background:var(--surface-0,#fff); }
.sd2-tx-card.is-reversed { opacity:.72; }
.sd2-tx-head { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:10px; align-items:start; padding:10px 14px; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sd2-tx-head b { display:block; font-size:12.5px; font-weight:700; }
.sd2-tx-head small { color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.sd2-tx-lines { padding:4px 0; }
.sd2-tx-line { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:12px; align-items:center; padding:7px 14px; }
.sd2-tx-line b { font-size:13px; font-weight:600; }
.sd2-tx-line small { display:block; color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.sd2-tag-manual { margin-left:6px; padding:1px 5px; border:1px solid var(--pst-orange-border); border-radius:var(--radius-pill,100px); background:var(--pst-orange-bg); color:var(--pst-orange-text); font-size:9px; font-weight:700; letter-spacing:.06em; }
.sd2-tx-foot { display:flex; flex-wrap:wrap; align-items:center; gap:10px; padding:9px 14px; border-top:1px solid var(--line-100,var(--line-soft)); background:var(--surface-1); }
.sd2-tx-foot span { flex:1; color:var(--text-subtle,var(--ink-400)); font-size:11.5px; }
.sd2-tx-foot b { font-size:13.5px; font-weight:700; }
.sd2-charge-total--std { margin-top:2px; padding:10px 14px; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); }
.sd2-tx-cta { margin-top:10px; }
.tx-qty { margin-right:8px; color:var(--text-muted,var(--ink-500)); font-size:12px; font-weight:700; }
.tx-sel-tail { display:flex; align-items:center; gap:4px; }

/* Dokumen & skema pembayaran */
.sd2-scheme-now { display:flex; flex-direction:column; gap:2px; }
.sd2-scheme-now span { color:var(--text-subtle,var(--ink-400)); font-size:11px; letter-spacing:.04em; text-transform:uppercase; }
.sd2-scheme-now b { font-size:20px; font-weight:700; }
.sd2-scheme-now small { color:var(--text-muted,var(--ink-500)); font-size:12px; }
.sd2-doc-row.is-locked { opacity:.55; cursor:not-allowed; }

/* ── Kartu dokumen berdampingan (Tagihan · Invoice · Kwitansi) ─────────────────
   Tiga dokumen ini adalah TAHAP BERURUTAN, bukan tiga pilihan setara. Grid kolom
   membuat ketiganya terbaca sekaligus, dan `--step` + peran singkat menyatakan
   urutan uangnya tanpa perlu dibuka. Semua nilai dari token. */
.sd2-doc-grid {
  display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:var(--space-3);
}
.sd2-doccard {
  display:grid; grid-template-rows:auto auto auto auto auto; gap:var(--space-1); align-content:start;
  min-width:0; padding:var(--space-4); text-align:left; cursor:pointer;
  background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--r-sm);
  transition:border-color .14s ease, background .14s ease, box-shadow .14s ease;
}
.sd2-doccard:hover:not(:disabled) { background:var(--surface-1); border-color:var(--ink-300); box-shadow:var(--shadow-card); }
.sd2-doccard:focus-visible { outline:2px solid var(--ink-900); outline-offset:2px; }
.sd2-doccard__step {
  color:var(--text-subtle); font:600 9.5px var(--font-mono);
  letter-spacing:.14em; text-transform:uppercase;
}
.sd2-doccard__ic { display:flex; margin:var(--space-2) 0 var(--space-1); color:var(--ink-700); }
.sd2-doccard b { color:var(--text-strong); font-size:14.5px; font-weight:700; letter-spacing:-.01em; }
/* Peran dokumen — kalimat inilah yang membedakan ketiganya, jadi ia bukan teks kecil. */
.sd2-doccard em { color:var(--text-muted); font-size:12.5px; font-style:normal; }
.sd2-doccard small { margin-top:var(--space-2); color:var(--text-subtle); font:500 11.5px var(--font-mono); overflow-wrap:anywhere; }
.sd2-doccard.is-locked { opacity:.5; cursor:not-allowed; }
.sd2-doccard.is-locked:hover { background:var(--surface-0); border-color:var(--line-200); box-shadow:none; }

/* ══ Modal Order (`ord-*`) ═══════════════════════════════════════════════════
   Permukaan ini sebelumnya dirakit dari 11 `style="..."` inline + lima kosakata
   kelas pinjaman (pos-mini-label · bk-side-pay · badge-st · pay-chip · sub), dan
   empat angka uang dirender dengan bobot yang sama sehingga tidak ada yang
   memimpin. Blok ini memberinya anatomi sendiri, nilai HANYA dari token.
   Hierarki yang ditegakkan: SISA TAGIHAN memimpin → rincian pendukung → daftar
   sesi → daftar pembayaran → aksi. */
.ord-head { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-3); align-items:start; }
.ord-head h2 { margin:0; display:flex; align-items:center; gap:var(--space-2); font-size:20px; letter-spacing:-.01em; }
.ord-purpose { margin-top:var(--space-2); color:var(--text-muted); font-size:12.5px; max-width:56ch; }
.ord-chips { display:flex; flex-wrap:wrap; gap:var(--space-2); margin-top:var(--space-3); }

/* Angka pemimpin — satu-satunya yang berukuran besar di modal ini. */
.ord-lead {
  display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-3); align-items:end;
  margin-top:var(--space-4); padding:var(--space-4) var(--space-5);
  background:var(--surface-1); border:1px solid var(--line-200); border-radius:var(--r-sm);
}
.ord-lead__k { color:var(--text-subtle); font:600 10px var(--font-mono); letter-spacing:.14em; text-transform:uppercase; }
.ord-lead__v { display:block; margin-top:var(--space-1); color:var(--text-strong); font:800 30px/1.05 var(--font-mono); letter-spacing:-.02em; }
.ord-lead--due .ord-lead__v { color:var(--tag-orange-text); }
.ord-lead--paid .ord-lead__v { color:var(--tag-success-text); }
.ord-lead__note { color:var(--text-subtle); font-size:11.5px; text-align:right; }

/* Rincian pendukung — sengaja lebih kecil dari angka pemimpin. */
.ord-break { display:grid; gap:0; margin-top:var(--space-3); border:1px solid var(--line-200); border-radius:var(--r-sm); overflow:hidden; }
.ord-break__row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-3); align-items:baseline; padding:var(--space-3) var(--space-4); }
.ord-break__row + .ord-break__row { border-top:1px solid var(--line-100); }
.ord-break__row > span { color:var(--text-muted); font-size:12.5px; }
.ord-break__row > b { color:var(--text-strong); font:600 13px var(--font-mono); font-variant-numeric:tabular-nums; }
.ord-break__row.is-minus > b { color:var(--tag-success-text); }

/* ── Badan modal Order: SATU tepi ──────────────────────────────────────────
   Terukur sebelum perbaikan: `.modal-head` padding-left 20px · `.ord-lead` 16px ·
   `.ord-sec` 0 · `.ord-foot` 0 — empat inset berbeda dalam satu modal, sehingga
   judul seksi & tombol footer menempel ke tepi sementara header menjorok.
   Padding kini dimiliki SATU kontainer (`.ord-body`) yang menyamai inset header;
   anak-anaknya nol, jadi blok baru mustahil lupa ikut garis. */
/* ── Ukuran modal Order: FLUID, bukan 580px mati ───────────────────────────
   `.modal-center.wide` dikunci 580px. Order memuat DUA tabel 5 kolom, jadi pada
   lebar itu isinya selalu terpotong: kode kwitansi terpangkas di tepi kanan dan
   "Dibayar pada …" pecah jadi lima baris. Sekarang lebarnya tumbuh mengikuti
   viewport sampai batas baca (1040px), dan min-height menjaga Order pendek tidak
   tampil sebagai kotak gepeng. Preseden per-konteks sudah ada:
   `.modal-center.workspace-layer.wide` memakai 860px. */
.modal-center.ord-modal { max-width:min(1040px, calc(100vw - var(--space-8))); }
/* Badan jadi pemilik scroll — tanpa ini isi melewati batas 88vh milik container. */
.modal-center.ord-modal .ord-body { flex:1 1 auto; min-height:0; overflow-y:auto; }
@media (min-height:640px){
  .modal-center.ord-modal { min-height:min(560px, calc(100vh - var(--space-9))); }
}
/* --space-6 = 20px, SAMA dengan padding-x `.modal-head`. Memakai --space-5 (16px)
   menyisakan selisih 4px yang terbaca sebagai "header menjorok sendiri". */
.ord-body { padding:0 var(--space-6) var(--space-6); }
.ord-body > .ord-lead, .ord-body > .ord-break { margin-left:0; margin-right:0; }
.ord-body > .ord-foot { padding-left:0; padding-right:0; }
.ord-sec { margin-top:var(--space-5); }
.ord-sec__h { display:flex; align-items:baseline; gap:var(--space-2); margin-bottom:var(--space-2); }
.ord-sec__h b { color:var(--text-strong); font-size:13px; font-weight:700; }
.ord-sec__h span { color:var(--text-subtle); font-size:11.5px; }
/* `overflow-x:auto` dulu jadi hiasan: tabelnya `min-width:0` + layout auto,
   jadi ia DIKOMPRES agar muat (scrollWidth == clientWidth) alih-alih menggeser.
   Akibatnya sel menyempit sampai 51px dan kode mono patah di tengah token —
   terukur 10 sel setinggi 84px (3–4 baris). Ambang di bawah membuat tabel
   mempertahankan lebar bacanya lalu benar-benar menggeser. */
.ord-scroll { overflow-x:auto; border:1px solid var(--line-200); border-radius:var(--r-sm);
  -webkit-overflow-scrolling:touch; }
.ord-scroll > table { min-width:720px; }
/* Kode dokumen adalah satu token — memutusnya di tengah membuatnya tak terbaca.
   Baris fakta pendek ("Dibayar pada …") juga tidak boleh pecah jadi 5 baris. */
.ord-scroll td .mono, .ord-scroll td.mono, .ord-scroll th { white-space:nowrap; }
.ord-scroll td .sub { white-space:nowrap; }
.ord-scroll td { vertical-align:top; }
.ord-foot { display:flex; flex-wrap:wrap; gap:var(--space-2); margin-top:var(--space-5); padding-top:var(--space-4); border-top:1px solid var(--line-100); }
.ord-foot__spacer { margin-left:auto; }
/* Kolom nominal di tabel Order — dulu `style="text-align:right"` inline. */
.ord-num { text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
.ps-chips { display:flex; flex-wrap:wrap; gap:8px; }
.ps-chip { min-height:36px; padding:7px 14px; border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-pill,100px); background:var(--surface-0,#fff); color:var(--text-muted,var(--ink-500)); font-size:12.5px; font-weight:600; cursor:pointer; }
.ps-chip:hover { border-color:var(--line-300,var(--line)); color:var(--text-strong,var(--ink)); }
.ps-chip.is-on { border-color:var(--ink-950,#050505); background:var(--ink-950,#050505); color:var(--surface-0,#fff); }

/* Ruang sempit: aksi baris turun ke bawah agar tidak pernah menabrak kolom teks,
   dan target sentuh dinaikkan ke 44px sesuai brief §Phase 2.8. Dinaikkan HANYA di
   dalam drawer — `.abtn--sm` dipakai seluruh aplikasi dan tingginya (32px) adalah
   keputusan desain global; mengubahnya dari sini akan menggeser layar lain. */
@media (max-width:640px) {
  .sd2-rel-row2 { grid-template-columns:auto minmax(0,1fr); }
  .sd2-rel-tail { grid-column:1 / -1; flex-direction:row; flex-wrap:wrap; align-items:center; justify-content:flex-start; }
  .sd2-rel-banner { grid-template-columns:auto minmax(0,1fr); }
  .sd2-rel-banner .abtn { grid-column:1 / -1; justify-self:start; }
  .sched-drawer-pane .abtn,
  .sched-drawer-pane .sd2-rel-act,
  .sched-drawer-pane .sd2-doc-row,
  .ps-chips .ps-chip { min-height:44px; }
  .sd2-tx-foot { row-gap:8px; }
  .sd2-tx-foot .abtn { width:100%; justify-content:center; }
}
/* ══ FINANCE FAMILIAR (Brief 2026-08-10 §2.2–§2.5) ══════════════════════════
   Pembayaran per transaction batch di drawer, modal payment bersama, banner
   gate add-on, badge validasi, log per tanggal, Buku Kas/Besar. Semua nilai
   dari token DS (var(--…)) — tanpa nilai hardcoded baru. */
/* Spec 12.56.B §D5 — varian 4-kolom ikut jadi grid. Saat menumpuk, pemisah kiri
   wajib dilepas dari kolom yang MEMULAI baris; kalau tidak, border-nya menggantung
   di tepi kiri kartu (cacat lama yang tak terlihat karena flex-wrap menyembunyikannya). */
.sd2-pay-cols--4 { grid-template-columns:minmax(0,1fr); row-gap:var(--space-4); }
.sd2-pay-cols--4 > div { padding-inline-start:0; border-left:none; }
@media (min-width:744px){
  .sd2-pay-cols--4 { grid-template-columns:repeat(2,minmax(0,1fr)); }
  .sd2-pay-cols--4 > div { padding-inline:var(--space-4); border-left:1px solid var(--line-100,var(--line-soft)); }
  .sd2-pay-cols--4 > div:nth-child(2n+1) { padding-inline-start:0; border-left:none; }
}
@media (min-width:1000px){
  .sd2-pay-cols--4 { grid-template-columns:repeat(4,minmax(0,1fr)); row-gap:0; }
  .sd2-pay-cols--4 > div:nth-child(2n+1) { padding-inline:var(--space-4); border-left:1px solid var(--line-100,var(--line-soft)); }
  .sd2-pay-cols--4 > div:first-child { padding-inline-start:0; border-left:none; }
}
.sd2-chip--blue { background:var(--pst-blue-bg,var(--paper-warm2)); border-color:var(--pst-blue-border,var(--line)); color:var(--pst-blue-text,var(--ink-700)); }
.bk-policy-chip { margin-right:6px; }
/* Baris pembayaran per transaksi — aturan owner: baris komposit = GRID
   auto | minmax(0,1fr) | auto, bukan flex. */
.bk-txpay { border-top:1px dashed var(--line-200,var(--line)); margin-top:8px; padding-top:8px; }
.bk-txpay-title { font-size:.72rem; font-weight:700; letter-spacing:.08em; text-transform:uppercase; color:var(--text-muted,var(--ink-500)); margin:0 0 6px; }
.sd2-pm-row.bk-txpay-row { display:grid; grid-template-columns:minmax(0,1fr) auto auto; align-items:center; gap:6px 10px; }
.sd2-pm-row.bk-txpay-row > .bk-txpay-acts,
.sd2-pm-row.bk-txpay-row > .bk-audit-details { grid-column:1 / -1; }
.bk-txpay-acts { display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
.bk-audit-details { font-size:.78rem; color:var(--text-muted,var(--ink-500)); }
.bk-audit-details summary { cursor:pointer; user-select:none; }
.bk-audit-details summary:hover { color:var(--text-strong,var(--ink)); }
.bk-audit-grid { display:grid; grid-template-columns:auto minmax(0,1fr); gap:2px 10px; padding:6px 0 2px; }
.bk-audit-grid span { color:var(--text-muted,var(--ink-500)); }
/* Banner gate add-on lokasi — sticky di atas pane. */
.bk-gate-banner { position:sticky; top:0; z-index:5; }
/* Modal payment bersama: baris alokasi = grid (aturan owner). */
/* ── Spec 12.56.B §D11 · Pilihan durasi perpanjangan ──────────────────────────
   Sepola dengan kartu metode pembayaran: boxy, state terpilih dibawa border + ring
   + centang (bukan warna saja). Harga per blok datang dari server. */
.ext-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(120px,1fr)); gap:var(--space-3); }
.ext-card {
  position:relative; display:flex; min-height:64px; flex-direction:column; align-items:flex-start; justify-content:center; gap:var(--space-1);
  padding:var(--space-4); background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px);
  color:var(--text-body,var(--ink-800)); cursor:pointer; text-align:left;
  transition:border-color .14s ease, background .14s ease, transform .1s ease;
}
.ext-card b { font-size:var(--text-xs,13px); font-weight:700; }
.ext-card .mono { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs,11px); font-variant-numeric:tabular-nums; }
.ext-card:hover { border-color:var(--ink-400,var(--muted)); background:var(--surface-1); }
.ext-card:active { transform:scale(.985); }
.ext-card:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.ext-card.is-on { border-color:var(--ink-900,var(--ink)); box-shadow:0 0 0 1px var(--ink-900,var(--ink)) inset; color:var(--text-strong,var(--ink)); }
.ext-card.is-on .mono { color:var(--text-strong,var(--ink)); }
.ext-card .ext-tick { position:absolute; top:var(--space-2); right:var(--space-2); display:none; color:var(--text-strong,var(--ink)); }
.ext-card.is-on .ext-tick { display:block; }
@media (prefers-reduced-motion: reduce) { .ext-card { transition:border-color .01ms linear; } .ext-card:active { transform:none; } }

/* ── Spec 12.56.B §D12 · Invoice sebagai lembar A4 ────────────────────────────
   Jalur CETAK sudah benar sejak dulu (@page A4 portrait + break-inside, lihat blok
   @media print di bawah). Yang salah adalah PRATINJAU-nya: dokumen dirender sebagai
   kartu sempit di dalam modal, sehingga nomor Order patah dua baris dan admin tidak
   pernah melihat bentuk kertas yang sebenarnya. Sekarang pratinjau = hasil cetak. */
/* Modal dokumen menyesuaikan isinya: struk (vs-receipt) tetap sempit, invoice A4
   mendapat lebar penuh lembarnya. `width:460px` yang lama memotong lembar A4 di
   tengah — nomor Order dan kolom total hilang di sisi kanan. Saat viewport tak
   cukup, lembar digulir DI DALAM body (yang sudah overflow:auto), bukan memaksa
   halaman menggulir horizontal. */
.sched-doc-modal { width:auto; min-width:460px; max-width:min(94vw, 900px); }
.sched-doc-modal-body { background:var(--surface-1); }
.sched-doc-modal-body .inv2 {
  width:210mm; min-height:297mm; padding:14mm;      /* == @page margin */
  margin-inline:auto; box-shadow:var(--shadow-card);
}
/* Kop: identitas penerbit di kiri, jenis dokumen di kanan. */
.inv2-masthead { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:start; gap:var(--space-5); padding-bottom:var(--space-4); border-bottom:2px solid var(--ink-900,var(--ink)); }
.inv2-issuer { display:grid; gap:var(--space-1); min-width:0; }
.inv2-issuer-name { font-family:var(--font-display,var(--font-sans)); font-size:var(--text-h4,18px); font-weight:750; }
.inv2-issuer small { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs,11px); }
.inv2-doctype { display:grid; justify-items:end; gap:var(--space-2); }
.inv2-doctype-word { font-family:var(--font-display,var(--font-sans)); font-size:var(--text-h3,22px); font-weight:750; letter-spacing:.08em; }
/* Identitas dokumen: nomor · terbit · jatuh tempo. Nomor TIDAK BOLEH ter-ellipsis. */
/* Penanda invoice yang BELUM diterbitkan (U1): isinya masih ikut data hidup,
   jadi katakan itu di atas kertas — jangan biarkan pratinjau terbaca resmi.
   Baris ikon+teks memakai grid (aturan owner), tanpa garis warna pinggir. */
.inv2-preview { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3);
  align-items:start; margin:var(--space-3) 0 0; padding:var(--space-3) var(--space-4);
  background:var(--pst-warning-bg); color:var(--pst-warning-text);
  border-radius:var(--radius-sm,10px); font-size:var(--text-2xs); line-height:var(--lh-normal); }
.inv2-preview svg { flex:none; margin-top:1px; }
@media print { .inv2-preview { border:1px solid #999; background:transparent; color:#000; } }
.inv2-docmeta { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--space-4); padding:var(--space-4) 0; }
.inv2-docmeta > div { display:grid; gap:var(--space-1); min-width:0; }
.inv2-docmeta b { font-size:var(--text-xs,13px); font-weight:700; overflow-wrap:anywhere; white-space:normal; }
.inv2-docmeta .inv2-no { font-size:var(--text-sm,14px); }
/* Nomor identitas di panel mana pun: membungkus, bukan dipotong "…". */
.inv2-panel b { overflow:visible; overflow-wrap:anywhere; text-overflow:clip; white-space:normal; }
/* Header kolom tabel item. */
.inv2-line--head { border-bottom:1px solid var(--ink-900,var(--ink)); }
.inv2-line--head b, .inv2-line--head strong { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs,11px); font-weight:700; letter-spacing:.06em; text-transform:uppercase; }
/* Syarat pembayaran + tanda tangan. */
.inv2-terms { display:grid; gap:var(--space-1); margin-top:var(--space-5); padding-top:var(--space-4); border-top:1px solid var(--line-200,var(--line)); }
.inv2-terms small { color:var(--text-muted,var(--ink-600)); font-size:var(--text-2xs,11px); }
.inv2-sign { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-8); margin-top:var(--space-8); }
.inv2-sign-col { display:grid; gap:var(--space-2); }
.inv2-sign-rule { height:var(--space-10); border-bottom:1px solid var(--ink-900,var(--ink)); }
.inv2-sign-col small { color:var(--text-muted,var(--ink-600)); font-size:var(--text-2xs,11px); }
.inv2-pagefoot { margin-top:auto; padding-top:var(--space-5); color:var(--text-subtle,var(--ink-400)); }
.inv2 { display:flex; flex-direction:column; }
@media (max-width:820px){
  .sched-doc-modal-body .inv2 { box-shadow:none; }
}

/* ── Spec 12.56.B §D13 · Dua catatan berdampingan (paling atas pane Booking) ──
   Kiri catatan tim, kanan catatan klien. Ukurannya sengaja kecil: ini konteks yang
   dibaca sekilas, bukan area menulis panjang — textarea tetap bisa ditarik. */
/* Dua catatan = dua BINGKAI terpisah, bukan satu kartu berisi dua kolom. Pembacanya
   berbeda (tim vs klien), jadi batas visualnya harus terasa — satu kotak besar justru
   menyiratkan keduanya satu hal yang sama. */
.sd2-notes {
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-4);
}
.sd2-note {
  display:grid; gap:var(--space-2); min-width:0;
  padding:var(--space-4); background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,14px);
}
/* Catatan klien dibedakan tegas dari catatan tim: latar sedikit turun + aksen tepi. */
.sd2-note + .sd2-note { background:var(--surface-1); }   /* :last-of-type keliru — footer juga <div> */
.sd2-note-h {
  display:inline-flex; align-items:center; gap:var(--space-2);
  color:var(--text-subtle,var(--ink-400)); font:700 var(--text-2xs,11px) var(--font-body);
  letter-spacing:.06em; text-transform:uppercase;
}
.sd2-note-h em { font-style:normal; font-weight:400; text-transform:none; letter-spacing:0; opacity:.75; }
.note-area--sm {
  min-height:56px; padding:var(--space-3); border-radius:var(--radius-xs,6px);
  font-size:var(--text-xs,13px); line-height:1.45; resize:vertical;
}
.sd2-notes-foot { grid-column:1 / -1; display:flex; align-items:center; justify-content:flex-end; gap:var(--space-3); }
@media (max-width:744px){ .sd2-notes { grid-template-columns:minmax(0,1fr); } }

/* ── Spec 12.56.B §D7 · Grid katalog modal "Tambah item" ──────────────────────
   Geometri diambil PERSIS dari .pos-product-grid / .pos-product supaya modal ini
   dan katalog POS terbaca sebagai satu desain (keduanya memilih dari katalog yang
   sama). Bedanya cuma satu baris meta tambahan (kategori · brand), sesuai permintaan
   owner "card detail item". */
.tx-catalog-grid {
  display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:var(--space-3);
  max-height:330px; overflow:auto; padding:var(--space-1);
}
.tx-catalog-group { grid-column:1 / -1; padding:var(--space-3) 0 var(--space-1); }
.tx-catalog-group span {
  color:var(--text-subtle,var(--ink-400)); font:700 var(--text-2xs,11px) var(--font-body);
  letter-spacing:.06em; text-transform:uppercase;
}
.tx-catalog-card {
  position:relative; display:flex; min-height:74px; flex-direction:column; gap:var(--space-1);
  overflow:hidden; padding:var(--space-3) var(--space-3) var(--space-3) var(--space-4);
  background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line));
  border-radius:var(--radius-sm,10px); text-align:left; cursor:pointer;
  transition:border-color .14s ease, background .14s ease, transform .1s ease;
}
.tx-catalog-card::before {
  content:''; position:absolute; inset-block:0; inset-inline-start:0; width:4px;
  background:var(--prod-tone,var(--line-200,var(--line)));
}
.tx-catalog-card b {
  display:-webkit-box; overflow:hidden; color:var(--text-strong,var(--ink));
  font-size:var(--text-xs,13px); line-height:1.3; -webkit-line-clamp:2; -webkit-box-orient:vertical;
}
.tx-catalog-card small { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs,11px); }
.tx-catalog-card > .mono {
  margin-top:auto; color:var(--text-strong,var(--ink));
  font-size:var(--text-2xs,11px); font-weight:700; font-variant-numeric:tabular-nums;
}
.tx-catalog-card:hover { border-color:var(--ink-900,var(--ink)); background:var(--surface-1); }
.tx-catalog-card:active { transform:scale(.985); }
.tx-catalog-card:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.tx-catalog-card.is-on { border-color:var(--ink-900,var(--ink)); box-shadow:0 0 0 1px var(--ink-900,var(--ink)) inset; }
.tx-catalog-card .tx-catalog-tick { position:absolute; top:var(--space-2); right:var(--space-2); display:none; color:var(--text-strong,var(--ink)); }
.tx-catalog-card.is-on .tx-catalog-tick { display:block; }
.tx-catalog-qty {
  position:absolute; right:var(--space-2); bottom:var(--space-2);
  padding:0 var(--space-2); background:var(--ink-900,var(--ink)); color:var(--text-on-dark,#fff);
  border-radius:var(--radius-pill,100px); font-size:var(--text-2xs,11px); font-weight:700;
}
@media (prefers-reduced-motion: reduce) {
  .tx-catalog-card { transition:border-color .01ms linear; }
  .tx-catalog-card:active { transform:none; }
}

/* ── Spec 12.56.B §D9 · Pemilih metode pembayaran (boxy + ikon) ───────────────
   Menggantikan segmented control abu-abu memanjang. Tiga kartu setara, ikon di
   atas label, dan state terpilih dibawa border + ring + centang — bukan warna
   saja, supaya tetap terbaca di grayscale dan bagi pengguna buta warna. */
.pay-method-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--space-3); }
.pay-method-card {
  position:relative; display:flex; min-height:64px; flex-direction:column; align-items:center; justify-content:center; gap:var(--space-2);
  padding:var(--space-4) var(--space-3); background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px);
  color:var(--text-muted,var(--ink-600)); cursor:pointer;
  transition:border-color .14s ease, background .14s ease, color .14s ease, transform .1s ease;
}
.pay-method-card:hover { border-color:var(--ink-400,var(--muted)); background:var(--surface-1); }
.pay-method-card:active { transform:scale(.985); }
.pay-method-card:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.pay-method-card .pay-method-lb { font:650 var(--text-xs,13px)/1.2 var(--font-body); letter-spacing:-.01em; }
.pay-method-card .pay-method-ic { display:grid; place-items:center; }
.pay-method-card .pay-method-tick { position:absolute; top:var(--space-2); right:var(--space-2); display:none; color:var(--text-strong,var(--ink)); }
.pay-method-card.is-on {
  color:var(--text-strong,var(--ink)); border-color:var(--ink-900,var(--ink));
  box-shadow:0 0 0 1px var(--ink-900,var(--ink)) inset; background:var(--surface-0,var(--paper));
}
.pay-method-card.is-on .pay-method-tick { display:block; }

/* ── Spec 12.56.B §D10 · Progressive disclosure modal pembayaran ──────────────
   Kasus lazim (satu transaksi, transfer, bayar hari ini) selesai dengan tiga field
   terlihat. Referensi/bukti/catatan dilipat — tapi WAJIB terbuka sendiri saat ada
   error di dalamnya (dijaga pmRevealMore di admin.js). */
.pm-more { margin-top:var(--space-4); border-top:1px solid var(--line-100,var(--line-soft)); }
.pm-more > summary {
  display:flex; align-items:center; gap:var(--space-2); padding:var(--space-4) 0;
  color:var(--text-muted,var(--ink-600)); cursor:pointer; list-style:none;
  font:650 var(--text-xs,13px)/1.2 var(--font-body);
}
.pm-more > summary::-webkit-details-marker { display:none; }
.pm-more > summary small { color:var(--text-subtle,var(--ink-400)); font-weight:400; font-size:var(--text-2xs,11px); }
.pm-more > summary:focus-visible { outline:none; box-shadow:var(--shadow-focus); border-radius:var(--radius-xs,6px); }
.pm-more > summary svg { transition:transform .18s ease; }
.pm-more[open] > summary svg { transform:rotate(180deg); }
.pm-more-body { padding-bottom:var(--space-3); }
.pm-evidence { margin-top:var(--space-4); padding-top:var(--space-4); border-top:1px solid var(--line-100,var(--line-soft)); }
.pm-evidence .frow:last-child { margin-bottom:0; }

/* ── Spec 12.56.B §D10b · Bukti transfer: tempel gambar ───────────────────────
   Menggantikan dua field teks (No. referensi + Bukti URL) yang menuntut admin
   MENGETIK sesuatu yang sudah ada di clipboard sebagai screenshot. */
.pm-proof {
  position:relative; display:grid; place-items:center; min-height:132px; overflow:hidden;
  padding:var(--space-5); background:var(--surface-1);
  border:1px dashed var(--line-200,var(--line)); border-radius:var(--radius-sm,10px);
  cursor:pointer; transition:border-color .14s ease, background .14s ease;
}
.pm-proof:hover { border-color:var(--ink-400,var(--muted)); }
.pm-proof:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.pm-proof.is-over { border-color:var(--ink-900,var(--ink)); background:var(--surface-0,var(--paper)); }
.pm-proof.has { padding:0; border-style:solid; background:var(--surface-0,var(--paper)); cursor:default; }
.pm-proof-empty { display:grid; justify-items:center; gap:var(--space-2); color:var(--text-subtle,var(--ink-400)); text-align:center; }
.pm-proof-empty b { color:var(--text-body,var(--ink-800)); font-size:var(--text-xs,13px); font-weight:650; }
.pm-proof-empty small { font-size:var(--text-2xs,11px); }
.pm-proof-img { display:block; width:100%; max-height:280px; object-fit:contain; background:var(--surface-1); }
.pm-proof-clear {
  position:absolute; top:var(--space-2); right:var(--space-2);
  display:grid; width:28px; height:28px; place-items:center;
  background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line));
  border-radius:var(--radius-xs,6px); color:var(--text-muted,var(--ink-600)); cursor:pointer;
}
.pm-proof-clear:hover { border-color:var(--pst-danger-text,var(--danger)); color:var(--pst-danger-text,var(--danger)); }
/* Dua jalan masuk bukti yang eksplisit (owner 12 Agu): kamera untuk kasir yang
   memegang HP (cash), pilih-file untuk desktop. Paste & seret tetap jalan di
   dropzone di atasnya — tombol ini menambah afordans, bukan menggantikannya. */
.pm-proof-ways { display:flex; flex-wrap:wrap; gap:var(--space-2); margin-top:var(--space-2); }
.pm-proof-ways .abtn { min-height:var(--field-h-sm,36px); }
@media (prefers-reduced-motion: reduce) { .pm-proof { transition:none; } }
@media (prefers-reduced-motion: reduce) {
  .pay-method-card { transition:border-color .01ms linear; }
  .pay-method-card:active { transform:none; }
  .pm-more > summary svg { transition:none; }
}

.bk-alloc-row { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:var(--space-3) var(--space-4); padding:var(--space-2) 0; border-bottom:1px dashed var(--line-100,var(--line-soft)); }
/* Spec 12.56.B §D8 — kode transaksi dan barisan meta dulu keduanya inline tanpa
   pemisah, jadi terbaca menyatu: "VS-TRX-20260810-001110 Agu 2026". Dipisah jadi
   dua baris; nomor dokumen tidak boleh pernah bersambung dengan data lain. */
.bk-alloc-row > div { display:grid; gap:var(--space-1); min-width:0; }
.bk-alloc-row > div > b { overflow-wrap:anywhere; }
.bk-alloc-row > div > small { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs,11px); }
.bk-alloc-row.is-full { opacity:.55; }
.bk-alloc-amt { max-width:140px; text-align:right; font-variant-numeric:tabular-nums; }
.bk-alloc-over { color:var(--pst-danger-text,var(--danger)); font-weight:700; }
/* Badge "Perlu Divalidasi" pada nav Finance. */
.fin-validasi-badge { display:inline-flex; align-items:center; gap:6px; align-self:center;
  padding:4px 10px; border-radius:var(--radius-pill,100px);
  background:var(--pst-orange-bg,var(--paper-warm2)); border:1px solid var(--pst-orange-border,var(--line));
  color:var(--pst-orange-text,var(--ink-700)); font-size:.78rem; font-weight:700; text-decoration:none; white-space:nowrap; }
.fin-validasi-badge:hover { filter:brightness(.97); }
.fin-validasi-cta { align-items:center; gap:10px; }
.fin-validasi-cta .abtn { margin-left:auto; flex:none; }
/* Log transaksi per tanggal bisnis. */
.fin-daterow td { background:var(--surface-2,var(--paper-warm2)); font-size:.8rem; padding-top:9px; padding-bottom:9px; border-top:1px solid var(--line-200,var(--line)); }
tr.fin-logrow { cursor:pointer; }
tr.fin-logrow:hover td { background:var(--surface-1,var(--paper-warm)); }
/* Buku Kas per rekening (Laporan & Kas). */
.fin-book-acc { border-bottom:1px solid var(--line-100,var(--line-soft)); }
.fin-book-acc > summary { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:4px 12px; align-items:center;
  padding:10px 14px; cursor:pointer; user-select:none; list-style:none; }
.fin-book-acc > summary::-webkit-details-marker { display:none; }
.fin-book-acc > summary .sub { margin-left:6px; }
.fin-book-acc[open] > summary { background:var(--surface-2,var(--paper-warm2)); }
.stat-grid.kpi3 { grid-template-columns:repeat(3,1fr); }
@media (max-width: 960px){ .stat-grid.kpi3 { grid-template-columns:repeat(2,1fr); } }
@media (max-width: 480px){ .stat-grid.kpi3 { grid-template-columns:1fr; } }
/* == SCHED-DRAWER-V2:END == */

.sl-list { display:flex; flex-direction:column; gap:8px; }
.sl-list-item { display:flex; width:100%; align-items:center; gap:14px; padding:12px 16px; color:var(--text-body,var(--ink-700)); text-align:left; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-left:3px solid var(--sched-accent,var(--ink-400)); border-radius:var(--radius-md,10px); cursor:pointer; font-family:var(--font-body); transition:box-shadow .14s ease,transform .14s ease; }
.sl-list-item:hover,.sl-board-card:hover { box-shadow:var(--shadow-pop); transform:translateY(-1px); }
.sl-list-when { display:flex; width:54px; flex:0 0 auto; align-items:center; flex-direction:column; }
.sl-list-when small { color:var(--text-subtle,var(--ink-400)); font:10.5px var(--font-mono); white-space:nowrap; }
.sl-list-when b { margin-top:2px; color:var(--text-strong,var(--ink)); font-size:15px; }
.sl-list-main { min-width:0; flex:1; }
.sl-list-main > b { display:flex; align-items:center; gap:7px; overflow:hidden; color:var(--text-strong,var(--ink)); font-size:13.5px; text-overflow:ellipsis; white-space:nowrap; }
.sl-list-main > small { display:block; overflow:hidden; margin-top:2px; color:var(--text-subtle,var(--ink-400)); font-size:11.5px; text-overflow:ellipsis; white-space:nowrap; }
.sl-list-item > strong { min-width:66px; color:var(--text-strong,var(--ink)); font-size:13px; text-align:right; white-space:nowrap; }
.sl-gallery { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:12px; padding:0; }
/* Galeri/Daftar tanpa grup: beri container panel supaya kartu tidak "melayang" di atas background */
.sl-view-host--gallery > .sl-gallery,
.sl-view-host--list > .sl-list { padding:13px; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); }
.sl-view-host--gallery > .sl-gallery > .sl-board-card { height:100%; }
/* Saat GROUP aktif, grid ada di dalam .sl-group-section (bukan anak langsung view-host)
   → containernya dipindah ke section, header grup jadi kepala panel. */
.sl-view-host--gallery .sl-grouped > .sl-group-section,
.sl-view-host--list .sl-grouped > .sl-group-section { padding:13px; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); }
.sl-view-host--gallery .sl-group-section > header,
.sl-view-host--list .sl-group-section > header { gap:8px; margin:0 0 11px; padding-bottom:9px; border-bottom:1px solid var(--line-100,var(--line-soft)); }
.sl-view-host--gallery .sl-group-section > header em,
.sl-view-host--list .sl-group-section > header em { margin-left:auto; color:var(--text-subtle,var(--ink-400)); font-family:var(--font-mono); font-size:11px; font-style:normal; }
.sl-view-host--gallery .sl-group-section > .sl-gallery > .sl-board-card { height:100%; }
/* Tone status = fill background kartu (bukan garis border kiri), tapi digradasikan ke
   putih (150deg → surface di 62%) supaya blok warna penuh tidak melelahkan mata —
   rumus yang sama dipakai kartu galeri Customers. */
.sl-board-card { display:flex; min-width:0; flex-direction:column; gap:6px; padding:11px 12px; color:var(--text-body,var(--ink-700)); text-align:left; background:linear-gradient(150deg,var(--sched-bg,var(--surface-0,var(--paper))),var(--surface-0,var(--paper)) 62%); border:1px solid var(--sched-border,var(--line-200,var(--line))); border-radius:var(--radius-sm,8px); cursor:pointer; font-family:var(--font-body); transition:box-shadow .14s ease,transform .14s ease; }
/* Baris komposit kartu = grid auto | minmax(0,1fr) | auto (bukan flex) */
.sl-board-card-top { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:8px; }
.sl-board-card-top > b { min-width:0; color:var(--text-strong,var(--ink)); font-size:13.5px; line-height:1.3; overflow-wrap:anywhere; }
.sl-board-card-top .vs-avatar { width:26px; height:26px; font-size:10px; }
.sl-card-idrow { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:8px; }
.sl-card-idrow > small { min-width:0; color:var(--text-subtle,var(--ink-400)); font-size:11px; line-height:1.35; overflow-wrap:anywhere; }
.sl-board-card > small { color:var(--text-subtle,var(--ink-400)); font-size:11px; }
.sl-board-card > p { display:grid; grid-template-columns:minmax(0,1fr); align-items:center; margin:0; color:var(--text-body,var(--ink-700)); font-size:12px; }
.sl-board-card > p > span { min-width:0; line-height:1.4; overflow-wrap:anywhere; }
.sl-card-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:5px 10px; margin-top:2px; padding-top:8px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sl-card-kv { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; gap:6px; color:var(--text-subtle,var(--ink-400)); font-size:11px; }
.sl-card-kv > span { min-width:0; line-height:1.35; overflow-wrap:anywhere; }
.sl-card-kv > svg { flex:0 0 auto; }
/* Catatan internal: kontainer di-highlight (dashed + tone warning) supaya jelas
   ini catatan operasional, bukan info klien. */
.sl-card-note { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:6px; padding:5px 7px; background:var(--tag-warning-bg); border:1px dashed var(--tag-warning-border); border-radius:6px; color:var(--tag-warning-text); font-size:10.5px; line-height:1.35; text-align:left; }
.sl-card-note > em { font-style:normal; font-family:var(--font-mono); font-size:8.5px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; opacity:.75; padding-top:1px; }
.sl-card-note > span { min-width:0; overflow-wrap:anywhere; }
.sl-board-card-foot { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:8px; margin-top:1px; padding-top:6px; color:var(--text-subtle,var(--ink-400)); border-top:1px solid var(--line-100,var(--line-soft)); font-size:11.5px; }
.sl-board-card-foot > em { font-style:normal; font-family:var(--font-mono); font-size:9.5px; letter-spacing:.08em; text-transform:uppercase; }
.sl-board-card-foot > b { color:var(--text-strong,var(--ink)); font-size:12.5px; white-space:nowrap; }
.sl-board-card-foot em { min-width:0; flex:1; overflow:hidden; font-style:normal; text-overflow:ellipsis; white-space:nowrap; }
.sl-board-card-foot b { font-size:11px; white-space:nowrap; }
.sl-grouped { display:flex; flex-direction:column; gap:18px; }
.sl-group-section > header { display:flex; align-items:center; gap:0; margin-bottom:10px; }
.sl-group-section > header b { color:var(--text-strong,var(--ink)); font-size:14px; }
.sl-board { display:flex; min-height:0; gap:12px; overflow-x:auto; padding:0 0 6px; }
.sl-board-col { display:flex; width:296px; min-width:296px; max-height:640px; flex-direction:column; overflow:hidden; background:var(--surface-1,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); }
.sl-board-col > header { display:flex; min-height:0; align-items:center; gap:0; padding:11px 13px; background:transparent; border-bottom:1px solid var(--line-200,var(--line)); }
.sl-board-col > header b { min-width:0; flex:1; overflow:hidden; color:var(--text-strong,var(--ink)); font-size:13.5px; text-overflow:ellipsis; white-space:nowrap; }
.sl-board-col > div { display:flex; flex:1; max-height:none; overflow-y:auto; flex-direction:column; gap:9px; padding:10px; }

/* Timeline/Gantt — reproduksi unit GUI/14/TIMELINE-SCHEDULER (kartu DS: surface-0,
   line-200, radius-md, shadow-card; gutter = nama 13px/600 + subline 11px subtle;
   bar dua baris label + mono). Semua nilai dari token. */
.sl-gantt { overflow:hidden; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md); box-shadow:var(--shadow-card); }
.sl-gantt > header { display:flex; align-items:center; gap:var(--space-3); padding:var(--space-5) var(--space-6); background:var(--surface-0,var(--paper)); border-bottom:1px solid var(--line-200,var(--line)); }
.sl-gantt-head-title { display:flex; min-width:0; flex-direction:column; gap:2px; }
/* Kontrol tab resource di papan Timeline = kontrol yang sama dengan tab Kalender
   (komponen ViewBar + .cal-resource-picker), hanya penempatannya. */
.sl-gantt > .vs-viewbar,.sl-gantt > .cal-resource-picker { margin:0; padding:var(--space-4) var(--space-6); border-bottom:1px solid var(--line-200,var(--line)); }
.sl-gantt > .cal-resource-picker { background:var(--surface-1,var(--paper-warm)); }
.cal-resource-save { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; margin-top:var(--space-4); padding-top:var(--space-4); border-top:1px solid var(--line-100,var(--line-soft)); }
.cal-resource-save input { flex:1 1 220px; min-width:0; min-height:36px; padding:0 var(--space-4); color:var(--text-strong); background:var(--surface-0,var(--paper)); border:1px solid var(--border-input,var(--line)); border-radius:var(--radius-sm); font:var(--fw-medium,500) var(--text-xs) var(--font-body); }
.cal-resource-save input:focus-visible { border-color:var(--border-strong); box-shadow:var(--shadow-focus); outline:none; }
.cal-resource-save > span { flex:1 1 100%; color:var(--text-subtle); font-size:var(--text-2xs); }
.sl-gantt > header h3 { margin:0; color:var(--text-strong,var(--ink)); font:700 19px var(--font-display); letter-spacing:-.01em; }
.sl-gantt-empty-toggle[aria-pressed="true"] { color:var(--brand-ink); background:var(--brand); border-color:var(--brand-line); }
.sl-gantt > header > small { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs); }
.sl-gantt-scroll { overflow-x:auto; min-height:320px; }
.sl-gantt-inner { position:relative; }
/* Papan resource = grid: kolom bracket per kedalaman + kolom daun + kolom track.
   Band leluhur membentang lewat grid-row, jadi hierarki master terbaca sebagai bentuk. */
.sl-gantt-grid { display:grid; align-items:stretch; }
.sl-gantt-grid > * { min-width:0; }
.sl-gantt-band,.sl-gantt-leaf,.sl-gantt-head-name { position:sticky; z-index:5; }
.sl-gantt-head-name { z-index:8; }
/* Band bracket memakai 11 tone pastel Fresh Tag (GUI/07/TAGS-TONES) — tidak ada warna
   baru; tone dipilih deterministik dari resource_key (lihat schedBandTone). */
/* Teks band vertikal -> anaknya HARUS menumpuk searah tinggi band (column).
   Dengan `row`, label dan angka berebut lebar 28px sampai labelnya hilang. */
.sl-gantt-band {
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px;
  overflow:hidden; padding:var(--space-4) 3px; border-top:1px solid var(--line-200,var(--line));
  border-right:1px solid var(--tag-neutral-border);
  color:var(--tag-neutral-text); background:var(--tag-neutral-bg);
}
.sl-gantt-band--blue     { color:var(--tag-blue-text);     background:var(--tag-blue-bg);     border-right-color:var(--tag-blue-border); }
.sl-gantt-band--mint     { color:var(--tag-mint-text);     background:var(--tag-mint-bg);     border-right-color:var(--tag-mint-border); }
.sl-gantt-band--orange   { color:var(--tag-orange-text);   background:var(--tag-orange-bg);   border-right-color:var(--tag-orange-border); }
.sl-gantt-band--pink     { color:var(--tag-pink-text);     background:var(--tag-pink-bg);     border-right-color:var(--tag-pink-border); }
.sl-gantt-band--purple   { color:var(--tag-purple-text);   background:var(--tag-purple-bg);   border-right-color:var(--tag-purple-border); }
.sl-gantt-band--info     { color:var(--tag-info-text);     background:var(--tag-info-bg);     border-right-color:var(--tag-info-border); }
.sl-gantt-band--identity { color:var(--tag-identity-text); background:var(--tag-identity-bg); border-right-color:var(--tag-identity-border); }
.sl-gantt-band > b,.sl-gantt-band > em {
  max-width:100%; overflow:hidden; writing-mode:vertical-rl; transform:rotate(180deg);
  text-overflow:ellipsis; white-space:nowrap;
}
.sl-gantt-band > b { flex:0 1 auto; min-height:0; font:var(--fw-semibold,600) 11px var(--font-body); letter-spacing:.01em; }
.sl-gantt-band > em { flex:0 0 auto; opacity:.7; font:var(--fw-semibold,600) 9.5px var(--font-mono); font-style:normal; }
.sl-gantt-leaf {
  display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:var(--space-3);
  padding:var(--space-3) var(--space-4); background:var(--surface-0,var(--paper));
  border-top:1px solid var(--line-100,var(--line-soft)); border-right:1px solid var(--line-200,var(--line));
}
.sl-gantt-leaf.is-free { color:var(--text-subtle,var(--ink-400)); }
.sl-gantt-leaf.has-clash { box-shadow:inset 3px 0 0 var(--tag-danger-text); }
.sl-gantt-secrow {
  display:flex; align-items:center; gap:var(--space-3); padding:var(--space-3) var(--space-4);
  background:var(--surface-1,var(--paper-warm)); border-top:1px solid var(--line-200,var(--line));
  position:sticky; left:0; z-index:6;
}
.sl-gantt-secrow b { color:var(--text-subtle,var(--ink-400)); font:var(--fw-semibold,600) 10px var(--font-mono); letter-spacing:var(--ls-label-sm,.08em); text-transform:uppercase; }
.sl-gantt-secrow em { color:var(--text-disabled,var(--ink-300)); font:10px var(--font-mono); font-style:normal; }
.sl-gantt-headcols { border-bottom:1px solid var(--line-200,var(--line)); background:var(--surface-1,var(--paper-warm)); }
.sl-gantt-head-name { display:flex; align-items:center; left:0; border-right:1px solid var(--line-200,var(--line)); border-bottom:1px solid var(--line-200,var(--line)); padding:var(--space-3) var(--space-4); color:var(--text-subtle,var(--ink-400)); background:var(--surface-1,var(--paper-warm)); font:var(--fw-semibold,600) var(--text-2xs) var(--font-mono); letter-spacing:var(--ls-label-sm,.1em); text-transform:uppercase; }
.sl-gantt-cols { display:flex; flex:0 0 auto; }
.sl-gantt-col { flex:0 0 auto; padding:var(--space-3) var(--space-4); border-left:1px solid var(--line-100,var(--line-soft)); }
.sl-gantt-col:first-child { border-left:0; }
.sl-gantt-col.today { background:var(--brand-soft,var(--identity-yellow-soft)); }
.sl-gantt-col small { display:block; color:var(--text-disabled,var(--ink-300)); font:600 9px var(--font-mono); letter-spacing:.06em; text-transform:uppercase; }
.sl-gantt-col.weekend small { color:var(--accent-red,var(--danger)); }
.sl-gantt-col span { color:var(--text-strong,var(--ink)); font:800 14px var(--font-display); }
.sl-gantt-col span.mono { color:var(--text-subtle,var(--ink-400)); font:600 11px var(--font-mono); }
.sl-gantt-col.today span { color:var(--brand-ink,var(--ink)); }
.sl-gantt-col em { margin-left:5px; color:var(--text-subtle,var(--ink-400)); font:10px var(--font-mono); font-style:normal; }
.sl-gantt-res-n { flex:0 0 auto; min-width:18px; color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs); text-align:right; font-variant-numeric:tabular-nums; }
/* Penanda sesi yang tak muat pada skala kasar — batas dinyatakan, bukan disembunyikan. */
.sl-gantt-more { position:absolute; right:6px; top:50%; z-index:4; transform:translateY(-50%); padding:2px 7px; color:var(--tag-neutral-text); background:var(--tag-neutral-bg); border:1px solid var(--tag-neutral-border); border-radius:var(--radius-pill,100px); font-size:10px; font-weight:600; }
.sl-gantt-leaf.is-free .sl-gantt-res-n { color:var(--text-disabled,var(--ink-300)); }
.sl-gantt-gutter-main { display:flex; min-width:0; flex-direction:column; gap:2px; }
.sl-gantt-gutter-main > b { overflow:hidden; color:var(--text-strong,var(--ink)); font-size:13px; font-weight:var(--fw-semibold,600); text-overflow:ellipsis; white-space:nowrap; }
.sl-gantt-gutter-sub { display:flex; min-width:0; align-items:center; gap:5px; overflow:hidden; color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs); text-overflow:ellipsis; white-space:nowrap; }
.sl-gantt-gutter-sub > i { width:6px; height:6px; flex:0 0 auto; border-radius:var(--radius-pill); background:currentColor; }
.sl-gantt-gutter-sub > span { min-width:0; overflow:hidden; text-overflow:ellipsis; }
.sl-gantt-gutter-sub > span.mono { flex:0 0 auto; color:var(--text-disabled,var(--ink-300)); font-family:var(--font-mono); font-size:9.5px; }
.sl-gantt-track { position:relative; border-top:1px solid var(--line-100,var(--line-soft)); background:repeating-linear-gradient(90deg,transparent 0 calc(var(--sl-col) - 1px),var(--line-100,var(--line-soft)) calc(var(--sl-col) - 1px) var(--sl-col)); }
.sl-gantt-today { position:absolute; top:0; bottom:0; z-index:2; width:2px; background:var(--accent-red,var(--danger)); pointer-events:none; }
/* Bar = anatomi unit: dua baris (label 11px/600 + jam mono 9px opacity .75),
   padding 3px 8px, radius-xs, di dalam track ber-inset 8px. */
.sl-gantt-bar { position:absolute; top:8px; z-index:1; display:flex; min-width:34px; flex-direction:column; justify-content:center; gap:1px; overflow:hidden; padding:3px 8px; color:var(--sched-text,var(--ink)); text-align:left; background:var(--sched-bg,var(--paper-warm)); border:1px solid var(--sched-border,var(--line)); border-radius:var(--radius-xs); box-shadow:var(--shadow-xs,var(--shadow-1)); cursor:pointer; font-family:var(--font-body); transition:box-shadow .14s ease; }
.sl-gantt-bar:hover { z-index:3; box-shadow:var(--shadow-pop); }
.sl-gantt-bar.clip-l { border-left-style:dashed; border-top-left-radius:0; border-bottom-left-radius:0; }
.sl-gantt-bar.clip-r { border-right-style:dashed; border-top-right-radius:0; border-bottom-right-radius:0; }
/* Jenis bar: primary = resource utama booking · crew = SDM yang ditugaskan ·
   shadow = ikut terkunci lewat hierarki/bundle (arsir, seperti pola buffer di unit). */
/* Blok gabungan: satu kartu membentang di semua baris ruang yang dikuncinya. */
.sl-gantt-groupband { position:relative; z-index:0; pointer-events:none; }
.sl-gantt-groupband > .sl-gantt-bar { pointer-events:auto; }
.sl-gantt-bar--group {
  background-image:repeating-linear-gradient(45deg,var(--ink-200) 0 2px,transparent 2px 5px);
  border-style:dashed; justify-content:center;
}
.sl-gantt-bar--crew { border-style:dashed; }
.sl-gantt-bar--shadow { background-image:repeating-linear-gradient(45deg,var(--ink-200) 0 2px,transparent 2px 5px); border-style:dashed; opacity:.85; }
.sl-gantt-bar--shadow > .sl-gantt-bar-l > b { font-weight:var(--fw-medium,500); }
.sl-gantt-bar.is-clash { border-color:var(--tag-danger-text); box-shadow:0 0 0 1px var(--tag-danger-text); }
.sl-gantt-bar.is-clash .sl-gantt-bar-l > svg:last-of-type { color:var(--tag-danger-text); }
.sl-gantt-bar-l { display:flex; min-width:0; align-items:center; gap:4px; line-height:1.2; }
.sl-gantt-bar-l > i { width:6px; height:6px; flex:0 0 auto; border-radius:var(--radius-pill,100px); background:currentColor; }
.sl-gantt-bar-l > b { min-width:0; overflow:hidden; color:var(--sched-text,var(--text-strong,var(--ink))); font-size:var(--text-2xs); font-weight:var(--fw-semibold,600); text-overflow:ellipsis; white-space:nowrap; }
.sl-gantt-bar-l > svg { flex:0 0 auto; }
.sl-gantt-bar > span.mono { min-width:0; overflow:hidden; color:var(--sched-text,var(--ink)); opacity:.75; font-family:var(--font-mono); font-size:9px; text-overflow:ellipsis; white-space:nowrap; }
.sl-gantt-none { padding:var(--space-8) var(--space-5); color:var(--text-subtle,var(--ink-400)); font-size:var(--text-xs); }

.sl-cal-mode { display:flex; min-width:0; flex-direction:column; gap:12px; }
.sl-cal-mode > header { display:flex; align-items:baseline; gap:9px; flex-wrap:wrap; }
.sl-cal-mode > header h3 { margin:0; color:var(--text-strong,var(--ink)); font:800 20px var(--font-display); letter-spacing:-.02em; }
.sl-cal-mode > header .cal-navico,.sl-cal-mode > header .abtn { align-self:center; }
.sl-calendar { overflow-x:auto; overflow-y:hidden; overscroll-behavior-inline:contain; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); box-shadow:var(--shadow-xs,var(--shadow-1)); -webkit-overflow-scrolling:touch; }
.sl-month-wrap { min-width:760px; overflow:visible; }
.sl-month-wd,.sl-month-grid { display:grid; grid-template-columns:repeat(7,1fr); }
.sl-month-wd { background:var(--surface-1,var(--paper-warm)); border-bottom:1px solid var(--line-200,var(--line)); }
.sl-month-wd span { padding:9px 12px; color:var(--text-subtle,var(--ink-400)); font:600 11px var(--font-mono); letter-spacing:.08em; text-align:left; text-transform:uppercase; }
.sl-month-wd span:first-child { color:var(--accent-red,var(--danger)); }
.sl-month-grid { grid-auto-rows:minmax(98px,auto); }
.sl-month-cell { min-height:98px; padding:7px 8px; background:var(--surface-0,var(--paper)); border-right:1px solid var(--line-100,var(--line-soft)); border-bottom:1px solid var(--line-100,var(--line-soft)); opacity:1; }
.sl-month-cell.out { background:var(--surface-1,var(--paper-warm)); opacity:1; }
.sl-month-cell:nth-child(7n) { border-right:0; }
.sl-cal-day-top { display:flex!important; align-items:center; justify-content:space-between; flex-direction:row!important; gap:0!important; margin:0 0 5px!important; }
.sl-cal-day-top > span { display:inline-flex; min-width:22px; height:22px; align-items:center; justify-content:center; padding:0 5px; color:var(--text-body,var(--ink-700)); border-radius:999px; font:500 12.5px var(--font-mono); }
.sl-month-cell.out .sl-cal-day-top > span { color:var(--text-disabled,var(--ink-300)); }
.sl-month-cell.today .sl-cal-day-top > span { color:#fff; background:var(--vs-black,var(--ink)); font-weight:700; }
.sl-cal-day-top > em { color:var(--text-disabled,var(--ink-300)); font:600 10px var(--font-mono); font-style:normal; }
.sl-month-cell > div:last-child { display:flex; flex-direction:column; gap:3px; margin:0; }
.sl-month-cell > div:last-child button { display:flex; width:100%; align-items:center; gap:5px; overflow:hidden; padding:3px 6px; color:var(--sched-text,var(--ink)); text-align:left; background:var(--sched-bg,var(--paper-warm)); border:1px solid var(--sched-border,var(--line)); border-left:3px solid var(--sched-accent,var(--ink-400)); border-radius:var(--radius-xs,6px); cursor:pointer; font:600 11px var(--font-body); }
.sl-month-cell > div:last-child button > b { flex:0 0 auto; color:var(--sched-text,var(--ink)); font-size:10px; }
.sl-month-cell > div:last-child button > span:last-child { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sl-month-cell > div:last-child .sl-month-more { padding:2px 4px; color:var(--text-muted,var(--ink-500)); background:transparent; border:0; font-weight:600; }

.sl-sk-board { display:flex; gap:12px; overflow:hidden; }
.sl-sk-board > div { display:flex; width:296px; min-width:296px; flex-direction:column; gap:10px; padding:12px; background:var(--surface-1,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); }
.sl-sk-board i,.sl-sk-board span,.sl-sk-calendar span,.sl-sk-table i,.sl-sk-table b { display:block; background:linear-gradient(90deg,var(--ink-050),var(--ink-100),var(--ink-050)); background-size:220% 100%; border-radius:7px; animation:sl-shimmer 1.2s linear infinite; }
.sl-sk-board i { width:55%; height:14px; }
.sl-sk-board span { height:72px; }
.sl-sk-calendar { display:grid; grid-template-columns:repeat(7,1fr); gap:8px; padding:16px; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); }
.sl-sk-calendar span { height:76px; }
.sl-sk-table { overflow:hidden; background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px); }
.sl-sk-table > i { width:38%; height:12px; margin:13px 14px; }
.sl-sk-table > span { display:flex; align-items:center; gap:14px; padding:13px 14px; border-top:1px solid var(--line-100,var(--line-soft)); }
.sl-sk-table b { height:12px; flex:1; }
@keyframes sl-shimmer { to { background-position:-220% 0; } }

.sg-readonly { display:flex; align-items:flex-start; gap:10px; padding:11px 13px; color:var(--tag-warning-text,#b54708); background:var(--tag-warning-bg,#fffbea); border:1px solid var(--tag-warning-border,#fddf89); border-radius:var(--radius-sm,8px); font-size:12.5px; }
.sg-readonly span { display:flex; flex-direction:column; gap:2px; }
.sg-readonly code { font-family:var(--font-mono); }
.sg-toolbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.sg-toolbar > div:first-child { min-width:0; }
.sg-toolbar p { margin:2px 0 0; color:var(--text-subtle,var(--ink-400)); font-size:13px; }
.sg-readonly-switch { display:flex; align-items:center; gap:8px; color:var(--text-strong,var(--ink)); font-size:13px; font-weight:600; cursor:pointer; }
.sg-readonly-switch input,.sg-toggle input { position:absolute; opacity:0; pointer-events:none; }
.sg-readonly-switch i,.sg-toggle i { position:relative; display:block; width:38px; height:22px; background:var(--ink-200,#d9dce2); border-radius:999px; transition:background .15s ease; }
.sg-readonly-switch i::after,.sg-toggle i::after { content:""; position:absolute; top:3px; left:3px; width:16px; height:16px; background:#fff; border-radius:50%; box-shadow:0 1px 3px rgba(5,5,5,.22); transition:transform .15s ease; }
.sg-readonly-switch input:checked + i,.sg-toggle input:checked + i { background:var(--vs-black,var(--ink)); }
.sg-readonly-switch input:checked + i::after,.sg-toggle input:checked + i::after { transform:translateX(16px); }
.sg-readonly-switch input:focus-visible + i,.sg-toggle input:focus-visible + i { outline:2px solid var(--electric-blue,#2563eb); outline-offset:3px; }
.sg-table-card footer { display:flex; align-items:center; gap:7px; padding:11px 16px; color:var(--text-subtle,var(--ink-400)); border-top:1px solid var(--line-100,var(--line-soft)); font-size:12.5px; }
.sg-table tr.inactive { opacity:.6; }
.sg-table td { padding:12px 14px; }
.sg-target { display:inline-flex; align-items:center; min-height:23px; padding:0 8px; color:var(--tag-blue-text,#2f63b7); background:var(--tag-blue-bg,#eef4ff); border:1px solid var(--tag-blue-border,#baccf4); border-radius:999px; font-size:11px; font-weight:600; }
.sg-target.all { color:var(--tag-neutral-text,#3a3d45); background:var(--tag-neutral-bg,#f7f8fa); border-color:var(--tag-neutral-border,#e1e4ea); }
.sg-status { padding:0; background:transparent; border:0; cursor:pointer; }
.sg-status .badge-st { display:inline-flex; align-items:center; gap:5px; }
.sg-status .badge-st i { width:5px; height:5px; background:currentColor; border-radius:50%; }
.sg-status:disabled { cursor:default; }
.sg-table .icon-btn { display:inline-flex; width:32px; height:32px; align-items:center; justify-content:center; padding:0; color:var(--text-muted,var(--ink-500)); background:transparent; border:0; border-radius:var(--radius-xs,6px); cursor:pointer; }
.sg-table .icon-btn:hover:not(:disabled) { color:var(--text-strong,var(--ink)); background:var(--surface-1,var(--paper-warm)); }
.sg-table .icon-btn:disabled { opacity:.4; cursor:not-allowed; }

.sg-editor { display:flex; flex-direction:column; gap:16px; }
.sg-field { display:flex; min-width:0; flex-direction:column; gap:6px; }
.sg-field > label { color:var(--text-strong,var(--ink)); font-size:13px; font-weight:600; }
.sg-field > small { color:var(--text-subtle,var(--ink-400)); font-size:12px; }
.sg-field > small.error { color:var(--accent-red,var(--danger)); }
.sg-field .ctrl.is-error { border-color:var(--accent-red,var(--danger)); }
.sg-type-tabs { display:inline-flex; max-width:100%; gap:3px; overflow-x:auto; padding:3px; background:var(--ink-050,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,8px); }
.sg-type-tabs button { flex:1; padding:7px 12px; color:var(--text-muted,var(--ink-500)); background:transparent; border:0; border-radius:var(--radius-xs,6px); cursor:pointer; font:600 12.5px var(--font-body); white-space:nowrap; }
.sg-type-tabs button.active { color:var(--text-strong,var(--ink)); background:var(--surface-0,var(--paper)); box-shadow:var(--shadow-xs,var(--shadow-1)); }
.sg-weekdays { display:flex; gap:6px; flex-wrap:wrap; }
.sg-weekdays button { width:42px; height:38px; color:var(--text-muted,var(--ink-500)); background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,8px); cursor:pointer; font:600 12.5px var(--font-body); }
.sg-weekdays button.active { color:#fff; background:var(--vs-black,var(--ink)); border-color:var(--vs-black,var(--ink)); }
.sg-date-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }
.sg-switch-card { display:flex; align-items:center; justify-content:space-between; gap:14px; padding:12px 14px; background:var(--surface-1,var(--paper-warm)); border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,8px); }
.sg-switch-card.plain { background:var(--surface-0,var(--paper)); }
.sg-switch-card > span { display:flex; flex-direction:column; gap:2px; }
.sg-switch-card b { color:var(--text-strong,var(--ink)); font-size:13.5px; }
.sg-switch-card small { color:var(--text-subtle,var(--ink-400)); font-size:12px; }
.sg-toggle { flex:0 0 auto; cursor:pointer; }

@media (max-width:900px) {
  .sl-list-item { flex-wrap:wrap; }
  .sl-list-main { flex-basis:calc(100% - 112px); }
  .sg-toolbar { align-items:flex-start; }
  .sg-toolbar > .grow { display:none; }
}
@media (max-width:600px) {
  .sl-list-when { display:none; }
  .sl-list-main { flex-basis:calc(100% - 50px); }
  .sl-list-item > .badge-st,.sl-list-item > .sl-pay-chip,.sl-list-item > strong { margin-left:44px; }
  .sl-bulk { align-items:stretch; flex-direction:column; }
  .sl-bulk > .grow { display:none; }
  .sl-bulk button { justify-content:center; }
  .sl-gantt > header { align-items:flex-start; flex-wrap:wrap; }
  .sl-gantt > header > .grow { display:none; }
  .sg-date-grid { grid-template-columns:1fr; }
  .sg-toolbar .abtn { flex:1; }
}
@media (prefers-reduced-motion:reduce) {
  .sched-workspace,
  .schedule-layer,
  .schedule-detail-layer,
  .sched-doc-overlay,
  .sched-doc-modal,
  .schedule-toast-host,
  .sched-workspace *,
  .sched-workspace *::before,
  .sched-workspace *::after,
  .schedule-layer *,
  .schedule-layer *::before,
  .schedule-layer *::after,
  .schedule-detail-layer *,
  .schedule-detail-layer *::before,
  .schedule-detail-layer *::after,
  .sched-doc-overlay::before,
  .sched-doc-overlay::after,
  .sched-doc-overlay *,
  .sched-doc-overlay *::before,
  .sched-doc-overlay *::after,
  .schedule-toast-host *,
  .schedule-toast-host *::before,
  .schedule-toast-host *::after { animation-duration:.01ms!important; animation-iteration-count:1!important; scroll-behavior:auto!important; transition-duration:.01ms!important; }
}
/* == /SCHEDULE-PROTOTYPE-1TO1 ================================================ */

/* == SCHEDULE-1TO1 CSS-PARITY (computed-style prototype "Schedule Module.html") ==
   Menyelaraskan komponen bersama Schedule ke nilai persis VS Design System v2.0.
   Scope: .schedule-layer (kalender/overlay) + .admin-top__tools .sched-action (aksi topbar).
   Diukur langsung dari getComputedStyle prototype vs admin. */

/* — Segmented control (view switcher kalender + mode Daftar Jadwal): active = pil PUTIH
     + shadow-xs (prototype), bukan pil hitam. Track abu, tombol 13.5px/600, padding 7×14, radius 6. */
.schedule-layer :is(.sched-calendar-toolbar,.sched-control-deck) .seg { background:#F2F4F7; border:1px solid var(--line-200,#E6E8EE); border-radius:10px; padding:3px; gap:3px; }
.schedule-layer :is(.sched-calendar-toolbar,.sched-control-deck) .seg-btn { min-height:36px; padding:7px 14px; border-radius:6px; font-size:13.5px; font-weight:600; gap:7px; color:var(--text-muted,#3A3D45); }
.schedule-layer :is(.sched-calendar-toolbar,.sched-control-deck) .seg-btn.active { background:var(--surface-0,#fff); color:var(--text-strong,#050505); box-shadow:var(--shadow-xs,0 1px 2px rgba(5,5,5,.05)); }
.schedule-layer :is(.sched-calendar-toolbar,.sched-control-deck) .seg-btn.active svg { color:var(--text-strong,#050505); }

/* — Button: VS.Button = radius-xs 6px, 14px/600, gap 9 (admin default radius 10/13px/620).
     Berlaku di konten Schedule + semua overlay-nya (drawer detail, dokumen, dialog, composer). */
:is(.schedule-layer,.schedule-detail-layer,.sched-doc-overlay,.sched-doc-drawer,.modal-back.schedule-layer,.modal-center.schedule-layer) .abtn,
.admin-top__tools .sched-action.abtn { border-radius:6px; font-size:14px; font-weight:600; gap:9px; }
:is(.schedule-layer,.schedule-detail-layer,.sched-doc-overlay,.sched-doc-drawer,.modal-back.schedule-layer,.modal-center.schedule-layer) .abtn--sm,
.admin-top__tools .sched-action.abtn--sm { font-size:13.5px; }

/* — Filter select + tombol prev/next: radius-xs 6, tinggi 36 (VS.Select sm / IconButton). */
.schedule-layer .sched-calendar-card :is(.cal-filterbar select,.cal-navico) { border-radius:6px; min-height:36px; }
/* — Date-picker pill + "Hari ini" + Reset: radius-sm 10, tinggi 36 (prototype DateNav). */
.schedule-layer .cal-datenav :is(.cal-datepill,.abtn) { border-radius:10px; min-height:36px; }
.schedule-layer .sched-calendar-card .cal-filter-reset { border-radius:10px; }

/* — Panel kalender: DS shadow-card ambient (0 6px 20px), bukan shadow ketat 1px. */
.schedule-layer .sched-calendar-card { box-shadow:0 1px 2px rgba(5,5,5,.04), 0 6px 20px rgba(5,5,5,.06); }

/* — Kicker (BULAN VIEW / label seksi drawer): 10.5px / weight 600 (admin 10px/700). */
:is(.schedule-layer,.schedule-detail-layer,.sched-doc-overlay,.sched-doc-drawer,.modal-center.schedule-layer) .sched-kicker { font-size:10.5px; font-weight:600; }

/* — Brand-count badge di brand tab: weight 700 (prototype). */
.schedule-layer .cal-brand-tab em { font-weight:700; }

/* — Ikon brand chip: swatch #FFE500 (BRANDS.vs.swatch), radius 3px — bukan --identity-yellow #FFF700. */
.schedule-layer .cal-brand-icon { border-radius:3px; }
.schedule-layer .cal-brand-icon--vs { background:#FFE500; }

/* — SubNav tab (VS.Tabs underline): 14px, padding 11×14, gap 4 (admin 13px/pad 0-1-11/gap 24). */
.schedule-layer .sched-subnav { gap:4px; }
.schedule-layer .sched-subnav a { padding:11px 14px; font-size:14px; min-height:auto; }

/* ---- FIX overflow/overlap (owner report) ---------------------------------- */
/* Attention detail card (cal-attn-list): baris footer = nested flex + space-between
   → tanpa width eksplisit ia melebar ke max-content (309px) & bocor ke kartu tetangga.
   Kunci semua baris kartu ke 100% + klip kartu; date span sudah flex:1/min-0/ellipsis. */
.sched-view--calendar .cal-attn-item { overflow:hidden; }
.cal-attn-card-head, .cal-attn-card-meta, .cal-attn-card-foot, .cal-attn-card-lines { width:100%; }
.cal-attn-card-foot > span { max-width:100%; }

/* Grup tabel Daftar Jadwal (sl-table-group): <b> nama grup kena display:block dari
   aturan sel tabel → dot/nama/hitungan menumpuk vertikal (td 79px). Paksa inline sebaris. */
.sl-table-group td { white-space:nowrap; }
.sl-table-group td > b { display:inline; vertical-align:middle; }
.sl-table-group td > .sl-group-dot { vertical-align:middle; }
.sl-table-group td > em { vertical-align:middle; }

/* Kolom "when" mode Daftar (sl-list-when): 54px terlalu sempit untuk "17 Agu 2026"
   (mono ~69px) → tanggal bocor. Lebarkan agar muat. */
.sl-list-when { width:72px; }
/* == /SCHEDULE-1TO1 CSS-PARITY ============================================== */

/* ============================================================================
   MODUL CUSTOMERS V2 — reproduksi 1:1 master "Customers.dc.html" (12.42.07R)
   Sumber: claude.ai/design project d027a928 · file Customers.dc.html
   Semua warna/spasi/radius/tipografi memakai token DS (app.css DS-bridge).
   Scope:
     .cust2     → isi halaman (di dalam .content shell admin)
     .cust2-ov  → drawer / modal / toast (di dalam #adminOverlay)
   Prefix scope wajib: admin.css & app.css sudah memakai .panel/.tbl/.stat/
   .filters/.btn/.drawer/.modal untuk komponen lama — tanpa scope akan bentrok.
   ========================================================================== */
.cust2, .cust2-ov { font-family:var(--font-body); color:var(--text-body); }
.cust2 { display:flex; flex-direction:column; gap:16px; min-width:0; }
.cust2 a { color:var(--text-strong); text-decoration:none; }
.cust2 a:hover { color:var(--ink-600); }
.cust2 button, .cust2-ov button { font-family:inherit; }
.cust2 .mono, .cust2-ov .mono { font-family:var(--font-mono); }
.cust2 .tnum, .cust2-ov .tnum { font-variant-numeric:tabular-nums; }

/* ---------- subnav terpadu (2 tingkat: Identitas / Antrean) ---------- */
.cust2 .subnav { display:flex; flex-direction:column; gap:9px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); padding:11px 13px; box-shadow:var(--shadow-card); }
.cust2 .subrow { display:flex; align-items:center; gap:7px; }
.cust2 .subrow-scroll { display:flex; align-items:center; gap:7px; flex-wrap:wrap; min-width:0; }
.cust2 .subrow-label { flex:0 0 auto; font-family:var(--font-mono); font-size:10px; letter-spacing:.12em; text-transform:uppercase; color:var(--text-subtle); width:64px; }
.cust2 .subtab { display:inline-flex; align-items:center; gap:7px; min-height:36px; padding:7px 11px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-muted); font:600 12.5px var(--font-body); cursor:pointer; transition:all .14s ease; white-space:nowrap; }
.cust2 .subtab:hover { border-color:var(--ink-300); color:var(--text-strong); }
.cust2 .subtab.is-active { background:var(--ink-900); color:var(--primary-contrast); border-color:var(--ink-900); }
.cust2 .subcount { font-family:var(--font-mono); font-size:11px; min-width:22px; text-align:center; padding:1px 6px; border-radius:100px; background:var(--surface-1); color:var(--text-muted); }
.cust2 .subtab.is-active .subcount { background:rgba(255,255,255,.18); color:var(--primary-contrast); }
.cust2 .subtab.q-warn { background:var(--tag-warning-bg); border-color:var(--tag-warning-border); color:var(--tag-warning-text); }
.cust2 .subtab.q-danger { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); color:var(--tag-danger-text); }
.cust2 .subtab.q-orange { background:var(--tag-orange-bg); border-color:var(--tag-orange-border); color:var(--tag-orange-text); }
.cust2 .subtab.q-blue { background:var(--tag-blue-bg); border-color:var(--tag-blue-border); color:var(--tag-blue-text); }
.cust2 .subtab.q-neutral { background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); color:var(--tag-neutral-text); }
.cust2 .subtab[class*=q-]:hover { filter:brightness(.97); }
.cust2 .subtab[class*=q-] .subcount { background:rgba(0,0,0,.06); color:inherit; }
@media (max-width:720px){
  .cust2 .subrow-scroll { flex-wrap:nowrap; overflow-x:auto; padding-bottom:3px; width:100%; min-width:0; }
  .cust2 .subrow-label { width:auto; }
  .cust2 .subrow { align-items:flex-start; flex-direction:column; gap:4px; }
}

/* ---------- banner ---------- */
.cust2 .banner { display:flex; align-items:flex-start; gap:10px; padding:11px 14px; border-radius:var(--radius-sm); font-size:12.5px; line-height:1.5; }
.cust2 .banner .bic { flex:0 0 auto; margin-top:1px; display:flex; }
.cust2 .banner-info { background:var(--tag-blue-bg); border:1px solid var(--tag-blue-border); color:var(--tag-blue-text); }
.cust2 .banner-ok { background:var(--tag-success-bg); border:1px solid var(--tag-success-border); color:var(--tag-success-text); }
.cust2 .banner-warn { background:var(--tag-warning-bg); border:1px solid var(--tag-warning-border); color:var(--tag-warning-text); }
.cust2 .banner-neutral { background:var(--surface-1); border:1px solid var(--line-200); color:var(--text-muted); }

/* ---------- KPI ---------- */
.cust2 .kpi6 { display:grid; grid-template-columns:repeat(6,1fr); gap:11px; }
@media (max-width:1100px){ .cust2 .kpi6 { grid-template-columns:repeat(3,1fr); } }
@media (max-width:640px){ .cust2 .kpi6 { grid-template-columns:repeat(2,1fr); } }
.cust2 .kpi8 { display:grid; grid-template-columns:repeat(4,1fr); gap:11px; }
@media (max-width:860px){ .cust2 .kpi8 { grid-template-columns:repeat(2,1fr); } }
.cust2 .c2stat { position:relative; text-align:left; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); padding:14px 15px; box-shadow:var(--shadow-card); cursor:pointer; transition:border-color .14s, box-shadow .12s, transform .12s; display:flex; flex-direction:column; gap:3px; min-width:0; }
.cust2 .c2stat:hover { border-color:var(--ink-900); box-shadow:var(--shadow-1,0 6px 20px rgba(5,5,5,.08)); transform:translateY(-1px); }
.cust2 .c2stat:focus-visible { border-color:var(--ink-900); box-shadow:var(--shadow-focus); outline:0; }
.cust2 .c2stat.accent { background:var(--ink-900); border-color:var(--ink-900); color:var(--primary-contrast); }
.cust2 .c2stat.is-active { box-shadow:0 0 0 2px var(--ink-900) inset; }
.cust2 .c2stat.accent.is-active { box-shadow:0 0 0 2px rgba(255,255,255,.55) inset; }
.cust2 .c2stat .num { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:26px; font-weight:700; line-height:1.05; color:var(--text-strong); }
.cust2 .c2stat.accent .num { color:var(--primary-contrast); }
.cust2 .c2stat .lbl { font-size:12px; font-weight:600; color:var(--text-strong); }
.cust2 .c2stat.accent .lbl { color:var(--primary-contrast); }
.cust2 .c2stat .sub { font-size:11px; color:var(--text-subtle); }
.cust2 .c2stat.accent .sub { color:var(--text-on-dark-muted); }
.cust2 .c2stat .go { position:absolute; top:12px; right:12px; color:var(--text-subtle); display:flex; }
.cust2 .kpi8 .c2stat { padding:16px; min-height:128px; }
.cust2 .kpi8 .c2stat .kpi-ic { color:var(--text-subtle); margin-bottom:2px; display:flex; }
.cust2 .kpi8 .c2stat > span:last-child { margin-top:auto; }
.cust2 .c2stat .kpi-soft { width:34px; height:34px; border-radius:10px; display:inline-flex; align-items:center; justify-content:center; margin-bottom:10px; color:var(--text-muted); background:var(--surface-1); }
.cust2 .c2stat.accent .kpi-soft { background:rgba(255,255,255,.14); color:var(--primary-contrast); }
.cust2 .kpi6 .c2stat .kpi-soft.t-blue { background:var(--tag-blue-bg); color:var(--tag-blue-text); }
.cust2 .kpi6 .c2stat .kpi-soft.t-mint { background:var(--tag-mint-bg); color:var(--tag-mint-text); }
.cust2 .kpi6 .c2stat .kpi-soft.t-purple { background:var(--tag-purple-bg); color:var(--tag-purple-text); }
.cust2 .kpi6 .c2stat .kpi-soft.t-orange { background:var(--tag-orange-bg); color:var(--tag-orange-text); }
.cust2 .kpi6 .c2stat .kpi-soft.t-warning { background:var(--tag-warning-bg); color:var(--tag-warning-text); }

/* ---------- filter bar + kontrol ---------- */
.cust2 .c2filters { display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.cust2 .searchbox { display:flex; align-items:center; gap:8px; height:38px; padding:0 12px; border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); min-width:230px; flex:1 1 230px; max-width:360px; }
.cust2 .searchbox > svg { flex:0 0 auto; color:var(--text-subtle); }
.cust2 .searchbox input { border:0; outline:0; background:transparent; font:400 13.5px var(--font-body); color:var(--text-strong); width:100%; }
.cust2 .field { height:38px; padding:0 11px; border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); font:500 12.5px var(--font-body); color:var(--text-strong); cursor:pointer; max-width:100%; }
.cust2 .field:focus-visible { outline:0; box-shadow:var(--shadow-focus); }
.cust2 .c2btn { display:inline-flex; align-items:center; justify-content:center; gap:7px; height:38px; padding:0 13px; border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-strong); font:600 12.5px var(--font-body); cursor:pointer; transition:all .14s ease; white-space:nowrap; }
.cust2-ov .c2btn { display:inline-flex; align-items:center; justify-content:center; gap:7px; height:38px; padding:0 13px; border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-strong); font:600 12.5px var(--font-body); cursor:pointer; transition:all .14s ease; white-space:nowrap; }
.cust2 .c2btn:hover, .cust2-ov .c2btn:hover { background:var(--surface-1); }
.cust2 .c2btn--dark, .cust2-ov .c2btn--dark { background:var(--ink-900); color:var(--primary-contrast); border-color:var(--ink-900); }
.cust2 .c2btn--dark:hover, .cust2-ov .c2btn--dark:hover { background:var(--primary-hover); }
.cust2 .c2btn--danger, .cust2-ov .c2btn--danger { color:var(--accent-red); border-color:var(--tag-danger-border); }
.cust2 .c2btn--danger:hover, .cust2-ov .c2btn--danger:hover { background:var(--tag-danger-bg); }
.cust2 .c2btn--sm, .cust2-ov .c2btn--sm { height:32px; padding:0 10px; font-size:12px; gap:5px; }
.cust2 .c2btn--icon, .cust2-ov .c2btn--icon { width:38px; padding:0; }
.cust2 .c2btn--icon.c2btn--sm, .cust2-ov .c2btn--icon.c2btn--sm { width:32px; }
.cust2 .c2btn:disabled, .cust2-ov .c2btn:disabled { opacity:.42; cursor:not-allowed; }

/* ---------- panel + tabel ---------- */
.cust2 .c2panel, .cust2-ov .c2panel { background:var(--surface-0); border:1px solid var(--line-200); border-radius:14px; box-shadow:var(--shadow-card); overflow:hidden; }
.cust2 .c2panel-head { display:flex; align-items:center; gap:10px; padding:15px 20px; border-bottom:1px solid var(--line-100); }
.cust2 .c2panel-head > svg { flex:0 0 auto; }
.cust2 .c2panel-head h2 { font-family:var(--font-body); font-size:14.5px; font-weight:700; color:var(--text-strong); margin:0; }
.cust2 .c2panel-head .count { margin-left:auto; font-family:var(--font-mono); font-size:12px; color:var(--text-subtle); }
.cust2 .c2panel-body { padding:18px; }
.cust2 .c2panel-body.flush { padding:0; }
.cust2 .c2tbl, .cust2-ov .c2tbl { width:100%; border-collapse:collapse; font-size:13px; }
.cust2 .c2tbl thead th, .cust2-ov .c2tbl thead th { text-align:left; font:600 10.5px/1 var(--font-mono); letter-spacing:.07em; text-transform:uppercase; color:var(--text-subtle); padding:11px 14px; border-bottom:1px solid var(--line-200); background:var(--surface-1); white-space:nowrap; }
.cust2 .c2tbl td, .cust2-ov .c2tbl td { padding:11px 14px; border-bottom:1px solid var(--line-100); vertical-align:middle; color:var(--text-body); }
.cust2 .c2tbl tbody tr:last-child td, .cust2-ov .c2tbl tbody tr:last-child td { border-bottom:0; }
.cust2 .c2tbl tbody tr.clickable { cursor:pointer; transition:background .12s; }
.cust2 .c2tbl tbody tr.clickable:hover { background:var(--surface-1); }
.cust2 .empty-row td, .cust2-ov .empty-row td { text-align:center; color:var(--text-subtle); padding:44px 20px; }
.cust2 .nm, .cust2-ov .nm { font-size:13.5px; font-weight:600; color:var(--text-strong); display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
.cust2 .rowsub, .cust2-ov .rowsub { font-family:var(--font-mono); font-size:11.5px; color:var(--text-subtle); margin-top:2px; }
.cust2 .rowtog { width:28px; height:28px; border:1px solid var(--line-200); border-radius:8px; background:var(--surface-0); display:inline-flex; align-items:center; justify-content:center; cursor:pointer; color:var(--text-muted); transition:transform .16s ease, background .12s, color .12s; }
.cust2 .rowtog:hover { background:var(--surface-1); color:var(--text-strong); border-color:var(--ink-300); }
.cust2 .rowtog.open { transform:rotate(90deg); background:var(--ink-900); border-color:var(--ink-900); color:var(--primary-contrast); }
/* Baris detail tersembunyi sampai .rowtog dibuka (toggle di DOM, tanpa re-render). */
.cust2 .c2tbl tbody tr.detail-row:not(.is-open) { display:none; }
.cust2 .c2tbl tbody tr.detail-row td { padding:0; background:var(--surface-1); }
.cust2 .detail-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:12px 20px; padding:14px 18px; }
.cust2 .detail-grid .dk { display:block; font:600 10px var(--font-mono); letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); margin-bottom:3px; }
.cust2 .detail-grid .dv { font-size:13px; color:var(--text-strong); }
@media (max-width:760px){ .cust2 .detail-grid { grid-template-columns:1fr 1fr; } }
.cust2-ov .note-card { display:flex; gap:11px; padding:11px 12px; border:1px solid var(--line-200); border-radius:12px; background:var(--surface-0); box-shadow:var(--shadow-card); }
.cust2-ov .note-card.nt-blue { background:var(--tag-blue-bg); border-color:var(--tag-blue-border); }
.cust2-ov .note-card.nt-danger { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); }
.cust2-ov .note-card.nt-orange { background:var(--tag-orange-bg); border-color:var(--tag-orange-border); }
.cust2-ov .note-card.nt-warning { background:var(--tag-warning-bg); border-color:var(--tag-warning-border); }
.cust2-ov .note-card.nt-neutral { background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); }

/* ---------- view switcher ---------- */
.cust2 .viewbar { display:flex; align-items:center; gap:12px; flex-wrap:wrap; background:var(--surface-0); border:1px solid var(--line-200); border-radius:14px; padding:8px 10px; box-shadow:var(--shadow-card); }
.cust2 .viewseg { display:flex; align-items:center; gap:4px; flex-wrap:wrap; min-width:0; }
.cust2 .viewtab { display:inline-flex; align-items:center; gap:7px; min-height:38px; padding:8px 13px; border:1px solid transparent; border-radius:9px; background:transparent; color:var(--text-muted); font:600 13px var(--font-body); cursor:pointer; white-space:nowrap; transition:all .14s ease; }
.cust2 .viewtab:hover { background:var(--surface-1); color:var(--text-strong); }
.cust2 .viewtab.is-active { background:var(--surface-0); color:var(--text-strong); border-color:var(--line-200); box-shadow:var(--shadow-card); }
.cust2 .viewtab svg { flex:0 0 auto; }
.cust2 .viewbar-group { margin-left:auto; font-family:var(--font-mono); font-size:10px; letter-spacing:.12em; text-transform:uppercase; color:var(--text-subtle); }
@media (max-width:760px){ .cust2 .viewbar-group { margin-left:0; } .cust2 .viewseg { overflow-x:auto; flex-wrap:nowrap; } }
.cust2 .c2tbl tbody tr.grp-row td { padding:0; background:var(--surface-1); }
.cust2 .grp-head { display:flex; align-items:center; gap:9px; padding:11px 16px; background:var(--surface-1); }
.cust2 .grp-head .gt { font:700 12px var(--font-body); color:var(--text-strong); }
.cust2 .grp-head .gc, .cust2 .board-col-head .gc { font-family:var(--font-mono); font-size:11px; color:var(--text-muted); background:var(--surface-0); border:1px solid var(--line-200); border-radius:100px; padding:1px 8px; }

/* ---------- galeri ---------- */
.cust2 .gallery { display:grid; grid-template-columns:repeat(auto-fill,minmax(238px,1fr)); gap:12px; padding:16px; }
.cust2 .gcard { display:flex; flex-direction:column; gap:10px; padding:15px; border:1px solid var(--line-200); border-radius:14px; background:var(--surface-0); box-shadow:var(--shadow-card); cursor:pointer; text-align:left; font:inherit; color:inherit; transition:border-color .14s, box-shadow .14s, transform .14s; }
.cust2 .gcard:hover { border-color:var(--ink-900); box-shadow:var(--shadow-pop); transform:translateY(-2px); }
/* Fill kartu galeri: tint halus satu arah (150deg → surface di 60%), hue diambil
   dari keluarga badge tier. SATU rumus & satu persentase untuk semua varian —
   sebelumnya tiap varian pakai token & persen berbeda (10/14/15/30/15/18%). */
.cust2 .gcard[class*="gs-"] {
  background:linear-gradient(150deg,color-mix(in srgb,var(--t-tint) 16%,var(--surface-0)),var(--surface-0) 60%);
}
/* Label kecil (kicker mono 9,5px + kode) dinaikkan dari --text-subtle ke
   --text-muted: di atas tint mana pun subtle cuma 3,6:1 — di bawah ambang baca. */
.cust2 .gcard[class*="gs-"] :is(.gk,.gmk,.gcard-code) { color:var(--text-muted); }
.cust2 .gcard.gs-silver   { --t-tint:#c9cdd6; }
.cust2 .gcard.gs-ocean    { --t-tint:#1f79c0; }
.cust2 .gcard.gs-cosmic   { --t-tint:#6d28d9; }
.cust2 .gcard.gs-golden   { --t-tint:#e9c02a; }
.cust2 .gcard.gs-emerald  { --t-tint:#0f9d6e; }
.cust2 .gcard.gs-graphite { --t-tint:#5a5a5a; }
.cust2 .gcard-top { display:flex; align-items:center; gap:11px; }
.cust2 .gcard-av { width:40px; height:40px; border-radius:50%; background:var(--ink-900); color:var(--primary-contrast); display:flex; align-items:center; justify-content:center; font:700 14px var(--font-display); flex:0 0 auto; }
.cust2 .gcard-nm { font-size:14px; font-weight:700; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cust2 .gcard-code { font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle); }
.cust2 .gcard-stats { display:grid; grid-template-columns:1fr 1fr; gap:8px; border-top:1px solid var(--line-100); padding-top:10px; }
.cust2 .gcard-stats .gk { font-family:var(--font-mono); font-size:9px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); }
.cust2 .gcard-stats .gv { font-family:var(--font-mono); font-size:13px; font-weight:700; color:var(--text-strong); }
.cust2 .gcard-meta { display:flex; align-items:center; justify-content:space-between; gap:8px; border-top:1px solid var(--line-100); padding-top:10px; }
.cust2 .gcard-meta .gmk { font-family:var(--font-mono); font-size:9px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); }
.cust2 .gcard-meta .gmv { font-size:12px; font-weight:600; color:var(--text-strong); }
.cust2 .gcard-badges { display:grid; grid-template-columns:1fr 1fr; gap:5px 12px; border-top:1px solid var(--line-100); padding-top:9px; }
.cust2 .abadge.bflat { background:transparent!important; border-color:transparent!important; padding:0; gap:6px; font-weight:500; font-size:10.5px; color:var(--text-muted)!important; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cust2 .abadge.bflat::before { content:""; width:6px; height:6px; border-radius:50%; background:var(--text-subtle); display:inline-block; flex:0 0 auto; }
.cust2 .abadge.bflat.ab-green::before, .cust2 .abadge.bflat.ab-mint::before { background:var(--tag-success-text); }
.cust2 .abadge.bflat.ab-blue::before, .cust2 .abadge.bflat.ab-indigo::before { background:var(--tag-blue-text); }
.cust2 .abadge.bflat.ab-red::before { background:var(--accent-red); }
.cust2 .abadge.bflat.ab-orange::before, .cust2 .abadge.bflat.ab-amber::before { background:var(--tag-orange-text); }
.cust2 .abadge.bflat.ab-gold::before { background:var(--vs-yellow-shadow); }

/* ---------- board ---------- */
.cust2 .board { display:flex; gap:12px; padding:16px; overflow-x:auto; align-items:flex-start; }
.cust2 .board-col { flex:0 0 262px; background:var(--surface-1); border:1px solid var(--line-200); border-radius:12px; display:flex; flex-direction:column; max-height:640px; }
.cust2 .board-col-head { display:flex; align-items:center; justify-content:space-between; gap:8px; padding:11px 13px; border-bottom:1px solid var(--line-200); }
.cust2 .board-col-head .bt { font:700 12px var(--font-body); color:var(--text-strong); }
.cust2 .board-col-body { display:flex; flex-direction:column; gap:8px; padding:11px; overflow-y:auto; }
.cust2 .bcard { padding:11px 12px; border:1px solid var(--line-200); border-radius:10px; background:var(--surface-0); box-shadow:var(--shadow-card); cursor:pointer; transition:border-color .12s; }
.cust2 .bcard:hover { border-color:var(--ink-900); }
.cust2 .bcard-nm { font-size:13px; font-weight:600; color:var(--text-strong); }
.cust2 .bcard-sub { font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle); margin-top:2px; }
.cust2 .bcard-foot { display:flex; justify-content:space-between; align-items:center; gap:8px; margin-top:9px; }
.cust2 .bcard-foot .bp { font-family:var(--font-mono); font-size:12px; font-weight:700; color:var(--text-strong); }

/* ---------- timeline ---------- */
.cust2 .timeline { padding:18px 20px; display:flex; flex-direction:column; gap:18px; }
.cust2 .tl-month { font-family:var(--font-mono); font-size:10px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); margin-bottom:10px; }
.cust2 .tl-item { display:flex; gap:14px; }
.cust2 .tl-rail { flex:0 0 auto; display:flex; flex-direction:column; align-items:center; }
.cust2 .tl-dot { width:11px; height:11px; border-radius:50%; background:var(--brand-accent); border:2px solid var(--surface-0); box-shadow:0 0 0 1px var(--line-200); margin-top:3px; }
.cust2 .tl-line { flex:1; width:2px; background:var(--line-200); margin:2px 0; }
.cust2 .tl-item:last-child .tl-line { display:none; }
.cust2 .tl-body { flex:1; min-width:0; display:flex; justify-content:space-between; gap:12px; cursor:pointer; padding-bottom:16px; }
.cust2 .tl-nm { font-size:13.5px; font-weight:600; color:var(--text-strong); }
.cust2 .tl-meta { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); margin-top:2px; }
.cust2 .tl-spend { font-family:var(--font-mono); font-size:12.5px; font-weight:700; color:var(--text-strong); white-space:nowrap; }

/* ---------- kalender ---------- */
.cust2 .cal { padding:16px; }
.cust2 .cal-head { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:12px; }
.cust2 .cal-title { font-family:var(--font-display); font-size:16px; font-weight:700; color:var(--text-strong); }
.cust2 .cal-grid { display:grid; grid-template-columns:repeat(7,1fr); gap:6px; }
.cust2 .cal-dow { font-family:var(--font-mono); font-size:9.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); text-align:center; padding-bottom:4px; }
.cust2 .cal-cell { min-height:84px; border:1px solid var(--line-100); border-radius:9px; padding:6px; display:flex; flex-direction:column; gap:4px; background:var(--surface-0); }
.cust2 .cal-cell.empty { background:transparent; border-color:transparent; }
.cust2 .cal-cell.has { border-color:var(--line-200); }
.cust2 .cal-day { font-family:var(--font-mono); font-size:11px; color:var(--text-muted); }
.cust2 .cal-chip { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:5px; font-size:10.5px; color:var(--text-strong); background:var(--surface-1); border:1px solid var(--line-200); border-left:3px solid var(--cc-dot,var(--line-200)); border-radius:6px; padding:2px 6px; cursor:pointer; }
.cust2 .cal-chip > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cust2 .cal-chip:hover { border-color:var(--ink-900); border-left-color:var(--cc-dot,var(--ink-900)); }
.cust2 .cal-chip > i { width:6px; height:6px; border-radius:50%; background:var(--cc-dot,var(--text-subtle)); }
.cust2 .cal-chip-b { font-family:var(--font-mono); font-size:9px; font-weight:700; min-width:15px; text-align:center; padding:1px 3px; border-radius:4px; background:var(--ink-050); color:var(--text-muted); }
.cust2 .cal-chip-b.cb-warning { background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.cust2 .cal-chip-b.cb-danger { background:var(--tag-danger-bg); color:var(--tag-danger-text); }
/* warna kategori = tier efektif (sejalan dengan c2TierVar) */
.cust2 .cal-chip.cc-silver   { --cc-dot:var(--ink-300); }
.cust2 .cal-chip.cc-ocean    { --cc-dot:var(--tag-blue-text); }
.cust2 .cal-chip.cc-cosmic   { --cc-dot:var(--tag-purple-text); }
.cust2 .cal-chip.cc-golden   { --cc-dot:var(--vs-yellow-shadow); }
.cust2 .cal-chip.cc-emerald  { --cc-dot:var(--tag-mint-text); }
.cust2 .cal-chip.cc-graphite { --cc-dot:var(--ink-900); }

/* ---------- daftar padat ---------- */
.cust2 .dlist-row { display:flex; align-items:center; gap:12px; padding:12px 16px; border-bottom:1px solid var(--line-100); cursor:pointer; transition:background .12s; }
.cust2 .dlist-row:hover { background:var(--surface-1); }
.cust2 .dlist-av { width:34px; height:34px; border-radius:50%; background:var(--ink-900); color:var(--primary-contrast); display:flex; align-items:center; justify-content:center; font:700 12px var(--font-display); flex:0 0 auto; }
.cust2 .dlist-main { flex:1; min-width:0; }
.cust2 .dlist-nm { font-size:13.5px; font-weight:600; color:var(--text-strong); }
.cust2 .dlist-sub { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); margin-top:1px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cust2 .dlist-spend { font-family:var(--font-mono); font-size:13px; font-weight:700; color:var(--text-strong); white-space:nowrap; }
.cust2 .view-empty { padding:44px 20px; text-align:center; color:var(--text-subtle); }

/* ---------- reflow kartu (tabel ≤720px) ---------- */
@media (max-width:720px){
  .cust2 .c2tbl thead { display:none; }
  .cust2 .c2tbl, .cust2 .c2tbl tbody, .cust2 .c2tbl tr, .cust2 .c2tbl td { display:block; width:100%; }
  .cust2 .c2tbl tbody tr { border:1px solid var(--line-200); border-radius:var(--radius-sm); margin:10px; padding:2px 0; background:var(--surface-0); }
  .cust2 .c2tbl td { border-bottom:1px solid var(--line-100); display:flex; justify-content:space-between; gap:16px; align-items:baseline; text-align:right; padding:9px 13px; }
  .cust2 .c2tbl td::before { content:attr(data-l); font:600 10px var(--font-mono); letter-spacing:.05em; text-transform:uppercase; color:var(--text-subtle); text-align:left; flex:0 0 auto; padding-top:2px; }
  .cust2 .c2tbl td.no-l::before { content:''; }
  .cust2 .c2tbl tbody tr td:last-child { border-bottom:0; }
  .cust2 .c2tbl .nm, .cust2 .c2tbl td > * { justify-content:flex-end; }
  .cust2 .c2tbl tbody tr.grp-row, .cust2 .c2tbl tbody tr.detail-row { border:0; margin:0; }
  .cust2 .c2tbl tbody tr.grp-row td, .cust2 .c2tbl tbody tr.detail-row td { display:block; text-align:left; padding:0; }
  .cust2 .c2tbl tbody tr.grp-row td::before, .cust2 .c2tbl tbody tr.detail-row td::before { content:''; }
}
.cust2 .db-pager { display:flex; align-items:center; gap:12px; padding:12px 16px; flex-wrap:wrap; }
.cust2 .db-pager .pi { font-family:var(--font-mono); font-size:12px; color:var(--text-subtle); }

/* ---------- tag / chip ---------- */
.cust2 .tg, .cust2-ov .tg { display:inline-flex; align-items:center; gap:5px; font:600 11px var(--font-body); padding:2px 8px; border-radius:var(--radius-pill); border:1px solid transparent; white-space:nowrap; }
.cust2 .tg .dot, .cust2-ov .tg .dot { width:6px; height:6px; border-radius:50%; background:currentColor; }
.cust2 .tg svg, .cust2-ov .tg svg { flex:0 0 auto; }
.cust2 .tg-success, .cust2-ov .tg-success { background:var(--tag-success-bg); border-color:var(--tag-success-border); color:var(--tag-success-text); }
.cust2 .tg-mint, .cust2-ov .tg-mint { background:var(--tag-mint-bg); border-color:var(--tag-mint-border); color:var(--tag-mint-text); }
.cust2 .tg-info, .cust2-ov .tg-info { background:var(--tag-info-bg); border-color:var(--tag-info-border); color:var(--tag-info-text); }
.cust2 .tg-blue, .cust2-ov .tg-blue { background:var(--tag-blue-bg); border-color:var(--tag-blue-border); color:var(--tag-blue-text); }
.cust2 .tg-purple, .cust2-ov .tg-purple { background:var(--tag-purple-bg); border-color:var(--tag-purple-border); color:var(--tag-purple-text); }
.cust2 .tg-pink, .cust2-ov .tg-pink { background:var(--tag-pink-bg); border-color:var(--tag-pink-border); color:var(--tag-pink-text); }
.cust2 .tg-warning, .cust2-ov .tg-warning { background:var(--tag-warning-bg); border-color:var(--tag-warning-border); color:var(--tag-warning-text); }
.cust2 .tg-orange, .cust2-ov .tg-orange { background:var(--tag-orange-bg); border-color:var(--tag-orange-border); color:var(--tag-orange-text); }
.cust2 .tg-danger, .cust2-ov .tg-danger { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); color:var(--tag-danger-text); }
.cust2 .tg-neutral, .cust2-ov .tg-neutral { background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); color:var(--tag-neutral-text); }
.cust2 .tg-identity, .cust2-ov .tg-identity { background:var(--tag-identity-bg); border-color:var(--tag-identity-border); color:var(--tag-identity-text); }
.cust2 .tagchip, .cust2-ov .tagchip { display:inline-flex; align-items:center; font:500 11px var(--font-mono); padding:2px 7px; border-radius:100px; background:var(--surface-1); border:1px solid var(--line-200); color:var(--text-muted); white-space:nowrap; }

/* ---------- account badge: 6 shape × tone ---------- */
.cust2 .abadge, .cust2-ov .abadge { display:inline-flex; align-items:center; gap:5px; font:600 10.5px var(--font-body); padding:4px 9px; white-space:nowrap; border:1px solid transparent; }
.cust2 .abadge.sh-pill, .cust2-ov .abadge.sh-pill { border-radius:var(--radius-pill); }
.cust2 .abadge.sh-pillo, .cust2-ov .abadge.sh-pillo { border-radius:var(--radius-pill); background:transparent!important; }
.cust2 .abadge.sh-rect, .cust2-ov .abadge.sh-rect { border-radius:5px; }
.cust2 .abadge.sh-recto, .cust2-ov .abadge.sh-recto { border-radius:5px; background:transparent!important; }
.cust2 .abadge.sh-shield, .cust2-ov .abadge.sh-shield { border-radius:6px; }
.cust2 .abadge.sh-bevel, .cust2-ov .abadge.sh-bevel { border-radius:6px; }
.cust2 .ab-red, .cust2-ov .ab-red { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); color:var(--tag-danger-text); }
.cust2 .ab-orange, .cust2-ov .ab-orange { background:var(--tag-orange-bg); border-color:var(--tag-orange-border); color:var(--tag-orange-text); }
.cust2 .ab-amber, .cust2-ov .ab-amber { background:var(--tag-warning-bg); border-color:var(--tag-warning-border); color:var(--tag-warning-text); }
.cust2 .ab-mint, .cust2-ov .ab-mint { background:var(--tag-mint-bg); border-color:var(--tag-mint-border); color:var(--tag-mint-text); }
.cust2 .ab-green, .cust2-ov .ab-green { background:var(--tag-success-bg); border-color:var(--tag-success-border); color:var(--tag-success-text); }
.cust2 .ab-blue, .cust2-ov .ab-blue { background:var(--tag-blue-bg); border-color:var(--tag-blue-border); color:var(--tag-blue-text); }
.cust2 .ab-neutral, .cust2-ov .ab-neutral,
.cust2 .ab-slate, .cust2-ov .ab-slate { background:var(--tag-neutral-bg); border-color:var(--tag-neutral-border); color:var(--tag-neutral-text); }
.cust2 .ab-indigo, .cust2-ov .ab-indigo { background:var(--tag-purple-bg); border-color:var(--tag-purple-border); color:var(--tag-purple-text); }
.cust2 .ab-gold, .cust2-ov .ab-gold { background:var(--ink-900); border-color:var(--brand-line); color:var(--vs-yellow); }

/* ---------- thumbnail tier ---------- */
.cust2 .athumb, .cust2-ov .athumb { width:34px; height:34px; border-radius:50%; object-fit:cover; flex:0 0 auto; display:flex; align-items:center; justify-content:center; font:700 12px var(--font-display); color:var(--primary-contrast); }
.cust2 .athumb.tier-regular, .cust2-ov .athumb.tier-regular { background:linear-gradient(135deg,var(--ink-500),var(--ink-300)); }
.cust2 .athumb.tier-member_basic, .cust2-ov .athumb.tier-member_basic { background:linear-gradient(135deg,var(--tag-blue-text),var(--tag-mint-text)); }
.cust2 .athumb.tier-member_exclusive, .cust2-ov .athumb.tier-member_exclusive { background:linear-gradient(135deg,var(--ink-900),var(--tag-purple-text)); }

/* ---------- grid isi ---------- */
.cust2 #covBody { display:flex; flex-direction:column; gap:16px; min-width:0; }
.cust2 .covgrid { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media (max-width:640px){ .cust2 .covgrid { grid-template-columns:1fr; } }
.cust2-ov .profile-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media (max-width:760px){ .cust2-ov .profile-grid { grid-template-columns:1fr; } }
.cust2 .score, .cust2-ov .score { display:grid; grid-template-columns:repeat(3,1fr); gap:9px; }
@media (max-width:520px){ .cust2 .score, .cust2-ov .score { grid-template-columns:1fr; } }
.cust2 .scell, .cust2-ov .scell { background:var(--surface-1); border:1px solid var(--line-100); border-radius:var(--radius-sm); padding:10px 12px; display:flex; flex-direction:column; gap:2px; }
.cust2 .scell .sk, .cust2-ov .scell .sk { font:600 10px var(--font-mono); letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); }
.cust2 .scell .sv, .cust2-ov .scell .sv { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:17px; font-weight:700; color:var(--text-strong); }
.cust2 .scell .sv.neg, .cust2-ov .scell .sv.neg { color:var(--accent-red); }
.cust2-ov .minirow { display:grid; grid-template-columns:repeat(4,1fr); gap:8px; }
@media (max-width:560px){ .cust2-ov .minirow { grid-template-columns:1fr; gap:4px; } }

/* ---------- key/value + dpanel ---------- */
.cust2 .kv, .cust2-ov .kv { display:flex; flex-direction:column; gap:2px; padding:9px 0; border-bottom:1px solid var(--line-100); }
.cust2 .kv:last-child, .cust2-ov .kv:last-child { border-bottom:0; }
.cust2 .kv .k, .cust2-ov .kv .k { font:600 10.5px var(--font-mono); letter-spacing:.06em; text-transform:uppercase; color:var(--text-subtle); }
.cust2 .kv .v, .cust2-ov .kv .v { font-size:13.5px; color:var(--text-strong); }
.cust2-ov .dpanel { background:var(--surface-0); border:1px solid var(--line-200); border-radius:14px; padding:20px; box-shadow:var(--shadow-card); }
.cust2-ov .dpanel h3 { display:flex; align-items:center; gap:8px; font-family:var(--font-mono); font-size:10.5px; font-weight:600; text-transform:uppercase; letter-spacing:.12em; color:var(--text-subtle); margin:0 0 14px; padding-bottom:11px; border-bottom:1px solid var(--line-100); }
.cust2-ov .dpanel h3::before { content:""; width:5px; height:14px; border-radius:2px; background:var(--brand-accent); flex:0 0 auto; }
.cust2 .inline-alert, .cust2-ov .inline-alert { display:flex; gap:8px; padding:10px 12px; border-radius:var(--radius-sm); background:var(--tag-warning-bg); border:1px solid var(--tag-warning-border); color:var(--tag-warning-text); font-size:12px; line-height:1.45; }
.cust2 .inline-alert.danger, .cust2-ov .inline-alert.danger { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); color:var(--tag-danger-text); }
.cust2 .inline-alert.info, .cust2-ov .inline-alert.info { background:var(--tag-blue-bg); border-color:var(--tag-blue-border); color:var(--tag-blue-text); }
.cust2-ov .lvl-card { border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); }
.cust2-ov .lvl-card:hover { border-color:var(--ink-300); }
.cust2-ov .lvl-card.is-active { border-color:var(--ink-900); background:var(--surface-1); box-shadow:0 0 0 1px var(--ink-900) inset; }

/* ---------- chart Overview ---------- */
.cust2 .covbar { height:10px; border-radius:100px; background:var(--ink-050); overflow:hidden; flex:1; }
.cust2 .covbar > i { display:block; height:100%; border-radius:100px; transition:width .35s cubic-bezier(.22,.61,.36,1); }
.cust2 .covbarstack { display:flex; height:10px; border-radius:100px; overflow:hidden; background:var(--ink-050); flex:1; }
.cust2 .covbarstack > i { display:block; height:100%; }
.cust2 .covtrend { display:flex; align-items:flex-end; gap:9px; height:158px; overflow-x:auto; padding-top:8px; background:linear-gradient(var(--line-100) 1px,transparent 1px); background-size:100% 25%; background-position:0 8px; }
.cust2 .covcol { display:flex; flex-direction:column; justify-content:flex-end; gap:2px; min-width:22px; flex:1; cursor:pointer; transition:opacity .12s ease; }
.cust2 .covcol:hover { opacity:.68; }
.cust2 .covcol i { display:block; border-radius:4px 4px 0 0; transition:height .35s cubic-bezier(.22,.61,.36,1); }
.cust2 .covrow { display:flex; align-items:center; gap:12px; }
.cust2 .covrow-l { width:120px; font-size:12.5px; color:var(--text-strong); flex:0 0 auto; }
.cust2 .covrow-v { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:12px; color:var(--text-muted); text-align:right; flex:0 0 auto; }

/* ---------- Needs Action ---------- */
.cust2 .na-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:12px; }
@media (max-width:920px){ .cust2 .na-grid { grid-template-columns:1fr 1fr; } }
@media (max-width:560px){ .cust2 .na-grid { grid-template-columns:1fr; } }
.cust2 .na-card { position:relative; display:flex; flex-direction:column; gap:8px; padding:15px 16px 14px; border:1px solid var(--line-200); border-left:4px solid var(--ink-300); border-radius:12px; background:var(--surface-0); transition:border-color .14s, box-shadow .12s, transform .12s; }
.cust2 .na-card:hover { box-shadow:var(--shadow-card); transform:translateY(-1px); }
.cust2 .na-top { display:flex; align-items:flex-start; justify-content:space-between; gap:10px; }
.cust2 .na-count { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:30px; font-weight:700; line-height:.9; color:var(--text-strong); }
.cust2 .na-reason { font-size:12.5px; color:var(--text-muted); line-height:1.45; flex:1; }
.cust2 .na-card.ab-red { background:var(--surface-0); border-color:var(--line-200); border-left-color:var(--accent-red); }
.cust2 .na-card.ab-red .na-count { color:var(--accent-red); }
.cust2 .na-card.ab-orange { background:var(--surface-0); border-color:var(--line-200); border-left-color:var(--tag-orange-text); }
.cust2 .na-card.ab-orange .na-count { color:var(--tag-orange-text); }
.cust2 .na-card.ab-amber { background:var(--surface-0); border-color:var(--line-200); border-left-color:var(--tag-warning-text); }
.cust2 .na-card.ab-amber .na-count { color:var(--tag-warning-text); }
.cust2 .na-card.ab-blue { background:var(--surface-0); border-color:var(--line-200); border-left-color:var(--tag-blue-text); }
.cust2 .na-card.ab-blue .na-count { color:var(--tag-blue-text); }
.cust2 .na-card.ab-mint, .cust2 .na-card.ab-green { background:var(--surface-0); border-color:var(--line-200); border-left-color:var(--tag-success-text); }
.cust2 .na-card.ab-neutral, .cust2 .na-card.ab-slate { background:var(--surface-0); border-color:var(--line-200); border-left-color:var(--ink-300); }

/* ---------- drawer ---------- */
.cust2-ov .c2-back { position:fixed; inset:0; background:rgba(5,5,5,.42); backdrop-filter:blur(3px); z-index:80; display:flex; justify-content:flex-end; animation:c2fade .2s ease; }
.cust2-ov .c2-drawer { width:clamp(24rem,58vw,51.25rem); max-width:100%; height:100dvh; background:var(--surface-1); box-shadow:var(--shadow-pop); display:flex; flex-direction:column; overflow-y:auto; animation:c2slide .26s ease; }
.cust2-ov .drawer-head { flex-shrink:0; background:var(--surface-0); border-bottom:1px solid var(--line-200); padding:24px 24px 20px; display:flex; flex-direction:column; align-items:stretch; gap:18px; }
/* Head drawer memakai gradasi keluarga yang SAMA dengan badge tier aktif (sweep
   115deg, 5 stop) — hanya diredam ke surface supaya teks tetap terbaca. --t-deep/
   --t-lite mengambil stop gelap & terang dari palet badge holografis di bawah,
   jadi header dan badge selalu satu warna. */
.cust2-ov .drawer-head[class*="tier-"] {
  background:linear-gradient(115deg,
    color-mix(in srgb,var(--t-deep) 52%,var(--surface-0)),
    color-mix(in srgb,var(--t-lite) 70%,var(--surface-0)) 28%,
    color-mix(in srgb,var(--t-lite) 22%,var(--surface-0)) 50%,
    color-mix(in srgb,var(--t-lite) 70%,var(--surface-0)) 72%,
    color-mix(in srgb,var(--t-deep) 52%,var(--surface-0)));
}
.cust2-ov .drawer-head.tier-reguler   { --t-deep:#c9cdd6; --t-lite:#eef0f3; }
.cust2-ov .drawer-head.tier-basic     { --t-deep:#0d3f66; --t-lite:#7fd0ff; }
.cust2-ov .drawer-head.tier-exclusive { --t-deep:#2b0f52; --t-lite:#c98bff; }
.cust2-ov .drawer-head.tier-weekly    { --t-deep:#8a6a12; --t-lite:#fff6c0; }
.cust2-ov .drawer-head.tier-partner   { --t-deep:#064e3b; --t-lite:#7ff0c6; }
.cust2-ov .drawer-head.tier-internal  { --t-deep:#232323; --t-lite:#a8a8a8; }
.cust2-ov .drawer-chips { display:flex; flex-wrap:wrap; align-items:center; gap:8px; }
.cust2-ov .drawer-chips .tg { font-size:12.5px; padding:5px 12px; gap:6px; }
.cust2-ov .tg-verified { background:var(--tag-blue-bg); border-color:var(--tag-blue-border); color:var(--tag-info-text); }
/* Drawer = SATU area gulir (.c2-drawer). Head-nya tinggi (~500px), jadi tab bar
   dibuat menempel di atas — kalau tidak, ganti tab harus gulir balik ke atas dulu.
   Pasangan dari .drawer-foot yang sudah sticky di bawah. */
.cust2-ov .dtabs { flex-shrink:0; position:sticky; top:0; z-index:6; display:flex; gap:7px; padding:12px 14px; background:var(--surface-0); border-bottom:1px solid var(--line-200); overflow-x:auto; }
.cust2-ov .dtab { padding:8px 15px; min-height:36px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-muted); font:600 12.5px var(--font-body); cursor:pointer; white-space:nowrap; transition:all .14s ease; }
.cust2-ov .dtab:hover { border-color:var(--ink-300); color:var(--text-strong); }
.cust2-ov .dtab.is-active { background:var(--ink-900); color:var(--primary-contrast); border-color:var(--ink-900); font-weight:700; }
/* SATU area gulir: .c2-drawer. Aturan dasar .drawer-body memberi `flex:1`
   (flex-basis:0) + `overflow-y:auto` — tanpa dinetralkan, isi 226px terjepit di
   jendela ~89px di bawah head yang tinggi, jadi ada gulir di dalam gulir.
   flex:0 0 auto → tinggi mengikuti isi; overflow:visible → biar drawer yg gulir. */
.cust2-ov .drawer-body { flex:0 0 auto; overflow:visible; padding:20px 22px 24px; display:flex; flex-direction:column; gap:16px; }
.cust2-ov .kick { font-family:var(--font-mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.cust2-ov .d360-av { width:56px; height:56px; border-radius:100px; background:var(--ink-900); color:var(--primary-contrast); display:inline-flex; align-items:center; justify-content:center; font-family:var(--font-mono); font-size:18px; font-weight:600; flex:0 0 auto; }
.cust2-ov .d360-name { font-family:var(--font-display); font-size:21px; font-weight:700; letter-spacing:-.01em; color:var(--text-strong); }
.cust2-ov .contact-strip { display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); border:1px solid var(--line-200); border-radius:10px; overflow:hidden; background:var(--surface-0); }
.cust2-ov .contact-cell { min-width:0; display:flex; align-items:center; gap:9px; padding:8px 12px; }
.cust2-ov .contact-cell > div { min-width:0; }
.cust2-ov .contact-cell .clab { font-family:var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.cust2-ov .contact-cell .cval { font-size:12.5px; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cust2-ov .contact-cell > svg { flex:0 0 auto; color:var(--text-subtle); }
.cust2-ov .contact-cell.cc-div { border-left:1px solid var(--line-100); }

/* ---------- badge tier holografis ---------- */
.cust2 .tier-badge, .cust2-ov .tier-badge { position:relative; overflow:hidden; border:1px solid transparent; background-size:220% 100%; box-shadow:inset 0 1px 0 rgba(255,255,255,.4),0 1px 2px rgba(5,5,5,.18); animation:c2holoBg 7s linear infinite; }
.cust2 .tier-badge > *, .cust2-ov .tier-badge > * { position:relative; z-index:1; }
.cust2 .tier-badge::before, .cust2-ov .tier-badge::before { content:""; position:absolute; top:0; bottom:0; left:0; width:55%; background:linear-gradient(115deg,transparent,rgba(255,255,255,.62) 48%,transparent); transform:translateX(-170%) skewX(-14deg); animation:c2holoSweep 5s ease-in-out infinite; z-index:0; }
@keyframes c2holoBg { 0%{background-position:0 0} 100%{background-position:220% 0} }
@keyframes c2holoSweep { 0%{transform:translateX(-170%) skewX(-14deg)} 52%,100%{transform:translateX(290%) skewX(-14deg)} }
.cust2 .tier-silver, .cust2-ov .tier-silver { color:#33363c; border-color:#c7ccd6; background-image:linear-gradient(115deg,#e9ebef,#f8f9fb 16%,#c9cdd6 34%,#ffffff 50%,#d2d6de 66%,#eef0f3 84%,#cbd0d9); }
.cust2 .tier-ocean, .cust2-ov .tier-ocean { color:#eaf6ff; border-color:rgba(255,255,255,.35); text-shadow:0 1px 1px rgba(0,0,0,.28); background-image:linear-gradient(115deg,#0d3f66,#1f79c0 28%,#7fd0ff 50%,#1f79c0 72%,#0d3f66); animation-duration:6.2s; }
.cust2 .tier-ocean::before, .cust2-ov .tier-ocean::before { animation-duration:4.6s; animation-delay:.8s; }
.cust2 .tier-cosmic, .cust2-ov .tier-cosmic { color:#f3e9ff; border-color:rgba(255,255,255,.32); text-shadow:0 1px 1px rgba(0,0,0,.32); background-image:linear-gradient(115deg,#2b0f52,#6d28d9 30%,#c98bff 52%,#6d28d9 72%,#2b0f52); animation-duration:8s; }
.cust2 .tier-cosmic::before, .cust2-ov .tier-cosmic::before { animation-duration:6s; animation-delay:.3s; }
.cust2 .tier-golden, .cust2-ov .tier-golden { color:#4a3a00; border-color:#c9a12a; text-shadow:0 1px 0 rgba(255,255,255,.35); background-image:linear-gradient(115deg,#8a6a12,#e9c02a 26%,#fff6c0 50%,#e9c02a 74%,#8a6a12); animation-duration:5.4s; }
.cust2 .tier-golden::before, .cust2-ov .tier-golden::before { animation-duration:3.8s; animation-delay:1.1s; }
.cust2 .tier-emerald, .cust2-ov .tier-emerald { color:#eafff5; border-color:rgba(255,255,255,.32); text-shadow:0 1px 1px rgba(0,0,0,.26); background-image:linear-gradient(115deg,#064e3b,#0f9d6e 30%,#7ff0c6 52%,#0f9d6e 72%,#064e3b); animation-duration:6.8s; }
.cust2 .tier-emerald::before, .cust2-ov .tier-emerald::before { animation-duration:5s; animation-delay:.5s; }
.cust2 .tier-graphite, .cust2-ov .tier-graphite { color:#f2f2f2; border-color:rgba(255,255,255,.28); text-shadow:0 1px 1px rgba(0,0,0,.35); background-image:linear-gradient(115deg,#232323,#5a5a5a 30%,#a8a8a8 52%,#5a5a5a 72%,#232323); animation-duration:7.6s; }
.cust2 .tier-graphite::before, .cust2-ov .tier-graphite::before { animation-duration:5.6s; animation-delay:.9s; }
@media (prefers-reduced-motion:reduce){ .cust2 .tier-badge, .cust2 .tier-badge::before, .cust2-ov .tier-badge, .cust2-ov .tier-badge::before { animation:none; } }

/* ---------- bento 360 ---------- */
.cust2-ov .bento360 { display:grid; grid-template-columns:1.3fr 1fr 1fr; grid-auto-rows:1fr; gap:10px; }
.cust2-ov .bento360 .cell { display:flex; flex-direction:column; justify-content:center; gap:4px; padding:14px 16px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:12px; min-width:0; }
.cust2-ov .bento360 .cell .l { font-family:var(--font-mono); font-size:9.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.cust2-ov .bento360 .cell .n { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:19px; font-weight:700; color:var(--text-strong); white-space:nowrap; }
.cust2-ov .bento360 .hero { grid-row:span 2; justify-content:flex-end; gap:6px; background:var(--ink-900); border-color:var(--ink-900); }
.cust2-ov .bento360 .hero .l { color:rgba(255,255,255,.6); margin-bottom:auto; }
.cust2-ov .bento360 .hero .n { color:var(--primary-contrast); font-size:27px; line-height:1; }
.cust2-ov .bento360 .wide { grid-column:2 / span 2; }
.cust2-ov .bento360 .hero .hero-cap { font-family:var(--font-mono); font-size:9.5px; color:rgba(255,255,255,.55); margin-top:3px; }
.cust2-ov .bento360 .hero .hero-sec { display:flex; align-items:baseline; gap:6px; font-family:var(--font-mono); font-size:15px; font-weight:700; color:rgba(255,255,255,.85); margin-top:5px; }
.cust2-ov .bento360 .hero .hero-sec small { font-size:9px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:rgba(255,255,255,.5); }
.cust2-ov .bento360 .loyalty-cell { cursor:pointer; text-align:left; font:inherit; color:inherit; align-items:stretch; }
.cust2-ov .bento360 .loyalty-cell:hover { border-color:var(--ink-900); box-shadow:var(--shadow-card); transform:translateY(-1px); }
.cust2-ov .loyalty-bar { height:7px; border-radius:100px; background:var(--ink-050); overflow:hidden; margin-top:9px; }
.cust2-ov .loyalty-bar i { display:block; height:100%; border-radius:100px; background:var(--brand-accent); transition:width .5s ease; }
@media (max-width:560px){ .cust2-ov .bento360 { grid-template-columns:1fr 1fr; } .cust2-ov .bento360 .hero { grid-row:auto; grid-column:1 / -1; } .cust2-ov .bento360 .wide { grid-column:auto; } }
.cust2-ov .stat360 { display:grid; grid-template-columns:repeat(4,1fr); gap:1px; background:var(--line-200); border:1px solid var(--line-200); border-radius:11px; overflow:hidden; }
.cust2-ov .stat360 .cell { display:flex; flex-direction:column; gap:4px; padding:15px 16px; background:var(--surface-0); }
.cust2-ov .stat360 .cell .l { font-family:var(--font-mono); font-size:9.5px; letter-spacing:.08em; text-transform:uppercase; color:var(--text-subtle); }
.cust2-ov .stat360 .cell .n { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-size:18px; font-weight:700; color:var(--text-strong); white-space:nowrap; }
@media (max-width:560px){ .cust2-ov .stat360 { grid-template-columns:1fr 1fr; } }
/* FLAG token: #2A2A16 = titik tengah gradasi kartu loyalti di master .dc.html —
   belum punya padanan di tokens.css (butuh --brand-ink-warm atau sejenis).
   Dipertahankan apa adanya agar identik dengan master; minta owner menambah
   tokennya di project upstream 12.04.00, JANGAN mengarang nilai baru di sini. */
.cust2-ov .mship { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:16px 18px; border-radius:12px; background:linear-gradient(120deg,var(--ink-900),#2A2A16 78%,var(--vs-yellow-shadow)); }
.cust2-ov .mship .ml { font-family:var(--font-mono); font-size:10px; letter-spacing:.12em; text-transform:uppercase; color:rgba(255,255,255,.6); }
.cust2-ov .mship .mtier { font-family:var(--font-display); font-size:20px; font-weight:700; color:var(--primary-contrast); }
.cust2-ov .mship .mpts { font-family:var(--font-mono); font-size:20px; font-weight:700; color:var(--vs-yellow); }

/* ---------- drawer foot ---------- */
.cust2-ov .drawer-foot { flex-shrink:0; position:sticky; bottom:0; z-index:5; background:var(--surface-0); border-top:1px solid var(--line-200); padding:12px 14px; display:grid; grid-template-columns:repeat(5,1fr); gap:8px; }
/* Ikon di SAMPING label (bukan bertumpuk): tombol jadi 38px, proporsi mendekati
   c2btn biasa. Grid auto|minmax(0,1fr) → ikon fix, label boleh menyusut. */
.cust2-ov .drawer-foot .c2btn { width:100%; height:38px; min-height:38px; display:grid; grid-template-columns:auto minmax(0,1fr); justify-items:start; align-items:center; gap:7px; padding:0 11px; font-size:12px; line-height:1.15; }
.cust2-ov .drawer-foot .c2btn > span { display:flex; }
.cust2-ov .drawer-foot .c2btn > svg { justify-self:center; }
@media (max-width:640px){ .cust2-ov .drawer-foot { grid-template-columns:repeat(3,1fr); } }
@media (max-width:420px){ .cust2-ov .drawer-foot { grid-template-columns:repeat(2,1fr); } }
.cust2-ov .c2x { width:34px; height:34px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); display:flex; align-items:center; justify-content:center; cursor:pointer; color:var(--text-muted); flex:0 0 auto; }
.cust2-ov .c2x:hover { background:var(--surface-1); color:var(--text-strong); }

/* ---------- modal ---------- */
/* 1320 (dulu 90): modal c2 juga ditumpuk dari drawer Bookings (1200) via "Link
   Akun" (dBkLinkAcct) dan dari drawer Connect+ — modal aktif selalu di atas
   pembukanya; tetap di bawah uiConfirm (1500) & toast (1600). */
.cust2-ov .c2modal-back { position:fixed; inset:0; background:rgba(5,5,5,.42); backdrop-filter:blur(3px); z-index:1320; display:flex; align-items:center; justify-content:center; padding:18px; animation:c2fade .2s ease; }
.cust2-ov .c2modal { width:min(520px,100%); max-height:92dvh; background:var(--surface-0); border-radius:var(--radius-lg); box-shadow:var(--shadow-pop); display:flex; flex-direction:column; overflow:hidden; animation:c2rise .2s ease; }
.cust2-ov .c2modal.wide { width:min(680px,100%); }
.cust2-ov .c2mc-head { display:flex; align-items:center; gap:12px; padding:16px 18px; border-bottom:1px solid var(--line-100); }
.cust2-ov .c2mc-head h3 { font-family:var(--font-display); font-size:18px; font-weight:700; margin:0; }
.cust2-ov .c2mc-body { padding:18px; overflow-y:auto; display:flex; flex-direction:column; gap:13px; }
.cust2-ov .c2mc-foot { display:flex; align-items:center; gap:8px; padding:14px 18px; border-top:1px solid var(--line-100); }
/* ── Pemilih mode Customer Baru: Temporary vs Lengkap ───────────────────────
   Dua kartu sederajat, bukan tab tipis — pilihan ini menentukan berapa banyak
   yang harus diisi, jadi ia harus terbaca sebelum admin mulai mengetik. */
.cust2-ov .c2seg { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,180px),1fr));
  gap:var(--space-2); margin-bottom:var(--space-2); }
.cust2-ov .c2seg__b { display:flex; align-items:center; gap:7px; flex-wrap:wrap;
  padding:10px 12px; border:1px solid var(--border-default); border-radius:var(--radius-sm);
  background:var(--surface-0); color:var(--text-muted); cursor:pointer;
  font:650 12.5px var(--font-body); text-align:left; }
.cust2-ov .c2seg__b small { flex:1 1 100%; font:400 11px var(--font-body); color:var(--text-subtle); }
.cust2-ov .c2seg__b:hover { border-color:var(--ink-400); }
.cust2-ov .c2seg__b.is-on { border-color:var(--ink-900); background:var(--surface-1); color:var(--text-strong); }
.cust2-ov .c2seg__b.is-on small { color:var(--text-muted); }
.cust2-ov .c2seg__b:focus-visible { outline:none; box-shadow:var(--shadow-focus); }

/* ── Input tag: chip + saran ───────────────────────────────────────────────
   Menggantikan satu <input> "pisahkan dengan koma" yang membuat tag kembar
   (repeat-rental vs "repeat rental") lahir tanpa ada yang sadar. */
.cust2-ov .c2tagin { position:relative; }
.cust2-ov .c2tagin__box { display:flex; align-items:center; gap:6px; flex-wrap:wrap;
  min-height:40px; padding:6px 8px; border:1px solid var(--border-input);
  border-radius:var(--radius-sm); background:var(--surface-0); cursor:text; }
.cust2-ov .c2tagin__box:focus-within { border-color:var(--ink-400); box-shadow:var(--shadow-focus); }
.cust2-ov .c2tagin__chips { display:contents; }
.cust2-ov .c2tag { display:inline-flex; align-items:center; gap:4px; flex:0 0 auto;
  padding:3px 5px 3px 9px; border-radius:var(--radius-pill);
  background:var(--surface-1); border:1px solid var(--line-200);
  font:500 11.5px var(--font-mono); color:var(--text-strong); }
.cust2-ov .c2tag__x { display:inline-flex; padding:0; border:0; background:none;
  color:var(--text-subtle); cursor:pointer; line-height:0; }
.cust2-ov .c2tag__x:hover { color:var(--tag-danger-text); }
.cust2-ov .c2tagin__inp { flex:1 1 120px; min-width:110px; height:26px; border:0; outline:0;
  background:none; font:400 13.5px var(--font-body); color:var(--text-strong); }
.cust2-ov .c2tagin__pop { position:absolute; z-index:5; left:0; right:0; top:calc(100% + 4px);
  max-height:210px; overflow-y:auto; padding:4px;
  border:1px solid var(--border-default); border-radius:var(--radius-sm);
  background:var(--surface-0); box-shadow:var(--shadow-pop); }
.cust2-ov .c2tagin__opt { display:flex; align-items:center; justify-content:space-between; gap:10px;
  width:100%; padding:7px 9px; border:0; border-radius:var(--radius-xs); background:none;
  cursor:pointer; font:500 12.5px var(--font-mono); color:var(--text-strong); text-align:left; }
.cust2-ov .c2tagin__opt:hover { background:var(--surface-1); }
.cust2-ov .c2tagin__opt small { font:400 11px var(--font-body); color:var(--text-subtle); }

.cust2 .frow, .cust2-ov .frow { display:flex; flex-direction:column; gap:5px; }
.cust2 .fgrid, .cust2-ov .fgrid { display:grid; gap:12px; }
.cust2 .flabel, .cust2-ov .flabel { font:600 12px var(--font-body); color:var(--text-strong); }
.cust2 .fhint, .cust2-ov .fhint { font-size:11px; color:var(--text-subtle); }
.cust2 .finput, .cust2-ov .finput { width:100%; height:40px; padding:0 12px; border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); font:400 14px var(--font-body); color:var(--text-strong); }
.cust2 .finput:focus, .cust2-ov .finput:focus { outline:0; border-color:var(--ink-400); box-shadow:var(--shadow-focus); }
.cust2 textarea.finput, .cust2-ov textarea.finput { height:auto; min-height:80px; padding:10px 12px; resize:vertical; line-height:1.5; }
.cust2 select.finput, .cust2-ov select.finput { cursor:pointer; }
.cust2 .switch-row, .cust2-ov .switch-row { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.cust2 .c2switch, .cust2-ov .c2switch { position:relative; width:42px; height:24px; border-radius:100px; background:var(--ink-200); cursor:pointer; transition:background .16s; flex:0 0 auto; }
.cust2 .c2switch.on, .cust2-ov .c2switch.on { background:var(--ink-900); }
.cust2 .c2switch .knob, .cust2-ov .c2switch .knob { position:absolute; top:3px; left:3px; width:18px; height:18px; border-radius:50%; background:var(--primary-contrast); transition:left .16s; }
.cust2 .c2switch.on .knob, .cust2-ov .c2switch.on .knob { left:21px; }

@keyframes c2slide { from{transform:translateX(100%)} to{transform:none} }
@keyframes c2fade { from{opacity:0} to{opacity:1} }
@keyframes c2rise { from{opacity:0;transform:translateY(8px)} to{opacity:1;transform:none} }
@media (prefers-reduced-motion:reduce){ .cust2-ov .c2-drawer, .cust2-ov .c2-back, .cust2-ov .c2modal, .cust2-ov .c2modal-back { animation:none!important; } }

/* Tema square (html[data-shape="square"]) menyapu semua radius. Bentuk bundar di
   modul ini adalah MAKNA, bukan dekorasi (avatar identitas, dot status, switch,
   perforasi voucher) → dikecualikan, seperti radio & notch e-ticket di app.css. */
html[data-shape="square"] .cust2 .gcard-av,
html[data-shape="square"] .cust2 .dlist-av,
html[data-shape="square"] .cust2 .athumb,
html[data-shape="square"] .cust2 .tl-dot,
html[data-shape="square"] .cust2 .tg .dot,
html[data-shape="square"] .cust2 .abadge.bflat::before,
html[data-shape="square"] .cust2-ov .d360-av,
html[data-shape="square"] .cust2-ov .athumb,
html[data-shape="square"] .cust2-ov .tg .dot,
html[data-shape="square"] .cust2-ov .c2switch,
html[data-shape="square"] .cust2-ov .c2switch .knob,
html[data-shape="square"] .cust2-ov .vch-notch,
html[data-shape="square"] .cust2-ov .pic-av { border-radius:50%!important; }
html[data-shape="square"] .cust2-ov .c2switch { border-radius:100px!important; }
/* == /MODUL CUSTOMERS V2 =================================================== */

/* --- MODUL CUSTOMERS V2 · sub-komponen drawer (voucher, PIC, ledger, feedback)
   Master memakai inline style untuk blok ini; di app dipindah ke kelas agar
   markup JS tetap terbaca. Anatomi & token identik dengan .dc.html. --------- */
.cust2-ov .vch { position:relative; display:flex; border:1px solid var(--line-200); border-radius:12px; background:var(--surface-0); box-shadow:var(--shadow-card); overflow:hidden; }
.cust2-ov .vch-stub { flex:0 0 52px; display:flex; align-items:center; justify-content:center; background:var(--ink-900); color:var(--vs-yellow); }
.cust2-ov .vch-perf { align-self:stretch; border-left:2px dashed var(--line-200); }
.cust2-ov .vch-main { flex:1; min-width:0; padding:11px 13px; }
.cust2-ov .vch-top { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.cust2-ov .vch-code { font-family:var(--font-mono); font-size:14px; font-weight:700; letter-spacing:.05em; color:var(--text-strong); }
.cust2-ov .vch-name { font-size:12.5px; font-weight:600; color:var(--text-body); margin-top:3px; }
.cust2-ov .vch-effect { font-size:12px; color:var(--text-muted); margin-top:1px; }
.cust2-ov .vch-foot { font-family:var(--font-mono); display:flex; gap:14px; font-size:10.5px; color:var(--text-subtle); margin-top:7px; padding-top:7px; border-top:1px dashed var(--line-100); }
.cust2-ov .vch-notch { position:absolute; left:52px; width:12px; height:12px; border-radius:50%; background:var(--surface-0); border:1px solid var(--line-200); transform:translateX(-50%); }
.cust2-ov .vch-notch.top { top:-7px; }
.cust2-ov .vch-notch.bot { bottom:-7px; }
.cust2-ov .note-ic { width:30px; height:30px; border-radius:50%; padding:0; flex:0 0 auto; display:flex; align-items:center; justify-content:center; }
.cust2-ov .note-main { flex:1; min-width:0; }
.cust2-ov .note-top { display:flex; justify-content:space-between; align-items:center; gap:8px; margin-bottom:3px; }
.cust2-ov .note-type { font-size:12px; font-weight:700; color:var(--text-strong); }
.cust2-ov .note-at { font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle); }
.cust2-ov .note-text { font-size:13px; color:var(--text-body); line-height:1.45; }
.cust2-ov .pic-row { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:10px; }
.cust2-ov .pic-av { width:30px; height:30px; border-radius:50%; background:var(--surface-1); border:1px solid var(--line-200); display:flex; align-items:center; justify-content:center; font:700 11px var(--font-display); flex:0 0 auto; }
.cust2-ov .pic-nm { font-size:13px; font-weight:600; color:var(--text-strong); }
.cust2-ov .pic-sub { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); }
.cust2-ov .led-row { display:grid; grid-template-columns:52px minmax(0,1fr); align-items:center; gap:10px; padding-bottom:7px; border-bottom:1px solid var(--line-100); }
.cust2-ov .led-row:last-child { border-bottom:0; }
.cust2-ov .led-delta { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-weight:700; }
.cust2-ov .led-delta.pos { color:var(--tag-success-text); }
.cust2-ov .led-delta.neg { color:var(--accent-red); }
.cust2-ov .led-ev { font-size:12.5px; color:var(--text-strong); }
.cust2-ov .led-note { font-size:11px; color:var(--text-subtle); }
.cust2-ov .fb-row { display:grid; grid-template-columns:34px minmax(0,1fr) auto; align-items:center; gap:10px; padding-bottom:8px; border-bottom:1px solid var(--line-100); }
.cust2-ov .fb-row:last-child { border-bottom:0; }
.cust2-ov .fb-score { font-family:var(--font-mono); font-variant-numeric:tabular-nums; font-weight:700; }
.cust2-ov .fb-sub { font-family:var(--font-mono); font-size:11.5px; color:var(--text-strong); display:flex; align-items:center; gap:5px; }
.cust2-ov .fb-note { font-size:11.5px; color:var(--text-subtle); }
.cust2-ov .aff-row { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:10px; }
.cust2-ov .aff-nm { font-size:13px; font-weight:600; color:var(--text-strong); }
.cust2-ov .aff-sub { font-size:11.5px; color:var(--text-subtle); }
.cust2-ov .stack { display:flex; flex-direction:column; gap:8px; }
.cust2-ov .actbox { border:1px solid var(--line-200); border-radius:var(--radius-sm); padding:9px 11px; }
.cust2-ov .actbox .as { font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); }
.cust2-ov .actbox .ad { font-size:12.5px; font-weight:600; margin:2px 0; }
.cust2-ov .wa-tpl { width:100%; justify-content:flex-start; text-align:left; height:auto; padding:11px 13px; flex-direction:column; align-items:flex-start; gap:3px; }
.cust2-ov .wa-tpl .wl { font-weight:700; font-size:13px; }
.cust2-ov .wa-tpl .wp { font-size:11px; color:var(--text-subtle); white-space:normal; }
.cust2-ov .lvl-card .lt { font-weight:700; font-size:13px; }
/* == /sub-komponen drawer ================================================== */

/* == VSOS-OPS:BEGIN =========================================================
   Panel operasional VS OS (Template Ketentuan, Console Refund, Antrean Closing).
   Reproduksi anatomi unit 12.04.02: GUI/11 DATA-GRID (.vg-*), GUI/03
   TEXT-SELECT-COMBOBOX (.vs-combo), GUI/03 FILE-UPLOAD (.vs-upl),
   GUI/09 STEPPER (.vs-steps), GUI/13 ACTIVITY-TIMELINE (.vs-atl),
   GUI/24 CHECKLIST (.vs-ckl). Token-only (design-system/tokens.css via app.css). */

/* ---- label form generik ---- */
.vs-lbl { display:flex; flex-direction:column; gap:6px; font-size:11px; font-weight:600; letter-spacing:.04em; text-transform:uppercase; color:var(--text-subtle); min-width:0; }
.vs-lbl > .ctrl, .vs-lbl > .vs-combo { text-transform:none; letter-spacing:normal; }

/* ---- DATA-GRID (GUI/11) — head kicker+judul, sel mono, tag status, aksi ---- */
.vg-panel { overflow:hidden; }
.vg-head { display:flex; align-items:flex-end; justify-content:space-between; gap:12px; padding:16px 16px 13px; border-bottom:1px solid var(--line-200); }
.vg-head > div { display:flex; flex-direction:column; gap:3px; min-width:0; }
.vg-kicker { color:var(--text-subtle); font:600 10.5px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.vg-head > div > b { color:var(--text-strong); font-size:16px; font-weight:700; letter-spacing:-.01em; }
.vg-meta { color:var(--text-subtle); font-size:12.5px; white-space:nowrap; }
.vg-scroll { overflow-x:auto; }
.vg-table { width:100%; }
.vg-table th { padding:9px 12px; text-align:left; font:600 10px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); border-bottom:1px solid var(--line-200); white-space:nowrap; }
.vg-table td { padding:11px 12px; vertical-align:middle; border-bottom:1px solid var(--line-100); }
.vg-table tbody tr:last-child td { border-bottom:0; }
.vg-table td > b { font-size:13.5px; font-weight:600; color:var(--text-strong); }
.vg-sub { display:block; margin-top:2px; font-size:11px; color:var(--text-subtle); }
.vg-num, th.vg-num { text-align:right; font-variant-numeric:tabular-nums; }
.vg-actcell { text-align:right; white-space:nowrap; }
.vg-actions { display:inline-flex; gap:6px; justify-content:flex-end; flex-wrap:wrap; }

/* ---- COMBOBOX (GUI/03/TEXT-SELECT-COMBOBOX) ---- */
.vs-combo { position:relative; min-width:0; }
.vs-combo__shell { display:flex; align-items:center; gap:9px; height:var(--field-h,44px); padding:0 12px 0 13px; background:var(--surface-0); border:1px solid var(--border-input); border-radius:var(--radius-sm); cursor:text; transition:border-color .14s ease, box-shadow .14s ease; }
.vs-combo.is-open .vs-combo__shell, .vs-combo__shell:focus-within { border-color:var(--ink-900); box-shadow:var(--shadow-focus); }
.vs-combo__shell > svg { flex:0 0 auto; color:var(--text-subtle); }
.vs-combo__shell > svg:last-child { color:var(--text-subtle); transition:transform .16s ease; }
.vs-combo.is-open .vs-combo__shell > svg:last-child { transform:rotate(180deg); }
.vs-combo__input { flex:1; min-width:0; border:0; outline:none; background:transparent; font:400 14px var(--font-body); color:var(--text-strong); }
.vs-combo__input::placeholder { color:var(--text-subtle); }
.vs-combo__pop { position:absolute; top:calc(100% + 6px); left:0; right:0; z-index:60; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-sm); box-shadow:var(--shadow-pop); padding:6px; max-height:236px; overflow:auto; }
.vs-combo__opt { display:flex; align-items:center; gap:10px; width:100%; min-height:42px; padding:6px 10px; border:0; border-radius:var(--radius-xs); background:transparent; cursor:pointer; text-align:left; font-family:var(--font-body); color:var(--text-strong); }
.vs-combo__opt:hover, .vs-combo__opt.is-hi { background:var(--surface-1); }
.vs-combo__opt.is-sel { background:var(--surface-1); }
.vs-combo__opt > svg { flex:0 0 auto; color:var(--ink-900); margin-left:auto; }
.vs-combo__opt-main { display:flex; flex-direction:column; gap:1px; min-width:0; }
.vs-combo__opt-l { font-size:13.5px; font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.vs-combo__opt-s { font-size:11.5px; color:var(--text-subtle); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.vs-combo__empty { padding:14px 10px; text-align:center; font-size:12.5px; color:var(--text-subtle); }

/* ---- Template Ketentuan (layout) ---- */
.tt-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; align-items:start; }
.tt-grid > .panel:first-child { grid-column:1 / -1; }
@media (max-width:920px){ .tt-grid { grid-template-columns:1fr; } }
.tt-bindform { border-top:1px solid var(--line-200); padding:14px 16px; }
.tt-bindform-row { display:grid; grid-template-columns:minmax(130px,.9fr) minmax(170px,1.5fr) minmax(140px,1fr) auto; gap:10px; align-items:end; }
@media (max-width:640px){ .tt-bindform-row { grid-template-columns:1fr 1fr; } .tt-bindform-row > button { grid-column:1 / -1; } }
.tt-bindform-row > button { height:var(--field-h,44px); white-space:nowrap; }
.tt-hint { display:flex; align-items:flex-start; gap:6px; margin:10px 2px 0; font-size:11.5px; line-height:1.5; color:var(--text-muted); }
.tt-hint > svg { flex:0 0 auto; margin-top:1px; color:var(--text-subtle); }
.tt-fhint { font-weight:400; text-transform:none; letter-spacing:normal; color:var(--text-subtle); font-size:11px; }
.tt-prev-controls { display:grid; grid-template-columns:minmax(160px,1.4fr) minmax(160px,1.4fr) auto; gap:10px; align-items:end; }
@media (max-width:640px){ .tt-prev-controls { grid-template-columns:1fr; } }
.tt-prev-controls > button { height:var(--field-h,44px); white-space:nowrap; }
.tt-chips { display:flex; flex-wrap:wrap; gap:7px; margin:12px 0 0; }
.tt-chips:empty { margin:0; }
.tt-chip { display:inline-flex; align-items:center; gap:6px; padding:4px 6px 4px 11px; background:var(--surface-1); border:1px solid var(--line-200); border-radius:var(--radius-pill); font-size:12px; color:var(--text-body); }
.tt-chip > button { display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px; padding:0; border:0; border-radius:var(--radius-pill); background:transparent; color:var(--text-subtle); cursor:pointer; }
.tt-chip > button:hover { background:var(--ink-100); color:var(--text-strong); }
.tt-prev-result { margin-top:14px; }
.tt-prev-table td:first-child { color:var(--text-body); font-size:13px; }
/* editor template */
.tt-editor-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; }
@media (max-width:640px){ .tt-editor-grid { grid-template-columns:1fr; } }
.tt-fgroup { border:1px solid var(--line-200); border-radius:var(--radius-sm); overflow:hidden; }
.tt-fgroup-h { padding:9px 13px; background:var(--surface-1); border-bottom:1px solid var(--line-200); font:600 10.5px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; color:var(--text-muted); }
.tt-fgroup-b { padding:12px 13px; display:flex; flex-direction:column; gap:10px; }
.tt-numwrap { position:relative; display:flex; align-items:center; }
.tt-numwrap > .ctrl { flex:1; padding-right:60px; }
.tt-unit { position:absolute; right:12px; font-size:11px; color:var(--text-subtle); pointer-events:none; }

/* ---- STEPPER (GUI/09) — status linier refund ---- */
.vs-steps { display:flex; align-items:flex-start; gap:0; margin:16px 0 4px; }
.vs-step { display:flex; flex-direction:column; align-items:center; gap:8px; flex:0 0 auto; width:92px; text-align:center; }
.vs-step__node { display:inline-flex; align-items:center; justify-content:center; width:32px; height:32px; border-radius:var(--radius-pill); font:700 13px var(--font-body); box-sizing:border-box; }
.vs-step__l { font-size:11px; line-height:1.25; color:var(--text-subtle); }
.vs-step.done .vs-step__node { background:var(--ink-900); color:var(--primary-contrast,#fff); }
.vs-step.done .vs-step__l { color:var(--text-muted); font-weight:500; }
.vs-step.current .vs-step__node { background:var(--brand); border:2px solid var(--ink-900); color:var(--ink-900); }
.vs-step.current .vs-step__l { color:var(--text-strong); font-weight:600; }
.vs-step.current.rej .vs-step__node { background:var(--tag-danger-bg); border-color:var(--tag-danger-text); color:var(--tag-danger-text); }
.vs-step.todo .vs-step__node { background:var(--surface-0); border:1.5px solid var(--line-200); color:var(--text-subtle); }
.vs-step__conn { flex:1; min-width:14px; height:2px; margin-top:15px; background:var(--ink-100,var(--line-200)); }
.vs-step__conn.is-done { background:var(--ink-900); }
.vs-step__conn.is-rej { background:var(--tag-danger-border); }

/* ---- ACTIVITY-TIMELINE (GUI/13) — jejak status refund ---- */
.vs-atl { display:flex; flex-direction:column; }
.vs-atl__row { display:grid; grid-template-columns:28px 1fr; gap:12px; }
.vs-atl__rail { display:flex; flex-direction:column; align-items:center; }
.vs-atl__node { display:inline-flex; align-items:center; justify-content:center; width:26px; height:26px; border-radius:var(--radius-pill); flex-shrink:0; border:1px solid var(--tag-neutral-border); background:var(--tag-neutral-bg); color:var(--tag-neutral-text); }
.vs-atl__node.is-blue { background:var(--tag-blue-bg); border-color:var(--tag-blue-border); color:var(--tag-blue-text); }
.vs-atl__node.is-info { background:var(--tag-info-bg); border-color:var(--tag-info-border); color:var(--tag-info-text); }
.vs-atl__node.is-mint { background:var(--tag-mint-bg); border-color:var(--tag-mint-border); color:var(--tag-mint-text); }
.vs-atl__node.is-purple { background:var(--tag-purple-bg); border-color:var(--tag-purple-border); color:var(--tag-purple-text); }
.vs-atl__node.is-success { background:var(--tag-success-bg); border-color:var(--tag-success-border); color:var(--tag-success-text); }
.vs-atl__node.is-danger { background:var(--tag-danger-bg); border-color:var(--tag-danger-border); color:var(--tag-danger-text); }
.vs-atl__conn { width:1.5px; flex:1; min-height:14px; background:var(--line-200); margin:4px 0; }
.vs-atl__body { display:flex; flex-direction:column; gap:3px; padding-bottom:16px; min-width:0; }
.vs-atl__t { font-size:13px; color:var(--text-body); }
.vs-atl__t b { color:var(--text-strong); font-weight:600; }
.vs-atl__note { font-size:12px; color:var(--text-muted); background:var(--surface-1); border:1px solid var(--line-100); border-radius:var(--radius-xs); padding:6px 9px; }
.vs-atl__meta { font-size:11px; color:var(--text-subtle); letter-spacing:.02em; }

/* ---- FILE-UPLOAD (GUI/03) ---- */
.vs-upl { display:flex; flex-direction:column; gap:12px; }
.vs-upl__zone { display:flex; flex-direction:column; align-items:center; gap:9px; text-align:center; padding:22px; border:1.5px dashed var(--border-input); border-radius:var(--radius-md); cursor:pointer; transition:border-color .15s ease, background .15s ease; }
.vs-upl__zone:hover, .vs-upl__zone.drag, .vs-upl__zone:focus-visible { border-color:var(--ink-400,var(--text-subtle)); background:var(--surface-1); outline:none; }
.vs-upl__zone.has-file { display:none; }
.vs-upl__ic { display:inline-flex; align-items:center; justify-content:center; width:42px; height:42px; border-radius:var(--radius-pill); background:var(--ink-050); color:var(--text-strong); }
.vs-upl__t { font-size:13px; color:var(--text-body); }
.vs-upl__pick { font-weight:600; text-decoration:underline; text-underline-offset:3px; }
.vs-upl__hint { font-size:11.5px; color:var(--text-subtle); }
.vs-upl__row { display:flex; align-items:center; gap:12px; padding:10px 12px; border:1px solid var(--line-200); border-radius:var(--radius-sm); }
.vs-upl__fic { flex:0 0 auto; width:34px; height:34px; display:inline-flex; align-items:center; justify-content:center; color:var(--text-muted); border-radius:var(--radius-xs); overflow:hidden; }
.vs-upl__fic img { width:34px; height:34px; object-fit:cover; border-radius:var(--radius-xs); }
.vs-upl__meta { flex:1; min-width:0; display:flex; flex-direction:column; gap:6px; }
.vs-upl__frow { display:flex; align-items:center; justify-content:space-between; gap:10px; }
.vs-upl__fname { font-size:13px; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.vs-upl__pct { font-size:11.5px; color:var(--text-subtle); }
.vs-upl__track { height:5px; border-radius:var(--radius-pill); background:var(--ink-050); overflow:hidden; }
.vs-upl__fill { height:100%; width:0; background:var(--ink-900); border-radius:var(--radius-pill); transition:width .2s ease; }
.vs-upl__x { flex:0 0 auto; width:28px; height:28px; display:inline-flex; align-items:center; justify-content:center; border:0; border-radius:var(--radius-xs); background:transparent; color:var(--text-subtle); cursor:pointer; }
.vs-upl__x:hover { background:var(--surface-1); color:var(--text-strong); }

/* ---- Weekly Check: baris pemeriksaan aset (Brief Inventory Fase 2.1) ----
   Baris komposit = GRID auto | minmax(0,1fr) | auto | auto (aturan owner untuk baris
   ikon+teks+kontrol+aksi), BUKAN sel tabel: kolomnya kini memuat select, combobox, dan
   dropzone sehingga tabel akan overlap di layar sempit. Sub-baris detail (lokasi ditemukan
   + foto) disembunyikan sampai dibutuhkan supaya pemeriksaan cepat OK/OK → Simpan tetap
   satu tarikan napas. Warna/radius/shadow dari token; ritme spacing mengikuti komposit DS
   di atasnya (.vs-upl/.vs-combo/.vg-*) agar satu file tetap satu bahasa. */
.inv-chk-list { display:flex; flex-direction:column; }
.inv-chk { border-bottom:1px solid var(--line-100); }
.inv-chk:last-child { border-bottom:0; }
.inv-chk.is-open { background:var(--surface-1); }
.inv-chk-main { display:grid; grid-template-columns:auto minmax(0,1fr) auto auto; align-items:center; gap:12px; padding:11px 16px; }
.inv-chk-ic { flex:0 0 auto; display:inline-flex; align-items:center; justify-content:center; width:30px; height:30px; border-radius:var(--radius-xs); background:var(--surface-1); color:var(--text-subtle); }
.inv-chk.is-open .inv-chk-ic { background:var(--surface-0); }
.inv-chk-id { min-width:0; display:flex; flex-direction:column; gap:2px; }
.inv-chk-id > b { font-size:13.5px; font-weight:600; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.inv-chk-sub { font-size:11.5px; color:var(--text-subtle); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.inv-chk-sub b { font-weight:600; color:var(--text-strong); }
.inv-chk-ctl { display:flex; align-items:flex-end; gap:10px; }
.inv-chk-f { display:flex; flex-direction:column; gap:4px; min-width:0; }
.inv-chk-f > span { font:600 10px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); white-space:nowrap; }
.inv-chk-f .ctrl { height:36px; min-width:84px; }
.inv-chk-act { display:flex; align-items:center; gap:6px; justify-content:flex-end; white-space:nowrap; }
.inv-chk-dmg { display:inline-flex; align-items:center; color:var(--danger); }
.inv-chk-act .abtn { position:relative; }
.inv-chk-dot { position:absolute; top:3px; right:3px; width:6px; height:6px; border-radius:var(--radius-pill); background:var(--ink-900); }
.inv-chk-det { padding:0 16px 14px; border-top:1px dashed var(--line-200); margin-top:2px; padding-top:12px; }
.inv-chk-det-g { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:12px; }
.inv-chk-det .frow { margin-bottom:10px; }
.inv-chk-det .fhint { margin-top:5px; }
@media (max-width:820px) {
  .inv-chk-main { grid-template-columns:auto minmax(0,1fr); grid-template-areas:"ic id" "ctl ctl" "act act"; row-gap:10px; }
  .inv-chk-ic { grid-area:ic; } .inv-chk-id { grid-area:id; }
  .inv-chk-ctl { grid-area:ctl; } .inv-chk-act { grid-area:act; justify-content:flex-start; flex-wrap:wrap; }
  .inv-chk-ctl .inv-chk-f { flex:1; }
  .inv-chk-det-g { grid-template-columns:minmax(0,1fr); }
}

/* ---- Foto Kelengkapan aset: strip thumbnail + hapus per foto (Brief Inventory Fase 2.2) ---- */
.inv-gal { display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.inv-gal-i { position:relative; display:inline-flex; }
.inv-gal-i img { width:56px; height:56px; object-fit:cover; border-radius:var(--radius-xs); border:1px solid var(--line-200); display:block; }
.inv-gal-x { position:absolute; top:-5px; right:-5px; width:20px; height:20px; display:inline-flex; align-items:center; justify-content:center; border:1px solid var(--line-200); border-radius:var(--radius-pill); background:var(--surface-0); color:var(--text-subtle); cursor:pointer; box-shadow:var(--shadow-xs,none); }
.inv-gal-x:hover { color:var(--danger); border-color:var(--danger); }

/* ---- Console Refund (layout) ---- */
.rfc-toolbar { display:flex; flex-wrap:wrap; gap:10px; margin-bottom:14px; align-items:center; }
.rfc-search { display:flex; align-items:center; gap:8px; flex:1; min-width:220px; height:38px; padding:0 12px; border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); }
.rfc-search > svg { color:var(--text-subtle); flex:0 0 auto; }
.rfc-search-inp { flex:1; min-width:0; border:0; outline:none; background:transparent; font:400 13.5px var(--font-body); color:var(--text-strong); }
.rfc-refs { display:flex; flex-wrap:wrap; gap:6px; }
.rfc-ref { display:inline-flex; align-items:center; gap:4px; font:500 11.5px var(--font-mono); color:var(--text-muted); background:var(--surface-1); border:1px solid var(--line-200); border-radius:var(--radius-xs); padding:2px 7px; }
.rfc-ref > svg { color:var(--text-subtle); }
.rfc-table tbody tr[data-rfc-open] { cursor:pointer; }
.rfc-table tbody tr[data-rfc-open]:hover { background:var(--surface-1); }
.rfc-table tbody tr[data-rfc-open]:focus-visible { outline:none; box-shadow:inset 0 0 0 2px var(--ink-900); }
.rfc-table .vg-actcell svg { color:var(--text-subtle); vertical-align:middle; }
.rfc-sla-over { color:var(--tag-danger-text); font-weight:600; }
.rfc-sla-soon { color:var(--tag-warning-text); font-weight:600; }
.rfc-detail-head { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.rfc-tno { font-size:12px; color:var(--text-subtle); }
.rfc-reject-banner { display:flex; align-items:flex-start; gap:8px; margin:4px 0 0; padding:10px 12px; background:var(--tag-danger-bg); border:1px solid var(--tag-danger-border); border-radius:var(--radius-sm); font-size:12.5px; color:var(--tag-danger-text); }
.rfc-cols { display:grid; grid-template-columns:1.15fr .85fr; gap:16px; margin-top:14px; align-items:start; }
@media (max-width:720px){ .rfc-cols { grid-template-columns:1fr; } }
.rfc-col { display:flex; flex-direction:column; gap:14px; min-width:0; }
.rfc-card { border:1px solid var(--line-200); border-radius:var(--radius-sm); overflow:hidden; }
.rfc-card-h { padding:9px 13px; background:var(--surface-1); border-bottom:1px solid var(--line-200); font:600 10.5px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; color:var(--text-muted); }
.rfc-dl { padding:6px 13px; }
.rfc-kv { display:grid; grid-template-columns:minmax(0,120px) minmax(0,1fr); gap:12px; align-items:baseline; padding:7px 0; border-bottom:1px solid var(--line-100); }
.rfc-kv:last-child { border-bottom:0; }
.rfc-k { font-size:11px; font-weight:600; letter-spacing:.04em; text-transform:uppercase; color:var(--text-subtle); }
.rfc-v { font-size:13px; color:var(--text-body); overflow-wrap:break-word; min-width:0; }
.rfc-v.rfc-strong { font-weight:700; color:var(--text-strong); }
.rfc-note-blk { padding:10px 13px; border-top:1px solid var(--line-100); }
.rfc-note-blk .rfc-k { display:block; margin-bottom:4px; }
.rfc-note-blk p { margin:0; font-size:12.5px; line-height:1.5; color:var(--text-body); }
.rfc-entry { display:flex; align-items:center; gap:11px; padding:12px 13px; background:var(--tag-mint-bg); border:1px solid var(--tag-mint-border); border-radius:var(--radius-sm); }
.rfc-entry > svg { color:var(--tag-mint-text); flex:0 0 auto; }
.rfc-entry > div { flex:1; min-width:0; }
.rfc-entry b { display:block; font-size:13px; color:var(--text-strong); }
.rfc-entry small { font-size:11.5px; color:var(--text-muted); }
.rfc-actions { border:1px solid var(--line-200); border-radius:var(--radius-sm); padding:13px; }
.rfc-act-h { font:600 10.5px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; color:var(--text-muted); margin-bottom:10px; }
.rfc-act-row { display:flex; flex-wrap:wrap; gap:8px; }
.rfc-form { display:flex; flex-direction:column; gap:12px; }
.rfc-form-foot { display:flex; justify-content:flex-end; gap:8px; margin-top:2px; }

/* ---- CHECKLIST (GUI/24) — langkah closing per booking ---- */
.vs-ckl { border:1px solid var(--line-200); border-radius:var(--radius-sm); padding:12px 13px; display:flex; flex-direction:column; gap:11px; }
.vs-ckl-head { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.vs-ckl-kicker { font:600 10px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; color:var(--text-subtle); }
.vs-ckl-count { font-size:11.5px; color:var(--text-strong); }
.vs-ckl-track { height:8px; border-radius:var(--radius-pill); background:var(--ink-050); overflow:hidden; }
.vs-ckl-fill { height:100%; background:var(--ink-900); border-radius:var(--radius-pill); transition:width .2s ease; }
.vs-ckl-list { display:flex; flex-direction:column; gap:2px; }
.vs-ckl-item { display:flex; align-items:center; gap:11px; padding:6px 2px; }
.vs-ckl-box { flex:0 0 auto; display:inline-flex; align-items:center; justify-content:center; width:20px; height:20px; border-radius:var(--radius-xs); border:1.5px solid var(--border-input); background:var(--surface-0); color:var(--primary-contrast,#fff); transition:all .14s ease; }
.vs-ckl-item.is-done .vs-ckl-box { border-color:var(--primary); background:var(--primary); }
.vs-ckl-label { font-size:13px; color:var(--text-strong); }
.vs-ckl-item.is-done .vs-ckl-label { color:var(--text-subtle); }
.vs-ckl-when { margin-left:6px; font-size:10.5px; color:var(--text-subtle); }

/* ---- Antrean & Closing Harian (layout) ---- */
.qc-summary { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:14px; padding:16px 18px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-card); margin-bottom:16px; }
.qc-sum-stat { display:flex; flex-direction:column; gap:2px; }
.qc-sum-k { font:600 10px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; color:var(--text-subtle); }
.qc-sum-n { font:700 30px/1 var(--font-display); color:var(--text-strong); letter-spacing:-.02em; }
.qc-sum-n.is-open { color:var(--tag-warning-text); }
.qc-sum-d { font-size:11.5px; color:var(--text-subtle); }
.qc-sum-act { display:flex; flex-direction:column; align-items:flex-end; gap:6px; }
.qc-sum-reason { display:inline-flex; align-items:center; gap:6px; font-size:11.5px; color:var(--text-muted); text-align:right; }
.qc-sum-reason > svg { flex:none; color:var(--text-subtle); }
.qc-cards { display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:14px; }
.qc-card { display:flex; flex-direction:column; gap:12px; padding:15px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-card); }
.qc-card-head { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:11px; }
.qc-card .vs-avatar { width:36px; height:36px; font:600 12px/1 var(--font-body); }
.qc-card-id { min-width:0; }
.qc-card-id b { display:block; font-size:14px; font-weight:600; color:var(--text-strong); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.qc-card-id small { font-size:11px; color:var(--text-subtle); }
.qc-card-tags { display:flex; flex-direction:column; gap:4px; align-items:flex-end; }
.qc-card-meta { display:flex; flex-wrap:wrap; gap:6px; }
.qc-meta-chip { display:inline-flex; align-items:center; gap:5px; font-size:11px; color:var(--text-muted); background:var(--surface-1); border:1px solid var(--line-200); border-radius:var(--radius-xs); padding:2px 8px; }
.qc-meta-chip > svg { flex:none; color:var(--text-subtle); }
.qc-card-actions { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.qc-card-actions .abtn { width:100%; justify-content:center; }
.qc-card-warn { display:flex; align-items:flex-start; gap:7px; padding:9px 11px; background:var(--tag-danger-bg); border:1px solid var(--tag-danger-border); border-radius:var(--radius-sm); font-size:11.5px; line-height:1.45; color:var(--tag-danger-text); }
.qc-card-warn > svg { flex:none; margin-top:1px; }
.qc-empty { display:flex; flex-direction:column; align-items:center; gap:6px; padding:40px 20px; text-align:center; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); }
.qc-empty > svg { color:var(--tag-mint-text); }
.qc-empty b { font-size:15px; color:var(--text-strong); }
.qc-empty span { font-size:12.5px; color:var(--text-muted); }
.qc-decided { margin-top:16px; }
/* == VSOS-OPS:END ========================================================== */

/* == OPS-MASTERDATA-REFRESH:BEGIN ==========================================
   Resource · Katalog · Inventori
   Adapter token-only untuk GUI/11 Data Grid, GUI/12 Toolbar, StatCard,
   Fresh Tags, dan Composite 04 Inventory. */
.ops-module {
  display:flex;
  flex-direction:column;
  gap:var(--space-5);
  min-width:0;
}
.ops-subnav {
  margin:0;
  overflow-x:auto;
  scrollbar-width:thin;
}
.ops-context {
  display:flex;
  align-items:flex-start;
  gap:var(--space-3);
  min-height:44px;
  padding:var(--space-4) var(--space-5);
  color:var(--text-body);
  background:var(--surface-0);
  border:1px solid var(--border-default);
  border-radius:var(--radius-sm);
}
.ops-context > svg {
  flex:none;
  margin-top:var(--space-1);
  color:var(--text-subtle);
}
.ops-context > div {
  display:flex;
  flex-wrap:wrap;
  align-items:baseline;
  gap:var(--space-2) var(--space-3);
  min-width:0;
}
.ops-context b {
  color:var(--text-strong);
  font-size:var(--text-xs);
  font-weight:var(--fw-semibold);
}
.ops-context span {
  color:var(--text-muted);
  font-size:var(--text-xs);
  line-height:var(--lh-normal);
}

.ops-kpi-grid {
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:var(--space-4);
}
.ops-stat { min-width:0; }
.ops-stat .vs-stat__value {
  overflow:hidden;
  text-overflow:ellipsis;
  font-variant-numeric:tabular-nums;
}
.ops-stat--ok .vs-stat__icon,
.ops-stat--ok .vs-stat__value { color:var(--tag-success-text); }
.ops-stat--warn .vs-stat__icon,
.ops-stat--warn .vs-stat__value { color:var(--tag-warning-text); }

.ops-signal-strip {
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-3);
  padding:var(--space-3);
  background:var(--surface-0);
  border:1px solid var(--border-default);
  border-radius:var(--radius-sm);
}
.ops-signal {
  display:inline-flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-3);
  flex:1 1 150px;
  min-height:36px;
  padding:var(--space-2) var(--space-3);
  color:var(--text-muted);
  background:var(--surface-1);
  border:1px solid var(--border-faint);
  border-radius:var(--radius-xs);
  font-size:var(--text-2xs);
}
.ops-signal b {
  color:var(--text-strong);
  font-size:var(--text-xs);
  font-variant-numeric:tabular-nums;
}
.ops-signal--warn {
  color:var(--tag-warning-text);
  background:var(--tag-warning-bg);
  border-color:var(--tag-warning-border);
}
.ops-signal--warn b { color:var(--tag-warning-text); }

.ops-toolbar {
  position:sticky;
  top:var(--space-3);
  z-index:10;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--space-3);
  padding:var(--space-4);
  background:var(--surface-0);
  border:1px solid var(--border-default);
  border-radius:var(--radius-md);
  box-shadow:var(--shadow-card);
}
.ops-toolbar .vs-field__control {
  flex:1 1 156px;
  width:auto;
  min-width:128px;
  max-width:100%;
  min-height:44px;
}
.ops-search {
  display:flex;
  align-items:center;
  gap:var(--space-3);
  flex:1 1 200px;
  min-width:min(180px,100%);
  min-height:44px;
  padding:0 var(--space-4);
  color:var(--text-subtle);
  background:var(--surface-0);
  border:1px solid var(--border-input);
  border-radius:var(--radius-sm);
  transition:border-color .16s ease,box-shadow .16s ease;
}
.ops-search:focus-within {
  color:var(--text-strong);
  border-color:var(--border-strong);
  box-shadow:var(--shadow-focus);
}
.ops-search input {
  flex:1;
  min-width:0;
  border:0;
  outline:0;
  color:var(--text-strong);
  background:transparent;
  font:var(--fw-medium) var(--text-xs)/var(--lh-normal) var(--font-body);
}
.ops-search input::placeholder { color:var(--text-subtle); }
/* Segmented view switch tidak boleh melebarkan halaman saat tab-nya banyak
   (Schedule punya 6 tab): tetap flex:none, tapi dibatasi lebar toolbar & digulir. */
.ops-view-switch { flex:none; max-width:100%; overflow-x:auto; scrollbar-width:none; }
.ops-view-switch::-webkit-scrollbar { display:none; }
/* Brand tab switch di toolbar — segmented, tidak melebar mengikuti sisa ruang */
.ops-brand-tabs { flex:none; }
.ops-brand-tabs .vs-tab { padding-inline:12px; gap:6px; }
.ops-brand-tabs__n { font-size:10.5px; color:var(--text-subtle); font-variant-numeric:tabular-nums; }
.ops-brand-tabs .vs-tab[aria-selected="true"] .ops-brand-tabs__n { color:inherit; opacity:.7; }
/* Cakupan data (mis. Aktif ⇄ Arsip di Utility) — segmented, selebar isinya saja */
.ops-scope-tabs { flex:none; }
.ops-scope-tabs .vs-tab { padding-inline:12px; gap:6px; }
.ops-scope-tabs .vs-tab[aria-selected="true"] .ops-brand-tabs__n { color:inherit; opacity:.7; }

/* ---------- Kunci view & filter (IconButton toggle, aria-pressed) ----------
   State terkunci HARUS terbaca tanpa membaca tooltip: ikon kunci jadi kontras
   penuh + latar brand-line, ditemani Tag "Terkunci", dan kontrol yang dibekukan
   diberi opasitas rendah + cursor not-allowed. */
/* Group-by adalah BARIS KEDUA dari toolbar yang sama, bukan kartu terpisah:
   view + filter + group-by = satu unit yang dikunci/dibuka bersama. */
.ops-toolbar .grp-ctrl {
  flex:1 1 100%; margin:0; padding:var(--space-3) 0 0;
  background:transparent; border:0; border-top:1px solid var(--line-100); border-radius:0;
}
.ops-lock { flex:0 0 auto; color:var(--text-muted); }
.ops-lock:hover:not(:disabled) { color:var(--text-strong); background:var(--surface-1); }
.ops-lock[aria-pressed="true"] {
  color:var(--brand-ink); background:var(--brand); border-color:var(--brand-line);
}
.ops-lock-tag { flex:0 0 auto; }
/* Kontrol beku — indikasi visual, bukan hanya atribut disabled */
.ops-toolbar.is-locked .vs-field__control:disabled,
.ops-toolbar.is-locked .ops-search:has(input:disabled),
.ops-toolbar.is-locked .ops-view-switch .vs-tab:disabled,
.ops-toolbar.is-locked .ops-brand-tabs .vs-tab:disabled,
.grp-ctrl.is-locked .grp-add:disabled,
.grp-ctrl.is-locked .gk-x:disabled {
  opacity:.55; cursor:not-allowed;
}
/* Urutan tabel ikut preset yang dikunci, jadi tombol header sort juga dibekukan. */
.ops-module .tbl thead .sort-th:disabled { opacity:.55; cursor:not-allowed; }
.ops-toolbar.is-locked .ops-search input:disabled { cursor:not-allowed; }
.ops-toolbar .db-size select {
  min-height:44px;
  color:var(--text-body);
  background:var(--surface-0);
  border-color:var(--border-input);
  border-radius:var(--radius-sm);
}

.ops-data-card {
  margin:0;
  overflow:hidden;
}
.ops-data-head {
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-4);
  padding:var(--space-5) var(--space-6);
  border-bottom:1px solid var(--border-default);
}
.ops-data-head > div { min-width:0; }
.ops-data-head h2 {
  margin:var(--space-1) 0;
  color:var(--text-strong);
  font-size:var(--text-h4);
  font-weight:var(--fw-semibold);
  line-height:var(--lh-snug);
}
.ops-data-head p {
  margin:0;
  color:var(--text-subtle);
  font-size:var(--text-xs);
  line-height:var(--lh-normal);
}
.ops-kicker {
  display:block;
  color:var(--text-subtle);
  font:var(--fw-semibold) var(--text-2xs)/var(--lh-normal) var(--font-mono);
  letter-spacing:var(--ls-label-sm);
  text-transform:uppercase;
}
.ops-table-scroll {
  max-width:100%;
  overflow-x:auto;
}
.ops-data-card .tbl { margin:0; }
.ops-data-card .tbl th {
  position:sticky;
  top:0;
  z-index:1;
  background:var(--surface-1);
}
.ops-data-card .tbl tbody tr {
  transition:background-color .14s ease,box-shadow .14s ease;
}
.ops-data-card .tbl tbody tr:hover {
  background:var(--surface-1);
  box-shadow:inset 3px 0 0 var(--border-strong);
}
.ops-data-card .db-pager {
  margin:0;
  padding:var(--space-4) var(--space-5);
  border-top:1px solid var(--border-default);
}
/* Body untuk mode non-tabel (Gallery) — kartu duduk di surface yang sama dgn List. */
.ops-grid-body { padding:var(--space-5) var(--space-6); }
.ops-grid-body .gallery-grid { margin:0; }
/* Grouped gallery: grid kartu jadi daun di dalam pohon grup. */
.grp-wrap--gallery .grp-body > .gallery-grid { padding:var(--space-4); }
/* Board memakai kartu gallery yang sama, tapi disusun mendatar: thumbnail kecil
   di kiri + isi di kanan — kartu tetap ringkas & hemat ruang kolom.
   Baris komposit → grid auto|minmax(0,1fr) (bukan flex) supaya kolom teks bisa
   menyusut tanpa mendorong/menimpa thumbnail. */
.board-items > .gal-card {
  display:grid;
  grid-template-columns:auto minmax(0,1fr);
  align-items:start;
  gap:10px;
  padding:8px;
  flex:none;   /* .board-items = flex column → tanpa ini kartu menyusut & isinya terpotong */
}
.board-items > .gal-card:hover { transform:none; }
.board-items > .gal-card .gal-cover {
  width:44px; height:44px;
  aspect-ratio:auto;
  border-radius:var(--r-sm);
}
/* Thumb 44px tak muat teks apa pun — label kategori disembunyikan, dan overlay
   (badge status / "Nonaktif") memang tidak dirender di layout compact; keduanya
   turun jadi chip di baris teks. Selector overlay tetap ada sbg jaring pengaman. */
.board-items > .gal-card .gal-cover .vf-label,
.board-items > .gal-card .gal-cover .badge,
.board-items > .gal-card .gal-cover .muted-tag { display:none; }
.board-items > .gal-card .gal-body { padding:0; min-width:0; }
.board-items > .gal-card .gal-body .sub { font-size:10px; line-height:1.35; }
.board-items > .gal-card .gal-body .nm {
  font-size:12px; line-height:1.3; margin-top:1px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.board-items > .gal-card .gal-body .cat {
  display:flex; flex-wrap:wrap; gap:3px;
  margin-top:4px; font-size:10.5px;
}
.board-items > .gal-card .gal-body .cat .cat-tag { font-size:9.5px; padding:1px 6px; }
.board-items > .gal-card .gal-body .row-tags {
  margin-top:3px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.board-items > .gal-card .gal-body .pr { margin-top:3px; font-size:11px; }
.board-items > .gal-card[draggable="true"] { cursor:grab; }
.board-items > .gal-card.is-dragging { opacity:.4; }
.board-items > .gal-card .row-tags { margin-top:3px; }
.ops-actions { text-align:right; }
.ops-num {
  color:var(--text-strong);
  font-size:var(--text-xs);
  font-variant-numeric:tabular-nums;
}
.ops-empty {
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:var(--space-2);
  color:var(--text-subtle);
  text-align:center;
}
.ops-empty b {
  color:var(--text-strong);
  font-size:var(--text-sm);
}
.ops-empty span {
  max-width:48ch;
  color:var(--text-muted);
  font-size:var(--text-xs);
  line-height:var(--lh-normal);
}
.ops-empty--page { padding:var(--space-10) var(--space-6); }

.ops-module .grp-ctrl,
.ops-module .db-bulk {
  margin:0;
  border-color:var(--border-default);
  border-radius:var(--radius-sm);
  box-shadow:none;
}
.ops-module--catalog .cat-subnav { margin:0; }
.ops-module--catalog #catBody {
  display:flex;
  flex-direction:column;
  gap:var(--space-4);
}
.ops-module :is(.vs-btn,.vs-iconbtn,.abtn):active:not(:disabled) {
  transform:scale(.96);
}
.ops-module :is(.vs-btn,.vs-iconbtn,.abtn):focus-visible {
  outline:none;
  box-shadow:var(--shadow-focus);
}
@media (prefers-reduced-motion:reduce) {
  .ops-module :is(.ops-search,.tbl tbody tr,.vs-btn,.vs-iconbtn,.abtn) {
    transition:none;
  }
  .ops-module :is(.vs-btn,.vs-iconbtn,.abtn):active:not(:disabled) {
    transform:none;
  }
}
/* == OPS-MASTERDATA-REFRESH:END ============================================ */

/* == CATALOG-CATEGORY-COMPOSER:BEGIN =======================================
   Category tree + focused detail composer.
   Library mapping: GUI/08 Navigation, GUI/03 Forms, GUI/13 Detail views. */
.catcat-shell { min-width:0; }
.catcat-toolbar {
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--space-3);
  padding:var(--space-4);
  background:var(--surface-0);
  border:1px solid var(--border-default);
  border-radius:var(--radius-md);
  box-shadow:var(--shadow-card);
}
.catcat-toolbar .ops-search {
  flex:1 1 280px;
  min-width:min(280px,100%);
}
.catcat-filter {
  flex:none;
  margin:0;
}
.catcat-filter-note {
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
  flex:1 1 100%;
  color:var(--text-subtle);
  font-size:var(--text-2xs);
  line-height:var(--lh-normal);
}
.catcat-filter-note svg { flex:none; }

.catcat-workspace {
  display:grid;
  grid-template-columns:minmax(260px,320px) minmax(0,1fr);
  gap:var(--space-5);
  align-items:start;
  min-width:0;
}
.catcat-nav {
  position:sticky;
  top:var(--space-3);
  display:flex;
  flex-direction:column;
  max-height:calc(100vh - var(--space-8));
  margin:0;
  overflow:hidden;
}
.catcat-nav-head,
.catcat-editor-head {
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:var(--space-4);
  padding:var(--space-5);
  border-bottom:1px solid var(--border-default);
}
.catcat-nav-head h2,
.catcat-editor-head h2 {
  margin:var(--space-1) 0 0;
  color:var(--text-strong);
  font-size:var(--text-h4);
  font-weight:var(--fw-semibold);
  line-height:var(--lh-snug);
}
.catcat-nav-list {
  display:flex;
  flex-direction:column;
  gap:var(--space-1);
  min-height:120px;
  padding:var(--space-3);
  overflow:auto;
}
.catcat-nav-item {
  position:relative;
  display:grid;
  grid-template-columns:auto minmax(0,1fr) auto auto;
  align-items:start;
  gap:var(--space-3);
  width:100%;
  min-height:44px;
  padding:var(--space-3);
  color:var(--text-body);
  background:transparent;
  border:0;
  border-radius:var(--radius-sm);
  font-family:var(--font-body);
  text-align:left;
  cursor:pointer;
  transition:background-color .14s ease,color .14s ease;
}
.catcat-nav-item:hover { background:var(--surface-1); }
.catcat-nav-item.is-active {
  color:var(--text-strong);
  background:var(--surface-1);
}
.catcat-nav-item:focus-visible {
  outline:none;
  box-shadow:var(--shadow-focus);
}
.catcat-nav-item[hidden] { display:none; }
.catcat-nav-tick {
  position:absolute;
  top:var(--space-3);
  bottom:var(--space-3);
  left:0;
  width:3px;
  background:transparent;
  border-radius:0 var(--radius-xs) var(--radius-xs) 0;
}
.catcat-nav-item.is-active .catcat-nav-tick { background:var(--identity-yellow); }
.catcat-nav-icon {
  display:grid;
  place-items:center;
  width:32px;
  height:32px;
  color:var(--text-subtle);
  background:var(--surface-0);
  border:1px solid var(--border-faint);
  border-radius:var(--radius-xs);
}
.catcat-nav-item.is-active .catcat-nav-icon {
  color:var(--text-strong);
  border-color:var(--border-default);
}
.catcat-nav-copy {
  display:flex;
  flex-direction:column;
  gap:var(--space-1);
  min-width:0;
}
.catcat-nav-title {
  overflow:hidden;
  color:var(--text-strong);
  font-size:var(--text-xs);
  font-weight:var(--fw-semibold);
  line-height:var(--lh-normal);
  text-overflow:ellipsis;
  white-space:nowrap;
}
.catcat-nav-key {
  overflow:hidden;
  color:var(--text-subtle);
  font-size:var(--text-2xs);
  font-variant-numeric:tabular-nums;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.catcat-nav-children {
  display:flex;
  flex-direction:column;
  gap:var(--space-1);
  margin-top:var(--space-2);
  padding-left:var(--space-4);
  border-left:1px solid var(--border-default);
}
.catcat-nav-children > span {
  position:relative;
  display:flex;
  align-items:center;
  gap:var(--space-2);
  min-width:0;
  color:var(--text-muted);
  font-size:var(--text-2xs);
  line-height:var(--lh-normal);
}
.catcat-nav-children > span.is-off { color:var(--text-disabled); }
.catcat-nav-children > span i {
  position:absolute;
  top:50%;
  left:calc(var(--space-4) * -1);
  width:var(--space-3);
  border-top:1px solid var(--border-default);
}
.catcat-nav-children em {
  margin-left:auto;
  color:var(--tag-blue-text);
  font-size:var(--text-2xs);
  font-style:normal;
}
.catcat-nav-count {
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-width:22px;
  height:22px;
  padding:0 var(--space-2);
  color:var(--text-muted);
  background:var(--surface-0);
  border:1px solid var(--border-default);
  border-radius:var(--radius-pill);
  font-size:var(--text-2xs);
  font-variant-numeric:tabular-nums;
}
.catcat-nav-item > svg {
  margin-top:var(--space-2);
  color:var(--text-subtle);
}
.catcat-nav-empty,
.catcat-no-selection,
.catcat-empty-sub {
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:var(--space-2);
  color:var(--text-subtle);
  text-align:center;
}
.catcat-nav-empty { min-height:160px; padding:var(--space-5); }
.catcat-no-selection { min-height:320px; }
.catcat-no-selection b,
.catcat-empty-sub b {
  color:var(--text-strong);
  font-size:var(--text-sm);
}
.catcat-no-selection span,
.catcat-empty-sub span {
  color:var(--text-muted);
  font-size:var(--text-xs);
}

.catcat-create {
  display:flex;
  flex-direction:column;
  gap:var(--space-3);
  margin-top:auto;
  padding:var(--space-4);
  background:var(--surface-1);
  border-top:1px solid var(--border-default);
}
.catcat-create-head {
  display:flex;
  align-items:flex-start;
  gap:var(--space-2);
}
.catcat-create-head > svg {
  flex:none;
  margin-top:var(--space-1);
  color:var(--text-subtle);
}
.catcat-create-head div {
  display:flex;
  flex-direction:column;
  gap:var(--space-1);
}
.catcat-create-head b {
  color:var(--text-strong);
  font-size:var(--text-xs);
}
.catcat-create-head span {
  color:var(--text-subtle);
  font-size:var(--text-2xs);
}
.catcat-create > div:last-child {
  display:grid;
  grid-template-columns:minmax(0,1fr) auto;
  gap:var(--space-2);
}

.catcat-detail { min-width:0; }
.catcat-card.catcat-editor {
  margin:0;
  padding:0;
  border-radius:var(--radius-md);
}
.catcat-editor-head {
  align-items:center;
  padding:var(--space-5) var(--space-6);
}
.catcat-editor-head p {
  display:flex;
  align-items:center;
  gap:var(--space-2);
  margin:var(--space-1) 0 0;
  color:var(--text-subtle);
  font-size:var(--text-xs);
}
.catcat-editor-head p span { display:flex; }
.catcat-editor-actions {
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  justify-content:flex-end;
  gap:var(--space-2);
}
.catcat-editor-actions .vs-btn--danger {
  color:var(--tag-danger-text);
  background:var(--tag-danger-bg);
  border-color:var(--tag-danger-border);
}
.catcat-editor-body {
  display:flex;
  flex-direction:column;
}
.catcat-section {
  display:flex;
  flex-direction:column;
  gap:var(--space-5);
  padding:var(--space-6);
  border-bottom:1px solid var(--border-default);
}
.catcat-section:last-child { border-bottom:0; }
.catcat-section-head {
  display:flex;
  align-items:flex-start;
  gap:var(--space-3);
}
.catcat-section-head > span {
  display:inline-flex;
  align-items:center;
  justify-content:center;
  flex:none;
  width:32px;
  height:32px;
  color:var(--text-muted);
  background:var(--surface-1);
  border:1px solid var(--border-default);
  border-radius:var(--radius-xs);
  font-size:var(--text-2xs);
  font-weight:var(--fw-semibold);
  font-variant-numeric:tabular-nums;
}
.catcat-section-head h3 {
  margin:0;
  color:var(--text-strong);
  font-size:var(--text-sm);
  font-weight:var(--fw-semibold);
  line-height:var(--lh-normal);
}
.catcat-section-head p {
  margin:var(--space-1) 0 0;
  color:var(--text-subtle);
  font-size:var(--text-xs);
  line-height:var(--lh-normal);
}
.catcat-field-grid {
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--space-4);
}
.catcat-field {
  display:flex;
  flex-direction:column;
  gap:var(--space-2);
  min-width:0;
}
.catcat-field > span {
  color:var(--text-strong);
  font-size:var(--text-xs);
  font-weight:var(--fw-semibold);
}
.catcat-field > span small,
.catcat-field > small {
  color:var(--text-subtle);
  font-size:var(--text-2xs);
  font-weight:var(--fw-regular);
  line-height:var(--lh-normal);
}
.catcat-field--template { max-width:420px; }
.catcat-brandchips {
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--space-2);
}
.catcat-bc {
  min-height:26px;
  padding:0 var(--space-3);
  cursor:pointer;
}
.catcat-uni {
  color:var(--text-subtle);
  font-size:var(--text-xs);
}

.catcat-treepath {
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--space-2);
  padding:var(--space-3) var(--space-4);
  color:var(--text-muted);
  background:var(--surface-1);
  border:1px solid var(--border-faint);
  border-radius:var(--radius-sm);
  font-size:var(--text-xs);
}
.catcat-treepath > span {
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
}
.catcat-treepath > span + span::before {
  content:"/";
  margin-right:var(--space-2);
  color:var(--text-disabled);
}
/* 7 kolom: urutan · nama · key · template opsi · template durasi (12.66) · status · hapus */
.catcat-subhead,
.catcat-shell .subcat-edit-row {
  display:grid;
  grid-template-columns:84px minmax(150px,1fr) minmax(120px,.8fr) minmax(140px,.9fr) minmax(140px,.9fr) 70px 36px;
  gap:var(--space-2);
  align-items:center;
  min-width:860px;
}
.catcat-subhead {
  padding:0 var(--space-3);
  color:var(--text-subtle);
  font-size:var(--text-2xs);
  font-weight:var(--fw-semibold);
  letter-spacing:var(--ls-label-sm);
  text-transform:uppercase;
}
.catcat-shell .subcat-editor {
  display:flex;
  flex-direction:column;
  gap:var(--space-2);
  overflow-x:auto;
}
.catcat-shell .subcat-edit-row {
  position:relative;
  padding:var(--space-3);
  background:var(--surface-1);
  border:1px solid var(--border-faint);
  border-radius:var(--radius-sm);
}
.catcat-shell .subcat-edit-row::before {
  content:"";
  position:absolute;
  top:calc(var(--space-3) * -1);
  bottom:50%;
  left:var(--space-3);
  width:var(--space-3);
  border-bottom:1px solid var(--border-default);
  border-left:1px solid var(--border-default);
}
.catcat-shell .subcat-edit-row.is-off { opacity:.68; }
.catcat-shell .subcat-edit-row .vs-field__control { min-width:0; }
.catcat-sub-order {
  position:relative;
  z-index:1;
  display:flex;
  align-items:center;
  gap:var(--space-2);
}
.catcat-sub-order > span {
  display:grid;
  place-items:center;
  flex:none;
  width:28px;
  height:28px;
  color:var(--text-muted);
  background:var(--surface-0);
  border:1px solid var(--border-default);
  border-radius:var(--radius-xs);
  font-size:var(--text-2xs);
  font-weight:var(--fw-semibold);
  font-variant-numeric:tabular-nums;
}
.catcat-sub-order > div { display:flex; }
.catcat-sub-order .vs-iconbtn {
  width:28px;
  min-height:28px;
  border:0;
  background:transparent;
}
.catcat-shell .subcat-act {
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:var(--space-2);
  min-height:36px;
  padding:0 var(--space-2);
  color:var(--tag-success-text);
  background:var(--tag-success-bg);
  border:1px solid var(--tag-success-border);
  border-radius:var(--radius-xs);
  font-size:var(--text-2xs);
}
.catcat-shell .subcat-act:has(input:not(:checked)) {
  color:var(--tag-neutral-text);
  background:var(--tag-neutral-bg);
  border-color:var(--tag-neutral-border);
}
.catcat-shell .subcat-act input { accent-color:var(--tag-success-text); }
.catcat-sub-delete { color:var(--tag-danger-text); }
.catcat-empty-sub {
  min-height:150px;
  padding:var(--space-6);
  background:var(--surface-1);
  border:1px dashed var(--border-default);
  border-radius:var(--radius-sm);
}
.catcat-shell .subcat-add-row.catcat-sub-create {
  display:grid;
  grid-template-columns:auto minmax(150px,1fr) minmax(120px,.8fr) auto;
  gap:var(--space-2);
  align-items:center;
  margin:0;
  padding:var(--space-3);
  background:var(--tag-blue-bg);
  border:1px dashed var(--tag-blue-border);
  border-radius:var(--radius-sm);
}
.catcat-sub-create > span {
  display:grid;
  place-items:center;
  width:32px;
  height:32px;
  color:var(--tag-blue-text);
  background:var(--surface-0);
  border-radius:var(--radius-xs);
}
.catcat-shell :is(.catcat-nav-item,.catcat-bc,.vs-btn,.vs-iconbtn):active:not(:disabled) { transform:scale(.96); }

@media (max-width:1100px) {
  .catcat-workspace { grid-template-columns:1fr; }
  .catcat-nav {
    position:static;
    max-height:none;
  }
  .catcat-nav-list {
    display:grid;
    grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
    max-height:360px;
  }
}
@media (max-width:620px) {
  .catcat-toolbar { align-items:stretch; }
  .catcat-filter { max-width:100%; overflow-x:auto; }
  .catcat-editor-head,
  .catcat-editor-actions { align-items:flex-start; }
  .catcat-editor-head { flex-direction:column; }
  .catcat-editor-actions { justify-content:flex-start; }
  .catcat-section { padding:var(--space-5); }
  .catcat-field-grid { grid-template-columns:1fr; }
  .catcat-subhead { display:none; }
  .catcat-shell .subcat-editor { overflow-x:visible; }
  .catcat-shell .subcat-edit-row {
    grid-template-columns:minmax(0,1fr) auto;
    min-width:0;
  }
  .catcat-sub-order,
  .catcat-shell .subcat-edit-row > .vs-field__control {
    grid-column:1 / -1;
  }
  .catcat-shell .subcat-act { grid-column:1; }
  .catcat-sub-delete {
    grid-row:5;
    grid-column:2;
  }
  .catcat-shell .subcat-add-row.catcat-sub-create { grid-template-columns:1fr; }
  .catcat-sub-create > span { display:none; }
}
@media (prefers-reduced-motion:reduce) {
  .catcat-shell :is(.catcat-nav-item,.catcat-bc,.vs-btn,.vs-iconbtn) { transition:none; }
  .catcat-shell :is(.catcat-nav-item,.catcat-bc,.vs-btn,.vs-iconbtn):active:not(:disabled) { transform:none; }
}
/* == CATALOG-CATEGORY-COMPOSER:END ========================================= */

/* == WORKSPACE-PM (Tasks & PM v2 — reproduksi Workspace.dc.html) ==== */
/* Sumber: 12.00.01.01 WORKSPACE - Claude Design/Workspace.dc.html
   markup 720-1190 · dialog 2127-2379 · card modal 2380-2653 · helmet 25-76
   Semua warna/shadow/tipografi dari token app (--pst-*, --ink-*, --line-*,
   --surface-*, --text-*, --shadow-*, --font-*). Geometri (px) literal dari master.
   Prefix .wsp-* di dalam scope .wsp — tidak menyentuh .ws-* lama. */

/* ------------------------------------------------------------------ */
/* §0 · SCOPE · TOKEN LOKAL · KEYFRAME · SCROLLBAR                      */
/* ------------------------------------------------------------------ */
/* Token lokal dideklarasikan di SEMUA akar WSP, bukan cuma .wsp.
   Alasan: dialog & card modal dirakit lewat adminModal() → dipasang di
   #adminOverlay, yang di shell() adalah SIBLING dari .main (admin.js:995 vs
   :1001) — di luar subtree .wsp. Custom property diwariskan lewat pohon DOM,
   bukan lewat selector, jadi tanpa ini setiap var(--wsp-*) di modal jadi
   "invalid at computed-value time" (background→transparent, radius→0,
   border-color→currentColor). Akar yang mungkin: .wsp (halaman),
   .wsp-dlg (jalur standalone), .wsp-modal (kelas di .modal-center,
   spec_jsPlan.md:56), .wsp-scrim (memakai --wsp-scrim pada dirinya sendiri). */
.wsp, .wsp-dlg, .wsp-modal, .wsp-scrim, .wsp-drawer, .wsp-drawer-back, .wsp-notifpop{
  font-family:var(--font-body);
  color:var(--text-body);

  /* alias ink/kontras (peta dialek master → app) */
  --wsp-ink:var(--ink-950);                 /* #050505 */
  --wsp-ink-hover:var(--primary-hover);     /* #1B1C1F */
  --wsp-on-ink:var(--primary-contrast);     /* teks di atas ink */
  --wsp-ring:var(--surface-0);              /* ring/border avatar */
  --wsp-on-ink-fill:color-mix(in srgb, var(--primary-contrast) 20%, transparent);
  --wsp-on-ink-fill-18:color-mix(in srgb, var(--primary-contrast) 18%, transparent);
  --wsp-on-ink-fill-10:color-mix(in srgb, var(--primary-contrast) 10%, transparent);
  --wsp-on-ink-fill-25:color-mix(in srgb, var(--primary-contrast) 25%, transparent);
  --wsp-on-tone-fill:color-mix(in srgb, var(--surface-0) 75%, transparent);
  --wsp-scrim:color-mix(in srgb, var(--ink-950) 42%, transparent);

  /* drop state kanban (master: --brand-soft / --brand-line) */
  --wsp-drop-bg:var(--pst-identity-bg);
  --wsp-drop-line:var(--vs-yellow-shadow);

  /* RADIUS — reproduksi persis master, dipusatkan.
     Yang sudah ada di skala DS memakai token DS. */
  --wsp-r4:4px;
  --wsp-r5:5px;
  --wsp-r6:var(--radius-xs);    /* 6px  */
  --wsp-r7:7px;
  --wsp-r8:8px;
  --wsp-r9:9px;
  --wsp-r10:var(--radius-sm);   /* 10px */
  --wsp-r11:11px;
  --wsp-r12:12px;
  --wsp-r13:13px;
  --wsp-r14:var(--radius-md);   /* 14px */
  --wsp-r20:var(--radius-lg);   /* 20px */
  --wsp-rp:var(--radius-pill);  /* 100px */

  /* fallback tone (kalau kelas .wsp-t-* belum dipasang) */
  --wsp-tone-bg:var(--pst-neutral-bg);
  --wsp-tone-border:var(--pst-neutral-border);
  --wsp-tone-text:var(--pst-neutral-text);
}

@keyframes wsp-fade{ from{ opacity:0 } to{ opacity:1 } }
@keyframes wsp-rise{ from{ opacity:0; transform:translateY(8px) } to{ opacity:1; transform:none } }

.wsp ::-webkit-scrollbar, .wsp-dlg ::-webkit-scrollbar, .wsp-modal ::-webkit-scrollbar{ width:8px; height:8px }
.wsp ::-webkit-scrollbar-thumb, .wsp-dlg ::-webkit-scrollbar-thumb, .wsp-modal ::-webkit-scrollbar-thumb{ background:var(--ink-200); border-radius:var(--wsp-rp) }
.wsp ::-webkit-scrollbar-track, .wsp-dlg ::-webkit-scrollbar-track, .wsp-modal ::-webkit-scrollbar-track{ background:transparent }

/* ------------------------------------------------------------------ */
/* §1 · TONE MAP — sumber tunggal semua chip/dot/bar/gradien            */
/* ------------------------------------------------------------------ */
.wsp-t-success { --wsp-tone-bg:var(--pst-success-bg);  --wsp-tone-border:var(--pst-success-border);  --wsp-tone-text:var(--pst-success-text) }
.wsp-t-mint    { --wsp-tone-bg:var(--pst-mint-bg);     --wsp-tone-border:var(--pst-mint-border);     --wsp-tone-text:var(--pst-mint-text) }
.wsp-t-info    { --wsp-tone-bg:var(--pst-info-bg);     --wsp-tone-border:var(--pst-info-border);     --wsp-tone-text:var(--pst-info-text) }
.wsp-t-blue    { --wsp-tone-bg:var(--pst-blue-bg);     --wsp-tone-border:var(--pst-blue-border);     --wsp-tone-text:var(--pst-blue-text) }
.wsp-t-purple  { --wsp-tone-bg:var(--pst-purple-bg);   --wsp-tone-border:var(--pst-purple-border);   --wsp-tone-text:var(--pst-purple-text) }
.wsp-t-pink    { --wsp-tone-bg:var(--pst-pink-bg);     --wsp-tone-border:var(--pst-pink-border);     --wsp-tone-text:var(--pst-pink-text) }
.wsp-t-warning { --wsp-tone-bg:var(--pst-warning-bg);  --wsp-tone-border:var(--pst-warning-border);  --wsp-tone-text:var(--pst-warning-text) }
.wsp-t-orange  { --wsp-tone-bg:var(--pst-orange-bg);   --wsp-tone-border:var(--pst-orange-border);   --wsp-tone-text:var(--pst-orange-text) }
.wsp-t-danger  { --wsp-tone-bg:var(--pst-danger-bg);   --wsp-tone-border:var(--pst-danger-border);   --wsp-tone-text:var(--pst-danger-text) }
.wsp-t-neutral { --wsp-tone-bg:var(--pst-neutral-bg);  --wsp-tone-border:var(--pst-neutral-border);  --wsp-tone-text:var(--pst-neutral-text) }
.wsp-t-identity{ --wsp-tone-bg:var(--pst-identity-bg); --wsp-tone-border:var(--pst-identity-border); --wsp-tone-text:var(--pst-identity-text) }

/* ------------------------------------------------------------------ */
/* §2 · PRIMITIF BERSAMA                                               */
/* ------------------------------------------------------------------ */

/* -- tag / chip pastel (helper tag() master baris 3012) -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-tag{
  display:inline-flex; align-items:center; gap:5px;
  padding:2.5px 9px; border-radius:var(--wsp-rp);
  font-family:var(--font-body); font-size:10.5px; font-weight:600;
  white-space:nowrap; flex:0 0 auto;
  background:var(--wsp-tone-bg); border:1px solid var(--wsp-tone-border); color:var(--wsp-tone-text);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-tag--xs{ font-size:8px;    padding:0 5px }      /* chip "Custom" di rail */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-tag--85{ font-size:8.5px;  padding:1px 6px }    /* brand/src project, scope kartu */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-tag--9{ font-size:9px;    padding:1px 7px }    /* scope chip toolbar, kind project */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-tag--95{ font-size:9.5px;  padding:1.5px 8px }  /* label chip kartu kanban */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-tag--kind{ font-size:8.5px;  padding:1px 7px }    /* badge jenis lampiran */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-tag--hide{ display:none }                          /* scopeSt saat taskScope=project */

/* -- kicker mono uppercase -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kicker{
  font-family:var(--font-mono); font-size:8.5px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kicker--tight{ letter-spacing:.12em }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kicker--9{ font-size:9px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kicker--95{ font-size:9.5px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kicker--wide{ font-size:9px; letter-spacing:.16em }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kicker--flow{ flex:0 0 auto }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kicker--grow{ flex:1; min-width:0 }

/* -- badge angka mono -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-badge{
  font-family:var(--font-mono); font-size:9px; font-weight:700;
  padding:0 5px; border-radius:var(--wsp-rp);
  background:var(--ink-050); color:var(--text-muted);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-badge--95{ font-size:9.5px; padding:1px 6px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-badge.is-on{ background:var(--wsp-on-ink-fill); color:var(--wsp-on-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-badge--18.is-on{ background:var(--wsp-on-ink-fill-18) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-badge--ink.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-badge--tone{ background:var(--wsp-on-tone-fill); color:var(--wsp-tone-text) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .is-on > .wsp-badge--tone{ background:var(--wsp-on-ink-fill); color:var(--wsp-on-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-badge--brand.is-on{ background:var(--vs-yellow); color:var(--wsp-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-num{ font-family:var(--font-mono); font-size:9px; font-weight:700 } /* counter telanjang di tombol Filter */

/* -- pill / chip aksi -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill{
  display:inline-flex; align-items:center; gap:6px;
  height:30px; padding:0 12px; border-radius:var(--wsp-rp);
  border:1px solid var(--line-200); background:var(--surface-0); color:var(--text-muted);
  font-family:var(--font-body); font-size:11.5px; font-weight:500;
  white-space:nowrap; cursor:pointer;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill:hover{ background:var(--surface-1); color:var(--text-strong) }   /* master 1051 style-hover */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); border-color:var(--wsp-ink); font-weight:700 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill.is-on:hover{ background:var(--wsp-ink-hover); color:var(--wsp-on-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill--26{ height:26px; padding:0 10px; font-size:10.5px }
/* --28 = tombol "Atur status" master 1051: border-input + text-strong */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill--28{ height:28px; padding:0 11px; font-size:11px; font-weight:600; border-color:var(--border-input); color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill--29{ height:29px; padding:0 11px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill--32{ height:32px; padding:0 12px; font-size:11.5px; font-weight:600; border-color:var(--border-input) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill--flow{ flex:0 0 auto }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-pill--max{ max-width:100% }

/* -- tombol ikon -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico{
  width:24px; height:24px; display:grid; place-items:center;
  border-radius:var(--wsp-r7); border:0; background:transparent;
  color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico:hover{ background:var(--surface-1); color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--22{ width:22px; height:22px; border-radius:var(--wsp-r6); color:var(--text-subtle) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--26{ width:26px; height:26px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--28{                       /* master 2441 — "Hapus tenggat" */
  width:28px; height:28px; border-radius:var(--wsp-r8);
  border:1px solid var(--border-input); background:var(--surface-0);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--30{ width:30px; height:30px; border-radius:var(--wsp-r8) }
/* 24px berbingkai — tombol tambah label di kotak meta card modal (master 2421) */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--outline{ border:1px solid var(--border-input); background:var(--surface-0) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--round{ width:32px; height:32px; border-radius:var(--wsp-rp); border:1px solid var(--border-input); background:var(--surface-0) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--box{ width:32px; height:32px; border-radius:var(--wsp-r9); border:1px solid var(--line-200); background:var(--surface-0) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--flat:hover{ background:var(--ink-050); color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--danger:hover{ background:var(--ink-050); color:var(--pst-danger-text) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--onink:hover{ background:var(--surface-0); color:var(--text-strong) }
/* kombinasi --onink + --danger (hapus kolom di head kanban, master 1107):
   surface-0 + danger. Harus setelah --onink, kalau tidak color-nya tertimpa. */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--onink.wsp-ico--danger:hover{ background:var(--surface-0); color:var(--pst-danger-text) }
/* --28 versi danger memakai surface-1 (master 2441), bukan ink-050 */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--28.wsp-ico--danger:hover{ background:var(--surface-1); color:var(--pst-danger-text) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--dangerbox{
  width:32px; height:32px; border-radius:var(--wsp-r9);
  border:1px solid var(--pst-danger-border); background:var(--pst-danger-bg); color:var(--pst-danger-text);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico--dangerbox:hover{ filter:brightness(.97); background:var(--pst-danger-bg); color:var(--pst-danger-text) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico i, :is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ico svg{ display:inline-flex; flex:0 0 auto }

/* -- tombol teks -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn{
  display:inline-flex; align-items:center; gap:7px;
  height:36px; padding:0 14px; border-radius:var(--wsp-r10);
  font-family:var(--font-body); font-size:12.5px; cursor:pointer;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--dark{ border:0; background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--dark:hover{ background:var(--wsp-ink-hover) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--ghost{ border:1px solid var(--border-input); background:var(--surface-0); color:var(--text-muted); font-weight:600 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--ghost:hover{ background:var(--surface-1); color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--plain{ border:0; background:transparent; color:var(--text-subtle); font-weight:600 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--plain:hover{ background:var(--surface-1); color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--26{ height:26px; padding:0 10px; border-radius:var(--wsp-r8); font-size:11px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--27{ height:27px; padding:0 10px; border-radius:var(--wsp-r8); font-size:11px; flex:0 0 auto }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--28{ height:28px; padding:0 11px; border-radius:var(--wsp-r8); font-size:11.5px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--32{ height:32px; padding:0 15px; border-radius:var(--wsp-r9); font-size:12.5px }
/* --38 menyamai tinggi .wsp-input di baris "Tambah link" dialog lampiran (master 2196-2197) */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--38{ height:38px; padding:0 14px; border-radius:var(--wsp-r10); font-size:12px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--cta{ height:32px; padding:0 14px; border-radius:var(--wsp-rp); font-size:12px; gap:6px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--w16{ padding:0 16px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--w17{ padding:0 17px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--dark[disabled], :is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--dark.is-off{
  background:var(--ink-050); color:var(--text-disabled); cursor:not-allowed;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--dark[disabled]:hover, :is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-btn--dark.is-off:hover{ background:var(--ink-050) }

/* -- kartu / permukaan -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-card{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r12); box-shadow:var(--shadow-card);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-card--14{ border-radius:var(--wsp-r14); overflow:hidden }

/* -- track & bar progress -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-track{
  display:block; border-radius:var(--wsp-rp); background:var(--ink-050);
  overflow:hidden; flex:1; min-width:0;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-track--3{ height:3px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-track--4{ height:4px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-track--5{ height:5px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-track--6{ height:6px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-bar{ display:block; height:100%; border-radius:var(--wsp-rp); background:var(--wsp-ink) } /* width inline (data) */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-bar--tone{ background:var(--wsp-tone-text) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-bar--done{ background:var(--pst-success-text) }

/* -- dot -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dot{ width:7px; height:7px; border-radius:var(--wsp-rp); flex:0 0 auto; background:var(--wsp-tone-text) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dot--4{ width:4px; height:4px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dot--8{ width:8px; height:8px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dot.is-ring{ box-shadow:0 0 0 2px var(--wsp-on-ink-fill-25) }

/* -- avatar & stack -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava{
  width:22px; height:22px; border-radius:var(--wsp-rp);
  background:var(--ink-100); color:var(--ink-600);
  display:grid; place-items:center;
  font-family:var(--font-mono); font-size:8.5px; font-weight:700;
  border:1.5px solid var(--wsp-ring); margin-left:-6px; flex:0 0 auto;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--20{ width:20px; height:20px; font-size:8px;  margin-left:-5px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--24{ width:24px; height:24px; font-size:9px;  margin-left:0; border:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--26{ width:26px; height:26px; font-size:10px; margin-left:0; border:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--28{ width:28px; height:28px; font-size:11px; margin-left:0; border:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--30{ width:30px; height:30px; font-size:10px; margin-left:0; border:0 }
/* F5 · avatar composer thread (master 1522) & baris thread (1588) */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--32{ width:32px; height:32px; font-size:10.5px; margin-left:0; border:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--dark{ background:var(--wsp-ink); color:var(--wsp-on-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) button.wsp-ava--dark{ cursor:pointer }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) button.wsp-ava--dark:hover{ background:var(--wsp-ink-hover) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--add{
  background:var(--surface-0); color:var(--text-muted);
  border:1px dashed var(--border-input); cursor:pointer;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-ava--add:hover{ background:var(--surface-1); color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-avastack{ display:flex; padding-left:6px; flex:0 0 auto }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-avastack--5{ padding-left:5px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-avastack--0{ padding-left:0 }

/* -- util -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-spacer{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-showsm{ display:none !important }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-mono{ font-family:var(--font-mono) }

/* ------------------------------------------------------------------ */
/* §3 · SURFACE 1 — GRID + RAIL BOARD + TOOLBAR + POPOVER FILTER        */
/* ------------------------------------------------------------------ */
.wsp .wsp-grid{
  display:grid; grid-template-columns:198px minmax(0,1fr);
  gap:14px; align-items:start; animation:wsp-fade .2s ease;
}

.wsp .wsp-rail{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
.wsp .wsp-rail__head{
  display:flex; align-items:center; gap:8px;
  padding:10px 12px 11px; border-bottom:1px solid var(--line-100);
}
.wsp .wsp-rail__head--boards{ gap:7px; padding:11px 12px 9px }
.wsp .wsp-rail__sel{
  flex:1; min-width:0; height:30px; padding:0 8px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r9);
  background:var(--surface-0); font-family:var(--font-body);
  font-size:11.5px; font-weight:600; color:var(--text-strong);
  outline:none; cursor:pointer;
}
.wsp .wsp-railwrap{ padding:7px; display:flex; flex-direction:column; gap:5px }

.wsp .wsp-boardcard{
  display:block; width:100%; text-align:left;
  padding:8px 9px; border-radius:var(--wsp-r9); cursor:pointer;
  font-family:var(--font-body);
  background:linear-gradient(103deg, var(--wsp-tone-border) 0%, var(--wsp-tone-bg) 42%, var(--surface-0) 100%);
  border:1px solid var(--wsp-tone-bg);
}
.wsp .wsp-boardcard.is-on{ border-color:var(--wsp-ink) }
.wsp .wsp-boardcard__row { display:flex; align-items:center; gap:7px }
.wsp .wsp-boardcard__ic  { width:13px; height:13px; flex:0 0 auto; color:var(--wsp-tone-text); display:inline-flex }
.wsp .wsp-boardcard__name{
  flex:1; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  font-size:11.5px; font-weight:600; color:var(--text-body);
}
.wsp .wsp-boardcard.is-on .wsp-boardcard__name{ font-weight:700; color:var(--text-strong) }
.wsp .wsp-boardcard__mix { display:block; font-family:var(--font-mono); font-size:8.5px; color:var(--text-subtle); margin-top:4px }
.wsp .wsp-boardcard__prog{ display:flex; align-items:center; gap:6px; margin-top:5px }
.wsp .wsp-boardcard__short{ font-family:var(--font-mono); font-size:9px; color:var(--text-subtle); flex:0 0 auto }
.wsp .wsp-boardcard .wsp-bar{ background:var(--wsp-tone-text) }
.wsp .wsp-boardcard.is-on .wsp-bar{ background:var(--wsp-ink) }

.wsp .wsp-main{ display:flex; flex-direction:column; gap:11px; min-width:0 }

.wsp .wsp-toolbar{ display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.wsp .wsp-toolbar__id{ display:inline-flex; align-items:center; gap:8px; min-width:0 }
.wsp .wsp-toolbar__ic{ width:16px; height:16px; color:var(--text-strong); flex:0 0 auto; display:inline-flex }
.wsp .wsp-toolbar__title{
  font-family:var(--font-display); font-size:16px; font-weight:700;
  color:var(--text-strong); white-space:nowrap;
}
.wsp .wsp-toolbar__prog{ font-family:var(--font-mono); font-size:10px; color:var(--text-subtle) }

.wsp .wsp-search{
  display:flex; align-items:center; gap:7px; height:32px; padding:0 12px;
  border-radius:var(--wsp-rp); border:1px solid var(--border-input);
  background:var(--surface-0); flex:0 1 210px; min-width:150px;
}
.wsp .wsp-search i, .wsp .wsp-search svg{ color:var(--text-subtle); flex:0 0 auto; display:inline-flex }
.wsp .wsp-search input{
  flex:1; min-width:0; border:0; outline:none; background:transparent;
  font-family:var(--font-body); font-size:12px; color:var(--text-strong);
}

.wsp .wsp-pop{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r13); box-shadow:var(--shadow-pop);
  padding:12px 14px; display:flex; flex-direction:column; gap:10px;
}
.wsp .wsp-pop__head{ display:flex; align-items:center; gap:8px }
.wsp .wsp-chiprow{ display:flex; align-items:center; gap:6px; flex-wrap:wrap }
.wsp .wsp-chip--mine { padding:0 12px }
.wsp .wsp-chip--mine.is-on{ background:var(--vs-yellow); color:var(--wsp-ink); border-color:var(--wsp-ink); font-weight:700 }
.wsp .wsp-chip--label{ padding:0 11px }

/* ------------------------------------------------------------------ */
/* §4 · SURFACE 2 — STRIP KONTEKS (tabs + panel Tasks + panel Projects) */
/* ------------------------------------------------------------------ */
.wsp .wsp-strip{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
.wsp .wsp-strip__tabs{
  display:flex; align-items:center; gap:6px;
  padding:7px 9px; border-bottom:1px solid var(--line-100);
}
.wsp .wsp-tabscroll{ display:flex; gap:2px; flex:1; min-width:0; overflow-x:auto }
.wsp .wsp-tab{ border:0; background:transparent }                /* dipasang bersama .wsp-pill */
.wsp .wsp-tab.is-on{ border:0 }
.wsp .wsp-achip{
  display:inline-flex; align-items:center; gap:6px;
  height:26px; padding:0 10px; border-radius:var(--wsp-rp);
  border:1px solid var(--line-200); background:var(--surface-0);
  font-family:var(--font-body); font-size:11px; font-weight:600;
  color:var(--text-body); cursor:pointer; flex:0 0 auto;
}
.wsp .wsp-achip:hover{ background:var(--surface-1); color:var(--text-strong) }
.wsp .wsp-crumb{
  font-family:var(--font-mono); font-size:8.5px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--text-subtle);
  flex:0 0 auto; white-space:nowrap;
}

.wsp .wsp-panel{ padding:10px 11px 12px; display:flex; flex-direction:column; gap:8px }
.wsp .wsp-panel--proj    { padding:11px 12px 13px; gap:10px }
.wsp .wsp-panel--team-top{ padding:11px 12px 2px;  gap:9px }
.wsp .wsp-panel--team-bot{ padding:8px 12px 13px;  gap:16px; flex-direction:row; align-items:center; flex-wrap:wrap }
.wsp .wsp-panel__head{ display:flex; align-items:baseline; gap:9px; flex-wrap:wrap }
.wsp .wsp-panel__head--center{ align-items:center }
.wsp .wsp-panel__hint{ font-size:11px; color:var(--text-subtle); flex:1; min-width:140px }

/* chip cakupan project — tone di luar, ink saat aktif */
.wsp .wsp-scopechip{
  font-weight:600;
  background:var(--wsp-tone-bg); color:var(--wsp-tone-text); border-color:var(--wsp-tone-border);
}
.wsp .wsp-scopechip.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); border-color:var(--wsp-ink); font-weight:700 }
.wsp .wsp-scopechip__label{ white-space:nowrap; max-width:200px; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-scopechip__label--170{ max-width:170px }

/* grid kartu project */
.wsp .wsp-projgrid{
  display:grid; grid-template-columns:repeat(auto-fill, minmax(258px,1fr));
  gap:10px; align-items:start;
}
.wsp .wsp-projcard{
  display:flex; flex-direction:column; gap:9px; min-width:0;
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r12); padding:11px 13px 12px;
  box-shadow:var(--shadow-card); font-family:var(--font-body);
}
.wsp .wsp-projcard.is-on{ border-color:var(--wsp-ink) }
.wsp .wsp-projcard__tags{ display:flex; align-items:center; flex-wrap:wrap; gap:5px; min-width:0 }
.wsp .wsp-projcard__code{ font-family:var(--font-mono); font-size:10px; font-weight:700; color:var(--text-strong); flex:0 0 auto }
.wsp .wsp-projcard__body{ min-width:0 }
.wsp .wsp-projcard__name{ font-size:13px; font-weight:700; color:var(--text-strong); line-height:1.35; overflow-wrap:anywhere }
.wsp .wsp-projcard__client{ font-size:11px; color:var(--text-subtle); margin-top:3px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-projcard__prog{ display:flex; flex-direction:column; gap:5px }
.wsp .wsp-projcard__progrow{ display:flex; align-items:center; gap:7px }
.wsp .wsp-projcard__pct{ font-family:var(--font-mono); font-size:9.5px; font-weight:700; color:var(--text-strong); flex:0 0 auto }
.wsp .wsp-projcard__counts{ font-family:var(--font-mono); font-size:9px; color:var(--text-subtle); white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-projcard__foot{
  display:flex; align-items:center; gap:8px;
  padding-top:9px; border-top:1px solid var(--line-100); min-width:0;
}
.wsp .wsp-projcard__lead{ flex:1; min-width:0; font-size:10.5px; color:var(--text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-projcard__period{ font-family:var(--font-mono); font-size:9px; color:var(--text-subtle); flex:0 0 auto; white-space:nowrap }
.wsp .wsp-projcard__acts{ display:flex; align-items:center; flex-wrap:wrap; gap:6px }
.wsp .wsp-projcard__acts .wsp-btn--dark{ padding:0 11px }

/* empty state umum */
.wsp .wsp-empty{
  display:flex; gap:9px; padding:12px 13px;
  border:1px dashed var(--line-200); border-radius:var(--wsp-r11);
  background:var(--surface-1);
  font-size:11.5px; line-height:1.55; color:var(--text-muted);
}
.wsp .wsp-empty i, .wsp .wsp-empty svg{
  width:15px; height:15px; color:var(--text-muted);
  flex:0 0 auto; margin-top:1px; display:inline-flex;
}
.wsp .wsp-empty__text{ font-size:11.5px; line-height:1.55; color:var(--text-muted) }

/* ------------------------------------------------------------------ */
/* §5 · SURFACE 3 — PLANNER (kalender bulan + timeline + tenggat)       */
/* ------------------------------------------------------------------ */
.wsp .wsp-plan__scope{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:10px 12px 0 }
.wsp .wsp-plan__note { font-size:11px; color:var(--text-subtle) }
.wsp .wsp-plan__body { padding:10px 12px 12px; display:flex; gap:14px; align-items:flex-start; flex-wrap:wrap }
.wsp .wsp-plan__left { flex:0 1 300px; min-width:250px }
.wsp .wsp-plan__right{ flex:1 1 220px; min-width:200px; display:flex; flex-direction:column; gap:6px }
.wsp .wsp-plan__nav  { display:flex; align-items:center; gap:6px; margin-bottom:7px }
.wsp .wsp-navbtn{
  width:22px; height:22px; display:grid; place-items:center;
  border-radius:var(--wsp-r6); border:1px solid var(--line-200);
  background:var(--surface-0); color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp .wsp-navbtn:hover{ background:var(--surface-1) }
.wsp .wsp-plan__title{
  font-family:var(--font-mono); font-size:10px; font-weight:700;
  letter-spacing:.06em; text-transform:uppercase; color:var(--text-strong);
  flex:1; text-align:center;
}
.wsp .wsp-seg{ display:flex; gap:2px; padding:2px; background:var(--surface-1); border-radius:var(--wsp-rp); margin-left:4px }
.wsp .wsp-seg__btn{
  display:inline-flex; align-items:center; gap:5px;
  height:26px; padding:0 10px; border-radius:var(--wsp-rp);
  border:0; background:transparent; color:var(--text-muted);
  font-family:var(--font-body); font-size:10.5px; font-weight:500; cursor:pointer;
}
.wsp .wsp-seg__btn.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }

.wsp .wsp-dow{ display:grid; grid-template-columns:repeat(7,1fr); gap:2px; margin-bottom:3px }
.wsp .wsp-dow span{ text-align:center; font-family:var(--font-mono); font-size:8px; color:var(--text-subtle) }
.wsp .wsp-cells{ display:grid; grid-template-columns:repeat(7,1fr); gap:2px }
.wsp .wsp-day{
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px;
  height:28px; border-radius:var(--wsp-r7); cursor:pointer;
  font-family:var(--font-mono); font-size:10px; font-weight:500;
  border:1px solid transparent; background:transparent; color:var(--text-subtle);
}
.wsp .wsp-day.has-task{ border-color:var(--line-200); background:var(--surface-0); color:var(--text-strong); font-weight:600 }
.wsp .wsp-day.is-today{ border-color:var(--vs-yellow); background:var(--pst-identity-bg); color:var(--text-strong); font-weight:700 }
.wsp .wsp-day.is-on   { border-color:var(--wsp-ink); background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }
.wsp .wsp-day.is-blank{ border:0; background:transparent; cursor:default }
.wsp .wsp-day__dots{ display:flex; gap:2px }
.wsp .wsp-day__dot { width:4px; height:4px; border-radius:var(--wsp-rp); background:var(--wsp-tone-text) }

.wsp .wsp-tl{ display:flex; flex-direction:column; gap:6px }
.wsp .wsp-tl__scale{
  display:flex; justify-content:space-between;
  font-family:var(--font-mono); font-size:8px; letter-spacing:.06em; color:var(--text-subtle);
}
.wsp .wsp-row{
  display:block; width:100%; text-align:left;
  border:0; background:transparent; padding:0; cursor:pointer; font-family:var(--font-body);
}
.wsp .wsp-row__head { display:flex; align-items:center; gap:6px }
.wsp .wsp-row__title{
  font-size:10.5px; font-weight:600; color:var(--text-body);
  flex:1; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-row__due  { font-family:var(--font-mono); font-size:9px; color:var(--text-subtle); flex:0 0 auto }
.wsp .wsp-row--due .wsp-row__title{ font-size:11px }
.wsp .wsp-row--due .wsp-row__due  { font-size:9.5px }
.wsp .wsp-gtrack{
  display:block; position:relative; height:7px; border-radius:var(--wsp-rp);
  background:var(--ink-050); margin-top:4px; overflow:hidden;
}
.wsp .wsp-gtrack--thin{ height:5px }
.wsp .wsp-gbar{
  position:absolute; top:0; height:100%; border-radius:var(--wsp-rp);
  background:var(--wsp-tone-text); opacity:.85;                 /* left/width inline (data) */
}
.wsp .wsp-gbar--due{ min-width:12% }

.wsp .wsp-msblock{
  margin-top:4px; padding-top:9px; border-top:1px solid var(--line-100);
  display:flex; flex-direction:column; gap:6px;
}
.wsp .wsp-ms{ display:flex; align-items:center; gap:7px }
.wsp .wsp-ms__label{ font-size:11px; color:var(--text-body); flex:1; min-width:0 }
.wsp .wsp-ms__date { font-family:var(--font-mono); font-size:9.5px; color:var(--text-subtle) }
.wsp .wsp-plan__empty{ font-size:11.5px; color:var(--text-subtle) }

/* ------------------------------------------------------------------ */
/* §6 · SURFACE 4 — TEAM (members, project team, progress board)        */
/* ------------------------------------------------------------------ */
.wsp .wsp-memberwrap{ display:flex; gap:6px; flex-wrap:wrap }
.wsp .wsp-loadwrap  { display:flex; gap:4px; flex-wrap:wrap }
.wsp .wsp-member{
  display:flex; align-items:center; gap:8px;
  padding:6px 11px 6px 6px; border-radius:var(--wsp-rp); cursor:pointer;
  font-family:var(--font-body);
  background:var(--surface-0); border:1px solid var(--line-200);
}
.wsp .wsp-member.is-on{ background:var(--surface-1); border-color:var(--wsp-ink) }
.wsp .wsp-member.is-on .wsp-ava{ background:var(--wsp-ink); color:var(--wsp-on-ink) }
.wsp .wsp-member--load{ padding:6px 10px 6px 6px; background:transparent; border-color:transparent }
.wsp .wsp-member__meta { display:flex; flex-direction:column; align-items:flex-start }
.wsp .wsp-member__name { font-size:11.5px; font-weight:600; color:var(--text-strong); line-height:1.2 }
.wsp .wsp-member__role { font-size:10px; color:var(--text-subtle); line-height:1.2 }
.wsp .wsp-member__count{ font-family:var(--font-mono); font-size:9px; font-weight:700; line-height:1.2; color:var(--text-strong) }
.wsp .wsp-member__count.is-idle{ color:var(--text-subtle) }

.wsp .wsp-pjtwrap{ display:flex; flex-direction:column; gap:6px; margin-top:2px }
.wsp .wsp-pjt{
  display:flex; align-items:center; gap:9px; padding:7px 10px;
  border:1px solid var(--line-100); border-radius:var(--wsp-r10); background:var(--surface-1);
}
.wsp .wsp-pjt__code{ font-family:var(--font-mono); font-size:9.5px; font-weight:700; color:var(--text-strong); flex:0 0 auto }
.wsp .wsp-pjt__name{ flex:1; min-width:0; font-size:11.5px; color:var(--text-body); white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-pjt__lead{ font-size:10.5px; color:var(--text-muted); flex:0 0 auto; white-space:nowrap }

.wsp .wsp-progblock{ flex:0 1 220px; min-width:180px }
.wsp .wsp-progblock__head{ display:flex; align-items:center; gap:7px }
.wsp .wsp-progblock__pct { font-family:var(--font-mono); font-size:11px; font-weight:700; color:var(--text-strong) }
.wsp .wsp-progblock .wsp-track{ margin-top:5px }
.wsp .wsp-gt{ display:flex; align-items:center; gap:10px; margin-top:7px; flex-wrap:wrap }
.wsp .wsp-gt__item { display:inline-flex; align-items:center; gap:5px }
.wsp .wsp-gt__label{ font-size:10.5px; color:var(--text-muted) }
.wsp .wsp-gt__n    { font-family:var(--font-mono); font-size:10px; font-weight:700; color:var(--text-strong) }
.wsp .wsp-gdot{ width:7px; height:7px; border-radius:var(--wsp-rp); flex:0 0 auto }
.wsp .wsp-gdot--todo    { background:var(--ink-300) }
.wsp .wsp-gdot--progress{ background:var(--accent-blue) }
.wsp .wsp-gdot--complete{ background:var(--accent-mint) }

/* ------------------------------------------------------------------ */
/* §7 · SURFACE 5 — BOARD BAR · STATUS MANAGER · KANBAN · COMPOSER      */
/* ------------------------------------------------------------------ */
.wsp .wsp-boardbar{ display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.wsp .wsp-boardbar__count{ font-family:var(--font-mono); font-size:10px; color:var(--text-subtle) }

/* -- status manager -- */
.wsp .wsp-statusmgr{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-pop);
  padding:13px 15px 15px; display:flex; flex-direction:column; gap:12px;
}
.wsp .wsp-statusmgr__head { display:flex; align-items:center; gap:8px }
.wsp .wsp-statusmgr__title{ font-family:var(--font-display); font-size:13px; font-weight:700; color:var(--text-strong); flex:1 }
.wsp .wsp-statusmgr__hint { font-size:11px; color:var(--text-subtle) }
.wsp .wsp-sgroup      { display:flex; flex-direction:column; gap:5px }
.wsp .wsp-sgroup__head{ display:flex; align-items:center; gap:7px }
.wsp .wsp-sgroup__dot { width:8px; height:8px; border-radius:var(--wsp-rp); flex:0 0 auto }
.wsp .wsp-sgroup__label{ font-size:11.5px; font-weight:600; color:var(--text-muted); flex:1 }
.wsp .wsp-srow{ display:flex; align-items:center; gap:7px; padding:4px 7px 4px 3px; border-radius:var(--wsp-r8) }
.wsp .wsp-srow:hover{ background:var(--surface-1) }
.wsp .wsp-srow__grip{ width:12px; height:12px; color:var(--ink-300); flex:0 0 auto; display:inline-flex }
.wsp .wsp-srow__chip{
  display:inline-flex; align-items:center; gap:7px;
  height:26px; padding:0 11px; border-radius:var(--wsp-rp);
  background:var(--wsp-tone-bg); border:1px solid var(--wsp-tone-border); color:var(--wsp-tone-text);
  font-family:var(--font-body); font-size:12px; font-weight:600;
}
.wsp .wsp-srow__count{ font-family:var(--font-mono); font-size:9px; color:var(--text-subtle) }
.wsp .wsp-srow__def  { font-family:var(--font-mono); font-size:8px; letter-spacing:.12em; color:var(--text-subtle) }
.wsp .wsp-move{
  height:24px; padding:0 9px; border-radius:var(--wsp-rp);
  border:1px solid var(--line-200); background:var(--surface-0);
  font-family:var(--font-body); font-size:10px; font-weight:600;
  color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp .wsp-move:hover{ background:var(--surface-1); color:var(--text-strong) }
.wsp .wsp-addstatus{ display:flex; align-items:center; gap:6px; padding-left:18px }
.wsp .wsp-input--status{
  flex:0 1 200px; height:28px; padding:0 10px;
  border:1px solid var(--ink-300); border-radius:var(--wsp-r8);
  font-family:var(--font-body); font-size:11.5px; color:var(--text-strong);
  outline:none; background:var(--surface-0);
}

/* -- papan -- */
.wsp .wsp-board{ display:flex; gap:12px; overflow-x:auto; align-items:flex-start; padding-bottom:10px }
.wsp .wsp-col{
  flex:0 0 274px; border-radius:var(--wsp-r14);
  background:var(--ink-050); border:1px solid var(--line-100);
  transition:background .14s ease;
}
.wsp .wsp-col.is-over{ background:var(--wsp-drop-bg); border-style:dashed; border-color:var(--wsp-drop-line) }
.wsp .wsp-col__head { padding:11px 12px 9px }
.wsp .wsp-col__top  { display:flex; align-items:center; gap:7px }
.wsp .wsp-col__dot  { width:8px; height:8px; border-radius:var(--wsp-rp); background:var(--wsp-tone-text); flex:0 0 auto }
.wsp .wsp-col__label{
  font-size:12px; font-weight:700; color:var(--text-strong);
  flex:1; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
/* Elemen ini membawa alias .ws-kcol__count (dipakai wsKanbanDnD untuk
   meng-update angka). Rule global admin.css:4172 ikut kena, jadi geometri
   lamanya (min-width/height 20px, inline-flex, tabular-nums) harus dinolkan
   eksplisit — kalau tidak chip jadi kotak 20x20, bukan pill auto-height. */
.wsp .wsp-col__count{
  font-family:var(--font-mono); font-size:10px; font-weight:700;
  font-variant-numeric:normal;
  display:inline-block; min-width:0; height:auto;
  padding:1px 6px; border-radius:var(--wsp-rp);
  background:var(--surface-0); border:1px solid var(--line-200);
  color:var(--text-muted); flex:0 0 auto;
}
.wsp .wsp-col__sub  { display:flex; align-items:center; gap:6px; margin-top:7px }
.wsp .wsp-col__group{
  font-family:var(--font-mono); font-size:8.5px; letter-spacing:.1em;
  text-transform:uppercase; font-weight:700; padding:1px 6px; border-radius:var(--wsp-rp);
  background:var(--wsp-tone-bg); color:var(--wsp-tone-text); border:1px solid var(--wsp-tone-border);
}
.wsp .wsp-col__def  { font-family:var(--font-mono); font-size:8.5px; letter-spacing:.12em; color:var(--text-subtle) }
.wsp .wsp-col__cards{ display:flex; flex-direction:column; gap:7px; padding:0 10px 8px; min-height:56px }
/* placeholder di-inject wsKanbanDnD dengan className ws-kcol__empty →
   kena rule global admin.css:4177 (kotak dashed rata tengah). Netralkan. */
.wsp .wsp-col .ws-kcol__empty{
  margin:0; padding:6px 2px; text-align:left;
  border:0; border-radius:0;
  font-size:11.5px; color:var(--text-subtle);
}
.wsp .wsp-insert{ height:3px; border-radius:var(--wsp-rp); background:var(--wsp-ink); margin:0 2px 7px }

/* -- kartu kanban -- */
.wsp .wsp-kcard{
  position:relative;
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r10); padding:10px 11px;
  cursor:grab; box-shadow:var(--shadow-card);
  transition:border-color .14s ease, transform .14s ease;
}
.wsp .wsp-kcard:hover{ border-color:var(--ink-300); transform:translateY(-1px) }
.wsp .wsp-kcard.is-dragging{ opacity:.45; cursor:grabbing; transform:none }
/* State yang dipasang wsKanbanDnD (admin.js:668/672). Rule legacy-nya
   mensyaratkan .workspace-layer .ws-kcard, jadi kartu .wsp-kcard tidak
   dapat feedback apa pun tanpa pasangan ini. */
.wsp .wsp-kcard.is-saving{ opacity:.7; cursor:progress; transform:none }
.wsp .wsp-kcard.is-settled{ border-color:var(--pst-success-border) }
.wsp .wsp-kcard:active{ cursor:grabbing }
.wsp .wsp-kcard__labels{ display:flex; flex-wrap:wrap; gap:4px; margin-bottom:8px }
.wsp .wsp-kcard__meta  { display:flex; align-items:center; gap:6px }
.wsp .wsp-kcard__code  { font-family:var(--font-mono); font-size:10px; color:var(--text-subtle) }
.wsp .wsp-kcard__title { font-size:12.5px; font-weight:600; color:var(--text-body); margin-top:7px; line-height:1.4 }
.wsp .wsp-kcard__foot  { display:flex; align-items:center; gap:8px; margin-top:9px; color:var(--text-subtle) }
.wsp .wsp-kcard__chip{
  display:inline-flex; align-items:center; gap:4px;
  font-family:var(--font-mono); font-size:10px;
  padding:1px 6px; border-radius:var(--wsp-r6); color:var(--text-subtle);
}
.wsp .wsp-kcard__chip.is-full{ background:var(--pst-success-bg); color:var(--pst-success-text); font-weight:700 }
.wsp .wsp-kcard__due{
  display:inline-flex; align-items:center; gap:4px;
  font-family:var(--font-mono); font-size:10px; color:var(--text-subtle);
}
.wsp .wsp-kcard__due.is-urgent{ color:var(--pst-danger-text); font-weight:700 }

/* -- composer kartu -- */
.wsp .wsp-composer{
  background:var(--surface-0); border:1px solid var(--wsp-ink);
  border-radius:var(--wsp-r10); padding:9px 10px; box-shadow:var(--shadow-pop);
}
.wsp .wsp-composer textarea{
  width:100%; box-sizing:border-box; min-height:52px;
  border:0; outline:none; resize:none; background:transparent;
  font-family:var(--font-body); font-size:12.5px; line-height:1.45; color:var(--text-strong);
}
.wsp .wsp-composer__foot{ display:flex; align-items:center; gap:6px; margin-top:6px }
.wsp .wsp-composer select{
  height:28px; max-width:96px; padding:0 5px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r8);
  background:var(--surface-0); font-family:var(--font-mono); font-size:10.5px; color:var(--text-muted);
}
.wsp .wsp-composer .wsp-btn--28{ font-size:11.5px }
.wsp .wsp-composer .wsp-btn--dark.wsp-btn--28{ padding:0 13px }

/* -- tombol tambah kartu / kolom -- */
.wsp .wsp-addcard{
  display:flex; align-items:center; gap:7px;
  width:calc(100% - 20px); margin:0 10px 10px;
  height:34px; padding:0 10px; border-radius:var(--wsp-r9);
  border:1px dashed var(--line-200); background:transparent;
  font-family:var(--font-body); font-size:12px; font-weight:600;
  color:var(--text-subtle); cursor:pointer; text-align:left;
}
.wsp .wsp-addcard:hover{ background:var(--surface-0); color:var(--text-strong); border-color:var(--ink-300) }
.wsp .wsp-addcol{
  flex:0 0 168px; align-self:stretch; min-height:120px;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px;
  border-radius:var(--wsp-r14); border:1px dashed var(--line-200); background:transparent;
  font-family:var(--font-body); font-size:12px; font-weight:600;
  color:var(--text-subtle); cursor:pointer;
}
.wsp .wsp-addcol:hover{ background:var(--ink-050); color:var(--text-strong); border-color:var(--ink-300) }

/* -- footnote papan -- */
.wsp .wsp-foot{ display:flex; align-items:center; gap:7px; font-size:11.5px; color:var(--text-subtle) }
.wsp .wsp-foot strong{ color:var(--text-strong); font-weight:600 }
.wsp .wsp-foot i, .wsp .wsp-foot svg{ flex:0 0 auto; display:inline-flex }

/* ------------------------------------------------------------------ */
/* §8 · SURFACE 6 — DIALOG (board baru · lampiran · project baru)       */
/* ------------------------------------------------------------------ */

/* 8a. Jalur standalone (reproduksi persis master: scrim + panel fixed) */
.wsp-scrim{
  position:fixed; inset:0; z-index:50;
  background:var(--wsp-scrim);
  backdrop-filter:blur(3px);
  animation:wsp-fade .15s ease;
}
.wsp-scrim--60{ z-index:60 }
.wsp-dlg{
  position:fixed; top:50%; left:50%; transform:translate(-50%,-50%);
  z-index:51; background:var(--surface-0);
  border-radius:var(--wsp-r20); box-shadow:var(--shadow-pop);
  animation:wsp-rise .18s ease; overflow:hidden;
  font-family:var(--font-body); color:var(--text-body);
}
.wsp-dlg--61 { z-index:61 }
.wsp-dlg--460{ width:min(460px, 94vw) }
.wsp-dlg--560{ width:min(560px, 94vw); max-height:88vh; overflow-y:auto }
.wsp-dlg--620{ width:min(620px, 94vw); max-height:88vh; overflow-y:auto }
.wsp-dlg--card{
  width:min(940px, 96vw); height:min(86vh, 780px);
  display:flex; flex-direction:column; overflow:hidden;
}

/* 8b. Jalur adminModal — INI yang dipakai (spec_jsPlan.md:56/61).
   Di rute hash #/workspace, adminModal() menempelkan .workspace-layer +
   .ws-command-window ke .modal-center (admin.js:1055 & :1077). Rule lama
   admin.css:4552 (0,3,0) dan :4553 .wide (0,4,0) mengunci 640px/980px +
   radius 18px, jadi sizing WSP harus ≥ (0,4,0) supaya menang. Selektor
   pendek dipertahankan sebagai fallback bila layer class tidak terpasang. */
.modal-center.wsp-modal      { border-radius:var(--wsp-r20) }
.modal-center.wsp-modal--460 { width:min(460px, 94vw); max-width:460px }
.modal-center.wsp-modal--560 { width:min(560px, 94vw); max-width:560px; max-height:88vh }
.modal-center.wsp-modal--620 { width:min(620px, 94vw); max-width:620px; max-height:88vh }
.modal-center.wsp-modal--card{
  max-width:940px; width:min(940px, 96vw);
  height:min(86vh, 780px); max-height:min(86vh, 780px);
}
.modal-center.workspace-layer.ws-command-window.wsp-modal     { border-radius:var(--wsp-r20) }
.modal-center.workspace-layer.ws-command-window.wsp-modal--460{ width:min(460px, 94vw); max-width:460px }
.modal-center.workspace-layer.ws-command-window.wsp-modal--560{ width:min(560px, 94vw); max-width:560px; max-height:88vh }
.modal-center.workspace-layer.ws-command-window.wsp-modal--620{ width:min(620px, 94vw); max-width:620px; max-height:88vh }
.modal-center.workspace-layer.ws-command-window.wsp-modal--card,
.modal-center.workspace-layer.ws-command-window.wsp-modal--card.wide{
  width:min(940px, 96vw); max-width:940px;
  height:min(86vh, 780px); max-height:min(86vh, 780px);
}

/* -- anatomi dialog -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__head{
  display:flex; align-items:center; gap:10px;
  padding:17px 20px 13px; border-bottom:1px solid var(--line-100); flex:0 0 auto;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__head--lg{ padding:18px 22px 14px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__badge{
  width:32px; height:32px; border-radius:var(--wsp-r9);
  background:var(--ink-050); display:grid; place-items:center; flex:0 0 auto;
  color:var(--text-strong);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__id{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__title{
  display:block; font-family:var(--font-display); font-size:15.5px; font-weight:700; color:var(--text-strong);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__title--lg{ font-size:16px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__sub{ display:block; font-size:11.5px; color:var(--text-subtle); margin-top:1px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__body{
  padding:16px 20px 19px; display:flex; flex-direction:column; gap:14px;
  overflow-y:auto; min-height:0;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__body--att{ padding:15px 20px 19px; gap:13px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__body--proj{ padding:16px 22px 20px; gap:16px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__foot{ display:flex; align-items:center; gap:8px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__foot--proj{ padding-top:4px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__hint{ flex:1; font-size:11.5px; color:var(--text-subtle) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__block{ min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dlg__blockhead{
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle); margin-bottom:8px;
}

/* -- field -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-field{ display:flex; flex-direction:column; gap:6px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-field--grid{
  display:grid; grid-template-rows:18px 38px auto; gap:6px; align-content:start; min-width:0;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-field__label{ align-self:center }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-field__label--row{
  display:flex; align-items:center; gap:6px; min-width:0; align-self:center;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-input{
  height:38px; padding:0 12px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r10);
  font-family:var(--font-body); font-size:13px; color:var(--text-strong);
  outline:none; background:var(--surface-0);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-input--date{ font-size:12.5px; padding:0 10px; flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-input--grow{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-select{
  height:38px; padding:0 10px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r10);
  font-family:var(--font-body); font-size:13px; color:var(--text-strong);
  background:var(--surface-0);
}

/* -- callout -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-callout{
  display:flex; gap:9px; padding:11px 12px;
  border:1px solid var(--line-200); border-radius:var(--wsp-r11);
  background:var(--surface-1); font-size:11.5px; line-height:1.55; color:var(--text-muted);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-callout strong{ color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-callout i,
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-callout svg{
  width:15px; height:15px; flex:0 0 auto; margin-top:1px; display:inline-flex;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-callout--tone{
  align-items:flex-start; padding:11px 14px; border-radius:var(--wsp-r10);
  background:var(--wsp-tone-bg); border-color:var(--wsp-tone-border); color:var(--wsp-tone-text);
  font-size:12px; line-height:1.5;
}

/* -- dropzone lampiran -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-drop{
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:7px;
  padding:26px 18px; border-radius:var(--wsp-r13); cursor:pointer; text-align:center;
  border:1.5px dashed var(--border-input); background:var(--surface-0);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-drop.is-drag{ border-color:var(--wsp-ink); background:var(--surface-1) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-drop i,
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-drop svg{ width:22px; height:22px; color:var(--text-muted) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-drop__title{ font-size:12.5px; font-weight:600; color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-drop__meta{ font-family:var(--font-mono); font-size:10px; color:var(--text-subtle) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkrow{ display:flex; gap:7px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkstack{ display:flex; flex-direction:column; gap:9px }

/* -- preview link -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-lp{
  display:flex; align-items:center; gap:11px; padding:11px 12px;
  border:1px solid var(--pst-blue-border); border-radius:var(--wsp-r12); background:var(--pst-blue-bg);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-lp__ini{
  width:38px; height:38px; border-radius:var(--wsp-r10);
  background:var(--surface-0); color:var(--pst-blue-text);
  display:grid; place-items:center; flex:0 0 auto;
  font-family:var(--font-mono); font-size:15px; font-weight:700;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-lp__id{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-lp__title{
  display:block; font-size:12.5px; font-weight:700; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-lp__meta{
  display:block; font-family:var(--font-mono); font-size:10px; color:var(--pst-blue-text); margin-top:2px;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-lp__badge{
  font-family:var(--font-mono); font-size:9px; letter-spacing:.1em;
  text-transform:uppercase; color:var(--pst-blue-text); flex:0 0 auto;
}

/* -- antrean lampiran -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-qwrap{ display:flex; flex-direction:column; gap:6px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-q{
  display:flex; align-items:center; gap:10px; padding:8px 10px;
  border:1px solid var(--line-200); border-radius:var(--wsp-r10); background:var(--surface-1);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-q__thumb{
  width:34px; height:34px; border-radius:var(--wsp-r8); flex:0 0 auto; display:block;
  border:1px solid var(--line-200); background:var(--ink-050) center/cover no-repeat;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-q__ico{
  width:30px; height:30px; border-radius:var(--wsp-r8); background:var(--ink-050);
  display:grid; place-items:center; flex:0 0 auto; color:var(--text-muted);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-q__link{
  width:30px; height:30px; border-radius:var(--wsp-r8);
  background:var(--pst-blue-bg); color:var(--pst-blue-text);
  display:grid; place-items:center; flex:0 0 auto;
  font-family:var(--font-mono); font-size:12px; font-weight:700;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-q__id{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-q__name{
  display:block; font-size:12px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-q__meta{
  display:block; font-family:var(--font-mono); font-size:9.5px; color:var(--text-subtle); margin-top:1px;
}

/* -- pilih tipe project -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindgrid{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(230px,1fr)); gap:8px;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindcard{
  display:flex; flex-direction:column; gap:6px; align-items:flex-start; width:100%;
  padding:11px 13px; border-radius:var(--wsp-r12); cursor:pointer; font-family:var(--font-body);
  background:linear-gradient(103deg, var(--wsp-tone-border) 0%, var(--wsp-tone-bg) 44%, var(--surface-0) 100%);
  border:1px solid var(--wsp-tone-bg);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindcard.is-on{
  border-color:var(--wsp-ink); box-shadow:0 0 0 1px var(--wsp-ink) inset;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindcard__row{ display:flex; align-items:center; gap:8px; width:100% }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindcard__ic{
  width:15px; height:15px; flex:0 0 auto; color:var(--wsp-tone-text); display:inline-flex;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindcard__label{ font-size:12.5px; font-weight:700; color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindcard__desc{
  display:block; font-size:11px; line-height:1.5; color:var(--text-subtle); text-align:left;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-kindcard__board{
  display:inline-flex; align-items:center; gap:4px;
  font-family:var(--font-mono); font-size:8.5px; letter-spacing:.08em;
  text-transform:uppercase; color:var(--wsp-tone-text);
}

/* -- form grid + saran customer -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-formgrid{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(200px,1fr)); gap:12px;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-custstack{ display:flex; flex-direction:column; gap:5px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-custrow{
  display:flex; align-items:center; gap:9px; width:100%; text-align:left;
  padding:7px 10px; border-radius:var(--wsp-r9); cursor:pointer; font-family:var(--font-body);
  background:var(--surface-0); border:1px solid var(--line-200);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-custrow:hover{ background:var(--surface-1); border-color:var(--ink-300) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-custrow__ava{
  width:24px; height:24px; border-radius:var(--wsp-rp);
  background:var(--ink-050); color:var(--text-muted);
  display:grid; place-items:center; flex:0 0 auto;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-custrow__id{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-custrow__name{
  display:block; font-size:12px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-custrow__meta{
  display:block; font-family:var(--font-mono); font-size:9px; color:var(--text-subtle);
  margin-top:1px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkchip{
  display:flex; align-items:center; gap:7px; padding:7px 10px;
  border-radius:var(--wsp-r9);
  background:var(--wsp-tone-bg); border:1px solid var(--wsp-tone-border); color:var(--wsp-tone-text);
  font-size:11px;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkchip i,
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkchip svg{ width:13px; height:13px; flex:0 0 auto }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkchip__meta{
  flex:1; min-width:0; font-family:var(--font-mono); font-size:9.5px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkchip__text{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-linkchip__btn{
  border:0; background:transparent; font-family:var(--font-body);
  font-size:10.5px; font-weight:700; color:var(--wsp-tone-text); cursor:pointer; flex:0 0 auto;
}

/* -- jadwal + checkbox + deliverable + seed -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-daterow{ display:flex; align-items:center; gap:7px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-datesep{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); flex:0 0 auto }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-datenote{ font-family:var(--font-mono); font-size:9.5px; color:var(--text-subtle) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-chk{
  width:15px; height:15px; border-radius:var(--wsp-r4);
  display:grid; place-items:center; flex:0 0 auto;
  background:var(--surface-0); border:1px solid var(--border-input);
  color:var(--wsp-on-ink);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-chk.is-on{ background:var(--wsp-ink); border-color:var(--wsp-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-chk--lg{ width:17px; height:17px; border-radius:var(--wsp-r5); cursor:pointer }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-deliverrow{ display:flex; gap:7px; flex-wrap:wrap }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-deliver{
  display:inline-flex; align-items:center; gap:7px;
  height:32px; padding:0 12px; border-radius:var(--wsp-rp); cursor:pointer;
  font-family:var(--font-body); font-size:12px; font-weight:600; color:var(--text-strong);
  background:var(--surface-0); border:1px solid var(--line-200);
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-deliver.is-on{ background:var(--surface-1); border-color:var(--wsp-ink) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-delivernote{ font-size:11px; color:var(--text-subtle); margin-top:8px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-seedrow{
  display:flex; align-items:center; gap:10px; padding:11px 13px;
  border-radius:var(--wsp-r10); border:1px solid var(--line-200);
  background:var(--surface-1); cursor:pointer;
}
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-seedrow__id{ flex:1; min-width:0 }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-seedrow__title{ display:block; font-size:12.5px; font-weight:600; color:var(--text-strong) }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-seedrow__note{ display:block; font-size:11px; color:var(--text-subtle); margin-top:1px }

/* ------------------------------------------------------------------ */
/* §9 · SURFACE 7 — CARD MODAL (detail tugas)                           */
/* ------------------------------------------------------------------ */
.wsp-cm{
  display:grid; grid-template-columns:minmax(0,1fr) 216px;
  overflow:hidden; flex:1 1 auto; min-height:0;
}
.wsp-cm__head{ padding:16px 22px 13px; border-bottom:1px solid var(--line-100); flex:0 0 auto }
.wsp-cm__row { display:flex; align-items:center; gap:8px }
.wsp-cm__code{ font-family:var(--font-mono); font-size:11px; font-weight:700; color:var(--text-subtle) }
.wsp-cm__title{
  display:block; width:calc(100% + 12px); box-sizing:border-box;
  margin:9px 0 3px -7px; padding:3px 6px;
  border:1px solid transparent; border-radius:var(--wsp-r8);
  font-family:var(--font-display); font-size:19px; font-weight:700; line-height:1.3;
  color:var(--text-strong); background:transparent; outline:none;
}
.wsp-cm__title:hover{ border-color:var(--line-200); background:var(--surface-1) }
.wsp-cm__title:focus{ border-color:var(--ink-300); background:var(--surface-0) }
.wsp-cm__crumb{
  display:flex; align-items:center; gap:6px; flex-wrap:wrap;
  font-size:11.5px; color:var(--text-subtle);
}
.wsp-cm__crumb b{ color:var(--text-body); font-weight:600 }
.wsp-minisel{
  height:26px; padding:0 6px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r7);
  background:var(--surface-0); font-family:var(--font-body);
  font-size:11px; font-weight:600; color:var(--text-strong); cursor:pointer;
}
.wsp-minisel--mono{ font-family:var(--font-mono); font-size:10.5px; font-weight:700 }
.wsp-cm__main{
  overflow-y:auto; padding:16px 18px 22px;
  display:flex; flex-direction:column; gap:12px; min-width:0;
  background:var(--canvas);
}

/* -- kotak meta (label · anggota · tenggat) -- */
.wsp-meta{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(148px,1fr)); gap:16px;
  padding:13px 15px; border:1px solid var(--line-200);
  border-radius:var(--wsp-r12); background:var(--surface-0);
}
.wsp-meta__cell{ min-width:0 }
.wsp-meta__kicker{
  font-family:var(--font-mono); font-size:9px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle); margin-bottom:7px;
}
.wsp-meta__row{ display:flex; align-items:center; gap:5px; flex-wrap:wrap }
.wsp-meta__none{ font-size:12px; color:var(--text-subtle) }

/* -- seksi konten -- */
.wsp-sect{
  padding:13px 15px 15px; border:1px solid var(--line-200);
  border-radius:var(--wsp-r12); background:var(--surface-0);
}
.wsp-sect__head { display:flex; align-items:center; gap:8px; margin-bottom:9px }
.wsp-sect__head--10{ margin-bottom:10px }
.wsp-sect__ic   { width:15px; height:15px; color:var(--text-muted); flex:0 0 auto; display:inline-flex }
.wsp-sect__title{ font-family:var(--font-display); font-size:13.5px; font-weight:700; color:var(--text-strong); flex:1 }
.wsp-sect__count{ font-family:var(--font-mono); font-size:11px; font-weight:700; color:var(--text-muted) }

/* -- picker label / assignee -- */
.wsp-pick{ border:1px solid var(--line-200); border-radius:var(--wsp-r12); background:var(--surface-1); padding:12px 13px }
.wsp-pick__title{ font-size:11.5px; font-weight:700; color:var(--text-strong); margin-bottom:9px }
.wsp-pick__grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(155px,1fr)); gap:6px }
.wsp-pick__grid--asg{ grid-template-columns:repeat(auto-fill, minmax(190px,1fr)) }
.wsp-pick__row{
  display:flex; align-items:center; gap:8px; height:34px; padding:0 10px;
  border-radius:var(--wsp-r9); cursor:pointer; font-family:var(--font-body);
  background:var(--surface-0); border:1px solid var(--line-200);
}
.wsp-pick__row.is-on{ border-color:var(--wsp-ink) }
.wsp-pick__row--asg{ height:38px; gap:9px }
.wsp-pick__name{
  flex:1; min-width:0; text-align:left; font-size:12px; font-weight:600;
  color:var(--text-body); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp-pick__check{ width:14px; height:14px; color:var(--text-strong); flex:0 0 auto; display:inline-flex }

/* -- chip tenggat -- */
.wsp-duechip{
  display:inline-flex; align-items:center; gap:6px;
  height:28px; padding:0 11px; border-radius:var(--wsp-r9); cursor:pointer;
  font-family:var(--font-mono); font-size:11.5px; font-weight:700;
  background:var(--surface-0); border:1px solid var(--border-input); color:var(--text-strong);
}
.wsp-duechip.is-urgent{ background:var(--pst-danger-bg); border-color:var(--pst-danger-border); color:var(--pst-danger-text) }
.wsp-dueedit{ display:flex; align-items:center; gap:6px }
.wsp-dueinput{
  height:28px; padding:0 8px;
  border:1px solid var(--ink-300); border-radius:var(--wsp-r8);
  font-family:var(--font-mono); font-size:11.5px; color:var(--text-strong);
  outline:none; background:var(--surface-0);
}

/* -- deskripsi + editor rich text -- */
.wsp-desc{
  border:1px solid transparent; border-radius:var(--wsp-r10);
  padding:10px 12px; margin-left:-12px; cursor:text;
  font-size:13px; color:var(--text-body);
}
.wsp-desc:hover{ background:var(--surface-1); border-color:var(--line-100) }
.wsp-editor{
  border:1px solid var(--ink-300); border-radius:var(--wsp-r12);
  overflow:hidden; background:var(--surface-0); box-shadow:var(--shadow-card);
}
.wsp-editor--cmt{ border-color:var(--border-input); box-shadow:none }
.wsp-editor__bar{
  display:flex; flex-wrap:wrap; align-items:center; gap:1px;
  padding:5px 7px; border-bottom:1px solid var(--line-100); background:var(--surface-1);
}
.wsp-editor__tool{
  width:28px; height:28px; display:grid; place-items:center;
  border-radius:var(--wsp-r7); border:0; background:transparent;
  color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-editor__tool:hover{ background:var(--ink-050); color:var(--text-strong) }
.wsp-editor__tool.is-on{ background:var(--ink-050); color:var(--text-strong) }
.wsp-editor__acts{ display:flex; align-items:center; gap:7px; margin-top:9px }
.wsp-editor__acts--cmt{ gap:7px; margin-top:8px }
.wsp-shortcut{ font-family:var(--font-mono); font-size:10px; color:var(--text-subtle) }

/* -- checklist -- */
.wsp-ckprog{ display:flex; align-items:center; gap:10px; margin-bottom:10px }
.wsp-cklist{ display:flex; flex-direction:column; gap:1px }
.wsp-ckrow{ display:flex; align-items:center; gap:9px; padding:6px 8px; border-radius:var(--wsp-r8); margin-left:-8px }
.wsp-ckrow:hover{ background:var(--surface-1) }
.wsp-ckbox{
  width:18px; height:18px; border-radius:var(--wsp-r5);
  display:grid; place-items:center; cursor:pointer; flex:0 0 auto;
  background:var(--surface-0); border:1px solid var(--border-input); color:var(--wsp-on-ink);
}
.wsp-ckbox.is-on{ background:var(--wsp-ink); border-color:var(--wsp-ink) }
.wsp-cktext{ flex:1; min-width:0; font-size:12.5px; line-height:1.45; color:var(--text-body) }
.wsp-cktext.is-done{ color:var(--text-subtle); text-decoration:line-through }
.wsp-ckadd{ display:flex; align-items:center; gap:7px; margin-top:9px }
.wsp-ckadd input{
  flex:1; min-width:0; height:32px; padding:0 12px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r9);
  font-family:var(--font-body); font-size:12.5px; color:var(--text-strong);
  outline:none; background:var(--surface-0);
}
.wsp-ckadd .wsp-btn{ height:32px; padding:0 14px; border-radius:var(--wsp-r9); color:var(--text-strong) }

/* -- lampiran kartu -- */
.wsp-attwrap{ display:flex; flex-direction:column; gap:6px }
.wsp-att{
  display:flex; align-items:center; gap:10px; padding:9px 11px;
  border:1px solid var(--line-200); border-radius:var(--wsp-r10); background:var(--surface-0);
}
.wsp-att__id  { flex:1; min-width:0 }
.wsp-att__name{
  display:block; font-size:12.5px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp-att__meta{ display:block; font-family:var(--font-mono); font-size:10px; color:var(--text-subtle); margin-top:1px }
.wsp-att__none{ font-size:12px; color:var(--text-subtle) }

/* -- aktivitas & komentar -- */
.wsp-cmtbox{ display:flex; gap:10px; margin-bottom:16px }
.wsp-cmtbox__body{ flex:1; min-width:0 }
.wsp-feed{ display:flex; flex-direction:column }
.wsp-feed__row{ display:flex; gap:10px; padding:11px 0; border-top:1px solid var(--line-100) }
.wsp-feed__id  { flex:1; min-width:0 }
.wsp-feed__head{ display:flex; align-items:baseline; gap:8px; flex-wrap:wrap }
.wsp-feed__author{ font-size:12.5px; font-weight:700; color:var(--text-strong) }
.wsp-feed__time  { font-family:var(--font-mono); font-size:10px; color:var(--text-subtle) }
.wsp-feed__cmt   { display:block; margin-top:5px; font-size:13px; color:var(--text-body) }
.wsp-feed__log   { display:block; margin-top:3px; font-size:12.5px; color:var(--text-muted) }
.wsp-feed__ava--log{ background:var(--ink-100); color:var(--ink-600); font-size:9px }

/* -- sidebar aksi -- */
.wsp-side{
  border-left:1px solid var(--line-100); background:var(--surface-1);
  padding:16px 14px 22px; overflow-y:auto;
  display:flex; flex-direction:column; gap:18px;
}
.wsp-side__kicker{
  font-family:var(--font-mono); font-size:9px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle); margin-bottom:8px;
}
.wsp-side__stack{ display:flex; flex-direction:column; gap:5px }
.wsp-side__wrap { display:flex; gap:5px; flex-wrap:wrap }
.wsp-sideitem{
  display:flex; align-items:center; gap:8px; height:32px; padding:0 11px;
  border-radius:var(--wsp-r9); border:1px solid var(--line-200); background:var(--surface-0);
  font-family:var(--font-body); font-size:12px; font-weight:600; color:var(--text-body);
  cursor:pointer; text-align:left;
}
.wsp-sideitem:hover{ background:var(--surface-1); border-color:var(--ink-300) }
.wsp-sideitem.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); border-color:var(--wsp-ink); font-weight:700 }
.wsp-sideitem i, .wsp-sideitem svg{ width:14px; height:14px; color:var(--text-muted); flex:0 0 auto; display:inline-flex }
.wsp-sideitem.is-on i, .wsp-sideitem.is-on svg{ color:var(--wsp-on-ink) }
.wsp-sideitem--danger{
  border-color:var(--pst-danger-border); background:var(--pst-danger-bg); color:var(--pst-danger-text);
}
.wsp-sideitem--danger:hover{ filter:brightness(.97); border-color:var(--pst-danger-border); background:var(--pst-danger-bg) }
.wsp-sideitem--danger i, .wsp-sideitem--danger svg{ color:var(--pst-danger-text) }
.wsp-prio{ font-size:11.5px; height:29px }                  /* dipasang bersama .wsp-pill */
/* Harus se-spesifik .wsp-pill.is-on (0,3,0) + dideklarasikan setelahnya,
   kalau tidak chip prioritas aktif ter-render ink, bukan bertone. */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-prio.is-on,
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-prio.is-on:hover{
  background:var(--wsp-tone-bg); color:var(--wsp-tone-text);
  border-color:var(--wsp-tone-text); font-weight:700;
}
.wsp-side__note{ margin-top:auto; font-size:11px; color:var(--text-subtle); line-height:1.5 }

/* -- baris aksi versi layar sempit -- */
.wsp-mobacts{
  display:none; flex-wrap:wrap; gap:6px; align-items:center;
  padding:2px 0; border-bottom:1px solid var(--line-100);
}

/* ------------------------------------------------------------------ */
/* §10 · .wsp-rich — tipografi rich-text (helmet master baris 32-43)    */
/* ------------------------------------------------------------------ */
.wsp-rich{
  min-height:140px; max-height:300px; overflow-y:auto;
  padding:13px 15px; font-size:13px; line-height:1.65;
  color:var(--text-body); outline:none;
}
.wsp-rich--cmt{ min-height:64px; max-height:200px; padding:11px 13px; line-height:1.6 }
.wsp-rich p{ margin:0 0 8px }
.wsp-rich p:last-child{ margin-bottom:0 }
.wsp-rich ul, .wsp-rich ol{ margin:8px 0; padding-left:20px; list-style:revert }
.wsp-rich li{ margin:3px 0 }
.wsp-rich h1, .wsp-rich h2{
  font-family:var(--font-display); font-size:15px; font-weight:700;
  margin:12px 0 6px; color:var(--text-strong);
}
.wsp-rich h3{ font-size:13.5px; font-weight:700; margin:10px 0 5px; color:var(--text-strong) }
.wsp-rich blockquote{
  margin:9px 0; padding:2px 0 2px 12px;
  border-left:3px solid var(--line-200); color:var(--text-muted);
}
.wsp-rich code{
  font-family:var(--font-mono); font-size:12px;
  background:var(--ink-050); padding:1px 5px; border-radius:var(--wsp-r5);
}
.wsp-rich a{ color:var(--text-strong); text-decoration:underline }
.wsp-rich b, .wsp-rich strong{ font-weight:700; color:var(--text-strong) }
.wsp-rich[contenteditable]:empty:before{ content:attr(data-ph); color:var(--text-subtle) }

/* ------------------------------------------------------------------ */
/* §11 · RESPONSIVE — hanya breakpoint yang ada di master (1180 · 760)  */
/* ------------------------------------------------------------------ */
@media (max-width:1180px){
  .wsp .wsp-grid{ grid-template-columns:minmax(0,1fr) }
  .wsp .wsp-railwrap{ flex-direction:row; overflow-x:auto; gap:6px }
  .wsp .wsp-railwrap > .wsp-boardcard{ flex:0 0 176px }
  /* Scope-nya WAJIB sama dengan rule dasar di §2 (:is(...) = 0,2,0),
     kalau tidak rule dasar yang lebih spesifik justru menang di antar-!important
     dan .wsp-showsm tidak pernah muncul di dalam dialog/card modal. */
  :is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-hidesm{ display:none !important }
  :is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-showsm{ display:flex !important }
  .wsp-cm{ grid-template-columns:1fr }
  .wsp-side{ display:none !important }
  .wsp-mobacts{ display:flex !important }
}
@media (max-width:760px){
  :is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-hidexs{ display:none !important }
}

/* ------------------------------------------------------------------ */
/* §12 · REDUCED MOTION                                                */
/* ------------------------------------------------------------------ */
@media (prefers-reduced-motion: reduce){
  .wsp .wsp-grid,
  .wsp-scrim,
  .wsp-dlg{ animation:none !important }
  .wsp .wsp-col,
  .wsp .wsp-kcard{ transition:none !important }
  .wsp .wsp-kcard:hover{ transform:none }
}

/* == :END == WORKSPACE-PM ============================================ */

/* == WORKSPACE-HOME (F2 · Ringkasan — reproduksi Workspace.dc.html) === */
/* Sumber: markup 203-379 (layout "fokus", default props master) + anatomi
   "Agenda hari ini" 404-422 dari varian BRIEFING. Binding style diresolusi dari
   script master 4128-4203 (tag(), barSt, g.dot). Breakpoint 1180/760 = helmet
   master 58-75 (.ws-g2 → 1fr, .ws-herorow → kolom).
   Token lokal --wsp-* diwarisi dari §0 blok WORKSPACE-PM di atas. */

/* alpha di atas permukaan ink (master rgba(255,255,255,.NN)) — additive ke §0.
   Deklarasi ulang pada akar yang sama; tidak menimpa nilai lama. */
.wsp, .wsp-dlg, .wsp-modal, .wsp-scrim, .wsp-drawer, .wsp-drawer-back, .wsp-notifpop{
  --wsp-on-ink-55:color-mix(in srgb, var(--primary-contrast) 55%, transparent);
  --wsp-on-ink-64:color-mix(in srgb, var(--primary-contrast) 64%, transparent);
  --wsp-on-ink-75:color-mix(in srgb, var(--primary-contrast) 75%, transparent);
  --wsp-on-ink-line:color-mix(in srgb, var(--primary-contrast) 22%, transparent);
  --wsp-on-ink-line-28:color-mix(in srgb, var(--primary-contrast) 28%, transparent);
  --wsp-on-ink-fill-08:color-mix(in srgb, var(--primary-contrast) 8%, transparent);
  --wsp-on-ink-fill-06:color-mix(in srgb, var(--primary-contrast) 6%, transparent);
  --wsp-ink-fill-10:color-mix(in srgb, var(--ink-950) 10%, transparent);
  /* master: box-shadow 0 0 24px rgba(255,247,0,.25) — rgba itu --vs-yellow */
  --wsp-glow-brand:color-mix(in srgb, var(--vs-yellow) 25%, transparent);
}

/* -- dot 6px mewarisi warna teks induk (master 224: background:currentColor) -- */
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dot--6{ width:6px; height:6px }
:is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) .wsp-dot--cc{ background:currentColor }

/* ------------------------------------------------------------------ */
/* H1 · KERANGKA                                          master 205-211 */
/* ------------------------------------------------------------------ */
.wsp-home{ display:flex; flex-direction:column; gap:18px; animation:wsp-fade .2s ease }
.wsp-home__grid{ display:grid; grid-template-columns:minmax(0,1fr) 332px; gap:18px; align-items:start }
.wsp-home__col{ display:flex; flex-direction:column; gap:18px; min-width:0 }

/* ------------------------------------------------------------------ */
/* H2 · HERO PRESENSI                                     master 214-245 */
/* ------------------------------------------------------------------ */
.wsp .wsp-hero{
  position:relative; overflow:hidden;
  background:var(--bg-ink); color:var(--wsp-on-ink);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card);
}
/* master 215: garis kuning 3px penuh di tepi atas */
.wsp .wsp-hero::before{ content:''; position:absolute; top:0; left:0; right:0; height:3px; background:var(--vs-yellow) }
/* Hero berganti warna mengikuti status presensi (keputusan owner 2026-07-28).
   Warna DITURUNKAN dari token tag yang sudah ada lewat color-mix di atas --bg-ink —
   tidak ada hex baru. Basis tetap gelap supaya --wsp-on-ink (teks terang) aman
   kontrasnya; yang berubah hanya temperatur permukaannya. */
.wsp .wsp-hero--late{
  background:
    radial-gradient(115% 150% at 10% 0%, color-mix(in srgb, var(--tag-danger-text) 46%, transparent) 0%, transparent 60%),
    linear-gradient(135deg, color-mix(in srgb, var(--tag-danger-text) 34%, var(--bg-ink)) 0%, var(--bg-ink) 72%);
}
.wsp .wsp-hero--ontime{
  background:
    radial-gradient(115% 150% at 10% 0%, color-mix(in srgb, var(--tag-info-text) 44%, transparent) 0%, transparent 60%),
    linear-gradient(135deg, color-mix(in srgb, var(--tag-info-text) 32%, var(--bg-ink)) 0%, var(--bg-ink) 72%);
}
.wsp .wsp-hero__row{ display:flex; align-items:center; gap:28px; padding:26px 28px }
.wsp .wsp-hero__main{ flex:1; min-width:220px }
.wsp .wsp-hero__kick{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--wsp-on-ink-55);
}
.wsp .wsp-hero__clock{
  font-family:var(--font-mono); font-size:44px; font-weight:700;
  letter-spacing:-.01em; margin-top:8px; color:var(--wsp-on-ink);
}
.wsp .wsp-hero__cap{ font-size:13px; color:var(--wsp-on-ink-64); margin-top:2px }
.wsp .wsp-hero__side{ display:flex; flex-direction:column; gap:10px; min-width:230px }
.wsp .wsp-hero__tags{ display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.wsp .wsp-hero__geo{
  display:inline-flex; align-items:center; gap:6px; padding:3px 10px;
  border-radius:var(--wsp-rp); border:1px solid var(--wsp-on-ink-line);
  color:var(--wsp-on-ink-75); font-size:11.5px; font-weight:500; white-space:nowrap;
}
.wsp .wsp-hero__meta{ font-size:12.5px; color:var(--wsp-on-ink-64); line-height:1.5 }
.wsp .wsp-hero__meta b{ color:var(--wsp-on-ink); font-weight:600 }
.wsp .wsp-hero__acts{ display:flex; gap:8px; flex-wrap:wrap }

/* tombol hero — master 232 (brand) · 237 (ghost) · 241 (dashed) */
.wsp .wsp-hbtn{
  display:inline-flex; align-items:center; gap:8px; height:42px; padding:0 22px;
  border-radius:var(--wsp-r10); border:0; background:var(--vs-yellow); color:var(--wsp-ink);
  font-family:var(--font-body); font-size:14px; font-weight:700; cursor:pointer;
  box-shadow:0 0 24px var(--wsp-glow-brand);
}
/* master style-hover #F0E900 = kuning satu tingkat lebih gelap; padanan token DS
   = --vs-yellow-shadow (#E6DC00). Tidak ada token #F0E900 di app. */
.wsp .wsp-hbtn:hover{ background:var(--vs-yellow-shadow) }
.wsp .wsp-hbtn--ghost{
  border:1px solid var(--wsp-on-ink-line-28); background:transparent;
  color:var(--wsp-on-ink); font-weight:600; box-shadow:none;
}
.wsp .wsp-hbtn--ghost:hover{ background:var(--wsp-on-ink-fill-08) }
.wsp .wsp-hbtn--dash{
  padding:0 16px; border:1px dashed var(--wsp-on-ink-line-28); background:transparent;
  color:var(--wsp-on-ink-75); font-size:13px; font-weight:500; box-shadow:none;
}
.wsp .wsp-hbtn--dash:hover{ background:var(--wsp-on-ink-fill-06) }

/* ------------------------------------------------------------------ */
/* H3 · STAT TILE                                         master 248-258 */
/* ------------------------------------------------------------------ */
.wsp .wsp-stats{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:12px }
.wsp .wsp-stat{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); padding:16px 18px; box-shadow:var(--shadow-card);
}
.wsp .wsp-stat__lbl{
  display:flex; align-items:center; gap:7px;
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-stat__val{
  font-family:var(--font-mono); font-size:26px; font-weight:700;
  color:var(--text-strong); margin-top:8px; letter-spacing:-.01em;
}
.wsp .wsp-stat__foot{ font-size:11.5px; color:var(--text-subtle); margin-top:2px }

/* ------------------------------------------------------------------ */
/* H4 · PANEL DASAR                             master 261-266 · 307-312 */
/* ------------------------------------------------------------------ */
.wsp .wsp-hp{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
.wsp .wsp-hp__head{
  display:flex; align-items:center; gap:10px; padding:16px 20px;
  border-bottom:1px solid var(--line-100);
}
.wsp .wsp-hp__ic{ display:inline-flex; color:var(--text-muted); flex:0 0 auto }
.wsp .wsp-hp__title{
  font-family:var(--font-display); font-size:15px; font-weight:700;
  margin:0; flex:1; min-width:0; color:var(--text-strong);
}
.wsp .wsp-hp__note{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); flex:0 0 auto }
.wsp .wsp-hp__empty{ padding:22px; text-align:center; font-size:13px; color:var(--text-subtle) }
.wsp .wsp-hp__body{ display:flex; flex-direction:column }
.wsp .wsp-hp > :last-child{ border-bottom:0 }
.wsp .wsp-hp__body > :last-child{ border-bottom:0 }
/* varian kolom kanan (master 307-366): head 15px 18px · gap 9 · judul 14.5px */
.wsp .wsp-hp--side .wsp-hp__head{ padding:15px 18px; gap:9px }
.wsp .wsp-hp--side .wsp-hp__title{ font-size:14.5px }
.wsp .wsp-hp--side .wsp-hp__empty{ padding:20px; font-size:12.5px }

/* tombol/link kanan di head — master 265 · 337 · 355 */
.wsp .wsp-hlink{
  display:inline-flex; align-items:center; gap:6px; padding:6px 12px;
  border-radius:var(--wsp-rp); border:1px solid var(--border-input); background:var(--surface-0);
  font-family:var(--font-body); font-size:12px; font-weight:600; color:var(--text-strong);
  cursor:pointer; text-decoration:none; flex:0 0 auto; white-space:nowrap;
}
.wsp .wsp-hlink:hover{ background:var(--surface-1); color:var(--text-strong) }
.wsp .wsp-hlink--bare{ border:0; background:transparent; color:var(--text-muted); padding:0 }
.wsp .wsp-hlink--bare:hover{ background:transparent; color:var(--text-strong) }
.wsp .wsp-hlink--ink{
  border:0; background:var(--wsp-ink); color:var(--wsp-on-ink);
  padding:5px 11px; gap:5px; font-size:11.5px;
}
.wsp .wsp-hlink--ink:hover{ background:var(--wsp-ink-hover); color:var(--wsp-on-ink) }

/* ------------------------------------------------------------------ */
/* H5 · BARIS TUGAS SAYA                                  master 268-278 */
/* ------------------------------------------------------------------ */
.wsp .wsp-trow{
  display:flex; align-items:center; gap:12px; width:100%; padding:12px 20px;
  border:0; border-bottom:1px solid var(--line-100); background:transparent;
  cursor:pointer; text-align:left; font-family:var(--font-body);
}
.wsp .wsp-trow:hover{ background:var(--surface-1) }
.wsp .wsp-trow__code{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); flex:0 0 44px }
.wsp .wsp-trow__title{
  flex:1; min-width:0; font-size:13.5px; font-weight:500; color:var(--text-body);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-trow__due{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); flex:0 0 auto }

/* ------------------------------------------------------------------ */
/* H6 · STRIP DAILY JURNAL                                master 289-299 */
/* ------------------------------------------------------------------ */
.wsp .wsp-jstrip{ display:flex; gap:10px; padding:16px 20px; overflow-x:auto }
.wsp .wsp-jcard{
  flex:0 0 200px; border:1px solid var(--line-200); border-radius:var(--wsp-r10);
  padding:11px 12px; background:var(--surface-1);
}
.wsp .wsp-jcard__tags{ display:flex; align-items:center; gap:6px; flex-wrap:wrap }
.wsp .wsp-jcard__title{ font-size:12.5px; font-weight:500; color:var(--text-body); margin-top:8px; line-height:1.4 }

/* ------------------------------------------------------------------ */
/* H7 · MENUNGGU KEPUTUSAN / PENGAJUAN SAYA        master 311-328 · 339-347 */
/* ------------------------------------------------------------------ */
.wsp .wsp-hcount{
  font-family:var(--font-mono); font-size:10.5px; font-weight:700; padding:2px 8px;
  border-radius:var(--wsp-rp); background:var(--vs-yellow); color:var(--wsp-ink); flex:0 0 auto;
}
.wsp .wsp-arow{ padding:12px 18px; border-bottom:1px solid var(--line-100) }
.wsp .wsp-arow__head{ display:flex; align-items:center; gap:8px }
.wsp .wsp-arow__who{
  font-size:12.5px; font-weight:600; color:var(--text-strong);
  flex:1; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-arow__detail{ font-size:12px; color:var(--text-muted); margin-top:5px; line-height:1.45 }
.wsp .wsp-arow__acts{ display:flex; gap:6px; margin-top:9px }
.wsp .wsp-abtn{
  flex:1; height:30px; border-radius:var(--wsp-r8); border:0;
  background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:12px; font-weight:600; cursor:pointer;
}
.wsp .wsp-abtn:hover{ background:var(--wsp-ink-hover) }
.wsp .wsp-abtn--ghost{ border:1px solid var(--border-input); background:var(--surface-0); color:var(--text-muted) }
.wsp .wsp-abtn--ghost:hover{ background:var(--surface-1); color:var(--text-muted) }
.wsp .wsp-abtn--note{ flex:1; align-self:center; font-size:11.5px; color:var(--text-subtle); text-align:center }

.wsp .wsp-srow{ padding:12px 18px; border-bottom:1px solid var(--line-100); display:flex; align-items:center; gap:10px }
.wsp .wsp-srow__body{ flex:1; min-width:0 }
.wsp .wsp-srow__title{ font-size:12.5px; font-weight:600; color:var(--text-strong) }
.wsp .wsp-srow__detail{ font-size:11.5px; color:var(--text-subtle); margin-top:2px }

/* ------------------------------------------------------------------ */
/* H8 · FORUM TERBARU                                     master 358-364 */
/* ------------------------------------------------------------------ */
.wsp .wsp-frow{
  display:flex; gap:10px; width:100%; padding:12px 18px; border:0;
  border-bottom:1px solid var(--line-100); background:transparent; cursor:pointer;
  text-align:left; font-family:var(--font-body); text-decoration:none;
}
.wsp .wsp-frow:hover{ background:var(--surface-1) }
.wsp .wsp-frow__ava{
  width:28px; height:28px; border-radius:var(--wsp-rp);
  background:var(--ink-100); color:var(--ink-600); display:grid; place-items:center;
  font-family:var(--font-mono); font-size:10px; font-weight:700; flex:0 0 auto;
}
.wsp .wsp-frow__body{ flex:1; min-width:0 }
.wsp .wsp-frow__title{ display:block; font-size:12.5px; font-weight:600; color:var(--text-body); line-height:1.4 }
.wsp .wsp-frow__meta{
  display:block; font-size:11px; color:var(--text-subtle); margin-top:3px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}

/* ------------------------------------------------------------------ */
/* H9 · POST-PRO BERJALAN (mini)                          master 368-376 */
/* ------------------------------------------------------------------ */
.wsp .wsp-ppmini{
  background:var(--pst-identity-bg); border:1px solid var(--vs-yellow-shadow);
  border-radius:var(--wsp-r14); padding:16px 18px;
}
.wsp .wsp-ppmini__head{
  display:flex; align-items:center; gap:8px;
  font-family:var(--font-mono); font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--pst-identity-text);
}
.wsp .wsp-ppmini__row{
  display:block; width:100%; border:0; background:transparent;
  padding:10px 0 0; cursor:pointer; text-align:left; font-family:var(--font-body);
}
.wsp .wsp-ppmini__line{
  display:flex; justify-content:space-between; gap:10px;
  font-size:12.5px; font-weight:600; color:var(--text-strong);
}
.wsp .wsp-ppmini__name{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-ppmini__pct{ font-family:var(--font-mono); font-weight:700; flex:0 0 auto }
.wsp .wsp-ppmini__track{
  height:5px; border-radius:var(--wsp-rp); background:var(--wsp-ink-fill-10);
  margin-top:6px; overflow:hidden;
}
.wsp .wsp-ppmini__bar{ height:100%; background:var(--wsp-ink); border-radius:var(--wsp-rp) }
.wsp .wsp-ppmini__empty{ font-size:12px; color:var(--pst-identity-text); margin-top:9px; line-height:1.45 }

/* ------------------------------------------------------------------ */
/* H10 · AGENDA HARI INI                                  master 404-421 */
/* ------------------------------------------------------------------ */
.wsp .wsp-agenda{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); padding:20px 24px;
}
.wsp .wsp-agenda__head{ display:flex; align-items:center; gap:9px; margin-bottom:14px }
.wsp .wsp-agenda__title{
  font-family:var(--font-display); font-size:14.5px; font-weight:700;
  margin:0; flex:1; min-width:0; color:var(--text-strong);
}
.wsp .wsp-agenda__list{ display:flex; flex-direction:column }
.wsp .wsp-agenda__list > :last-child{ border-bottom:0 }
.wsp .wsp-agrow{ display:flex; gap:14px; padding:10px 0; border-bottom:1px solid var(--line-100) }
.wsp .wsp-agrow__time{
  font-family:var(--font-mono); font-size:11.5px; font-weight:600;
  color:var(--text-subtle); flex:0 0 46px; padding-top:2px;
}
/* master 413: background:{{ g.dot }} — nilai token per jenis agenda (script 4197-4202) */
.wsp .wsp-agrow__dot{
  width:8px; height:8px; border-radius:var(--wsp-rp); margin-top:5px; flex:0 0 auto;
  background:var(--wsp-agdot,var(--ink-300));
}
.wsp .wsp-agrow--shift  { --wsp-agdot:var(--vs-yellow) }
.wsp .wsp-agrow--booking{ --wsp-agdot:var(--accent-blue) }
.wsp .wsp-agrow--due    { --wsp-agdot:var(--accent-red) }
.wsp .wsp-agrow--routine{ --wsp-agdot:var(--accent-violet) }
.wsp .wsp-agrow__body{ flex:1; min-width:0 }
.wsp .wsp-agrow__title{ display:block; font-size:13px; font-weight:600; color:var(--text-body) }
.wsp .wsp-agrow__meta{ display:block; font-size:11.5px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-agenda__empty{ font-size:13px; color:var(--text-subtle); padding:4px 0 2px }

/* ------------------------------------------------------------------ */
/* H11 · RESPONSIF (helmet master 58-75)                                */
/* ------------------------------------------------------------------ */
@media (max-width:1180px){
  .wsp-home__grid{ grid-template-columns:minmax(0,1fr) }
}
@media (max-width:760px){
  .wsp .wsp-hero__row{ flex-direction:column; align-items:flex-start }
}
@media (prefers-reduced-motion: reduce){
  .wsp-home{ animation:none !important }
}

/* == :END == WORKSPACE-HOME ========================================== */

/* == WORKSPACE-POSTPRO (F3 — reproduksi Workspace.dc.html 1191-1399) === */
/* Binding style diresolusi dari script master postproVals() 5101-5240 dan
   drawer batch 5590-5603 / markup 2719-2763.
   Primitif bersama (.wsp-tag/.wsp-track/.wsp-bar/--wsp-*) dari blok WORKSPACE-PM. */

.wsp-pp{ display:flex; flex-direction:column; gap:16px; animation:wsp-fade .2s ease }

/* -- head (master 1194-1201) -- */
.wsp .wsp-pp__head{ display:flex; align-items:center; gap:10px; flex-wrap:wrap }
.wsp .wsp-pp__h2{ font-family:var(--font-display); font-size:16px; font-weight:700; margin:0; color:var(--text-strong) }
.wsp .wsp-pp__sub{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle) }
.wsp .wsp-pp__spacer{ flex:1 }

/* -- tab bar pill (master 1203-1207) -- */
.wsp .wsp-pp__tabs{
  display:flex; align-items:center; gap:4px; flex-wrap:wrap; align-self:flex-start;
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-rp); padding:4px; box-shadow:var(--shadow-card);
}
.wsp .wsp-pptab{
  display:inline-flex; align-items:center; gap:7px; height:34px; padding:0 14px;
  border-radius:var(--wsp-rp); border:0; background:transparent; color:var(--text-muted);
  font-family:var(--font-body); font-size:12.5px; font-weight:500; cursor:pointer; white-space:nowrap;
  text-decoration:none;
}
.wsp .wsp-pptab.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }
.wsp .wsp-pptab__n{
  font-family:var(--font-mono); font-size:9.5px; font-weight:700;
  padding:1px 6px; border-radius:var(--wsp-rp); background:var(--ink-050); color:var(--text-muted);
}
.wsp .wsp-pptab.is-on .wsp-pptab__n{ background:var(--wsp-on-ink-fill-18); color:var(--wsp-on-ink) }

/* -- chip filter tahap (master 1213-1215) -- */
.wsp .wsp-ppchips{ display:flex; align-items:center; gap:7px; flex-wrap:wrap }
.wsp .wsp-ppchip{
  display:inline-flex; align-items:center; gap:6px; height:30px; padding:0 12px;
  border-radius:var(--wsp-rp); border:1px solid var(--line-200);
  background:var(--surface-0); color:var(--text-muted);
  font-family:var(--font-body); font-size:11.5px; font-weight:500; cursor:pointer; white-space:nowrap;
}
.wsp .wsp-ppchip.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); border-color:var(--wsp-ink); font-weight:700 }
.wsp .wsp-ppchip__n{ font-family:var(--font-mono); opacity:.65 }
.wsp .wsp-ppchips__note{ font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle); margin-left:auto }

/* -- tabel antrean edit (master 1219-1262) -- */
.wsp .wsp-ppwrap{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
.wsp .wsp-ppscroll{ overflow-x:auto }
/* 744px = jumlah LANTAI kolom (78+148+64+94+60+106+98=648) + gap (6x10=60) + padding (2x18=36).
   Dulu 1000px kaku: kontainer <1000px langsung menggeser ke samping walau isinya muat. */
.wsp .wsp-pptable{ min-width:744px }
/* FLUID: tiap kolom minmax(lantai, nilai master). Di layar lebar tiap kolom mencapai
   maksimum = angka master persis, jadi geometri desktop TIDAK berubah sama sekali;
   di layar sempit kolom menyusut sampai lantainya, bukan memaksa scroll.
   Lantai dihitung dari isi TERPANJANG yang mungkin, bukan dikira-kira:
   Aksi 98 = 3 tombol x 30 + 2 gap x 4 · Tahap 106 = tag "Terkirim Vendor" + persen + gap. */
.wsp .wsp-pprow{
  display:grid;
  grid-template-columns:
    minmax(78px, 92px)        /* Batch  */
    minmax(148px, 1.4fr)      /* Klien / asal — satu-satunya yang boleh melar */
    minmax(64px, 84px)        /* Volume */
    minmax(94px, 116px)       /* Editor */
    minmax(60px, 84px)        /* Due    */
    minmax(106px, 132px)      /* Tahap · progress */
    minmax(98px, 118px);      /* Aksi   */
  gap:10px; align-items:center; padding:13px 18px; border-bottom:1px solid var(--line-100);
}
/* WAJIB: anak grid default punya min-width:auto sehingga TIDAK PERNAH menyusut di bawah
   isinya — isinya lalu meluber ke kolom sebelah dan terlihat seperti tumpang tindih.
   Sebelumnya hanya .wsp-ppcell yang dinolkan; .wsp-ppmono/.wsp-ppdue/.wsp-ppacts dan
   SELURUH span header masih 'auto'. Ini penyebab overlap yang dilaporkan. */
.wsp .wsp-pprow > *{ min-width:0 }
.wsp .wsp-pprow--head{
  align-items:center; padding:11px 18px; background:var(--surface-1);
  font-family:var(--font-mono); font-size:9px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle);
}
/* header dipotong elipsis, bukan mendorong kolom sebelahnya */
.wsp .wsp-pprow--head > span{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-pptable > :last-child{ border-bottom:0 }
.wsp .wsp-ppcell{ min-width:0 }
.wsp .wsp-ppcell--stack{ display:flex; flex-direction:column; gap:4px; align-items:flex-start }
.wsp .wsp-ppcode{ font-family:var(--font-mono); font-size:11px; font-weight:700; color:var(--text-strong) }
.wsp .wsp-ppname{
  display:block; font-size:12.5px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-ppsub{ display:block; font-size:11px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-ppmono{ font-family:var(--font-mono); font-size:11px; color:var(--text-muted);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-ppsel{
  width:100%; height:30px; border:1px solid var(--border-input); border-radius:var(--wsp-r8);
  background:var(--surface-0); font-family:var(--font-body); font-size:11.5px;
  color:var(--text-strong); padding:0 6px;
}
.wsp .wsp-ppdue{ font-family:var(--font-mono); font-size:11px; font-weight:500; color:var(--text-muted);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-ppdue.is-late{ font-weight:700; color:var(--pst-danger-text) }
.wsp .wsp-ppstep{ display:flex; align-items:center; gap:7px; min-width:0 }
.wsp .wsp-ppstep > .wsp-tag{ min-width:0; overflow:hidden; text-overflow:ellipsis }
.wsp .wsp-pppct{ font-family:var(--font-mono); font-size:10.5px; font-weight:700; color:var(--text-strong); flex:0 0 auto }
.wsp .wsp-ppacts{ display:flex; gap:4px; justify-content:flex-end; flex-wrap:nowrap }
.wsp .wsp-ppico{
  width:30px; height:30px; display:grid; place-items:center; border-radius:var(--wsp-r8);
  border:1px solid var(--border-input); background:var(--surface-0);
  color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp .wsp-ppico:hover:not(:disabled){ background:var(--surface-1); color:var(--text-strong) }
.wsp .wsp-ppico:disabled{ opacity:.45; cursor:not-allowed }
.wsp .wsp-ppico--tone{
  border-color:var(--wsp-tone-border); background:var(--wsp-tone-bg); color:var(--wsp-tone-text);
}
.wsp .wsp-ppico--tone:hover:not(:disabled){ filter:brightness(.97); background:var(--wsp-tone-bg); color:var(--wsp-tone-text) }
.wsp .wsp-ppnote{ display:flex; align-items:flex-start; gap:7px; font-size:11.5px; color:var(--text-subtle); line-height:1.5 }
.wsp .wsp-ppnote svg{ flex:0 0 auto; margin-top:2px }

/* -- stat cetak (master 1270-1277) -- */
.wsp .wsp-ppstats{ display:grid; grid-template-columns:repeat(auto-fit,minmax(168px,1fr)); gap:10px }
.wsp .wsp-ppstat{ background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--wsp-r12); padding:12px 14px }
.wsp .wsp-ppstat__lbl{ font-family:var(--font-mono); font-size:9px; letter-spacing:.14em; text-transform:uppercase; color:var(--text-subtle) }
.wsp .wsp-ppstat__val{ font-family:var(--font-display); font-size:19px; font-weight:700; color:var(--text-strong); margin-top:4px }
.wsp .wsp-ppstat__foot{ font-size:11px; color:var(--text-subtle); margin-top:2px }

/* -- kartu antrean cetak / batch vendor (master 1280-1308 · 1318-1340) -- */
.wsp .wsp-ppcard{
  background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--wsp-r14);
  box-shadow:var(--shadow-card); padding:15px 18px; display:flex; flex-direction:column; gap:12px;
}
.wsp .wsp-ppcard__head{ display:flex; align-items:center; gap:9px; flex-wrap:wrap }
.wsp .wsp-ppcard__meta{ font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle) }
.wsp .wsp-ppcard__body{ display:flex; align-items:flex-start; gap:14px; flex-wrap:wrap }
.wsp .wsp-ppcard__main{ flex:1; min-width:200px }
.wsp .wsp-ppcard__title{ font-size:14px; font-weight:700; color:var(--text-strong) }
.wsp .wsp-ppcard__qty{ font-family:var(--font-mono); font-size:11.5px; font-weight:500; color:var(--text-muted) }
.wsp .wsp-ppcard__spec{ font-size:12px; color:var(--text-subtle); margin-top:3px }
.wsp .wsp-ppcard__line{ font-size:11.5px; color:var(--text-muted); margin-top:5px }
.wsp .wsp-ppcard__steps{ display:flex; align-items:center; gap:5px; flex-wrap:wrap }
.wsp .wsp-ppcard__foot{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  padding-top:11px; border-top:1px solid var(--line-100);
}
.wsp .wsp-ppcard__note{ flex:1; min-width:120px; font-size:11.5px; color:var(--text-subtle) }
.wsp .wsp-ppresi{ display:inline-flex; align-items:center; gap:6px; font-family:var(--font-mono); font-size:10.5px; color:var(--text-muted) }
.wsp .wsp-ppprog{ display:flex; align-items:center; gap:10px }
.wsp .wsp-ppprog__pct{ font-family:var(--font-mono); font-size:12px; font-weight:700; color:var(--text-strong) }

/* chip tahap cetak — 3 state master 1295 */
.wsp .wsp-ppstepchip{
  height:26px; padding:0 10px; border-radius:var(--wsp-rp); cursor:pointer;
  font-family:var(--font-body); font-size:10.5px; white-space:nowrap;
  background:var(--surface-0); color:var(--text-subtle);
  border:1px dashed var(--line-200); font-weight:500;
}
.wsp .wsp-ppstepchip.is-done{ background:var(--ink-050); color:var(--text-body); border:1px solid var(--line-200); font-weight:600 }
.wsp .wsp-ppstepchip.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); border:1px solid var(--wsp-ink); font-weight:700 }
.wsp .wsp-ppstepchip:disabled{ cursor:not-allowed; opacity:.55 }

/* tombol pill footer kartu (master 1304-1306) */
.wsp .wsp-ppbtn{
  display:inline-flex; align-items:center; gap:6px; height:30px; padding:0 12px;
  border-radius:var(--wsp-rp); border:1px solid var(--border-input); background:var(--surface-0);
  font-family:var(--font-body); font-size:11.5px; font-weight:600; color:var(--text-muted);
  cursor:pointer; white-space:nowrap;
}
.wsp .wsp-ppbtn:hover:not(:disabled){ background:var(--surface-1); color:var(--text-strong) }
.wsp .wsp-ppbtn:disabled{ opacity:.5; cursor:not-allowed }
.wsp .wsp-ppbtn--ink{
  padding:0 13px; border:0; background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700;
}
.wsp .wsp-ppbtn--ink:hover:not(:disabled){ background:var(--wsp-ink-hover); color:var(--wsp-on-ink) }
.wsp .wsp-ppbtn--tone{
  border-color:var(--wsp-tone-border); background:var(--wsp-tone-bg); color:var(--wsp-tone-text);
}
.wsp .wsp-ppbtn--tone:hover:not(:disabled){ filter:brightness(.97); background:var(--wsp-tone-bg); color:var(--wsp-tone-text) }
.wsp .wsp-ppbtn--strong{ color:var(--text-strong) }

/* -- grid vendor + aside (master 1315 · 1343-1358) -- */
.wsp .wsp-ppvgrid{ display:grid; grid-template-columns:minmax(0,1fr) 288px; gap:14px; align-items:start }
.wsp .wsp-ppvcol{ display:flex; flex-direction:column; gap:12px; min-width:0 }
.wsp .wsp-ppaside{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
.wsp .wsp-ppaside__head{
  padding:14px 16px 10px; font-family:var(--font-mono); font-size:10px;
  letter-spacing:.14em; text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-ppaside__row{ padding:12px 16px; border-top:1px solid var(--line-100) }
.wsp .wsp-ppaside__top{ display:flex; align-items:center; gap:8px }
.wsp .wsp-ppaside__name{ font-size:12.5px; font-weight:700; color:var(--text-strong); flex:1; min-width:0 }
.wsp .wsp-ppaside__meta{ font-size:11px; color:var(--text-subtle); margin-top:4px }
.wsp .wsp-ppaside__foot{ display:flex; align-items:center; gap:8px; margin-top:7px }
.wsp .wsp-ppaside__contact{ font-family:var(--font-mono); font-size:10.5px; color:var(--text-muted); flex:1; min-width:0 }
.wsp .wsp-ppaside__empty{ padding:12px 16px 16px; border-top:1px solid var(--line-100); font-size:11.5px; color:var(--text-subtle); line-height:1.5 }

/* -- grid semua batch + step tracker (master 1363-1394) -- */
.wsp .wsp-ppgrid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(330px,1fr)); gap:14px }
.wsp .wsp-ppbcard{
  background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--wsp-r14);
  box-shadow:var(--shadow-card); padding:16px 18px; display:flex; flex-direction:column; gap:12px;
}
.wsp .wsp-ppbcard__head{ display:flex; align-items:center; gap:8px }
.wsp .wsp-ppbcard__title{ font-size:14px; font-weight:700; color:var(--text-strong) }
.wsp .wsp-ppbcard__sub{ font-size:12px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-ppbcard__foot{ display:flex; align-items:center; gap:8px; padding-top:10px; border-top:1px solid var(--line-100) }
.wsp .wsp-pptrk{ display:flex; align-items:center; gap:4px }
.wsp .wsp-pptrk__i{ flex:1; display:flex; flex-direction:column; align-items:center; gap:4px; min-width:0 }
.wsp .wsp-pptrk__dot{ width:10px; height:10px; border-radius:var(--wsp-rp); background:var(--ink-100); flex:0 0 auto }
.wsp .wsp-pptrk__i.is-done .wsp-pptrk__dot{ background:var(--wsp-ink) }
.wsp .wsp-pptrk__i.is-on .wsp-pptrk__dot{ background:var(--vs-yellow); border:2px solid var(--wsp-ink) }
.wsp .wsp-pptrk__lbl{
  font-family:var(--font-mono); font-size:8.5px; letter-spacing:.06em; text-transform:uppercase;
  color:var(--text-subtle); text-align:center;
}
.wsp .wsp-pptrk__i.is-on .wsp-pptrk__lbl{ color:var(--text-strong); font-weight:700 }

/* ------------------------------------------------------------------ */
/* DRAWER DETAIL BATCH (master 2720-2763)                              */
/* ------------------------------------------------------------------ */
/* Panel mandiri di document.body (gotcha #1: TIDAK lewat adminModal). */
.wsp-drawer-back{
  position:fixed; inset:0; background:var(--wsp-scrim);
  backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px);
  z-index:50; animation:wsp-fade .15s ease;
}
.wsp-drawer{
  position:fixed; top:0; right:0; bottom:0; width:min(400px,94vw);
  background:var(--surface-0); border-left:1px solid var(--line-200);
  box-shadow:var(--shadow-pop); z-index:51; display:flex; flex-direction:column;
  animation:wsp-slide .18s ease; overflow-y:auto;
}
@keyframes wsp-slide{ from{ transform:translateX(100%) } to{ transform:none } }
.wsp-drawer__head{
  display:flex; align-items:center; gap:10px; padding:16px 20px;
  border-bottom:1px solid var(--line-100); flex:0 0 auto;
}
.wsp-drawer__code{ font-family:var(--font-mono); font-size:12px; font-weight:700; color:var(--text-strong) }
.wsp-drawer__spacer{ flex:1 }
.wsp-drawer__x{
  width:30px; height:30px; display:grid; place-items:center; border-radius:var(--wsp-r8);
  border:0; background:transparent; color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-drawer__x:hover{ background:var(--surface-1); color:var(--text-strong) }
.wsp-drawer__body{ padding:18px 20px; display:flex; flex-direction:column; gap:16px }
.wsp-drawer__title{ font-family:var(--font-display); font-size:16px; font-weight:700; color:var(--text-strong) }
.wsp-drawer__sub{ font-size:12px; color:var(--text-subtle); margin-top:3px }
.wsp-drawer__line{ font-size:12px; color:var(--text-muted); margin-top:2px }
.wsp-drawer__prohead{ display:flex; justify-content:space-between; align-items:baseline; gap:10px }
.wsp-drawer__probig{ font-family:var(--font-mono); font-size:16px; font-weight:700; color:var(--text-strong) }
.wsp-drawer__protrack{ height:7px; border-radius:var(--wsp-rp); background:var(--ink-050); overflow:hidden; margin-top:7px }
.wsp-drawer__probar{ display:block; height:100%; border-radius:var(--wsp-rp); background:var(--wsp-ink) }
.wsp-drawer__probar.is-done{ background:var(--pst-success-text) }
.wsp-drawer__acts{ display:flex; gap:7px; margin-top:12px }
.wsp-drawer__btn{
  flex:1; height:36px; border-radius:var(--wsp-r10); border:0;
  background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:12.5px; font-weight:600; cursor:pointer;
}
.wsp-drawer__btn:hover:not(:disabled){ background:var(--wsp-ink-hover) }
.wsp-drawer__btn:disabled{ opacity:.5; cursor:not-allowed }
.wsp-drawer__btn--ghost{ border:1px solid var(--border-input); background:var(--surface-0); color:var(--text-strong) }
.wsp-drawer__btn--ghost:hover:not(:disabled){ background:var(--surface-1) }
.wsp-drawer__hint{ font-size:11px; color:var(--text-subtle); margin-top:8px; line-height:1.5 }
.wsp-drawer__kick{
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp-drawer__steps{ display:flex; flex-direction:column; gap:2px; margin-top:8px }
.wsp-drawer__step{
  display:flex; align-items:center; gap:10px; padding:8px 10px;
  border-radius:var(--wsp-r9); background:transparent;
}
.wsp-drawer__step.is-on{ background:var(--pst-identity-bg) }
.wsp-drawer__sdot{ width:10px; height:10px; border-radius:var(--wsp-rp); background:var(--ink-100); flex:0 0 auto }
.wsp-drawer__step.is-done .wsp-drawer__sdot{ background:var(--wsp-ink) }
.wsp-drawer__step.is-on .wsp-drawer__sdot{ background:var(--vs-yellow); border:2px solid var(--wsp-ink) }
.wsp-drawer__slbl{ font-size:12.5px; color:var(--text-subtle) }
.wsp-drawer__step.is-done .wsp-drawer__slbl{ font-weight:600; color:var(--text-body) }
.wsp-drawer__step.is-on .wsp-drawer__slbl{ font-weight:700; color:var(--text-strong) }
.wsp-drawer__smeta{ font-family:var(--font-mono); font-size:10px; color:var(--text-subtle); margin-left:auto }
.wsp-drawer__callout{
  display:flex; align-items:flex-start; gap:8px; padding:11px 13px;
  border-radius:var(--wsp-r10); background:var(--pst-identity-bg); border:1px solid var(--vs-yellow-shadow);
  font-size:11.5px; color:var(--pst-identity-text); line-height:1.5;
}
.wsp-drawer__callout svg{ flex:0 0 auto; margin-top:1px }
.wsp-drawer__memo{ font-size:12px; color:var(--text-muted); line-height:1.55 }
.wsp-drawer__memo b{ color:var(--text-strong) }

@media (max-width:1180px){
  .wsp .wsp-ppvgrid{ grid-template-columns:minmax(0,1fr) }
}
@media (prefers-reduced-motion: reduce){
  .wsp-pp, .wsp-drawer, .wsp-drawer-back{ animation:none !important }
}

/* == :END == WORKSPACE-POSTPRO ======================================= */

/* == WORKSPACE-EOFFICE (F4 — reproduksi Workspace.dc.html 455-719) ==== */
/* + drawer detail karyawan 2654-2717 · dialog Ajukan cuti 2049-2075.
   Binding style diresolusi dari script master eofficeVals() 4251-4353. */

.wsp-eo{ display:flex; flex-direction:column; gap:16px; animation:wsp-fade .2s ease }

/* -- bar sub-tab (master 458-469) -- */
.wsp .wsp-eo__bar{ display:flex; align-items:center; gap:10px; flex-wrap:wrap }
.wsp .wsp-eo__tabs{
  display:flex; gap:4px; padding:4px; background:var(--surface-0);
  border:1px solid var(--line-200); border-radius:var(--wsp-r12); overflow-x:auto; max-width:100%;
}
.wsp .wsp-eotab{
  display:inline-flex; align-items:center; gap:7px; height:32px; padding:0 13px;
  border-radius:var(--wsp-r9); border:0; background:transparent; color:var(--text-muted);
  font-family:var(--font-body); font-size:12.5px; font-weight:500;
  white-space:nowrap; flex:0 0 auto; cursor:pointer; text-decoration:none;
}
.wsp .wsp-eotab.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }
.wsp .wsp-eotab__b{
  font-family:var(--font-mono); font-size:9.5px; font-weight:700; padding:1px 6px;
  border-radius:var(--wsp-rp); background:var(--pst-warning-bg);
  color:var(--pst-warning-text); border:1px solid var(--pst-warning-border);
}
.wsp .wsp-eotab.is-on .wsp-eotab__b{ background:var(--vs-yellow); color:var(--wsp-ink); border-color:var(--vs-yellow) }
.wsp .wsp-eo__gate{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--text-subtle); margin-left:auto;
}

/* -- panel + head (master 473-483 · 577-581 · 620-624 · 644-648) -- */
.wsp .wsp-eop{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
.wsp .wsp-eop__head{
  display:flex; align-items:center; gap:10px; row-gap:8px; padding:15px 20px;
  border-bottom:1px solid var(--line-100); flex-wrap:wrap;
}
.wsp .wsp-eop__head--14{ padding:14px 20px; gap:9px }
.wsp .wsp-eop__title{ font-family:var(--font-display); font-size:15px; font-weight:700; margin:0; color:var(--text-strong) }
.wsp .wsp-eop__title--14{ font-size:14px; flex:1; min-width:0 }
.wsp .wsp-eop__count{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle) }
.wsp .wsp-eop__gate{ font-size:11px; color:var(--text-subtle) }
.wsp .wsp-eop__spacer{ flex:1 }
/* Toolbar head PINDAH SEBAGAI SATU BLOK, tidak pernah pecah di tengah.
   Dengan flex-wrap:wrap di grup ini, sisa ruang baris-1 dipakai untuk membelah
   isinya (tanggal+karyawan+Tambah di baris 1, CSV menggantung sendirian di baris 2)
   sementara judul tetap di kiri — itu yang terlihat berantakan. nowrap memaksa
   seluruh grup turun rapi ke baris berikutnya dan rata kanan. */
.wsp .wsp-eop__tools{ display:flex; gap:6px; flex-wrap:nowrap; align-items:center;
  margin-left:auto; max-width:100% }
.wsp .wsp-eop__count{ min-width:0 }
@media (max-width:720px){
  /* Di layar sempit grup toolbar memang harus boleh melipat, kalau tidak ia meluber. */
  .wsp .wsp-eop__tools{ flex-wrap:wrap; margin-left:0; flex:1 1 100% }
  .wsp .wsp-eop__tools .ctrl{ flex:1 1 140px }
}
.wsp .wsp-eop__empty{ padding:22px 20px; text-align:center; font-size:12.5px; color:var(--text-subtle) }

/* chip filter divisi (master 480) */
.wsp .wsp-eochip{
  height:28px; padding:0 12px; border-radius:var(--wsp-rp); cursor:pointer;
  font-family:var(--font-body); font-size:11.5px; font-weight:500; white-space:nowrap;
  background:var(--surface-0); color:var(--text-muted); border:1px solid var(--line-200);
}
.wsp .wsp-eochip.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); border-color:var(--wsp-ink); font-weight:600 }

/* tombol pill head (master 580 · 647) */
.wsp .wsp-eobtn{
  display:inline-flex; align-items:center; gap:6px; height:34px; padding:0 15px;
  border-radius:var(--wsp-rp); border:1px solid var(--border-input); background:var(--surface-0);
  font-family:var(--font-body); font-size:12.5px; font-weight:600; color:var(--text-strong);
  cursor:pointer; white-space:nowrap;
}
.wsp .wsp-eobtn:hover:not(:disabled){ background:var(--surface-1) }
.wsp .wsp-eobtn:disabled{ opacity:.5; cursor:not-allowed }
.wsp .wsp-eobtn--ink{ border:0; background:var(--wsp-ink); color:var(--wsp-on-ink) }
.wsp .wsp-eobtn--ink:hover:not(:disabled){ background:var(--wsp-ink-hover) }
/* tombol keputusan baris (master 563-564 · 592-593 · 634) */
.wsp .wsp-eoact{
  height:30px; padding:0 14px; border-radius:var(--wsp-r8); border:0;
  background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:12px; font-weight:600; cursor:pointer; white-space:nowrap;
}
.wsp .wsp-eoact:hover{ background:var(--wsp-ink-hover) }
.wsp .wsp-eoact--ghost{ border:1px solid var(--border-input); background:var(--surface-0); color:var(--text-muted) }
.wsp .wsp-eoact--ghost:hover{ background:var(--surface-1); color:var(--text-muted) }
.wsp .wsp-eoact--29{ height:29px; padding:0 13px; font-size:11.5px }

/* -- tabel grid (master 486-510 · 528-543) -- */
.wsp .wsp-eoscroll{ overflow-x:auto }
.wsp .wsp-eotable--emp{ min-width:860px }
.wsp .wsp-eotable--att{ min-width:820px }
.wsp .wsp-eorow{
  display:grid; gap:12px; padding:11px 20px;
  border-bottom:1px solid var(--line-100); align-items:center;
}
.wsp .wsp-eorow--head{
  padding:9px 20px; background:var(--surface-1);
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-eotable--emp .wsp-eorow{ grid-template-columns:2.2fr 1.6fr 1fr 1fr 1.7fr .9fr }
.wsp .wsp-eotable--att .wsp-eorow{ grid-template-columns:2fr 1.6fr .8fr .8fr 1.1fr 1.6fr }
.wsp .wsp-eotable > :last-child{ border-bottom:0 }
.wsp .wsp-eorow:not(.wsp-eorow--head):hover{ background:var(--surface-1) }
.wsp .wsp-eoid{ display:flex; align-items:center; gap:10px; min-width:0 }
.wsp .wsp-eoava{
  width:30px; height:30px; border-radius:var(--wsp-rp); background:var(--ink-100); color:var(--ink-600);
  display:grid; place-items:center; font-family:var(--font-mono); font-size:10px; font-weight:700; flex:0 0 auto;
}
.wsp .wsp-eoava--28{ width:28px; height:28px }
.wsp .wsp-eoname{
  display:block; font-size:13px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-eosub{ display:block; font-size:11px; color:var(--text-subtle) }
.wsp .wsp-eocell{ font-size:12.5px; color:var(--text-body); min-width:0 }
.wsp .wsp-eocell--muted{ color:var(--text-muted) }
.wsp .wsp-eocell--mono{ font-family:var(--font-mono); font-size:12.5px }
.wsp .wsp-eocell--right{ text-align:right }
.wsp .wsp-eocell--note{ font-size:11.5px; color:var(--text-subtle) }
.wsp .wsp-eoroles{ display:flex; gap:4px; flex-wrap:wrap }
/* chip role pekerjaan (master 503) */
.wsp .wsp-eorole{
  font-size:10.5px; font-weight:500; padding:2px 8px; border-radius:var(--wsp-rp);
  background:var(--surface-1); border:1px solid var(--line-200); color:var(--text-muted); white-space:nowrap;
}
.wsp .wsp-eodetail{
  padding:5px 12px; border-radius:var(--wsp-rp); border:1px solid var(--border-input);
  background:var(--surface-0); font-family:var(--font-body); font-size:11.5px; font-weight:600;
  color:var(--text-strong); cursor:pointer;
}
.wsp .wsp-eodetail:hover{ background:var(--surface-1) }

/* -- ringkas presensi (master 518-524) -- */
.wsp .wsp-eosum{ display:flex; gap:8px; flex-wrap:wrap; align-items:center }
.wsp .wsp-eosum__note{ display:inline-flex; align-items:center; gap:6px; font-size:11.5px; color:var(--text-subtle); margin-left:auto }

/* -- baris koreksi (master 554-569) -- */
.wsp .wsp-eocorr{
  display:flex; align-items:center; gap:12px; padding:12px 20px;
  border-bottom:1px solid var(--line-100); flex-wrap:wrap;
}
.wsp .wsp-eocorr__body{ flex:1; min-width:200px }
.wsp .wsp-eocorr__ask{ display:block; font-size:13px; font-weight:600; color:var(--text-strong) }
.wsp .wsp-eocorr__meta{ display:block; font-size:11.5px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-eocorr__acts{ display:flex; gap:6px }

/* -- cuti (master 576-615) -- */
.wsp .wsp-eogrid{ display:grid; grid-template-columns:minmax(0,1fr) 300px; gap:16px; align-items:start }
.wsp .wsp-eolv{ padding:13px 20px; border-bottom:1px solid var(--line-100) }
.wsp .wsp-eolv__top{ display:flex; align-items:center; gap:10px; flex-wrap:wrap }
.wsp .wsp-eolv__emp{ font-size:13px; font-weight:600; color:var(--text-strong) }
.wsp .wsp-eolv__range{ font-family:var(--font-mono); font-size:11.5px; color:var(--text-muted) }
.wsp .wsp-eolv__reason{ font-size:12px; color:var(--text-subtle); margin-top:6px; padding-left:38px }
.wsp .wsp-eopol{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); padding:16px 18px;
}
.wsp .wsp-eopol__head{
  display:flex; align-items:center; gap:8px; font-family:var(--font-mono); font-size:10px;
  letter-spacing:.14em; text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-eopol__row{ display:flex; justify-content:space-between; gap:10px; padding:10px 0; border-bottom:1px solid var(--line-100) }
.wsp .wsp-eopol__k{ font-size:12.5px; font-weight:600; color:var(--text-strong) }
.wsp .wsp-eopol__v{ text-align:right }
.wsp .wsp-eopol__v b{ display:block; font-size:12px; color:var(--text-body); font-weight:400 }
.wsp .wsp-eopol__v small{ display:block; font-size:11px; color:var(--text-subtle) }
.wsp .wsp-eopol__foot{ font-size:11.5px; color:var(--text-subtle); margin-top:10px; line-height:1.5 }

/* -- kompensasi (master 626-637) -- */
.wsp .wsp-eocomp{
  display:flex; align-items:center; gap:12px; padding:13px 20px;
  border-bottom:1px solid var(--line-100); flex-wrap:wrap;
}
.wsp .wsp-eocomp__body{ flex:1; min-width:220px }
.wsp .wsp-eocomp__t{ display:block; font-size:13px; font-weight:600; color:var(--text-strong) }
.wsp .wsp-eocomp__d{ display:block; font-size:11.5px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-eocomp__amt{ font-family:var(--font-mono); font-size:13px; font-weight:700; color:var(--text-strong) }

/* -- dokumen (master 650-658) -- */
.wsp .wsp-eodoc{ display:flex; align-items:center; gap:12px; padding:12px 20px; border-bottom:1px solid var(--line-100) }
.wsp .wsp-eodoc:hover{ background:var(--surface-1) }
.wsp .wsp-eodoc__ic{
  width:34px; height:34px; border-radius:var(--wsp-r9); background:var(--surface-1);
  border:1px solid var(--line-200); display:grid; place-items:center; color:var(--text-muted); flex:0 0 auto;
}
.wsp .wsp-eodoc__body{ flex:1; min-width:0 }
.wsp .wsp-eodoc__n{
  display:block; font-size:13px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-eodoc__m{ display:block; font-size:11px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-eodoc__dl{
  width:32px; height:32px; display:grid; place-items:center; border-radius:var(--wsp-r8);
  border:1px solid var(--border-input); background:var(--surface-0); color:var(--text-muted);
  cursor:pointer; flex:0 0 auto; text-decoration:none;
}
.wsp .wsp-eodoc__dl:hover{ background:var(--surface-1) }

/* -- pusat kendali (master 664-714) -- */
.wsp .wsp-eolock{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); padding:40px; text-align:center;
}
.wsp .wsp-eolock__ic{ color:var(--text-disabled); display:inline-flex }
.wsp .wsp-eolock__t{ font-family:var(--font-display); font-size:16px; font-weight:700; color:var(--text-strong); margin-top:10px }
.wsp .wsp-eolock__d{ font-size:13px; color:var(--text-muted); margin-top:6px; line-height:1.55 }
.wsp .wsp-eokgrid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(300px,1fr)); gap:16px }
.wsp .wsp-eok{
  background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--wsp-r14);
  box-shadow:var(--shadow-card); padding:18px 20px;
}
.wsp .wsp-eok__head{ display:flex; align-items:center; gap:8px; margin-bottom:12px }
.wsp .wsp-eok__t{ font-family:var(--font-display); font-size:14px; font-weight:700; margin:0; flex:1; min-width:0; color:var(--text-strong) }
.wsp .wsp-eok__chips{ display:flex; gap:6px; flex-wrap:wrap }
.wsp .wsp-eok__chip{
  display:inline-flex; align-items:center; gap:5px; padding:4px 11px; border-radius:var(--wsp-rp);
  font-size:11.5px; font-weight:600; background:var(--surface-1);
  border:1px solid var(--line-200); color:var(--text-body);
}
.wsp .wsp-eok__note{ font-size:11.5px; color:var(--text-subtle); margin-top:12px; line-height:1.5 }
.wsp .wsp-eok__row{ display:flex; align-items:center; gap:10px; padding:9px 0; border-bottom:1px solid var(--line-100) }
.wsp .wsp-eok__code{
  width:26px; height:26px; border-radius:var(--wsp-r8); background:var(--wsp-ink); color:var(--vs-yellow);
  display:grid; place-items:center; font-family:var(--font-mono); font-size:11px; font-weight:700; flex:0 0 auto;
}
.wsp .wsp-eok__lbl{ flex:1; min-width:0; font-size:13px; font-weight:600; color:var(--text-strong) }
.wsp .wsp-eok__time{ font-family:var(--font-mono); font-size:12px; color:var(--text-muted) }
.wsp .wsp-eok__map{
  border:1px dashed var(--line-200); border-radius:var(--wsp-r10); height:90px;
  display:grid; place-items:center; background:var(--surface-1); color:var(--text-disabled);
  font-size:11px; font-family:var(--font-mono); letter-spacing:.1em; text-transform:uppercase; text-align:center; padding:0 12px;
}
.wsp .wsp-eok__name{ font-size:12.5px; color:var(--text-body); margin-top:10px; font-weight:600 }
.wsp .wsp-eok__addr{ font-size:11.5px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-eok__switch{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  margin-top:12px; padding-top:12px; border-top:1px solid var(--line-100);
  font-size:12.5px; color:var(--text-body);
}
.wsp .wsp-eok__crit{ display:flex; align-items:center; gap:9px; padding:8px 0; border-bottom:1px solid var(--line-100) }
.wsp .wsp-eok__crit svg{ color:var(--pst-success-text); flex:0 0 auto }
.wsp .wsp-eok__crit span{ font-size:12.5px; color:var(--text-body) }

/* ------------------------------------------------------------------ */
/* DRAWER DETAIL KARYAWAN (master 2655-2716)                           */
/* ------------------------------------------------------------------ */
.wsp-drawer__hero{ padding:22px 24px; background:var(--bg-ink); color:var(--wsp-on-ink); position:relative; flex:0 0 auto }
.wsp-drawer__hx{
  position:absolute; top:14px; right:14px; width:30px; height:30px; display:grid; place-items:center;
  border-radius:var(--wsp-r8); border:0; background:var(--wsp-on-ink-fill-10); color:var(--wsp-on-ink); cursor:pointer;
}
.wsp-drawer__hx:hover{ background:var(--wsp-on-ink-fill) }
.wsp-drawer__hava{
  width:52px; height:52px; border-radius:var(--wsp-rp); background:var(--vs-yellow); color:var(--wsp-ink);
  display:grid; place-items:center; font-family:var(--font-mono); font-size:16px; font-weight:700;
}
.wsp-drawer__hname{ font-family:var(--font-display); font-size:18px; font-weight:800; margin-top:12px }
.wsp-drawer__hrole{ font-size:12.5px; color:var(--wsp-on-ink-64); margin-top:2px }
.wsp-drawer__htags{ display:flex; gap:6px; margin-top:10px; flex-wrap:wrap }
.wsp-drawer__htag{
  display:inline-flex; align-items:center; gap:5px; padding:2.5px 9px; border-radius:var(--wsp-rp);
  font-size:10.5px; font-weight:600; background:var(--wsp-on-ink-fill-10);
  border:1px solid var(--wsp-on-ink-fill); color:var(--wsp-on-ink-75);
}
.wsp-drawer__body--24{ padding:18px 24px }
.wsp-drawer__ident{ display:flex; flex-direction:column; gap:7px; margin-top:8px }
.wsp-drawer__irow{
  display:flex; justify-content:space-between; gap:10px; padding:9px 12px;
  border-radius:var(--wsp-r9); background:var(--surface-1); border:1px solid var(--line-100);
}
.wsp-drawer__ik{ font-size:12px; color:var(--text-subtle) }
.wsp-drawer__iv{ font-size:12px; font-weight:700; color:var(--text-strong); text-align:right }
.wsp-drawer__ibox{ padding:9px 12px; border-radius:var(--wsp-r9); background:var(--surface-1); border:1px solid var(--line-100) }
.wsp-drawer__iroles{ display:flex; gap:5px; flex-wrap:wrap; margin-top:6px }
.wsp-drawer__irole{
  font-size:10.5px; font-weight:600; padding:2px 9px; border-radius:var(--wsp-rp);
  background:var(--surface-0); border:1px solid var(--line-200); color:var(--text-muted);
}
.wsp-drawer__contact{ display:flex; align-items:center; gap:9px; font-size:12.5px; color:var(--text-body); margin-top:8px }
.wsp-drawer__contact svg{ color:var(--text-subtle); flex:0 0 auto }
.wsp-drawer__hist{ display:flex; flex-direction:column; margin-top:8px }
.wsp-drawer__hrow{ display:flex; gap:12px; padding:8px 0 }
.wsp-drawer__hline{ display:flex; flex-direction:column; align-items:center; flex:0 0 auto }
.wsp-drawer__hdot{ width:9px; height:9px; border-radius:var(--wsp-rp); background:var(--wsp-ink); margin-top:4px }
.wsp-drawer__hbar{ width:1px; flex:1; background:var(--line-200) }
.wsp-drawer__hd{ display:block; font-family:var(--font-mono); font-size:10.5px; color:var(--text-subtle) }
.wsp-drawer__he{ display:block; font-size:12.5px; color:var(--text-body); margin-top:2px }
.wsp-drawer__edit{
  height:38px; border-radius:var(--wsp-r10); border:0; background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:13px; font-weight:600; cursor:pointer;
}
.wsp-drawer__edit:hover{ background:var(--wsp-ink-hover) }
.wsp-drawer__locked{
  display:flex; align-items:center; gap:8px; padding:10px 13px; border-radius:var(--wsp-r10);
  background:var(--surface-1); border:1px solid var(--line-200); color:var(--text-subtle); font-size:11.5px;
}

/* ------------------------------------------------------------------ */
/* DIALOG AJUKAN CUTI (master 2050-2074) — lewat adminModal              */
/* ------------------------------------------------------------------ */
.modal-center.wsp-modal--440{ width:min(440px,92vw); max-width:440px }
.modal-center.workspace-layer.ws-command-window.wsp-modal--440{ width:min(440px,92vw); max-width:440px }
/* garis kuning 3px di tepi atas dialog (master 2053) */
.wsp-dlgtop{ height:3px; background:var(--vs-yellow); margin:-1px -1px 0 }
.wsp-dlghead{ padding:20px 24px 0 }
.wsp-dlghead h3{ font-family:var(--font-display); font-size:17px; font-weight:700; margin:0; color:var(--text-strong) }
.wsp-dlghead p{ font-size:12px; color:var(--text-subtle); margin:3px 0 0 }
.wsp-dlgbody{ padding:18px 24px; display:flex; flex-direction:column; gap:13px }
.wsp-dlgfield > span{ display:block; font-size:12.5px; font-weight:600; color:var(--text-strong); margin-bottom:6px }
.wsp-dlggrid2{ display:grid; grid-template-columns:1fr 1fr; gap:12px }
.wsp-dlgnote{
  display:flex; align-items:flex-start; gap:8px; padding:10px 13px; border-radius:var(--wsp-r10);
  background:var(--pst-warning-bg); border:1px solid var(--pst-warning-border);
  color:var(--pst-warning-text); font-size:11.5px; line-height:1.5;
}
.wsp-dlgnote svg{ flex:0 0 auto; margin-top:1px }
.wsp-dlgfoot{
  display:flex; justify-content:flex-end; gap:8px; padding:16px 24px; border-top:1px solid var(--line-100);
}
.wsp-dlgbtn{
  height:38px; padding:0 16px; border-radius:var(--wsp-r10); border:1px solid var(--border-input);
  background:var(--surface-0); font-family:var(--font-body); font-size:13px; font-weight:600;
  color:var(--text-muted); cursor:pointer;
}
.wsp-dlgbtn:hover{ background:var(--surface-1) }
.wsp-dlgbtn--ink{ padding:0 20px; border:0; background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }
.wsp-dlgbtn--ink:hover{ background:var(--wsp-ink-hover) }

@media (max-width:1180px){
  .wsp .wsp-eogrid{ grid-template-columns:minmax(0,1fr) }
}
@media (prefers-reduced-motion: reduce){
  .wsp-eo{ animation:none !important }
}

/* == :END == WORKSPACE-EOFFICE ======================================= */

/* == WORKSPACE-FORUM (F5 — reproduksi Workspace.dc.html 1400-1688) ===== */
/* Binding style diresolusi dari forumVals() (script master 5240-5385),
   tag() 3012-3014, toolset() 3409-3424. Spec: docs/workspace-prototype/spec_F5_forum.md
   Scope .wsp; prefix .wsp-fo*. Primitif bersama (.wsp-tag/.wsp-pill/.wsp-badge/
   .wsp-ava/.wsp-editor/.wsp-rich/.wsp-pick__row/.wsp-callout/.wsp-search/--wsp-*)
   dari blok WORKSPACE-PM. NOL hex/rgba mentah. */

/* ---- 3.1 struktur & rail (master 1402-1419) ---- */
.wsp-fo{ animation:wsp-fade .2s ease }
.wsp .wsp-fo__grid{ display:grid; grid-template-columns:236px minmax(0,1fr); gap:16px; align-items:start }
.wsp .wsp-fo__rail{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
/* master 1405 kicker; tombol (+) = deviasi D1 (aksi app nyata ws_forum_category_save) */
.wsp .wsp-fo__railhead{
  display:flex; align-items:center; gap:8px; padding:14px 16px 10px;
  font-family:var(--font-mono); font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-fo__railhead > span{ flex:1; min-width:0 }
.wsp .wsp-fo__chans{ display:flex; flex-direction:column; padding:0 8px 12px; gap:2px }
.wsp .wsp-fo__chan{
  display:flex; align-items:center; gap:9px; padding:9px 10px;
  border-radius:var(--wsp-r9); border:0; cursor:pointer; width:100%;
  font-family:var(--font-body); background:transparent; color:var(--text-body);
}
.wsp .wsp-fo__chan.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink) }
.wsp .wsp-fo__chanid{ flex:1; min-width:0; text-align:left }
.wsp .wsp-fo__channame{
  display:block; font-size:13px; font-weight:600;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-fo__chansub{ display:block; font-size:10px; margin-top:1px; color:var(--text-subtle) }
.wsp .wsp-fo__chan.is-on .wsp-fo__chansub{ color:var(--wsp-on-ink-55) }
.wsp .wsp-fo__chanct{
  font-family:var(--font-mono); font-size:10px; font-weight:700; padding:1px 7px;
  border-radius:var(--wsp-rp); background:var(--ink-050); color:var(--text-muted); flex:0 0 auto;
}
.wsp .wsp-fo__chan.is-on .wsp-fo__chanct{ background:var(--vs-yellow); color:var(--wsp-ink) }
.wsp .wsp-fo__main{ min-width:0; display:flex; flex-direction:column; gap:12px }
.wsp .wsp-fo__card{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}

/* ---- 3.2 header kanal + tab (master 1421-1435) ---- */
.wsp .wsp-fo__head{ display:flex; align-items:center; gap:10px; padding:15px 20px 11px }
.wsp .wsp-fo__headid{ flex:1; min-width:0 }
.wsp .wsp-fo__title{
  font-family:var(--font-display); font-size:15px; font-weight:700; margin:0; color:var(--text-strong);
}
.wsp .wsp-fo__desc{ font-size:11.5px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-fo__members{
  display:inline-flex; align-items:center; gap:6px; font-family:var(--font-mono);
  font-size:10.5px; color:var(--text-subtle); flex:0 0 auto;
}
.wsp .wsp-fo__members i, .wsp .wsp-fo__members svg{ flex:0 0 auto; display:inline-flex }
.wsp .wsp-fo__tabs{ display:flex; align-items:center; gap:3px; padding:0 14px; border-top:1px solid var(--line-100) }
.wsp .wsp-fo__tab{
  display:inline-flex; align-items:center; gap:7px; height:40px; padding:0 13px;
  border:0; background:transparent; cursor:pointer; font-family:var(--font-body);
  font-size:12.5px; color:var(--text-muted); font-weight:500; white-space:nowrap;
}
.wsp .wsp-fo__tab.is-on{ color:var(--text-strong); font-weight:700; box-shadow:inset 0 -2px 0 var(--wsp-ink) }
.wsp .wsp-fo__tab i, .wsp .wsp-fo__tab svg{ flex:0 0 auto; display:inline-flex }

/* ---- 3.3 panel File / Tugas (master 1437-1516) ---- */
.wsp .wsp-fo__phead{
  display:flex; align-items:center; gap:10px; padding:14px 20px; border-bottom:1px solid var(--line-100);
}
.wsp .wsp-fo__pkicker{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle); flex:1; min-width:0;
}
.wsp .wsp-fo__phint{ font-size:11.5px; color:var(--text-subtle); flex:0 0 auto }
.wsp .wsp-fo__bar{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:12px 20px;
  border-bottom:1px solid var(--line-100); background:var(--surface-1);
}
.wsp .wsp-fo__inp{
  flex:1; min-width:180px; height:34px; padding:0 12px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r9);
  font-family:var(--font-body); font-size:12.5px; color:var(--text-strong);
  outline:none; background:var(--surface-0);
}
.wsp .wsp-fo__sel{
  height:34px; padding:0 8px; border:1px solid var(--border-input);
  border-radius:var(--wsp-r9); background:var(--surface-0);
  font-family:var(--font-body); font-size:11.5px; color:var(--text-body);
}
.wsp .wsp-fo__sel--mono{ font-family:var(--font-mono); font-size:11px; color:var(--text-muted) }
.wsp .wsp-fo__sel--140{ max-width:140px }
.wsp .wsp-fo__go{
  display:inline-flex; align-items:center; gap:6px; height:34px; padding:0 14px;
  border-radius:var(--wsp-r9); border:0; background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:12px; font-weight:700; cursor:pointer; white-space:nowrap;
}
.wsp .wsp-fo__go:hover:not(:disabled){ background:var(--wsp-ink-hover) }
.wsp .wsp-fo__go:disabled{ background:var(--ink-050); color:var(--text-disabled); cursor:not-allowed }
.wsp .wsp-fo__row{
  display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  padding:12px 20px; border-bottom:1px solid var(--line-100);
}
.wsp .wsp-fo__fico{
  width:34px; height:34px; border-radius:var(--wsp-r9); background:var(--ink-050);
  display:grid; place-items:center; flex:0 0 auto; color:var(--text-muted);
}
.wsp .wsp-fo__rowid{ flex:1; min-width:140px }
.wsp .wsp-fo__rowid--150{ min-width:150px }
.wsp .wsp-fo__rowname{
  display:block; font-size:12.5px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp .wsp-fo__rowmeta{
  display:block; font-family:var(--font-mono); font-size:10px; color:var(--text-subtle); margin-top:2px;
}
.wsp .wsp-fo__rowtitle{ display:block; font-size:12.5px; font-weight:600; color:var(--text-strong); line-height:1.4 }
.wsp .wsp-fo__rowsub{ display:block; font-size:11px; color:var(--text-subtle); margin-top:2px }
.wsp .wsp-fo__selpill{
  height:30px; max-width:150px; padding:0 8px; border:1px solid var(--border-input);
  border-radius:var(--wsp-rp); background:var(--surface-0);
  font-family:var(--font-body); font-size:11px; color:var(--text-muted); flex:0 0 auto;
}
.wsp .wsp-fo__code{ font-family:var(--font-mono); font-size:11px; color:var(--text-subtle); flex:0 0 auto }
.wsp .wsp-fo__moves{ display:flex; gap:4px; flex-wrap:wrap; flex:0 0 auto }
.wsp .wsp-fo__move{ padding:0 9px }
/* master 5344/5346/5352 — font-weight TETAP 600 (beda dari .wsp-pill.is-on yang 700) */
.wsp .wsp-fo__act{ border-color:var(--border-input); font-weight:600 }
.wsp .wsp-fo__act.is-on{
  background:var(--wsp-ink); color:var(--wsp-on-ink); border-color:var(--wsp-ink); font-weight:600;
}
.wsp .wsp-fo__act--strong{ color:var(--text-strong) }
.wsp .wsp-fo__pin.is-on{
  background:var(--vs-yellow); color:var(--wsp-ink); border-color:var(--wsp-ink); font-weight:600;
}
/* WAJIB: :is(...) .wsp-pill.is-on:hover (0,4,0) akan mencuri background jadi ink-hover.
   Master 5352 tidak punya varian hover — pin harus tetap kuning. */
.wsp .wsp-fo__pin.is-on:hover{ background:var(--vs-yellow); color:var(--wsp-ink) }
.wsp .wsp-fo__empty{ padding:24px; text-align:center; font-size:12.5px; color:var(--text-subtle) }
.wsp .wsp-fo__gapwrap{ padding:24px }

/* ---- 3.4 composer thread (master 1518-1585) ---- */
.wsp .wsp-fo__comp{ display:flex; gap:11px; padding:14px 18px; border-bottom:1px solid var(--line-100) }
.wsp .wsp-fo__compbody{ flex:1; min-width:0 }
.wsp .wsp-fo__ntinp{ width:100%; box-sizing:border-box; padding:0 13px }
.wsp .wsp-fo__ed{ border-radius:var(--wsp-r11) }
.wsp .wsp-fo__ed--nt{ margin-top:8px }
/* spesifisitas 0,3,0 supaya menang atas .wsp-editor__tool.is-on (0,2,0) */
.wsp .wsp-fo__mentbtn.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink) }
.wsp .wsp-rich--fnt{ min-height:76px; max-height:220px; padding:11px 13px; line-height:1.6 }
.wsp .wsp-rich--frp{ min-height:62px; max-height:200px; padding:11px 13px; line-height:1.6 }
/* badan post: .wsp-rich dipakai agar ul/ol/blockquote/code hasil markdown ikut bergaya,
   tapi min-height:140px bawaannya WAJIB dinolkan (R4) */
.wsp .wsp-rich--fpost{
  min-height:0; max-height:none; overflow:visible; padding:0; margin-top:4px;
  font-size:13px; line-height:1.55; color:var(--text-body);
}
.wsp .wsp-fo__ment{
  margin-top:8px; padding:10px 11px; border:1px solid var(--line-200);
  border-radius:var(--wsp-r11); background:var(--surface-1);
}
.wsp .wsp-fo__mentk{ display:block; margin-bottom:8px }
.wsp .wsp-fo__mentgrid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(170px,1fr)); gap:6px }
.wsp .wsp-fo__mentopt:hover{ border-color:var(--ink-300) }
.wsp .wsp-fo__mentava{
  width:22px; height:22px; border-radius:var(--wsp-rp); background:var(--ink-100);
  color:var(--ink-600); display:grid; place-items:center;
  font-family:var(--font-mono); font-size:9px; font-weight:700; flex:0 0 auto;
}
.wsp .wsp-fo__chips{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-top:8px }
.wsp .wsp-fo__chip{
  display:inline-flex; align-items:center; gap:7px; height:28px; padding:0 6px 0 11px;
  border-radius:var(--wsp-rp); border:1px solid var(--line-200); background:var(--surface-1);
  font-family:var(--font-mono); font-size:10.5px; color:var(--text-muted);
}
.wsp .wsp-fo__chipx{
  width:20px; height:20px; display:grid; place-items:center; border-radius:var(--wsp-rp);
  border:0; background:transparent; color:var(--text-subtle); cursor:pointer; flex:0 0 auto;
}
.wsp .wsp-fo__chipx:hover{ background:var(--ink-050); color:var(--pst-danger-text) }
.wsp .wsp-fo__acts{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-top:9px }
.wsp .wsp-fo__cancel{
  height:32px; padding:0 12px; border-radius:var(--wsp-r9); border:0; background:transparent;
  font-family:var(--font-body); font-size:12px; font-weight:600; color:var(--text-subtle); cursor:pointer;
}
.wsp .wsp-fo__cancel:hover{ background:var(--surface-1) }
.wsp .wsp-fo__send{ gap:6px }
.wsp .wsp-fo__taskbox{
  display:flex; align-items:center; gap:7px; flex-wrap:wrap; margin-top:8px;
  padding:9px 11px; border:1px dashed var(--line-200);
  border-radius:var(--wsp-r10); background:var(--surface-1);
}
.wsp .wsp-fo__msel{
  height:28px; padding:0 6px; border:1px solid var(--border-input); border-radius:var(--wsp-r8);
  background:var(--surface-0); font-family:var(--font-body); font-size:11.5px; color:var(--text-body);
}
.wsp .wsp-fo__msel--mono{ font-family:var(--font-mono); font-size:10.5px; color:var(--text-muted) }
.wsp .wsp-fo__mdate{
  height:28px; padding:0 7px; border:1px solid var(--border-input); border-radius:var(--wsp-r8);
  font-family:var(--font-mono); font-size:11px; color:var(--text-strong);
  outline:none; background:var(--surface-0);
}
.wsp .wsp-fo__taskhint{ flex:1 0 100%; font-size:11px; color:var(--text-subtle); line-height:1.45 }

/* ---- 3.5 baris thread (master 1586-1607) ---- */
.wsp .wsp-fo__trow{
  display:flex; gap:12px; width:100%; padding:14px 20px; border:0;
  border-bottom:1px solid var(--line-100); background:transparent; cursor:pointer;
  text-align:left; font-family:var(--font-body); align-items:flex-start;
}
.wsp .wsp-fo__trow:hover{ background:var(--surface-1) }
.wsp .wsp-fo__trbody{ flex:1; min-width:0 }
.wsp .wsp-fo__trtop{ display:flex; align-items:center; gap:7px; flex-wrap:wrap }
.wsp .wsp-fo__pinico{ display:inline-flex; flex:0 0 auto; color:var(--pst-identity-text) }
.wsp .wsp-fo__trtitle{ font-size:13.5px; font-weight:600; color:var(--text-strong); line-height:1.4 }
.wsp .wsp-fo__trow.is-unread .wsp-fo__trtitle{ font-weight:700 }
.wsp .wsp-fo__trmeta{ display:block; font-size:11.5px; color:var(--text-subtle); margin-top:3px }
.wsp .wsp-fo__trstats{
  display:inline-flex; align-items:center; gap:9px; font-family:var(--font-mono);
  font-size:11px; color:var(--text-muted); flex:0 0 auto;
}
.wsp .wsp-fo__trstat{ display:inline-flex; align-items:center; gap:4px }
.wsp .wsp-fo__trstat--task{ color:var(--pst-blue-text) }

/* ---- 3.6 thread terbuka + post + composer balasan (master 1610-1683) ---- */
.wsp .wsp-fo__backbar{
  display:flex; align-items:center; gap:10px; padding:14px 20px;
  border-bottom:1px solid var(--line-100); flex-wrap:wrap;
}
.wsp .wsp-fo__back{
  display:inline-flex; align-items:center; gap:5px; border:0; background:transparent;
  font-family:var(--font-body); font-size:12px; font-weight:600; color:var(--text-muted);
  cursor:pointer; padding:0;
}
.wsp .wsp-fo__back:hover{ color:var(--text-strong) }
.wsp .wsp-fo__thead{ padding:18px 22px 6px }
.wsp .wsp-fo__ttitle{
  font-family:var(--font-display); font-size:17px; font-weight:700; margin:0;
  color:var(--text-strong); line-height:1.35;
}
.wsp .wsp-fo__tmeta{ font-size:11.5px; color:var(--text-subtle); margin-top:4px }
.wsp .wsp-fo__links{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-top:10px }
.wsp .wsp-fo__lchip{
  display:inline-flex; align-items:center; gap:6px; height:28px; padding:0 11px;
  border-radius:var(--wsp-rp); border:1px solid var(--wsp-tone-border); background:var(--wsp-tone-bg);
  font-family:var(--font-mono); font-size:10.5px; font-weight:700; color:var(--wsp-tone-text); cursor:pointer;
}
.wsp .wsp-fo__lchip:hover{ filter:brightness(.97) }
.wsp .wsp-fo__lchip--file{
  border-color:var(--line-200); background:var(--surface-1); color:var(--text-muted);
  font-weight:400; cursor:default;
}
.wsp .wsp-fo__lchip--file:hover{ filter:none }
.wsp .wsp-fo__posts{ padding:10px 22px 6px; display:flex; flex-direction:column }
.wsp .wsp-fo__post{ display:flex; gap:12px; padding:13px 0; border-bottom:1px solid var(--line-100) }
/* 42px = avatar 30px + gap 12px milik master 1631-1632 (deviasi D5, bukan angka karangan) */
.wsp .wsp-fo__post--child{ padding-left:42px }
.wsp .wsp-fo__pbody{ flex:1; min-width:0 }
.wsp .wsp-fo__posthead{ display:flex; align-items:baseline; gap:8px; flex-wrap:wrap }
.wsp .wsp-fo__pauthor{ font-size:12.5px; font-weight:700; color:var(--text-strong) }
.wsp .wsp-fo__ptime{ font-size:10.5px; color:var(--text-subtle) }
.wsp .wsp-fo__pdel{ display:flex; align-items:center; gap:6px; margin-top:4px; font-size:13px; color:var(--text-subtle) }
.wsp .wsp-fo__pacts{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-top:8px }
.wsp .wsp-fo__react{
  display:inline-flex; align-items:center; gap:6px; height:28px; padding:0 11px;
  border-radius:var(--wsp-rp); border:1px solid var(--line-200); background:var(--surface-1);
  font-family:var(--font-mono); font-size:10.5px; color:var(--text-muted); cursor:pointer;
}
.wsp .wsp-fo__react.is-mine{ border-color:var(--wsp-ink); color:var(--text-strong) }
.wsp .wsp-fo__rp{ padding:14px 22px 18px }
.wsp .wsp-fo__rprow{ display:flex; gap:10px; align-items:flex-start }
.wsp .wsp-fo__rpava{ margin-top:3px }
.wsp .wsp-fo__rpbody{ flex:1; min-width:0 }
.wsp .wsp-fo__rpsend{ height:40px; padding:0 18px; font-size:13px; font-weight:600; flex:0 0 auto }

/* ---- 3.7 responsif & motion (helmet master 58-62) ---- */
@media (max-width:1180px){
  .wsp .wsp-fo__grid{ grid-template-columns:minmax(0,1fr) }
}
@media (prefers-reduced-motion: reduce){
  .wsp-fo{ animation:none !important }
}

/* == :END == WORKSPACE-FORUM ========================================== */

/* == WORKSPACE-ROSTER (F8 — reproduksi Workspace.dc.html 1776-1836) ==== */
/* Binding style diresolusi dari script master rosterVals() 5444-5484 +
   helper tag() 3012-3013. Spec: docs/workspace-prototype/spec_F8_roster.md
   Primitif bersama (.wsp-tag/.wsp-ava/.wsp-card/.wsp-callout/.wsp-pill/.wsp-ico/
   .wsp-btn/.wsp-spacer/--wsp-r*) dari blok WORKSPACE-PM.
   BREAKPOINT: NOL — tidak satu pun @media helmet master menyentuh kelas roster.
   Responsivitas datang dari overflow-x:auto (1798) + min-width:780px (1799)
   + flex-wrap:wrap (1779, 1822). Jangan mengarang breakpoint. */

.wsp-rst{ display:flex; flex-direction:column; gap:14px; animation:wsp-fade .2s ease }
.wsp .wsp-rst__head{ display:flex; align-items:center; gap:10px; flex-wrap:wrap }
.wsp .wsp-rst__id{ min-width:0 }
.wsp .wsp-rst__titlerow{ display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.wsp .wsp-rst__h2{ font-family:var(--font-display); font-size:16px; font-weight:700; margin:0; color:var(--text-strong) }
.wsp .wsp-rst__sub{ font-size:11.5px; color:var(--text-subtle); margin-top:2px }
/* toolbar app (master tak punya toolbar) — memakai primitif master, tanpa geometri baru */
.wsp .wsp-rst__tools{ display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.wsp .wsp-rst__wk{ font-family:var(--font-mono); font-size:11px; color:var(--text-muted); white-space:nowrap }
.wsp .wsp-rst__sel{
  height:30px; padding:0 8px; border:1px solid var(--border-input); border-radius:var(--wsp-r9);
  background:var(--surface-0); font-family:var(--font-body); font-size:11.5px; font-weight:600;
  color:var(--text-strong); outline:none; cursor:pointer; flex:0 0 auto; min-width:168px; max-width:220px;
}
.wsp .wsp-rst__sel:disabled{ cursor:not-allowed; opacity:.65 }
/* flex:0 0 auto = tambahan app: di master seg adalah anak terakhir setelah spacer */
.wsp .wsp-rst__seg{
  display:flex; gap:2px; padding:3px; background:var(--surface-0);
  border:1px solid var(--line-200); border-radius:var(--wsp-rp); flex:0 0 auto;
}
.wsp .wsp-rstmode{
  height:30px; padding:0 13px; border-radius:var(--wsp-rp); border:0; cursor:pointer;
  font-family:var(--font-body); font-size:12px; white-space:nowrap;
  background:transparent; color:var(--text-muted); font-weight:500;
}
.wsp .wsp-rstmode.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }
.wsp .wsp-rstmode:disabled{ cursor:not-allowed; opacity:.55 }
/* dipasang bersama .wsp-callout .wsp-callout--tone .wsp-t-blue */
.wsp .wsp-rst__note{ align-items:center; padding:11px 16px; font-size:12.5px }
/* WAJIB: .wsp-callout svg memasang margin-top:1px, master 1795 align-items:center tanpa margin */
.wsp .wsp-rst__note svg{ margin-top:0 }
.wsp .wsp-rst__scroll{ overflow-x:auto }
.wsp .wsp-rst__grid{ min-width:780px }
.wsp .wsp-rstrow{
  display:grid; grid-template-columns:180px repeat(7, 1fr);
  border-bottom:1px solid var(--line-100); align-items:stretch;
}
.wsp .wsp-rst__corner{
  padding:11px 16px; font-family:var(--font-mono); font-size:9.5px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-rst__day{ padding:11px 8px; text-align:center; border-left:1px solid var(--line-100) }
.wsp .wsp-rst__dayname{ font-family:var(--font-mono); font-size:10.5px; font-weight:700; color:var(--text-strong) }
.wsp .wsp-rst__demand{ font-family:var(--font-mono); font-size:8.5px; margin-top:2px; color:var(--text-subtle) }
.wsp .wsp-rst__demand.is-hot{ color:var(--pst-danger-text); font-weight:700 }
.wsp .wsp-rst__who{ padding:9px 16px; display:flex; align-items:center; gap:9px; min-width:0 }
.wsp .wsp-rst__ava{ font-size:9.5px }
.wsp .wsp-rst__name{
  font-size:12px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0;
}
/* URUTAN #26 → #27 → #28 LOAD-BEARING: spesifisitas identik (0,2,0), yang belakangan menang. */
.wsp .wsp-rstcell{
  border:0; border-left:1px solid var(--line-100); cursor:pointer; padding:12px 4px;
  font-family:var(--font-mono); font-size:11px; font-weight:700; text-align:center;
  background:var(--wsp-tone-bg); color:var(--wsp-tone-text);
}
.wsp .wsp-rstcell--off{ background:var(--surface-1); color:var(--text-disabled) }
/* state app: sel tanpa data. Master tak punya ini; fallback cellMeta akan membuatnya
   terlihat OFF = data palsu. */
.wsp .wsp-rstcell--blank{ background:var(--surface-0); color:var(--text-subtle) }
.wsp .wsp-rstcell:disabled{ cursor:default }
.wsp .wsp-rstcell.is-pending{ position:relative }
.wsp .wsp-rstcell.is-pending::after{
  content:""; position:absolute; top:5px; right:5px; width:4px; height:4px;
  border-radius:var(--wsp-rp); background:currentColor;
}
.wsp .wsp-rstcell.is-draft{ box-shadow:inset 0 0 0 2px var(--vs-yellow) }
.wsp .wsp-rst__legend{
  display:flex; gap:8px; flex-wrap:wrap; align-items:center;
  padding:12px 16px; border-top:1px solid var(--line-100);
}
.wsp .wsp-rst__lnote{ font-size:11px; color:var(--text-subtle) }
.wsp .wsp-rst__empty{ padding:22px 16px; text-align:center; font-size:12.5px; color:var(--text-subtle) }
.wsp .wsp-rst__gap{
  display:flex; align-items:flex-start; gap:7px; padding:0 16px 12px;
  font-size:11.5px; color:var(--text-subtle); line-height:1.5;
}
.wsp .wsp-rst__gap svg{ flex:0 0 auto; margin-top:2px }

@media (prefers-reduced-motion: reduce){
  .wsp-rst{ animation:none !important }
}

/* == :END == WORKSPACE-ROSTER ========================================= */

/* == WORKSPACE-NOTIF (F9 — reproduksi Workspace.dc.html 2027-2047 · 2766-2772) == */
/* Spec: docs/workspace-prototype/spec_F9_notif_toast.md
   SELF-CONTAINED: TIDAK memakai prefix :is(.wsp,…) karena #wsBellPop hidup di
   #bgCommDock (anak document.body), di luar subtree .wsp. Token --wsp-* tersedia
   karena .wsp-notifpop sudah ditambahkan ke akar token di §0 blok WORKSPACE-PM.
   BREAKPOINT: NOL — master responsif lewat width:min(348px,90vw) & max-width:88vw. */

/* -- scrim (master 2029) -- */
.wsp-notifscrim{ position:fixed; inset:0; z-index:75; background:transparent }

/* -- panel popover (master 2030) --
   Properti di bawah WAJIB dideklarasi ulang karena elemen juga membawa .ws-bell-pop
   (admin.css ±3596 & ±4132). Menang lewat urutan sumber, bukan spesifisitas. */
.wsp-notifpop{
  position:fixed;
  top:70px; right:28px;                 /* FALLBACK; ditimpa inline oleh wspNotifAnchor() */
  width:min(348px, 90vw);
  max-width:none;
  background:var(--surface-0);
  border:1px solid var(--line-200);
  border-radius:var(--wsp-r14);
  box-shadow:var(--shadow-pop);
  z-index:76;
  overflow:hidden;
  animation:wsp-rise .16s ease;
  font-family:var(--font-body);
  color:var(--text-body);
  display:flex; flex-direction:column;
  max-height:min(70vh, 560px);
  padding:0;
}
/* WAJIB: [hidden] punya spesifisitas 0 — tanpa ini display:flex membuat popover
   tidak pernah bisa disembunyikan lagi di SEMUA modul. */
.wsp-notifpop[hidden]{ display:none !important }

/* -- head (master 2031-2035) -- */
.wsp-notifpop__head{
  display:flex; align-items:center; gap:9px; padding:13px 16px;
  border-bottom:1px solid var(--line-100); flex:0 0 auto;
}
.wsp-notifpop__head > svg{ width:15px; height:15px; color:var(--text-muted); flex:0 0 auto; display:block }
.wsp-notifpop__title{
  font-family:var(--font-display); font-size:13.5px; font-weight:700;
  margin:0; flex:1; color:var(--text-strong);
}
.wsp-notifpop__all{
  border:0; background:transparent; padding:0; font-family:var(--font-body);
  font-size:11.5px; font-weight:600; color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-notifpop__all:hover{ color:var(--text-strong) }

/* -- body scroll (adaptasi: head tetap, isi bergulir; backend LIMIT 100) -- */
.wsp-notifpop__body{ flex:1 1 auto; min-height:0; overflow-y:auto; overscroll-behavior:contain }

/* -- baris notifikasi (script master 5580 · 5583) -- */
.wsp-notifrow{
  display:flex; gap:11px; align-items:flex-start; padding:11px 16px;
  border:0; border-bottom:1px solid var(--line-100);
  width:100%; cursor:pointer; font-family:var(--font-body);
  background:transparent; color:var(--text-body);
}
/* Isian per KATEGORI supaya sekali lihat langsung ketahuan asalnya (Forum / Chat /
   Daily Jurnal / Tasks & PM / E-Office / Post-Pro). Baris membawa .wsp-t-{tone} sehingga
   --wsp-tone-* tersedia untuk baris DAN ikon di dalamnya.
   Garis kategori memakai inset box-shadow, BUKAN border-left: border akan menggeser
   padding/lebar baris dan berisiko menimbulkan tumpang tindih; box-shadow nol dampak layout. */
.wsp-notifpop .wsp-notifrow{
  background:color-mix(in srgb, var(--wsp-tone-bg) 38%, transparent);
  box-shadow:inset 3px 0 0 var(--wsp-tone-border);
}
/* belum dibaca = isian tone penuh + teks lebih tegas */
.wsp-notifpop .wsp-notifrow.is-unread{
  background:var(--wsp-tone-bg);
  box-shadow:inset 3px 0 0 var(--wsp-tone-text);
}
.wsp-notifpop .wsp-notifrow.is-unread .wsp-notifrow__line{ font-weight:600; color:var(--text-strong) }
.wsp-notifpop .wsp-notifrow:hover:not(.is-dead){ filter:brightness(.985) }
/* baris mati (tautan tidak bisa dibuka) sengaja TIDAK diberi warna kategori —
   mewarnainya membuatnya tampak bisa diklik. */
.wsp-notifpop .wsp-notifrow.is-dead{
  cursor:default; background:transparent; box-shadow:inset 3px 0 0 var(--line-200); opacity:.72;
}
.wsp-notifrow.is-dead{ cursor:default }
.wsp-notifrow__ic{
  width:30px; height:30px; border-radius:var(--wsp-r9);
  display:grid; place-items:center; flex:0 0 auto;
  background:var(--wsp-tone-bg); border:1px solid var(--wsp-tone-border); color:var(--wsp-tone-text);
}
.wsp-notifrow__ic > svg{ width:14px; height:14px; display:block }
.wsp-notifrow__txt{ flex:1; min-width:0; text-align:left }
.wsp-notifrow__line{ display:block; font-size:12px; color:var(--text-body); line-height:1.45 }
.wsp-notifrow__meta{
  display:flex; align-items:center; gap:6px; font-size:10.5px;
  color:var(--text-subtle); margin-top:3px;
}
.wsp-notifrow__meta b{ font-weight:600; color:var(--text-muted) }
.wsp-notifrow__dot{
  width:7px; height:7px; border-radius:var(--wsp-rp);
  background:var(--vs-yellow); border:1px solid var(--vs-yellow-shadow);
  margin-top:5px; flex:0 0 auto;
}

/* -- empty state (adaptasi: master selalu punya seed, app tidak boleh dummy) -- */
.wsp-notifpop__empty{
  display:flex; gap:9px; align-items:flex-start; padding:12px 16px;
  font-size:11.5px; line-height:1.55; color:var(--text-muted);
}
.wsp-notifpop__empty > svg{
  width:15px; height:15px; color:var(--text-muted);
  flex:0 0 auto; margin-top:1px; display:block;
}

/* -- toast (master 2767-2771): opt-in lewat kelas .wsp-toast.
   ui.js/app.css TIDAK disentuh; kelas hanya dipasang saat layer aktif = Workspace. -- */
.toast-wrap:has(> .toast.wsp-toast){ bottom:26px; width:auto; max-width:none }
.toast.wsp-toast{
  max-width:88vw;
  border-radius:var(--radius-pill);
  padding:11px 20px;
  font-family:var(--font-body);
  font-size:13px; font-weight:600;
  display:flex; align-items:center; gap:9px;
  background:var(--ink-950); color:var(--primary-contrast);
  box-shadow:var(--shadow-pop);
  animation:wsp-rise .2s ease;
}
/* master tidak punya ikon di toast — yang ada dot kuning 7px */
.toast.wsp-toast > svg{ display:none }
.toast.wsp-toast::before{
  content:''; width:7px; height:7px; border-radius:var(--radius-pill);
  background:var(--vs-yellow); flex:0 0 auto;
}
/* varian --icon: dipakai saat pemanggil mengirim opts.icon (mis. {icon:'warn'})
   supaya makna peringatan tidak hilang. Bentuk pil master dipertahankan. */
.toast.wsp-toast--icon > svg{ display:block; width:18px; height:18px }
.toast.wsp-toast--icon::before{ content:none }

@media (prefers-reduced-motion: reduce){
  .wsp-notifpop,
  .toast.wsp-toast{ animation:none !important }
}

/* == :END == WORKSPACE-NOTIF ========================================== */

/* == WORKSPACE-JURNAL (F7 — reproduksi Workspace.dc.html 1689-1775) === */
/* Sumber: 12.00.01.01 WORKSPACE - Claude Design/Workspace.dc.html
   markup 1689-1775 (blok "DAILY JURNAL v2.0") · script jurnalVals() 5386-5442 ·
   tag() 3012-3014 · helmet responsive 44-75.
   Spec bedah: docs/workspace-prototype/spec_F7_jurnal.md (43 binding teresolusi,
   lewat audit adversarial 3 lensa).

   Prefix .wsp-jr* — BUKAN .wsp-j*, karena .wsp-jcard/.wsp-jstrip sudah dipakai
   blok WORKSPACE-HOME (F2) untuk strip "Daily Jurnal hari ini" di Ringkasan.
   Waspada tetangga satu huruf: .ws-jrcard (legacy, admin.css §4086) ≠ .wsp-jrcard.

   Token lokal --wsp-* memakai akar yang sudah ada (§0 blok WORKSPACE-PM);
   blok ini TIDAK menambah token baru satu pun. Nol hex/rgba mentah.

   PENYIMPANGAN YANG DISENGAJA (jangan dikira lupa):
   1. Tabel Papan Performa (.wsp-jrtable/.wsp-jrtrow) — master tidak pernah
      menggambar tabel di layar Jurnal. Nilai padding/mono-head/hover disalin dari
      anatomi tabel master 486-510 (preseden .wsp-eorow F4); grid 9 kolom dan
      min-width:1000px murni keputusan app.
   2. .wsp-jrdivrow / .wsp-jrswitch (sub `config`) dan .wsp-jrsec__body/__foot/__empty
      — wadah untuk sub-tab app (plan/board/config) yang tidak ada di master.
      Ritme padding menyalin master (15px 20px head, 13px 20px row).
   3. Dot kolom hold/handover/cancel memakai --sunset-orange/--neon-pink/--hot-red,
      BUKAN --accent-orange/pink/red. Keputusan owner (ADR-001): app menimpa alias
      --accent-* di admin.css §3938-3940 sehingga nilainya meleset dari prototype
      (#C2470E vs #F97316, dst). Token literal di app.css:38,41,42 nilainya identik
      prototype, jadi keenam dot papan cocok 100% dengan master tanpa hardcode. */

/* ------------------------------------------------------------------ */
/* §1 · WADAH + HEAD (master 1691-1695)                                 */
/* ------------------------------------------------------------------ */
.wsp-jr{ display:flex; flex-direction:column; gap:14px; animation:wsp-fade .2s ease }

.wsp .wsp-jr__head{ display:flex; align-items:center; gap:10px; flex-wrap:wrap }
/* min-width:0 = TAMBAHAN app (master 1693 <div> telanjang); judul app dinamis. */
.wsp .wsp-jr__id{ min-width:0 }
.wsp .wsp-jr__h2{
  font-family:var(--font-display); font-size:16px; font-weight:700;
  margin:0; color:var(--text-strong);
}
.wsp .wsp-jr__sub{ font-size:11.5px; color:var(--text-subtle); margin-top:2px }

/* ------------------------------------------------------------------ */
/* §2 · SEGMENTED SWITCH VIEW (master 1699 + jv.st script 5400-5401)     */
/* ------------------------------------------------------------------ */
/* max-width+overflow-x = TAMBAHAN (master punya 2 chip, app sampai 5 —
   pola identik .wsp-eo__tabs F4). inline-flex/align/text-decoration/flex:0 0 auto
   = master memakai <button>, app memakai <a href> supaya rute jadi tautan nyata. */
.wsp .wsp-jr__views{
  display:flex; gap:2px; padding:3px;
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-rp);
  max-width:100%; overflow-x:auto;
}
.wsp .wsp-jrview{
  display:inline-flex; align-items:center;
  height:30px; padding:0 13px; border-radius:var(--wsp-rp);
  border:0; background:transparent; color:var(--text-muted);
  font-family:var(--font-body); font-size:12px; font-weight:500;
  white-space:nowrap; cursor:pointer; text-decoration:none; flex:0 0 auto;
}
.wsp .wsp-jrview.is-on{ background:var(--wsp-ink); color:var(--wsp-on-ink); font-weight:700 }

/* ------------------------------------------------------------------ */
/* §3 · TOMBOL (master 1760 ink · 1769 dashed)                          */
/* ------------------------------------------------------------------ */
/* gap:6px = TAMBAHAN (master 1760 teks polos; app menaruh ikon di beberapa tombol).
   Hover ink var(--wsp-ink-hover) = --primary-hover = #1B1C1F, cocok persis dengan
   style-hover="background:#1B1C1F" master 1760. */
.wsp .wsp-jrbtn{
  display:inline-flex; align-items:center; gap:6px;
  height:29px; padding:0 13px; border-radius:var(--wsp-r8);
  border:0; background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:11.5px; font-weight:600;
  cursor:pointer; white-space:nowrap; flex:0 0 auto;
}
.wsp .wsp-jrbtn:hover:not(:disabled){ background:var(--wsp-ink-hover) }
.wsp .wsp-jrbtn:disabled{ background:var(--ink-050); color:var(--text-disabled); cursor:not-allowed }

.wsp .wsp-jrbtn--ghost{
  border:1px solid var(--border-input); background:var(--surface-0); color:var(--text-muted);
}
.wsp .wsp-jrbtn--ghost:hover:not(:disabled){ background:var(--surface-1); color:var(--text-strong) }
.wsp .wsp-jrbtn--ghost:disabled{ background:var(--surface-0); color:var(--text-disabled) }

.wsp .wsp-jrbtn--danger{
  border:1px solid var(--pst-danger-border); background:var(--pst-danger-bg); color:var(--pst-danger-text);
}
.wsp .wsp-jrbtn--danger:hover:not(:disabled){ filter:brightness(.97) }

.wsp .wsp-jrbtn--dash{
  display:flex; justify-content:center; width:100%; height:36px; margin-top:14px;
  border:1px dashed var(--border-input); border-radius:var(--wsp-r10);
  background:var(--surface-1); color:var(--text-muted);
  font-size:12.5px; font-weight:600;
}
.wsp .wsp-jrbtn--dash:hover:not(:disabled){ background:var(--ink-050); color:var(--text-muted) }

/* ------------------------------------------------------------------ */
/* §4 · TOOLBAR `today` (master 1709-1714) + DATE STEPPER (app)         */
/* ------------------------------------------------------------------ */
/* flex-wrap + flex:1 1 260px = TAMBAHAN (master 1709/1710 flex:1 tanpa wrap;
   app menambah date stepper di baris yang sama). min-width:0 + max-width:520px
   tetap dari master 1710. */
.wsp .wsp-jr__tools{ display:flex; align-items:center; gap:10px; flex-wrap:wrap }

.wsp .wsp-jr__quick{
  flex:1 1 260px; min-width:0; max-width:520px;
  display:flex; align-items:center; gap:9px;
  height:42px; padding:0 14px;
  background:var(--surface-0); border:1px solid var(--border-input);
  border-radius:var(--wsp-r10);
}
.wsp .wsp-jr__quick > i, .wsp .wsp-jr__quick > svg{
  width:16px; height:16px; color:var(--text-subtle); flex:0 0 auto; display:inline-flex;
}
/* height:100% + min-width:0 = TAMBAHAN (master 1712 hanya flex:1) — mencegah input
   meluber saat baris wrap. ::placeholder + :disabled = parity DS; master mengandalkan
   gaya bawaan _ds sedangkan app punya rule `input` global yang harus dinolkan. */
.wsp .wsp-jr__quickin{
  flex:1; min-width:0; height:100%;
  border:0; outline:none; background:transparent;
  font-family:var(--font-body); font-size:13px; color:var(--text-strong);
}
.wsp .wsp-jr__quickin::placeholder{ color:var(--text-subtle) }
.wsp .wsp-jr__quickin:disabled{ color:var(--text-disabled) }

.wsp .wsp-jr__date{ display:flex; align-items:center; gap:6px; flex:0 0 auto }
/* 32px = dikecilkan dari .wsp-input dasar (38px) supaya sebaris dengan .wsp-navbtn
   (22px) dan .wsp-pill--28 (28px). Menang atas .wsp-input--date{flex:1} (0,3,0 > 0,2,0). */
.wsp .wsp-jr__date .wsp-input{ width:150px; flex:0 0 auto; height:32px }

.wsp .wsp-jr__hint{
  display:inline-flex; align-items:center; gap:6px;
  font-size:11px; color:var(--text-subtle);
}
.wsp .wsp-jr__hint i, .wsp .wsp-jr__hint svg{ width:13px; height:13px; flex:0 0 auto }

/* ------------------------------------------------------------------ */
/* §5 · PAPAN + KOLOM (master 1716-1724 + c.st script 5415)             */
/* ------------------------------------------------------------------ */
.wsp .wsp-jrboard{
  display:flex; gap:12px; overflow-x:auto; align-items:flex-start; padding-bottom:10px;
}

.wsp .wsp-jrcol{
  flex:0 0 218px; border-radius:var(--wsp-r14);
  background:var(--ink-050); border:1px solid var(--line-100);
  transition:background .14s ease;
}
.wsp .wsp-jrcol.is-over{
  background:var(--wsp-drop-bg); border-style:dashed; border-color:var(--wsp-drop-line);
}
/* kolom tanpa padanan status di DB (hold/handover) — ws_journal_items.status hanya
   menerima planned/in_progress/done/dropped (WS_JRNL_ITEM_STATUS, workspace.php:2685).
   Kolomnya TETAP dirender supaya anatomi 6-kolom master utuh, tapi mati dan beralasan. */
.wsp .wsp-jrcol.is-locked{ background:var(--surface-1); border-style:dashed }
.wsp .wsp-jrcol.is-locked .wsp-jrcol__label{ color:var(--text-disabled) }
.wsp .wsp-jrcol.is-locked.is-over{ background:var(--surface-1); border-color:var(--line-200) }

.wsp .wsp-jrcol__head{ display:flex; align-items:center; gap:7px; padding:11px 12px 9px }
/* master 1721 hanya: mono 10px / .1em / uppercase / 700 / --text-muted / flex:1.
   min-width:0 + nowrap + ellipsis = TAMBAHAN app (label kolom app bisa lebih panjang
   dari "To-do"/"Berjalan"; tanpa ini kolom 218px pecah). Geometri-netral bagi master. */
.wsp .wsp-jrcol__label{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.1em;
  text-transform:uppercase; font-weight:700; color:var(--text-muted);
  flex:1; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
/* Span ini membawa alias .ws-kcol__count karena wsKanbanDnD (admin.js:652) memakai
   nama itu untuk memperbarui angka. Akibatnya rule legacy admin.css:4172-4173 ikut
   kena (chip 20x20 inline-flex bertone). Master 1722 hanya teks mono telanjang,
   jadi geometri chip lama WAJIB dinolkan — persis alasan .wsp-col__count (11777).
   Spesifisitas aman: .wsp .wsp-jrcol__count (0,2,0) > .ws-kcol__count (0,1,0). */
.wsp .wsp-jrcol__count{
  font-family:var(--font-mono); font-size:10px; font-weight:700; color:var(--text-subtle);
  font-variant-numeric:normal;
  display:inline-block; min-width:0; height:auto;
  padding:0; border:0; background:transparent; border-radius:0; flex:0 0 auto;
}
.wsp .wsp-jrcol__cards{
  display:flex; flex-direction:column; gap:7px; padding:0 9px 11px; min-height:60px;
}
/* placeholder di-inject wsKanbanDnD (admin.js:655) dengan className ws-kcol__empty →
   kena rule legacy admin.css:4177-4178 (kotak dashed rata tengah). Netralkan,
   sama seperti .wsp-col (admin.css:11795). */
.wsp .wsp-jrcol .ws-kcol__empty{
  margin:0; padding:6px 2px; text-align:left; border:0; border-radius:0;
  font-size:11.5px; color:var(--text-subtle);
}

/* Dot kolom (master 1720, c.dot script 5406-5409) memakai primitif .wsp-gdot (F1,
   admin.css:11710). 3 dari 6 warna sudah ada di F1 (--todo/--progress/--complete)
   dan nilainya SUDAH identik prototype. 3 sisanya ditambah di sini memakai token
   literal yang nilainya juga identik prototype — lihat catatan penyimpangan #3. */
.wsp .wsp-gdot--hold    { background:var(--sunset-orange) }   /* master #F97316 */
.wsp .wsp-gdot--handover{ background:var(--neon-pink) }       /* master #EC4899 */
.wsp .wsp-gdot--cancel  { background:var(--hot-red) }         /* master #F5365E */

/* ------------------------------------------------------------------ */
/* §6 · KARTU JURNAL (master 1726-1734)                                 */
/* ------------------------------------------------------------------ */
.wsp .wsp-jrcard{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r10); padding:10px 11px;
  cursor:grab; box-shadow:var(--shadow-card);
  transition:border-color .14s ease;   /* TAMBAHAN — master 1726 tak punya transition */
}
.wsp .wsp-jrcard:hover{ border-color:var(--ink-300) }   /* = style-hover master 1726 */
.wsp .wsp-jrcard:active{ cursor:grabbing }              /* TAMBAHAN */
/* state yang dipasang wsKanbanDnD — tanpa ini kartu tak memberi umpan balik.
   is-dragging admin.js:688 · is-saving :662 · is-settled :668 (auto-lepas 420ms). */
.wsp .wsp-jrcard.is-dragging{ opacity:.45; cursor:grabbing }
.wsp .wsp-jrcard.is-saving  { opacity:.7;  cursor:progress }
.wsp .wsp-jrcard.is-settled { border-color:var(--pst-success-border) }

.wsp .wsp-jrcard__top{ display:flex; align-items:center; gap:5px; flex-wrap:wrap }
.wsp .wsp-jrcard__time{
  display:inline-flex; align-items:center; gap:4px;
  font-family:var(--font-mono); font-size:9.5px; color:var(--text-subtle);
}
.wsp .wsp-jrcard__time i, .wsp .wsp-jrcard__time svg{ width:11px; height:11px; flex:0 0 auto }
.wsp .wsp-jrcard__title{
  font-size:12.5px; font-weight:600; color:var(--text-body); margin-top:7px; line-height:1.4;
}
.wsp .wsp-jrcard__note{ font-size:10.5px; color:var(--text-subtle); margin-top:5px }
/* __acts = TAMBAHAN app (master tak punya aksi per-kartu). Isinya memakai primitif F1
   .wsp-btn--26 / .wsp-ico--22 — nol gaya baru. margin-top:8px mengikuti ritme
   __note (5px) / __title (7px). */
.wsp .wsp-jrcard__acts{ display:flex; align-items:center; gap:5px; flex-wrap:wrap; margin-top:8px }

/* ------------------------------------------------------------------ */
/* §7 · GRID 2 KOLOM · SECTION · ROW · ASIDE (master 1744-1770)          */
/* ------------------------------------------------------------------ */
.wsp .wsp-jrgrid{
  display:grid; grid-template-columns:minmax(0,1fr) 300px; gap:16px; align-items:start;
}

.wsp .wsp-jrsec{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card); overflow:hidden;
}
/* flex-wrap / min-width:0 / flex:0 0 auto = TAMBAHAN (master 1746-1749 punya 2-3 anak
   statis; judul app dinamis). */
.wsp .wsp-jrsec__head{
  display:flex; align-items:center; gap:9px; padding:15px 20px;
  border-bottom:1px solid var(--line-100); flex-wrap:wrap;
}
.wsp .wsp-jrsec__head > i, .wsp .wsp-jrsec__head > svg{
  width:16px; height:16px; color:var(--text-muted); flex:0 0 auto; display:inline-flex;
}
.wsp .wsp-jrsec__title{
  font-family:var(--font-display); font-size:14.5px; font-weight:700;
  margin:0; flex:1; min-width:0; color:var(--text-strong);
}
.wsp .wsp-jrsec__gate{ font-size:11px; color:var(--text-subtle); flex:0 0 auto }
.wsp .wsp-jrsec__body{ padding:15px 20px; display:flex; flex-direction:column; gap:12px }
/* Composer Config = grid dua kolom: [nama setelan + penjelasan] | [kontrol + catatan].
   Sebelumnya semua elemen ditumpuk rata-tengah dalam satu kolom flex sehingga label,
   input kecil, callout lebar, dan tabel tidak punya sumbu yang sama. */
.wsp .wsp-cfg{ display:block; padding:0 }
.wsp .wsp-cfg__row{
  display:grid; grid-template-columns:minmax(200px,260px) minmax(0,1fr);
  column-gap:24px; row-gap:6px; align-items:start;
  padding:16px 20px; border-bottom:1px solid var(--line-100);
}
.wsp .wsp-cfg__row:last-child{ border-bottom:0 }
.wsp .wsp-cfg__label{ display:flex; flex-direction:column; gap:3px; min-width:0 }
.wsp .wsp-cfg__name{ font-size:13px; font-weight:650; color:var(--text-strong) }
.wsp .wsp-cfg__hint{ font-size:11.5px; line-height:1.45; color:var(--text-subtle) }
.wsp .wsp-cfg__ctl{ display:flex; flex-direction:column; gap:9px; min-width:0; align-items:flex-start }
.wsp .wsp-cfg__ctl > *{ max-width:100% }
.wsp .wsp-cfg__ctl .wsp-jrtable{ width:100% }
.wsp .wsp-cfg__ctl .wsp-callout{ margin:0 }
@media (max-width:760px){
  .wsp .wsp-cfg__row{ grid-template-columns:minmax(0,1fr); row-gap:10px; padding:14px 16px }
}
.wsp .wsp-jrsec__foot{
  padding:13px 20px; border-top:1px solid var(--line-100);
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
}
.wsp .wsp-jrsec__empty{ padding:22px 20px; text-align:center; font-size:12.5px; color:var(--text-subtle) }

.wsp .wsp-jrrow{
  display:flex; align-items:center; gap:12px; padding:13px 20px;
  border-bottom:1px solid var(--line-100); flex-wrap:wrap;
}
/* master 1752 memasang border-bottom di SETIAP baris termasuk terakhir → garis dobel
   dengan border section. Dinolkan mengikuti preseden .wsp-eotable > :last-child (F4). */
.wsp .wsp-jrsec > .wsp-jrrow:last-child{ border-bottom:0 }
.wsp .wsp-jrini{
  width:28px; height:28px; border-radius:var(--wsp-rp);
  background:var(--ink-100); color:var(--ink-600);
  display:grid; place-items:center;
  font-family:var(--font-mono); font-size:10px; font-weight:700; flex:0 0 auto;
}
.wsp .wsp-jrrow__id  { flex:1; min-width:200px }
.wsp .wsp-jrrow__item{ display:block; font-size:13px; font-weight:600; color:var(--text-strong) }
.wsp .wsp-jrrow__emp {
  display:block; font-size:11.5px; color:var(--text-subtle); margin-top:2px;
}
.wsp .wsp-jrrow__acts{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; flex:0 0 auto }
.wsp .wsp-jrrow__prog{ flex:0 0 132px; display:flex; align-items:center; gap:7px }
/* Drag-reorder rutin (F7 · menggantikan field angka "Urutan tampil").
   Penanda sisip memakai inset box-shadow, BUKAN border — border akan menggeser tinggi
   baris saat hover dan membuat daftar "melompat". */
.wsp .wsp-jrrow--drag{ cursor:grab }
.wsp .wsp-jrrow--drag:active{ cursor:grabbing }
.wsp .wsp-jrrow--drag.is-dragging{ opacity:.45 }
.wsp .wsp-jrrow--drag.is-dropbefore{ box-shadow:inset 0 2px 0 var(--wsp-drop-line) }
.wsp .wsp-jrrow--drag.is-dropafter { box-shadow:inset 0 -2px 0 var(--wsp-drop-line) }
.wsp .wsp-jrgrip{
  display:inline-flex; align-items:center; justify-content:center;
  width:16px; color:var(--text-subtle); flex:0 0 auto; margin-right:-4px;
}
.wsp .wsp-jrrow--drag:hover .wsp-jrgrip{ color:var(--text-muted) }

.wsp .wsp-jraside{
  background:var(--surface-0); border:1px solid var(--line-200);
  border-radius:var(--wsp-r14); box-shadow:var(--shadow-card);
  padding:16px 18px;
}
.wsp .wsp-jraside__kick{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle); margin-bottom:8px;
}
.wsp .wsp-jraside__body{ font-size:12.5px; color:var(--text-body); line-height:1.55 }
.wsp .wsp-jraside__chips{ display:flex; flex-wrap:wrap; gap:6px; margin-top:10px }

/* ------------------------------------------------------------------ */
/* §8 · TABEL PAPAN PERFORMA (sub `board`) — PENYIMPANGAN #1            */
/* ------------------------------------------------------------------ */
/* Nilai padding / mono-head / hover disalin dari anatomi tabel master 486-510
   (preseden .wsp-eorow F4, admin.css:13109-13117). grid-template-columns 9 kolom
   dan min-width:1000px MURNI keputusan app — master tidak menggambar tabel di
   layar Jurnal sama sekali. */
.wsp .wsp-jr__filters{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:12px;
}
.wsp .wsp-jrscroll{ overflow-x:auto }
.wsp .wsp-jrtable{ min-width:1000px }
.wsp .wsp-jrtrow{
  display:grid; grid-template-columns:1.9fr .9fr .8fr .7fr .7fr .6fr 1.2fr .7fr .7fr;
  gap:12px; padding:11px 20px; border-bottom:1px solid var(--line-100); align-items:center;
}
.wsp .wsp-jrtrow--head{
  padding:9px 20px; background:var(--surface-1);
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-jrtable > :last-child{ border-bottom:0 }
.wsp .wsp-jrtrow:not(.wsp-jrtrow--head):hover{ background:var(--surface-1) }
.wsp .wsp-jrcell{ font-size:12.5px; color:var(--text-body); min-width:0 }
.wsp .wsp-jrcell--mono { font-family:var(--font-mono); font-size:11.5px; color:var(--text-muted) }
.wsp .wsp-jrcell--muted{ color:var(--text-subtle) }
.wsp .wsp-jrcell--id   { display:flex; align-items:center; gap:10px; min-width:0 }
.wsp .wsp-jrcell--id > span:last-child{
  font-size:13px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}

/* ------------------------------------------------------------------ */
/* §9 · FORM CONFIG (sub `config`) — PENYIMPANGAN #2                    */
/* ------------------------------------------------------------------ */
/* Field/label/input/select/checkbox memakai primitif F1 apa adanya:
   .wsp-field (11965) · .wsp-field__label (11969) · .wsp-input (11973) ·
   .wsp-select (11981) · .wsp-chk / --lg (12146/12153) · .wsp-callout (11989) ·
   .wsp-track / .wsp-bar (11373/11381) · .wsp-kicker--95 (11267). */
.wsp .wsp-jrswitch{
  display:flex; align-items:center; gap:9px; cursor:pointer;
  font-size:12.5px; color:var(--text-body);
}
.wsp .wsp-jrswitch.is-off{ cursor:not-allowed; color:var(--text-disabled) }
.wsp .wsp-jrdivrow{
  display:grid; grid-template-columns:minmax(0,1fr) 200px; gap:12px;
  align-items:center; padding:11px 20px; border-bottom:1px solid var(--line-100);
}
.wsp .wsp-jrdivrow--head{
  padding:9px 20px; background:var(--surface-1);
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp .wsp-jrdivrow .wsp-select{ height:32px; font-size:12.5px }

/* ------------------------------------------------------------------ */
/* §10 · RESPONSIVE — HANYA breakpoint yang ada di helmet master 44-75  */
/* ------------------------------------------------------------------ */
/* Yang benar-benar tersentuh markup 1689-1775: 1180 (.ws-g2 helmet 60 → grid jatuh
   1 kolom; .ws-hidesm helmet 61 → hint 1714 hilang, sudah ditangani rule F1 12427).
   Tidak ada 760/900/820/720 di dalam range itu. */
@media (max-width:1180px){
  .wsp .wsp-jrgrid{ grid-template-columns:minmax(0,1fr) }
  /* turunan: di layar sempit baris tools sudah wrap, batas 520px master jadi kontraproduktif */
  .wsp .wsp-jr__quick{ max-width:none }
}
@media (prefers-reduced-motion: reduce){
  .wsp-jr{ animation:none !important }
  .wsp .wsp-jrcol,
  .wsp .wsp-jrcard{ transition:none !important }
}

/* ------------------------------------------------------------------ */
/* §11 · TAMBAHAN IMPLEMENTASI (di luar 97 rule spec §3.11)             */
/* ------------------------------------------------------------------ */
/* Enam rule ini tidak ada di spec karena spec hanya MENYKETSA dua surface
   app-only (kartu ringkasan auto §5.9 dan form config §5.8) tanpa menurunkan
   CSS-nya. Semuanya menggantikan style inline — nol nilai hardcode di markup.
   Jarak antar .wsp-jrsec SENGAJA tidak diatur di sini: .wsp-jr sudah
   gap:14px persis seperti master 1691. */
.wsp .wsp-jrcol__lock{ display:inline-flex; color:var(--text-disabled); flex:0 0 auto }
.wsp .wsp-jrcol__lock svg{ width:11px; height:11px }
/* varian textarea dari .wsp-input (tingginya ditentukan rows, bukan height tetap) */
.wsp .wsp-jrnote{ height:auto; padding:9px 12px; line-height:1.5; resize:vertical }
.wsp .wsp-jrinput--sm{ max-width:140px }
/* tabel divisi di sub `config` tidak perlu scroll 1000px seperti papan performa */
.wsp .wsp-jrtable--fit{ min-width:0 }
.wsp .wsp-jraside__field, .wsp .wsp-jraside__act{ margin-top:10px }
/* == :END == WORKSPACE-JURNAL ======================================== */

/* == WORKSPACE-CHAT (F6 — reproduksi Workspace.dc.html 1837-2026) ===== */
/* FAB 1837-1846 · slide-over 1847-2026 · helmet 25-76.
   Spec bedah: docs/workspace-prototype/spec_F6_chat.md (102 binding teresolusi,
   lewat audit adversarial 2 pass).

   Panel MANDIRI di document.body — TIDAK lewat adminModal (gotcha rencana #1:
   adminModal() memanggil closeModal() di awal → panel langsung mati).
   Primitif bersama (.wsp-tag/.wsp-tag--9/.wsp-spacer/.wsp-hidesm/.wsp-showsm/
   .wsp-rich/token --wsp-*) dari blok WORKSPACE-PM.

   Prefix .wsp-chat- — panel chat LAMA (WSComm PRD 12.26, admin.css:3650-3719,
   kelas ws-chat- / ws-msg- / ws-ch-) TETAP HIDUP dan TIDAK disentuh. Kedua panel
   memakai endpoint yang sama; koeksistensinya diatur di JS, bukan di CSS.

   PRASYARAT §3.0 spec SUDAH TERPENUHI sebelum blok ini ditulis: .wsp-drawer-back
   sudah masuk daftar akar token di admin.css:11177 (ditambahkan sesi 2 saat F9).
   Jadi F6 menyentuh NOL baris di luar blok ini. */

/* Token alpha additive — pola sama persis dengan blok WORKSPACE-HOME (admin.css:12460):
   deklarasi ulang akar YANG SAMA, murni menambah, tidak menimpa apa pun.
   Dipakai HANYA oleh .wsp-chat__mytime (master 1969: rgba(255,255,255,.5)). */
.wsp, .wsp-dlg, .wsp-modal, .wsp-scrim, .wsp-drawer{
  --wsp-on-ink-50:color-mix(in srgb, var(--primary-contrast) 50%, transparent);
}

/* ---------------- FAB (master 1839-1843) ---------------- */
/* CATATAN SCOPE — jangan diubah tanpa membaca ini: FAB & badge hidup LANGSUNG di
   document.body, DI LUAR .wsp-drawer, jadi --wsp-ink / --wsp-on-ink TIDAK diwariskan
   ke sini (custom property mengalir lewat pohon DOM, bukan lewat selector).
   Karena itu blok ini memakai token :root. Mengganti salah satunya jadi --wsp-*
   menghasilkan "invalid at computed-value time" — persis bug scrim §8.2. */
.wsp-chatfab{
  position:fixed; bottom:22px; right:22px;
  width:52px; height:52px; border-radius:var(--radius-pill); border:0;
  background:var(--ink-950); color:var(--primary-contrast);
  cursor:pointer; display:grid; place-items:center;
  box-shadow:var(--shadow-pop); z-index:40;
}
.wsp-chatfab:hover{ transform:translateY(-2px) }              /* master 1839 style-hover */
.wsp-chatfab svg{ width:22px; height:22px }                   /* master 1840 */
.wsp-chatfab__badge{                                          /* master 1842 */
  position:absolute; top:-3px; right:-3px;
  min-width:19px; height:19px; padding:0 5px; border-radius:var(--radius-pill);
  background:var(--vs-yellow); color:var(--ink-950);
  font-family:var(--font-mono); font-size:10px; font-weight:700;
  display:grid; place-items:center; border:2px solid var(--surface-0);
  font-variant-numeric:tabular-nums;
}
/* wchBadge() menyembunyikan badge lewat [hidden] saat unread 0; `display:grid` di atas
   MENGALAHKAN display:none bawaan [hidden], jadi FAB memamerkan "0" sementara badge
   chat di topbar sudah kosong — persis keluhan "tidak sinkron". Jangan hapus baris ini. */
.wsp-chatfab__badge[hidden]{ display:none; }

/* ---------------- scrim + panel (master 1849-1850) ---------------- */
/* Ditulis .wsp-drawer-back.wsp-chat-back (0,2,0), BUKAN .wsp-chat-back (0,1,0),
   supaya tidak bergantung pada urutan blok di dalam admin.css (§8.14). */
.wsp-drawer-back.wsp-chat-back{ z-index:45 }
.wsp-drawer.wsp-chat{
  width:clamp(340px, 46%, 760px); max-width:96vw;
  z-index:46; overflow:hidden;                                /* master: anak yang scroll, bukan panel */
  display:flex; flex-direction:column;
}

/* ---------------- head (master 1851-1855) ---------------- */
.wsp-chat__head{
  display:flex; align-items:center; gap:10px;
  padding:14px 18px; border-bottom:1px solid var(--line-100); flex:0 0 auto;
}
.wsp-chat__dot{ width:8px; height:8px; border-radius:var(--radius-pill); background:var(--vs-yellow); flex:0 0 auto }
.wsp-chat__title{
  font-family:var(--font-display); font-size:15px; font-weight:700;
  margin:0; flex:1; min-width:0; color:var(--text-strong);
}
.wsp-chat__count{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.1em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp-chat__x{
  width:30px; height:30px; display:grid; place-items:center; border-radius:var(--wsp-r8);
  border:0; background:transparent; color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-chat__x:hover{ background:var(--surface-1) }

/* ---------------- grid (master 1858) ---------------- */
.wsp-chat__grid{
  display:grid; grid-template-columns:minmax(180px, 30%) minmax(0,1fr);
  flex:1; min-height:0;
}

/* ---------------- rail (master 1860-1891) ---------------- */
.wsp-chat__rail{
  border-right:1px solid var(--line-100); background:var(--surface-1);
  display:flex; flex-direction:column; min-height:0;
}
.wsp-chat__railtop{ padding:11px 12px 9px; display:flex; flex-direction:column; gap:8px }
.wsp-chat__new{
  display:flex; align-items:center; justify-content:center; gap:7px;
  height:34px; border-radius:var(--wsp-r9); border:0;
  background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:12.5px; font-weight:700; cursor:pointer;
}
.wsp-chat__new:hover{ background:var(--wsp-ink-hover) }       /* master 1862 style-hover #1B1C1F */
.wsp-chat__new svg{ width:14px; height:14px; flex:0 0 auto }
.wsp-chat__seek{
  display:flex; align-items:center; gap:7px; height:32px; padding:0 11px;
  border-radius:var(--wsp-r9); border:1px solid var(--border-input); background:var(--surface-0);
}
.wsp-chat__seek svg{ width:13px; height:13px; color:var(--text-subtle); flex:0 0 auto }
.wsp-chat__seekinput{
  flex:1; min-width:0; border:0; outline:none; background:transparent;
  font-family:var(--font-body); font-size:12px; color:var(--text-strong);
}
.wsp-chat__list{
  flex:1; overflow-y:auto; padding:0 8px 12px;
  display:flex; flex-direction:column; gap:2px;
}
.wsp-chat__glabel{
  padding:9px 8px 5px; font-family:var(--font-mono); font-size:8.5px;
  letter-spacing:.16em; text-transform:uppercase; color:var(--text-subtle);
}
.wsp-chat__gempty{ padding:6px 9px 8px; font-size:11px; color:var(--text-subtle) }

/* baris percakapan — master 1873-1884, string style 5493-5507 */
.wsp-chat__crow{
  display:flex; align-items:center; gap:9px; width:100%; padding:8px 9px;
  border-radius:var(--wsp-r9); cursor:pointer; font-family:var(--font-body);
  border:1px solid transparent; background:transparent; text-align:left;
}
.wsp-chat__crow.is-on{ border-color:var(--line-200); background:var(--surface-0) }
.wsp-chat__cava{
  width:28px; height:28px; border-radius:var(--radius-pill);
  display:grid; place-items:center;
  font-family:var(--font-mono); font-size:10px; font-weight:700; flex:0 0 auto;
  background:var(--ink-100); color:var(--ink-600);
}
.wsp-chat__cava.is-group{ border-radius:var(--wsp-r8) }
.wsp-chat__crow.is-on .wsp-chat__cava{ background:var(--wsp-ink); color:var(--wsp-on-ink) }
.wsp-chat__cmain{ flex:1; min-width:0; text-align:left }
.wsp-chat__ctop{ display:flex; align-items:baseline; gap:5px }
.wsp-chat__cname{
  font-size:12.5px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  font-weight:600; color:var(--text-body);
}
.wsp-chat__cname.is-strong{ font-weight:700; color:var(--text-strong) }   /* on || unread — 5502 */
.wsp-chat__ctime{
  font-family:var(--font-mono); font-size:9px; color:var(--text-subtle);
  flex:0 0 auto; font-variant-numeric:tabular-nums;
}
.wsp-chat__csnip{
  display:block; font-size:10.5px; color:var(--text-subtle);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-top:2px;
}
.wsp-chat__cunread{
  font-family:var(--font-mono); font-size:9px; font-weight:700;
  padding:1px 5px; border-radius:var(--radius-pill); flex:0 0 auto;
  background:var(--pst-danger-bg); color:var(--pst-danger-text);
  border:1px solid var(--pst-danger-border); font-variant-numeric:tabular-nums;
}

/* ---------------- kolom kanan (master 1895) ---------------- */
.wsp-chat__room{ display:flex; flex-direction:column; min-height:0; min-width:0 }

/* ---------------- picker (master 1897-1934) ---------------- */
.wsp-chat__pkhead{
  display:flex; align-items:center; gap:9px; padding:13px 16px;
  border-bottom:1px solid var(--line-100); flex:0 0 auto;
}
.wsp-chat__pkback{
  width:28px; height:28px; display:grid; place-items:center; border-radius:var(--wsp-r8);
  border:0; background:transparent; color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-chat__pkback:hover{ background:var(--surface-1) }
.wsp-chat__pktitles{ flex:1; min-width:0 }
.wsp-chat__pktitle{
  display:block; font-family:var(--font-display); font-size:14px;
  font-weight:700; color:var(--text-strong);
}
.wsp-chat__pkhint{ display:block; font-size:11.5px; color:var(--text-subtle); margin-top:1px }
.wsp-chat__pkseekwrap{ padding:11px 16px 0; flex:0 0 auto }
.wsp-chat__pkseek{
  display:flex; align-items:center; gap:7px; height:34px; padding:0 12px;
  border-radius:var(--wsp-r9); border:1px solid var(--border-input); background:var(--surface-0);
}
.wsp-chat__pkseek svg{ width:14px; height:14px; color:var(--text-subtle); flex:0 0 auto }
.wsp-chat__pkseekinput{
  flex:1; min-width:0; border:0; outline:none; background:transparent;
  font-family:var(--font-body); font-size:12.5px; color:var(--text-strong);
}
.wsp-chat__pklist{
  flex:1; overflow-y:auto; padding:10px 12px 14px;
  display:flex; flex-direction:column; gap:3px;
}
.wsp-chat__prow{
  display:flex; align-items:center; gap:10px; width:100%; padding:8px 10px;
  border-radius:var(--wsp-r10); cursor:pointer; font-family:var(--font-body);
  border:1px solid transparent; background:transparent; text-align:left;
}
.wsp-chat__prow.is-on{ border-color:var(--wsp-ink); background:var(--surface-0) }
.wsp-chat__pbox{
  width:17px; height:17px; border-radius:var(--wsp-r5);
  display:grid; place-items:center; flex:0 0 auto;
  background:var(--surface-0); border:1px solid var(--border-input);
}
.wsp-chat__pbox.is-on{ background:var(--wsp-ink); border-color:var(--wsp-ink) }
.wsp-chat__pbox svg{ width:11px; height:11px; color:var(--wsp-on-ink) }
.wsp-chat__pava{
  width:30px; height:30px; border-radius:var(--radius-pill);
  background:var(--ink-100); color:var(--ink-600); display:grid; place-items:center;
  font-family:var(--font-mono); font-size:10px; font-weight:700; flex:0 0 auto;
}
.wsp-chat__pmain{ flex:1; min-width:0; text-align:left }
.wsp-chat__pname{
  display:block; font-size:12.5px; font-weight:600; color:var(--text-strong);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp-chat__pmeta{ display:block; font-size:11px; color:var(--text-subtle); margin-top:1px }
.wsp-chat__pkfoot{
  padding:11px 16px 14px; border-top:1px solid var(--line-100);
  display:flex; flex-direction:column; gap:9px; flex:0 0 auto;
}
.wsp-chat__pkname{
  width:100%; box-sizing:border-box; height:34px; padding:0 12px;
  border:1px solid var(--border-input); border-radius:var(--wsp-r9);
  font-family:var(--font-body); font-size:12.5px; color:var(--text-strong);
  outline:none; background:var(--surface-0);
}
.wsp-chat__pkfootrow{ display:flex; align-items:center; gap:8px }
.wsp-chat__pkcount{ flex:1; min-width:0; font-size:11.5px; color:var(--text-subtle) }
.wsp-chat__pkcancel{
  height:32px; padding:0 13px; border-radius:var(--wsp-r9);
  border:1px solid var(--border-input); background:var(--surface-0);
  font-family:var(--font-body); font-size:12px; font-weight:600;
  color:var(--text-muted); cursor:pointer;
}
.wsp-chat__pkcancel:hover{ background:var(--surface-1) }
.wsp-chat__pkgo{                                              /* startBtnSt 5631 — state "kosong" */
  display:inline-flex; align-items:center; gap:7px; height:32px; padding:0 14px;
  border-radius:var(--wsp-r9); border:0; font-family:var(--font-body);
  font-size:12px; font-weight:700; cursor:pointer;
  background:var(--ink-100); color:var(--text-subtle);
}
.wsp-chat__pkgo.is-ready{ background:var(--wsp-ink); color:var(--wsp-on-ink) }   /* selN > 0 */
.wsp-chat__pkgo svg{ width:14px; height:14px; flex:0 0 auto }

/* ---------------- room head (master 1937-1947) ---------------- */
.wsp-chat__rhead{
  display:flex; align-items:center; gap:10px; padding:12px 16px;
  border-bottom:1px solid var(--line-100); flex:0 0 auto;
}
/* master 1938 memakai place-items:center TANPA display — bug kecil master yang
   SENGAJA direproduksi. Tombol ini hanya tampil <=1180px, di mana
   .wsp-showsm{display:flex!important} (admin.css:12428) yang menentukan display-nya.
   Jangan "memperbaiki" jadi display:grid — hasil render akan beda dari master. */
.wsp-chat__rback{
  width:28px; height:28px; place-items:center; border-radius:var(--wsp-r8);
  border:0; background:transparent; color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-chat__rback:hover{ background:var(--surface-1) }
.wsp-chat__rava{
  width:32px; height:32px; border-radius:var(--radius-pill);
  background:var(--wsp-ink); color:var(--wsp-on-ink); display:grid; place-items:center;
  font-family:var(--font-mono); font-size:11px; font-weight:700; flex:0 0 auto;
}
.wsp-chat__rava.is-group{ border-radius:var(--wsp-r9) }
.wsp-chat__rmain{ flex:1; min-width:0 }
.wsp-chat__rname{
  display:block; font-family:var(--font-display); font-size:14px; font-weight:700;
  color:var(--text-strong); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp-chat__rmeta{
  display:block; font-size:11px; color:var(--text-subtle); margin-top:1px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.wsp-chat__radd{
  width:30px; height:30px; display:grid; place-items:center; border-radius:var(--wsp-r8);
  border:1px solid var(--border-input); background:var(--surface-0);
  color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-chat__radd:hover{ background:var(--surface-1); color:var(--text-strong) }

/* ---------------- thread bar (master 1949-1953) ---------------- */
.wsp-chat__thbar{
  display:flex; align-items:center; gap:8px; padding:11px 16px;
  border-bottom:1px solid var(--line-100); background:var(--surface-1); flex:0 0 auto;
}
.wsp-chat__thback{
  display:inline-flex; align-items:center; gap:5px; border:0; background:transparent;
  font-family:var(--font-body); font-size:12px; font-weight:600;
  color:var(--text-muted); cursor:pointer; padding:0;
}
.wsp-chat__thback:hover{ color:var(--text-strong) }
.wsp-chat__thback svg{ width:14px; height:14px; flex:0 0 auto }
.wsp-chat__thlabel{
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--text-subtle);
}

/* ---------------- daftar pesan (master 1955-1999) ---------------- */
.wsp-chat__msgs{
  flex:1; overflow-y:auto; padding:14px 16px 16px;
  display:flex; flex-direction:column; gap:9px; background:var(--surface-1);
}
.wsp-chat__day{ display:flex; align-items:center; gap:9px; padding-bottom:2px }
.wsp-chat__dayline{ flex:1; height:1px; background:var(--line-200) }
.wsp-chat__daylabel{
  font-family:var(--font-mono); font-size:9px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--text-subtle);
}
.wsp-chat__msg{ display:flex; flex-direction:column; gap:5px }
.wsp-chat__row{ display:flex; gap:8px; align-items:flex-end }
.wsp-chat__row.is-me{ flex-direction:row-reverse }
.wsp-chat__ava{
  width:26px; height:26px; border-radius:var(--radius-pill);
  background:var(--ink-100); color:var(--ink-600); display:grid; place-items:center;
  font-family:var(--font-mono); font-size:9px; font-weight:700; flex:0 0 auto;
}
.wsp-chat__bub{
  max-width:76%; padding:9px 12px; font-size:12.5px; line-height:1.5;
  background:var(--surface-0); color:var(--text-body);
  border:1px solid var(--line-200); border-radius:var(--wsp-r14) var(--wsp-r14) var(--wsp-r14) var(--wsp-r4);
}
.wsp-chat__bub.is-me{
  background:var(--wsp-ink); color:var(--wsp-on-ink); border:0;
  border-radius:var(--wsp-r14) var(--wsp-r14) var(--wsp-r4) var(--wsp-r14);
}
.wsp-chat__who{
  display:block; font-size:10px; font-weight:700;
  color:var(--text-subtle); margin-bottom:3px;
}
.wsp-chat__mytime{
  display:block; font-size:9.5px; color:var(--wsp-on-ink-50); margin-bottom:3px;
}
/* WAJIB (§8.10): master memakai helmet .ws-rich yang TIDAK punya box style, sedangkan
   .wsp-rich app (admin.css:12390) menyetel min-height:140px/padding untuk editor
   deskripsi F1. Tanpa reset ini SETIAP bubble pesan jadi setinggi 140px. */
.wsp-chat__bub .wsp-rich{
  min-height:0; max-height:none; padding:0; overflow:visible;
  font-size:inherit; line-height:inherit; color:inherit;
}
/* Deviasi terdokumentasi (a11y): di master, .ws-rich a/strong/code memakai
   var(--text-strong) & var(--ink-050) sehingga gelap-di-atas-gelap pada bubble "kamu".
   Di app dipetakan ke kontras ink supaya tetap terbaca. */
.wsp-chat__bub.is-me .wsp-rich a,
.wsp-chat__bub.is-me .wsp-rich b,
.wsp-chat__bub.is-me .wsp-rich strong,
.wsp-chat__bub.is-me .wsp-rich h1,
.wsp-chat__bub.is-me .wsp-rich h2,
.wsp-chat__bub.is-me .wsp-rich h3{ color:var(--wsp-on-ink) }
.wsp-chat__bub.is-me .wsp-rich code{ background:var(--wsp-on-ink-fill-10); color:var(--wsp-on-ink) }
.wsp-chat__bub.is-me .wsp-rich blockquote{ border-left-color:var(--wsp-on-ink-fill); color:var(--wsp-on-ink) }

.wsp-chat__meta{ display:flex; align-items:center; gap:4px; flex-wrap:wrap; padding-left:34px }
.wsp-chat__meta.is-me{ justify-content:flex-end; padding-left:0 }
.wsp-chat__react{
  display:inline-flex; align-items:center; gap:4px; height:22px; padding:0 8px;
  border-radius:var(--radius-pill); cursor:pointer;
  font-family:var(--font-mono); font-size:10px; font-weight:700; flex:0 0 auto;
  background:var(--surface-0); border:1px solid var(--line-200); color:var(--text-muted);
}
.wsp-chat__react.is-mine{                                     /* r.mine — 5550 */
  background:var(--pst-identity-bg); border-color:var(--vs-yellow-shadow); color:var(--wsp-ink);
}
.wsp-chat__react svg{ width:11px; height:11px; flex:0 0 auto }
.wsp-chat__act{
  width:24px; height:24px; display:grid; place-items:center; border-radius:var(--wsp-r7);
  border:0; background:transparent; color:var(--text-subtle); cursor:pointer; flex:0 0 auto;
}
.wsp-chat__act:hover:not(:disabled){ background:var(--ink-050); color:var(--text-strong) }
/* Hapus pesan — aksi merusak, warnanya baru muncul saat hover supaya baris meta tetap tenang. */
.wsp-chat__act--danger:hover:not(:disabled){ background:var(--tag-danger-bg); color:var(--tag-danger-text) }
.wsp-chat__act:disabled{ opacity:.45; cursor:not-allowed }
.wsp-chat__act svg{ width:12px; height:12px }
.wsp-chat__replies{
  display:inline-flex; align-items:center; gap:5px; height:22px; padding:0 9px;
  border-radius:var(--radius-pill);
  border:1px solid var(--pst-blue-border); background:var(--pst-blue-bg);
  font-family:var(--font-body); font-size:10.5px; font-weight:700;
  color:var(--pst-blue-text); cursor:pointer;
}
.wsp-chat__replies:hover{ filter:brightness(.97) }
.wsp-chat__replies svg{ width:11px; height:11px; flex:0 0 auto }
/* empty-state ruang: master tidak punya (data demo selalu terisi). Geometri diambil
   dari satu-satunya empty master di layar ini — rail "Tidak ada hasil." (1887).
   .wsp-empty TIDAK dipakai: scope-nya `.wsp .wsp-empty` (admin.css:11579) tidak
   mencakup .wsp-drawer, jadi kelas itu tak bergaya di dalam panel (§8.9). */
.wsp-chat__msgempty{ padding:6px 9px 8px; font-size:11px; color:var(--text-subtle) }

/* ---------------- composer (master 2001-2019) ---------------- */
.wsp-chat__comp{ padding:11px 16px 14px; border-top:1px solid var(--line-100); flex:0 0 auto }
.wsp-chat__box{
  border:1px solid var(--border-input); border-radius:var(--wsp-r11);
  overflow:hidden; background:var(--surface-0);
}
.wsp-chat__tbar{
  display:flex; flex-wrap:wrap; align-items:center; gap:1px;
  padding:4px 6px; border-bottom:1px solid var(--line-100); background:var(--surface-1);
}
.wsp-chat__tool,
.wsp-chat__mention{
  width:28px; height:28px; display:grid; place-items:center; border-radius:var(--wsp-r7);
  border:0; background:transparent; color:var(--text-muted); cursor:pointer; flex:0 0 auto;
}
.wsp-chat__tool:hover:not(:disabled),
.wsp-chat__mention:hover{ background:var(--ink-050); color:var(--text-strong) }
.wsp-chat__tool:disabled{ opacity:.45; cursor:not-allowed }
.wsp-chat__tool svg, .wsp-chat__mention svg{ width:14px; height:14px }
.wsp-chat__input.wsp-rich{                                    /* override box .wsp-rich editor F1 */
  min-height:56px; max-height:150px; overflow-y:auto;
  padding:10px 12px; font-size:13px; line-height:1.55;
  color:var(--text-body); outline:none;
}
.wsp-chat__acts{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-top:8px }
.wsp-chat__actsleft{
  display:flex; align-items:center; gap:6px; flex-wrap:wrap; flex:1 1 auto; min-width:0;
}
.wsp-chat__pill{
  display:inline-flex; align-items:center; gap:6px; height:29px; padding:0 11px;
  border-radius:var(--radius-pill); border:1px solid var(--border-input);
  background:var(--surface-0); font-family:var(--font-body);
  font-size:11.5px; font-weight:600; color:var(--text-muted);
  cursor:pointer; flex:0 0 auto; white-space:nowrap;
}
.wsp-chat__pill:hover:not(:disabled){ background:var(--surface-1); color:var(--text-strong) }
.wsp-chat__pill:disabled{ opacity:.5; cursor:not-allowed }
.wsp-chat__pill svg{ width:13px; height:13px; flex:0 0 auto }
.wsp-chat__send{
  display:inline-flex; align-items:center; gap:7px; height:34px; padding:0 15px;
  border-radius:var(--wsp-r10); border:0;
  background:var(--wsp-ink); color:var(--wsp-on-ink);
  font-family:var(--font-body); font-size:12.5px; font-weight:700;
  cursor:pointer; flex:0 0 auto; margin-left:auto; white-space:nowrap;
}
.wsp-chat__send:hover:not(:disabled){ background:var(--wsp-ink-hover) }
.wsp-chat__send:disabled{ opacity:.5; cursor:not-allowed }
.wsp-chat__send svg{ width:14px; height:14px; flex:0 0 auto }

/* ---------------- RESPONSIVE — hanya 900 (helmet master 53-57) ------------- */
/* .wsp-hidesm / .wsp-showsm pada 1180 SUDAH ADA (admin.css:12427-12428) dengan scope
   :is(.wsp,.wsp-dlg,.wsp-modal,.wsp-drawer) → .wsp-chat (yang juga .wsp-drawer)
   ikut terlayani. JANGAN menulis ulang.
   Catatan §8.17: 900 dan 1180 memang TIDAK sinkron di master — di antara keduanya
   tombol "kembali ke daftar" sudah tampil padahal rail masih terlihat. Itu perilaku
   master, bukan bug; jangan menambah breakpoint baru untuk merapikannya. */
@media (max-width:900px){
  .wsp-chat__grid{ grid-template-columns:minmax(0,1fr) }
  .wsp-chat__rail[data-hide="1"], .wsp-chat__room[data-hide="1"]{ display:none }
  .wsp-chat__rail{ border-right:0 }
}

@media (prefers-reduced-motion: reduce){
  /* .wsp-chat & .wsp-chat-back TIDAK ditulis ulang di sini: keduanya sudah tercakup
     admin.css:13024 (.wsp-pp, .wsp-drawer, .wsp-drawer-back{animation:none}) karena
     panel ini memang memakai kelas .wsp-drawer / .wsp-drawer-back. Yang benar-benar
     baru hanya FAB. */
  .wsp-chatfab:hover{ transform:none }
}
/* == :END == WORKSPACE-CHAT ========================================== */






/* ------------------------------------------------------------------ */
/* SELFIE PRESENSI — modal capture (hierarki: gerakan = instruksi utama) */
/* ------------------------------------------------------------------ */
/* Sebelumnya body-nya text-align:center dengan dua banner sejajar, sehingga instruksi
   yang HARUS dikerjakan (gerakan liveness) terbaca setara dengan catatan kebijakan,
   dan pesan error menggantung sebagai teks merah di bawah kotak hitam kosong. */
.ws-cap{ text-align:left; }
.ws-cap__steps{ list-style:none; margin:0 0 14px; padding:0; display:flex; flex-direction:column; gap:9px; }
/* Baris komposit: nomor | teks — grid, bukan flex (aturan baris komposit). */
.ws-cap__step{ display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:10px;
  font-size:13px; line-height:1.5; color:var(--ink); }
.ws-cap__num{ width:22px; height:22px; border-radius:var(--radius-pill); display:grid; place-items:center;
  background:var(--vs-black); color:#fff; font-family:var(--font-mono); font-size:11px; font-weight:700; }
.ws-cap__txt{ min-width:0; padding-top:1px; }
.ws-cap__move{ display:inline-block; padding:1px 8px; border-radius:var(--radius-pill);
  background:var(--pst-warning-bg); color:var(--pst-warning-text); font-weight:700; letter-spacing:.01em; }
.ws-cap__stage{ position:relative; width:100%; max-width:360px; margin:0 auto; aspect-ratio:3/4;
  border-radius:var(--radius-md); overflow:hidden; background:var(--ink-950); }
.ws-cap__vid{ width:100%; height:100%; object-fit:cover; display:block; }
/* Error mengambil alih bingkai kamera — tak ada lagi kotak hitam kosong tanpa penjelasan. */
.ws-cap__err{ position:absolute; inset:0; display:flex; flex-direction:column; align-items:center;
  justify-content:center; gap:8px; padding:22px; text-align:center; font-size:12.5px; line-height:1.55;
  background:var(--pst-danger-bg); color:var(--pst-danger-text); }
.ws-cap__err[hidden]{ display:none; }
.ws-cap__err svg{ width:26px; height:26px; }
.ws-cap__foot{ display:flex; align-items:flex-start; gap:7px; margin:12px 0 0;
  font-size:11.5px; line-height:1.5; color:var(--muted); }
.ws-cap__foot svg{ flex:none; margin-top:2px; }

/* == WORKSPACE POST-PRO V2 · Fulfillment Control (ADR 12.63) ========== */
.wp2-shell{
  display:flex; flex-direction:column; gap:var(--space-6); min-width:0;
  max-width:calc(var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14));
  margin-inline:auto; padding:var(--space-7);
}
.wp2-head,.wp2-head__actions,.wp2-toolbar,.wp2-tabs,.wp2-pager,.wp2-pager>span,.wp2-vendor>header,.wp2-detailsection>header,.wp2-batch__head,.wp2-drawer>header,.wp2-drawer__actions{
  display:flex; align-items:center;
}
.wp2-head{ gap:var(--space-5); justify-content:space-between; }
.wp2-head>span:first-child,.wp2-detailsection header>span,.wp2-vendor header>span{ min-width:0; }
.wp2-head small,.wp2-vendor small,.wp2-detailsection header small,.wp2-drawer>header small,.wp2-drawer__actions small{
  display:block; font-family:var(--font-mono); font-size:var(--text-2xs); letter-spacing:var(--ls-label); color:var(--text-subtle);
}
.wp2-head h2{ margin:var(--space-1) 0; font-family:var(--font-display); font-size:var(--text-h2); line-height:var(--lh-snug); color:var(--text-strong); }
.wp2-head p{ margin:0; color:var(--text-muted); font-size:var(--text-xs); }
.wp2-head__actions{ gap:var(--space-3); flex-wrap:wrap; justify-content:flex-end; }
.wp2-metrics{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:var(--space-3); }
.wp2-metric{ display:flex; align-items:flex-start; gap:var(--space-3); padding:var(--space-4); border:thin solid var(--border-default); border-radius:var(--radius-md); background:var(--surface-0); box-shadow:var(--shadow-xs); }
.wp2-metric__icon,.wp2-typeicon{ display:grid; place-items:center; flex:0 0 auto; color:var(--text-muted); background:var(--surface-1); border-radius:var(--radius-sm); }
.wp2-metric__icon{ width:var(--space-8); height:var(--space-8); }
.wp2-typeicon{ width:var(--space-7); height:var(--space-7); }
.wp2-metric>span:last-child{ display:grid; min-width:0; }
.wp2-metric small,.wp2-metric em{ color:var(--text-subtle); font-size:var(--text-2xs); font-style:normal; }
.wp2-metric strong{ color:var(--text-strong); font-family:var(--font-mono); font-size:var(--text-h4); line-height:var(--lh-snug); }
.wp2-tabs{ gap:var(--space-2); overflow-x:auto; padding-bottom:var(--space-1); }
.wp2-tab{ display:inline-flex; align-items:center; gap:var(--space-2); min-height:var(--space-8); padding:0 var(--space-4); border:thin solid var(--border-default); border-radius:var(--radius-pill); background:var(--surface-0); color:var(--text-muted); text-decoration:none; white-space:nowrap; font-size:var(--text-2xs); font-weight:var(--fw-semibold); }
.wp2-tab:hover{ background:var(--surface-1); color:var(--text-strong); }
.wp2-tab.is-on{ background:var(--wsp-ink); border-color:var(--wsp-ink); color:var(--wsp-on-ink); }
.wp2-tab b{ min-width:var(--space-5); text-align:center; font-family:var(--font-mono); font-size:var(--text-2xs); }
.wp2-grid{ overflow:hidden; border:thin solid var(--border-default); border-radius:var(--radius-md); background:var(--surface-0); box-shadow:var(--shadow-card); }
.wp2-toolbar{ gap:var(--space-3); min-height:var(--space-10); padding:var(--space-3) var(--space-4); border-bottom:thin solid var(--border-default); background:var(--surface-0); }
.wp2-search{ display:flex; align-items:center; gap:var(--space-2); flex:1 1 var(--space-14); min-width:min(100%,var(--space-14)); min-height:var(--space-8); padding:0 var(--space-3); border:thin solid var(--border-input); border-radius:var(--radius-sm); color:var(--text-subtle); background:var(--surface-0); }
.wp2-search:focus-within{ border-color:var(--border-strong); box-shadow:var(--shadow-focus); }
.wp2-search input{ width:100%; border:0; outline:0; background:transparent; color:var(--text-body); font:inherit; font-size:var(--text-xs); }
.wp2-select{ display:flex; align-items:center; gap:var(--space-2); color:var(--text-subtle); font-size:var(--text-2xs); }
.wp2-select select{ min-height:var(--space-8); padding:0 var(--space-6) 0 var(--space-3); border:thin solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-body); font:inherit; font-size:var(--text-xs); }
.wp2-result{ margin-left:auto; color:var(--text-subtle); font-family:var(--font-mono); font-size:var(--text-2xs); white-space:nowrap; }
.wp2-table{ overflow-x:auto; }
.wp2-row{ display:grid; grid-template-columns:minmax(var(--space-14),1.05fr) minmax(var(--space-14),1.2fr) minmax(var(--space-14),1.2fr) minmax(var(--space-12),.9fr) minmax(var(--space-11),.72fr) minmax(var(--space-12),.9fr) minmax(var(--space-12),.85fr); align-items:center; min-width:calc(var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14) + var(--space-12)); border-bottom:thin solid var(--border-default); }
.wp2-row--head{ min-height:var(--space-9); background:var(--surface-1); color:var(--text-subtle); font-family:var(--font-mono); font-size:var(--text-2xs); letter-spacing:var(--ls-label-sm); text-transform:uppercase; }
.wp2-row--head>span,.wp2-cell{ min-width:0; padding:var(--space-3) var(--space-4); }
.wp2-row:not(.wp2-row--head):hover{ background:var(--surface-1); }
.wp2-cell{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--space-2); font-size:var(--text-xs); }
.wp2-work button{ display:flex; align-items:center; gap:var(--space-3); min-width:0; padding:0; border:0; background:transparent; color:inherit; text-align:left; font:inherit; cursor:pointer; }
.wp2-work button:hover strong{ text-decoration:underline; text-underline-offset:var(--space-1); }
.wp2-stack{ display:flex; flex-direction:column; gap:var(--space-1); min-width:0; }
.wp2-stack strong{ overflow:hidden; color:var(--text-strong); font-size:var(--text-xs); font-weight:var(--fw-semibold); text-overflow:ellipsis; white-space:nowrap; }
.wp2-stack small,.wp2-muted,.wp2-due small{ display:block; color:var(--text-subtle); font-size:var(--text-2xs); line-height:var(--lh-normal); }
.wp2-cell--block .wsp-tag,.wp2-cell--action button{ max-width:100%; }
.wp2-cell--action{ align-items:stretch; }
.wp2-due{ display:grid; gap:var(--space-1); }
.wp2-due strong{ font-family:var(--font-mono); font-size:var(--text-2xs); color:var(--text-strong); }
.wp2-due.is-late strong{ color:var(--pst-danger-text); }
.wp2-empty{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--space-2); min-height:calc(var(--space-14) + var(--space-8)); padding:var(--space-7); color:var(--text-subtle); text-align:center; }
.wp2-empty strong{ color:var(--text-strong); font-size:var(--text-sm); }
.wp2-empty span{ max-width:calc(var(--space-14) + var(--space-14) + var(--space-8)); font-size:var(--text-xs); }
.wp2-pager{ justify-content:space-between; gap:var(--space-3); min-height:var(--space-10); padding:var(--space-3) var(--space-4); color:var(--text-subtle); font-family:var(--font-mono); font-size:var(--text-2xs); }
.wp2-pager>span{ gap:var(--space-3); }
.wp2-pager button:disabled{ opacity:.45; cursor:not-allowed; }
.wp2-vendor{ display:grid; gap:var(--space-4); }
.wp2-vendor>header{ justify-content:space-between; gap:var(--space-4); }
.wp2-vendor h3,.wp2-detailsection h3{ margin:var(--space-1) 0 0; color:var(--text-strong); font-size:var(--text-sm); }
.wp2-vendor>div{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--space-3); }
.wp2-batch{ display:grid; gap:var(--space-3); padding:var(--space-4); border:thin solid var(--border-default); border-radius:var(--radius-md); background:var(--surface-0); }
.wp2-batch__head{ justify-content:space-between; gap:var(--space-3); }
.wp2-batch h3,.wp2-batch p{ margin:0; }
.wp2-batch h3{ font-size:var(--text-sm); color:var(--text-strong); }
.wp2-batch p{ font-size:var(--text-2xs); color:var(--text-subtle); }
.wp2-batch button{ justify-self:start; }
.wp2-back{ position:fixed; inset:0; z-index:1200; border:0; background:var(--wsp-scrim); }
.wp2-drawer{ position:fixed; z-index:1201; inset-block:0; right:0; display:flex; flex-direction:column; width:min(100%,calc(var(--space-14) + var(--space-14) + var(--space-14) + var(--space-14))); overflow:hidden; background:var(--surface-0); box-shadow:var(--shadow-pop); }
.wp2-drawer>header{ gap:var(--space-3); min-height:var(--space-10); padding:var(--space-4) var(--space-5); border-bottom:thin solid var(--border-default); }
.wp2-drawer>header>span:nth-child(2){ flex:1; min-width:0; }
.wp2-drawer>header h2{ margin:var(--space-1) 0 0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--text-strong); font-size:var(--text-h4); }
.wp2-drawer__body{ flex:1; overflow-y:auto; padding:var(--space-5); }
.wp2-drawer__loading{ min-height:calc(var(--space-14) + var(--space-14)); }
.wp2-path{ display:grid; grid-template-columns:repeat(auto-fit,minmax(var(--space-11),1fr)); gap:var(--space-2); margin-bottom:var(--space-4); }
.wp2-path>span{ position:relative; display:grid; justify-items:center; gap:var(--space-1); padding:var(--space-3) var(--space-2); border:thin solid var(--border-default); border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-subtle); text-align:center; }
.wp2-path i{ display:grid; place-items:center; width:var(--space-7); height:var(--space-7); border-radius:var(--radius-pill); background:var(--surface-0); }
.wp2-path b{ font-size:var(--text-2xs); color:var(--text-body); }
.wp2-path small{ font-size:var(--text-2xs); }
.wp2-path .is-done{ border-color:var(--pst-success-border); background:var(--pst-success-bg); color:var(--pst-success-text); }
.wp2-path .is-on{ border-color:var(--pst-blue-border); background:var(--pst-blue-bg); color:var(--pst-blue-text); }
.wp2-path .is-blocked{ border-color:var(--pst-warning-border); background:var(--pst-warning-bg); color:var(--pst-warning-text); }
.wp2-alert{ display:flex; align-items:flex-start; gap:var(--space-3); margin-bottom:var(--space-4); padding:var(--space-4); border:thin solid var(--pst-warning-border); border-radius:var(--radius-sm); background:var(--pst-warning-bg); color:var(--pst-warning-text); }
.wp2-alert.is-ok{ border-color:var(--pst-success-border); background:var(--pst-success-bg); color:var(--pst-success-text); }
.wp2-alert>span{ display:grid; gap:var(--space-1); }
.wp2-alert strong{ font-size:var(--text-xs); }
.wp2-alert small{ font-size:var(--text-2xs); line-height:var(--lh-normal); }
.wp2-detailgrid{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-2); margin-bottom:var(--space-4); }
.wp2-detailgrid>div{ display:grid; gap:var(--space-1); min-width:0; padding:var(--space-3); border:thin solid var(--border-default); border-radius:var(--radius-sm); }
.wp2-detailgrid small{ color:var(--text-subtle); font-size:var(--text-2xs); }
.wp2-detailgrid strong{ overflow:hidden; color:var(--text-strong); font-size:var(--text-xs); text-overflow:ellipsis; white-space:nowrap; }
.wp2-detailsection{ display:grid; gap:var(--space-3); padding:var(--space-4) 0; border-top:thin solid var(--border-default); }
.wp2-detailsection>header{ justify-content:space-between; gap:var(--space-3); }
.wp2-detailsection>p{ margin:0; color:var(--text-muted); font-size:var(--text-xs); }
.wp2-deps,.wp2-activity{ display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
.wp2-deps li,.wp2-files a{ display:flex; justify-content:space-between; align-items:center; gap:var(--space-3); padding:var(--space-3); border:thin solid var(--border-default); border-radius:var(--radius-sm); color:var(--text-body); text-decoration:none; }
.wp2-deps li>span,.wp2-files a>span{ display:flex; align-items:center; gap:var(--space-2); min-width:0; }
.wp2-deps b,.wp2-files b{ font-size:var(--text-xs); }
.wp2-deps small,.wp2-files small{ color:var(--text-subtle); font-size:var(--text-2xs); text-align:right; }
.wp2-files{ display:grid; gap:var(--space-2); }
.wp2-files a:hover{ background:var(--surface-1); }
.wp2-minempty{ padding:var(--space-4); border:thin dashed var(--border-default); border-radius:var(--radius-sm); color:var(--text-subtle); font-size:var(--text-xs); text-align:center; }
.wp2-activity li{ display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); align-items:start; }
.wp2-activity i{ width:var(--space-2); height:var(--space-2); margin-top:var(--space-2); border-radius:var(--radius-pill); background:var(--text-subtle); }
.wp2-activity span{ display:grid; gap:var(--space-1); }
.wp2-activity b{ color:var(--text-body); font-size:var(--text-xs); font-weight:var(--fw-semibold); text-transform:capitalize; }
.wp2-activity small{ color:var(--text-subtle); font-size:var(--text-2xs); line-height:var(--lh-normal); }
.wp2-drawer__actions{ position:sticky; bottom:0; justify-content:flex-end; gap:var(--space-3); margin:var(--space-5) calc(var(--space-1) - var(--space-1) - var(--space-5)) calc(var(--space-1) - var(--space-1) - var(--space-5)); padding:var(--space-4) var(--space-5) calc(var(--space-4) + env(safe-area-inset-bottom)); border-top:thin solid var(--border-default); background:var(--surface-0); }
.wp2-drawer__actions>span{ display:grid; gap:var(--space-1); flex:1; min-width:0; }
.wp2-drawer__actions strong{ color:var(--text-body); font-size:var(--text-2xs); line-height:var(--lh-normal); }
@media (max-width:1180px){
  .wp2-metrics{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .wp2-vendor>div{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:900px){
  .wp2-shell{ padding:var(--space-5) var(--space-4); }
  .wp2-head{ align-items:flex-start; flex-direction:column; }
  .wp2-head__actions{ width:100%; justify-content:flex-start; }
  .wp2-toolbar{ align-items:stretch; flex-wrap:wrap; }
  .wp2-search{ flex-basis:100%; }
  .wp2-result{ align-self:center; }
  .wp2-vendor>div{ grid-template-columns:minmax(0,1fr); }
  .wp2-drawer{ width:100%; }
}
@media (max-width:640px){
  .wp2-shell{ gap:var(--space-4); padding:var(--space-4) var(--space-3) calc(var(--space-14) + env(safe-area-inset-bottom)); }
  .wp2-head__actions{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); }
  .wp2-head__actions .wsp-btn{ justify-content:center; width:100%; }
  .wp2-metrics{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .wp2-metric{ padding:var(--space-3); }
  .wp2-toolbar{ padding:var(--space-3); }
  .wp2-table{ overflow-x:visible; }
  .wp2-row--head{ display:none; }
  .wp2-row:not(.wp2-row--head){ grid-template-columns:repeat(2,minmax(0,1fr)); min-width:0; padding:var(--space-3) 0; }
  .wp2-row:not(.wp2-row--head) .wp2-cell{ align-self:stretch; padding:var(--space-2) var(--space-3); }
  .wp2-row:not(.wp2-row--head) .wp2-cell::before{ content:attr(data-label); color:var(--text-subtle); font-family:var(--font-mono); font-size:var(--text-2xs); letter-spacing:var(--ls-label-sm); text-transform:uppercase; }
  .wp2-row:not(.wp2-row--head) .wp2-work,
  .wp2-row:not(.wp2-row--head) .wp2-cell:nth-child(2),
  .wp2-row:not(.wp2-row--head) .wp2-cell--action{ grid-column:1 / -1; }
  .wp2-row:not(.wp2-row--head) .wp2-work{ padding-bottom:var(--space-3); border-bottom:thin solid var(--border-default); }
  .wp2-row:not(.wp2-row--head) .wp2-work::before{ display:none; }
  .wp2-cell--action .wsp-btn{ justify-content:center; width:100%; }
  .wp2-pager{ padding:var(--space-3); }
  .wp2-vendor>header{ align-items:flex-start; }
  .wp2-detailgrid{ grid-template-columns:minmax(0,1fr); }
  .wp2-path{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .wp2-drawer__actions{ align-items:stretch; flex-direction:column; }
  .wp2-drawer__actions .wsp-btn{ justify-content:center; width:100%; }
}
@media (prefers-reduced-motion:reduce){ .wp2-back,.wp2-drawer{ animation:none; } }
/* == :END == WORKSPACE POST-PRO V2 ================================ */

/* ============================================================
   COMPOSER JADWAL (bc-*) — Brief Finalisasi Composer/Drawer/POS 2026-08-05 §Phase 2.A
   Memakai ulang anatomi composer Schedule (.sched-composer-*), chip klien
   (.sched-edit-clientchip), combobox DS (.vs-combo*), segmented tab (.vs-tabs*)
   dan tag (.vs-tag*) — tidak ada pola baru yang dikarang.

   DIHAPUS di pass ini bersama markup-nya: .bc-session__head, .bc-items,
   .bc-additem, .bc-line* (baris item + qty + nominal + subtotal) dan .bc-quote.
   Composer tidak memuat item katalog, diskon, atau multi-sesi. Pengecualian
   terkontrol hanya `Bypass session`: satu harga penyesuaian yang oleh server
   dibukukan sebagai Transaksi bertanggal dan masuk antrean review Super Admin.

   Sisa di sini hanya pelebaran dialog + dua wadah: kolom body dan baris chip
   resource. Keduanya memakai token spacing yang sudah ada.
   ============================================================ */
.modal-center.sched-composer-dialog.bc-dialog { max-width:var(--container-sm); }
/* Head & foot tidak boleh menyusut: modal ini flex-column, dan tanpa flex:none
   subtitle dua baris terpotong lalu menyelinap di bawah body yang bisa di-scroll
   (terlihat jelas pada 390px). Body-lah yang menyerap sisa tinggi. */
.bc-dialog .mc-head, .bc-dialog .mc-foot { flex:none; }
.bc-dialog .mc-head > div { min-width:0; }
.bc-dialog .mc-body { flex:1 1 auto; min-height:0; }
.bc-body { display:flex; flex-direction:column; gap:var(--space-4); }
/* Baris waktu composer punya EMPAT kolom (tanggal · mulai · selesai · durasi);
   anatomi .sched-time-row aslinya tiga. Kolom keempat mengikuti lebar kolom jam
   supaya tidak melebar sendiri, dan barisnya membungkus pada layar sempit
   (flex-wrap = penyesuaian intrinsik, tidak ada breakpoint). */
.bc-body .sched-time-row { flex-wrap:wrap; }
.bc-body .sched-time-row > .frow:nth-child(4) { flex:1 1 0; }
/* Segmented "Pelanggan terdaftar / Pelanggan baru" dibaca sebagai SATU kontrol:
   kedua segmen berbagi lebar, bukan menggantung di kiri. */
.bc-body .vs-tabs--segmented .vs-tab { flex:1 1 0; min-width:0; }
/* Chip multi-pilih (peralatan / ruang rias). Baris komposit → wrap, bukan overflow. */
/* ── Kantong sesi composer ───────────────────────────────────────────────────
   F-31 — garis warna sisi kiri pada kartu pertama DICABUT (aturan owner: warna
   status hanya di fill kategori, baris item polos). Rasionalnya juga sudah mati
   dua kali: `--brand-500` tidak pernah didefinisikan di mana pun, jadi garis itu
   selalu var(--ink-900) hitam — bukan aksen brand seperti yang dijanjikan
   komentar lama; dan composer hanya pernah merender SATU kartu (`SESSIONS`
   dideklarasikan sebagai array satu elemen, nol `push`), sehingga `:first-child`
   tidak pernah membedakan Parent dari Child.

   F-39 — dihapus bersama blok ini karena markupnya tidak ada (0 pemakai di
   js/html/php, diverifikasi grep): .bc-ses__head, .bc-ses__tag, .bc-ses__del,
   dan seluruh keluarga .tx-ses-* (peninggalan modal Transaksi yang dicabut saat
   komposisi pindah ke POS). */
.bc-ses { border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-md,10px);
  padding:var(--space-4); margin-bottom:var(--space-4); background:var(--surface-1,var(--paper)); }
.bc-ses:last-of-type { margin-bottom:var(--space-3); }
.bc-ses-extras { margin-top:var(--space-3); padding-top:var(--space-3);
  border-top:1px dashed var(--line-200,var(--line)); }
.bc-chips { display:flex; flex-wrap:wrap; gap:var(--space-3); }
.bc-chips .vs-tag { cursor:pointer; }
.bc-chips .vs-tag:focus-visible { outline:none; box-shadow:var(--shadow-focus); }

/* GUI/03/CHECKBOX-RADIO-SWITCH — anatomi Switch master, dipasang satu kali di
   runtime admin karena bundel vanilla ini tidak mengimpor primitive React. */
.vs-switch { display:inline-flex; align-items:center; gap:11px; font-family:var(--font-body); cursor:pointer; user-select:none; }
.vs-switch--disabled { cursor:not-allowed; opacity:.5; }
.vs-switch input { position:absolute; opacity:0; width:0; height:0; }
.vs-switch__track { position:relative; flex:0 0 auto; width:42px; height:24px; border-radius:var(--radius-pill); background:var(--ink-200); transition:background .18s ease; }
.vs-switch__thumb { position:absolute; top:2px; left:2px; width:20px; height:20px; border-radius:var(--radius-pill); background:var(--surface-0); box-shadow:var(--shadow-xs); transition:transform .18s var(--ease); }
.vs-switch input:checked + .vs-switch__track { background:var(--primary); }
.vs-switch input:checked + .vs-switch__track .vs-switch__thumb { transform:translateX(18px); }
.vs-switch--brand input:checked + .vs-switch__track { background:var(--brand); }
.vs-switch input:focus-visible + .vs-switch__track { box-shadow:var(--shadow-focus); }
.vs-switch__label { color:var(--text-strong); font-size:var(--text-sm); font-weight:600; }

/* GUI/21/APPROVAL-REQUIRED di composer: switch sebagai header, lalu panel detail
   yang hanya hidup saat ON. Seluruh warna/spacing memakai token master. */
.bc-bypass-head { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-4); }
.bc-bypass-copy { display:flex; flex-direction:column; gap:var(--space-1); min-width:0; }
.bc-bypass-copy small { color:var(--text-subtle); line-height:1.5; }
.bc-bypass-fields { display:flex; flex-direction:column; gap:var(--space-4); padding-top:var(--space-4); border-top:1px solid var(--line-100); }
.bc-bypass-fields[hidden] { display:none; }
.bc-bypass-money { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:stretch; }
.bc-bypass-money > span { display:flex; align-items:center; padding:0 var(--space-4); border:1px solid var(--border-input); border-right:0; border-radius:var(--radius-sm) 0 0 var(--radius-sm); background:var(--surface-1); color:var(--text-subtle); font-family:var(--font-mono); font-size:var(--text-xs); }
.bc-bypass-money .ctrl { border-radius:0 var(--radius-sm) var(--radius-sm) 0; }

/* WSP/11/REQUEST + WSP/11/DECISION — antrean review bypass. */
.sbq-summary { display:flex; align-items:center; justify-content:space-between; gap:var(--space-4); flex-wrap:wrap; margin-bottom:var(--space-4); }
.sbq-list { display:flex; flex-direction:column; gap:var(--space-3); }
.sbq-card { display:grid; grid-template-columns:var(--space-1) minmax(0,1fr) auto auto; align-items:center; gap:var(--space-4); padding:var(--space-4); border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); }
.sbq-rule { align-self:stretch; border-radius:var(--radius-pill); background:var(--accent-orange); }
.sbq-main { min-width:0; }
.sbq-main b { display:block; overflow:hidden; color:var(--text-strong); text-overflow:ellipsis; white-space:nowrap; }
.sbq-meta { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; margin-top:var(--space-1); color:var(--text-subtle); font-size:var(--text-xs); }
.sbq-amount { color:var(--text-strong); font-family:var(--font-mono); font-weight:700; white-space:nowrap; }
.sbq-actions { display:flex; align-items:center; gap:var(--space-2); }
@media (max-width:760px) {
  .sbq-card { grid-template-columns:var(--space-1) minmax(0,1fr); }
  .sbq-amount,.sbq-actions { grid-column:2; }
  .sbq-actions { flex-wrap:wrap; }
}

/* ============================================================
   MEDIA LIBRARY (Brief 12.64) — #/settings/media
   Reproduksi anatomi unit 12.04.02:
     · GUI/06/FILE-MANAGER  → .ml-fm*      (head kicker+judul+count, switcher list/grid,
                                            baris grid 30px|1fr|90px|80px|60px|32px, tile)
     · GUI/08/BREADCRUMB    → .vs-crumb*    (separator ink-300, crumb terakhir MONO)
     · GUI/12/TOOLBAR       → .ml-tools*    (search shell, dropdown+popover, count pill,
                                            FILTER AKTIF, hairline, "Hasil — n dari m")
     · GUI/11/DATA-GRID     → .ml-bulk, kolom seleksi 17px, .vg-* (dipakai apa adanya)
     · GUI/13/METADATA      → .ml-meta*     (grid 118px|1fr, key mono uppercase)
     · GUI/03/FILE-UPLOAD   → .vs-upl*      (dipakai apa adanya, tidak diduplikasi)
     · GUI/09/EMPTY-STATE   → .dash-state   (dipakai apa adanya)
     · GUI/07/TABLE-PAGINATION → .db-pager  (dipakai apa adanya)

   DUA PENYIMPANGAN SADAR dari master (butuh keputusan owner bila mau dikembalikan):
   1) Kolom seleksi. FILE-MANAGER tidak punya kolom pilih; Media Library butuh aksi
      massal. Kolom checkbox 17px diambil UTUH dari GUI/11/DATA-GRID (:1485) dan
      diletakkan sebagai kolom pertama — brief 12.64 memang mengizinkan anatomi
      DATA-GRID untuk list padat.
   2) Selection bar. Bulk bar DATA-GRID (:1436) memakai 4 nilai TANPA token:
      #F0E900 (hover kuning), #FFB4C4 (teks danger di atas ink), dan rgba putih
      .25/.1/.12/.7. Nilai itu TIDAK dikarang di sini. Bar memakai inversi bertoken
      (--ink-900 / --text-on-dark / --text-on-dark-muted). Tombol "Konfirmasi" kuning
      dan "Hapus" merah muda memang tidak ada di bar Media (brief: aksi destruktif
      dilarang jadi CTA utama), jadi tak ada elemen master yang hilang.

   Grid tile memakai auto-fill/minmax, bukan repeat(4,1fr) master: source design system
   tidak mendefinisikan @media breakpoint, jadi kolom harus intrinsik. Pada lebar kartu
   master hasilnya tetap 4 kolom.
   ============================================================ */

/* ---- Shell dua kolom (folder tree | area utama) ---- */
.ml-wrap { display:grid; grid-template-columns:232px minmax(0,1fr); gap:16px; align-items:start; }
.ml-col { display:flex; flex-direction:column; gap:14px; min-width:0; }
.ml-side { position:sticky; top:12px; }
@media (max-width:920px) {
  .ml-wrap { grid-template-columns:minmax(0,1fr); }
  .ml-side { display:none; }
  .ml-side.is-sheet { display:flex; position:static; }
}
.ml-sidebtn { display:none; }
@media (max-width:920px) { .ml-sidebtn { display:inline-flex; } }

/* ---- Kartu unit (anatomi kartu master: surface-0 · line-200 · r14 · shadow-card · p24) ---- */
.ml-card { display:flex; flex-direction:column; gap:14px; padding:var(--space-7); background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-card); min-width:0; }
.ml-card--tools { gap:16px; }
.ml-kicker { color:var(--text-subtle); font:400 11px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; }
.ml-title { color:var(--text-strong); font:700 17px var(--font-display); }
.ml-title i { font-style:normal; margin-left:6px; color:var(--text-subtle); font:400 12px var(--font-mono); }
.ml-hairline { height:1px; background:var(--line-100); }

/* ---- BREADCRUMB (GUI/08) — dibangun baru, belum ada port di app ---- */
.vs-crumb { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:13px; min-width:0; }
.vs-crumb a, .vs-crumb button.vs-crumb__l { border:0; background:transparent; padding:0; color:var(--text-muted); font:inherit; cursor:pointer; text-decoration:none; }
.vs-crumb a:hover, .vs-crumb button.vs-crumb__l:hover { color:var(--text-strong); }
.vs-crumb__sep { flex:0 0 auto; color:var(--ink-300); display:inline-flex; }
.vs-crumb__cur { font-family:var(--font-mono); font-size:12.5px; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }

/* ---- TOOLBAR (GUI/12) ---- */
.ml-tools__row { display:flex; align-items:center; gap:10px; flex-wrap:wrap; min-width:0; }
.ml-search { display:flex; align-items:center; gap:8px; flex:1 1 auto; min-width:240px; height:38px; padding:0 12px; background:var(--surface-0); border:1px solid var(--border-input); border-radius:var(--radius-sm); }
.ml-search:focus-within { border-color:var(--ink-900); box-shadow:var(--shadow-focus); }
.ml-search > svg { flex:0 0 auto; color:var(--ink-400); }
.ml-search input { flex:1; min-width:0; border:0; outline:none; background:transparent; color:var(--text-strong); font:400 13.5px var(--font-body); }
.ml-search input::placeholder { color:var(--text-subtle); }
.ml-drop { position:relative; min-width:0; }
.ml-drop__btn { display:inline-flex; align-items:center; gap:8px; height:38px; padding:0 12px; background:var(--surface-0); border:1px solid var(--border-input); border-radius:var(--radius-sm); color:var(--text-body); font:500 13px var(--font-body); cursor:pointer; white-space:nowrap; }
.ml-drop__btn:hover { background:var(--surface-1); }
.ml-drop__btn:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.ml-drop__n { display:inline-flex; align-items:center; justify-content:center; min-width:18px; height:18px; padding:0 5px; background:var(--ink-900); color:var(--text-on-dark); border-radius:var(--radius-pill); font:400 10.5px var(--font-mono); }
.ml-drop__pop { position:absolute; top:calc(100% + 6px); left:0; z-index:30; display:flex; flex-direction:column; min-width:212px; max-height:280px; overflow:auto; padding:5px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-sm); box-shadow:var(--shadow-pop); }
.ml-drop__pop--r { left:auto; right:0; }
.ml-drop__ttl { padding:7px 10px 5px; color:var(--text-subtle); font:400 10px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.ml-drop__opt { display:flex; align-items:center; gap:9px; width:100%; min-height:36px; padding:8px 10px; border:0; border-radius:var(--radius-xs); background:transparent; color:var(--text-body); font:400 13px var(--font-body); text-align:left; cursor:pointer; }
.ml-drop__opt:hover, .ml-drop__opt:focus-visible { background:var(--surface-1); outline:none; }
.ml-drop__opt > span:nth-child(2) { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; }
.ml-drop__cnt { color:var(--text-subtle); font:400 11px var(--font-mono); }
.ml-drop__chk { display:inline-flex; align-items:center; justify-content:center; width:14px; flex:0 0 auto; color:var(--ink-900); }
.ml-cbx { display:inline-flex; align-items:center; justify-content:center; width:15px; height:15px; flex:0 0 auto; border:1.5px solid var(--border-input); border-radius:4px; background:var(--surface-0); color:var(--text-on-dark); transition:background .12s ease, border-color .12s ease; }
.ml-cbx.is-on { background:var(--ink-900); border-color:var(--ink-900); }
.ml-reset { display:inline-flex; align-items:center; gap:6px; height:38px; padding:0 12px; border:0; border-radius:var(--radius-sm); background:transparent; color:var(--text-muted); font:600 13px var(--font-body); cursor:pointer; }
.ml-reset:hover { background:var(--surface-1); color:var(--text-strong); }
.ml-label { color:var(--text-subtle); font:400 10.5px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.ml-tags { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.ml-tags__clear { border:0; background:transparent; padding:2px 4px; color:var(--text-muted); font:600 12px var(--font-body); text-decoration:underline; cursor:pointer; }
.ml-result { display:flex; align-items:center; justify-content:space-between; gap:10px; }
.ml-result__n { color:var(--text-subtle); font:400 11px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }

/* ---- FILE MANAGER (GUI/06) ---- */
.ml-fm__head { display:flex; align-items:center; gap:12px; min-width:0; }
.ml-fm__titles { display:flex; flex-direction:column; gap:2px; flex:1; min-width:0; }
.ml-fm__switch { display:inline-flex; gap:2px; flex:0 0 auto; padding:3px; background:var(--ink-050); border:1px solid var(--line-100); border-radius:var(--radius-sm); }
.ml-fm__switch button { display:inline-flex; align-items:center; justify-content:center; width:38px; height:30px; border:0; border-radius:8px; background:transparent; color:var(--text-subtle); cursor:pointer; transition:background .15s ease, color .15s ease, box-shadow .15s ease; }
.ml-fm__switch button:hover { color:var(--text-strong); }
.ml-fm__switch button[aria-pressed="true"] { background:var(--surface-0); color:var(--text-strong); box-shadow:var(--shadow-xs); }
.ml-fm__switch button:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.ml-fm__list { display:flex; flex-direction:column; min-width:0; }
/* Kolom pilih 17px (GUI/11) + 6 kolom FILE-MANAGER. Baris header & baris isi WAJIB identik. */
.ml-fm__hrow, .ml-fm__row { display:grid; grid-template-columns:26px 30px minmax(0,1fr) 90px 80px 60px 32px; gap:10px; align-items:center; min-width:0; }
.ml-fm__hrow { padding:8px 10px; border-bottom:1px solid var(--line-200); }
.ml-fm__hcell { color:var(--text-subtle); font:400 10.5px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; }
.ml-fm__hcell--r { text-align:right; }
.ml-fm__row { padding:11px 10px; border-bottom:1px solid var(--line-100); border-radius:8px; cursor:pointer; background:transparent; text-align:left; border-left:0; border-right:0; border-top:0; width:100%; font:inherit; color:inherit; transition:background .12s ease; }
.ml-fm__row:hover, .ml-fm__row:focus-visible { background:var(--surface-1); outline:none; }
.ml-fm__row.is-sel { background:var(--surface-1); }
.ml-fm__row.is-active { background:var(--ink-050); }
.ml-fm__pick { display:inline-flex; align-items:center; justify-content:center; width:17px; height:17px; padding:0; border:1.5px solid var(--border-input); border-radius:5px; background:var(--surface-0); color:var(--text-on-dark); cursor:pointer; transition:background .12s ease, border-color .12s ease; }
.ml-fm__pick.is-on { background:var(--ink-900); border-color:var(--ink-900); }
.ml-fm__ic { display:flex; align-items:center; justify-content:center; width:30px; height:30px; overflow:hidden; border-radius:var(--radius-xs); background:var(--surface-1); color:var(--text-muted); }
.ml-fm__ic img { width:30px; height:30px; object-fit:cover; }
.ml-fm__name { display:flex; flex-direction:column; min-width:0; }
.ml-fm__name b { font-weight:400; font-size:13.5px; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ml-fm__name span { font-size:11.5px; color:var(--text-subtle); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ml-fm__meta { color:var(--text-subtle); font:400 11.5px var(--font-mono); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ml-fm__size { color:var(--text-muted); font:400 11.5px var(--font-mono); text-align:right; font-variant-numeric:tabular-nums; }
.ml-fm__date { color:var(--text-subtle); font:400 11.5px var(--font-mono); text-align:right; }
.ml-fm__kebab { display:inline-flex; align-items:center; justify-content:center; padding:4px; border:0; border-radius:6px; background:transparent; color:var(--text-subtle); cursor:pointer; }
.ml-fm__kebab:hover, .ml-fm__kebab:focus-visible { background:var(--ink-050); color:var(--text-strong); outline:none; }
.ml-fm__grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:12px; }
.ml-fm__tile { display:flex; flex-direction:column; gap:10px; padding:14px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); cursor:pointer; text-align:left; transition:border-color .15s ease, box-shadow .15s ease; min-width:0; }
.ml-fm__tile:hover, .ml-fm__tile:focus-visible { border-color:var(--ink-300); box-shadow:var(--shadow-xs); outline:none; }
.ml-fm__tile.is-sel { border-color:var(--ink-900); }
.ml-fm__thumb { position:relative; display:flex; align-items:center; justify-content:center; height:64px; overflow:hidden; border-radius:8px; background:var(--surface-1); color:var(--text-muted); }
.ml-fm__thumb img { width:100%; height:100%; object-fit:cover; }
.ml-fm__tpick { position:absolute; top:6px; left:6px; }
.ml-fm__tname { font-size:12.5px; color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ml-fm__tmeta { color:var(--text-subtle); font:400 10.5px var(--font-mono); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* ---- Selection bar (inversi bertoken; lihat catatan penyimpangan #2 di atas) ---- */
.ml-bulk { display:flex; align-items:center; gap:10px; flex-wrap:wrap; padding:8px 8px 8px 16px; background:var(--ink-900); border-radius:var(--radius-sm); color:var(--text-on-dark); }
.ml-bulk__n { color:var(--text-on-dark); font:400 12px var(--font-mono); letter-spacing:.1em; }
.ml-bulk__spacer { flex:1; }
.ml-bulk button { display:inline-flex; align-items:center; gap:6px; min-height:32px; padding:6px 13px; border:1px solid var(--text-on-dark-muted); border-radius:8px; background:transparent; color:var(--text-on-dark); font:600 12.5px var(--font-body); cursor:pointer; transition:background .12s ease, color .12s ease; }
.ml-bulk button:hover, .ml-bulk button:focus-visible { background:var(--text-on-dark); color:var(--ink-900); outline:none; }
.ml-bulk button.ml-bulk__x { width:30px; height:30px; min-height:30px; padding:0; justify-content:center; border-color:transparent; color:var(--text-on-dark-muted); }

/* ---- Folder tree + smart collections ---- */
.ml-tree { display:flex; flex-direction:column; gap:2px; }
.ml-tree__grp { margin-top:6px; }
.ml-tree__grp:first-child { margin-top:0; }
.ml-node { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:8px; width:100%; min-height:34px; padding:6px 8px; border:0; border-radius:var(--radius-xs); background:transparent; color:var(--text-body); font:500 12.5px var(--font-body); text-align:left; cursor:pointer; }
.ml-node:hover, .ml-node:focus-visible { background:var(--surface-1); outline:none; }
.ml-node[aria-current="true"] { background:var(--ink-050); color:var(--text-strong); font-weight:600; }
.ml-node > svg { flex:0 0 auto; color:var(--text-subtle); }
.ml-node[aria-current="true"] > svg { color:var(--text-strong); }
.ml-node__l { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ml-node__n { color:var(--text-subtle); font:400 10.5px var(--font-mono); font-variant-numeric:tabular-nums; }
.ml-node--d1 { padding-left:22px; }
.ml-node--d2 { padding-left:38px; }
/* Baris folder + tombol kelola = grid auto|1fr (aturan baris komposit): nama
   folder panjang tidak pernah menimpa hitungan maupun tombol aksinya. */
.ml-node-wrap { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; }
.ml-node-wrap .ml-node { min-width:0; }
.ml-node__edit { display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; flex:0 0 auto; padding:0; border:0; border-radius:var(--radius-xs); background:transparent; color:var(--text-subtle); cursor:pointer; opacity:0; transition:opacity .12s ease, color .12s ease; }
.ml-node-wrap:hover .ml-node__edit, .ml-node__edit:focus-visible { opacity:1; }
.ml-node__edit:hover, .ml-node__edit:focus-visible { color:var(--text-strong); background:var(--ink-050); outline:none; }
/* Sentuh: tak ada hover, jadi tombol selalu terlihat. */
@media (hover:none) { .ml-node__edit { opacity:1; } }

/* ---- METADATA (GUI/13) ---- */
.ml-meta { display:flex; flex-direction:column; gap:6px; }
.ml-meta__row { display:grid; grid-template-columns:118px minmax(0,1fr); gap:12px; align-items:center; padding:9px 0; border-bottom:1px solid var(--line-100); }
.ml-meta__row:last-child { border-bottom:0; }
.ml-meta__k { color:var(--text-subtle); font:400 10.5px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; }
.ml-meta__v { display:inline-flex; align-items:center; gap:7px; min-width:0; color:var(--text-body); font-size:12.5px; flex-wrap:wrap; }
.ml-meta__mono { color:var(--text-strong); font:400 12px var(--font-mono); overflow:hidden; text-overflow:ellipsis; }
.ml-copy { display:inline-flex; align-items:center; justify-content:center; width:22px; height:22px; padding:0; border:0; border-radius:5px; background:transparent; color:var(--ink-300); cursor:pointer; }
.ml-copy:hover, .ml-copy:focus-visible { color:var(--text-strong); background:var(--ink-050); outline:none; }
.ml-copy.is-done { color:var(--tag-mint-text); }

/* ---- Detail drawer: preview + penggunaan ---- */
.ml-prev { display:flex; align-items:center; justify-content:center; min-height:180px; padding:12px; overflow:hidden; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-subtle); }
.ml-prev img { max-width:100%; max-height:260px; object-fit:contain; border-radius:var(--radius-xs); }
.ml-use { display:flex; flex-direction:column; gap:8px; }
.ml-use__row { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:10px; padding:10px 12px; border:1px solid var(--line-100); border-radius:var(--radius-sm); }
.ml-use__row > svg { flex:0 0 auto; color:var(--text-subtle); }
.ml-use__main { display:flex; flex-direction:column; gap:2px; min-width:0; }
.ml-use__t { font-size:12.5px; color:var(--text-body); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ml-use__s { color:var(--text-subtle); font:400 11px var(--font-mono); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* ---- Antrean unggah (memakai .vs-upl*, hanya wadah yang ditambah) ---- */
.ml-queue { display:flex; flex-direction:column; gap:8px; }
.ml-queue__row.is-err .vs-upl__fill { background:var(--tag-danger-text); }
.ml-queue__row.is-done .vs-upl__fill { background:var(--tag-mint-text); }
.ml-queue__err { color:var(--tag-danger-text); font-size:11.5px; }

/* ---- Cleanup & Trash: memakai .vg-* (GUI/11) apa adanya, hanya kartu temuan baru ---- */
.ml-find { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,190px),1fr)); gap:12px; }
.ml-find__c { display:flex; flex-direction:column; gap:6px; padding:14px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); text-align:left; cursor:pointer; }
.ml-find__c:hover, .ml-find__c:focus-visible { border-color:var(--ink-300); box-shadow:var(--shadow-xs); outline:none; }
.ml-find__c[aria-pressed="true"] { border-color:var(--ink-900); }
.ml-find__k { color:var(--text-subtle); font:400 10px var(--font-mono); letter-spacing:.12em; text-transform:uppercase; }
.ml-find__v { color:var(--text-strong); font:700 22px var(--font-display); font-variant-numeric:tabular-nums; }
.ml-find__d { color:var(--text-muted); font-size:11.5px; line-height:1.45; }
.ml-find__c--danger .ml-find__v { color:var(--tag-danger-text); }

/* ---- Banner peringatan/status pindai ---- */
.ml-note { display:flex; align-items:flex-start; gap:10px; padding:12px 14px; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-muted); font-size:12.5px; line-height:1.5; }
.ml-note > svg { flex:0 0 auto; margin-top:1px; color:var(--text-subtle); }
.ml-note b { color:var(--text-strong); font-weight:600; }
.ml-note--warn { border-color:var(--tag-warning-border); background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.ml-note--warn > svg { color:var(--tag-warning-text); }
.ml-note--danger { border-color:var(--tag-danger-border); background:var(--tag-danger-bg); color:var(--tag-danger-text); }
.ml-note--danger > svg { color:var(--tag-danger-text); }

/* ---- Laporan kegagalan parsial (bulk Trash) ----
   Baris komposit = GRID `minmax(0,1fr) | auto` (aturan owner: jangan flex untuk
   baris ikon+teks+aksi), supaya nama panjang terpotong rapi tanpa menabrak alasan.
   Daftar bisa panjang → wadahnya yang scroll, bukan body modal. */
.ml-fail { border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); overflow:hidden; }
.ml-fail__h { padding:9px 12px; border-bottom:1px solid var(--line-200); background:var(--surface-1); color:var(--text-subtle);
              font-size:10.5px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; }
.ml-fail__row { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:12px;
                padding:9px 12px; border-bottom:1px solid var(--line-100); font-size:12.5px; }
.ml-fail__row:last-child { border-bottom:0; }
.ml-fail__nm { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--text-strong); }
.ml-fail__why { flex:0 0 auto; color:var(--text-muted); font-size:11.5px; text-align:right; }
.ml-fail__why.is-err { color:var(--tag-danger-text); }
.ml-fail__why.is-block { color:var(--tag-warning-text); }

/* ---- Media Picker (dialog pemilih aset untuk form consumer) ---- */
.ml-pick__body { display:flex; flex-direction:column; gap:12px; min-height:0; }
.ml-pick__grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(128px,1fr)); gap:10px; max-height:44vh; overflow:auto; padding:2px; }
.ml-pick__foot { display:flex; align-items:center; gap:10px; }

/* Target sentuh 44px TANPA mengubah anatomi.
   Master memakai kotak 17px (DATA-GRID :1485), 22px (METADATA copy :1781), dan
   38×30 (FILE-MANAGER switcher :890) — semuanya di bawah 44px yang diwajibkan brief.
   Kotak visualnya dipertahankan persis; yang dilebarkan hanya area tekan lewat
   ::after transparan, jadi desain tetap identik dengan master. */
.ml-fm__pick, .ml-copy, .ml-fm__kebab, .ml-fm__switch button, .ml-bulk__x, .ml-node__edit, .vs-viewchip__x { position:relative; }
.ml-fm__pick::after, .ml-copy::after, .ml-fm__kebab::after, .ml-fm__switch button::after, .ml-bulk__x::after, .ml-node__edit::after {
  content:""; position:absolute; top:50%; left:50%; width:44px; height:44px; transform:translate(-50%,-50%);
}
/* Subline mobile — hanya hidup saat tiga kolom mono dilipat (lihat @media di bawah). */
.ml-fm__mline { display:none; color:var(--text-subtle); font:400 11px var(--font-mono); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* Layar sempit: baris FILE-MANAGER TIDAK boleh jadi tabel yang menggulir mendatar.
   Tiga kolom mono (Tipe · Ukuran · Diubah) dilipat ke subline unit — pola "subline"
   memang milik unitnya sendiri (GUI/07 :1033), jadi tak ada anatomi yang dikarang. */
@media (max-width:640px) {
  .ml-fm__hrow, .ml-fm__row { grid-template-columns:26px 30px minmax(0,1fr) 32px; }
  .ml-fm__hcell--x, .ml-fm__meta, .ml-fm__size, .ml-fm__date { display:none; }
  .ml-fm__mline { display:block; }
  .ml-bulk { padding:8px; }
  .ml-bulk button { flex:1 1 auto; justify-content:center; }
  .ml-search { min-width:100%; }
  .ml-meta__row { grid-template-columns:minmax(0,1fr); gap:4px; }
}
@media (prefers-reduced-motion:reduce) {
  .ml-fm__row, .ml-fm__tile, .ml-fm__switch button, .ml-cbx, .ml-fm__pick, .ml-bulk button { transition:none; }
}
/* == :END == MEDIA LIBRARY 12.64 ============================================ */

/* == STUDIO-ONLY MEMBER ACTIVATION — koreksi 2026-08-01 ======================
   Kartu kandidat customer legacy di dialog "Verifikasi & undang Member".
   Baris komposit = GRID `auto | minmax(0,1fr) | auto` (aturan owner), bukan flex,
   supaya ikon/teks/status tidak pernah saling tindih. Di layar sempit tiga kolom
   itu melipat menjadi satu kolom — memakai breakpoint 560px yang MEMANG sudah
   dipakai file ini, bukan breakpoint karangan baru. Semua nilai dari tokens.css. */
.iv-legacy { display:grid; grid-template-columns:auto minmax(0,1fr) auto;
  align-items:center; gap:var(--space-4); }
.iv-legacy__id { min-width:0; }
.iv-legacy__name { font-weight:600; color:var(--text-strong);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.iv-legacy__meta { color:var(--text-subtle); font:400 11.5px var(--font-mono);
  overflow:hidden; text-overflow:ellipsis; }
@media (max-width:560px) {
  .iv-legacy { grid-template-columns:minmax(0,1fr); gap:var(--space-3); justify-items:start; }
  .iv-legacy__name { white-space:normal; }
}
/* == :END == STUDIO-ONLY MEMBER ACTIVATION ================================== */

/* == CONNECT+ CONTROL — brief 2026-08-10 =====================================
   Modul kendali platform Connect+ dari VS OS. Scope WAJIB:
     .cxp    → isi halaman modul (di dalam .content shell admin)
     .cxp-ov → tambahan pada overlay (drawer/modal me-reuse unit Customers V2
               .cust2-ov/.c2-drawer/.dpanel — SATU anatomi DS, tanpa duplikat)
   Reuse global tanpa scope ulang: .vg-* (GUI/11 DATA-GRID), .vs-tag, .vs-badge,
   .vs-viewbar/.vs-viewchip (GUI/12 TOOLBAR chip), .vs-stat + .dash-kpi (StatCard),
   .set-subnav, .vs-field, .vs-btn, .abtn, .ed-info-banner. Token-only.
   2026-08-19 — pass tokenisasi: nilai px/warna mentah diganti token DS. Nama
   kelas & struktur selector TIDAK berubah (admin.js bergantung padanya). Radius
   ikut ditokenkan supaya modul ini patuh Shape Controller (app.css:2457) —
   angka mentah kebal terhadap mode Square dan membuat Connect+ membulat sendiri. */
.cxp { display:block; }
.cxp .cxp-subnav { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--space-4); margin-bottom:var(--space-5); }
.cxp .cxp-nav-group { min-width:0; overflow:hidden; border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-0); box-shadow:var(--shadow-card); }
.cxp .cxp-nav-group summary { min-height:var(--field-h-sm); display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:var(--space-3); padding:0 var(--space-4); color:var(--text-muted); font:var(--fw-semibold) var(--text-2xs) var(--font-mono); letter-spacing:var(--ls-label); text-transform:uppercase; cursor:pointer; list-style:none; }
.cxp .cxp-nav-group summary::-webkit-details-marker { display:none; }
.cxp .cxp-nav-group summary svg { transition:transform var(--motion-fast) var(--ease-out); }
.cxp .cxp-nav-group[open] summary svg { transform:rotate(180deg); }
.cxp .cxp-nav-list { display:grid; padding:0 var(--space-2) var(--space-2); }
.cxp .cxp-nav-list a { min-height:var(--field-h); display:grid; grid-template-columns:var(--space-6) minmax(0,1fr); align-items:center; gap:var(--space-3); padding:0 var(--space-3); border-radius:var(--radius-sm); color:var(--text-muted); font-size:var(--text-sm); font-weight:var(--fw-medium); text-decoration:none; }
.cxp .cxp-nav-list a:hover { background:var(--surface-50); color:var(--text-strong); }
.cxp .cxp-nav-list a.active { background:var(--ink); color:var(--paper); }
.cxp .cxp-degraded, .cxp .cxp-note { margin-bottom:var(--space-4); }
/* KPI strip — StatCard di grid modul */
.cxp .cxp-kpis { display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); gap:var(--space-4); margin-bottom:var(--space-5); }
.cxp .cxp-kpi { background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); padding:var(--space-5); box-shadow:var(--shadow-card); }
.cxp .cxp-grid2 { display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:var(--space-4); align-items:start; margin-bottom:var(--space-5); }
.cxp .vg-panel { margin-bottom:var(--space-4); }
/* Toolbar seksi (anatomi GUI/12: cari kiri, meta kanan) */
.cxp .cxp-toolbar { display:flex; align-items:center; gap:var(--space-4); flex-wrap:wrap; margin-bottom:var(--space-4); }
/* --text-subtle di sini mewarnai IKON search, bukan teks (input punya warnanya
   sendiri di baris berikut) — ambang non-teks 3:1 sudah terlampaui. */
.cxp .cxp-toolbar .searchbox { display:flex; align-items:center; gap:var(--space-3); flex:1 1 260px; max-width:420px; background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-sm); padding:var(--space-3) var(--space-4); color:var(--text-subtle); }
.cxp .cxp-toolbar .searchbox input { border:0; outline:0; background:transparent; flex:1; min-width:0; font:inherit; color:var(--ink); }
.cxp .cxp-viewbar { margin:0; }
/* Baris data komposit & kv — grid auto|1fr|auto (aturan owner, bukan flex) */
.cxp .cxp-kvs { display:flex; flex-direction:column; }
.cxp .cxp-kvs .kv, .cxp-ov .cxp-kvs .kv { display:grid; grid-template-columns:172px minmax(0,1fr); gap:var(--space-2) var(--space-4); padding:var(--space-3) 0; border-bottom:1px solid var(--line-100); align-items:baseline; }
.cxp .cxp-kvs .kv:last-child, .cxp-ov .cxp-kvs .kv:last-child { border-bottom:0; }
.cxp .cxp-kvs .k, .cxp-ov .cxp-kvs .k { font-family:var(--font-mono); font-size:var(--text-2xs); text-transform:uppercase; letter-spacing:var(--ls-label-sm); color:var(--text-muted); }
.cxp .cxp-kvs .v, .cxp-ov .cxp-kvs .v { font-size:var(--text-xs); color:var(--ink); display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; min-width:0; }
.cxp .cxp-chips, .cxp-ov .cxp-chips { display:flex; gap:var(--space-2); flex-wrap:wrap; }
/* State kosong / error / ditolak / offline */
.cxp .cxp-state { display:flex; flex-direction:column; align-items:center; gap:var(--space-3); text-align:center; padding:var(--space-9) var(--space-6); background:var(--surface-0); border:1px dashed var(--line-200); border-radius:var(--radius-md); }
.cxp .cxp-state__ic { width:44px; height:44px; border-radius:var(--radius-sm); display:grid; place-items:center; background:var(--surface-50); color:var(--text-subtle); }
.cxp .cxp-state h3 { margin:0; font-size:var(--text-md); }
.cxp .cxp-state p { margin:0; max-width:520px; color:var(--text-muted); font-size:var(--text-xs); line-height:var(--lh-relaxed); }
.cxp .cxp-state--error .cxp-state__ic { background:var(--tag-danger-bg); color:var(--tag-danger-text); }
.cxp .cxp-state--denied .cxp-state__ic { background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.cxp-ov .cxp-state { padding:var(--space-7) var(--space-5); }
/* OTP */
.cxp .cxp-otp-form { display:flex; flex-direction:column; gap:var(--space-4); max-width:420px; padding:var(--space-5); }
.cxp .cxp-otp-result, .cxp-ov .cxp-otp-result { margin:var(--space-5); padding:var(--space-5); background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-md); display:flex; flex-direction:column; gap:var(--space-3); }
.cxp .cxp-otp-code, .cxp-ov .cxp-otp-code { display:flex; flex-direction:column; gap:var(--space-1); }
.cxp .cxp-otp-digits { font-size:var(--text-h2); letter-spacing:.28em; }
.cxp .cxp-otp-actions, .cxp-ov .cxp-otp-actions { display:flex; gap:var(--space-3); flex-wrap:wrap; }
.cxp .cxp-pin-layout { display:grid; grid-template-columns:minmax(0,1.25fr) minmax(280px,.75fr); gap:var(--space-4); align-items:start; }
.cxp .cxp-pin-card, .cxp .cxp-pin-guide { margin:0; }
.cxp .cxp-pin-body { display:grid; gap:var(--space-6); justify-items:start; padding:var(--space-7); }
.cxp .cxp-pin-digits { display:grid; grid-template-columns:repeat(6,minmax(36px,1fr)); gap:var(--space-3); width:100%; }
.cxp .cxp-pin-digits span { min-height:76px; display:grid; place-items:center; border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-50); color:var(--text-strong); font-size:var(--text-h1); font-weight:var(--fw-bold); }
.cxp .cxp-pin-countdown { width:100%; display:grid; gap:var(--space-3); color:var(--text-muted); font-size:var(--text-sm); }
.cxp .cxp-pin-countdown span { display:flex; align-items:center; gap:var(--space-2); }
.cxp .cxp-pin-countdown progress { width:100%; height:var(--space-2); overflow:hidden; border:0; border-radius:var(--radius-pill); background:var(--surface-100); }
.cxp .cxp-pin-countdown progress::-webkit-progress-bar { background:var(--surface-100); }
.cxp .cxp-pin-countdown progress::-webkit-progress-value { background:var(--ink); }
.cxp .cxp-pin-countdown progress::-moz-progress-bar { background:var(--ink); }
.cxp .cxp-pin-actions { display:flex; flex-wrap:wrap; gap:var(--space-2); }
.cxp .cxp-pin-guide ol { display:grid; gap:var(--space-3); margin:0 0 var(--space-5); padding-left:var(--space-6); color:var(--text-body); line-height:var(--lh-relaxed); }
.cxp .cxp-foot-actions, .cxp-ov .cxp-foot-actions { display:flex; gap:var(--space-3); flex-wrap:wrap; align-items:center; }
/* Checklist verifikasi (anatomi GUI/24 disederhanakan — baris grid auto|1fr) */
.cxp-ov .cxp-check { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); align-items:start; padding:var(--space-3) 0; border-bottom:1px solid var(--line-100); font-size:var(--text-xs); cursor:pointer; }
.cxp-ov .cxp-check input { margin-top:var(--space-1); accent-color:var(--brand-accent); }
/* ===== Editor Website 3 panel ===== */
.cxp .cxp-savebar { display:flex; align-items:center; gap:var(--space-3); padding:var(--space-3) var(--space-4); border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); margin-bottom:var(--space-4); font-size:var(--text-xs); color:var(--text-muted); }
.cxp .cxp-savebar__dot { width:8px; height:8px; border-radius:50%; background:var(--tag-success-text); flex:none; }
.cxp .cxp-savebar.is-dirty .cxp-savebar__dot { background:var(--tag-warning-text); }
.cxp .cxp-savebar.is-busy .cxp-savebar__dot { background:var(--tag-info-text, var(--text-subtle)); animation:cxpPulse 1s infinite alternate; }
.cxp .cxp-savebar.is-err { border-color:var(--tag-danger-border, var(--line-200)); }
.cxp .cxp-savebar.is-err .cxp-savebar__dot { background:var(--tag-danger-text); }
@keyframes cxpPulse { from { opacity:.35; } to { opacity:1; } }
@media (prefers-reduced-motion: reduce) { .cxp .cxp-savebar.is-busy .cxp-savebar__dot { animation:none; } }
.cxp .cxp-editor { display:grid; grid-template-columns:250px minmax(0,1fr) 330px; gap:var(--space-4); align-items:stretch; min-height:64vh; }
.cxp .cxp-ed-tree, .cxp .cxp-ed-inspect { background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-md); box-shadow:var(--shadow-card); overflow:auto; max-height:78vh; }
.cxp .cxp-ed-tree { padding:var(--space-4); display:flex; flex-direction:column; gap:var(--space-4); }
.cxp .cxp-ed-tree .vg-kicker { display:block; margin-bottom:var(--space-3); }
.cxp .cxp-tree-page, .cxp .cxp-tree-key { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-3); align-items:center; width:100%; text-align:left; padding:var(--space-3); border:0; background:transparent; border-radius:var(--radius-xs); font-size:var(--text-xs); color:var(--ink); cursor:pointer; }
.cxp .cxp-tree-key { grid-template-columns:minmax(0,1fr) auto auto; }
.cxp .cxp-tree-page:hover, .cxp .cxp-tree-key:hover { background:var(--surface-50); }
.cxp .cxp-tree-page.active, .cxp .cxp-tree-key.active { background:var(--ink); color:var(--paper); }
.cxp .cxp-tree-page em { font-style:normal; font-family:var(--font-mono); font-size:var(--text-2xs); color:var(--text-muted); }
/* Baris aktif berlatar --ink: warnanya sudah --paper, JANGAN ikut digelapkan. */
.cxp .cxp-tree-page.active em { color:var(--paper); opacity:.7; }
.cxp .cxp-tree-page span, .cxp .cxp-tree-key span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cxp .cxp-tree-glabel { display:block; font-family:var(--font-mono); font-size:var(--text-2xs); text-transform:uppercase; letter-spacing:var(--ls-label-sm); color:var(--text-muted); margin:var(--space-4) 0 var(--space-2); }
.cxp .cxp-dot { width:7px; height:7px; border-radius:50%; background:var(--brand-accent); flex:none; }
.cxp .cxp-stale { color:var(--tag-warning-text); display:inline-flex; }
/* Stale WAJIB memblokir publish; stale opsional tidak. Dua konsekuensi berbeda
   tidak boleh memakai warna yang sama (sweep integrasi 2026-08-19, CX-11). */
.cxp .cxp-stale.is-blocking { color:var(--tag-danger-text); }
.cxp .cxp-ed-stage { display:flex; flex-direction:column; gap:var(--space-3); min-width:0; }
.cxp .cxp-ed-stagebar { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; }
.cxp .cxp-ed-stagebody { flex:1; background:var(--surface-50); border:1px solid var(--line-200); border-radius:var(--radius-md); overflow:auto; display:flex; align-items:flex-start; justify-content:center; padding:var(--space-5); }
.cxp .cxp-ed-frameclip { max-width:100%; overflow:auto; }
/* --surface-0 = #FFFFFF, nilai identik dengan literal lama: ini "kertas" situs
   tamu di dalam <iframe>, bukan permukaan admin — tetap putih di tema mana pun. */
.cxp .cxp-ed-frame { height:66vh; border:1px solid var(--line-200); border-radius:var(--radius-sm); background:var(--surface-0); box-shadow:var(--shadow-card); display:block; }
.cxp .cxp-ed-tabs { display:flex; gap:var(--space-1); padding:var(--space-4) var(--space-4) 0; border-bottom:1px solid var(--line-100); position:sticky; top:0; background:var(--surface-0); z-index:1; flex-wrap:wrap; }
.cxp .cxp-ed-tab { border:0; background:transparent; padding:var(--space-3) var(--space-4); font-size:var(--text-xs); font-weight:var(--fw-semibold); color:var(--text-muted); border-bottom:2px solid transparent; cursor:pointer; }
.cxp .cxp-ed-tab.active { color:var(--ink); border-bottom-color:var(--brand-accent); }
.cxp .cxp-pad { padding:var(--space-4); }
.cxp .cxp-keyhead { display:flex; flex-direction:column; gap:var(--space-1); margin-bottom:var(--space-3); }
.cxp .cxp-keyhead .mono { font-size:var(--text-2xs); }
.cxp .cxp-imgfield { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-4); align-items:start; }
.cxp .cxp-imgthumb { width:96px; height:96px; object-fit:cover; border-radius:var(--radius-sm); border:1px solid var(--line-200); background:var(--surface-50); }
.cxp .cxp-imgthumb--empty { display:grid; place-items:center; color:var(--text-subtle); }
.cxp .cxp-imgmeta { display:flex; flex-direction:column; gap:var(--space-3); }
.cxp .cxp-imgmeta p { margin:0; font-size:var(--text-xs); }
.cxp .cxp-imgprog { display:flex; align-items:center; gap:var(--space-3); font-size:var(--text-xs); color:var(--text-muted); }
.cxp .cxp-theme-group { margin-bottom:var(--space-4); }
.cxp .cxp-theme-row { margin-bottom:var(--space-3); }
.cxp .cxp-colorwrap { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); align-items:center; }
.cxp .cxp-colorwrap input[type="color"] { width:34px; height:30px; padding:var(--space-1); border:1px solid var(--line-200); border-radius:var(--radius-xs); background:var(--surface-0); }
.cxp .cxp-css { min-height:220px; font-size:var(--text-xs); line-height:var(--lh-relaxed); }
.cxp .cxp-lint { margin-top:var(--space-3); display:flex; flex-direction:column; gap:var(--space-2); font-size:var(--text-xs); }
.cxp .cxp-lint-ok { color:var(--tag-success-text); display:flex; gap:var(--space-3); align-items:center; }
.cxp .cxp-lint-bad { color:var(--tag-danger-text); display:flex; gap:var(--space-3); align-items:center; }
.cxp .cxp-diff { display:flex; flex-direction:column; gap:var(--space-3); margin:var(--space-4) 0; }
.cxp .cxp-diff-row { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); padding:var(--space-3) var(--space-4); background:var(--surface-50); border:1px solid var(--line-100); border-radius:var(--radius-sm); }
.cxp .cxp-diff-kind { font-size:var(--text-2xs); text-transform:uppercase; letter-spacing:var(--ls-label-sm); color:var(--text-muted); padding-top:var(--space-1); }
.cxp .cxp-diff-body b { font-size:var(--text-xs); }
.cxp .cxp-diff-vals { display:flex; flex-direction:column; gap:var(--space-1); font-size:var(--text-xs); }
/* Nilai LAMA: pembedanya sudah dibawa <s> (coretan), jadi warnanya tidak perlu
   lemah — dinaikkan ke --text-muted supaya lolos AA sebelum publish. */
.cxp .cxp-diff-vals s { color:var(--text-muted); }
/* Target sentuh, angka sejajar & cincin fokus — satu aturan untuk seluruh modul.
   Aksi baris tabel memakai tangga tinggi kontrol DS; di perangkat sentuh naik ke
   ukuran penuh supaya tetap 44px. */
/* Scope GANDA wajib: drawer/modal di-mount ke #adminOverlay, jadi `.cxp-ov` BUKAN
   keturunan `.cxp`. Aturan ber-scope `.cxp` saja mati begitu masuk drawer — padahal
   drawer justru berisi aksi keputusan (suspend, approve, tolak). */
.cxp .vg-actions .abtn, .cxp-ov .vg-actions .abtn { min-height:var(--field-h-sm); padding:0 var(--space-4); font-size:var(--text-xs); }
@media (pointer:coarse) { .cxp .vg-actions .abtn, .cxp-ov .vg-actions .abtn { min-height:var(--field-h); } }
.cxp .vg-num, .cxp .cxp-pin-digits, .cxp .cxp-otp-digits,
.cxp-ov .vg-num, .cxp-ov .cxp-pin-digits, .cxp-ov .cxp-otp-digits { font-variant-numeric:tabular-nums; }
.cxp :is(a,button,input,select,textarea,summary):focus-visible,
.cxp-ov :is(a,button,input,select,textarea,summary):focus-visible { outline:none; box-shadow:var(--shadow-focus); }
/* `--shadow-focus` adalah spread di LUAR border-box, sedangkan `summary` membentang
   penuh di dalam `.cxp-nav-group` yang ber-`overflow:hidden` — cincinnya terpotong
   habis, dan `outline:none` sudah membuang indikator bawaan. Navigasi utama modul
   praktis kehilangan penanda fokus. Untuk kasus full-bleed ini dipakai cincin INSET. */
.cxp .cxp-nav-group summary:focus-visible { box-shadow:inset 0 0 0 2px var(--text-strong); }
/* Pager — KONTRAK NAMA KELAS dengan admin.js. Visual mengikuti .gwp-pager yang
   sudah terbukti, tapi ditulis dengan token: warna label dinaikkan ke
   --text-muted (label 13px harus lolos AA) dan kotak halaman memakai --field-h
   supaya tinggi sama dengan kontrol lain. */
.cxp .cxp-pager, .cxp-ov .cxp-pager { display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:var(--space-4); color:var(--text-muted); font-size:var(--text-xs); }
.cxp .cxp-pager > div, .cxp-ov .cxp-pager > div { display:flex; align-items:center; gap:var(--space-2); }
.cxp .cxp-page, .cxp-ov .cxp-page { display:inline-grid; min-width:var(--field-h); height:var(--field-h); place-items:center; padding:0 var(--space-3); border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-muted); cursor:pointer; font:var(--fw-semibold) var(--text-xs) var(--font-mono); font-variant-numeric:tabular-nums; }
.cxp .cxp-page:hover:not(:disabled), .cxp-ov .cxp-page:hover:not(:disabled) { border-color:var(--border-strong); background:var(--surface-1); color:var(--text-strong); }
.cxp .cxp-page.active, .cxp-ov .cxp-page.active { border-color:var(--ink); background:var(--ink); color:var(--paper); }
.cxp .cxp-page:disabled, .cxp-ov .cxp-page:disabled { opacity:.4; cursor:not-allowed; }
/* Catatan satu baris saat daftar gabungan tidak bisa dipaginasi. */
.cxp .cxp-pagernote, .cxp-ov .cxp-pagernote { margin-top:var(--space-3); color:var(--text-muted); font-size:var(--text-xs); }
/* Drawer head Connect+ (di atas anatomi .cust2-ov) */
/* Tabel lebar di panel drawer TIDAK boleh memaksa track grid melebar —
   panel di-min-width:0 dan tabelnya scroll di dalam wadahnya sendiri. */
.cxp-ov .profile-grid > .dpanel { min-width:0; }
.cxp-ov .dpanel .cxp-tblscroll { overflow-x:auto; }
.cxp-ov .dpanel .vg-table { min-width:420px; }
.cxp-ov .cxp-kvs .kv { grid-template-columns:120px minmax(0,1fr); }
.cxp-ov .cxp-dhead { display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:var(--space-3); align-items:center; }
.cxp-ov .cxp-dhead-main { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-4); align-items:center; min-width:0; }
.cxp-ov .cxp-dhead h2 { margin:0; font-size:var(--text-h4); }
/* Responsif */
@media (max-width: 1100px) {
  .cxp .cxp-editor { grid-template-columns:1fr; min-height:0; }
  .cxp .cxp-ed-tree, .cxp .cxp-ed-inspect { max-height:none; }
  .cxp .cxp-ed-frame { height:56vh; }
}
@media (max-width: 900px) {
  .cxp .cxp-subnav, .cxp .cxp-pin-layout { grid-template-columns:1fr; }
  .cxp .cxp-kpis, .cxp .cxp-grid2 { grid-template-columns:repeat(2, minmax(0,1fr)); }
}
@media (max-width:560px) {
  .cxp .cxp-pin-digits { gap:var(--space-2); }
  .cxp .cxp-pin-digits span { min-height:var(--field-h-lg); font-size:var(--text-h3); }
}
@media (max-width: 620px) {
  .cxp .cxp-kpis, .cxp .cxp-grid2 { grid-template-columns:1fr; }
  .cxp .cxp-kvs .kv, .cxp-ov .cxp-kvs .kv { grid-template-columns:1fr; gap:var(--space-1); }
  /* Pager menyederhanakan diri: hanya prev (anak pertama), halaman aktif, dan
     next (anak terakhir) yang tersisa — nomor di antaranya disembunyikan. */
  .cxp .cxp-pager > div > .cxp-page:not(.active):not(:first-child):not(:last-child),
  .cxp-ov .cxp-pager > div > .cxp-page:not(.active):not(:first-child):not(:last-child) { display:none; }
}
/* == :END == CONNECT+ CONTROL =============================================== */

/* == VIRCANSA GATEWAY CONTROL — Responses + Statistics ======================
   Komposisi: GUI/04/STAT-SPARKLINE · GUI/07/TABLE-PAGINATION ·
   GUI/08/TABS-UNDERLINE · GUI/09/EMPTY-STATE. CMS penuh tidak dirender di VS OS;
   control surface ini hanya membaca/menulis data operasional vsg_* yang nyata. */
.gwp { display:block; }
.gwp-subnav { margin-bottom:var(--space-5); }
.gwp-toolbar { display:flex; align-items:center; flex-wrap:wrap; gap:var(--space-3); margin-bottom:var(--space-4); }
.gwp-search { display:flex; min-height:var(--field-h); flex:1 1 280px; max-width:480px; align-items:center; gap:var(--space-3); padding:0 var(--space-4); border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-subtle); }
.gwp-search:focus-within { border-color:var(--border-strong); box-shadow:var(--shadow-focus); }
.gwp-search input { width:100%; min-width:0; height:100%; border:0; outline:0; background:transparent; color:var(--text-strong); font:inherit; }
.gwp-toolbar > .ctrl { width:auto; min-width:170px; min-height:var(--field-h); }
.gwp-meta { margin-left:auto; color:var(--text-subtle); font:600 10.5px var(--font-mono); letter-spacing:.08em; text-transform:uppercase; }
.gwp-panel { margin-bottom:var(--space-4); }
.gwp-table { overflow-x:auto; }
.gwp-table table { min-width:850px; }
.gwp-table td { vertical-align:middle; }
.gwp-table td small { display:block; margin-top:var(--space-1); color:var(--text-subtle); font-size:11.5px; }
.gwp-open { display:grid; min-width:180px; padding:var(--space-2) 0; border:0; background:transparent; color:var(--text-strong); cursor:pointer; text-align:left; }
.gwp-open:hover b { text-decoration:underline; text-underline-offset:3px; }
.gwp-action { text-align:right; white-space:nowrap; }
.gwp-pager { display:flex; align-items:center; justify-content:space-between; gap:var(--space-4); color:var(--text-subtle); font-size:12.5px; }
.gwp-pager > div { display:flex; align-items:center; gap:var(--space-2); }
.gwp-page { display:inline-grid; min-width:44px; height:44px; place-items:center; padding:0 var(--space-3); border:1px solid var(--border-input); border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-muted); cursor:pointer; font:600 12px var(--font-mono); }
.gwp-page:hover:not(:disabled) { border-color:var(--border-strong); background:var(--surface-1); color:var(--text-strong); }
.gwp-page.active { border-color:var(--ink-950); background:var(--ink-950); color:var(--text-on-dark); }
.gwp-page:disabled { opacity:.4; cursor:not-allowed; }
.gwp-state { display:flex; flex-direction:column; align-items:center; gap:var(--space-3); padding:var(--space-9) var(--space-6); border:1px dashed var(--line-200); border-radius:var(--radius-md); background:var(--surface-0); text-align:center; }
.gwp-state > span { display:grid; width:48px; height:48px; place-items:center; border-radius:var(--radius-pill); background:var(--surface-1); color:var(--text-muted); }
.gwp-state h3 { margin:0; color:var(--text-strong); font-size:16px; }
.gwp-state p { max-width:520px; margin:0; color:var(--text-muted); font-size:13px; line-height:var(--lh-relaxed); }
.gwp-state--error > span { background:var(--tag-danger-bg); color:var(--tag-danger-text); }
.gwp-state--denied > span { background:var(--tag-warning-bg); color:var(--tag-warning-text); }
.gwp-kpis { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:var(--space-4); margin-bottom:var(--space-5); }
.gwp-kpi { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-2) var(--space-3); min-width:0; padding:var(--space-5); border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-0); box-shadow:var(--shadow-card); }
.gwp-kpi > span { grid-row:1/3; display:grid; width:36px; height:36px; place-items:center; border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-muted); }
.gwp-kpi small { color:var(--text-subtle); font:600 10px var(--font-mono); letter-spacing:.09em; text-transform:uppercase; }
.gwp-kpi b { color:var(--text-strong); font:700 28px/1 var(--font-display); font-variant-numeric:tabular-nums; }
.gwp-kpi em { grid-column:1/-1; color:var(--text-muted); font-size:11.5px; font-style:normal; }
.gwp-chart-panel { margin-bottom:var(--space-5); }
.gwp-chart-panel .panel-head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-4); }
.gwp-legend { display:inline-flex; align-items:center; gap:var(--space-2); color:var(--text-subtle); font-size:11.5px; }
.gwp-legend i { width:8px; height:8px; border-radius:var(--radius-pill); background:var(--ink-950); }
.gwp-legend i.submit { background:var(--brand-accent); }
.gwp-chart { display:flex; min-height:220px; align-items:stretch; gap:var(--space-2); padding-top:var(--space-4); overflow-x:auto; }
.gwp-day { display:grid; min-width:30px; flex:1 0 30px; grid-template-rows:minmax(150px,1fr) auto; gap:var(--space-2); }
.gwp-day > div { display:flex; align-items:flex-end; justify-content:center; gap:3px; border-bottom:1px solid var(--line-200); }
.gwp-day i { width:7px; min-height:3px; border-radius:var(--radius-pill) var(--radius-pill) 0 0; background:var(--ink-950); }
.gwp-day i.submit { background:var(--brand-accent); }
.gwp-day > span { color:var(--text-subtle); font:500 9.5px var(--font-mono); text-align:center; }
.gwp-stats-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--space-4); }
.gwp-rank { display:grid; }
.gwp-rank > div { display:grid; grid-template-columns:24px minmax(0,1fr) auto; align-items:center; gap:var(--space-3); min-height:44px; border-bottom:1px solid var(--line-100); }
.gwp-rank > div:last-child { border-bottom:0; }
.gwp-rank span { color:var(--text-subtle); font:600 10.5px var(--font-mono); }
.gwp-rank b { overflow:hidden; color:var(--text-strong); font-size:12.5px; font-weight:600; text-overflow:ellipsis; white-space:nowrap; }
.gwp-rank em { color:var(--text-muted); font:600 12px var(--font-mono); font-style:normal; }
.gwp-range { display:flex; align-items:center; gap:var(--space-3); color:var(--text-muted); font-size:12.5px; }
.gwp-emptyline { padding:var(--space-5); color:var(--text-subtle); font-size:12.5px; text-align:center; }
/* Overlay detail memakai modal kanonik Customers V2; kelas di bawah hanya isi. */
.gwp-detail-head { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-4); margin-bottom:var(--space-4); }
.gwp-detail-head > div { display:grid; gap:var(--space-1); }
.gwp-detail-head span.mono { color:var(--text-subtle); font-size:10.5px; letter-spacing:.1em; }
.gwp-detail-head h3 { margin:0; color:var(--text-strong); font-size:20px; }
.gwp-detail-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-4); margin-bottom:var(--space-4); }
.gwp-detail-card { margin-bottom:var(--space-4); padding:var(--space-4); border:1px solid var(--line-200); border-radius:var(--radius-md); background:var(--surface-0); }
.gwp-detail-card h4 { margin:0 0 var(--space-3); color:var(--text-subtle); font:650 10.5px var(--font-mono); letter-spacing:.1em; text-transform:uppercase; }
.gwp-kv { display:grid; grid-template-columns:120px minmax(0,1fr); gap:var(--space-3); align-items:start; padding:var(--space-3) 0; border-bottom:1px solid var(--line-100); }
.gwp-kv:last-child { border-bottom:0; }
.gwp-kv > span { color:var(--text-subtle); font-size:11.5px; text-transform:capitalize; }
.gwp-kv > b { min-width:0; color:var(--text-strong); font-size:13px; font-weight:600; overflow-wrap:anywhere; }
.gwp-form-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-4); }
.gwp-form-grid label { display:grid; gap:var(--space-2); color:var(--text-muted); font-size:12px; }
.gwp-form-grid label.wide { grid-column:1/-1; }
.gwp-timeline { display:grid; }
.gwp-event { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); min-height:54px; }
.gwp-event > i { width:9px; height:9px; margin-top:5px; border-radius:var(--radius-pill); background:var(--ink-950); box-shadow:0 0 0 4px var(--surface-1); }
.gwp-event > div { display:grid; gap:var(--space-1); padding-bottom:var(--space-4); border-bottom:1px solid var(--line-100); }
.gwp-event:last-child > div { border-bottom:0; }
.gwp-event b { color:var(--text-strong); font-size:12.5px; }
.gwp-event span { color:var(--text-subtle); font-size:11.5px; }
.gwp-event p { margin:var(--space-1) 0 0; padding:var(--space-3); border-radius:var(--radius-sm); background:var(--surface-1); color:var(--text-body); font-size:12.5px; white-space:pre-wrap; }
@media (max-width:900px) {
  .gwp-kpis { grid-template-columns:repeat(2,minmax(0,1fr)); }
  .gwp-stats-grid { grid-template-columns:1fr; }
}
@media (max-width:720px) {
  /* Tabel global berubah menjadi kartu pada breakpoint ini. Lepaskan min-width
     desktop dan beri label data-l agar setiap response tetap padat serta terbaca. */
  .gwp-table { overflow:visible; }
  .gwp-table table { min-width:0; }
  .gwp-table td { text-align:left; }
  .gwp-table td > * { min-width:0; }
  .gwp-open { min-width:0; padding:0; }
  .gwp-action .abtn { width:100%; justify-content:center; }
}
@media (max-width:620px) {
  .gwp-toolbar { align-items:stretch; }
  .gwp-toolbar > .ctrl, .gwp-toolbar > .abtn { width:100%; }
  .gwp-meta { width:100%; margin-left:0; }
  .gwp-kpis, .gwp-detail-grid, .gwp-form-grid { grid-template-columns:1fr; }
  .gwp-form-grid label.wide { grid-column:auto; }
  .gwp-pager { align-items:flex-start; flex-direction:column; }
  .gwp-kv { grid-template-columns:1fr; gap:var(--space-1); }
}
/* == :END == VIRCANSA GATEWAY CONTROL ===================================== */

/* == UTILITAS JARAK BERTOKEN — Remediasi Review Opus 2026-08-05 ==============
   Markup baru pass ini (blok "Item manual" di modal Transaksi, kartu setting
   akun penjualan langsung di Finance) sebelumnya memakai `style="margin-top:*"`
   dengan angka mentah. Kelas di bawah menggantikannya dengan nilai dari
   tokens.css; sengaja diletakkan paling akhir supaya menang atas aturan
   komponen ber-spesifisitas sama tanpa perlu !important. Jangan menambah
   varian baru di sini — kalau butuh jarak lain, pakai anatomi unit-nya. */
.u-mt-3 { margin-top:var(--space-3); }
.u-mt-4 { margin-top:var(--space-4); }
/* == :END == UTILITAS JARAK BERTOKEN ======================================== */

/* == SCHEDULE COMPOSER — satu pintu, tanpa navigasi keluar ===================
   Header hanya menyimpan konteks; detail lengkap tinggal di pane yang sesuai.
   Dokumen sengaja berada di pane Uang supaya admin tidak perlu memahami tab
   terpisah untuk transaksi, invoice, dan kwitansi. */
.sched-detail .sd2-factstrip { display:none; }
.sched-detail .sd2-contextline {
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:6px 14px;
  margin-top:4px;
  color:var(--text-muted,var(--muted));
  font-size:12px;
}
.sched-detail .sd2-contextline span { display:inline-flex; align-items:center; gap:5px; }
.sched-detail .sd2-contextline svg { color:var(--text-subtle,var(--muted)); }
.sched-detail .sd2-statusbar {
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-4);
  margin-bottom:0;   /* HANYA bawah — margin-top milik aturan alur pane; menulis
                        `margin:0` di sini ikut mematikannya dan bikin dempet. */
  padding:var(--space-4);
  background:var(--surface-50,var(--paper-warm));
  border:1px solid var(--line-200,var(--line-soft));
  border-radius:var(--radius-sm,10px);
}
.sched-detail .sd2-statusbar__label {
  color:var(--text-subtle,var(--muted));
  font-family:var(--font-mono,monospace);
  font-size:10px;
  font-weight:700;
  letter-spacing:.14em;
  text-transform:uppercase;
}
.sched-detail .sd2-statusbar .status-select { min-width:170px; width:auto; min-height:36px; }
.sched-detail .sd2-pane-segment { margin-top:var(--rhythm-section,var(--space-7)); padding-top:var(--space-5); border-top:1px solid var(--line-100,var(--line-soft)); }
.sched-detail .sd2-docs-segment .sched-pane-title:first-child { margin-top:0; }
.sched-detail .sd2-action-strip .sd2-tile-btn { min-height:58px; flex:1 1 0; }
.sched-detail .sd2-doc-grid { grid-template-columns:repeat(3,minmax(0,1fr)); }
.sd2-output-summary {
  display:flex; align-items:center; justify-content:space-between; gap:var(--space-3);
  margin-bottom:var(--space-4); padding:var(--space-4);
  background:var(--surface-0,var(--paper)); border:1px solid var(--line-200,var(--line));
  border-radius:var(--radius-sm,10px); color:var(--text-muted,var(--ink-600));
}
.sd2-output-summary b { color:var(--text-strong,var(--ink)); font-family:var(--font-mono); }
.sd2-output-list { display:grid; gap:var(--space-3); }
.sd2-output-card {
  display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:start; gap:var(--space-3);
  padding:var(--space-4); background:var(--surface-0,var(--paper));
  border:1px solid var(--line-200,var(--line)); border-radius:var(--radius-sm,10px);
}
.sd2-output-card.is-blocked { border-color:var(--tag-warning-border); background:var(--tag-warning-bg); }
.sd2-output-icon {
  display:grid; width:var(--space-8); height:var(--space-8); place-items:center;
  border-radius:var(--radius-xs,6px); background:var(--surface-2,var(--paper-warm2)); color:var(--text-muted,var(--ink-600));
}
.sd2-output-main { display:grid; min-width:0; gap:var(--space-1); }
.sd2-output-title { display:flex; align-items:center; flex-wrap:wrap; gap:var(--space-2); }
.sd2-output-title b { overflow-wrap:anywhere; color:var(--text-strong,var(--ink)); font-size:var(--text-xs,13px); }
.sd2-output-main > small { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs,11px); text-transform:capitalize; }
.sd2-output-required { color:var(--tag-orange-text); font:700 var(--text-2xs,11px) var(--font-mono); letter-spacing:var(--ls-label-sm); }
.sd2-output-state { display:grid; justify-items:end; gap:var(--space-1); white-space:nowrap; }
.sd2-output-state small { color:var(--text-subtle,var(--ink-400)); font-size:var(--text-2xs,11px); }
.sd2-output-block { display:inline-flex; align-items:flex-start; gap:var(--space-1); margin-top:var(--space-1); color:var(--tag-warning-text); font-size:var(--text-2xs,11px); }
.sd2-output-empty { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:var(--space-4); }
.sd2-output-empty > div { display:grid; gap:var(--space-1); }
.sd2-output-empty b { color:var(--text-strong,var(--ink)); }
.sd2-output-empty span { color:var(--text-muted,var(--ink-600)); font-size:var(--text-xs,13px); line-height:var(--lh-relaxed); }
.vs-receipt__item--group { margin-top:var(--space-1); padding-top:var(--space-2); border-top:1px dashed var(--ink-300); font-weight:700; }
.inv2-line-date { color:var(--text-muted,var(--ink-600)); }
@media (max-width:700px) {
  .sched-detail .sd2-statusbar { align-items:flex-start; flex-direction:column; }
  .sched-detail .sd2-statusbar .status-select { width:100%; }
  .sched-detail .sd2-action-strip { display:grid; grid-template-columns:1fr; }
  .sched-detail .sd2-doc-grid { grid-template-columns:1fr; }
  .sd2-output-summary { align-items:flex-start; flex-direction:column; }
  .sd2-output-card { grid-template-columns:auto minmax(0,1fr); }
  .sd2-output-state { grid-column:2; justify-items:start; }
  .sd2-output-empty { grid-template-columns:auto minmax(0,1fr); }
  .sd2-output-empty .abtn { grid-column:2; justify-self:start; }
}

/* ── FIN-V2 · pelengkap drawer (§2.2) ───────────────────────────────────────
   Alasan penolakan Finance & pembatalan laporan Staff WAJIB terbaca di baris
   payment-nya: tanpa ini "Ditolak Finance" adalah jalan buntu bagi Staff. */
.bk-txpay-reason { grid-column:1/-1; margin:4px 0 0; display:flex; align-items:flex-start; gap:6px;
  font-size:11.5px; line-height:1.45; color:var(--tag-danger-text); }
.bk-txpay-reason svg { flex:0 0 auto; margin-top:1px; }
.sd2-pm-row.is-voided { opacity:.62; }
.sd2-pm-row.is-voided .mono { text-decoration:line-through; }

/* Ringkasan uang drawer (§2.2.1) — enam angka, auto-fit, mono tabular. */
.bk-msum { display:grid; grid-template-columns:repeat(auto-fit, minmax(150px, 1fr));
  gap:var(--space-4); }
.bk-msum__cell { display:flex; flex-direction:column; gap:3px; min-width:0; }
.bk-msum__cell > span { font:650 10.5px var(--font-mono); text-transform:uppercase;
  letter-spacing:.06em; color:var(--text-muted); }
.bk-msum__cell > b { font-size:16px; font-variant-numeric:tabular-nums; color:var(--text-strong);
  overflow-wrap:anywhere; }
.bk-msum__cell > small { font-size:10.5px; color:var(--text-muted); }
.bk-msum__cell.is-wait > b { color:var(--tag-warning-text); }
.bk-msum__cell.is-due  > b { color:var(--tag-danger-text); }

/* 12.67 F2 — slot netral: wadah yang tidak ikut membentuk layout, dipakai
   menyegarkan satu field di dalam grid/flex tanpa menggambar ulang induknya. */
.pos-slot { display:contents; }

/* == FIN-DB:BEGIN ========================================================
   12.68 Finance ▸ Database. Tabelnya MEREPRODUKSI unit DS GUI/11/DATA-GRID
   dengan memakai ulang kelas `.sl-*` milik Daftar Jadwal (blok
   SCHED-DATAGRID-REFRESH) — blok ini hanya menambah toolbar, bulk bar, dan
   pager yang belum punya kelas di sana. Nol nilai literal; semua dari token.
   ======================================================================== */
.fin-db { display:grid; gap:var(--space-5); }
.fin-db__bar { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-4);
  align-items:center; padding:var(--space-4); background:var(--bg-card);
  border:1px solid var(--border-default); border-radius:var(--radius-md); }
.fin-db__search { display:inline-flex; align-items:center; gap:var(--space-3);
  min-width:0; color:var(--text-subtle); }
.fin-db__search .vs-field__control { min-width:0; width:clamp(200px, 32vw, 420px); height:var(--field-h); }
.fin-db__acts { display:flex; gap:var(--space-3); justify-content:flex-end; flex-wrap:wrap; }
.fin-db__acts .abtn { min-height:var(--field-h); }
.fin-db__bulk { position:sticky; bottom:var(--space-4); z-index:1200;
  display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-4); align-items:center;
  padding:var(--space-4) var(--space-5); background:var(--bg-ink); color:var(--text-on-dark);
  border-radius:var(--radius-md); box-shadow:var(--shadow-pop); }
.fin-db__bulk .abtn { min-height:var(--field-h); }
.sl-sort { border:0; background:transparent; font:inherit; color:inherit; cursor:pointer;
  padding:0; display:inline-flex; align-items:center; gap:var(--space-2); min-height:var(--field-h); }
.sl-sort:focus-visible { outline:none; box-shadow:var(--shadow-focus); border-radius:var(--radius-xs); }
.sl-pager { display:flex; flex-wrap:wrap; gap:var(--space-2); justify-content:center; }
.sl-page { min-width:var(--field-h); min-height:var(--field-h); padding:0 var(--space-3);
  border:1px solid var(--border-default); background:var(--surface-0); color:var(--text-body);
  border-radius:var(--radius-sm); font-family:var(--font-mono); font-size:var(--text-xs); cursor:pointer; }
.sl-page:hover { background:var(--bg-subtle); }
.sl-page.is-on { background:var(--primary); border-color:var(--primary); color:var(--primary-contrast); }
.sl-page:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.fin-db .sl-table tr.is-sel > td { background:var(--bg-subtle); }
@container (max-width: 720px) {
  .fin-db__bar { grid-template-columns:minmax(0,1fr); }
  .fin-db__search .vs-field__control { width:100%; }
  .fin-db__acts { justify-content:flex-start; }
}
/* == FIN-DB:END ========================================================== */

/* == WATPL:BEGIN == WATPL — Direktori Template WhatsApp & Playbook Chat =====
   12.66 · rute #/watemplates · prefiks .watpl- · domain JS watpl.
   Komposisi unit: GUI/02/SEGMENTED-CONTROL (via .vs-tabs--segmented) ·
   GUI/02/VIEW-SWITCHER · GUI/08/COMMAND-BAR · GUI/12/TOOLBAR Filtering
   (via .vs-viewbar/.vs-viewchip) · GUI/04/CARD-INTERACTIVE (via .vs-card) ·
   GUI/07/TAGS-TONES (via .vs-tag) · GUI/11/DATA-GRID (via .sl-table*, pola
   yang sama dipakai FIN-DB) · GUI/03/TEXT-SELECT-COMBOBOX (kontrak popover) ·
   GUI/23/CHAT-BUBBLE · WSP/08/COMPOSER · WSP/08/MESSAGE (aturan grouping +
   toolbar aksi melayang) · WSP/08/RICH-CONTENT (ImageAttachment).
   DITOLAK dengan alasan tercatat di spec 05A 1.8: GUI/03/FILE-UPLOAD,
   GUI/23/COMPOSER sebagai shell editor, typing indicator, Reactions /
   ThreadPreview / VoiceNote / LinkPreview, dan seluruh blok .wa-bubble &
   .wa-phone lama yang mengunci warna dagang WhatsApp.
   Nol nilai warna literal. Literal tipografi off-scale dipusatkan di blok
   token lokal di bawah, mengikuti pola --wsp-r* (admin.css:13464).
   Breakpoint hanya dari tangga app: 1180 / 900 / 860 / 760 / 560.
   TIDAK memakai container query: containment membuat elemen jadi containing
   block untuk position:fixed, sehingga scrim popover .watpl-pop__scrim hanya
   menutup container dan klik di luar tidak menutup popover (05A TRAP-2).
   ========================================================================= */

/* --- Token lokal modul -----------------------------------------------------
   TRAP-1: kustom properti diwariskan lewat pohon DOM, bukan lewat selector.
   #adminOverlay adalah SIBLING dari .main, jadi blok ini WAJIB dideklarasikan
   di semua akar modul, persis cara WSP melakukannya di admin.css:13443. */
.watpl-root, .watpl-modal, .watpl-chat {
  /* TIPOGRAFI — literal dikutip dari master; tidak ada langkah DS dalam 0.5px.
     GUI/23/CHAT-BUBBLE:4272,4275 · GUI/07/TABLE-PAGINATION:1034 · WSP/08:75-83 */
  --watpl-fs-bubble: 13.5px;   /* badan bubble + label Salin + judul baris combobox */
  --watpl-fs-meta:   12.5px;   /* data sekunder baris tabel, meta kartu */
  --watpl-fs-hint:   11.5px;   /* helper text, catatan bubble */
  --watpl-fs-kicker: 10.5px;   /* label kolom mono uppercase */
  --watpl-fs-stamp:  10px;     /* timestamp transkrip */
  --watpl-fs-ext:    9.5px;    /* chip ekstensi WSP/08 FileAttachment */
  /* RADIUS — satu-satunya nilai off-scale di keluarga chat; sisanya token DS. */
  --watpl-r-tail:    4px;      /* sudut ekor bubble */
  /* ISIAN DI ATAS TINTA — diturunkan dari token lewat color-mix, mekanisme
     rumah (preseden --wsp-on-ink-fill-10, admin.css:13453). Bukan nilai baru. */
  --watpl-on-ink-10: color-mix(in srgb, var(--text-on-dark) 10%, transparent);
  --watpl-on-ink-20: color-mix(in srgb, var(--text-on-dark) 20%, transparent);
}

/* Fivo (--font-display) tidak dipakai di mana pun di modul ini (05A 1.6).
   .fin-state__title milik Finance memakainya, jadi dikembalikan ke Geist
   HANYA di dalam lingkup modul — blok Finance tidak disentuh. */
.watpl-root .fin-state__title,
.watpl-modal .fin-state__title { font-family:var(--font-body); }

/* Utilitas modul */
.watpl-sr { position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap; border:0; }
.watpl-mono { font-family:var(--font-mono); font-variant-numeric:tabular-nums; }
.watpl-kicker { display:block; font-family:var(--font-mono); font-size:var(--watpl-fs-kicker);
  font-weight:var(--fw-semibold); letter-spacing:var(--ls-label-sm); text-transform:uppercase;
  color:var(--text-subtle); }
.watpl-hint { margin:0; font-size:var(--watpl-fs-hint); line-height:var(--lh-normal);
  color:var(--text-muted); }
.watpl-root { display:flex; flex-direction:column; gap:var(--space-7); min-width:0; }

/* --- 3a · Tab rute ------------------------------------------------------- */
/* Tab adalah TAUTAN rute, bukan tab ARIA: penanda statusnya aria-current="page".
   Aturan .vs-tab yang sudah ada hanya mengunci [aria-selected="true"], jadi
   baris ini menyalin tampilannya tanpa mengubah apa pun secara visual. */
.watpl-tabs { width:fit-content; max-width:100%; }
.watpl-tabs .vs-tab { text-decoration:none; }
.watpl-tabs .vs-tab[aria-current="page"] { color:var(--text-strong);
  background:var(--surface-0); box-shadow:var(--shadow-xs); }

/* --- 3b · Bilah kendali (SATU-SATUNYA elemen sticky di modul, 05A D-1) ---- */
.watpl-bar { position:sticky; top:64px; z-index:10;
  display:flex; flex-direction:column; gap:var(--space-4);
  padding:var(--space-4); background:var(--surface-0);
  border:1px solid var(--border-default); border-radius:var(--radius-md);
  box-shadow:var(--shadow-xs); }
.watpl-bar__row { display:flex; align-items:center; gap:var(--space-5); min-width:0; }
.watpl-bar__row--cats { gap:var(--space-3); }
.watpl-bar__row--filters { flex-wrap:wrap; gap:var(--space-3); }
.watpl-bar__spacer { flex:1 1 auto; }
/* Chip kategori: tinggi ketuk dipaksa ke kontrak field kecil (36px). Chip
   bawaan ~31px; modul ini alat telepon satu tangan. Padding tumbuh, geometri
   (radius pill, tipografi, fokus) tidak berubah. */
.watpl-bar .vs-viewchip { min-height:var(--field-h-sm, 36px); }
.watpl-bar .vs-viewbar__label { font-family:var(--font-mono);
  font-size:var(--watpl-fs-kicker); letter-spacing:var(--ls-label-sm);
  text-transform:uppercase; color:var(--text-subtle); }

/* Pencarian — anatomi GUI/08/COMMAND-BAR, tapi <input> sungguhan */
.watpl-search { position:relative; display:flex; align-items:center; gap:var(--space-4);
  flex:1 1 auto; min-width:0; height:var(--field-h, 44px); padding:0 var(--space-4);
  background:var(--surface-1); border:1px solid var(--border-input);
  border-radius:var(--radius-sm); color:var(--text-subtle); cursor:text; }
.watpl-search:hover { border-color:var(--ink-300); }
.watpl-search:focus-within { border-color:var(--border-strong); box-shadow:var(--shadow-focus); }
.watpl-search > svg { flex:0 0 auto; }
.watpl-search__in { flex:1 1 auto; min-width:0; height:100%; border:0; outline:none;
  background:transparent; color:var(--text-strong);
  font:var(--fw-regular) var(--watpl-fs-bubble)/1 var(--font-body); }
.watpl-search__in::placeholder { color:var(--text-subtle); }
.watpl-search__in::-webkit-search-cancel-button { display:none; }
.watpl-search__x { flex:0 0 auto; display:inline-grid; place-items:center;
  width:26px; height:26px; border:0; border-radius:var(--radius-xs);
  background:transparent; color:var(--text-subtle); cursor:pointer;
  transition:background .12s ease, color .12s ease; }
.watpl-search__x:hover { background:var(--ink-050); color:var(--text-strong); }
.watpl-search__x:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
/* Keycap: border-bottom-width 2px adalah detail tanda tangan unitnya. */
.watpl-kbd { display:flex; gap:var(--space-2); flex:0 0 auto; }
.watpl-kbd kbd { font-family:var(--font-mono); font-size:var(--watpl-fs-kicker);
  padding:3px 6px; border:1px solid var(--border-default); border-bottom-width:2px;
  border-radius:var(--radius-xs); background:var(--surface-0); color:var(--text-muted); }

/* Pengalih tampilan — GUI/02/VIEW-SWITCHER, tombol ikon 40x32 pada track segmented */
.watpl-viewsw { flex:0 0 auto; width:fit-content; }
.watpl-viewsw__b { display:flex; align-items:center; justify-content:center;
  width:40px; height:32px; border:0; border-radius:var(--radius-xs);
  background:transparent; color:var(--text-muted); cursor:pointer;
  transition:background .15s ease, color .15s ease, box-shadow .15s ease; }
.watpl-viewsw__b:hover { color:var(--text-strong); }
.watpl-viewsw__b[aria-pressed="true"] { background:var(--surface-0);
  color:var(--text-strong); box-shadow:var(--shadow-xs); }
.watpl-viewsw__b:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-viewsw__b[aria-disabled="true"] { color:var(--text-disabled); cursor:not-allowed; }

/* Tombol filter + pemicu popover */
.watpl-fbtn { position:relative; display:inline-flex; align-items:center; gap:var(--space-3);
  min-height:var(--field-h-sm, 36px); padding:0 var(--space-4);
  border:1px solid var(--border-input); border-radius:var(--radius-sm);
  background:var(--surface-0); color:var(--text-muted);
  font:var(--fw-medium) var(--watpl-fs-meta)/1 var(--font-body); cursor:pointer;
  transition:color .14s ease, background .14s ease, border-color .14s ease; }
.watpl-fbtn:hover { color:var(--text-strong); border-color:var(--border-strong); }
.watpl-fbtn:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-fbtn[aria-expanded="true"],
.watpl-fbtn[aria-pressed="true"] { color:var(--text-strong); background:var(--ink-050);
  border-color:var(--border-strong); }
.watpl-fbtn--reset { color:var(--tag-danger-text); }
.watpl-fbtn--reset:hover { border-color:var(--tag-danger-border); background:var(--tag-danger-bg); }

/* Kontrak popover GUI/03/TEXT-SELECT-COMBOBOX — direproduksi apa adanya */
.watpl-pop { position:absolute; top:calc(100% + 6px); left:0; z-index:50;
  min-width:220px; max-height:224px; overflow:auto; padding:var(--space-1);
  background:var(--surface-0); border:1px solid var(--border-default);
  border-radius:var(--radius-sm); box-shadow:var(--shadow-pop); }
.watpl-pop__scrim { position:fixed; inset:0; z-index:40; }
.watpl-pop__row { display:flex; align-items:center; gap:var(--space-4); width:100%;
  min-height:42px; padding:var(--space-2) var(--space-4); border:0; border-radius:7px;
  background:transparent; color:var(--text-strong); text-align:left; cursor:pointer;
  font:var(--fw-semibold) var(--watpl-fs-bubble)/1.2 var(--font-body); }
.watpl-pop__row small { display:block; font-weight:var(--fw-regular);
  font-size:var(--watpl-fs-hint); color:var(--text-subtle); }
.watpl-pop__row:hover { background:var(--surface-1); }
.watpl-pop__row[aria-selected="true"] { background:var(--surface-1); }
.watpl-pop__row:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-pop__empty { padding:var(--space-4); text-align:center;
  font-size:var(--text-xs); color:var(--text-subtle); }

/* --- Wilayah hasil -------------------------------------------------------- */
.watpl-results { display:flex; flex-direction:column; gap:var(--space-5); min-width:0; }
.watpl-results[aria-busy="true"] { opacity:.55; }
.watpl-count { margin:0; font-family:var(--font-mono); font-size:var(--text-2xs);
  font-variant-numeric:tabular-nums; letter-spacing:var(--ls-label-sm);
  text-transform:uppercase; color:var(--text-subtle); }
.watpl-count[data-state="warn"] { color:var(--tag-warning-text); }
/* Rak kartu: minmax intrinsik. min(100%, 260px) mencegah luber di kotak 288px
   (viewport 320 + padding konten 16), 260 dipilih karena baris aksi butuh 216. */
.watpl-grid { display:grid; gap:var(--space-5);
  grid-template-columns:repeat(auto-fill, minmax(min(100%, 260px), 1fr)); }
.watpl-list { display:block; min-width:0; }

/* --- 3c · Kartu template -------------------------------------------------- */
.watpl-card { display:flex; flex-direction:column; gap:var(--space-3); min-width:0;
  overflow:visible; }
.watpl-card__head { display:flex; align-items:center; gap:var(--space-3);
  flex-wrap:wrap; min-width:0; }
.watpl-card__gap { flex:1 1 auto; }
.watpl-card__title { margin:0;
  font:var(--fw-semibold) var(--text-sm)/var(--lh-snug) var(--font-body);
  letter-spacing:var(--ls-tight, -.01em); color:var(--text-strong);
  display:-webkit-box; -webkit-line-clamp:2; line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden; overflow-wrap:anywhere; }
.watpl-card__link { color:inherit; text-decoration:none; }
.watpl-card__link::after { content:""; position:absolute; inset:0; }
.watpl-card__link:focus-visible { outline:none; }
.watpl-card:focus-within { box-shadow:var(--shadow-focus); }
/* Kontrol harus berada DI ATAS tautan yang direntangkan. */
.watpl-card__head > button,
.watpl-card__acts { position:relative; z-index:1; }
.watpl-card__snip { font:var(--fw-regular) var(--text-xs)/var(--lh-normal) var(--font-body);
  color:var(--text-muted); display:-webkit-box; -webkit-line-clamp:2; line-clamp:2;
  -webkit-box-orient:vertical; overflow:hidden; overflow-wrap:anywhere; }
.watpl-card__snip b { font-weight:var(--fw-bold); color:var(--text-body); }
.watpl-card__snip i { font-style:italic; }
.watpl-card__snip s { text-decoration:line-through; }
.watpl-card__snip code { font-family:var(--font-mono); font-size:0.90em; }
.watpl-card__att { display:flex; gap:var(--space-2); list-style:none; margin:0; padding:0;
  min-width:0; overflow:hidden; }
.watpl-card__att img { width:44px; height:44px; object-fit:cover; display:block;
  border-radius:var(--radius-xs); border:1px solid var(--border-default);
  background:var(--ink-050); }
.watpl-card__meta { margin:0; display:flex; align-items:center; gap:var(--space-2);
  flex-wrap:wrap; font-size:var(--watpl-fs-meta); color:var(--text-muted); }
.watpl-card__steps { margin:0; font-size:var(--watpl-fs-meta); color:var(--text-muted); }
.watpl-card__acts { display:flex; align-items:center; gap:var(--space-3);
  margin-top:auto; padding-top:var(--space-2); }
.watpl-card.is-archived { opacity:.72; }

/* Chip brand — pil berbingkai yang membawa NAMA brand (A11Y-06). */
.watpl-brand { display:inline-flex; align-items:center; gap:var(--space-2);
  min-height:22px; padding:2px 8px; border-radius:var(--radius-pill);
  border:1px solid var(--border-default); background:var(--surface-0);
  color:var(--text-muted); font:var(--fw-semibold) var(--text-2xs)/1.2 var(--font-body);
  letter-spacing:var(--ls-label-sm); text-transform:uppercase; white-space:nowrap; }
.watpl-brand::before { content:""; width:6px; height:6px; border-radius:var(--radius-pill);
  background:var(--ink-300); flex:0 0 auto; }
.watpl-brand--vircansa::before { background:var(--brand-vs-accent); }
.watpl-brand--luxa::before { background:var(--brand-luxa-accent); }
.watpl-brand--nussa::before { background:var(--brand-nussa-accent); }
.watpl-brand--all::before { background:var(--ink-300); }

/* SATU-SATUNYA elemen ber-isian aksen per keluarga layar (aturan R-2).
   Geometri dari tombol kirim GUI/23: tinggi 36 · radius 10 · 13.5/600. */
.watpl-copy, .watpl-open, .watpl-save {
  display:inline-flex; align-items:center; justify-content:center; gap:var(--space-3);
  min-width:88px; height:var(--field-h-sm, 36px); padding:0 var(--space-5);
  border:0; border-radius:var(--radius-sm);
  background:var(--brand-accent); color:var(--brand-accent-ink);
  font:var(--fw-semibold) var(--watpl-fs-bubble)/1 var(--font-body); cursor:pointer;
  transition:opacity .14s ease, background .14s ease, color .14s ease, box-shadow .14s ease; }
.watpl-card__acts .watpl-copy,
.watpl-card__acts .watpl-open { flex:1 1 auto; }
.watpl-copy:hover, .watpl-open:hover, .watpl-save:hover { opacity:.88; }
.watpl-copy:focus-visible, .watpl-open:focus-visible, .watpl-save:focus-visible {
  outline:none; box-shadow:var(--shadow-focus); }
.watpl-copy[disabled], .watpl-save[disabled] { opacity:.55; cursor:not-allowed; }
.watpl-save { height:var(--field-h, 44px); }
/* Tiga keadaan salin — warna DITEMANI pergantian glif dan label (A11Y-06). */
.watpl-copy.is-done { background:var(--tag-mint-bg); color:var(--tag-mint-text);
  box-shadow:inset 0 0 0 1px var(--tag-mint-border); }
.watpl-copy.is-failed { background:var(--tag-danger-bg); color:var(--tag-danger-text);
  box-shadow:inset 0 0 0 1px var(--tag-danger-border); }
.watpl-copy__ic { display:inline-flex; flex:0 0 auto; }
.watpl-copy__l { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.watpl-save.is-dirty { box-shadow:inset 0 0 0 2px var(--border-strong); }

/* Tombol ikon modul (36x36) */
.watpl-ib { display:inline-grid; place-items:center; flex:0 0 auto;
  width:var(--field-h-sm, 36px); height:var(--field-h-sm, 36px);
  border:1px solid var(--border-input); border-radius:var(--radius-xs);
  background:var(--surface-0); color:var(--text-muted); cursor:pointer;
  text-decoration:none; transition:background .16s ease, color .16s ease; }
.watpl-ib:hover { background:var(--ink-050); color:var(--text-strong); }
.watpl-ib[aria-pressed="true"] { background:var(--brand-soft, var(--identity-yellow-soft));
  border-color:var(--brand-line, var(--identity-yellow-shadow));
  color:var(--brand-ink, var(--text-strong)); }
.watpl-ib:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-ib[disabled] { color:var(--text-disabled); cursor:not-allowed; }

/* Mini-bubble masuk di kartu playbook: skenarionya ITU sendiri (05A 3g). */
.watpl-card__quote { padding:9px 13px; background:var(--surface-1);
  border:1px solid var(--border-default);
  border-radius:var(--watpl-r-tail) var(--radius-md) var(--radius-md) var(--radius-md);
  font:var(--fw-regular) var(--text-xs)/var(--lh-normal) var(--font-body);
  color:var(--text-body); overflow-wrap:anywhere;
  display:-webkit-box; -webkit-line-clamp:3; line-clamp:3; -webkit-box-orient:vertical;
  overflow:hidden; }

/* --- 3d · Tampilan tabel (reuse .sl-table*, seperti FIN-DB) --------------- */
.watpl-tablecard { display:flex; flex-direction:column; }
.watpl-tablescroll { min-width:0; overflow-x:auto; }
.watpl-table { min-width:760px; }
.watpl-table th { text-align:left; color:var(--text-subtle);
  font:var(--fw-semibold) var(--watpl-fs-kicker) var(--font-mono);
  letter-spacing:var(--ls-label-sm); text-transform:uppercase;
  border-bottom:1px solid var(--border-default); }
.watpl-table tbody tr { border-bottom:1px solid var(--border-faint); }
.watpl-table tbody tr:hover { background:var(--surface-1); }
.watpl-table tbody tr:focus-within { box-shadow:inset 0 0 0 2px var(--border-strong); }
.watpl-table tbody tr.is-archived { opacity:.72; }
.watpl-table th.watpl-th-num, .watpl-table td.watpl-td-num { text-align:right;
  white-space:nowrap; }
.watpl-table td.watpl-td-num { font-family:var(--font-mono);
  font-variant-numeric:tabular-nums; font-size:var(--watpl-fs-meta);
  color:var(--text-strong); }
.watpl-table td.watpl-td-num svg { vertical-align:middle; color:var(--text-subtle); }
.watpl-table .watpl-tagline { display:inline-block; max-width:180px; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; font-size:var(--watpl-fs-meta);
  color:var(--text-muted); }
.watpl-table td.watpl-td-acts { width:1%; white-space:nowrap; }
.watpl-table td.watpl-td-acts > * + * { margin-left:var(--space-3); }
.watpl-table .sl-sort[aria-current="true"] { color:var(--text-strong); }
.watpl-table th[aria-sort="descending"] .sl-sort svg { transform:rotate(180deg); }
.watpl-table th[aria-sort] .sl-sort svg { transition:transform .12s ease; }

/* --- 3e / 3i · Editor dua kolom ------------------------------------------ */
/* Kolom kanan punya maksimum intrinsik keras: bubble 340 + 2x20 panggung. */
.watpl-editor { display:grid; gap:var(--space-7); align-items:start;
  grid-template-columns:minmax(0,1fr) minmax(0,380px); }
.watpl-editor__pane, .watpl-editor__side { min-width:0;
  height:calc(100dvh - 64px - var(--space-8)); overflow-y:auto; }
.watpl-editor__pane { display:flex; flex-direction:column; gap:var(--space-5); }
.watpl-editor__side { display:flex; flex-direction:column; gap:var(--space-5); }
.watpl-panelh { display:flex; flex-direction:column; gap:var(--space-1); margin:0;
  font:var(--fw-semibold) var(--text-h4)/var(--lh-snug) var(--font-body);
  letter-spacing:var(--ls-tight, -.01em); color:var(--text-strong); }

/* Shell komposer — WSP/08/COMPOSER: toolbar DI ATAS + garis rambut bawah. */
.watpl-comp { display:flex; flex-direction:column; overflow:hidden; box-sizing:border-box;
  background:var(--surface-0); border:1px solid var(--border-default);
  border-radius:var(--radius-md); box-shadow:var(--shadow-xs); }
.watpl-comp__tools { display:flex; align-items:center; gap:var(--space-1); flex-wrap:wrap;
  padding:6px var(--space-3); border-bottom:1px solid var(--border-faint); }
.watpl-comp__gap { flex:1 1 auto; }
.watpl-fmt { display:inline-grid; place-items:center; width:28px; height:28px;
  border:0; border-radius:var(--radius-xs); background:transparent;
  color:var(--text-subtle); cursor:pointer;
  transition:background .12s ease, color .12s ease; }
.watpl-fmt:hover { background:var(--ink-050); color:var(--text-strong); }
.watpl-fmt:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-fmt[aria-pressed="true"] { background:var(--ink-050); color:var(--text-strong); }
/* FLAG-4: glif `code` dipakai dua kali (inline vs blok). Pembeda hanya CSS
   token — kotak berbingkai di sekeliling glif yang sama = "blok". */
.watpl-fmt--block { box-shadow:inset 0 0 0 1px var(--border-default); }
.watpl-fmt__sep { width:1px; align-self:stretch; margin:var(--space-1) var(--space-2);
  background:var(--border-faint); }
.watpl-comp__ta { border:0; outline:none; resize:vertical; min-height:220px; width:100%;
  padding:11px 13px; background:transparent; color:var(--text-strong);
  font:var(--fw-regular) var(--text-xs)/var(--lh-normal) var(--font-mono); }
.watpl-comp__ta:focus-visible { box-shadow:inset 0 0 0 2px var(--primary); }
.watpl-comp__foot { display:flex; align-items:center; gap:var(--space-2); flex-wrap:wrap;
  padding:7px var(--space-3); border-top:1px solid var(--border-faint);
  background:var(--surface-1); }
.watpl-varsh { font-size:var(--watpl-fs-hint); color:var(--text-subtle); }
/* .vs-tag--square belum ada di app; ini port 1:1 dari GUI/07 Tag.jsx. */
.vs-tag--square { border-radius:var(--radius-xs); }
.watpl-var { font-family:var(--font-mono); cursor:pointer; }
.watpl-var:hover { color:var(--text-strong); border-color:var(--border-strong); }
.watpl-var:focus-visible { outline:none; box-shadow:var(--shadow-focus); }

/* Bidang taksonomi */
.watpl-fields { display:grid; gap:var(--space-5);
  grid-template-columns:repeat(auto-fit, minmax(min(100%, 240px), 1fr)); }
.watpl-f { display:flex; flex-direction:column; gap:7px; min-width:0; }
.watpl-f--wide { grid-column:1 / -1; }
.watpl-f > span { font:var(--fw-semibold) var(--text-xs)/1.2 var(--font-body);
  color:var(--text-strong); }
.watpl-f .watpl-hint { font-size:var(--text-2xs); color:var(--text-subtle); }
.watpl-f.is-invalid > .ctrl { border-color:var(--tag-danger-border); }
.watpl-ferr { margin:0; font-size:var(--watpl-fs-hint); color:var(--tag-danger-text); }

/* Panggung pratinjau + baris commit */
.watpl-stage { display:flex; flex-direction:column; gap:var(--space-3);
  align-items:flex-end; padding:var(--space-6);
  background:var(--bg-inset); border:1px solid var(--border-default);
  border-radius:var(--radius-md); }
.watpl-stage__att { display:flex; gap:var(--space-3); flex-wrap:wrap; list-style:none;
  margin:0; padding:0; align-self:stretch; }
.watpl-stage__att img { width:128px; height:96px; object-fit:cover; display:block;
  border-radius:var(--radius-sm); border:1px solid var(--border-default);
  background:var(--ink-050); }
.watpl-commit { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; }
.watpl-commit .abtn { min-height:var(--field-h, 44px); }

/* --- 3f · Lampiran, DUA keadaan ------------------------------------------ */
.watpl-att { display:flex; flex-direction:column; gap:var(--space-3); min-width:0; }
.watpl-att__head { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; }
.watpl-att__n { font-size:var(--text-2xs); color:var(--text-subtle); }
.watpl-att__grid { display:flex; gap:var(--space-3); flex-wrap:wrap; list-style:none;
  margin:0; padding:0; }
.watpl-att__it { position:relative; width:128px; height:96px; overflow:hidden;
  border:1px solid var(--border-default); border-radius:var(--radius-sm);
  background:var(--ink-050); }
.watpl-att__it img { width:100%; height:100%; object-fit:cover; display:block; }
.watpl-att__it--add { border-style:dashed; border-color:var(--ink-300);
  background:transparent; }
.watpl-att__it--add > button { width:100%; height:100%; display:grid; place-items:center;
  gap:var(--space-2); border:0; background:transparent; color:var(--text-disabled);
  font-size:var(--watpl-fs-hint); cursor:pointer; }
.watpl-att__it--add > button:hover { color:var(--text-strong); }
.watpl-att__it--add > button:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-att__x { position:absolute; top:var(--space-2); right:var(--space-2);
  display:inline-grid; place-items:center; width:24px; height:24px; border:0;
  border-radius:var(--radius-xs); background:var(--bg-ink); color:var(--text-on-dark);
  cursor:pointer; opacity:.86; }
.watpl-att__x:hover { opacity:1; }
.watpl-att__x:focus-visible { outline:none; box-shadow:var(--shadow-focus-brand); }
.watpl-att__cp { position:absolute; left:var(--space-2); bottom:var(--space-2);
  display:inline-flex; align-items:center; gap:var(--space-2); height:24px;
  padding:0 var(--space-3); border:0; border-radius:var(--radius-xs);
  background:var(--watpl-on-ink-20); color:var(--text-on-dark);
  font:var(--fw-semibold) var(--text-2xs)/1 var(--font-body); cursor:pointer;
  backdrop-filter:saturate(140%) blur(6px); }
.watpl-att__cp:focus-visible { outline:none; box-shadow:var(--shadow-focus-brand); }
/* Keadaan MATI (default: media_library_v1_enabled = 0). Panel informatif —
   tanpa kontrol nonaktif, tidak pernah memblokir Simpan (aturan R-6).
   Padding bawaan .fin-state dipertahankan; blok ini hanya memberi bingkai. */
.watpl-att[data-state="off"] > .fin-state,
.watpl-att[data-state="denied"] > .fin-state {
  background:var(--surface-1); border:1px solid var(--border-default);
  border-radius:var(--radius-md); }
/* Keadaan kosong / galat / izin / konflik di wilayah hasil, editor, dan viewer
   memakai finStateHTML() yang sudah ada; modul hanya membingkainya jadi kartu. */
.watpl-results > .fin-state,
.watpl-editor__pane > .fin-state,
.watpl-chat > .fin-state {
  background:var(--surface-0); border:1px solid var(--border-default);
  border-radius:var(--radius-md); }
.watpl-chat > .fin-state { align-self:stretch; background:var(--surface-0); }

/* --- 3h · Simulasi chat --------------------------------------------------- */
.watpl-chat__head { display:flex; align-items:center; gap:var(--space-4);
  padding:var(--space-4) var(--space-5);
  background:var(--surface-0); border:1px solid var(--border-default);
  border-left:3px solid var(--brand-accent);
  border-radius:var(--radius-md); box-shadow:var(--shadow-xs); }
.watpl-chat__ava { width:36px; height:36px; }
.watpl-chat__id { display:flex; flex-direction:column; gap:1px; min-width:0; }
.watpl-chat__id > b { font:var(--fw-semibold) var(--text-sm)/1.2 var(--font-body);
  color:var(--text-strong); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.watpl-chat__id > small { font-size:var(--watpl-fs-hint); color:var(--text-muted); }

/* Panggung transkrip. Ukuran baca dikunci ke var(--container-sm) TANPA kueri
   min-width: max-width tidak mengikat di bawah 720px, jadi hasilnya identik
   dengan RR-05 tanpa menambah nilai breakpoint baru (05A FLAG-3). */
.watpl-chat { display:flex; flex-direction:column; gap:10px;
  padding:var(--space-5) var(--space-4) var(--space-8);
  background:var(--bg-inset); border:1px solid var(--border-default);
  border-radius:var(--radius-md);
  max-width:var(--container-sm, 720px); margin-inline:auto; width:100%; }
.watpl-chat--pane { max-height:calc(100dvh - 220px); overflow-y:auto;
  max-width:100%; margin-inline:0; }

.watpl-day { display:flex; align-items:center; gap:var(--space-4); margin:var(--space-1) 0;
  align-self:stretch; }
.watpl-day > span { flex:1; height:1px; background:var(--border-default); }
.watpl-day > b { font-family:var(--font-mono); font-size:var(--watpl-fs-kicker);
  font-weight:var(--fw-semibold); letter-spacing:var(--ls-label-sm);
  text-transform:uppercase; color:var(--text-subtle); }

.watpl-msg { position:relative; display:flex; gap:9px; align-items:flex-end;
  max-width:82%; min-width:0; }
.watpl-msg--in { align-self:flex-start; }
.watpl-msg--out { align-self:flex-end; flex-direction:column; align-items:flex-end; }
.watpl-msg__ava { flex:0 0 24px; width:24px; height:24px; font-size:9px; }
.watpl-msg__col { display:flex; flex-direction:column; gap:3px; min-width:0; }
.watpl-msg--out .watpl-msg__col { align-items:flex-end; }

/* Grouping — WSP/08/MESSAGE:133 (`grouped: i > 0`). Hanya bubble PERTAMA di
   satu rentetan yang menyimpan sudut tajamnya; itulah yang menjual ilusinya. */
.watpl-msg + .watpl-msg.is-grouped { margin-top:-7px; }
.watpl-msg.is-grouped .watpl-msg__ava { visibility:hidden; }
.watpl-msg.is-grouped .watpl-stamp { display:none; }
.watpl-msg.is-grouped .watpl-bub--in { border-top-left-radius:var(--radius-md); }
.watpl-msg.is-grouped .watpl-bub--out { border-top-right-radius:var(--radius-md); }

/* Geometri bubble — GUI/23/CHAT-BUBBLE. Ekor = asimetri sudut 4px, BUKAN
   segitiga pseudo-element (aturan R-8: ::before/::after dicadangkan untuk
   label pembicara tersembunyi). */
.watpl-bub { max-width:100%; padding:9px 13px; word-break:break-word;
  overflow-wrap:anywhere;
  font:var(--fw-regular) var(--watpl-fs-bubble)/var(--lh-normal) var(--font-body); }
.watpl-bub--in { background:var(--surface-0); border:1px solid var(--border-default);
  color:var(--text-body);
  border-radius:var(--watpl-r-tail) var(--radius-md) var(--radius-md) var(--radius-md); }
.watpl-bub--out { background:var(--bg-ink); border:0; color:var(--text-on-dark);
  border-radius:var(--radius-md) var(--watpl-r-tail) var(--radius-md) var(--radius-md); }
/* Bubble di panggung komposer dibatasi 340px (ukuran baca WhatsApp nyata);
   di viewer penuh batasnya berasal dari 82% baris (RR-05 preserve). */
.watpl-stage .watpl-bub { max-width:340px; }
.watpl-bub--media { padding:3px; overflow:hidden; }
.watpl-bub--media img { display:block; max-width:100%; height:auto;
  border-radius:calc(var(--radius-md) - 3px); }
.watpl-bub--empty { color:var(--text-subtle); font-style:italic; }

/* Tipografi kaya di dalam bubble ~340px. waFormatToHtml kini juga memancarkan
   ol/li/blockquote/code inline; tanpa aturan ini UA memberi indent 40px dan
   margin 1em yang merusak kotak (ADR CT-005). */
.watpl-bub > :first-child { margin-top:0; }
.watpl-bub > :last-child { margin-bottom:0; }
.watpl-bub p { margin:var(--space-2) 0; }
.watpl-bub b { font-weight:var(--fw-bold); }
.watpl-bub i { font-style:italic; }
.watpl-bub s { text-decoration:line-through; }
.watpl-bub a { color:inherit; text-decoration:underline; text-underline-offset:2px; }
.watpl-bub ul, .watpl-bub ol { margin:var(--space-2) 0; padding-left:18px; }
.watpl-bub li { margin:0; padding-left:2px; }
.watpl-bub ol { list-style:decimal; }
.watpl-bub ul { list-style:disc; }
.watpl-bub li::marker { font-family:var(--font-mono); font-size:0.92em; }
.watpl-bub blockquote { margin:var(--space-2) 0; padding:2px 0 2px var(--space-4);
  border-left:3px solid var(--ink-300); color:var(--text-muted); }
.watpl-bub code { font-family:var(--font-mono); font-size:0.90em; padding:1px 4px;
  border-radius:var(--radius-xs); background:var(--bg-inset); color:var(--text-body);
  white-space:pre-wrap; word-break:break-word; overflow-wrap:anywhere; }
/* Penimpaan bubble tinta — diturunkan dari --text-on-dark lewat color-mix. */
.watpl-bub--out b { color:var(--text-on-dark); }
.watpl-bub--out a { color:var(--text-on-dark); }
.watpl-bub--out blockquote { border-left-color:var(--watpl-on-ink-20);
  color:var(--text-on-dark-muted); }
.watpl-bub--out code { background:var(--watpl-on-ink-10); color:var(--text-on-dark); }
.watpl-bub--out li::marker { color:var(--text-on-dark-muted); }

/* Baris timestamp — mono, BUKAN font body (GUI/23 eksplisit).
   Deviasi terdokumentasi (a11y): --text-subtle hanya 3.76:1 di atas --bg-inset
   pada 10px, jadi dipakai --text-muted (9.87:1). */
.watpl-stamp { display:inline-flex; align-items:center; gap:var(--space-2);
  font-family:var(--font-mono); font-size:var(--watpl-fs-stamp);
  font-variant-numeric:tabular-nums; color:var(--text-muted); }
.watpl-msg--in .watpl-stamp { padding-left:var(--space-2); }
.watpl-msg--out .watpl-stamp { padding-right:var(--space-2); justify-content:flex-end; }
.watpl-stamp svg { flex:0 0 auto; }

/* Lencana sumber template */
.watpl-src { display:inline-flex; align-items:center; gap:var(--space-2);
  font-size:var(--watpl-fs-hint); color:var(--accent-blue); text-decoration:none; }
.watpl-src:hover { text-decoration:underline; text-underline-offset:3px; }
.watpl-src:focus-visible { outline:none; box-shadow:var(--shadow-focus);
  border-radius:var(--radius-xs); }
.watpl-src--stale { color:var(--tag-warning-text); }

/* Catatan pelatihan — permukaan "hint" milik app (--brand-soft/--brand-line),
   BUKAN nada peringatan: catatan pelatih bukan masalah, itu suara VS OS.
   Karena itu ia netral-brand dan tidak ikut .watpl-brandskin (aturan R-9). */
.watpl-note { display:flex; gap:var(--space-3); align-self:stretch;
  margin:var(--space-1) 0 var(--space-2) 33px; padding:var(--space-4);
  background:var(--brand-soft, var(--identity-yellow-soft));
  border:1px solid var(--brand-line, var(--identity-yellow-shadow));
  border-left-width:3px; border-radius:var(--radius-sm);
  color:var(--text-body); font-size:var(--watpl-fs-hint); line-height:var(--lh-normal); }
.watpl-note > svg { flex:0 0 auto; color:var(--text-muted); }
.watpl-note p { margin:0; }
.watpl-chat[data-clean="1"] .watpl-note,
.watpl-chat[data-clean="1"] .watpl-src { display:none; }

/* Pengalih varian A/B — track segmented di atas kolom bubble */
.watpl-vsw { margin-bottom:var(--space-2); max-width:100%; flex-wrap:wrap; }
.watpl-vsw .vs-tab { min-height:28px; padding:0 var(--space-4); font-size:var(--text-2xs); }
.watpl-vsw .vs-tab[aria-checked="true"] { color:var(--text-strong);
  background:var(--surface-0); box-shadow:var(--shadow-xs); }

/* Toolbar aksi per-bubble — WSP/08/MESSAGE, melayang di atas baris.
   opacity/pointer-events (BUKAN display:none) supaya Tab tetap menjangkaunya. */
.watpl-acts { position:absolute; top:-14px; right:12px; z-index:6;
  display:flex; gap:var(--space-1); padding:3px;
  background:var(--surface-0); border:1px solid var(--border-default);
  border-radius:var(--radius-sm); box-shadow:var(--shadow-pop);
  opacity:0; pointer-events:none; transition:opacity .12s ease; }
.watpl-msg:hover .watpl-acts,
.watpl-msg:focus-within .watpl-acts { opacity:1; pointer-events:auto; }
.watpl-acts__b { display:inline-grid; place-items:center; width:28px; height:28px;
  border:0; border-radius:var(--radius-xs); background:transparent;
  color:var(--text-muted); cursor:pointer; transition:background .12s ease; }
.watpl-acts__b:hover { background:var(--ink-050); color:var(--text-strong); }
.watpl-acts__b:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-acts__b.is-done { color:var(--tag-mint-text); }

/* --- 3i · Editor langkah playbook ---------------------------------------- */
.watpl-editor--pb .watpl-editor__side { gap:var(--space-4); }
.watpl-steps { display:flex; flex-direction:column; gap:var(--space-2);
  list-style:none; margin:0; padding:0; counter-reset:watplstep; }
.watpl-step { position:relative; display:grid; align-items:center; gap:var(--space-3);
  grid-template-columns:auto auto minmax(0,1fr) auto auto;
  padding:var(--space-3) var(--space-4);
  border:1px solid var(--border-default); border-left:3px solid transparent;
  border-radius:var(--radius-sm); background:var(--surface-0); cursor:pointer;
  transition:background .12s ease, border-color .12s ease; }
.watpl-step:hover { background:var(--surface-1); }
.watpl-step:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-step.is-selected { border-left-color:var(--primary); background:var(--surface-1); }
.watpl-step.is-dragging { opacity:.5; }
.watpl-step.is-over { box-shadow:inset 0 2px 0 0 var(--primary); }
.watpl-step.is-invalid { border-color:var(--tag-danger-border); }
.watpl-step__grip { display:inline-flex; color:var(--text-disabled); cursor:grab; }
.watpl-step__dir { display:inline-flex; align-items:center; gap:var(--space-2);
  min-height:22px; padding:2px 8px; border-radius:var(--radius-pill);
  border:1px solid var(--border-default); background:var(--surface-1);
  color:var(--text-muted); font:var(--fw-semibold) var(--text-2xs)/1.2 var(--font-body);
  white-space:nowrap; }
.watpl-step__dir--out { background:var(--bg-ink); border-color:transparent;
  color:var(--text-on-dark); }
.watpl-step__txt { margin:0; min-width:0; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; font-size:var(--watpl-fs-meta); color:var(--text-body); }
.watpl-step__badges { display:inline-flex; gap:var(--space-2); flex:0 0 auto; }
.watpl-step__ops { display:inline-flex; gap:var(--space-2); flex:0 0 auto; }
.watpl-step__ops .watpl-ib { width:32px; height:32px; }
.watpl-step__err { grid-column:1 / -1; margin:0; font-size:var(--watpl-fs-hint);
  color:var(--tag-danger-text); }
.watpl-steps__add { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap;
  margin-top:var(--space-4); }
.watpl-steps__add .watpl-hint { margin-left:auto; }
.watpl-stepform { display:flex; flex-direction:column; gap:var(--space-4);
  margin-top:var(--space-5); padding:var(--space-5);
  background:var(--surface-1); border:1px solid var(--border-default);
  border-radius:var(--radius-md); }
/* Disclosure pratinjau (RR-07). Terbuka di layar lebar, tertutup di sempit. */
.watpl-pvdisc { display:none; align-items:center; gap:var(--space-3);
  min-height:var(--field-h-sm, 36px); padding:0 var(--space-4);
  border:1px solid var(--border-input); border-radius:var(--radius-sm);
  background:var(--surface-0); color:var(--text-strong);
  font:var(--fw-semibold) var(--watpl-fs-meta)/1 var(--font-body); cursor:pointer; }
.watpl-pvdisc:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-pvdisc svg:last-child { margin-left:auto; transition:transform .14s ease; }
.watpl-pvdisc[aria-expanded="true"] svg:last-child { transform:rotate(180deg); }

/* --- 3j · Bagian "Template Sistem" (baca-saja) ---------------------------- */
.watpl-sys { display:flex; flex-direction:column;
  border:1px solid var(--border-default); border-radius:var(--radius-md);
  background:var(--surface-0); overflow:hidden; }
.watpl-sys__toggle { display:flex; align-items:center; gap:var(--space-3);
  width:100%; min-height:var(--field-h, 44px); padding:0 var(--space-5);
  border:0; background:transparent; color:var(--text-strong);
  font:var(--fw-semibold) var(--text-xs)/1 var(--font-body); cursor:pointer; text-align:left;
  transition:background .12s ease; }
.watpl-sys__toggle:hover { background:var(--surface-1); }
.watpl-sys__toggle:focus-visible { outline:none; box-shadow:var(--shadow-focus); }
.watpl-sys__toggle > svg:last-child { transition:transform .14s ease; }
.watpl-sys__toggle[aria-expanded="true"] > svg:last-child { transform:rotate(180deg); }
.watpl-sys__t { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.watpl-sys__body { display:flex; flex-direction:column; gap:var(--space-4);
  padding:var(--space-5); border-top:1px solid var(--border-faint);
  background:var(--surface-1); }
.watpl-sys__list { display:flex; flex-direction:column; gap:var(--space-2);
  list-style:none; margin:0; padding:0; }
.watpl-sys__it { display:grid; align-items:center; gap:var(--space-3);
  grid-template-columns:auto minmax(0,1fr) auto; padding:var(--space-3) var(--space-4);
  background:var(--surface-0); border:1px solid var(--border-default);
  border-radius:var(--radius-sm); }
.watpl-sys__it > b { min-width:0; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; font:var(--fw-semibold) var(--text-xs)/1.3 var(--font-body);
  color:var(--text-strong); }
.watpl-sys__it > small { grid-column:2; font-size:var(--watpl-fs-hint);
  color:var(--text-muted); }
.watpl-sys__it > .watpl-ib { grid-row:1 / span 2; grid-column:3; }

/* --- Skin brand (VS default = :root) -------------------------------------
   Blok [data-brand] milik tokens.css TIDAK terpasang global di admin; setiap
   permukaan mendeklarasikan skin-nya sendiri (preseden .auth-wrap--admin
   [data-brand], admin.css:40-51). Aksen brand hanya boleh menyentuh: garis
   tepi kepala chat, chip brand, dan SATU tombol commit (aturan R-9). */
.watpl-brandskin[data-brand="luxa"] {
  --brand-accent:var(--brand-luxa-accent);
  --brand-accent-ink:var(--text-on-dark);
  --brand-gradient:var(--brand-luxa-grad);
}
.watpl-brandskin[data-brand="nussa"] {
  --brand-accent:var(--brand-nussa-accent);
  --brand-accent-ink:var(--text-on-dark);
  --brand-gradient:var(--brand-nussa-grad);
}
/* FLAG-1 — celah token: aksen NUSSA di atas tinta putihnya hanya 3.47:1,
   lolos ambang komponen 3:1 tapi GAGAL AA untuk label teks 13.5px. Tidak ada
   --brand-accent-ink-strong dan tidak ada nilai baru yang dikarang: di bawah
   skin NUSSA tombol commit jatuh ke primary tinta (21:1). Aksen NUSSA tetap
   hidup sebagai garis kepala + titik chip brand. */
.watpl-brandskin[data-brand="nussa"] .watpl-copy,
.watpl-brandskin[data-brand="nussa"] .watpl-open,
.watpl-brandskin[data-brand="nussa"] .watpl-save {
  background:var(--primary); color:var(--primary-contrast);
}

/* --- Modal modul (salin manual, konflik, kelola kategori) ----------------- */
.watpl-modal { display:flex; flex-direction:column; gap:var(--space-4); min-width:0; }
.watpl-modal__ta { width:100%; min-height:180px; resize:vertical;
  padding:11px 13px; border:1px solid var(--border-input);
  border-radius:var(--radius-sm); background:var(--surface-0); color:var(--text-strong);
  font:var(--fw-regular) var(--text-xs)/var(--lh-normal) var(--font-mono); }
.watpl-modal__ta:focus-visible { outline:none; box-shadow:var(--shadow-focus); }

/* ==========================  RESPONSIF  ==================================
   Hanya tangga app: 1180 / 900 / 860 / 760 / 560 (05A FLAG-3).
   (pointer:coarse) bukan breakpoint lebar; ia diwajibkan 05A 4.3 + A11Y-03
   supaya aksi per-bubble selalu terlihat di layar sentuh.
   ======================================================================== */

/* RR-07 — editor langkah: kolom pratinjau kehilangan ruang teks langkah. */
@media (max-width:1180px) {
  .watpl-editor--pb { grid-template-columns:minmax(0,1fr); }
  .watpl-editor--pb .watpl-editor__pane,
  .watpl-editor--pb .watpl-editor__side { height:auto; overflow:visible; }
  .watpl-editor--pb .watpl-pvdisc { display:flex; }
  .watpl-editor--pb .watpl-chat--pane { max-height:none; }

  /* watplfix2 — KOREKSI AMBANG RR-04. Ambang stack komposer template dulu 900px,
     padahal kolom pratinjaunya dipatok 380px sama seperti editor langkah di atas.
     Diukur: pane editor 472px @1180 → 392 @1100 → 292 @1000 → 193 @901, dan
     textarea-nya 420 → 340 → 240 → **141px** — jauh di bawah ambang "44 karakter"
     yang jadi alasan RR-04 sendiri. Jadi 900 memang keliru, bukan keputusan desain
     baru: dipindah ke 1180 agar konsisten dengan .watpl-editor--pb yang sudah
     memakai ambang ini karena kendala yang sama persis. Di atas 1180 pane editor
     dapat ≥760px, cukup lebar. */
  .watpl-editor { grid-template-columns:minmax(0,1fr); }
  .watpl-editor .watpl-editor__pane,
  .watpl-editor .watpl-editor__side { height:auto; overflow:visible; }
  .watpl-stage { align-items:stretch; }
  .watpl-stage .watpl-bub { max-width:100%; }
}

/* RR-04 — komposer: di bawah 900 textarea turun di bawah 44 karakter, dan
   pratinjau pindah ke bawah editor (DOM order = urutan cat, tanpa `order`). */
@media (max-width:900px) {
  .watpl-editor { grid-template-columns:minmax(0,1fr); }
  .watpl-editor__pane, .watpl-editor__side { height:auto; overflow:visible; }
  .watpl-stage { align-items:stretch; }
  .watpl-stage .watpl-bub { max-width:100%; }
}

/* 860 — di sini sidebar diganti .mnav dan .crumb disembunyikan, sehingga
   tinggi header tidak lagi bisa diketahui: bilah berhenti sticky (05A D-1).
   Padding bawah TIDAK ditambah; .content sudah 108px di lebar ini. */
@media (max-width:860px) {
  .watpl-bar { position:static; top:auto; }
}

/* RR-03 / RR-02 — di bawah 760 tabel butuh geser mendatar untuk mencapai
   kolom aksi, jadi kartu dipaksa; rel kategori menggulir (aturan .vs-viewbar
   __list sudah ada di app) dan diberi tanda tepi bahwa masih ada isinya. */
@media (max-width:760px) {
  .watpl-bar__row--cats .vs-viewbar__list {
    -webkit-mask-image:linear-gradient(to right, var(--bg-ink) calc(100% - 24px), transparent);
    mask-image:linear-gradient(to right, var(--bg-ink) calc(100% - 24px), transparent);
  }
  .watpl-step { grid-template-columns:auto auto minmax(0,1fr); }
  .watpl-step__badges, .watpl-step__ops { grid-column:1 / -1; }
  .watpl-step__ops { justify-content:flex-end; }
  .watpl-editor--pb .watpl-chat--pane { padding:var(--space-4) var(--space-3) var(--space-6); }
}

/* RR-01 / RR-06 — pencarian jatuh di bawah 240px dan placeholder terpotong
   di tengah kata; bubble mulai memproduksi baris dua-kata. */
@media (max-width:560px) {
  .watpl-bar__row { flex-wrap:wrap; }
  .watpl-search { flex:1 1 100%; }
  .watpl-kbd { display:none; }
  .watpl-msg { max-width:88%; }
  .watpl-msg__ava { flex:0 0 20px; width:20px; height:20px; }
  .watpl-note { margin-left:var(--space-7); }
  .watpl-att__it, .watpl-att__it--add { width:104px; height:78px; }
  .watpl-stage__att img { width:104px; height:78px; }
  .watpl-fields { grid-template-columns:minmax(0,1fr); }
}

/* Sentuh: tidak ada hover, jadi toolbar bubble tidak boleh bersembunyi. */
@media (pointer:coarse) {
  .watpl-acts { position:static; opacity:1; pointer-events:auto;
    align-self:flex-end; background:transparent; border:0; box-shadow:none; padding:0; }
}

/* Gerak berkurang — WAJIB berpasangan dengan setiap transform/transition. */
@media (prefers-reduced-motion: reduce) {
  .watpl-card.vs-card--interactive:hover { transform:none; }
  .watpl-card, .watpl-copy, .watpl-open, .watpl-save, .watpl-ib, .watpl-fmt,
  .watpl-fbtn, .watpl-viewsw__b, .watpl-search__x, .watpl-acts, .watpl-acts__b,
  .watpl-step, .watpl-sys__toggle, .watpl-pvdisc { transition:none; }
  .watpl-sys__toggle > svg:last-child,
  .watpl-pvdisc svg:last-child,
  .watpl-table th[aria-sort] .sl-sort svg { transition:none; }
}

/* ======================  PERBAIKAN RENDER (watplfix1)  ===================
   Delapan cacat render yang ditemukan verifikasi browser atas kode TERKIRIM,
   diperbaiki MURNI dari CSS. Semua aturan di bawah ADITIF: tidak ada satu pun
   baris di atas yang diubah — yang dipakai hanya urutan kaskade (aturan
   berspesifisitas sama yang datang belakangan menang). Kontrak blok tetap:
   nol nilai warna literal, breakpoint hanya dari tangga app (di sini 560),
   tanpa @container, tanpa transisi baru sehingga blok gerak-berkurang di atas
   tetap lengkap.
   ========================================================================= */

/* FIX-1 · komposer runtuh jadi 2px (≥901px) -------------------------------
   .watpl-editor__pane adalah flex kolom bertinggi TETAP dengan overflow-y:auto.
   Per spesifikasi flexbox, item flex yang overflow-nya bukan `visible` memakai
   ukuran minimum otomatis NOL. .watpl-comp satu-satunya saudara ber-overflow:
   hidden, jadi SELURUH kelebihan tinggi pane diambil darinya — pada keadaan
   kirim bawaan (media_library_v1_enabled=0) panel lampiran saja 551px, jadi
   komposer 298px terperas jadi celah 2px sementara toolbar, textarea, dan
   kakinya tetap tergambar penuh. Pane tetap pemilik gulir (05A 1.4 · RR-04):
   yang diperbaiki hanya larangan menyusut, bukan siapa yang menggulir. */
.watpl-comp { flex:0 0 auto; }

/* FIX-2 · catatan penggunaan meluber menutupi seluruh kolom tabel ----------
   Aturan library memotong SPAN DI DALAM small (.sl-client small > span,
   admin.css:10345), sementara watplTableHTML memancarkan <small> berisi simpul
   teks telanjang — ellipsis tidak pernah kena, dan inline-flex + nowrap
   membuatnya mencetak sampai ~1013px melewati selnya di 12 dari 12 baris.
   text-overflow hanya berlaku untuk kotak blok, jadi small dikembalikan ke
   blok lalu memotong dirinya sendiri. `b` (judul, juga nowrap) diberi pagar
   yang sama karena ia item flex blockified dengan cacat identik. */
.watpl-table .sl-client small,
.watpl-table .sl-client b { display:block; max-width:100%;
  overflow:hidden; text-overflow:ellipsis; }
/* Kolom Aksi: setelah luberan berhenti, lebar geser tabel turun dari 1273px ke
   1047px di 1280 dan HILANG sama sekali di 1440. Sisa 73px di 1280 adalah
   lebar min-content tabel yang jujur (1046,7px untuk 8 kolom di kanal 974px),
   bukan cacat — memangkasnya lebih jauh berarti memotong isi kolom Tag (dua
   dari dua belas baris sudah menyentuh 131-134px) demi ~24px. Itu keputusan
   pemilik, bukan perbaikan render, jadi .watpl-tagline dibiarkan 180px. */

/* FIX-9 · TAMBAHAN — tautan direntangkan membajak SELURUH kartu tabel --------
   Ditemukan saat memverifikasi FIX-2, cacat lama yang berdiri sendiri:
   .watpl-card__link::after (inset:0) memakai blok penampung berposisi TERDEKAT.
   Di tampilan kartu itu .watpl-card sendiri, jadi benar. Di tabel tidak ada
   tr/td berposisi, sehingga penampungnya melompat ke .watpl-tablecard (.vs-card
   = position:relative) dan setiap baris merentangkan lapisan 974x814 di atas
   seluruh tabel. Terbukti dengan elementFromPoint: di 12 dari 12 baris — juga
   TEPAT di atas tombol salin/aksi — yang tertangkap selalu tautan baris
   TERAKHIR. Tabel tidak butuh tautan-rentang: judulnya sendiri sudah <a> dan
   kolom Aksi punya kontrol sendiri, jadi pseudo-elemennya dimatikan di sana
   saja; anatomi kartu tidak tersentuh. */
.watpl-table .watpl-card__link::after { content:none; }

/* FIX-3 · atribut [hidden] dikalahkan display flex/grid --------------------
   Pola rumah yang sudah dipakai ~10 kali di berkas ini (.pos-*-menu[hidden],
   .ws-chat-panel[hidden], .ed-pane[hidden]) belum pernah dipasang di blok ini.
   Lima elemen terbukti tetap tergambar meski beratribut hidden: badan
   "Template Sistem" (baca-saja, 1059px, aria-expanded="false" — berbohong ke
   pembaca layar), "Hapus semua filter", tombol kosongkan pencarian, lencana
   jumlah tag, dan pratinjau playbook (disclosure ≤1180px tidak bisa menutup).
   .watpl-pvdisc ikut dipagari karena display-nya juga diatur blok ini. */
.watpl-sys__body[hidden],
.watpl-fbtn[hidden],
.watpl-search__x[hidden],
.watpl-pvdisc[hidden],
.watpl-chat[hidden],
[data-watpl-tagn][hidden] { display:none !important; }

/* FIX-4 · radiogroup Brand terpotong, NUSSA tak terjangkau -----------------
   Track segmented butuh 339px di sel grid 253px dan pane-nya overflow-x
   visible: LUXA dan NUSSA tergambar di luar bidang, sementara aria-checked
   justru menempel di tombol yang tak terlihat — kontrolnya terbaca "tidak ada
   yang dipilih". Track dibiarkan membungkus, persis cara .watpl-vsw (pengalih
   varian A/B) sudah melakukannya di blok ini; gap 2px milik unit dipakai ulang
   sebagai jarak antar-baris, jadi tidak ada nilai baru. Berlaku untuk keempat
   radiogroup modul (Brand template, Brand playbook, Sumber balasan, Arah) —
   semuanya duduk di dalam .watpl-f. */
.watpl-f .vs-tabs--segmented { flex-wrap:wrap; }

/* FIX-5 · kepala kartu robek di 5 dari 12 kartu ---------------------------
   .watpl-card__gap (flex:1 1 auto) menyusut ke 0 dan tetap di baris pertama,
   sehingga tombol sematan terlempar ke baris kedua PALING KIRI: kepala 66px
   vs 36px, dan tinggi kepala jadi bergantung pada panjang nama kategori.
   Tombolnya dikeluarkan dari aliran ke pojok kanan-atas dan lebarnya
   dicadangkan lewat padding, jadi chip mengisi sisa yang benar-benar ada.
   TANPA `order`: urutan DOM — dan urutan Tab — tetap utuh (05A 4.2). */
.watpl-card__head { position:relative; min-height:var(--field-h-sm, 36px);
  padding-right:calc(var(--field-h-sm, 36px) + var(--space-3)); }
.watpl-card__head > button { position:absolute; top:0; right:0; }

/* FIX-6 · 7 dari 12 cuplikan menampilkan baris berisi "…" saja -------------
   -webkit-line-clamp:2 benar; yang salah adalah isinya: waFormatToHtml
   mengubah baris kosong (hampir semua template seed dibuka sapaan lalu baris
   kosong) jadi <br><br>, sehingga baris kedua clamp kosong dan hanya elipsis
   yang mendarat. `br` KEDUA dan seterusnya dihapus dari kotak — jeda paragraf
   menyusut jadi jeda baris biasa. Menghapus SEMUA br (display:none) juga
   menghilangkan celah blank tapi menempelkan kata akhir baris ke kata
   berikutnya; membiarkan br pertama hidup menjaga teks tetap terpisah. */
.watpl-card__snip br + br { display:none; }

/* FIX-7 · avatar klien tak terlihat di panggung chat ----------------------
   Cakram --surface-1 di atas --bg-inset hanya 1.04:1 dan tepi
   --border-default 1.11:1 — praktis cuma hurufnya yang tampak. Isian dinaikkan
   ke permukaan kartu (sama seperti bubble masuk yang ia dampingi) dan tepinya
   memakai --ink-500 = 3.76:1, lulus ambang 3:1 untuk elemen non-teks. Dipagari
   ke .vs-avatar supaya pengganjal avatar baris ter-grouping (span kosong tanpa
   .vs-avatar) tidak ikut mendapat isian. */
.watpl-msg--in .vs-avatar.watpl-msg__ava { background:var(--surface-0);
  border-color:var(--ink-500); }

/* FIX-8 · kepala chat remuk di 375px --------------------------------------
   Kolom identitas terjepit jadi 103px di antara avatar 36px dan tiga tombol
   36px: judul terpotong jadi "Komplain hasi…" dan sub-judul jatuh ke 4 baris.
   Cakram avatar kepala DEKORATIF (aria-hidden="true") dan memakan 48px dari
   309px yang ada; di lebar ini ia dilepas — kepala tetap dikenali lewat tulang
   punggung brand 3px, tombol kembali, judul, dan kontrolnya. Sisa ruang jatuh
   ke kolom identitas; kepala tetap boleh membungkus (rata kanan) supaya di
   bawah ~330px tombol turun dengan rapi, bukan meluber. Pengganjal lebar
   dimatikan supaya ia tidak memakan satu baris sendiri. Judul boleh dua baris
   memakai idiom clamp yang sudah dipakai .watpl-card__title, jadi judulnya
   terbaca UTUH, bukan "Komplain hasi…".
   Breakpoint 560 sudah ada di tangga app dan sudah dipakai blok ini. */
@media (max-width:560px) {
  .watpl-chat__head { flex-wrap:wrap; justify-content:flex-end; }
  .watpl-chat__head .watpl-comp__gap { display:none; }
  .watpl-chat__ava { display:none; }
  .watpl-chat__id { flex:1 1 160px; }
  .watpl-chat__id > b { white-space:normal; overflow:hidden;
    display:-webkit-box; -webkit-line-clamp:2; line-clamp:2;
    -webkit-box-orient:vertical; }
}

/* --- Perpanjangan .nt-wa-bubble (ADR CT-005, 05A 4.6b) -------------------
   waFormatToHtml diperluas dengan daftar bernomor, kutipan, dan kode inline.
   Sintaks baru itu ikut sampai ke pratinjau WA Builder lama, yang hari ini
   hanya menata `b` dan `code` — tanpa aturan di bawah, UA memberi indent 40px
   dan margin 1em di dalam kotak 340px dan bubble legacy itu pecah.
   Aturan ditulis DI SINI, bukan di blok aslinya (admin.css:1033), supaya
   pekerjaan pemilik di sana tidak tersentuh; posisi belakang justru yang
   dibutuhkan karena sifatnya aditif.
   Palet lama SENGAJA tidak diperbaiki — itu utang yang sudah ada dan di luar
   lingkup; garis kutipan diturunkan dari currentColor supaya tidak ada nilai
   warna baru yang masuk ke blok legacy. */
.nt-wa-bubble ul, .nt-wa-bubble ol { margin:var(--space-2) 0; padding-left:18px; }
.nt-wa-bubble li { margin:0; padding-left:2px; }
.nt-wa-bubble ol { list-style:decimal; }
.nt-wa-bubble ul { list-style:disc; }
.nt-wa-bubble li::marker { font-family:var(--font-mono); font-size:0.92em; }
.nt-wa-bubble blockquote { margin:var(--space-2) 0; padding:2px 0 2px var(--space-4);
  border-left:3px solid color-mix(in srgb, currentColor 30%, transparent); }
/* `code` sudah punya aturan sendiri di blok legacy; yang ditambah HANYA
   perilaku bungkusnya, karena sintaks blok mono kini bisa membawa baris baru.
   Radius/warna/ukurannya sengaja TIDAK disentuh supaya tampilannya tetap. */
.nt-wa-bubble code { white-space:pre-wrap; word-break:break-word;
  overflow-wrap:anywhere; }
/* == WATPL:END ============================ :END == WATPL ================== */

/* == CXP-INBOX:BEGIN ========================================================
   Redesign Connect+ Control 17.03.06 (cxorg1, 2026-08-20) — "Authenticator +
   Inbox". Strip Universal PIN persisten (ala Google Authenticator) + tab
   underline (reuse .vs-tabs--underline) + Submission Organizer. Token-only;
   reuse .cxp-pin-digits/.cxp-pin-countdown/.cxp-toolbar/.cxp-kvs existing.
   TIDAK sticky (jawaban owner Q3). */
.cxp .cxp-strip { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--space-5); align-items:start; padding:var(--space-6); background:var(--surface-0); border:1px solid var(--line-200); border-radius:var(--radius-lg); box-shadow:var(--shadow-card); margin-bottom:var(--space-5); }
.cxp .cxp-strip__body { display:grid; gap:var(--space-4); min-width:0; }
/* Digit strip: reuse anatomi .cxp-pin-digits, diringkas untuk strip satu baris. */
.cxp .cxp-strip__digits { max-width:420px; }
.cxp .cxp-strip__digits span { min-height:56px; font-size:var(--text-h2); font-family:var(--font-mono); font-variant-numeric:tabular-nums; }
.cxp .cxp-strip .cxp-pin-countdown { max-width:420px; }
.cxp .cxp-strip .cxp-pin-countdown b { font-family:var(--font-mono); font-variant-numeric:tabular-nums; }
.cxp .cxp-strip__meta { font-size:var(--text-2xs); color:var(--text-subtle); }
.cxp .cxp-strip__meta a { color:inherit; text-decoration:underline; }
.cxp .cxp-strip__actions { display:flex; flex-direction:column; gap:var(--space-2); align-items:stretch; }
.cxp .cxp-strip__offline { display:inline-flex; align-items:center; gap:var(--space-2); font-size:var(--text-sm); color:var(--text-muted); }
.cxp .cxp-strip.is-loading { min-height:96px; }
/* ≤60 dtk: sinyal "segera berganti" — SELALU berpasangan teks countdown (bukan
   warna saja). --accent-red di atas --surface-0, teks semibold ≥ --text-sm. */
.cxp .cxp-strip.is-ending .cxp-strip__digits span { color:var(--accent-red); border-color:var(--accent-red); }
.cxp .cxp-strip.is-ending .cxp-pin-countdown b { color:var(--accent-red); }
.cxp .cxp-strip.is-ending .cxp-pin-countdown progress::-webkit-progress-value { background:var(--accent-red); }
.cxp .cxp-strip.is-ending .cxp-pin-countdown progress::-moz-progress-bar { background:var(--accent-red); }
.cxp .cxp-tabbar { margin-bottom:var(--space-5); overflow-x:auto; }
.cxp .cxp-tabbar .vs-tab { text-decoration:none; min-height:44px; flex:none; white-space:nowrap; }
.cxp .cxp-tabpanel { display:block; }
@media (max-width: 720px) {
  .cxp .cxp-strip { grid-template-columns:minmax(0,1fr); }
  .cxp .cxp-strip__body { justify-items:center; text-align:center; }
  .cxp .cxp-strip__digits, .cxp .cxp-strip .cxp-pin-countdown { max-width:100%; width:100%; }
  .cxp .cxp-strip__actions { flex-direction:row; }
  .cxp .cxp-strip__actions .abtn { flex:1; justify-content:center; min-height:44px; }
}
/* ---- v1.1 Polish pass (17.03.06 D7–D10, 2026-08-20) ---- */
/* D9: panel tab dipesan tingginya — ganti tab tidak melompat. */
.cxp .cxp-tabpanel { min-height:420px; }
/* Baris filter: tinggi tetap walau isinya chip ATAU hint. */
.cxp .cxp-filterrow { min-height:var(--field-h-sm); display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; margin-bottom:var(--space-3); }
.cxp .cxp-filterhint { font-size:var(--text-xs); color:var(--text-subtle); }
.cxp .cxp-toolbar { margin-top:var(--space-2); }
/* Bersihkan pencarian DI DALAM box — ruang selalu dipesan (visibility, bukan display). */
.cxp .cxp-searchbox { position:relative; padding-right:var(--space-8); }
.cxp .cxp-searchclear { position:absolute; right:var(--space-2); top:50%; transform:translateY(-50%); width:24px; height:24px; display:grid; place-items:center; border:0; background:transparent; color:var(--text-subtle); border-radius:var(--radius-xs); cursor:pointer; }
.cxp .cxp-searchclear:hover { background:var(--surface-50); color:var(--text-strong); }
.cxp .cxp-searchclear.is-empty { visibility:hidden; }
/* D7: sel organizer bertumpuk rapi (vg-sub global display:block membuat anak
   inline menyambung — di-scope ulang di sini, global tidak disentuh). */
.cxp .cxp-subgrid td { padding:var(--space-4); }
.cxp .cxp-subgrid th { padding:var(--space-3) var(--space-4); }
.cxp .cxp-subgrid .vg-sub { display:flex; flex-direction:column; gap:var(--space-1); margin-top:0; }
.cxp .cxp-subgrid .vg-sub .muted.mono { font-size:var(--text-2xs); }
.cxp .cxp-subgrid .cxp-cell-code { white-space:nowrap; }
.cxp .cxp-subgrid .cxp-cell-code .mono { font-size:var(--text-xs); }
.cxp .cxp-subgrid .cxp-cell-when { white-space:nowrap; color:var(--text-muted); font-size:var(--text-xs); }
.cxp .cxp-subgrid .cxp-cell-soft { font-size:var(--text-xs); }
.cxp .cxp-subgrid .vg-sub .vs-tag { align-self:flex-start; }
/* D8: klaster aksi grid 4 slot tetap — ikon 36px, ghost memesan ruang. */
.cxp .cxp-acts { display:grid; grid-template-columns:repeat(4, 36px); gap:var(--space-2); justify-content:flex-end; align-items:center; }
.cxp .cxp-acts .cxp-act { min-height:36px; min-width:36px; padding:0; display:inline-flex; align-items:center; justify-content:center; }
.cxp .cxp-acts .cxp-act--ghost { display:block; }
@media (pointer:coarse) { .cxp .cxp-acts { grid-template-columns:repeat(4, 44px); } .cxp .cxp-acts .cxp-act { min-height:44px; min-width:44px; } }
/* Skeleton baris organizer — geometri baris dipertahankan saat memuat. */
.cxp .cxp-skelrow td { padding:var(--space-4); }
.cxp .cxp-skel { display:block; height:var(--space-7); border-radius:var(--radius-xs); background:var(--surface-50); animation:cxpPulse 1s infinite alternate; }
@media (prefers-reduced-motion: reduce) { .cxp .cxp-skel { animation:none; } }
/* D10+D14 (v1.3): drawer anatomi kanonik Customers V2 dengan kontainer TEGAS —
   head identitas (avatar .d360-av + contact-strip ber-border), body = kartu
   .dpanel per seksi (header aksen brand), isi = kanvas chat ala WhatsApp:
   bubble masuk putih kiri, bubble keluar brand-soft kanan. */
.cust2-ov .cxp-dhead-row { display:flex; align-items:flex-start; gap:var(--space-4); }
.cust2-ov .cxp-dhead-main { min-width:0; flex:1; display:flex; flex-direction:column; gap:var(--space-3); }
.cust2-ov .cxp-dhead-title { display:flex; align-items:center; gap:var(--space-3); flex-wrap:wrap; }
.cust2-ov .cxp-dhead-title h3 { margin:0; font-family:var(--font-display); font-size:var(--text-h3); font-weight:var(--fw-bold); color:var(--text-strong); line-height:var(--lh-tight); }
.cust2-ov .drawer-body.cxp-subdetail { flex:1 1 auto; display:flex; flex-direction:column; gap:var(--space-5); }
.cust2-ov .drawer-foot.cxp-subfoot { display:flex; align-items:center; gap:var(--space-2); flex-wrap:wrap; grid-template-columns:none; }
.cust2-ov .drawer-foot.cxp-subfoot .abtn { min-height:38px; }
/* Kartu seksi: reuse .dpanel (surface-0 + border + shadow); padding dipindah ke
   sub-elemen supaya head/chat/aksi punya garis batasnya sendiri. */
.cust2-ov .cxp-msgcard { padding:0; overflow:hidden; display:flex; flex-direction:column; }
.cust2-ov .cxp-msgcard h3 { margin:0; padding:var(--space-4) var(--space-5); border-bottom:1px solid var(--line-100); }
/* Kanvas chat: latar inset supaya bubble punya "lantai" yang jelas (ala WA). */
.cust2-ov .cxp-chat { background:var(--bg-inset); padding:var(--space-5); display:flex; flex-direction:column; gap:var(--space-3); }
.cust2-ov .cxp-bubble { white-space:pre-wrap; overflow-wrap:anywhere; width:fit-content; max-width:min(640px, 96%);
  background:var(--surface-0); border:1px solid var(--line-200); box-shadow:var(--shadow-xs);
  border-radius:var(--radius-md); padding:var(--space-4) var(--space-5);
  font-size:var(--text-xs); line-height:var(--lh-relaxed); color:var(--ink); }
.cust2-ov .cxp-bubble--in { border-top-left-radius:var(--radius-xs); align-self:flex-start; }
/* Token brand-soft TIDAK ada di runtime admin (hanya scope track-page) —
   pakai sumber root-nya langsung: identity-yellow-soft/shadow (app.css :root). */
.cust2-ov .cxp-bubble--out { border-top-right-radius:var(--radius-xs); align-self:flex-end;
  background:var(--identity-yellow-soft); border-color:var(--identity-yellow-shadow); }
.cust2-ov .cxp-msgcard__acts { display:flex; align-items:center; gap:var(--space-2); flex-wrap:wrap;
  padding:var(--space-4) var(--space-5); border-top:1px solid var(--line-100); background:var(--surface-0); }
/* == CXP-INBOX:END ========================================================== */
