/* Foundry · style.css — the tokens and the sign-in door.
   W-MTSP9A1P replaced the console behind this door with the signed v3 design and left the door
   itself alone: the block below is the one that was here, rule for rule. The console's own
   styles are in styles/shell.css and styles/screens.css, every selector scoped to #app, so
   nothing the new design sets can reach inside the gate and change what he signs in through. */
  /* Ribbon Field v1.1 tokens — design/design-system-v1.1/tokens.json */
  :root{
    --routeBlue:#2D6F9D; --sky:#57B0E6; --hinge:#7D5AA6; --ribbonPink:#FF5C8A; --deepPink:#EC2F6B;
    --nightBg:#071D32; --nightBg2:#0D2C49;
    --paper:#faf7f1; --card:#fff; --card2:#fbf9f4;
    --hair:#eae4d8; --hair2:#d8d1c2;
    --ink:#173A56; --ink2:#607C91; --ink3:#7E97A9;
    --green:#237A56; --red:#B4232C; --amber:#A86613;
    --mono:ui-monospace,SFMono-Regular,Menlo,monospace;
    --sans:-apple-system,BlinkMacSystemFont,'SF Pro Text','PingFang SC','Noto Sans CJK SC','Segoe UI',sans-serif;
    --radius-card:24px; --radius-pill:999px;
  }
  *{box-sizing:border-box;margin:0;padding:0}
  html,body{height:100%}
  body{background:var(--nightBg);color:var(--ink);font:15px/1.7 var(--sans);-webkit-font-smoothing:antialiased}
  .mono{font-family:var(--mono)} .dim{color:var(--ink3)}

  /* ================= 登录：hero 时刻 —— 全 ribbon 渐变作地，一簇玻璃作门 =================
     依据：设计系统「全渐变留给品牌识别与罕见 hero 时刻」；R2 sparingly（本屏只有一处玻璃）；
     R3 文字多的面板用 regular 变体（强模糊 + 提亮，不是 clear）；L3b 不加 35% 暗层。 */
  #gate{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;overflow:hidden}
  #gate .ground{position:absolute;inset:-25%;z-index:0}
  #gate .ground i{position:absolute;display:block;border-radius:50%;filter:blur(70px);opacity:.85}
  .b1{width:58%;height:58%;left:-6%;top:-4%;background:radial-gradient(circle,var(--sky),transparent 68%)}
  .b2{width:62%;height:62%;right:-10%;top:6%;background:radial-gradient(circle,var(--hinge),transparent 66%)}
  .b3{width:64%;height:64%;left:6%;bottom:-16%;background:radial-gradient(circle,var(--deepPink),transparent 66%)}
  .b4{width:48%;height:48%;right:4%;bottom:-8%;background:radial-gradient(circle,var(--routeBlue),transparent 70%)}
  @media (prefers-reduced-motion:no-preference){
    .b1{animation:drift1 26s ease-in-out infinite alternate}
    .b2{animation:drift2 31s ease-in-out infinite alternate}
    .b3{animation:drift3 24s ease-in-out infinite alternate}
    .b4{animation:drift2 35s ease-in-out infinite alternate-reverse}
  }
  @keyframes drift1{to{transform:translate3d(9%,7%,0) scale(1.13)}}
  @keyframes drift2{to{transform:translate3d(-8%,10%,0) scale(1.09)}}
  @keyframes drift3{to{transform:translate3d(7%,-9%,0) scale(1.15)}}
  /* 细颗粒：压住大面积渐变的色带 */
  #gate .grain{position:absolute;inset:0;z-index:1;opacity:.05;pointer-events:none;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}

  #gate .box{
    position:relative;z-index:2;width:406px;max-width:100%;padding:38px 36px 30px;text-align:center;
    border-radius:var(--radius-card);
    background:rgba(255,255,255,.74);                       /* regular 变体：靠 wash 保证读得清 */
    -webkit-backdrop-filter:blur(34px) saturate(190%);
    backdrop-filter:blur(34px) saturate(190%);
    border:1px solid rgba(255,255,255,.62);
    box-shadow:0 2px 10px rgba(7,29,50,.18), 0 26px 70px rgba(7,29,50,.34),
               inset 0 1px 0 rgba(255,255,255,.85);         /* 上沿高光 = 玻璃的边 */
  }
  @supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
    #gate .box{background:rgba(255,255,255,.94)}            /* 不支持就退成实心，绝不牺牲可读性 */
  }
  #gate .mark{width:92px;height:92px;display:block;margin:0 auto 18px}
  #gate h1{font-size:25px;font-weight:700;letter-spacing:.03em;color:#0f2f4a}
  #gate .sub{font-size:12.5px;color:#5a7d94;margin:5px 0 26px}
  #gate form{text-align:left}
  label{display:block;font-size:10.5px;font-weight:700;letter-spacing:.1em;color:#5a7d94;margin-bottom:6px;text-transform:uppercase}
  input{width:100%;height:46px;padding:0 15px;border:1px solid rgba(35,88,126,.2);border-radius:14px;
    background:rgba(255,255,255,.85);color:var(--ink);font:15px var(--sans);outline:none;margin-bottom:15px}
  input::placeholder{color:#9db4c4}
  input:focus{border-color:var(--routeBlue);background:#fff;box-shadow:0 0 0 4px rgba(45,111,157,.14)}
  button.primary{
    width:100%;min-height:48px;border:0;border-radius:var(--radius-pill);cursor:pointer;
    font:15px var(--sans);font-weight:700;color:#fff;letter-spacing:.04em;
    background:linear-gradient(100deg,var(--routeBlue) 0%,var(--sky) 26%,var(--hinge) 56%,var(--ribbonPink) 82%,var(--deepPink) 100%);
    background-size:100% 100%;background-position:0% 50%;
    box-shadow:0 6px 18px rgba(236,47,107,.28);
    transition:background-position .5s ease, transform .12s ease, box-shadow .25s ease;
  }
  button.primary:hover{background-size:200% 100%;background-position:100% 50%;
    box-shadow:0 10px 26px rgba(236,47,107,.36)}
  button.primary:active{transform:translateY(1px)}
  button.primary:disabled{opacity:.55;cursor:not-allowed}
  #err{font-size:12.5px;color:#a8202c;margin-top:13px;min-height:18px;line-height:1.5}
  .foot{font-size:11px;color:#6b8ba1;margin-top:20px;padding-top:15px;
    border-top:1px solid rgba(35,88,126,.14);line-height:1.65}

  /* ── the freshness stamp, the banner and the plain button ──────────────────────────────────
     Carried over from the page this replaces, unchanged in behaviour and in look. The stamp is
     what tells the founder whether what he is reading is current; it moved from the old header
     into the v3 topbar and nothing else about it changed. */
  #app .topbar .fresh{font-size:11.5px;color:#68717d;display:inline-flex;align-items:center;gap:7px;white-space:nowrap;font-variant-numeric:tabular-nums}
  #app .topbar .fresh i{width:8px;height:8px;border-radius:50%;background:#ccd4df;display:inline-block;flex:none}
  #app .topbar .fresh[data-s="current"] i{background:#258265}
  #app .topbar .fresh[data-s="checking"] i{background:#ab671a}
  #app .topbar .fresh[data-s="retrying"]{color:#b4433a}
  #app .topbar .fresh[data-s="retrying"] i{background:#b4433a}
  #app > .banner, #app #banner{border-radius:14px;padding:11px 15px;font-size:12.5px;margin:16px 42px 0;
    background:rgba(180,35,44,.07);border:1px solid rgba(180,35,44,.28);color:#b4232c;white-space:pre-wrap}
  #app #banner.ok{background:rgba(35,122,86,.08);border-color:rgba(35,122,86,.3);color:#237A56}
  #app .ghost{border:1px solid #ccd4df;background:#fff;color:#59616b;min-height:40px;padding:0 20px;
    border-radius:999px;cursor:pointer;font-size:13px}
  #app .ghost:hover{border-color:#006ce0;color:#006ce0}

/* SERVED-ROOT MARKER W-MTRKWM45 · 2026-09-08 — this directory is the Vercel project's root.
   Put here as a probe: it existed in this file and nowhere else, and it reached
   https://foundry.loop-book.com/style.css 73 seconds after the push, which is how the root
   change was proved before the old directory was deleted rather than after. Kept because the
   next root change can be settled the same way: edit the marker, push, fetch the URL.
   Inert — a CSS comment renders nothing. */
