/* ══════════════════════════════════════
   BASE — css/base.css
══════════════════════════════════════ */
*,*::before,*::after { box-sizing:border-box; margin:0; padding:0; }
html, body { height:100%; overflow:hidden; }
body {
  background:var(--bg); color:var(--t);
  font-family:var(--fn); font-size:14px; line-height:1.5;
}
body::before {
  content:''; position:fixed; inset:0; pointer-events:none; z-index:0;
  background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.88' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.036'/%3E%3C/svg%3E");
}
::-webkit-scrollbar { width:4px; height:4px; }
::-webkit-scrollbar-track { background:transparent; }
::-webkit-scrollbar-thumb { background:var(--b2); border-radius:4px; }
button { font-family:var(--fn); cursor:pointer; }
input, textarea, select { font-family:var(--fn); }

/* ── Animations ── */
@keyframes blink    { 0%,100%{opacity:1} 50%{opacity:.3} }
@keyframes fadeUp   { from{opacity:0;transform:translateY(14px)} to{opacity:1;transform:translateY(0)} }
@keyframes popIn    { from{opacity:0;transform:scale(.93)} to{opacity:1;transform:scale(1)} }
@keyframes spin     { to{transform:rotate(360deg)} }
@keyframes drift    { from{transform:scale(1)} to{transform:scale(1.14) translate(22px,-18px)} }
@keyframes pulse    { 0%,100%{box-shadow:0 0 0 0 rgba(59,142,255,.5)} 70%{box-shadow:0 0 0 7px transparent} }
@keyframes typing   { 0%,80%,100%{transform:scale(.8);opacity:.4} 40%{transform:scale(1.1);opacity:1} }
@keyframes slideIn  { from{opacity:0;transform:translateY(8px)} to{opacity:1;transform:translateY(0)} }

/* ── Utilities ── */
.hidden { display:none !important; }
.spinner {
  width:15px; height:15px;
  border:2px solid rgba(255,255,255,.25); border-top-color:#fff;
  border-radius:50%; animation:spin .65s linear infinite;
  display:inline-block; flex-shrink:0;
}
