/* * WebVirtCloud Modern Authentication Stylesheet * 100% Theme-Compatible: Dynamically inherits Bootswatch & Bootstrap 5 theme variables * (colors, typography, radii, alerts, buttons, shadows) */ /* ========================================================================== Page Layout & Theme Ambient Background ========================================================================== */ body:has(.signin-wrapper), body.signin-page { min-height: 100vh; margin: 0; padding: 0 !important; background-color: var(--bs-body-bg, #f8fafc); background-image: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(var(--bs-primary-rgb), 0.16) 0%, transparent 60%), radial-gradient(circle at 10% 90%, rgba(var(--bs-primary-rgb), 0.06) 0%, transparent 40%), radial-gradient(circle at 90% 90%, rgba(var(--bs-primary-rgb), 0.06) 0%, transparent 40%); background-attachment: fixed; display: flex; align-items: center; justify-content: center; font-family: var(--bs-body-font-family, system-ui, -apple-system, sans-serif); color: var(--bs-body-color, #212529); } /* Neutralize base.html container wrapper for signin pages */ body:has(.signin-wrapper) > .container, body.signin-page > .container { max-width: 100% !important; width: 100%; min-height: 100vh; padding: 2rem 1rem !important; margin: 0 !important; display: flex; flex-direction: column; align-items: center; justify-content: center; } body:has(.signin-wrapper) > .container > .row, body.signin-page > .container > .row { display: none !important; } /* ========================================================================== Sign In Card Component (Adapts to Light / Dark Themes) ========================================================================== */ .signin-wrapper { width: 100%; display: flex; align-items: center; justify-content: center; } .signin-card { width: 100%; max-width: 440px; background-color: var(--bs-card-bg, var(--bs-body-bg, #ffffff)); border: 1px solid var(--bs-border-color-translucent, var(--bs-border-color, rgba(0, 0, 0, 0.125))); border-radius: var(--bs-border-radius-xl, 1.25rem); padding: 2.75rem 2.25rem 2rem; box-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.12), 0 0 0 1px var(--bs-border-color-translucent, rgba(0, 0, 0, 0.05)), 0 0 35px -5px rgba(var(--bs-primary-rgb), 0.1); color: var(--bs-body-color, #212529); animation: signinCardEnter 0.35s ease-out; } @supports (backdrop-filter: blur(16px)) { .signin-card { background-color: rgba(var(--bs-body-bg-rgb, 255, 255, 255), 0.92); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); } } @keyframes signinCardEnter { from { opacity: 0; transform: translateY(12px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } } /* ========================================================================== Brand & Logo Section ========================================================================== */ .signin-brand { text-align: center; margin-bottom: 2rem; } .signin-logo-badge { display: inline-flex; align-items: center; justify-content: center; width: 64px; height: 64px; border-radius: var(--bs-border-radius-lg, 16px); background: var(--bs-primary); background: linear-gradient(135deg, var(--bs-primary) 0%, rgba(var(--bs-primary-rgb), 0.85) 100%); color: #ffffff; font-size: 1.85rem; box-shadow: 0 10px 24px -4px rgba(var(--bs-primary-rgb), 0.42), inset 0 1px 1px rgba(255, 255, 255, 0.35); margin-bottom: 1.15rem; transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1); } .signin-logo-badge:hover { transform: translateY(-2px) scale(1.05); } .signin-title { font-size: 1.65rem; font-weight: 700; letter-spacing: -0.025em; color: var(--bs-body-color, #212529); margin-bottom: 0.35rem; } .signin-subtitle { font-size: 0.875rem; color: var(--bs-secondary-color, var(--bs-gray-600, #6c757d)); margin-bottom: 0; font-weight: 400; } /* ========================================================================== Input Groups & Form Controls ========================================================================== */ .signin-field-label { font-size: 0.8125rem; font-weight: 500; color: var(--bs-body-color, #212529); margin-bottom: 0.45rem; display: flex; align-items: center; } .signin-input-group { position: relative; border-radius: var(--bs-border-radius, 0.375rem); background: rgba(var(--bs-body-color-rgb), 0.035); border: 1px solid var(--bs-border-color, #dee2e6); transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, background-color 0.15s ease-in-out; display: flex; align-items: stretch; overflow: hidden; } .signin-input-group:focus-within { border-color: var(--bs-primary); box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25); background: var(--bs-body-bg, #ffffff); } .signin-input-icon { display: flex; align-items: center; justify-content: center; padding: 0 0.875rem; color: var(--bs-secondary-color, var(--bs-gray-600, #6c757d)); font-size: 1.1rem; transition: color 0.15s ease-in-out; } .signin-input-group:focus-within .signin-input-icon { color: var(--bs-primary); } .signin-input { flex: 1; background: transparent !important; border: none !important; color: var(--bs-body-color) !important; padding: 0.75rem 0.875rem 0.75rem 0; font-size: 0.95rem; outline: none !important; box-shadow: none !important; } .signin-input::placeholder { color: var(--bs-secondary-color, var(--bs-gray-600, #6c757d)); opacity: 0.65; } .signin-toggle-pwd { background: transparent; border: none; color: var(--bs-secondary-color, var(--bs-gray-600, #6c757d)); padding: 0 0.875rem; cursor: pointer; display: flex; align-items: center; transition: color 0.15s ease-in-out; } .signin-toggle-pwd:hover, .signin-toggle-pwd:focus { color: var(--bs-primary); outline: none; } .signin-link { color: var(--bs-link-color, var(--bs-primary)); text-decoration: none; transition: color 0.15s ease-in-out; } .signin-link:hover { color: var(--bs-link-hover-color, var(--bs-primary)); text-decoration: underline; } /* ========================================================================== Submit Button ========================================================================== */ .btn-signin-submit { width: 100%; padding: 0.75rem 1.5rem; font-size: 0.95rem; font-weight: 600; letter-spacing: 0.01em; border-radius: var(--bs-border-radius, 0.375rem); color: #ffffff; background-color: var(--bs-primary); border: 1px solid var(--bs-primary); box-shadow: 0 4px 14px rgba(var(--bs-primary-rgb), 0.35); transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 0.5rem; } .btn-signin-submit:hover:not(:disabled) { background-color: var(--bs-primary); filter: brightness(1.08); box-shadow: 0 6px 20px rgba(var(--bs-primary-rgb), 0.45); transform: translateY(-1px); color: #ffffff; } .btn-signin-submit:active:not(:disabled) { transform: translateY(0); filter: brightness(0.95); box-shadow: 0 2px 8px rgba(var(--bs-primary-rgb), 0.25); } .btn-signin-submit:disabled { opacity: 0.75; cursor: not-allowed; } /* ========================================================================== Footer & Status Indicator ========================================================================== */ .signin-footer { margin-top: 1.75rem; padding-top: 1.25rem; border-top: 1px solid var(--bs-border-color-translucent, rgba(var(--bs-body-color-rgb), 0.1)); display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem; color: var(--bs-secondary-color, var(--bs-gray-600, #6c757d)); } .pulse-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background-color: var(--bs-success, #198754); box-shadow: 0 0 0 0 rgba(var(--bs-success-rgb, 25, 135, 84), 0.7); animation: pulseStatus 2s infinite; margin-right: 0.45rem; } @keyframes pulseStatus { 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(var(--bs-success-rgb, 25, 135, 84), 0.7); } 70% { transform: scale(1); box-shadow: 0 0 0 6px rgba(var(--bs-success-rgb, 25, 135, 84), 0); } 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(var(--bs-success-rgb, 25, 135, 84), 0); } }