:root{
  --bg:#f3f4f6;--panel:#ffffff;--panel2:#f9fafb;--line:#e5e7eb;--line2:#d1d5db;
  --txt:#1e293b;--muted:#64748b;--brand:#2563eb;--brand2:#3b82f6;--brandsoft:#eff6ff;
  --green:#22c55e;--yellow:#eab308;--red:#ef4444;--purple:#a855f7;
  --radius:10px;--shadow:0 1px 2px rgba(16,24,40,.05),0 1px 3px rgba(16,24,40,.05);
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{background:var(--bg);color:var(--txt);
     font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Ubuntu,sans-serif;font-size:14.5px;line-height:1.55}
a{color:var(--brand);text-decoration:none}
.boot{min-height:100vh;display:flex;flex-direction:column;gap:12px;align-items:center;justify-content:center;color:var(--muted)}
.spinner{width:46px;height:46px;border:4px solid #e2e8f0;border-top-color:var(--brand);border-radius:50%;animation:spin 1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.btn{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--line);background:#fff;color:var(--txt);
     padding:9px 15px;border-radius:9px;cursor:pointer;font-size:14px;font-weight:600;transition:.15s;text-decoration:none}
.btn:hover{border-color:#cbd5e1;background:var(--panel2)}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover{background:var(--brand2);border-color:var(--brand2)}
.btn.green{background:var(--green);border-color:var(--green);color:#fff}
.btn.red{background:#fef2f2;border-color:#fecaca;color:#b91c1c}
.btn.red:hover{background:#fee2e2}
.btn.sm{padding:5px 10px;font-size:12.5px;border-radius:7px}
.btn:disabled{opacity:.5;cursor:not-allowed}
.input,select.input,textarea.input{width:100%;background:#fff;border:1px solid var(--line2);color:var(--txt);
   padding:9px 12px;border-radius:9px;font-size:14px;outline:none;transition:border-color .12s, box-shadow .12s}
.input:focus{border-color:var(--brand);box-shadow:0 0 0 3px #2563eb1a}
textarea.input{resize:vertical;min-height:80px;font-family:inherit}
label{display:block;margin:12px 0 5px;font-size:12.5px;color:var(--muted);font-weight:600}
.row{display:flex;gap:12px;align-items:center}
.row.wrap{flex-wrap:wrap}
.row .grow{flex:1}
.muted{color:var(--muted)}
.small{font-size:13px}
.mt{margin-top:14px}.mb{margin-bottom:14px}

/* ===== login ===== */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;
  background:radial-gradient(900px 500px at 85% -10%,#dbeafe,transparent),radial-gradient(700px 420px at 0% 110%,#eff6ff,transparent),var(--bg)}
.login-card{width:100%;max-width:420px;background:#fff;border:1px solid var(--line);border-radius:16px;padding:32px;
  box-shadow:0 4px 6px -1px rgba(0,0,0,.05),0 10px 30px -5px rgba(0,0,0,.08)}
.login-card h1{font-size:21px;margin:0 0 4px;color:#0f172a}
.login-card .sub{color:var(--muted);margin-bottom:20px;font-size:14px}
.logo-mark{width:52px;height:52px;border-radius:14px;background:linear-gradient(135deg,#2563eb,#4f46e5);color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:26px;margin-bottom:16px;box-shadow:0 4px 10px -2px #2563eb66}
.pill{display:inline-block;padding:3px 10px;border-radius:99px;font-size:12px;font-weight:700}
.pill.blue{background:#eff6ff;color:#1d4ed8}.pill.green{background:#ecfdf5;color:#059669}
.pill.yellow{background:#fffbeb;color:#b45309}.pill.red{background:#fef2f2;color:#b91c1c}
.pill.purple{background:#f5f3ff;color:#7c3aed}.pill.gray{background:#f3f4f6;color:#4b5563}

/* ===== layout admin ===== */
.shell{display:flex;min-height:100vh}
.sidebar{width:248px;background:#fff;border-right:1px solid var(--line);padding:18px 12px;display:flex;flex-direction:column;
  position:sticky;top:0;height:100vh}
.sidebar .brand{display:flex;align-items:center;gap:10px;padding:4px 8px 16px;font-weight:800;font-size:16px;color:#0f172a}
.sidebar .brand .box{width:34px;height:34px;border-radius:10px;background:linear-gradient(135deg,#2563eb,#4f46e5);
  display:flex;align-items:center;justify-content:center;color:#fff;font-size:17px;box-shadow:0 2px 6px -1px #2563eb55}
.sidebar nav a{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;color:#475569;text-decoration:none;
  margin-bottom:2px;font-weight:600;font-size:14px;border-left:3px solid transparent}
.sidebar nav a:hover{background:var(--panel2);color:#0f172a}
.sidebar nav a.active{background:var(--brandsoft);color:var(--brand);border-left-color:var(--brand)}
.sidebar .navhead{padding:14px 12px 4px;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#9ca3af}
.main{flex:1;padding:24px;min-width:0}
.topbar{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;gap:12px;flex-wrap:wrap}
.topbar h2{margin:0;font-size:19px;color:#0f172a}
.card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:18px;box-shadow:var(--shadow)}
.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:20px}
.stat{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow);border-top:3px solid var(--brand)}
.stat .n{font-size:26px;font-weight:800;color:#0f172a}
.stat .l{color:var(--muted);font-size:13px}
table{width:100%;border-collapse:collapse}
th,td{text-align:left;padding:10px 12px;border-bottom:1px solid #f1f5f9;font-size:14px;vertical-align:top}
th{color:var(--muted);font-weight:700;font-size:11.5px;text-transform:uppercase;letter-spacing:.04em;background:#f8fafc}
tr:hover td{background:#f8fafc}
.table-wrap{overflow-x:auto}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.token-chip{font-family:ui-monospace,monospace;font-weight:800;letter-spacing:2px;background:#eff6ff;border:1px dashed var(--brand);
  border-radius:8px;padding:5px 11px;color:#1d4ed8}

/* ===== modal ===== */
.overlay{position:fixed;inset:0;background:rgba(15,23,42,.45);backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;padding:20px;z-index:50}
.modal{background:#fff;border:1px solid var(--line);border-radius:14px;max-width:720px;width:100%;max-height:90vh;overflow:auto;padding:22px;box-shadow:0 20px 45px -12px rgba(0,0,0,.25)}
.modal h3{margin:0 0 4px;color:#0f172a}
.modal .x{float:right;cursor:pointer;color:var(--muted);font-size:22px;border:none;background:none}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
@media(max-width:640px){.grid-2{grid-template-columns:1fr}.shell{flex-direction:column}.sidebar{width:100%;height:auto;position:static;flex-direction:row;align-items:center;overflow-x:auto}.sidebar nav{display:flex;gap:4px}.sidebar .brand{padding-bottom:0}}
.toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:#0f172a;border:1px solid #1e293b;color:#f8fafc;
  padding:11px 20px;border-radius:10px;box-shadow:0 10px 30px -5px rgba(0,0,0,.4);z-index:99;font-weight:600;max-width:90vw}
.toast.ok{border-color:#10b981}.toast.err{border-color:#f43f5e}
.badge{display:inline-block;min-width:22px;height:22px;border-radius:7px;text-align:center;line-height:22px;font-size:12px;font-weight:700;background:#eef2f7;color:#334155}
.opt{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);border-radius:9px;margin-bottom:8px;cursor:pointer;transition:.12s;background:#fff}
.opt:hover{border-color:#c7d2fe}
.opt .k{flex:0 0 28px;height:28px;border-radius:8px;background:#f1f5f9;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-weight:800;color:#475569}
.opt.selected{border-color:var(--brand);background:var(--brandsoft)}
.opt.selected .k{background:var(--brand);color:#fff;border-color:var(--brand)}
.opt.partial{border-color:var(--yellow)}
.opt.partial .k{background:var(--yellow);color:#fff;border-color:var(--yellow)}
.opt.wrong{border-color:#fecaca;opacity:.65;background:#fffbfb}
.opt .m{flex:1}
.answer-grid{display:flex;flex-direction:column;gap:10px}
.mpair{display:flex;gap:10px;align-items:center}
.mpair select{flex:1}
.tabbar{display:flex;gap:6px;border-bottom:1px solid var(--line);margin-bottom:18px;flex-wrap:wrap}
.tabbar button{border:none;background:none;color:var(--muted);font-weight:700;padding:10px 14px;border-bottom:2px solid transparent;cursor:pointer;font-size:14px}
.tabbar button.active{color:var(--brand);border-bottom-color:var(--brand)}

/* ===== layar ujian ===== */
body.exam-mode{background:radial-gradient(900px 500px at 20% -10%,#dbeafe,transparent),var(--bg);overflow-x:hidden}
.exam-top{position:sticky;top:0;z-index:20;display:flex;align-items:center;justify-content:space-between;gap:12px;
  background:#ffffffee;backdrop-filter:blur(8px);border-bottom:1px solid var(--line);padding:12px 20px;box-shadow:0 1px 3px rgba(0,0,0,.04)}
.exam-title{font-weight:800;font-size:15px;color:#0f172a}
.timer{font-family:ui-monospace,monospace;font-size:22px;font-weight:800;color:#059669;background:#ecfdf5;
  border:1px solid #a7f3d0;border-radius:10px;padding:6px 14px;letter-spacing:1px}
.timer.warn{color:#dc2626;background:#fef2f2;border-color:#fecaca;animation:pulse 1s infinite}
@keyframes pulse{50%{opacity:.55}}
.exam-body{display:grid;grid-template-columns:1fr 300px;gap:18px;padding:20px;max-width:1200px;margin:0 auto}
@media(max-width:860px){.exam-body{grid-template-columns:1fr}}
.qcard{min-height:320px}
.qtext{font-size:17px;line-height:1.7;white-space:pre-wrap}
.navgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:7px}
.navitem{border:1px solid var(--line);background:#fff;color:var(--txt);border-radius:8px;height:38px;
  font-weight:700;cursor:pointer;font-size:14px;transition:.1s;box-shadow:var(--shadow)}
.navitem:hover{border-color:var(--brand2)}
.navitem.done{background:var(--green);border-color:var(--green);color:#fff}
.navitem.flag{background:var(--yellow);border-color:var(--yellow);color:#fff}
.navitem.cur{outline:2px solid var(--brand);outline-offset:1px}
.navdot{display:inline-block;width:12px;height:12px;border-radius:4px;margin-right:5px;vertical-align:-1px}
.viol-overlay{position:fixed;inset:0;background:rgba(15,23,42,.55);display:flex;align-items:center;justify-content:center;z-index:100;padding:20px}
@media print{body.exam-mode{display:none}}
/* exo-like additions */
.chklist{max-height:340px;overflow:auto;border:1px solid var(--line);border-radius:10px;padding:6px;background:#fff}
.chk{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;cursor:pointer}
.chk:hover{background:var(--panel2)}
.chk input{accent-color:var(--brand);width:17px;height:17px}
.prog{width:130px;height:8px;border-radius:99px;background:#eef2f7;border:1px solid var(--line);overflow:hidden}
.prog-bar{height:100%;background:var(--green);transition:width .4s}
.row.wrap{flex-wrap:wrap}
.chk-inline{width:auto;display:inline-block;margin:0 8px 0 0;vertical-align:middle;accent-color:var(--brand)}
label.acc{display:flex;flex-direction:column;align-items:center;gap:4px}
