/* ======================================== Login Page - Scoped Component Styles ======================================== Inherits from app.css: - .form-control, .form-label (section 4) - .alert, .alert-danger/success (section 7) - .btn, .btn-primary (section 5) - .spinner-border, @keyframes spin (section 11) - Reduced motion (section 17) Only page-specific additions and overrides below. ======================================== */ /* ======================================== Page Container ======================================== */ .login-page { min-height: 100vh; min-height: 100dvh; display: flex; align-items: center; justify-content: center; background: var(--color-bg-gradient); padding: var(--space-6); } .login-container { width: 100%; max-width: 360px; } /* ======================================== Header ======================================== */ .login-header { text-align: center; margin-bottom: var(--space-8); } .login-brand { font-family: var(--font-family-heading); font-size: 1.75rem; font-weight: var(--font-weight-bold); color: var(--text-primary); margin: 0; } .login-subtitle { font-family: var(--font-family-base); color: var(--text-placeholder); margin-top: var(--space-1); font-size: var(--text-base); } /* ======================================== Login Card ======================================== */ .login-card { background: var(--surface-elevated); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 0.5px solid var(--border-default); border-radius: var(--radius-xl); padding: var(--space-8); box-shadow: var(--shadow-xl); } .login-title { font-family: var(--font-family-base); font-size: var(--text-xl); font-weight: var(--font-weight-semibold); color: var(--text-primary); text-align: center; margin-bottom: var(--space-6); } /* ======================================== Form Groups (page-specific spacing) ======================================== */ .form-group { margin-bottom: var(--space-5); } .form-label { font-family: var(--font-family-base); } .form-control:disabled { opacity: 0.5; cursor: not-allowed; } .form-control.is-invalid { border-color: rgba(220, 38, 38, 0.5); } /* ======================================== Login Button ======================================== */ .btn-login { width: 100%; padding: var(--space-4); background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%); border: none; border-radius: var(--radius-lg); color: var(--text-primary); font-family: var(--font-family-base); font-weight: var(--font-weight-semibold); font-size: var(--text-base); cursor: pointer; transition: all var(--duration-fast) var(--ease-spring); display: flex; align-items: center; justify-content: center; gap: var(--space-2); box-shadow: 0 4px 12px rgba(220, 38, 38, 0.3); -webkit-tap-highlight-color: transparent; } .btn-login:hover:not(:disabled) { box-shadow: 0 6px 18px rgba(220, 38, 38, 0.4); transform: translateY(-1px); } .btn-login:active:not(:disabled) { transform: translateY(0) scale(0.98); box-shadow: 0 2px 8px rgba(220, 38, 38, 0.3); } .btn-login:disabled { opacity: 0.5; cursor: not-allowed; box-shadow: none; } /* ======================================== Footer ======================================== */ .login-footer { text-align: center; margin-top: var(--space-6); padding-top: var(--space-6); border-top: 0.5px solid var(--border-light); } .back-link { display: inline-flex; align-items: center; gap: var(--space-2); font-family: var(--font-family-base); color: var(--text-placeholder); text-decoration: none; transition: color var(--duration-fast) var(--ease-spring); } .back-link:hover { color: var(--color-primary); text-decoration: none; } .back-link svg { transition: transform var(--duration-fast) var(--ease-out); } .back-link:hover svg { transform: translateX(-3px); } /* ======================================== Loading Spinner (inline, page-specific) ======================================== */ .spinner-sm { width: 16px; height: 16px; border: 2px solid rgba(255, 255, 255, 0.2); border-top-color: var(--text-primary); border-radius: 50%; animation: spin 0.8s linear infinite; } /* ======================================== Alert (page-specific override — tighter spacing) ======================================== */ .alert { margin-bottom: var(--space-5); } .alert svg { flex-shrink: 0; } /* ======================================== Two-Factor Authentication Step ======================================== */ .tfa-description { color: var(--text-secondary); font-family: var(--font-family-base); font-size: var(--text-sm); margin-bottom: var(--space-6); text-align: center; } .tfa-code-input { font-size: var(--text-2xl); letter-spacing: 0.4em; text-align: center; font-family: 'Courier New', monospace; font-weight: var(--font-weight-bold); } .tfa-fallback { text-align: center; margin: var(--space-3) 0 var(--space-4); } .tfa-fallback .btn-link { background: none; border: none; color: var(--text-tertiary); cursor: pointer; font-family: var(--font-family-base); font-size: var(--text-sm); text-decoration: underline; padding: var(--space-1) var(--space-2); } .tfa-fallback .btn-link:hover { color: var(--text-secondary); } .tfa-email-status { display: block; font-family: var(--font-family-base); font-size: var(--text-xs); margin-top: var(--space-1); } .tfa-email-status.text-success { color: var(--color-success); } .tfa-email-status.text-danger { color: var(--color-error); } .btn-back { display: block; width: 100%; background: none; border: 1px solid var(--border-default); color: var(--text-secondary); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); margin-top: var(--space-3); cursor: pointer; font-family: var(--font-family-base); font-size: var(--text-sm); transition: all var(--duration-fast) var(--ease-out); } .btn-back:hover { background: rgba(255, 255, 255, 0.05); color: var(--text-primary); }