/* 与 static/theme.css 和 frontend/src/theme/tokens.css 同一组值。
   登录页不引 theme.css（它要在最少的依赖下渲染出来），所以这几个值在这里重复
   一份 —— 改配色时三处一起改。 */
:root{--red:#bf3b26;--bg:#f3ecda;--white:#faf6ea;--ink:#3a3125;--line:#ddd2b4}
*{box-sizing:border-box}
/* 字体保持 system-ui：登录页是第一屏，不能让它去等 Google Fonts 那个在国内
   不可靠的外部请求。字体不统一这处残差是有意留的。 */
body{margin:0;min-height:100vh;display:grid;place-items:center;background:var(--bg);
     color:var(--ink);font:15px/1.6 system-ui,-apple-system,"PingFang SC",sans-serif}
/* 纸纹：与 theme.css / tokens.css 同一张噪点图。登录页是第一屏，缺了它第一眼
   就和站内其余页面是两种质感。 */
body::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:-1;opacity:.5;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3CfeColorMatrix values='0 0 0 0 0.42 0 0 0 0 0.36 0 0 0 0 0.26 0 0 0 0.05 0'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23n)'/%3E%3C/svg%3E");
}
.box{width:min(92vw,340px);text-align:center}
.mark{width:44px;height:44px;margin:0 auto 12px;display:grid;place-items:center;
      background:linear-gradient(160deg,#cb4a30,#a33420);color:#f8ecd4;
      font-size:22px;font-weight:900;border-radius:9px;
      box-shadow:inset 0 0 0 1px rgba(248,232,206,.35),0 2px 6px rgba(147,48,29,.28)}
h1{margin:0 0 24px;font-size:20px;letter-spacing:.15em}
input{width:100%;height:40px;margin-bottom:10px;padding:0 12px;border:1px solid var(--line);
      border-radius:4px;background:var(--white);font-size:15px;color:var(--ink)}
input:focus{outline:none;border-color:var(--red)}
button{width:100%;height:40px;border:0;border-radius:4px;background:var(--red);color:#fff;
       font-size:15px;cursor:pointer}
button:hover:not(:disabled){opacity:.9}
button:disabled{opacity:.55;cursor:default}
button:focus-visible,input:focus-visible{outline:2px solid var(--red);outline-offset:2px}
.err{margin:12px 0 0;color:var(--red);font-size:13px}
