zaiffi commited on
Commit
7b6a25e
·
verified ·
1 Parent(s): b251f08

Upload 3 files

Browse files

Update to balance size

templates/contact.html CHANGED
@@ -1,270 +1,353 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Contact Us - Book Recommender System</title>
7
- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/css/bootstrap.min.css" rel="stylesheet">
8
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
9
- <style>
10
- :root {
11
- --primary: #131D4F;
12
- --secondary: #254D70;
13
- --accent: #954C2E;
14
- --light: #EFE4D2;
15
- }
16
-
17
- body {
18
- background-color: var(--light);
19
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
20
- }
21
- .navbar {
22
- background-color: var(--primary) !important;
23
- padding: 1rem 2rem;
24
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
25
- }
26
- .navbar-brand, .nav-link {
27
- color: var(--light) !important;
28
- font-weight: 600;
29
- }
30
- .nav-link:hover {
31
- color: var(--accent) !important;
32
- }
33
- .page-title {
34
- color: var(--primary);
35
- font-weight: 700;
36
- margin: 2rem 0;
37
- text-align: center;
38
- }
39
- .contact-container {
40
- max-width: 800px;
41
- margin: 2rem auto;
42
- padding: 2rem;
43
- background: white;
44
- border-radius: 15px;
45
- box-shadow: 0 4px 6px rgba(0,0,0,0.1);
46
- }
47
- .contact-info {
48
- margin-bottom: 2rem;
49
- }
50
- .contact-info-item {
51
- display: flex;
52
- align-items: center;
53
- margin-bottom: 1rem;
54
- color: var(--primary);
55
- }
56
- .contact-info-item i {
57
- width: 40px;
58
- height: 40px;
59
- background: var(--secondary);
60
- color: var(--light);
61
- border-radius: 50%;
62
- display: flex;
63
- align-items: center;
64
- justify-content: center;
65
- margin-right: 1rem;
66
- }
67
- .form-control {
68
- border: 2px solid var(--light);
69
- border-radius: 8px;
70
- padding: 0.8rem 1rem;
71
- margin-bottom: 1rem;
72
- transition: all 0.3s ease;
73
- background-color: var(--light);
74
- }
75
- .form-control:focus {
76
- border-color: var(--secondary);
77
- box-shadow: 0 0 0 0.2rem rgba(37, 77, 112, 0.25);
78
- background-color: white;
79
- }
80
- .submit-btn {
81
- background-color: var(--accent);
82
- color: var(--light);
83
- border: none;
84
- border-radius: 8px;
85
- padding: 0.8rem 2rem;
86
- font-size: 1.1rem;
87
- transition: all 0.3s ease;
88
- width: 100%;
89
- }
90
- .submit-btn:hover {
91
- background-color: #7a3d25;
92
- transform: translateY(-2px);
93
- }
94
- .social-links {
95
- display: flex;
96
- justify-content: center;
97
- gap: 1rem;
98
- margin-top: 2rem;
99
- }
100
- .social-link {
101
- width: 40px;
102
- height: 40px;
103
- background: var(--primary);
104
- color: var(--light);
105
- border-radius: 50%;
106
- display: flex;
107
- align-items: center;
108
- justify-content: center;
109
- transition: all 0.3s ease;
110
- }
111
- .social-link:hover {
112
- background: var(--accent);
113
- transform: translateY(-3px);
114
- }
115
- .map-container {
116
- margin-top: 2rem;
117
- border-radius: 10px;
118
- overflow: hidden;
119
- box-shadow: 0 4px 6px rgba(0,0,0,0.1);
120
- }
121
- .contact-info h3 {
122
- color: var(--primary);
123
- border-bottom: 2px solid var(--accent);
124
- padding-bottom: 0.5rem;
125
- display: inline-block;
126
- }
127
- .contact-info-item h5 {
128
- color: var(--secondary);
129
- }
130
- .contact-info-item p {
131
- color: var(--primary);
132
- }
133
- .form-label {
134
- color: var(--primary);
135
- font-weight: 500;
136
- }
137
- .alert-success {
138
- background-color: var(--secondary);
139
- color: var(--light);
140
- border: none;
141
- }
142
- </style>
143
- </head>
144
- <body>
145
- <nav class="navbar navbar-expand-lg">
146
- <div class="container">
147
- <a class="navbar-brand" href="/">
148
- <i class="fas fa-book-reader me-2"></i>Book Recommender
149
- </a>
150
- <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
151
- <span class="navbar-toggler-icon"></span>
152
- </button>
153
- <div class="collapse navbar-collapse" id="navbarNav">
154
- <ul class="navbar-nav ms-auto">
155
- <li class="nav-item">
156
- <a class="nav-link" href="/"><i class="fas fa-home me-1"></i>Home</a>
157
- </li>
158
- <li class="nav-item">
159
- <a class="nav-link" href="/recommend"><i class="fas fa-magic me-1"></i>Recommend</a>
160
- </li>
161
- <li class="nav-item">
162
- <a class="nav-link active" href="/contact"><i class="fas fa-envelope me-1"></i>Contact</a>
163
- </li>
164
- </ul>
165
- </div>
166
- </div>
167
- </nav>
168
-
169
- <div class="container py-5">
170
- <h1 class="page-title">Contact Us</h1>
171
-
172
- {% with messages = get_flashed_messages(with_categories=true) %}
173
- {% if messages %}
174
- {% for category, message in messages %}
175
- <div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
176
- {{ message }}
177
- <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
178
- </div>
179
- {% endfor %}
180
- {% endif %}
181
- {% endwith %}
182
-
183
- <div class="contact-container">
184
- <div class="row">
185
- <div class="col-md-6">
186
- <div class="contact-info">
187
- <h3 class="mb-4">Get in Touch</h3>
188
- <div class="contact-info-item">
189
- <i class="fas fa-map-marker-alt"></i>
190
- <div>
191
- <h5 class="mb-0">Address</h5>
192
- <p class="mb-0">House No.11-A, Street No.36 near UBL Bank, Abdullahpur, Faisalabad.</p>
193
- </div>
194
- </div>
195
- <div class="contact-info-item">
196
- <i class="fas fa-phone"></i>
197
- <div>
198
- <h5 class="mb-0">Phone</h5>
199
- <p class="mb-0">+923059314103</p>
200
- </div>
201
- </div>
202
- <div class="contact-info-item">
203
- <i class="fas fa-envelope"></i>
204
- <div>
205
- <h5 class="mb-0">Email</h5>
206
- <p class="mb-0">huzaifasaqib420@gmail.com</p>
207
- </div>
208
- </div>
209
- <div class="contact-info-item">
210
- <i class="fas fa-clock"></i>
211
- <div>
212
- <h5 class="mb-0">Working Hours</h5>
213
- <p class="mb-0">Monday - Friday: 5:00 PM - 1:00 AM<br>Saturday: 5:00 PM - 9:00 PM</p>
214
- </div>
215
- </div>
216
- </div>
217
- </div>
218
- <div class="col-md-6">
219
- <form action="/contact" method="POST">
220
- <div class="mb-3">
221
- <input type="text" class="form-control" name="name" placeholder="Your Name" required>
222
- </div>
223
- <div class="mb-3">
224
- <input type="email" class="form-control" name="email" placeholder="Your Email" required>
225
- </div>
226
- <div class="mb-3">
227
- <input type="text" class="form-control" name="subject" placeholder="Subject" required>
228
- </div>
229
- <div class="mb-3">
230
- <textarea class="form-control" name="message" rows="5" placeholder="Your Message" required></textarea>
231
- </div>
232
- <button type="submit" class="submit-btn">
233
- <i class="fas fa-paper-plane me-2"></i>Send Message
234
- </button>
235
- </form>
236
- </div>
237
- </div>
238
-
239
- <div class="social-links">
240
- <a href="https://www.linkedin.com/in/muhammad-huzaifa-saqib-90a1a9324/" class="social-link" target="_blank" title="LinkedIn"><i class="fab fa-linkedin-in"></i></a>
241
- <a href="https://github.com/zaiffishiekh01" class="social-link" target="_blank" title="GitHub"><i class="fab fa-github"></i></a>
242
- <a href="https://huggingface.co/zaiffi" class="social-link" target="_blank" title="Hugging Face">
243
- <svg width="20" height="20" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
244
- <circle cx="20" cy="20" r="20" fill="#FFD21F"/>
245
- <ellipse cx="13.5" cy="17.5" rx="2.5" ry="3.5" fill="#fff"/>
246
- <ellipse cx="26.5" cy="17.5" rx="2.5" ry="3.5" fill="#fff"/>
247
- <ellipse cx="13.5" cy="18.5" rx="1.5" ry="2.5" fill="#000"/>
248
- <ellipse cx="26.5" cy="18.5" rx="1.5" ry="2.5" fill="#000"/>
249
- <path d="M10 25c2 3 7 5 10 5s8-2 10-5" stroke="#954C2E" stroke-width="2" stroke-linecap="round"/>
250
- </svg>
251
- </a>
252
- <a href="https://huzaifasaqib-portfolio.vercel.app/" class="social-link" target="_blank" title="Portfolio"><i class="fas fa-globe"></i></a>
253
- </div>
254
-
255
- <div class="map-container">
256
- <iframe
257
- src="https://www.google.com/maps?q=House+No.11-A,+Street+No.36+near+UBL+Bank,+Abdullahpur,+Faisalabad&output=embed"
258
- width="100%"
259
- height="300"
260
- style="border:0;"
261
- allowfullscreen=""
262
- loading="lazy">
263
- </iframe>
264
- </div>
265
- </div>
266
- </div>
267
-
268
- <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/js/bootstrap.bundle.min.js"></script>
269
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Contact Us - Book Recommender System</title>
7
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/css/bootstrap.min.css" rel="stylesheet">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
9
+ <script src="https://cdn.jsdelivr.net/npm/@emailjs/browser@3/dist/email.min.js"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
11
+ <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css">
12
+ <style>
13
+ :root {
14
+ --primary: #131D4F;
15
+ --secondary: #254D70;
16
+ --accent: #954C2E;
17
+ --light: #EFE4D2;
18
+ }
19
+
20
+ body {
21
+ background-color: var(--light);
22
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
23
+ }
24
+ .navbar {
25
+ background-color: var(--primary) !important;
26
+ padding: 1rem 2rem;
27
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
28
+ }
29
+ .navbar-brand, .nav-link {
30
+ color: var(--light) !important;
31
+ font-weight: 600;
32
+ }
33
+ .nav-link:hover {
34
+ color: var(--accent) !important;
35
+ }
36
+ .page-title {
37
+ color: var(--primary);
38
+ font-weight: 700;
39
+ margin: 2rem 0;
40
+ text-align: center;
41
+ }
42
+ .contact-container {
43
+ max-width: 800px;
44
+ margin: 2rem auto;
45
+ padding: 2rem;
46
+ background: white;
47
+ border-radius: 15px;
48
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
49
+ }
50
+ .contact-info {
51
+ margin-bottom: 2rem;
52
+ }
53
+ .contact-info-item {
54
+ display: flex;
55
+ align-items: center;
56
+ margin-bottom: 1rem;
57
+ color: var(--primary);
58
+ }
59
+ .contact-info-item i {
60
+ width: 40px;
61
+ height: 40px;
62
+ background: var(--secondary);
63
+ color: var(--light);
64
+ border-radius: 50%;
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ margin-right: 1rem;
69
+ }
70
+ .form-control {
71
+ border: 2px solid var(--light);
72
+ border-radius: 8px;
73
+ padding: 0.8rem 1rem;
74
+ margin-bottom: 1rem;
75
+ transition: all 0.3s ease;
76
+ background-color: var(--light);
77
+ }
78
+ .form-control:focus {
79
+ border-color: var(--secondary);
80
+ box-shadow: 0 0 0 0.2rem rgba(37, 77, 112, 0.25);
81
+ background-color: white;
82
+ }
83
+ .submit-btn {
84
+ background-color: var(--accent);
85
+ color: var(--light);
86
+ border: none;
87
+ border-radius: 8px;
88
+ padding: 0.8rem 2rem;
89
+ font-size: 1.1rem;
90
+ transition: all 0.3s ease;
91
+ width: 100%;
92
+ }
93
+ .submit-btn:hover {
94
+ background-color: #7a3d25;
95
+ transform: translateY(-2px);
96
+ }
97
+ .submit-btn:disabled {
98
+ background-color: #ccc;
99
+ cursor: not-allowed;
100
+ }
101
+ .loading-spinner {
102
+ display: none;
103
+ margin-right: 8px;
104
+ }
105
+ .submit-btn.loading .loading-spinner {
106
+ display: inline-block;
107
+ }
108
+ .social-links {
109
+ display: flex;
110
+ justify-content: center;
111
+ gap: 1rem;
112
+ margin-top: 2rem;
113
+ }
114
+ .social-link {
115
+ width: 40px;
116
+ height: 40px;
117
+ background: var(--primary);
118
+ color: var(--light);
119
+ border-radius: 50%;
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ transition: all 0.3s ease;
124
+ }
125
+ .social-link:hover {
126
+ background: var(--accent);
127
+ transform: translateY(-3px);
128
+ }
129
+ .map-container {
130
+ margin-top: 2rem;
131
+ border-radius: 10px;
132
+ overflow: hidden;
133
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
134
+ }
135
+ .contact-info h3 {
136
+ color: var(--primary);
137
+ border-bottom: 2px solid var(--accent);
138
+ padding-bottom: 0.5rem;
139
+ display: inline-block;
140
+ }
141
+ .contact-info-item h5 {
142
+ color: var(--secondary);
143
+ }
144
+ .contact-info-item p {
145
+ color: var(--primary);
146
+ }
147
+ .form-label {
148
+ color: var(--primary);
149
+ font-weight: 500;
150
+ }
151
+ .alert-success {
152
+ background-color: var(--secondary);
153
+ color: var(--light);
154
+ border: none;
155
+ }
156
+ </style>
157
+ </head>
158
+ <body>
159
+ <nav class="navbar navbar-expand-lg">
160
+ <div class="container">
161
+ <a class="navbar-brand d-flex align-items-center" href="/">
162
+ <i class="fas fa-book-reader me-2"></i>
163
+ <span style="color: #fff; font-weight: 700; font-size: 1.3rem;">BookQuest</span>
164
+ <span style="color: #954C2E; font-size: 0.95rem; font-weight: 500; margin-left: 0.5rem;">Adventure in finding great reads</span>
165
+ </a>
166
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
167
+ <span class="navbar-toggler-icon"></span>
168
+ </button>
169
+ <div class="collapse navbar-collapse" id="navbarNav">
170
+ <ul class="navbar-nav ms-auto">
171
+ <li class="nav-item">
172
+ <a class="nav-link" href="/"><i class="fas fa-home me-1"></i>Home</a>
173
+ </li>
174
+ <li class="nav-item">
175
+ <a class="nav-link" href="/recommend"><i class="fas fa-magic me-1"></i>Recommend</a>
176
+ </li>
177
+ <li class="nav-item">
178
+ <a class="nav-link active" href="/contact"><i class="fas fa-envelope me-1"></i>Contact</a>
179
+ </li>
180
+ </ul>
181
+ </div>
182
+ </div>
183
+ </nav>
184
+
185
+ <div class="container py-5">
186
+ <h1 class="page-title">Contact Us</h1>
187
+
188
+ {% with messages = get_flashed_messages(with_categories=true) %}
189
+ {% if messages %}
190
+ {% for category, message in messages %}
191
+ <div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
192
+ {{ message }}
193
+ <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
194
+ </div>
195
+ {% endfor %}
196
+ {% endif %}
197
+ {% endwith %}
198
+
199
+ <div class="contact-container">
200
+ <div class="row">
201
+ <div class="col-md-6">
202
+ <div class="contact-info">
203
+ <h3 class="mb-4">Get in Touch</h3>
204
+ <div class="contact-info-item">
205
+ <i class="fas fa-map-marker-alt"></i>
206
+ <div>
207
+ <h5 class="mb-0">Address</h5>
208
+ <p class="mb-0">House No.11-A, Street No.36 near UBL Bank, Abdullahpur, Faisalabad.</p>
209
+ </div>
210
+ </div>
211
+ <div class="contact-info-item">
212
+ <i class="fas fa-phone"></i>
213
+ <div>
214
+ <h5 class="mb-0">Phone</h5>
215
+ <p class="mb-0">+923059314103</p>
216
+ </div>
217
+ </div>
218
+ <div class="contact-info-item">
219
+ <i class="fas fa-envelope"></i>
220
+ <div>
221
+ <h5 class="mb-0">Email</h5>
222
+ <p class="mb-0">huzaifasaqib420@gmail.com</p>
223
+ </div>
224
+ </div>
225
+ <div class="contact-info-item">
226
+ <i class="fas fa-clock"></i>
227
+ <div>
228
+ <h5 class="mb-0">Working Hours</h5>
229
+ <p class="mb-0">Monday - Friday: 5:00 PM - 1:00 AM<br>Saturday: 5:00 PM - 9:00 PM</p>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ <div class="col-md-6">
235
+ <form id="contact-form" onsubmit="return handleSubmit(event)">
236
+ <div class="mb-3">
237
+ <input type="text" class="form-control" name="name" id="name" placeholder="Your Name" required>
238
+ </div>
239
+ <div class="mb-3">
240
+ <input type="email" class="form-control" name="email" id="email" placeholder="Your Email" required>
241
+ </div>
242
+ <div class="mb-3">
243
+ <input type="text" class="form-control" name="subject" id="subject" placeholder="Subject" required>
244
+ </div>
245
+ <div class="mb-3">
246
+ <textarea class="form-control" name="message" id="message" rows="5" placeholder="Your Message" required></textarea>
247
+ </div>
248
+ <button type="submit" class="submit-btn" id="submit-btn">
249
+ <span class="loading-spinner">
250
+ <i class="fas fa-spinner fa-spin"></i>
251
+ </span>
252
+ <i class="fas fa-paper-plane me-2"></i>Send Message
253
+ </button>
254
+ </form>
255
+ </div>
256
+ </div>
257
+
258
+ <div class="social-links">
259
+ <a href="https://www.linkedin.com/in/muhammad-huzaifa-saqib-90a1a9324/" class="social-link" target="_blank" title="LinkedIn"><i class="fab fa-linkedin-in"></i></a>
260
+ <a href="https://github.com/zaiffishiekh01" class="social-link" target="_blank" title="GitHub"><i class="fab fa-github"></i></a>
261
+ <a href="https://huggingface.co/zaiffi" class="social-link" target="_blank" title="Hugging Face">
262
+ <svg width="20" height="20" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
263
+ <circle cx="20" cy="20" r="20" fill="#FFD21F"/>
264
+ <ellipse cx="13.5" cy="17.5" rx="2.5" ry="3.5" fill="#fff"/>
265
+ <ellipse cx="26.5" cy="17.5" rx="2.5" ry="3.5" fill="#fff"/>
266
+ <ellipse cx="13.5" cy="18.5" rx="1.5" ry="2.5" fill="#000"/>
267
+ <ellipse cx="26.5" cy="18.5" rx="1.5" ry="2.5" fill="#000"/>
268
+ <path d="M10 25c2 3 7 5 10 5s8-2 10-5" stroke="#954C2E" stroke-width="2" stroke-linecap="round"/>
269
+ </svg>
270
+ </a>
271
+ <a href="https://huzaifasaqib-portfolio.vercel.app/" class="social-link" target="_blank" title="Portfolio"><i class="fas fa-globe"></i></a>
272
+ </div>
273
+
274
+ <div class="map-container">
275
+ <iframe
276
+ src="https://www.google.com/maps?q=House+No.11-A,+Street+No.36+near+UBL+Bank,+Abdullahpur,+Faisalabad&output=embed"
277
+ width="100%"
278
+ height="300"
279
+ style="border:0;"
280
+ allowfullscreen=""
281
+ loading="lazy">
282
+ </iframe>
283
+ </div>
284
+ </div>
285
+ </div>
286
+
287
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/js/bootstrap.bundle.min.js"></script>
288
+ <script>
289
+ // Initialize EmailJS
290
+ (function() {
291
+ emailjs.init("{{ config.EMAILJS_PUBLIC_KEY }}");
292
+ })();
293
+
294
+ let lastSubmitTime = 0;
295
+ const THROTTLE_TIME = 10000; // 10 seconds
296
+
297
+ function showToast(message, type = 'success') {
298
+ Toastify({
299
+ text: message,
300
+ duration: 3000,
301
+ gravity: "top",
302
+ position: "right",
303
+ backgroundColor: type === 'success' ? "#254D70" : "#dc3545",
304
+ }).showToast();
305
+ }
306
+
307
+ async function handleSubmit(event) {
308
+ event.preventDefault();
309
+
310
+ const currentTime = Date.now();
311
+ if (currentTime - lastSubmitTime < THROTTLE_TIME) {
312
+ showToast("Please wait a moment before sending another message.", "error");
313
+ return false;
314
+ }
315
+
316
+ const submitBtn = document.getElementById('submit-btn');
317
+ submitBtn.disabled = true;
318
+ submitBtn.classList.add('loading');
319
+
320
+ const templateParams = {
321
+ name: document.getElementById('name').value,
322
+ email: document.getElementById('email').value,
323
+ subject: document.getElementById('subject').value,
324
+ message: document.getElementById('message').value,
325
+ };
326
+
327
+ try {
328
+ const response = await emailjs.send(
329
+ "{{ config.EMAILJS_SERVICE_ID }}",
330
+ "{{ config.EMAILJS_TEMPLATE_ID }}",
331
+ templateParams
332
+ );
333
+
334
+ if (response.status === 200) {
335
+ showToast("Message sent successfully! We'll get back to you soon.");
336
+ document.getElementById('contact-form').reset();
337
+ lastSubmitTime = currentTime;
338
+ } else {
339
+ throw new Error('Failed to send message');
340
+ }
341
+ } catch (error) {
342
+ console.error('Error:', error);
343
+ showToast("Failed to send message. Please try again later.", "error");
344
+ } finally {
345
+ submitBtn.disabled = false;
346
+ submitBtn.classList.remove('loading');
347
+ }
348
+
349
+ return false;
350
+ }
351
+ </script>
352
+ </body>
353
  </html>
templates/index.html CHANGED
@@ -132,8 +132,10 @@
132
  <body>
133
  <nav class="navbar navbar-expand-lg">
134
  <div class="container">
135
- <a class="navbar-brand" href="/">
136
- <i class="fas fa-book-reader me-2"></i>Book Recommender
 
 
137
  </a>
138
  <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
139
  <span class="navbar-toggler-icon"></span>
 
132
  <body>
133
  <nav class="navbar navbar-expand-lg">
134
  <div class="container">
135
+ <a class="navbar-brand d-flex align-items-center" href="/">
136
+ <i class="fas fa-book-reader me-2"></i>
137
+ <span style="color: #fff; font-weight: 700; font-size: 1.3rem;">BookQuest</span>
138
+ <span style="color: #954C2E; font-size: 0.95rem; font-weight: 500; margin-left: 0.5rem;">Adventure in finding great reads</span>
139
  </a>
140
  <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
141
  <span class="navbar-toggler-icon"></span>
templates/recommend.html CHANGED
@@ -70,6 +70,14 @@
70
  background-color: #7a3d25;
71
  transform: translateY(-2px);
72
  }
 
 
 
 
 
 
 
 
73
  .book-card {
74
  background: white;
75
  border-radius: 10px;
@@ -78,6 +86,10 @@
78
  margin-bottom: 2rem;
79
  overflow: hidden;
80
  border: 1px solid var(--light);
 
 
 
 
81
  }
82
  .book-card:hover {
83
  transform: translateY(-5px);
@@ -85,11 +97,17 @@
85
  }
86
  .book-image {
87
  width: 100%;
88
- height: 300px;
89
  object-fit: cover;
 
90
  }
91
  .book-info {
92
- padding: 1.5rem;
 
 
 
 
 
93
  }
94
  .book-title {
95
  color: var(--primary);
@@ -114,13 +132,25 @@
114
  margin: 2rem 0;
115
  text-align: center;
116
  }
 
 
 
 
 
 
 
 
 
 
117
  </style>
118
  </head>
119
  <body>
120
  <nav class="navbar navbar-expand-lg">
121
  <div class="container">
122
- <a class="navbar-brand" href="/">
123
- <i class="fas fa-book-reader me-2"></i>Book Recommender
 
 
124
  </a>
125
  <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
126
  <span class="navbar-toggler-icon"></span>
@@ -161,9 +191,9 @@
161
 
162
  {% if data %}
163
  <h2 class="recommendation-title">Recommended Books</h2>
164
- <div class="row">
165
  {% for i in data %}
166
- <div class="col-md-3">
167
  <div class="book-card">
168
  <img src="{{ i[5] }}" class="book-image" alt="{{ i[1] }}">
169
  <div class="book-info">
 
70
  background-color: #7a3d25;
71
  transform: translateY(-2px);
72
  }
73
+ .row.g-4 {
74
+ display: flex;
75
+ flex-wrap: wrap;
76
+ }
77
+ .col-md-3 {
78
+ display: flex;
79
+ align-items: stretch;
80
+ }
81
  .book-card {
82
  background: white;
83
  border-radius: 10px;
 
86
  margin-bottom: 2rem;
87
  overflow: hidden;
88
  border: 1px solid var(--light);
89
+ display: flex;
90
+ flex-direction: column;
91
+ height: 430px;
92
+ width: 100%;
93
  }
94
  .book-card:hover {
95
  transform: translateY(-5px);
 
97
  }
98
  .book-image {
99
  width: 100%;
100
+ height: 200px;
101
  object-fit: cover;
102
+ flex-shrink: 0;
103
  }
104
  .book-info {
105
+ flex: 1 1 auto;
106
+ display: flex;
107
+ flex-direction: column;
108
+ justify-content: space-between;
109
+ padding: 1.2rem 1.5rem 1.2rem 1.5rem;
110
+ min-height: 0;
111
  }
112
  .book-title {
113
  color: var(--primary);
 
132
  margin: 2rem 0;
133
  text-align: center;
134
  }
135
+ @media (max-width: 991px) {
136
+ .book-card { height: 470px; }
137
+ }
138
+ @media (max-width: 767px) {
139
+ .book-card { height: 500px; }
140
+ }
141
+ @media (max-width: 575px) {
142
+ .book-card { height: auto; min-height: 420px; }
143
+ .book-image { height: 180px; }
144
+ }
145
  </style>
146
  </head>
147
  <body>
148
  <nav class="navbar navbar-expand-lg">
149
  <div class="container">
150
+ <a class="navbar-brand d-flex align-items-center" href="/">
151
+ <i class="fas fa-book-reader me-2"></i>
152
+ <span style="color: #fff; font-weight: 700; font-size: 1.3rem;">BookQuest</span>
153
+ <span style="color: #954C2E; font-size: 0.95rem; font-weight: 500; margin-left: 0.5rem;">Adventure in finding great reads</span>
154
  </a>
155
  <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
156
  <span class="navbar-toggler-icon"></span>
 
191
 
192
  {% if data %}
193
  <h2 class="recommendation-title">Recommended Books</h2>
194
+ <div class="row g-4 d-flex align-items-stretch">
195
  {% for i in data %}
196
+ <div class="col-md-3 d-flex align-items-stretch">
197
  <div class="book-card">
198
  <img src="{{ i[5] }}" class="book-image" alt="{{ i[1] }}">
199
  <div class="book-info">