Base login page

This commit is contained in:
Marta Borgia Leiva 2026-02-09 20:17:59 +01:00
parent 0d82ea47c3
commit 1d39dffd56
Signed by: a-mayb3
GPG key ID: 293AAC4FED165CE3
3 changed files with 212 additions and 0 deletions

View file

@ -0,0 +1,104 @@
.login-container {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 20px;
}
.login-card {
background: white;
border-radius: 12px;
padding: 40px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 400px;
}
.login-card h1 {
font-size: 24px;
font-weight: 700;
color: #667eea;
margin: 0 0 10px 0;
text-align: center;
}
.login-card h2 {
font-size: 28px;
font-weight: 600;
color: #333;
margin: 0 0 30px 0;
text-align: center;
}
.error-message {
background-color: #fee;
color: #c33;
padding: 12px;
border-radius: 6px;
margin-bottom: 20px;
border: 1px solid #fcc;
font-size: 14px;
}
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
margin-bottom: 8px;
font-weight: 500;
color: #333;
font-size: 14px;
}
.form-group input {
width: 100%;
padding: 12px 16px;
border: 2px solid #e1e8ed;
border-radius: 8px;
font-size: 15px;
transition: border-color 0.3s;
box-sizing: border-box;
}
.form-group input:focus {
outline: none;
border-color: #667eea;
}
.form-group input::placeholder {
color: #aab8c2;
}
.btn-primary {
width: 100%;
padding: 14px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition:
transform 0.2s,
box-shadow 0.2s;
margin-top: 10px;
}
.btn-primary:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 5px 20px rgba(102, 126, 234, 0.4);
}
.btn-primary:active:not(:disabled) {
transform: translateY(0);
}
.btn-primary:disabled {
opacity: 0.6;
cursor: not-allowed;
}

View file

@ -0,0 +1,48 @@
<div class="login-container">
<div class="login-card">
<h1>{{ 'KanbanCloneAngular' }}</h1>
<h2>Sign In</h2>
@if (errorMessage()) {
<div class="error-message">
{{ errorMessage() }}
</div>
}
<form (ngSubmit)="onSubmit()" #loginForm="ngForm">
<div class="form-group">
<label for="email">e-mail address</label>
<input
id="email"
type="email"
[(ngModel)]="email"
name="email"
placeholder="Enter your e-mail address"
required
autocomplete="username"
/>
</div>
<div class="form-group">
<label for="password">Password</label>
<input
id="password"
type="password"
[(ngModel)]="password"
name="password"
placeholder="Enter your password"
required
autocomplete="current-password"
/>
</div>
<button type="submit" class="btn-primary" [disabled]="isLoading() || !loginForm.form.valid">
@if (isLoading()) {
<span>Logging in...</span>
} @else {
<span>Login</span>
}
</button>
</form>
</div>
</div>

View file

@ -0,0 +1,60 @@
import { Component, inject, signal, OnInit } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { Router } from '@angular/router';
import { CommonModule } from '@angular/common';
import { AuthService } from '../../services/auth.service';
@Component({
selector: 'app-login',
standalone: true,
imports: [FormsModule, CommonModule],
templateUrl: './login.component.html',
styleUrl: './login.component.css'
})
export class LoginComponent implements OnInit {
private authService = inject(AuthService);
private router = inject(Router);
ngOnInit() {
// If already logged in, redirect to home
if (this.authService.isAuthenticated()) {
this.router.navigate(['/']);
}
}
email = '';
password = '';
isLoading = signal(false);
errorMessage = signal('');
onSubmit() {
if (!this.email || !this.password) {
this.errorMessage.set('Please fill in all fields');
return;
}
this.isLoading.set(true);
this.errorMessage.set('');
this.authService.login({
email: this.email,
password: this.password
}).subscribe({
next: (response) => {
this.isLoading.set(false);
if (response.success) {
// Redirect to home/dashboard after successful login
this.router.navigate(['/']);
} else {
this.errorMessage.set(response.message || 'Login failed');
}
},
error: (error) => {
this.isLoading.set(false);
this.errorMessage.set(
error.error?.message || 'Login failed. Please check your credentials.'
);
}
});
}
}