.setup-page, .login-page { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; background: var(--bs-body-bg); overflow: auto; padding: 24px; } .setup-card, .login-card { width: 100%; max-width: 440px; background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 8px; box-shadow: var(--card-shadow); padding: 36px 32px; } .setup-logo, .login-logo { text-align: center; margin-bottom: 24px; } .setup-logo img, .login-logo img { width: 64px; height: 64px; border-radius: 14px; } .setup-title, .login-title { font-size: 1.5rem; font-weight: 700; text-align: center; margin: 0 0 6px; } .setup-subtitle, .login-subtitle { text-align: center; color: var(--placeholder-color); font-size: .9rem; margin: 0 0 28px; } .setup-error, .login-error { background: rgba(220, 53, 69, .1); border: 1px solid rgba(220, 53, 69, .35); border-radius: var(--card-radius); padding: 10px 14px; margin-bottom: 18px; font-size: .85rem; color: #dc3545; } .setup-warn { background: rgba(255, 193, 7, .1); border: 1px solid rgba(255, 193, 7, .35); border-radius: var(--card-radius); padding: 12px 14px; margin-top: 18px; font-size: .82rem; color: var(--bs-secondary-color); } .setup-warn strong { color: #b8860b; } [data-bs-theme="dark"] .setup-warn strong { color: #ffc107; } .setup-submit, .login-submit { width: 100%; margin-top: 24px; } .setup-spinner, .login-spinner { width: 16px; height: 16px; border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%; display: inline-block; animation: setup-spin .65s linear infinite; vertical-align: -3px; margin-right: 6px; } @keyframes setup-spin { to { transform: rotate(360deg); } } .login-spinner { animation-name: setup-spin; } /* ── Re-login dialog ────────────────────────────────────────────────────────── Raised over the page the user is already on when their session dies (see components/session-relogin.js). Deliberately a scrim rather than an opaque screen: seeing the work still there is the whole point of not navigating away. Reuses `.login-card` so the two login surfaces cannot drift apart. */ .relogin-backdrop { position: fixed; inset: 0; z-index: 10000; /* above the login screen's own layer */ display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(0, 0, 0, .5); backdrop-filter: blur(2px); overflow: auto; } .relogin-card { max-width: 400px; padding: 28px 28px 24px; } .relogin-title { font-size: 1.15rem; margin-bottom: 10px; } @media (prefers-reduced-motion: no-preference) { .relogin-card { animation: relogin-in .18s ease-out; } } @keyframes relogin-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }