/* Mazov admin — design tokens (light/dark) + komponen. */
:root{
  color-scheme:light;
  --bg:#f6f7f8; --surface:#ffffff; --surface-2:#fbfbfc;
  --border:#e4e6ea; --border-soft:#f0f1f4; --border-strong:#d3d6dc;
  --text:#12141a; --text-2:#3b4250; --muted:#6b7280; --faint:#9aa1ac; --hover:#fafbfc;
  --accent:#8f1d2e; --accent-soft:#fceef0; --accent-text:#7a1526; --accent-line:#f0ccd2;
  --ok:#0a7b4b; --ok-soft:#e7f6ee; --ok-line:#cbeedb;
  --warn:#9a5b00; --warn-soft:#fdf2e2; --warn-line:#f3e0c2;
  --danger:#b42318; --danger-soft:#fdeceb; --danger-line:#f4d3cf;
  --mute-soft:#f1f2f5;
  --primary-bg:#12141a; --primary-fg:#ffffff; --primary-hover:#252a33;
  --topbar:rgba(246,247,248,.86);
  --skel-a:#eef0f3; --skel-b:#f7f8f9;
  --radius:10px; --radius-sm:7px;
  --shadow:0 1px 2px rgba(16,24,40,.05);
  --shadow-lg:0 12px 32px rgba(16,24,40,.14);
  --sidebar:236px; --header:56px;
  --font:ui-sans-serif,-apple-system,"Segoe UI",Roboto,Inter,Arial,sans-serif;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}
:root[data-theme="dark"]{
  color-scheme:dark;
  --bg:#000000; --surface:#0a0a0b; --surface-2:#121214;
  --border:#1d1d1f; --border-soft:#151517; --border-strong:#2b2b2e;
  --text:#e4e7ec; --text-2:#b0b8c4; --muted:#8f98a5; --faint:#7b8694; --hover:#151517;
  --accent:#c04257; --accent-soft:#261014; --accent-text:#f0a3af; --accent-line:#43171f;
  --ok:#4fc98b; --ok-soft:#0d2118; --ok-line:#1a3326;
  --warn:#d8a054; --warn-soft:#241c11; --warn-line:#3a2d1a;
  --danger:#e87d73; --danger-soft:#251312; --danger-line:#3d1e1c;
  --mute-soft:#151a20;
  --primary-bg:#e4e7ec; --primary-fg:#0b0c0e; --primary-hover:#ffffff;
  --topbar:rgba(0,0,0,.86);
  --skel-a:#101012; --skel-b:#17171a;
  --shadow:0 1px 2px rgba(0,0,0,.55);
  --shadow-lg:0 18px 44px rgba(0,0,0,.6);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--bg);color:var(--text);font:14px/1.45 var(--font);-webkit-font-smoothing:antialiased}
a{color:var(--accent);text-decoration:none}
h1,h2,h3,p{margin:0}
button{font:inherit}

/* ---------- shell ---------- */
.app{display:grid;grid-template-columns:var(--sidebar) 1fr;min-height:100vh}
.sidebar{position:sticky;top:0;height:100vh;background:var(--surface);border-right:1px solid var(--border);
  display:flex;flex-direction:column;padding:16px 12px;gap:4px;z-index:40}
.brand{display:flex;align-items:center;gap:9px;padding:6px 8px 14px}
.brand-mark{width:26px;height:26px;border-radius:8px;background:var(--text);color:var(--surface);
  display:grid;place-items:center;font-size:11px;font-weight:700;letter-spacing:.02em}
.brand-mark svg{width:15px;height:15px;fill:currentColor;stroke:none}
.brand-name{font-weight:620;letter-spacing:-.01em}
.brand-sub{font-size:11px;color:var(--faint)}
.nav-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--faint);padding:12px 10px 6px}
.nav{display:flex;flex-direction:column;gap:2px}
.nav a{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--radius-sm);
  color:var(--text-2);font-weight:520}
.nav a svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;opacity:.75}
.nav a:hover{background:var(--surface-2);color:var(--text)}
.nav a[aria-current="page"]{background:var(--accent-soft);color:var(--accent-text);box-shadow:inset 0 0 0 1px var(--accent-line)}
.nav a[aria-current="page"] svg{opacity:1}
.sidebar-foot{margin-top:auto;border-top:1px solid var(--border);padding-top:10px;font-size:12px;color:var(--muted)}
.sidebar-foot .rowline{display:flex;justify-content:space-between;gap:8px;padding:3px 0}
.main{min-width:0;display:flex;flex-direction:column}
.topbar{position:sticky;top:0;z-index:30;height:var(--header);display:flex;align-items:center;gap:12px;
  padding:0 20px;background:var(--topbar);backdrop-filter:blur(8px);border-bottom:1px solid var(--border)}
.topbar h1{font-size:15px;font-weight:620;letter-spacing:-.01em}
.topbar .spacer{flex:1}
.topbar .hint{font-size:12px;color:var(--muted)}
.content{padding:20px;max-width:1240px;width:100%}
.hamburger{display:none;background:var(--surface);border:1px solid var(--border);border-radius:8px;width:34px;height:34px;
  align-items:center;justify-content:center;cursor:pointer;color:var(--text)}
.hamburger svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round}
.backdrop{display:none;position:fixed;inset:0;background:rgba(12,15,22,.38);z-index:35}
.backdrop.show{display:block}

/* ---------- layout blocks ---------- */
.section{display:flex;flex-direction:column;gap:14px;margin-bottom:22px}
.section-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.section-head h2{font-size:13px;font-weight:620;letter-spacing:.01em;text-transform:uppercase;color:var(--muted)}
.section-head .spacer{flex:1}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(178px,1fr));gap:12px}
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}
.card-pad{padding:14px 16px}
.stat{padding:14px 16px}
.stat .label{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px}
.stat .value{font-size:23px;font-weight:640;letter-spacing:-.02em;margin-top:6px;font-variant-numeric:tabular-nums}
.stat .meta{font-size:12px;color:var(--faint);margin-top:3px}
.two-col{display:grid;grid-template-columns:1.45fr 1fr;gap:14px}
@media (max-width:980px){.two-col{grid-template-columns:1fr}}

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:34px;padding:0 12px;
  border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--surface);color:var(--text);
  font-weight:540;cursor:pointer;white-space:nowrap;transition:background .12s,border-color .12s}
.btn:hover{background:var(--hover)}
.btn svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.btn-primary{background:var(--primary-bg);border-color:var(--primary-bg);color:var(--primary-fg)}
.btn-primary:hover{background:var(--primary-hover);border-color:var(--primary-hover)}
.btn-ghost{border-color:transparent;background:transparent;color:var(--muted)}
.btn-ghost:hover{background:var(--surface-2);color:var(--text)}
.btn-danger{color:var(--danger);border-color:var(--danger-line);background:var(--danger-soft)}
.btn-danger:hover{background:var(--danger-soft);filter:brightness(.97)}
.btn-sm{height:29px;padding:0 9px;font-size:12.5px}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn-row{display:flex;gap:8px;flex-wrap:wrap}
/* segmented control (pilih rentang waktu) */
.seg{display:inline-flex;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:2px;gap:2px}
.seg button{height:28px;padding:0 11px;border:0;border-radius:6px;background:transparent;color:var(--muted);
  font-size:12.5px;font-weight:540;cursor:pointer}
.seg button:hover{color:var(--text)}
.seg button[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent-text);box-shadow:inset 0 0 0 1px var(--accent-line)}
/* bar chart varian biaya */
.chart.cost .bar{background:var(--accent);opacity:.55}
.icon-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:8px;
  border:1px solid var(--border);background:var(--surface);color:var(--muted);cursor:pointer}
.icon-toggle:hover{color:var(--text);background:var(--hover)}
.icon-toggle svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}

/* ---------- forms ---------- */
.field{display:flex;flex-direction:column;gap:5px}
.field > label{font-size:12px;color:var(--muted);font-weight:540}
.input,select.input,textarea.input{height:34px;padding:0 10px;border:1px solid var(--border-strong);
  border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font:inherit;min-width:0}
textarea.input{height:auto;padding:8px 10px}
.input:focus{outline:2px solid var(--accent-soft);outline-offset:0;border-color:var(--accent-line)}
.input-group{display:flex;gap:8px;flex-wrap:wrap}
.hint{font-size:12px;color:var(--faint)}
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}

/* ---------- table ---------- */
.table-wrap{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:auto;box-shadow:var(--shadow)}
table{width:100%;border-collapse:collapse;font-size:13px}
thead th{position:sticky;top:0;background:var(--surface-2);text-align:left;font-weight:600;font-size:11.5px;
  text-transform:uppercase;letter-spacing:.04em;color:var(--muted);padding:9px 12px;
  border-bottom:1px solid var(--border);white-space:nowrap;z-index:1}
tbody td{padding:10px 12px;border-bottom:1px solid var(--border-soft);vertical-align:middle}
tbody tr:last-child td{border-bottom:0}
tbody tr:hover{background:var(--hover)}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
td.mono{font-family:var(--mono);font-size:12px;color:var(--muted)}
.row-actions{display:flex;gap:6px;justify-content:flex-end}
.table-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;padding:12px;border-bottom:1px solid var(--border);background:var(--surface)}
.table-foot{display:flex;align-items:center;gap:10px;padding:10px 12px;border-top:1px solid var(--border);background:var(--surface);font-size:12.5px;color:var(--muted)}
.table-foot .spacer{flex:1}
@media (max-width:760px){
  .col-lg{display:none}
  .content{padding:14px}
}
@media (max-width:560px){ .col-md{display:none} }

/* ---------- badges / pills ---------- */
.badge{display:inline-flex;align-items:center;gap:5px;height:21px;padding:0 8px;border-radius:999px;
  font-size:11.5px;font-weight:560;border:1px solid transparent;white-space:nowrap}
.badge-ok{background:var(--ok-soft);color:var(--ok);border-color:var(--ok-line)}
.badge-warn{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-line)}
.badge-danger{background:var(--danger-soft);color:var(--danger);border-color:var(--danger-line)}
.badge-mute{background:var(--mute-soft);color:var(--muted);border-color:var(--border)}
.badge-info{background:var(--accent-soft);color:var(--accent-text);border-color:var(--accent-line)}
.dot{width:6px;height:6px;border-radius:50%;background:currentColor;display:inline-block}

/* ---------- empty / loading ---------- */
.empty{padding:34px 16px;text-align:center;color:var(--muted)}
.empty svg{width:26px;height:26px;stroke:var(--faint);fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;margin-bottom:8px}
.empty p{font-size:13px}
.skeleton{height:12px;border-radius:6px;background:linear-gradient(90deg,var(--skel-a),var(--skel-b),var(--skel-a));background-size:200% 100%;animation:sk 1.1s linear infinite}
@keyframes sk{0%{background-position:0% 0}100%{background-position:-200% 0}}

/* ---------- modal ---------- */
.modal-backdrop{position:fixed;inset:0;background:rgba(8,10,14,.5);display:flex;align-items:center;justify-content:center;
  padding:16px;z-index:60;animation:fade .12s ease-out}
.modal{background:var(--surface);border:1px solid var(--border);border-radius:12px;box-shadow:var(--shadow-lg);width:100%;max-width:460px;
  max-height:calc(100vh - 32px);display:flex;flex-direction:column;animation:pop .14s ease-out}
.modal.wide{max-width:620px}
.modal-head{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--border)}
.modal-head h3{font-size:14px;font-weight:620}
.modal-head .spacer{flex:1}
.modal-body{padding:16px;overflow:auto;display:flex;flex-direction:column;gap:12px}
.modal-foot{display:flex;gap:8px;justify-content:flex-end;padding:12px 16px;border-top:1px solid var(--border);
  background:var(--surface-2);border-radius:0 0 12px 12px}
.icon-btn{background:transparent;border:0;cursor:pointer;color:var(--muted);display:grid;place-items:center;width:28px;height:28px;border-radius:6px}
.icon-btn:hover{background:var(--hover);color:var(--text)}
.icon-btn svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
@keyframes fade{from{opacity:0}to{opacity:1}}
@keyframes pop{from{opacity:0;transform:translateY(6px) scale(.99)}to{opacity:1;transform:none}}

/* ---------- toast ---------- */
.toasts{position:fixed;right:14px;bottom:14px;display:flex;flex-direction:column;gap:8px;z-index:80;max-width:calc(100vw - 28px)}
.toast{background:#101318;color:#fff;padding:10px 12px;border-radius:8px;font-size:13px;box-shadow:var(--shadow-lg);
  display:flex;align-items:center;gap:8px;animation:pop .16s ease-out}
.toast svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.toast.err{background:#8f1d15}
.toast.ok{background:#0b5c3c}

/* ---------- chart ---------- */
.chart{display:flex;align-items:flex-end;gap:3px;height:96px;padding:6px 2px 0}
.chart .bar{flex:1;background:var(--accent);opacity:.75;border-radius:2px 2px 0 0;min-height:2px;position:relative}
.chart .bar:hover{opacity:1}
.chart .bar span{position:absolute;bottom:-17px;left:50%;transform:translateX(-50%);font-size:10px;color:var(--faint)}

/* ---------- key reveal ---------- */
.key-box{font-family:var(--mono);font-size:12.5px;background:var(--surface-2);border:1px dashed var(--border-strong);
  border-radius:8px;padding:10px;word-break:break-all}
.kv{display:grid;grid-template-columns:minmax(150px,220px) 1fr;gap:0;font-size:13px}
.kv > div{padding:9px 12px;border-bottom:1px solid var(--border-soft)}
.kv > div:nth-child(odd){color:var(--muted);background:var(--surface-2)}
@media (max-width:620px){ .kv{grid-template-columns:1fr} .kv > div:nth-child(odd){border-bottom:0;padding-bottom:2px}
  .kv > div:nth-child(even){padding-top:2px} }
.log{font-family:var(--mono);font-size:12px;background:#0f1216;color:#d7dce3;border-radius:8px;padding:10px;overflow:auto;max-height:180px;white-space:pre-wrap}

/* ---------- auth gate ---------- */
.gate{position:fixed;inset:0;display:grid;place-items:center;background:var(--bg);z-index:100;padding:16px}
.gate-card{width:100%;max-width:352px;background:var(--surface);border:1px solid var(--border);border-radius:12px;
  box-shadow:var(--shadow);padding:22px;display:flex;flex-direction:column;gap:12px}
.gate-card h2{font-size:16px;font-weight:640}
.gate-card p{font-size:13px;color:var(--muted)}
.gate-card .brand-mark{width:30px;height:30px}


/* ---------- animasi perpindahan tema (lingkaran dari tombol) ---------- */
#theme-circle{position:fixed;border-radius:50%;pointer-events:none;z-index:200;
  transform:translate(-50%,-50%) scale(0)}
#theme-circle.grow{animation:themeCircle 1.4s cubic-bezier(.16,.84,.3,1) forwards}
@keyframes themeCircle{
  from{transform:translate(-50%,-50%) scale(0);opacity:.95}
  to{transform:translate(-50%,-50%) scale(1);opacity:0}
}
::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}
::view-transition-old(root){z-index:1}
::view-transition-new(root){z-index:2}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition:none !important;animation:none !important}
}
@media (max-width:900px){
  .app{grid-template-columns:1fr}
  /* drawer pakai left (bukan transform) supaya konsisten di semua renderer */
  .sidebar{position:fixed;left:-101vw;top:0;width:min(84vw,272px);height:100vh;transform:none;
    transition:left .18s ease;box-shadow:22px 0 40px rgba(12,15,22,.16)}
  .sidebar.open{left:0}
  .hamburger{display:flex}
  .topbar h1{font-size:14px}
}

.ugrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px}
.ugrid > .card{min-width:0}
.user-cell{display:flex;align-items:center;gap:10px}
.avatar{width:34px;height:34px;border-radius:8px;object-fit:cover;border:1px solid var(--border-strong);flex:none}
.avatar-fallback{display:inline-flex;align-items:center;justify-content:center;background:var(--surface-2);
  font-weight:600;font-size:14px;color:var(--text)}
.kv{display:grid;grid-template-columns:132px 1fr;gap:6px 10px;font-size:13px}
.kv dt{color:var(--muted)}
.kv dd{margin:0;word-break:break-word}

/* ------------------------------------------------ mobile: tabel jadi kolom kartu
   Baris panjang (usage, logs, billing, API key, admin) dirender sebagai kartu 2 kolom
   supaya halaman tidak memanjang ke bawah. Label diambil dari <thead> lewat tableLabels(). */
@media (max-width:760px){
  .table-wrap table thead{display:none}
  .table-wrap table tbody{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:9px}
  .table-wrap table tbody tr{display:block;border:1px solid var(--border);border-radius:10px;
    background:var(--surface-2);padding:9px 10px;min-width:0}
  .table-wrap table tbody tr:hover{background:var(--surface-2)}
  .table-wrap table tbody td{display:flex;justify-content:space-between;align-items:baseline;gap:8px;
    border:0;padding:2.5px 0;min-width:0;text-align:right;overflow-wrap:anywhere;font-size:12.5px}
  .table-wrap table tbody td::before{content:attr(data-th);flex:0 0 auto;max-width:40%;
    color:var(--faint);font-size:11px;font-weight:500;letter-spacing:.02em;text-align:left}
  /* sel pertama = judul kartu (tanpa label, satu baris) */
  .table-wrap table tbody td:first-child{display:block;text-align:left;font-weight:600;color:var(--text);
    border-bottom:1px solid var(--border);padding-bottom:5px;margin-bottom:5px;white-space:nowrap;
    overflow:hidden;text-overflow:ellipsis}
  .table-wrap table tbody td:first-child::before{content:none}
  /* sel nilai: satu baris + elipsis supaya kolom kiri/kanan tetap sejajar */
  .table-wrap table tbody td:not(:first-child){white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
    flex:1 1 auto;min-width:0;max-width:78%}
  .table-wrap table tbody td.mono:not(:first-child){flex:1 1 78%}
  .table-wrap table tbody td > .v{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;
    white-space:nowrap;text-align:right}
  .table-wrap table tbody td:first-child > .v{text-align:left}
  .table-wrap table tbody td:has(.row-actions){white-space:normal;overflow:visible;flex-wrap:wrap;
    justify-content:flex-end}
  .table-wrap table tbody tr:has(td[colspan]){grid-column:1/-1}
  .table-wrap table tbody td[colspan]{display:block;text-align:center;padding:6px 0}
  .table-wrap table tbody td[colspan]::before{content:none}
  .table-wrap .table-toolbar{gap:6px 8px}
  .table-wrap .table-foot{flex-wrap:wrap;gap:4px 12px}
  .row-actions{justify-content:flex-start;flex-wrap:wrap;gap:6px}
  .stats{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .stat{padding:11px 12px}
  .stat .value{font-size:19px;margin-top:4px}
  .stat .label,.stat .meta{font-size:11.5px}
  .seg{padding:3px}
  .seg button{height:38px;padding:0 12px}
  .ds-tbl,.table-wrap table{display:block;overflow-x:auto;max-width:100%}
  .content{padding:12px}
}
@media (max-width:359px){   /* layar sangat kecil: kartu jadi satu kolom */
  .table-wrap table tbody{grid-template-columns:minmax(0,1fr)}
}
