diff --git a/src/assets/css/components/login.css b/src/assets/css/components/login.css new file mode 100644 index 0000000..028b58d --- /dev/null +++ b/src/assets/css/components/login.css @@ -0,0 +1,395 @@ +/* login.css */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.login-page { + min-height: 100vh; + background: linear-gradient(135deg, #0c0c0c 0%, #1a1a2e 50%, #16213e 100%); + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; +} + +.login-bg { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient(circle at 20% 80%, rgba(0, 212, 255, 0.05) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(124, 58, 237, 0.05) 0%, transparent 50%); +} + +.floating-elements { + position: absolute; + width: 100%; + height: 100%; + pointer-events: none; +} + +.floating-element { + position: absolute; + width: 3px; + height: 3px; + background: linear-gradient(45deg, #00d4ff, #7c3aed); + border-radius: 50%; + animation: float 8s ease-in-out infinite; +} + +@keyframes float { + 0%, 100% { + transform: translateY(0px) rotate(0deg); + opacity: 0.3; + } + 50% { + transform: translateY(-30px) rotate(180deg); + opacity: 0.8; + } +} + +.login-container { + position: relative; + z-index: 2; + width: 100%; + max-width: 420px; + padding: 2rem; +} + +.login-card { + background: rgba(255, 255, 255, 0.08); + backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 24px; + padding: 3rem; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + animation: slideInUp 0.8s ease-out; +} + +@keyframes slideInUp { + from { + opacity: 0; + transform: translateY(50px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.login-header { + text-align: center; + margin-bottom: 2.5rem; +} + +.logo { + font-size: 2rem; + font-weight: 800; + color: #ffffff; + margin-bottom: 1rem; +} + +.logo-accent { + background: linear-gradient(45deg, #00d4ff, #7c3aed); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.login-title { + font-size: 1.75rem; + font-weight: 700; + color: #ffffff; + margin-bottom: 0.5rem; +} + +.login-subtitle { + color: #a0a0a0; + font-size: 0.95rem; +} + +.login-form { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.form-group { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.form-label { + font-weight: 600; + color: #ffffff; + font-size: 0.9rem; +} + +.input-wrapper { + position: relative; +} + +.input-icon { + position: absolute; + left: 1rem; + top: 50%; + transform: translateY(-50%); + color: #888; + font-size: 0.9rem; +} + +.form-input { + width: 100%; + padding: 1rem 1rem 1rem 2.75rem; + background: rgba(255, 255, 255, 0.05); + border: 2px solid rgba(255, 255, 255, 0.1); + border-radius: 12px; + color: #ffffff; + font-size: 1rem; + transition: all 0.3s ease; + backdrop-filter: blur(10px); +} + +.form-input:focus { + outline: none; + border-color: #00d4ff; + box-shadow: 0 0 20px rgba(0, 212, 255, 0.2); + background: rgba(255, 255, 255, 0.08); +} + +.form-input.error { + border-color: #ff4757; + box-shadow: 0 0 20px rgba(255, 71, 87, 0.2); +} + +.form-input::placeholder { + color: #666; +} + +.password-toggle { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + color: #888; + cursor: pointer; + padding: 0.25rem; + transition: color 0.3s ease; +} + +.password-toggle:hover { + color: #00d4ff; +} + +.form-options { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; +} + +.checkbox-wrapper { + display: flex; + align-items: center; + cursor: pointer; + gap: 0.5rem; +} + +.checkbox-input { + display: none; +} + +.checkbox-custom { + width: 18px; + height: 18px; + border: 2px solid rgba(255, 255, 255, 0.3); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; +} + +.checkbox-input:checked + .checkbox-custom { + background: linear-gradient(45deg, #00d4ff, #7c3aed); + border-color: transparent; +} + +.checkbox-input:checked + .checkbox-custom::after { + content: '✓'; + color: white; + font-size: 12px; + font-weight: bold; +} + +.checkbox-label { + color: #a0a0a0; + font-size: 0.9rem; +} + +.forgot-password { + color: #00d4ff; + text-decoration: none; + font-size: 0.9rem; + transition: color 0.3s ease; +} + +.forgot-password:hover { + color: #7c3aed; +} + +.login-button { + width: 100%; + padding: 1rem; + background: linear-gradient(45deg, #00d4ff, #7c3aed); + color: white; + border: none; + border-radius: 12px; + font-weight: 600; + font-size: 1.1rem; + cursor: pointer; + transition: all 0.3s ease; + margin-top: 0.5rem; +} + +.login-button:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 15px 40px rgba(0, 212, 255, 0.4); +} + +.login-button:disabled { + opacity: 0.7; + cursor: not-allowed; + transform: none; +} + +.loading-text { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; +} + +.divider { + position: relative; + text-align: center; + margin: 1.5rem 0; + color: #666; +} + +.divider::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 1px; + background: rgba(255, 255, 255, 0.1); +} + +.divider span { + background: rgba(255, 255, 255, 0.08); + padding: 0 1rem; + position: relative; + z-index: 1; +} + +.social-login { + width: 100%; + padding: 0.875rem; + background: rgba(255, 255, 255, 0.05); + border: 2px solid rgba(255, 255, 255, 0.1); + border-radius: 12px; + color: #ffffff; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + justify-content: center; + gap: 0.75rem; + margin-bottom: 0.75rem; + backdrop-filter: blur(10px); +} + +.social-login:hover { + background: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.2); +} + +.social-login.google:hover { + border-color: rgba(219, 68, 55, 0.5); + box-shadow: 0 0 20px rgba(219, 68, 55, 0.1); +} + +.social-login.github:hover { + border-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 0 20px rgba(255, 255, 255, 0.1); +} + +.error-message { + background: rgba(255, 71, 87, 0.1); + border: 1px solid rgba(255, 71, 87, 0.3); + border-radius: 12px; + padding: 1rem; + color: #ff4757; + font-size: 0.9rem; + display: flex; + align-items: center; + gap: 0.5rem; + margin-top: 1rem; + animation: shake 0.5s ease-in-out; +} + +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-5px); } + 75% { transform: translateX(5px); } +} + +.signup-prompt { + text-align: center; + margin-top: 2rem; + padding-top: 2rem; + border-top: 1px solid rgba(255, 255, 255, 0.1); +} + +.signup-prompt p { + color: #a0a0a0; +} + +.signup-link { + color: #00d4ff; + text-decoration: none; + font-weight: 600; + transition: color 0.3s ease; +} + +.signup-link:hover { + color: #7c3aed; +} + +/* Responsive */ +@media (max-width: 480px) { + .login-container { + padding: 1rem; + } + + .login-card { + padding: 2rem; + } + + .form-options { + flex-direction: column; + gap: 1rem; + align-items: flex-start; + } +} \ No newline at end of file diff --git a/src/components/UserLogin.vue b/src/components/UserLogin.vue index 00d9617..471661c 100644 --- a/src/components/UserLogin.vue +++ b/src/components/UserLogin.vue @@ -1,23 +1,126 @@ + \ No newline at end of file