/* Mikode POS — design tokens & komponen bersama, selaras situs utama
   mikodestudio.com (mikode-deploy/css/style.css). File ini adalah SUMBER
   TOKEN TUNGGAL untuk POS: warna navy #144262, font Inter + Space Grotesk
   (di-host lokal, CSP font-src 'self'), radius, shadow, tombol, kartu.
   Dimuat PALING AKHIR di semua halaman POS agar menang cascade dari
   style.min.css / billing.css tanpa menduplikasi token yang berbeda. */
@font-face{font-family:'Inter';font-weight:400;font-style:normal;font-display:swap;src:url('/fonts/inter-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'Inter';font-weight:500;font-style:normal;font-display:swap;src:url('/fonts/inter-latin-500-normal.woff2') format('woff2')}
@font-face{font-family:'Inter';font-weight:600;font-style:normal;font-display:swap;src:url('/fonts/inter-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'Space Grotesk';font-weight:600;font-style:normal;font-display:swap;src:url('/fonts/space-grotesk-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'Space Grotesk';font-weight:700;font-style:normal;font-display:swap;src:url('/fonts/space-grotesk-latin-700-normal.woff2') format('woff2')}
@font-face{font-family:'JetBrains Mono';font-weight:400;font-style:normal;font-display:swap;src:url('/fonts/jetbrains-mono-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'JetBrains Mono';font-weight:500;font-style:normal;font-display:swap;src:url('/fonts/jetbrains-mono-latin-500-normal.woff2') format('woff2')}

:root{
  /* Token selaras mikode-deploy/css/style.css (nama --mk-* + alias web) */
  --mk-bg:#FFFFFF;--bg:#FFFFFF;
  --mk-bg-tint:#F4F8FB;--bg-tint:#F4F8FB;
  --mk-surface:#EAF1F7;--surface:#EAF1F7;
  --mk-ink:#0A1F33;--ink:#0A1F33;
  --mk-text:#0A1F33;--text:#0A1F33;
  --mk-muted:#44596D;--text-muted:#44596D;
  --mk-faint:#5A6E82;--text-faint:#5A6E82;
  --mk-brand:#144262;--brand:#144262;
  --mk-brand-hover:#0E3350;--brand-hover:#0E3350;
  --mk-brand-deep:#0A1F33;--brand-deep:#0A1F33;
  --mk-accent:#3E9BE6;--accent:#3E9BE6;
  --mk-accent-soft:rgba(62,155,230,.14);--accent-soft:rgba(62,155,230,.14);
  --mk-line:rgba(10,31,51,.10);--line:rgba(10,31,51,.10);
  --mk-line-strong:rgba(10,31,51,.20);--line-strong:rgba(10,31,51,.20);
  --mk-danger:#B42318;--danger:#B42318;
  --mk-success:#17803D;--success:#17803D;
  --mk-warn:#B45309;
  --mk-font-display:'Space Grotesk','Inter',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;--font-display:'Space Grotesk','Inter',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  --mk-font-body:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;--font-body:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  --mk-font-mono:'JetBrains Mono',ui-monospace,Menlo,Consolas,monospace;--font-mono:'JetBrains Mono',ui-monospace,Menlo,Consolas,monospace;
  --mk-radius-sm:8px;--radius-sm:8px;
  --mk-radius-md:12px;--radius-md:12px;
  --mk-radius-lg:16px;--radius-lg:16px;
  --mk-shadow-card:0 1px 2px rgba(10,31,51,.04),0 10px 24px -18px rgba(10,31,51,.22);--shadow-card:0 1px 2px rgba(10,31,51,.04),0 10px 24px -18px rgba(10,31,51,.22);
  --mk-shadow-lift:0 2px 4px rgba(10,31,51,.05),0 24px 44px -24px rgba(10,31,51,.35);--shadow-lift:0 2px 4px rgba(10,31,51,.05),0 24px 44px -24px rgba(10,31,51,.35);
  --mk-nav-h:68px;--nav-h:68px;
  --mk-gutter:clamp(1.25rem,5vw,3rem);
  --mk-max:1160px;
}
body,button,input,select,textarea{font-family:var(--mk-font-body)}
h1,h2,h3,.login-wrapper h1,.bl-hero h1,.bl-plan h2,.bl-price{font-family:var(--mk-font-display);letter-spacing:-.01em}
code,kbd,samp,.mono{font-family:var(--mk-font-mono)}
button,input,select,textarea{border-radius:var(--mk-radius-sm)}
:focus-visible{outline:3px solid var(--mk-accent);outline-offset:2px}
::selection{background:rgba(62,155,230,.25)}
@media (prefers-color-scheme: light){a{color:var(--mk-brand)}a:hover{color:var(--mk-brand-hover)}}

/* ---------- Tombol & kartu bersama (selaras .btn/.card website) ---------- */
.mk-btn,.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5em;min-height:48px;padding:.75em 1.6em;border-radius:var(--mk-radius-sm);border:1px solid transparent;font-family:var(--mk-font-body);font-size:.95rem;font-weight:600;line-height:1.2;cursor:pointer;white-space:nowrap;background:var(--mk-brand);color:#fff;box-shadow:0 10px 22px -12px rgba(20,66,98,.7);text-decoration:none;transition:background-color .2s ease,border-color .2s ease,color .2s ease,transform .15s ease}
.mk-btn:hover,.btn:hover{background:var(--mk-brand-hover);color:#fff}
.mk-btn:active,.btn:active{transform:translateY(1px)}
.mk-btn--outline,.btn--outline{background:#fff;color:var(--mk-ink);border-color:var(--mk-line-strong);box-shadow:none}
.mk-btn--outline:hover,.btn--outline:hover{border-color:var(--mk-brand);color:var(--mk-brand);background:#fff}
.mk-btn--danger{background:var(--mk-danger);box-shadow:none}
.mk-btn--ok{background:var(--mk-success);box-shadow:none}
.mk-btn--sm{min-height:40px;padding:.5em 1.15em;font-size:.9rem}
.mk-card,.mk-panel{background:#fff;border:1px solid var(--mk-line);border-radius:var(--mk-radius-lg);padding:20px 22px;box-shadow:var(--mk-shadow-card);margin-bottom:20px}
.mk-panel h2,.mk-panel h3{margin-top:0}
.mk-table-simple{width:100%;border-collapse:collapse;font-size:13.5px}
.mk-table-simple th,.mk-table-simple td{padding:8px 10px;border-bottom:1px solid var(--mk-line);text-align:left;vertical-align:top}
.mk-table-simple th{color:var(--mk-muted);font-size:12px;text-transform:uppercase;letter-spacing:.04em}
.mk-msg{font-size:14px;min-height:1.3em;margin:10px 0 0}
.mk-msg.is-error{color:var(--mk-danger)}
.mk-msg.is-ok{color:var(--mk-success)}
.hp-field{position:absolute!important;left:-9999px!important;width:1px!important;height:1px!important;overflow:hidden!important;opacity:0!important}

/* ---------- Layout halaman publik (top-nav + kontainer + footer) ---------- */
.pub-wrap{width:100%;max-width:var(--mk-max);margin-inline:auto;padding-inline:var(--mk-gutter)}
.pub-nav{position:sticky;top:0;z-index:100;overflow-x:clip;padding-top:env(safe-area-inset-top,0px);background:rgba(255,255,255,.92);backdrop-filter:saturate(1.4) blur(12px);-webkit-backdrop-filter:saturate(1.4) blur(12px);border-bottom:1px solid var(--mk-line)}
.pub-nav-inner{height:var(--mk-nav-h);display:flex;align-items:center;gap:1.6rem}
.pub-logo{display:flex;align-items:center;margin-right:auto}
.pub-logo img{height:26px;width:auto;display:block}
.pub-menu{display:flex;align-items:center;gap:1.6rem;min-width:0}
.pub-menu a{font-size:.94rem;font-weight:500;color:var(--mk-muted);text-decoration:none}
.pub-menu a:hover{color:var(--mk-brand)}
.pub-menu a[aria-current="page"]{color:var(--mk-brand);font-weight:700}
.pub-cta{display:inline-flex;align-items:center;min-height:42px;padding:.55em 1.3em;border-radius:var(--mk-radius-sm);background:var(--mk-brand);color:#fff!important;font-weight:600;font-size:.92rem;text-decoration:none;white-space:nowrap}
.pub-cta:hover{background:var(--mk-brand-hover)}
@media (max-width:640px){.pub-menu{gap:1rem}.pub-menu a{font-size:.88rem}.pub-cta{padding:.5em .9em;font-size:.85rem}}
.pub-main{padding-block:clamp(2rem,5vw,3.5rem)}
.pub-foot{background:var(--mk-brand-deep);color:#fff;padding:2.8rem 0 calc(1.6rem + env(safe-area-inset-bottom));margin-top:3rem}
.pub-foot-top{display:flex;justify-content:space-between;align-items:flex-start;gap:2rem;flex-wrap:wrap;padding-bottom:1.8rem;border-bottom:1px solid rgba(255,255,255,.12)}
.pub-foot-brand p{margin:.8rem 0 0;font-size:.92rem;color:rgba(255,255,255,.7);max-width:36ch}
.pub-foot-brand img{height:26px;width:auto}
.pub-foot-nav{display:flex;flex-wrap:wrap;gap:.6rem 1.6rem}
.pub-foot-nav a{font-size:.94rem;color:rgba(255,255,255,.8);text-decoration:none}
.pub-foot-nav a:hover{color:#fff}
.pub-foot-bottom{display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding-top:1.3rem}
.pub-foot-bottom p{margin:0;font-size:.82rem;color:rgba(255,255,255,.62)}
/* Header/footer billing lama diselaraskan ke pola publik yang sama */
.bl-top{background:var(--mk-brand-deep)}
.bl-foot{padding-bottom:2rem}

/* ---------- Login (index.html): gaya yang dulu inline dipindah ke sini ---------- */
.login-error{color:var(--mk-danger);font-size:13px;margin-top:10px}
.login-signup{text-align:center;margin:18px 0 0;font-size:14px;line-height:1.7}
.login-extra-links{text-align:center;margin:10px 0 0;font-size:13.5px}
.pub-login-wrap{min-height:calc(100vh - var(--mk-nav-h))}

/* ---------- Kasir: banner offline, barcode, pembayaran, diskon ---------- */
.mk-offline-banner{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:#FEF3C7;border:1px solid #FCD34D;color:#78350F;border-radius:var(--mk-radius-md);padding:10px 14px;margin:0 0 14px;font-size:13.5px;font-weight:600}
.mk-offline-banner.is-online-ok{background:#ECFDF5;border-color:#6EE7B7;color:#065F46}
.mk-offline-banner[hidden]{display:none!important}
.mk-offline-banner button{min-height:36px;padding:6px 12px;font-size:12.5px;background:var(--mk-brand)}
.pv-barcode-row{display:flex;gap:8px;align-items:center;background:#fff;border:1px solid var(--mk-line);border-radius:10px;padding:8px 12px;margin-top:10px;box-shadow:0 1px 2px rgba(0,0,0,.04)}
.pv-barcode-row label{font-size:12px;font-weight:700;color:var(--mk-muted);white-space:nowrap}
.pv-barcode-row input{border:none;padding:4px;flex:1;font-size:14px}
.pv-barcode-row input:focus{outline:none}
.pv-pay-box{border-top:1px dashed var(--mk-line-strong);margin-top:10px;padding-top:10px}
.pv-pay-box legend,.pv-pay-label{font-size:12px;font-weight:700;color:var(--mk-muted);display:block;margin-bottom:6px}
.pay-methods{display:flex;flex-wrap:wrap;gap:6px;border:0;padding:0;margin:0}
.pay-method{display:inline-flex;align-items:center;gap:6px;border:1.5px solid var(--mk-line-strong);border-radius:999px;padding:6px 12px;font-size:12.5px;font-weight:700;color:var(--mk-muted);cursor:pointer;background:#fff}
.pay-method input{width:auto;accent-color:var(--mk-brand)}
.pay-method:has(input:checked){border-color:var(--mk-brand);color:var(--mk-brand);background:var(--mk-accent-soft)}
.pv-tunai-box{margin-top:10px}
.pv-tunai-box input{font-size:15px;font-weight:700;text-align:right}
.quick-nominal{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.quick-nominal button{background:var(--mk-surface);color:var(--mk-brand);padding:6px 10px;font-size:12px;min-height:34px}
.quick-nominal button:hover{background:#D8E6F2}
.pv-kembalian{display:flex;justify-content:space-between;font-size:14px;font-weight:800;color:var(--mk-success);margin-top:8px}
.pv-kembalian.is-kurang{color:var(--mk-danger)}
.pv-diskon-box{margin-top:10px}
.pv-diskon-row{display:flex;gap:6px}
.pv-diskon-row select{flex:0 0 42%}
.pv-diskon-row input{flex:1;text-align:right}

/* ---------- Struk (print-friendly 58/80mm) ---------- */
.struk-area{background:#fff;color:#000;font-family:var(--mk-font-mono);font-size:12px;line-height:1.5;padding:10px;margin:0 auto}
.struk-80{width:80mm;max-width:100%}
.struk-58{width:58mm;max-width:100%}
.struk-area h3{text-align:center;margin:0 0 2px;font-family:var(--mk-font-mono);letter-spacing:1px}
.struk-area .struk-center{text-align:center}
.struk-area table{width:100%;border-collapse:collapse;font-size:12px}
.struk-area td{padding:2px 0;vertical-align:top}
.struk-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
.struk-actions button{min-height:40px;padding:8px 14px;font-size:13px}
@media print{
  body *{visibility:hidden!important}
  #strukPrintArea,#strukPrintArea *{visibility:visible!important}
  #strukPrintArea{position:absolute!important;left:0;top:0;box-shadow:none!important}
  .struk-actions,.pv-cart,.pv-menu-section,.sidebar,.mobile-header,.modal{display:none!important}
}

/* ---------- Transaksi: VOID, shift, audit ---------- */
.badge-void{display:inline-block;background:#FEE2E2;color:var(--mk-danger);font-size:11px;font-weight:800;padding:3px 8px;border-radius:999px;letter-spacing:.03em}
tr.trx-void td{opacity:.62}
tr.trx-void .trx-total-void{text-decoration:line-through;color:var(--mk-danger)!important}
.badge-stok-menipis{display:inline-block;background:#FEF3C7;color:#92400E;font-size:11px;font-weight:800;padding:3px 8px;border-radius:999px}
.badge-stok-habis{display:inline-block;background:#FEE2E2;color:var(--mk-danger);font-size:11px;font-weight:800;padding:3px 8px;border-radius:999px}
.badge-stok-ok{display:inline-block;background:#ECFDF5;color:#065F46;font-size:11px;font-weight:700;padding:3px 8px;border-radius:999px}
.kat-chip{display:inline-flex;align-items:center;gap:8px;background:var(--mk-surface);border:1px solid var(--mk-line);border-radius:999px;padding:6px 8px 6px 14px;margin:0 8px 8px 0;font-size:13px;font-weight:600}
.kat-chip button{min-height:28px;width:28px;padding:0;border-radius:50%;background:#fff;color:var(--mk-danger);border:1px solid var(--mk-line-strong);font-size:13px}
.shift-selisih-neg{color:var(--mk-danger);font-weight:800}
.shift-selisih-ok{color:var(--mk-success);font-weight:800}
.stok-fields{margin-top:4px}
.stok-menipis-item{display:flex;justify-content:space-between;gap:10px;padding:9px 0;border-bottom:1px dashed var(--mk-line);font-size:14px}
.stok-menipis-item:last-child{border-bottom:0}

/* ==========================================================================
   DESIGN SYSTEM UI/UX FASE 1 (DESIGN-SPEC.md bagian 1 & 2)
   --------------------------------------------------------------------------
   File ini sekarang adalah DESIGN SYSTEM TUNGGAL POS. Aturan untuk semua
   komponen baru (awalan .ui-):
   - SEMUA warna diambil dari token di bawah. Hex/rgba warna BARU hanya boleh
     muncul di dalam blok token :root dan [data-theme="dark"] — tidak di
     aturan komponen.
   - Token lama (--mk-* dan alias --bg/--brand/dll di blok :root pertama)
     DIPERTAHANKAN apa adanya agar halaman lama tidak rusak; token baru di
     blok ini menimpanya dengan nilai yang sama/selaras dan menambah varian
     yang belum ada (soft, *-text, gelap).
   - Skala huruf HANYA: --fs-12/13/14/16/20/24/30. Radius HANYA:
     --r-sm/--r-md/--r-lg/--r-full. Spasi HANYA skala 4pt --sp-*.
   - Breakpoint komponen baru HANYA 640px dan 980px.
   - Target sentuh: tombol & item nav min-height 44px.
   ========================================================================== */

/* ---------- 1a. Token terang (default) ---------- */
:root{
  /* Spasi — skala 4pt */
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:20px;--sp-6:24px;
  --sp-7:28px;--sp-8:32px;--sp-9:36px;--sp-10:40px;--sp-11:44px;--sp-12:48px;
  /* Skala huruf — HANYA ukuran ini yang dipakai komponen baru */
  --fs-12:12px;--fs-13:13px;--fs-14:14px;--fs-16:16px;--fs-20:20px;--fs-24:24px;--fs-30:30px;
  --lh-text:1.5;--lh-heading:1.25;
  /* Radius — HANYA ukuran ini */
  --r-sm:8px;--r-md:12px;--r-lg:16px;--r-full:999px;
  /* Alias radius baru -> token lama (satu nilai, dua nama) */
  --mk-radius-sm:var(--r-sm);--mk-radius-md:var(--r-md);--mk-radius-lg:var(--r-lg);
  /* Palet semantik — terang */
  --bg:#FFFFFF;--bg-tint:#F4F8FB;
  --surface:#EAF1F7;--surface-2:#DCE8F2;--card:#FFFFFF;
  --ink:#0A1F33;--text:#0A1F33;--muted:#44596D;--text-muted:#44596D;--faint:#5A6E82;--text-faint:#5A6E82;
  --brand:#144262;--brand-hover:#0E3350;--brand-deep:#0A1F33;--brand-ink:#144262;--brand-soft:rgba(62,155,230,.14);
  --accent:#3E9BE6;--accent-soft:rgba(62,155,230,.14);
  --line:rgba(10,31,51,.10);--line-strong:rgba(10,31,51,.20);
  --success:#17803D;--success-text:#17803D;--success-soft:#ECFDF5;
  --warn:#B45309;--warn-text:#B45309;--warn-soft:#FEF3C7;--mk-warn:#B45309;
  --danger:#B42318;--danger-text:#B42318;--danger-soft:#FEE2E2;
  --info:#1D7FC1;--info-text:#1D7FC1;--info-soft:rgba(62,155,230,.14);
  --neutral-soft:#EAF1F7;
  --on-brand:#FFFFFF;--on-danger:#FFFFFF;--on-accent:#FFFFFF;
  /* Bayangan */
  --sh-card:0 1px 2px rgba(10,31,51,.04),0 10px 24px -18px rgba(10,31,51,.22);
  --sh-lift:0 2px 4px rgba(10,31,51,.05),0 24px 44px -24px rgba(10,31,51,.35);
  --sh-pop:0 8px 16px rgba(10,31,51,.08),0 32px 64px -24px rgba(10,31,51,.40);
  --mk-shadow-card:var(--sh-card);--mk-shadow-lift:var(--sh-lift);
  --shadow-card:var(--sh-card);--shadow-lift:var(--sh-lift);--shadow-pop:var(--sh-pop);
  /* Token komponen */
  --field-bg:#FFFFFF;--overlay:rgba(10,31,51,.55);
  --row-alt:rgba(10,31,51,.03);--row-hover:rgba(62,155,230,.07);--table-head-bg:#F4F8FB;
  --skeleton:#EAF1F7;--skeleton-shine:rgba(255,255,255,.55);
  --topbar-bg:rgba(255,255,255,.92);
  /* Sidebar (navy di kedua tema, sama seperti sidebar lama) */
  --side-bg:#0A1F33;--side-ink:#FFFFFF;--side-muted:#94A3B8;--side-line:rgba(255,255,255,.12);
  --side-chip-bg:rgba(255,255,255,.08);--side-active-bg:rgba(62,155,230,.14);--side-active-line:#144262;
  color-scheme:light;
}

/* ---------- 1b. Token gelap ---------- */
[data-theme="dark"]{
  --bg:#0A1B2C;--bg-tint:#081625;
  --surface:#1B3550;--surface-2:#24425F;--card:#0F2438;
  --ink:#EAF1F7;--text:#EAF1F7;--muted:#A8BACB;--text-muted:#A8BACB;--faint:#8CA0B3;--text-faint:#8CA0B3;
  --brand:#144262;--brand-hover:#1D5A86;--brand-deep:#0A1F33;--brand-ink:#8FC4F0;--brand-soft:rgba(62,155,230,.20);
  --accent:#6CB6EE;--accent-soft:rgba(62,155,230,.20);
  --line:rgba(234,241,247,.12);--line-strong:rgba(234,241,247,.24);
  --success:#17803D;--success-text:#4ADE80;--success-soft:rgba(74,222,128,.14);
  --warn:#B45309;--warn-text:#FBBF24;--warn-soft:rgba(251,191,36,.14);
  --danger:#B42318;--danger-text:#F87171;--danger-soft:rgba(248,113,113,.14);
  --info:#1D7FC1;--info-text:#8FC4F0;--info-soft:rgba(62,155,230,.20);
  --neutral-soft:#1B3550;
  --on-brand:#FFFFFF;--on-danger:#FFFFFF;--on-accent:#0A1F33;
  --sh-card:0 1px 2px rgba(0,0,0,.30),0 10px 24px -18px rgba(0,0,0,.60);
  --sh-lift:0 2px 4px rgba(0,0,0,.35),0 24px 44px -24px rgba(0,0,0,.70);
  --sh-pop:0 8px 16px rgba(0,0,0,.40),0 32px 64px -24px rgba(0,0,0,.75);
  --field-bg:#0A1F33;--overlay:rgba(0,0,0,.65);
  --row-alt:rgba(234,241,247,.03);--row-hover:rgba(62,155,230,.10);--table-head-bg:#0A1B2C;
  --skeleton:#1B3550;--skeleton-shine:rgba(234,241,247,.07);
  --topbar-bg:rgba(15,36,56,.92);
  /* Alias lama ikut gelap agar komponen lama berbasis token tetap selaras */
  --mk-bg:#0A1B2C;--mk-bg-tint:#081625;--mk-surface:#1B3550;--mk-ink:#EAF1F7;--mk-text:#EAF1F7;
  --mk-muted:#A8BACB;--mk-faint:#8CA0B3;--mk-line:rgba(234,241,247,.12);--mk-line-strong:rgba(234,241,247,.24);
  --mk-accent:#6CB6EE;--mk-accent-soft:rgba(62,155,230,.20);
  color-scheme:dark;
}

/* ---------- 1c. Basis tipografi komponen baru ---------- */
body{font-size:var(--fs-14);line-height:var(--lh-text)}
h1,h2,h3,h4{line-height:var(--lh-heading)}
.ui-tabular,.ui-num{font-variant-numeric:tabular-nums}
.ui-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ==========================================================================
   2. KOMPONEN BAKU (awalan .ui-)
   ========================================================================== */

/* ---------- Tombol: .ui-btn ----------
   <button class="ui-btn ui-btn--primary">Simpan</button>
   Varian: --primary (brand) | --secondary (garis) | --danger | --ghost
   Ukuran: --sm (tetap min 44px) | --lg (52px, aksi utama kasir)
   Ikon SVG (UI.ikon) di dalam tombol otomatis 18px. */
.ui-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);min-height:44px;padding:var(--sp-2) var(--sp-4);border:1px solid transparent;border-radius:var(--r-sm);background:var(--brand);color:var(--on-brand);font-family:var(--font-body);font-size:var(--fs-14);font-weight:600;line-height:var(--lh-heading);text-decoration:none;white-space:nowrap;cursor:pointer;box-shadow:var(--sh-card);transition:background-color .2s ease,border-color .2s ease,color .2s ease,transform .15s ease}
.ui-btn svg{width:18px;height:18px;flex:none}
.ui-btn:hover{background:var(--brand-hover);color:var(--on-brand)}
.ui-btn:active{transform:translateY(1px)}
.ui-btn--primary{background:var(--brand);color:var(--on-brand)}
.ui-btn--primary:hover{background:var(--brand-hover);color:var(--on-brand)}
.ui-btn--secondary{background:var(--bg);color:var(--ink);border-color:var(--line-strong);box-shadow:none}
.ui-btn--secondary:hover{background:var(--bg);color:var(--brand-ink);border-color:var(--brand)}
.ui-btn--danger{background:var(--danger);color:var(--on-danger);box-shadow:none}
.ui-btn--danger:hover{background:var(--danger);color:var(--on-danger);filter:brightness(1.12)}
.ui-btn--ghost{background:transparent;color:var(--brand-ink);box-shadow:none}
.ui-btn--ghost:hover{background:var(--accent-soft);color:var(--brand-ink)}
.ui-btn--sm{min-height:44px;padding:var(--sp-1) var(--sp-3);font-size:var(--fs-13)}
.ui-btn--lg{min-height:52px;padding:var(--sp-3) var(--sp-6);font-size:var(--fs-16)}
.ui-btn--block{width:100%}
.ui-btn:disabled,.ui-btn[disabled],.ui-btn[aria-disabled="true"]{opacity:.55;cursor:not-allowed;box-shadow:none;transform:none;pointer-events:none}
.ui-btn:focus-visible{outline:3px solid var(--accent);outline-offset:2px}

/* Tombol ikon saja (tema, tutup, mata password, dll) — selalu 44x44 */
.ui-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;min-height:44px;padding:0;border:1px solid transparent;border-radius:var(--r-sm);background:transparent;color:inherit;cursor:pointer;flex:none}
.ui-icon-btn svg{width:20px;height:20px}
.ui-icon-btn:hover{background:var(--accent-soft)}
.ui-icon-btn:focus-visible{outline:3px solid var(--accent);outline-offset:2px}

/* ---------- Kartu: .ui-card / .ui-card-head ----------
   <section class="ui-card">
     <div class="ui-card-head"><div>
       <h2 class="ui-card-title">Judul</h2><p class="ui-card-sub">Penjelasan</p>
     </div><button class="ui-btn ui-btn--sm">Aksi</button></div>
     ...isi...
   </section> */
.ui-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-card);padding:var(--sp-5);margin-bottom:var(--sp-4)}
.ui-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--sp-4);margin-bottom:var(--sp-4)}
.ui-card-title{font-family:var(--font-display);font-size:var(--fs-16);font-weight:600;line-height:var(--lh-heading);color:var(--ink);margin:0}
.ui-card-sub{font-size:var(--fs-13);color:var(--muted);margin:var(--sp-1) 0 0}

/* ---------- KPI dashboard: .ui-kpi ----------
   <div class="ui-kpi">
     <span class="ui-kpi-label">Omzet Bulan Ini</span>
     <span class="ui-kpi-value">Rp 1.250.000</span>
     <span class="ui-kpi-delta ui-kpi-delta--success">+12% dari bulan lalu</span>
   </div> */
.ui-kpi{display:flex;flex-direction:column;gap:var(--sp-1);background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-card);padding:var(--sp-4) var(--sp-5)}
.ui-kpi-label{font-size:var(--fs-12);font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}
.ui-kpi-value{font-family:var(--font-display);font-size:var(--fs-30);font-weight:700;line-height:var(--lh-heading);color:var(--ink);font-variant-numeric:tabular-nums}
.ui-kpi-delta{font-size:var(--fs-13);font-weight:600;color:var(--muted)}
.ui-kpi-delta--success{color:var(--success-text)}
.ui-kpi-delta--danger{color:var(--danger-text)}

/* ---------- Tabel: .ui-table ----------
   Bungkus dengan .ui-table-wrap bila perlu scroll/sticky di area terbatas.
   Kolom angka: beri class .ui-num pada <th>/<td> (rata kanan + tabular-nums).
   Di <=640px tabel berubah jadi daftar kartu: setiap <td> tampil sebagai
   baris label:nilai memakai atribut data-label pada <td>, contoh:
   <td data-label="Total" class="ui-num">Rp 50.000</td> — tanpa data-label,
   label kosong dan hanya nilai yang tampil. */
.ui-table-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--card);box-shadow:var(--sh-card)}
.ui-table{width:100%;border-collapse:collapse;font-size:var(--fs-14);line-height:var(--lh-text);color:var(--ink)}
.ui-table th{position:sticky;top:0;z-index:1;background:var(--table-head-bg);color:var(--muted);font-size:var(--fs-12);font-weight:600;letter-spacing:.04em;text-transform:uppercase;text-align:left;padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--line-strong);white-space:nowrap}
.ui-table td{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--line);vertical-align:middle}
.ui-table tbody tr:nth-child(even){background:var(--row-alt)}
.ui-table tbody tr:hover{background:var(--row-hover)}
.ui-table tbody tr:last-child td{border-bottom:0}
.ui-table th.ui-num,.ui-table td.ui-num{text-align:right;font-variant-numeric:tabular-nums}
@media (max-width:640px){
  .ui-table-wrap{border:0;border-radius:0;background:transparent;box-shadow:none;overflow:visible}
  .ui-table,.ui-table tbody,.ui-table tr,.ui-table td{display:block;width:100%}
  .ui-table thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .ui-table tbody tr{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--sh-card);padding:var(--sp-2) var(--sp-4);margin-bottom:var(--sp-3)}
  .ui-table tbody tr:nth-child(even){background:var(--card)}
  .ui-table td{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);padding:var(--sp-2) 0;border-bottom:1px solid var(--line);text-align:right}
  .ui-table td:last-child{border-bottom:0}
  .ui-table td::before{content:attr(data-label);color:var(--muted);font-size:var(--fs-13);font-weight:600;text-align:left}
  .ui-table td.ui-num{text-align:right}
}

/* ---------- Form: .ui-field / .ui-input / .ui-select / .ui-check ----------
   <div class="ui-field">
     <label class="ui-label" for="email">Email</label>
     <input class="ui-input" id="email" type="email">
     <p class="ui-field-help">Teks bantuan.</p>
   </div>
   Error: tambahkan .ui-field--error pada .ui-field (atau aria-invalid="true"
   pada input) dan tampilkan <p class="ui-field-error">pesan</p>. */
.ui-field{display:flex;flex-direction:column;gap:var(--sp-2);margin-bottom:var(--sp-4)}
.ui-label,.ui-field>label{font-size:var(--fs-13);font-weight:500;color:var(--ink);line-height:var(--lh-heading)}
.ui-input,.ui-select{width:100%;min-height:44px;padding:var(--sp-2) var(--sp-3);font-family:var(--font-body);font-size:var(--fs-14);line-height:var(--lh-text);color:var(--ink);background:var(--field-bg);border:1px solid var(--line-strong);border-radius:var(--r-sm)}
textarea.ui-input{height:auto;min-height:44px}
.ui-input::placeholder{color:var(--faint)}
.ui-input:focus,.ui-select:focus{border-color:var(--accent);outline:3px solid var(--accent-soft);outline-offset:0}
.ui-input:disabled,.ui-select:disabled{opacity:.55;cursor:not-allowed}
.ui-field-help{font-size:var(--fs-13);color:var(--muted);margin:0}
.ui-field-error{font-size:var(--fs-13);color:var(--danger-text);margin:0}
.ui-field--error .ui-input,.ui-field--error .ui-select,
.ui-input[aria-invalid="true"],.ui-select[aria-invalid="true"]{border-color:var(--danger)}
.ui-input-wrap{position:relative;display:flex;align-items:center}
.ui-input-wrap>svg{position:absolute;left:var(--sp-3);width:18px;height:18px;color:var(--faint);pointer-events:none}
.ui-input-wrap .ui-input{padding-left:var(--sp-10)}
.ui-input-wrap .ui-icon-btn{margin-left:calc(var(--sp-2) * -1)}
.ui-check{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:44px;font-size:var(--fs-14);color:var(--ink);cursor:pointer}
.ui-check input{width:20px;height:20px;margin:0;flex:none;accent-color:var(--brand)}

/* ---------- Badge status: .ui-badge ----------
   <span class="ui-badge ui-badge--success">Lunas</span>
   Varian: --success | --warn | --danger | --info | --neutral (default). */
.ui-badge{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:24px;padding:var(--sp-1) var(--sp-2);border:1px solid transparent;border-radius:var(--r-full);background:var(--neutral-soft);color:var(--muted);font-size:var(--fs-12);font-weight:700;line-height:var(--lh-heading);white-space:nowrap}
.ui-badge--success{background:var(--success-soft);color:var(--success-text)}
.ui-badge--warn{background:var(--warn-soft);color:var(--warn-text)}
.ui-badge--danger{background:var(--danger-soft);color:var(--danger-text)}
.ui-badge--info{background:var(--info-soft);color:var(--info-text)}
.ui-badge--neutral{background:var(--neutral-soft);color:var(--muted)}

/* ---------- Modal: .ui-modal (+ .ui-confirm) ----------
   Struktur PERSIS (dipakai UI.confirm di js/ui.js dan halaman):
   <div class="ui-modal" hidden>
     <div class="ui-modal-card" role="dialog" aria-modal="true" aria-labelledby="...">
       <div class="ui-modal-head"><h2 class="ui-modal-title">Judul</h2></div>
       <div class="ui-modal-body">Isi / pesan.</div>
       <div class="ui-modal-actions">
         <button class="ui-btn ui-btn--secondary">Batal</button>
         <button class="ui-btn ui-btn--primary">Ya</button>
       </div>
     </div>
   </div>
   Hapus atribut hidden (atau tambah .is-open) untuk menampilkan.
   .ui-confirm = varian konfirmasi dari UI.confirm(); tombol OK memakai
   .ui-btn--danger bila opsi danger:true. */
.ui-modal{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:var(--sp-4);background:var(--overlay)}
.ui-modal[hidden]{display:none!important}
.ui-modal-card{background:var(--card);color:var(--ink);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-pop);width:100%;max-width:480px;max-height:calc(100vh - var(--sp-8));max-height:calc(100dvh - var(--sp-8));overflow:auto;padding:var(--sp-6);display:flex;flex-direction:column;gap:var(--sp-4);animation:ui-pop .18s ease}
.ui-modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--sp-4)}
.ui-modal-title{font-family:var(--font-display);font-size:var(--fs-20);font-weight:600;line-height:var(--lh-heading);color:var(--ink);margin:0}
.ui-modal-body{font-size:var(--fs-14);line-height:var(--lh-text);color:var(--muted)}
.ui-modal-body p{margin:0}
.ui-modal-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--sp-3)}
.ui-confirm .ui-modal-card{max-width:420px}
.ui-confirm-icon{display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:var(--r-full);background:var(--info-soft);color:var(--info-text);flex:none}
.ui-confirm-icon svg{width:24px;height:24px}
.ui-confirm--danger .ui-confirm-icon{background:var(--danger-soft);color:var(--danger-text)}
@keyframes ui-pop{from{opacity:0;transform:translateY(var(--sp-2)) scale(.98)}to{opacity:1;transform:none}}
@media (max-width:640px){.ui-modal-actions .ui-btn{flex:1 1 auto}}

/* ---------- Toast: .ui-toast-wrap / .ui-toast ----------
   TIDAK perlu ditulis manual: UI.toast() di js/ui.js membuat & menumpuk
   toast di dalam .ui-toast-wrap (dibuat otomatis, aria-live="polite").
   Elemen toast persis: <div class="ui-toast ui-toast--sukses" role="status">
   berisi .ui-toast-icon (SVG), .ui-toast-text, .ui-toast-close (tombol x).
   Modifier tipe: --sukses | --gagal | --info (alias --success | --error). */
.ui-toast-wrap{position:fixed;right:var(--sp-4);bottom:calc(var(--sp-4) + env(safe-area-inset-bottom));z-index:1100;display:flex;flex-direction:column;gap:var(--sp-2);width:min(360px,calc(100vw - var(--sp-8)));pointer-events:none}
.ui-toast{pointer-events:auto;display:flex;align-items:flex-start;gap:var(--sp-3);background:var(--card);color:var(--ink);border:1px solid var(--line-strong);border-left:4px solid var(--info);border-radius:var(--r-md);box-shadow:var(--sh-pop);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-14);line-height:var(--lh-text);animation:ui-pop .18s ease}
.ui-toast--sukses,.ui-toast--success{border-left-color:var(--success)}
.ui-toast--gagal,.ui-toast--error,.ui-toast--danger{border-left-color:var(--danger)}
.ui-toast--info{border-left-color:var(--info)}
.ui-toast-icon{display:flex;flex:none;color:var(--info-text);margin-top:var(--sp-1)}
.ui-toast-icon svg{width:20px;height:20px}
.ui-toast--sukses .ui-toast-icon,.ui-toast--success .ui-toast-icon{color:var(--success-text)}
.ui-toast--gagal .ui-toast-icon,.ui-toast--error .ui-toast-icon,.ui-toast--danger .ui-toast-icon{color:var(--danger-text)}
.ui-toast-text{flex:1;min-width:0;padding-top:var(--sp-1)}
.ui-toast-close{margin:calc(var(--sp-2) * -1) calc(var(--sp-2) * -1) 0 0;color:var(--muted)}
.ui-toast.is-leaving{opacity:0;transition:opacity .2s ease}

/* ---------- Empty state: .ui-empty ----------
   <div class="ui-empty">
     <span class="ui-empty-icon">[SVG]</span>
     <p class="ui-empty-title">Belum ada data</p>
     <p class="ui-empty-text">Saran langkah berikutnya.</p>
     <button class="ui-btn ui-btn--primary">Aksi</button>
   </div> */
.ui-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--sp-2);padding:var(--sp-10) var(--sp-6);color:var(--muted)}
.ui-empty-icon{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:var(--r-full);background:var(--neutral-soft);color:var(--faint)}
.ui-empty-icon svg{width:28px;height:28px}
.ui-empty-title{font-family:var(--font-display);font-size:var(--fs-16);font-weight:600;line-height:var(--lh-heading);color:var(--ink);margin:var(--sp-2) 0 0}
.ui-empty-text{font-size:var(--fs-14);margin:0;max-width:40ch}

/* ---------- Skeleton loading: .ui-skeleton ----------
   <span class="ui-skeleton ui-skeleton--text"></span>
   Varian: --text (baris) | --title (judul) | --card (blok besar).
   Animasi shimmer dimatikan bila prefers-reduced-motion. */
.ui-skeleton{display:block;min-height:var(--sp-4);background:var(--skeleton);border-radius:var(--r-sm);position:relative;overflow:hidden}
.ui-skeleton::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,var(--skeleton-shine),transparent);animation:ui-shimmer 1.4s ease infinite}
.ui-skeleton--text{height:14px}
.ui-skeleton--title{height:24px;width:55%}
.ui-skeleton--card{height:120px;border-radius:var(--r-lg)}
@keyframes ui-shimmer{from{transform:translateX(-100%)}to{transform:translateX(100%)}}
@media (prefers-reduced-motion:reduce){
  .ui-skeleton::after{animation:none}
  .ui-modal-card,.ui-toast{animation:none}
  .ui-btn,.ui-nav-item,.ui-side{transition:none}
}

/* ==========================================================================
   3. APP SHELL SERAGAM (DESIGN-SPEC.md bagian 3)
   --------------------------------------------------------------------------
   Pola sidebar + header yang SAMA untuk semua halaman aplikasi. Struktur
   yang diharapkan (markup statis per halaman, identik antarhalaman —
   pertahankan id/handler lama seperti #sidebarMenu, #sidebarOverlay,
   .theme-toggle-btn, #btnLogoutSidebar bila JS existing memakainya):

   <body>
     <div class="ui-shell">
       <nav class="ui-side" id="sidebarMenu" aria-label="Navigasi utama">
         <div class="ui-side-brand">
           <span class="ui-side-logo"><img ... alt="Mikode POS"></span>
           <button class="ui-icon-btn theme-toggle-btn" ...>[ikon moon/sun]</button>
           <button class="ui-icon-btn" ...>[ikon x]</button>  (tutup, HP saja)
         </div>
         <ul class="ui-nav">
           <li><a class="ui-nav-item is-active" aria-current="page" href="...">
                 [ikon SVG]<span>Dashboard</span></a></li>
           ... item lain sama urutan & labelnya di semua halaman ...
           <li class="ui-nav-spacer"><a class="ui-nav-item" href="#">[logout] Keluar</a></li>
         </ul>
         <div class="ui-side-foot">
           <span class="ui-tenant-chip">
             <span class="ui-tenant-name">Nama Toko</span>
             <span class="ui-tenant-plan">Paket Bisnis - sisa 12 hari</span>
           </span>
         </div>
       </nav>
       <div class="ui-shell-main">
         <header class="ui-topbar">
           <button class="ui-icon-btn" ...>[ikon menu]</button> (HP saja)
           <h1 class="ui-topbar-title">Judul Halaman</h1>
           <div class="ui-topbar-actions">... tombol tema/keluar ...</div>
         </header>
         <main class="ui-main">... konten halaman ...</main>
       </div>
     </div>

   State aktif nav (.is-active, alias .active agar cocok markup lama):
   latar accent-soft + garis kiri brand (::before) + teks tebal 600.
   Di <=980px sidebar jadi drawer geser: sembunyi di luar kiri, tampil bila
   .ui-side.is-open (alias .active seperti class lama .sidebar.active).
   ========================================================================== */
.ui-shell{display:flex;min-height:100vh;min-height:100dvh;background:var(--bg-tint);color:var(--ink)}
.ui-shell-main{flex:1;min-width:0;display:flex;flex-direction:column}
.ui-side{position:sticky;top:0;height:100vh;height:100dvh;width:260px;flex:none;display:flex;flex-direction:column;gap:var(--sp-5);padding:var(--sp-5) var(--sp-4);padding-top:max(var(--sp-5),env(safe-area-inset-top));background:var(--side-bg);color:var(--side-ink);overflow-y:auto;z-index:1000}
.ui-side-brand{display:flex;align-items:center;gap:var(--sp-2);padding-bottom:var(--sp-4);border-bottom:1px solid var(--side-line)}
.ui-side-logo{display:flex;align-items:center;margin-right:auto;font-family:var(--font-display);font-size:var(--fs-20);font-weight:700;line-height:var(--lh-heading);color:var(--side-ink);text-decoration:none}
.ui-side-logo img{height:28px;width:auto;display:block}
.ui-side .ui-icon-btn{color:var(--side-ink)}
.ui-side .ui-icon-btn:hover{background:var(--side-chip-bg)}
.ui-nav{display:flex;flex-direction:column;gap:var(--sp-1);list-style:none;margin:0;padding:0;flex:1}
.ui-nav-spacer{margin-top:auto}
.ui-nav-item{position:relative;display:flex;align-items:center;gap:var(--sp-3);min-height:44px;padding:var(--sp-2) var(--sp-3);border-radius:var(--r-sm);color:var(--side-muted);font-size:var(--fs-14);font-weight:500;line-height:var(--lh-text);text-decoration:none;transition:background-color .2s ease,color .2s ease}
.ui-nav-item svg{width:20px;height:20px;flex:none}
.ui-nav-item::before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:4px;height:0;border-radius:0 var(--r-sm) var(--r-sm) 0;background:var(--side-active-line);transition:height .2s ease}
.ui-nav-item:hover{background:var(--side-chip-bg);color:var(--side-ink)}
.ui-nav-item:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
.ui-nav-item.is-active,.ui-nav-item.active,.ui-nav-item[aria-current="page"]{background:var(--side-active-bg);color:var(--side-ink);font-weight:600}
.ui-nav-item.is-active::before,.ui-nav-item.active::before,.ui-nav-item[aria-current="page"]::before{height:60%}
.ui-side-foot{margin-top:auto;padding-top:var(--sp-4);border-top:1px solid var(--side-line)}
.ui-tenant-chip{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-3);border:1px solid var(--side-line);border-radius:var(--r-md);background:var(--side-chip-bg);color:var(--side-ink);font-size:var(--fs-13);line-height:var(--lh-text)}
.ui-tenant-name{font-weight:600;font-size:var(--fs-14)}
.ui-tenant-plan{color:var(--side-muted);font-size:var(--fs-12)}
.ui-topbar{position:sticky;top:0;z-index:900;display:flex;align-items:center;gap:var(--sp-4);min-height:var(--mk-nav-h);padding:var(--sp-3) var(--sp-5);padding-top:max(var(--sp-3),env(safe-area-inset-top));background:var(--topbar-bg);border-bottom:1px solid var(--line);backdrop-filter:saturate(1.4) blur(12px);-webkit-backdrop-filter:saturate(1.4) blur(12px)}
.ui-topbar-title{font-family:var(--font-display);font-size:var(--fs-20);font-weight:600;line-height:var(--lh-heading);color:var(--ink);margin:0}
.ui-topbar-actions{margin-left:auto;display:flex;align-items:center;gap:var(--sp-2)}
.ui-main{flex:1;min-width:0;width:100%;padding:var(--sp-6)}
@media (max-width:980px){
  .ui-main{padding:var(--sp-4)}
  .ui-side{position:fixed;left:0;top:0;transform:translateX(-100%);transition:transform .25s ease;box-shadow:var(--sh-pop);z-index:10001}
  .ui-side.is-open,.ui-side.active{transform:none}
}
@media (max-width:640px){
  .ui-main{padding:var(--sp-3)}
  .ui-topbar{padding:var(--sp-2) var(--sp-3);padding-top:max(var(--sp-2),env(safe-area-inset-top));gap:var(--sp-2)}
  .ui-card{padding:var(--sp-4)}
  .ui-modal-card{padding:var(--sp-5)}
}

/* ================= Fase 2 — perbaikan shell global =================
   Tombol "Tutup" sidebar hanya untuk mode drawer (<=980px); di desktop
   sidebar selalu terlihat sehingga tombol disembunyikan. !important
   dipakai karena CSS per halaman Fase 1 memberi display:inline-flex
   tanpa media query dan urutan muatnya sesudah file ini. */
@media (min-width:981px){
  .btn-close-sidebar{display:none!important}
}
/* Ikon SVG tombol tema (digambar terpusat oleh js/theme-toggle.js)
   harus terlihat jelas di dalam tombol 34px milik style.css. */
.theme-toggle-btn svg{width:20px;height:20px;display:block}

/* Ukuran bawaan ikon SVG UI.ikon: tanpa aturan konteks, SVG tanpa atribut
   width/height akan melebar mengikuti wadahnya (bug tombol dapur raksasa).
   Aturan konteks yang lebih spesifik tetap menang dari nilai bawaan ini. */
.ui-ikon { width: 20px; height: 20px; flex-shrink: 0; }

/* UI.prompt (Fase 3): field di dalam modal tidak perlu margin bawah bawaan
   .ui-field — jarak sudah diatur .ui-modal-card. */
.ui-modal .ui-field { margin-bottom: 0; }

/* Atribut hidden HARUS selalu menang atas display komponen (.ui-btn,
   .ui-card, dll.) — tanpa aturan ini tombol ber-atribut hidden tetap
   tampil (kasus nyata: tombol Hapus Data Contoh Fase 3). */
[hidden] { display: none !important; }

/* Perbaikan HP (23 Okt 2026): tombol CTA nav disembunyikan di layar kecil di SEMUA
   halaman (aturan ini sebelumnya hanya ada di publik-ui.css yang tidak dimuat
   halaman login, sehingga CTA meluber ke kanan di sana). Menu tetap menyediakan
   jalan ke trial/harga. */
@media (max-width:560px){.pub-cta{display:none}}

/* Penguat anti-geser (23 Okt 2026, menyusul laporan form login tidak center):
   halaman tidak boleh bisa melebar menyamping hanya karena satu elemen nav —
   overflow-x:clip di body menahan luapan tanpa merusak position:sticky. */
body{overflow-x:clip}
@supports not (overflow:clip){body{overflow-x:hidden}}
@media (max-width:560px){.pub-menu{gap:1rem}.pub-nav-inner{gap:1rem}}

/* ================= PWA & sentuh (semua perangkat) =================
   - text-size-adjust 100%: iOS tidak membesarkan teks sendiri saat HP miring.
   - tap-highlight transparan + touch-action manipulation: tidak ada kedip
     abu-abu dan tidak ada jeda/zoom dobel-tap saat kasir mengetuk cepat.
   - Bidang isian minimal 16px di layar sentuh: iOS berhenti auto-zoom
     setiap kali kasir menyentuh kolom (PIN, cari produk, dsb). */
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
*{-webkit-tap-highlight-color:transparent}
a,button,[role="button"],input,select,textarea,label{touch-action:manipulation}
@media (pointer:coarse){
  .ui-field input,.ui-field select,.ui-field textarea,.ui-input,.ui-select,.ui-textarea{font-size:16px}
}
