Răsfoiți Sursa

Create Register Page HTML & CSS

Eldar Mukhtarov 9 luni în urmă
părinte
comite
c70a98cf8c

+ 266 - 0
project/frontend-angular/src/app/register/register.css

@@ -0,0 +1,266 @@
+.registration-container {
+  max-width: 500px;
+  margin: 40px auto;
+  padding: 20px;
+  animation: fadeIn 0.6s ease-in;
+}
+
+@keyframes fadeIn {
+  from { 
+    opacity: 0; 
+    transform: translateY(30px); 
+  }
+  to { 
+    opacity: 1; 
+    transform: translateY(0); 
+  }
+}
+
+.registration-card {
+  background: linear-gradient(135deg, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.02) 100%);
+  border: 1px solid rgba(255, 255, 255, 0.1);
+  border-radius: 16px;
+  padding: 40px;
+  backdrop-filter: blur(10px);
+  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
+  transition: all 0.3s ease;
+}
+
+.registration-card:hover {
+  border-color: rgba(255, 255, 255, 0.15);
+  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4);
+}
+
+.form-header {
+  text-align: center;
+  margin-bottom: 32px;
+}
+
+.form-title {
+  font-size: 32px;
+  font-weight: 700;
+  letter-spacing: -1px;
+  color: #ffffff;
+  margin-bottom: 8px;
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+  background: linear-gradient(135deg, #ffffff 0%, #e0e0e0 100%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+}
+
+.form-subtitle {
+  font-size: 16px;
+  color: #b0b0b0;
+  font-weight: 400;
+  margin: 0;
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+}
+
+.registration-form {
+  display: flex;
+  flex-direction: column;
+  gap: 24px;
+}
+
+.form-group {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.form-label {
+  font-size: 14px;
+  font-weight: 500;
+  color: #e0e0e0;
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+  margin-bottom: 4px;
+}
+
+.form-input,
+.form-select {
+  padding: 14px 16px;
+  background: rgba(255, 255, 255, 0.05);
+  border: 1px solid rgba(255, 255, 255, 0.1);
+  border-radius: 8px;
+  color: #ffffff;
+  font-size: 16px;
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+  transition: all 0.3s ease;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.form-input:focus,
+.form-select:focus {
+  outline: none;
+  border-color: rgba(255, 255, 255, 0.3);
+  background: rgba(255, 255, 255, 0.08);
+  box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1);
+  transform: translateY(-1px);
+}
+
+.form-input::placeholder {
+  color: #888;
+  font-style: italic;
+}
+
+.form-select {
+  cursor: pointer;
+  appearance: none;
+  background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6,9 12,15 18,9'%3e%3c/polyline%3e%3c/svg%3e");
+  background-repeat: no-repeat;
+  background-position: right 12px center;
+  background-size: 16px;
+  padding-right: 40px;
+}
+
+.form-select option {
+  background-color: #1a1a1a;
+  color: #ffffff;
+  padding: 8px;
+}
+
+.error-messages {
+  margin-top: 4px;
+}
+
+.error-message {
+  font-size: 12px;
+  color: #ff6b6b;
+  font-weight: 500;
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+  display: flex;
+  align-items: center;
+  gap: 6px;
+}
+
+.global-error {
+  background: rgba(255, 107, 107, 0.1);
+  border: 1px solid rgba(255, 107, 107, 0.3);
+  border-radius: 8px;
+  padding: 16px;
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  margin-top: 16px;
+  animation: shake 0.5s ease-in-out;
+}
+
+@keyframes shake {
+  0%, 100% { transform: translateX(0); }
+  25% { transform: translateX(-5px); }
+  75% { transform: translateX(5px); }
+}
+
+.error-text {
+  color: #ff6b6b;
+  font-size: 14px;
+  font-weight: 500;
+}
+
+.form-actions {
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+  margin-top: 8px;
+}
+
+.submit-button {
+  background: linear-gradient(135deg, #8C231E 0%, #a02b26 100%);
+  border: none;
+  border-radius: 8px;
+  color: #ffffff;
+  padding: 16px 24px;
+  font-size: 16px;
+  font-weight: 600;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+  position: relative;
+  overflow: hidden;
+}
+
+.submit-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 8px 20px rgba(140, 35, 30, 0.4);
+  background: linear-gradient(135deg, #a02b26 0%, #b83530 100%);
+}
+
+.submit-button:active {
+  transform: translateY(0);
+}
+
+.submit-button:disabled {
+  opacity: 0.6;
+  cursor: not-allowed;
+  transform: none;
+}
+
+.form-input.ng-invalid.ng-touched,
+.form-select.ng-invalid.ng-touched {
+  border-color: rgba(255, 107, 107, 0.5);
+  background: rgba(255, 107, 107, 0.05);
+}
+
+.form-input.ng-valid.ng-touched,
+.form-select.ng-valid.ng-touched {
+  border-color: rgba(76, 175, 80, 0.5);
+  background: rgba(76, 175, 80, 0.05);
+}
+
+@media (max-width: 768px) {
+  .registration-container {
+    margin: 20px auto;
+    padding: 15px;
+  }
+
+  .registration-card {
+    padding: 24px;
+  }
+
+  .form-title {
+    font-size: 28px;
+  }
+
+  .form-subtitle {
+    font-size: 14px;
+  }
+
+  .form-input,
+  .form-select {
+    padding: 12px 14px;
+    font-size: 16px;
+  }
+
+  .submit-button {
+    padding: 14px 20px;
+  }
+}
+
+.form-input:focus,
+.form-select:focus {
+  z-index: 1;
+  position: relative;
+}
+
+.submit-button.loading {
+  pointer-events: none;
+}
+
+.submit-button.loading::after {
+  content: "";
+  position: absolute;
+  width: 16px;
+  height: 16px;
+  margin: auto;
+  border: 2px solid transparent;
+  border-top-color: #ffffff;
+  border-radius: 50%;
+  animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}

+ 92 - 34
project/frontend-angular/src/app/register/register.html

@@ -1,75 +1,133 @@
-<div>
-  <div>
-    <form name="form" (ngSubmit)="f.form.valid && onSubmit()" #f="ngForm" novalidate>
-      <div>
-        <label for="firstname" id="firstname">Firstname</label>
-        <input type="text" name="firstname" [(ngModel)]="form.firstname" #firstname="ngModel" required />
+<div class="registration-container">
+  <div class="registration-card">
+    <div class="form-header">
+      <h1 class="form-title">Create Account</h1>
+      <p class="form-subtitle">Register for Better WIKAMP</p>
+    </div>
+    
+    <form class="registration-form" name="form" (ngSubmit)="f.form.valid && onSubmit()" #f="ngForm" novalidate>
+      <div class="form-group">
+        <label class="form-label" for="firstname">First Name</label>
+        <input 
+          type="text" 
+          id="firstname"
+          class="form-input" 
+          name="firstname" 
+          [(ngModel)]="form.firstname" 
+          #firstname="ngModel" 
+          required 
+          placeholder="Enter your first name"
+        />
         @if (f.submitted && firstname.invalid) {
-          <div>
+          <div class="error-messages">
             @if (firstname.errors?.['required']) {
-              <div>Firstname is required</div>
+              <div class="error-message">First name is required</div>
             }
           </div>
         }
       </div>
-      <div>
-        <label for="lastname" id="lastname">Lastname</label>
-        <input type="text" name="lastname" [(ngModel)]="form.lastname" #lastname="ngModel" required />
+
+      <div class="form-group">
+        <label class="form-label" for="lastname">Last Name</label>
+        <input 
+          type="text" 
+          id="lastname"
+          class="form-input" 
+          name="lastname" 
+          [(ngModel)]="form.lastname" 
+          #lastname="ngModel" 
+          required 
+          placeholder="Enter your last name"
+        />
         @if (f.submitted && lastname.invalid) {
-          <div>
+          <div class="error-messages">
             @if (lastname.errors?.['required']) {
-              <div>Lastname is required</div>
+              <div class="error-message">Last name is required</div>
             }
           </div>
         }
       </div>
-      <div>
-        <label for="username" id="username">Username</label>
-        <input type="text" name="username" [(ngModel)]="form.username" #username="ngModel" required />
+
+      <div class="form-group">
+        <label class="form-label" for="username">Username</label>
+        <input 
+          type="text" 
+          id="username"
+          class="form-input" 
+          name="username" 
+          [(ngModel)]="form.username" 
+          #username="ngModel" 
+          required 
+          placeholder="Choose a username"
+        />
         @if (f.submitted && username.invalid) {
-          <div>
+          <div class="error-messages">
             @if (username.errors?.['required']) {
-              <div>Username is required</div>
+              <div class="error-message">Username is required</div>
             }
           </div>
         }
       </div>
-      <div>
-        <label for="password" id="password">Password</label>
-        <input type="password" name="password" [(ngModel)]="form.password" #password="ngModel" required minlength="6" />
+
+      <div class="form-group">
+        <label class="form-label" for="password">Password</label>
+        <input 
+          type="password" 
+          id="password"
+          class="form-input" 
+          name="password" 
+          [(ngModel)]="form.password" 
+          #password="ngModel" 
+          required 
+          minlength="6" 
+          placeholder="Create a password"
+        />
         @if (f.submitted && password.invalid) {
-          <div>
+          <div class="error-messages">
             @if (password.errors?.['required']) {
-              <div>Password is required</div>
+              <div class="error-message">Password is required</div>
             }
             @if (password.errors?.['minlength']) {
-              <div>Password must be at least 8 characters</div>
+              <div class="error-message">Password must be at least 6 characters</div>
             }
           </div>
         }
       </div>
-      <div>
-        <label for="role" id="role">Role</label>
-        <select name="role" [(ngModel)]="form.role" #role="ngModel" required>
+
+      <div class="form-group">
+        <label class="form-label" for="role">Role</label>
+        <select 
+          id="role"
+          class="form-select" 
+          name="role" 
+          [(ngModel)]="form.role" 
+          #role="ngModel" 
+          required
+        >
+          <option value="" disabled selected>Select a role</option>
           <option value="teacher">Teacher</option>
           <option value="student">Student</option>
         </select>
         @if (f.submitted && role.invalid) {
-          <div>
+          <div class="error-messages">
             @if (role.errors?.['required']) {
-              <div>Role is required</div>
+              <div class="error-message">Role is required</div>
             }
           </div>
         }
       </div>
-      <div>
-        <button>Register</button>
+
+      <div class="form-actions">
+        <button type="submit" class="submit-button">Create Account</button>
+        
         @if (f.submitted && isSignUpFailed) {
-          <div>
-            Registration failed: {{ errorMessage }}
+          <div class="global-error">
+            <div class="error-text">
+              Registration failed: {{ errorMessage }}
+            </div>
           </div>
         }
       </div>
     </form>
   </div>
-</div>
+</div>