/* ============================================================
   Écrans de connexion — charte v1.0.
   Repris à l'identique du prototype contractuel
   specs/membre_phase1.html (section « Connexion »).
   ============================================================ */
.center-canvas{min-height:calc(100vh - 42px);min-height:calc(100dvh - 42px);display:grid;place-items:center;padding:24px}
.auth-card{width:100%;max-width:420px;background:var(--surface);border-radius:var(--r-card);box-shadow:var(--shadow-2);padding:40px 36px}
@media(max-width:480px){.auth-card{padding:0;box-shadow:none;background:transparent}}
.brand{display:flex;flex-direction:column;align-items:center;gap:12px;margin-bottom:28px}
.monogram{width:56px;height:56px;border-radius:16px;display:grid;place-items:center;color:var(--on-accent);font-weight:600;letter-spacing:.5px;background:var(--accent);box-shadow:var(--shadow-2)}
.brand .name{font-weight:600;font-size:18px}
.brand .kicker{font-size:12px;color:var(--muted)}
.auth-title{font-size:24px;font-weight:600;text-align:center;margin:0 0 4px}
.auth-sub{font-size:14px;color:var(--muted);text-align:center;margin:0 0 24px}
.row-between{display:flex;align-items:center;justify-content:space-between;margin:-8px 0 16px}
.auth-alt{text-align:center;font-size:14px;color:var(--muted);margin-top:var(--space-24)}
.auth-alt button, .auth-alt a{color:var(--accent-ink);font-weight:600;background:none;border:none;cursor:pointer;font-size:14px;text-decoration:none}
.auth-alt button[disabled]{opacity:.4;cursor:default}
.auth-foot{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:var(--space-24);font-size:12px;color:var(--muted)}
.auth-foot svg{width:var(--icon-sm);height:var(--icon-sm)}
.code-row{display:flex;gap:12px;justify-content:center;margin:8px 0 20px}
.code-row input{width:calc(16.6%);height:56px;text-align:center;font-size:24px;font-weight:600;border:1px solid var(--line);border-radius:var(--r-ctl);background:#fff;transition:border-color var(--dur),box-shadow var(--dur)}
.code-row input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--surface), 0 0 0 4px var(--accent)}
.shield{width:56px;height:56px;border-radius:16px;display:grid;place-items:center;background:var(--accent-soft);color:var(--accent);margin:0 auto 16px}
.shield svg{width:var(--icon-lg);height:var(--icon-lg)}

@media(max-width:480px){.auth-alt button, .auth-alt a{font-size:12px} }

/* Le prototype pose ces deux écarts en style d'attribut ; ils deviennent
   des classes utilitaires pour tenir la consigne « aucun CSS dans le
   gabarit » sans changer le rendu. */
.auth-stack-8{margin-top:var(--space-8)}

/* Enrôlement TOTP : le QR code se scanne, la clé reste en repli pour une
   saisie manuelle. */
.qr{display:flex;justify-content:center;padding:var(--space-8) 0 var(--space-24)}
.qr svg{display:block;width:200px;height:200px}
.qr-fallback{margin-bottom:var(--space-24);font-size:14px}
.qr-fallback summary{cursor:pointer;color:var(--accent-ink);font-weight:500;font-size:14px}
.qr-fallback summary::marker{color:var(--muted)}
#totp-secret{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:2px;text-align:center}
.auth-hint{margin:var(--space-8) 0;font-size:12px;color:var(--muted)}

/* Message d'erreur d'un écran de connexion : plus affirmé qu'une aide sous
   un champ, la saisie ayant été vidée. */
.auth-error{display:flex;align-items:flex-start;gap:var(--space-8);background:var(--err-soft);color:var(--err);border-radius:var(--r-ctl);padding:var(--space-12) var(--space-16);font-size:14px;margin-bottom:var(--space-16)}
.auth-error svg{width:var(--icon-md);height:var(--icon-md);flex:none}

/* Renvoi du code : un formulaire remplace le bouton nu du prototype, la
   ligne reste alignée comme dans la maquette. */
.auth-inline{display:flex;align-items:center;justify-content:center;gap:var(--space-8)}
.auth-inline form{display:inline}
