:root{
  --bg:#0b0f14; --card:#141b24; --line:#233040; --text:#e8edf2; --muted:#8aa0b4;
  --off:#e0392b; --off-d:#b52a1f;
  --on:#1fa85a; --on-d:#158045;
  --check:#2b6fe0; --check-d:#2056b5;
  --primary:#2b6fe0;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%}
body{
  background:var(--bg); color:var(--text);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,system-ui,sans-serif;
  -webkit-font-smoothing:antialiased;
  padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
}
.view{min-height:100dvh;display:flex;flex-direction:column}
/* the [hidden] attribute must always win over .view's display:flex */
[hidden]{display:none!important}

/* login card */
.card{
  background:var(--card); border:1px solid var(--line); border-radius:16px;
  padding:22px; margin:16px; max-width:440px; width:calc(100% - 32px);
}
#view-login{align-items:center;justify-content:center}
.brand{display:flex;justify-content:center;margin-bottom:6px}
.brand img{border-radius:16px}
h1{font-size:22px;text-align:center;margin:6px 0 18px}
h2{font-size:16px;margin:0 0 12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}

form{display:flex;flex-direction:column;gap:12px}
input[type=text],input[type=password],input:not([type]){
  width:100%; font-size:17px; padding:14px 16px; border-radius:12px;
  border:1px solid var(--line); background:#0e141b; color:var(--text);
}
input:focus{outline:none;border-color:var(--primary)}
.chk{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:15px}
.chk input{width:20px;height:20px}

.btn{font-size:17px;font-weight:600;padding:14px;border:none;border-radius:12px;color:#fff;cursor:pointer}
.btn-primary{background:var(--primary)}
.btn-primary:active{filter:brightness(.9)}

/* topbar */
.topbar{display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid var(--line)}
.who{color:var(--muted);font-size:14px}
.spacer{flex:1}
.link{background:none;border:none;color:var(--primary);font-size:15px;padding:8px;cursor:pointer}

/* three big buttons */
.buttons{flex:1;display:flex;flex-direction:column;gap:16px;padding:18px;justify-content:center}
.big{
  flex:1; min-height:96px; border:none; border-radius:20px;
  font-size:34px; font-weight:800; letter-spacing:.06em; color:#fff; cursor:pointer;
  box-shadow:0 6px 0 rgba(0,0,0,.35); transition:transform .05s, box-shadow .05s;
  user-select:none;
}
.big:active{transform:translateY(4px);box-shadow:0 2px 0 rgba(0,0,0,.35)}
.big:disabled{opacity:.55}
.big.off{background:var(--off)}
.big.on{background:var(--on)}
.big.check{background:var(--check);font-size:28px}

/* status area */
.status{padding:14px 18px 26px;min-height:74px;font-size:15px}
.status .row{display:flex;align-items:center;gap:10px;padding:6px 0}
.status .dot{width:12px;height:12px;border-radius:50%;flex:none;background:var(--muted)}
.status .dot.ok{background:var(--on)}
.status .dot.bad{background:var(--off)}
.status .head{font-weight:700;font-size:17px;margin-bottom:6px}
.status pre{white-space:pre-wrap;word-break:break-word;color:var(--muted);font-size:12px;margin:8px 0 0}
.badge{display:inline-block;padding:4px 12px;border-radius:999px;font-weight:700;font-size:14px}
.badge.blocked{background:rgba(224,57,43,.18);color:#ff8a7d}
.badge.open{background:rgba(31,168,90,.18);color:#67e39b}

/* admin user list */
.user-list{display:flex;flex-direction:column;gap:8px}
.urow{display:flex;align-items:center;gap:10px;padding:10px 12px;background:#0e141b;border:1px solid var(--line);border-radius:12px}
.urow .name{font-weight:600}
.urow .tag{font-size:11px;color:#67e39b;border:1px solid #1f5138;border-radius:6px;padding:1px 6px}
.urow .grow{flex:1}
.urow button{font-size:13px;padding:8px 10px;border-radius:8px;border:1px solid var(--line);background:#1a2430;color:var(--text);cursor:pointer}
.urow button.danger{color:#ff8a7d;border-color:#5a2620}

.error{color:#ff8a7d;font-size:14px;text-align:center;margin:12px 0 0}
.msg{font-size:14px;margin:12px 0 0}
.msg.ok{color:#67e39b}
.msg.bad{color:#ff8a7d}
.spin{opacity:.6}
