/* /assets/signin.css: FedSonar sign-in pages (Worker-rendered /signin, sent, /signin/confirm). Standalone, no other CSS needed.
   CSP-safe: no inline style, no data: URIs, no web fonts (system stack). Phone first; desktop just centres the same column. */
:root{--bg:#000;--tx:#eaeaf0;--mu:#a3a3b2;--line:#2a2a33;--field:#0f0f14;--acc:#4da3ff;--acc-h:#7dbcff;--err:#ffb3b3;
 --font:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;color-scheme:dark}
*{box-sizing:border-box}
html,body{margin:0;background:var(--bg);color:var(--tx);font:400 1rem/1.5 var(--font);-webkit-text-size-adjust:100%}
a{color:inherit}
.au-top{padding:18px 16px 0}
.au-back{display:inline-flex;align-items:center;gap:6px;min-height:44px;color:var(--tx);text-decoration:none;font-weight:600;font-size:.95rem}
.au-back:hover{text-decoration:underline;text-underline-offset:4px}
.au-back svg{width:16px;height:16px}
.au-main{max-width:420px;margin:0 auto;padding:20px 16px 48px}
.au-logo{display:grid;place-items:center;width:56px;height:56px;margin:0 auto 22px;border-radius:14px;background:#0b0b10;border:1px solid var(--line)}
.au-logo img{width:30px;height:auto;display:block}
.au-h{margin:0;text-align:center;font-size:1.75rem;line-height:1.2;font-weight:700;letter-spacing:-.01em}
.au-sub{margin:12px 0 28px;text-align:center;color:var(--mu);font-size:.95rem}
.au-sub a{color:var(--tx);font-weight:700;text-decoration:none}.au-sub a:hover{text-decoration:underline}
.au-form{display:grid;gap:14px}
.au-f{display:grid;gap:8px}
.au-f label{font-size:.92rem;color:#c9c9d4}
.au-f input{width:100%;min-height:50px;padding:12px 16px;border-radius:12px;border:1px solid var(--line);background:var(--field);color:var(--tx);font:400 1rem var(--font)}
.au-f input::placeholder{color:#6f6f7d}
.au-f input:focus-visible{outline:2px solid var(--acc);outline-offset:1px;border-color:var(--acc)}
.cf-turnstile{min-height:65px;display:flex;justify-content:center;width:100%;max-width:100%}
.cf-turnstile>div,.cf-turnstile iframe{max-width:100%}   /* v2.3: full-width container so data-size=flexible can stretch (README) */
.au-btn{display:flex;align-items:center;justify-content:center;width:100%;min-height:50px;padding:0 18px;border:0;border-radius:12px;background:var(--acc);color:#04101f;font:700 1rem var(--font);text-decoration:none;cursor:pointer}
.au-btn:hover{background:var(--acc-h)}
.au-btn:focus-visible{outline:2px solid #fff;outline-offset:3px}
.au-btn[disabled]{opacity:.5;cursor:not-allowed}
.au-btn.ghost{background:transparent;color:var(--tx);border:1px solid var(--line)}.au-btn.ghost:hover{border-color:var(--acc)}
.au-msg{margin:0;padding:10px 12px;border-radius:12px;background:#4da3ff14;border:1px solid #4da3ff55;color:#dcecff;font-size:.92rem}
.au-err,.signin-error{margin:0;padding:10px 12px;border-radius:12px;background:#ff80800f;border:1px solid #ff808066;color:var(--err);font-size:.92rem}
.au-msg[hidden],.au-err[hidden],.signin-error[hidden]{display:none}
.au-err a,.au-msg a{color:#fff}
.au-txt{margin:0 0 14px;text-align:center;color:var(--mu);font-size:.95rem}
.au-txt b{color:var(--tx);word-break:break-all}
.au-fine{margin:28px 0 0;text-align:center;color:var(--mu);font-size:.8rem}
.au-fine a{color:#c9c9d4;text-underline-offset:2px}
.sr{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
@media (min-width:640px){.au-top{padding:28px 32px 0}.au-main{padding-top:48px}}
.au-links{margin:16px 0 0;text-align:center;font-size:.92rem}
.au-links a{color:var(--tx);font-weight:600;text-underline-offset:3px}
/* states */
.au-f input:disabled{opacity:.5;cursor:not-allowed}
.au-btn.is-loading{position:relative;color:transparent;pointer-events:none}
.au-spin{display:none}
.au-btn.is-loading .au-spin{display:block;position:absolute;left:50%;top:50%;width:20px;height:20px;margin:-10px 0 0 -10px;border-radius:50%;border:2px solid #04101f55;border-top-color:#04101f;animation:au-rot .7s linear infinite}
@keyframes au-rot{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.au-btn.is-loading .au-spin{animation-duration:2s}}
.au-links{display:flex;justify-content:center;flex-wrap:wrap;gap:6px 18px}
.au-links a{display:inline-flex;align-items:center;min-height:44px}
.au-code{text-align:center;font:600 1.5rem/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.35em}
.au-chk{display:flex;align-items:flex-start;gap:10px;font-size:.92rem;color:#c9c9d4;cursor:pointer}
.au-chk input{flex:0 0 auto;width:20px;height:20px;margin:1px 0 0;accent-color:var(--acc)}
.au-chk a{color:var(--tx);text-underline-offset:2px}
/* v2 (Oct 18): the home-header wordmark (.wm/.lbox/.wm-g from /ff.css + /site.css) replaces the icon tile, centred, ~logo size.
   Only .au-wm is new; the frozen v1 copy just shows it left-aligned at header size. */
.au-wm{display:flex;justify-content:center;margin:0 0 24px}
.au-wm .wm{font-size:1.5rem;gap:11px}
.au-wm .lbox{--s:42px}
/* v2.1 (Oct 18): red danger button for the Worker's delete-account confirm page. Same size/radius as .au-btn; white on #c62828 (5.6:1). */
.au-btn.danger{background:#c62828;color:#fff;border:0}
.au-btn.danger:hover{background:#b71c1c}
.au-btn.danger:focus-visible{outline:2px solid #ffb3b3;outline-offset:3px;box-shadow:0 0 0 2px #000}
/* v2.2 (Oct 18): code card with six OTP boxes. ONE real input (.au-otp-input) sits over six decorative .au-otp-box cells.
   No JS: the input's own digits are letter-spaced so each lands centred in a box (1ch = one digit in the monospace font).
   With JS (signin-flow.js adds .is-js): the input text goes transparent and the script writes the digits into the boxes,
   setting .is-filled and .is-active. Error: aria-invalid="true" on the input. Locked: input disabled. */
.au-otp{--bw:min(52px,calc((100vw - 82px) / 6));--bh:calc(var(--bw) + 8px);--g:10px;position:relative;width:calc(var(--bw) * 6 + var(--g) * 5);height:var(--bh);margin:4px auto 6px;overflow:hidden;overflow:clip;border-radius:12px}
.au-otp-boxes{position:absolute;inset:0;display:flex;gap:var(--g);pointer-events:none}
.au-otp-box{flex:0 0 var(--bw);height:var(--bh);display:grid;place-items:center;border-radius:12px;background:var(--field);border:1px solid var(--line);color:var(--tx);font:700 1.6rem/1 var(--font);transition:border-color .12s,box-shadow .12s}
.au-otp-input{position:absolute;left:0;top:0;z-index:1;width:100%;max-width:100%;box-sizing:border-box;height:100%;margin:0;padding:0 0 0 .45em;border:1px solid var(--line);outline:0;background:var(--field);color:var(--tx);caret-color:var(--acc);
 font:700 1.6rem/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.45em;text-align:center;-webkit-appearance:none;appearance:none;border-radius:12px}
/* v2.3 fix (Forge b6, Oct 18): the input now fits .au-otp exactly (it was ~100px wider, so typing the 6th digit scrolled the
   overflow:hidden wrapper and clipped box 1; overflow:clip also makes the wrapper unscrollable). A fitted input can't keep
   letter-spaced digits centred in six boxes (Chrome adds the spacing after the last digit too, ~28px past the edge, so the
   input would scroll itself). So: NO JS = one plain wide field with spaced, centred digits and the six boxes hidden;
   JS (.is-js) = the transparent input over the six boxes, with no letter-spacing so it never scrolls. */
.au-otp:not(.is-js) .au-otp-boxes{display:none}
.au-otp:not(.is-js) .au-otp-input:focus{border-color:var(--acc)}
.au-otp:not(.is-js) .au-otp-input[aria-invalid=true]{border-color:#ff8080aa}
.au-otp:not(.is-js) .au-otp-input:disabled{opacity:.45}
.au-otp.is-js .au-otp-input{background:transparent;border:0;border-radius:0;padding:0;letter-spacing:0;text-align:left}
.au-otp:not(.is-js):focus-within .au-otp-box{border-color:#4da3ff99}
.au-otp.is-js .au-otp-input{color:transparent;caret-color:transparent;-webkit-text-fill-color:transparent}
.au-otp.is-js .au-otp-input::selection{background:transparent}
.au-otp-box.is-filled{border-color:#3a3a46}
.au-otp-box.is-active{border-color:var(--acc);box-shadow:0 0 0 3px #4da3ff40}
.au-otp-box.is-active:empty::after{content:"";width:2px;height:45%;background:var(--acc);animation:au-blink 1s steps(1) infinite}
@keyframes au-blink{50%{opacity:0}}
@media (prefers-reduced-motion:reduce){.au-otp-box.is-active:empty::after{animation:none}}
.au-otp-input[aria-invalid=true]~.au-otp-boxes .au-otp-box{border-color:#ff8080aa}
.au-otp-input[aria-invalid=true]~.au-otp-boxes .au-otp-box.is-active{box-shadow:0 0 0 3px #ff808033}
.au-otp-input:disabled{cursor:not-allowed}
.au-otp-input:disabled~.au-otp-boxes{opacity:.45}
.au-chk input:disabled,.au-chk input:disabled+span{opacity:.5;cursor:not-allowed}
.au-resend{margin:18px 0 0;text-align:center;color:var(--mu);font-size:.9rem}
.au-resend a{color:var(--acc);font-weight:600;text-decoration:none;display:inline-flex;align-items:center;min-height:44px}
.au-resend a:hover{text-decoration:underline;text-underline-offset:3px}
.au-resend a.is-wait,.au-resend a[aria-disabled=true]{color:var(--mu);font-weight:500;pointer-events:none;cursor:default;font-variant-numeric:tabular-nums}
.au-small{margin-top:0}
.au-small a{font-size:.85rem;font-weight:500;color:var(--mu)}
/* v2.3 (Forge, Oct 18): [hidden] must win over .au-form{display:grid} and other kit display rules (e.g. a hidden step-1 form
   or code form). Scoped to the kit (body.au and .au-card); it doesn't touch the site pages. */
.au-form[hidden],.au-card [hidden],.au [hidden]{display:none!important}
