webcodelab commited on
Commit
a9dd227
ยท
verified ยท
1 Parent(s): 880cc06

Update app/templates/login.html

Browse files
Files changed (1) hide show
  1. app/templates/login.html +469 -16
app/templates/login.html CHANGED
@@ -1,20 +1,473 @@
1
  {% extends "base.html" %}
2
- {% block title %}Login{% endblock %}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  {% block content %}
4
- <h2>Login</h2>
5
- <form method="POST">
6
- <div class="mb-3">
7
- <input name="email" type="email" class="form-control" placeholder="Email" required>
8
- </div>
9
- <div class="mb-3">
10
- <input name="password" type="password" class="form-control" placeholder="Password" required>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  </div>
12
- <button type="submit" class="btn btn-primary">Login</button>
13
- </form>
14
- <p class="mt-3">
15
- Didn't get the verification email?
16
- <a href="{{ url_for('auth.resend_verification') }}">Resend it</a>
17
- </p>
18
-
19
- <p class="mt-3">Don't have an account? <a href="{{ url_for('auth.register') }}">Register</a></p>
20
  {% endblock %}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  {% extends "base.html" %}
2
+ {% block title %}Login โ€“ Resume Ranker API{% endblock %}
3
+
4
+ {% block extra_head %}
5
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
6
+ <style>
7
+ :root {
8
+ --primary: #2563eb;
9
+ --primary-light: #60a5fa;
10
+ --accent: #14b8a6;
11
+ --bg: #f8fafc;
12
+ --bg-dark: #18181b;
13
+ --text: #1e293b;
14
+ --text-light: #f1f5f9;
15
+ --card: #fff;
16
+ --card-dark: #23272f;
17
+ --border: #e5e7eb;
18
+ --border-dark: #2d3340;
19
+ --transition: 0.3s cubic-bezier(.4,0,.2,1);
20
+ }
21
+ [data-theme="dark"] {
22
+ --bg: var(--bg-dark);
23
+ --text: var(--text-light);
24
+ --card: var(--card-dark);
25
+ --border: var(--border-dark);
26
+ }
27
+ html, body {
28
+ margin: 0;
29
+ padding: 0;
30
+ font-family: 'Inter', sans-serif;
31
+ background: var(--bg);
32
+ color: var(--text);
33
+ transition: background var(--transition), color var(--transition);
34
+ }
35
+ a { color: var(--primary); text-decoration: none; transition: color var(--transition); }
36
+ a:hover { color: var(--accent); }
37
+ .container { max-width: 1100px; margin: 0 auto; padding: 0 1.5rem; }
38
+ header {
39
+ display: flex; align-items: center; justify-content: space-between;
40
+ padding: 2rem 0 1.5rem 0;
41
+ }
42
+ .logo {
43
+ font-weight: 700; font-size: 1.5rem; letter-spacing: -1px;
44
+ color: var(--primary);
45
+ }
46
+ .nav-links {
47
+ display: flex; gap: 2rem;
48
+ }
49
+ .nav-links a { font-weight: 500; }
50
+ .theme-toggle {
51
+ background: none; border: none; cursor: pointer; font-size: 1.3rem;
52
+ color: var(--text); margin-left: 1.5rem; transition: color var(--transition);
53
+ }
54
+ .sticky-header {
55
+ position: sticky;
56
+ top: 0;
57
+ z-index: 100;
58
+ background: var(--bg);
59
+ transition: background var(--transition);
60
+ box-shadow: 0 2px 8px 0 rgba(30,41,59,0.04);
61
+ }
62
+ .hamburger {
63
+ display: none;
64
+ flex-direction: column;
65
+ justify-content: center;
66
+ align-items: center;
67
+ width: 40px;
68
+ height: 40px;
69
+ background: none;
70
+ border: none;
71
+ cursor: pointer;
72
+ margin-left: 1rem;
73
+ z-index: 110;
74
+ }
75
+ .hamburger span {
76
+ display: block;
77
+ width: 24px;
78
+ height: 3px;
79
+ margin: 3px 0;
80
+ background: var(--text);
81
+ border-radius: 2px;
82
+ transition: all 0.3s;
83
+ }
84
+ @media (max-width: 900px) {
85
+ .nav-links {
86
+ position: fixed;
87
+ top: 70px;
88
+ right: 0;
89
+ background: var(--card);
90
+ flex-direction: column;
91
+ align-items: flex-start;
92
+ gap: 1.5rem;
93
+ padding: 2rem 2rem 2rem 1.5rem;
94
+ box-shadow: 0 4px 24px 0 rgba(30,41,59,0.10);
95
+ border-radius: 0 0 0.7rem 0.7rem;
96
+ transform: translateY(-120%);
97
+ opacity: 0;
98
+ pointer-events: none;
99
+ transition: transform 0.3s, opacity 0.3s;
100
+ min-width: 60vw;
101
+ }
102
+ .nav-links.open {
103
+ transform: translateY(0);
104
+ opacity: 1;
105
+ pointer-events: auto;
106
+ }
107
+ .hamburger {
108
+ display: flex;
109
+ }
110
+ .logo {
111
+ z-index: 120;
112
+ }
113
+ .theme-toggle {
114
+ z-index: 120;
115
+ margin-left: 0.5rem;
116
+ }
117
+ }
118
+ @media (max-width: 600px) {
119
+ .nav-links {
120
+ top: 60px;
121
+ padding: 1.2rem 1.2rem 1.2rem 1rem;
122
+ min-width: 80vw;
123
+ }
124
+ }
125
+ /* Login Form */
126
+ .login-container {
127
+ display: flex;
128
+ align-items: center;
129
+ justify-content: center;
130
+ min-height: calc(100vh - 120px);
131
+ padding: 2rem 0;
132
+ }
133
+ .login-card {
134
+ background: var(--card);
135
+ border: 1px solid var(--border);
136
+ border-radius: 1rem;
137
+ padding: 2.5rem;
138
+ width: 100%;
139
+ max-width: 400px;
140
+ box-shadow: 0 4px 24px 0 rgba(30,41,59,0.08);
141
+ transition: background var(--transition), border var(--transition);
142
+ }
143
+ .login-header {
144
+ text-align: center;
145
+ margin-bottom: 2rem;
146
+ }
147
+ .login-title {
148
+ font-size: 1.8rem;
149
+ font-weight: 700;
150
+ margin-bottom: 0.5rem;
151
+ color: var(--text);
152
+ }
153
+ .login-subtitle {
154
+ color: #64748b;
155
+ font-size: 1rem;
156
+ }
157
+ [data-theme="dark"] .login-subtitle {
158
+ color: #cbd5e1;
159
+ }
160
+ .form-group {
161
+ margin-bottom: 1.5rem;
162
+ }
163
+ .form-label {
164
+ display: block;
165
+ font-weight: 600;
166
+ margin-bottom: 0.5rem;
167
+ color: var(--text);
168
+ font-size: 0.95rem;
169
+ }
170
+ .form-input {
171
+ width: 100%;
172
+ padding: 0.75rem 1rem;
173
+ border: 1px solid var(--border);
174
+ border-radius: 0.5rem;
175
+ font-size: 1rem;
176
+ font-family: inherit;
177
+ background: var(--bg);
178
+ color: var(--text);
179
+ transition: border var(--transition), background var(--transition), color var(--transition);
180
+ box-sizing: border-box;
181
+ }
182
+ .form-input:focus {
183
+ outline: none;
184
+ border-color: var(--primary);
185
+ box-shadow: 0 0 0 3px rgba(37,99,235,0.1);
186
+ }
187
+ .form-input::placeholder {
188
+ color: #94a3b8;
189
+ }
190
+ [data-theme="dark"] .form-input::placeholder {
191
+ color: #64748b;
192
+ }
193
+ .form-row {
194
+ display: flex;
195
+ justify-content: space-between;
196
+ align-items: center;
197
+ margin-bottom: 1.5rem;
198
+ }
199
+ .checkbox-group {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 0.5rem;
203
+ }
204
+ .checkbox-group input[type="checkbox"] {
205
+ width: 16px;
206
+ height: 16px;
207
+ accent-color: var(--primary);
208
+ }
209
+ .checkbox-group label {
210
+ font-size: 0.9rem;
211
+ color: var(--text);
212
+ cursor: pointer;
213
+ }
214
+ .forgot-link {
215
+ font-size: 0.9rem;
216
+ color: var(--primary);
217
+ text-decoration: none;
218
+ }
219
+ .forgot-link:hover {
220
+ color: var(--accent);
221
+ }
222
+ .login-btn {
223
+ width: 100%;
224
+ padding: 0.85rem 1.5rem;
225
+ background: var(--primary);
226
+ color: #fff;
227
+ border: none;
228
+ border-radius: 0.5rem;
229
+ font-size: 1rem;
230
+ font-weight: 600;
231
+ cursor: pointer;
232
+ transition: background var(--transition);
233
+ margin-bottom: 1.5rem;
234
+ }
235
+ .login-btn:hover {
236
+ background: var(--accent);
237
+ }
238
+ .login-btn:disabled {
239
+ background: #94a3b8;
240
+ cursor: not-allowed;
241
+ }
242
+ .divider {
243
+ display: flex;
244
+ align-items: center;
245
+ margin: 1.5rem 0;
246
+ color: #64748b;
247
+ font-size: 0.9rem;
248
+ }
249
+ [data-theme="dark"] .divider {
250
+ color: #94a3b8;
251
+ }
252
+ .divider::before,
253
+ .divider::after {
254
+ content: "";
255
+ flex: 1;
256
+ height: 1px;
257
+ background: var(--border);
258
+ }
259
+ .divider span {
260
+ padding: 0 1rem;
261
+ }
262
+ .social-btn {
263
+ width: 100%;
264
+ padding: 0.75rem 1rem;
265
+ border: 1px solid var(--border);
266
+ border-radius: 0.5rem;
267
+ background: var(--card);
268
+ color: var(--text);
269
+ font-size: 1rem;
270
+ font-weight: 500;
271
+ cursor: pointer;
272
+ transition: background var(--transition), border var(--transition);
273
+ margin-bottom: 0.75rem;
274
+ display: flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ gap: 0.5rem;
278
+ }
279
+ .social-btn:hover {
280
+ background: var(--bg);
281
+ border-color: var(--primary);
282
+ }
283
+ .signup-link {
284
+ text-align: center;
285
+ margin-top: 1.5rem;
286
+ color: #64748b;
287
+ font-size: 0.95rem;
288
+ }
289
+ [data-theme="dark"] .signup-link {
290
+ color: #cbd5e1;
291
+ }
292
+ .signup-link a {
293
+ font-weight: 600;
294
+ }
295
+ .error-message {
296
+ background: #fef2f2;
297
+ color: #dc2626;
298
+ padding: 0.75rem 1rem;
299
+ border-radius: 0.5rem;
300
+ font-size: 0.9rem;
301
+ margin-bottom: 1rem;
302
+ border: 1px solid #fecaca;
303
+ }
304
+ [data-theme="dark"] .error-message {
305
+ background: #450a0a;
306
+ color: #fca5a5;
307
+ border-color: #7f1d1d;
308
+ }
309
+ .success-message {
310
+ background: #f0fdf4;
311
+ color: #16a34a;
312
+ padding: 0.75rem 1rem;
313
+ border-radius: 0.5rem;
314
+ font-size: 0.9rem;
315
+ margin-bottom: 1rem;
316
+ border: 1px solid #bbf7d0;
317
+ }
318
+ [data-theme="dark"] .success-message {
319
+ background: #052e16;
320
+ color: #86efac;
321
+ border-color: #166534;
322
+ }
323
+ .verification-link {
324
+ text-align: center;
325
+ margin-top: 1rem;
326
+ color: #64748b;
327
+ font-size: 0.9rem;
328
+ }
329
+ [data-theme="dark"] .verification-link {
330
+ color: #cbd5e1;
331
+ }
332
+ .verification-link a {
333
+ font-weight: 600;
334
+ }
335
+ @media (max-width: 900px) {
336
+ .container { padding: 0 0.5rem; }
337
+ }
338
+ </style>
339
+ {% endblock %}
340
+
341
  {% block content %}
342
+ <header class="container sticky-header">
343
+ <div class="logo">ResumeRanker<span style="color:var(--accent)">.API</span></div>
344
+ <nav class="nav-links" id="navLinks">
345
+ <a href="{{ url_for('main.index') }}">Home</a>
346
+ <a href="{{ url_for('main.index') }}#how">How it works</a>
347
+ <a href="{{ url_for('main.index') }}#demo">Live Demo</a>
348
+ <a href="{{ url_for('main.index') }}#docs">Docs</a>
349
+ <a href="{{ url_for('main.index') }}#pricing">Pricing</a>
350
+ </nav>
351
+ <button class="theme-toggle" id="themeToggle" aria-label="Toggle dark mode">๐ŸŒ™</button>
352
+ <button class="hamburger" id="hamburger" aria-label="Open menu">
353
+ <span></span><span></span><span></span>
354
+ </button>
355
+ </header>
356
+
357
+ <main class="login-container">
358
+ <div class="login-card">
359
+ <div class="login-header">
360
+ <h1 class="login-title">Welcome back</h1>
361
+ <p class="login-subtitle">Sign in to your ResumeRanker account</p>
362
+ </div>
363
+
364
+ {% if error %}
365
+ <div class="error-message">{{ error }}</div>
366
+ {% endif %}
367
+
368
+ {% if success %}
369
+ <div class="success-message">{{ success }}</div>
370
+ {% endif %}
371
+
372
+ <form method="POST">
373
+ <div class="form-group">
374
+ <label for="email" class="form-label">Email address</label>
375
+ <input type="email" id="email" name="email" class="form-input" placeholder="Enter your email" required>
376
+ </div>
377
+
378
+ <div class="form-group">
379
+ <label for="password" class="form-label">Password</label>
380
+ <input type="password" id="password" name="password" class="form-input" placeholder="Enter your password" required>
381
+ </div>
382
+
383
+ <div class="form-row">
384
+ <div class="checkbox-group">
385
+ <input type="checkbox" id="remember" name="remember">
386
+ <label for="remember">Remember me</label>
387
+ </div>
388
+ <a href="#" class="forgot-link">Forgot password?</a>
389
+ </div>
390
+
391
+ <button type="submit" class="login-btn">Sign in</button>
392
+ </form>
393
+
394
+ <div class="divider">
395
+ <span>or continue with</span>
396
+ </div>
397
+
398
+ <button class="social-btn" onclick="signInWithGoogle()">
399
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
400
+ <path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
401
+ <path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
402
+ <path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
403
+ <path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
404
+ </svg>
405
+ Continue with Google
406
+ </button>
407
+
408
+ <button class="social-btn" onclick="signInWithGitHub()">
409
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
410
+ <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
411
+ </svg>
412
+ Continue with GitHub
413
+ </button>
414
+
415
+ <div class="verification-link">
416
+ Didn't get the verification email?
417
+ <a href="{{ url_for('auth.resend_verification') }}">Resend it</a>
418
+ </div>
419
+
420
+ <div class="signup-link">
421
+ Don't have an account? <a href="{{ url_for('auth.register') }}">Register</a>
422
+ </div>
423
  </div>
424
+ </main>
 
 
 
 
 
 
 
425
  {% endblock %}
426
+
427
+ {% block extra_scripts %}
428
+ <script>
429
+ // Light/Dark mode toggle
430
+ const themeToggle = document.getElementById('themeToggle');
431
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
432
+ function setTheme(theme) {
433
+ document.documentElement.setAttribute('data-theme', theme);
434
+ localStorage.setItem('theme', theme);
435
+ themeToggle.textContent = theme === 'dark' ? 'โ˜€๏ธ' : '๐ŸŒ™';
436
+ }
437
+ const savedTheme = localStorage.getItem('theme');
438
+ setTheme(savedTheme || (prefersDark ? 'dark' : 'light'));
439
+ themeToggle.onclick = () => {
440
+ const current = document.documentElement.getAttribute('data-theme');
441
+ setTheme(current === 'dark' ? 'light' : 'dark');
442
+ };
443
+
444
+ // Hamburger menu toggle
445
+ const hamburger = document.getElementById('hamburger');
446
+ const navLinks = document.getElementById('navLinks');
447
+ hamburger.onclick = function() {
448
+ navLinks.classList.toggle('open');
449
+ hamburger.classList.toggle('open');
450
+ };
451
+
452
+ // Close menu when clicking a link (on mobile)
453
+ Array.from(navLinks.getElementsByTagName('a')).forEach(link => {
454
+ link.onclick = () => {
455
+ if (window.innerWidth <= 900) {
456
+ navLinks.classList.remove('open');
457
+ hamburger.classList.remove('open');
458
+ }
459
+ };
460
+ });
461
+
462
+ // Social login functions
463
+ function signInWithGoogle() {
464
+ // Implement Google OAuth
465
+ console.log('Google sign-in clicked');
466
+ }
467
+
468
+ function signInWithGitHub() {
469
+ // Implement GitHub OAuth
470
+ console.log('GitHub sign-in clicked');
471
+ }
472
+ </script>
473
+ {% endblock %}