Files
ReifenSpaeth/Lagerbestand/Components/Pages/Login.razor.css
T

264 lines
6.3 KiB
CSS

/* ========================================
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);
}