kamau1 commited on
Commit
d7d43e6
Β·
1 Parent(s): b41d80d

style: remove emojis from startup logs and add developer attribution banner

Browse files
src/app/main.py CHANGED
@@ -30,11 +30,15 @@ app = FastAPI(
30
  @app.on_event("startup")
31
  async def startup_event():
32
  """Initialize the application on startup"""
33
- logger.info(f"πŸš€ Starting {settings.APP_NAME} v1.0.0")
34
- logger.info(f"πŸ“Š Environment: {settings.ENVIRONMENT}")
35
- logger.info(f"πŸ—„οΈ Database: Connected to Supabase")
36
- logger.info(f"πŸ”‘ Supabase URL: {settings.SUPABASE_URL}")
37
- logger.info("βœ… Application startup complete")
 
 
 
 
38
 
39
  # Mount static files
40
  app.mount("/static", StaticFiles(directory=str(static_dir)), name="static")
 
30
  @app.on_event("startup")
31
  async def startup_event():
32
  """Initialize the application on startup"""
33
+ logger.info("=" * 60)
34
+ logger.info("Built by Lewis Kimaru")
35
+ logger.info("=" * 60)
36
+ logger.info(f"Starting {settings.APP_NAME} v1.0.0")
37
+ logger.info(f"Environment: {settings.ENVIRONMENT}")
38
+ logger.info(f"Database: Connected to Supabase")
39
+ logger.info(f"Supabase URL: {settings.SUPABASE_URL}")
40
+ logger.info("Application startup complete")
41
+ logger.info("=" * 60)
42
 
43
  # Mount static files
44
  app.mount("/static", StaticFiles(directory=str(static_dir)), name="static")
src/app/static/css/main.css CHANGED
@@ -1,4 +1,4 @@
1
- /* SwiftOps API - Main Stylesheet */
2
 
3
  * {
4
  margin: 0;
@@ -6,174 +6,140 @@
6
  box-sizing: border-box;
7
  }
8
 
9
- :root {
10
- --bg-primary: #ffffff;
11
- --bg-secondary: #f8f9fa;
12
- --bg-card: #ffffff;
13
- --text-primary: #1a1a1a;
14
- --text-secondary: #6c757d;
15
- --border-color: #dee2e6;
16
- --accent-color: #0066cc;
17
- --accent-hover: #0052a3;
18
- --success-color: #28a745;
19
- --shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
20
- }
21
-
22
- @media (prefers-color-scheme: dark) {
23
- :root {
24
- --bg-primary: #1a1a1a;
25
- --bg-secondary: #2d2d2d;
26
- --bg-card: #2d2d2d;
27
- --text-primary: #ffffff;
28
- --text-secondary: #b0b0b0;
29
- --border-color: #404040;
30
- --accent-color: #4da3ff;
31
- --accent-hover: #66b3ff;
32
- --success-color: #4caf50;
33
- --shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
34
- }
35
- }
36
-
37
  body {
38
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
39
- background: var(--bg-primary);
40
- color: var(--text-primary);
41
  line-height: 1.6;
42
  min-height: 100vh;
43
  display: flex;
44
  flex-direction: column;
 
 
45
  }
46
 
47
  .container {
48
- max-width: 1200px;
 
49
  margin: 0 auto;
50
- padding: 2rem;
51
- flex: 1;
52
  }
53
 
54
  header {
55
  text-align: center;
56
- padding: 3rem 0 2rem;
57
- border-bottom: 1px solid var(--border-color);
58
  margin-bottom: 3rem;
59
  }
60
 
61
- .logo {
62
- font-size: 3rem;
63
- margin-bottom: 0.5rem;
64
- }
65
-
66
  h1 {
67
  font-size: 2.5rem;
68
  font-weight: 700;
69
  margin-bottom: 0.5rem;
70
- color: var(--text-primary);
 
71
  }
72
 
73
- .version {
74
- display: inline-block;
75
- background: var(--accent-color);
76
- color: white;
77
- padding: 0.25rem 0.75rem;
78
- border-radius: 20px;
79
- font-size: 0.875rem;
80
  font-weight: 600;
81
- margin-left: 1rem;
82
  }
83
 
84
- .description {
85
- font-size: 1.125rem;
86
- color: var(--text-secondary);
87
- margin-top: 1rem;
88
- max-width: 600px;
89
- margin-left: auto;
90
- margin-right: auto;
91
  }
92
 
93
- .status-badge {
94
- display: inline-flex;
95
- align-items: center;
96
- gap: 0.5rem;
97
- background: var(--bg-secondary);
98
- padding: 0.5rem 1rem;
99
- border-radius: 8px;
100
- margin-top: 1.5rem;
101
- font-weight: 500;
102
  }
103
 
104
- .status-dot {
105
- width: 8px;
106
- height: 8px;
107
- background: var(--success-color);
108
- border-radius: 50%;
109
- animation: pulse 2s infinite;
110
  }
111
 
112
- @keyframes pulse {
113
- 0%, 100% { opacity: 1; }
114
- 50% { opacity: 0.5; }
 
115
  }
116
 
117
  .cards {
118
  display: grid;
119
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
120
- gap: 1.5rem;
121
- margin-top: 2rem;
122
  }
123
 
124
  .card {
125
- background: var(--bg-card);
126
- border: 1px solid var(--border-color);
127
- border-radius: 12px;
128
  padding: 1.5rem;
129
- box-shadow: var(--shadow);
130
- transition: transform 0.2s, box-shadow 0.2s;
 
 
 
 
131
  }
132
 
133
  .card:hover {
134
- transform: translateY(-4px);
135
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
 
136
  }
137
 
138
  .card h3 {
139
- font-size: 1.25rem;
140
- margin-bottom: 0.75rem;
141
- color: var(--text-primary);
 
142
  }
143
 
144
  .card p {
145
- color: var(--text-secondary);
146
- margin-bottom: 1rem;
 
147
  }
148
 
149
- .endpoints {
150
- margin-top: 3rem;
151
  }
152
 
153
- .endpoints h2 {
154
- font-size: 1.75rem;
155
  margin-bottom: 1.5rem;
156
- color: var(--text-primary);
 
157
  }
158
 
159
  .endpoint {
160
- background: var(--bg-card);
161
- border: 1px solid var(--border-color);
162
  border-radius: 8px;
163
  padding: 1.25rem;
164
  margin-bottom: 1rem;
165
- transition: border-color 0.2s;
166
- }
167
-
168
- .endpoint:hover {
169
- border-color: var(--accent-color);
170
  }
171
 
172
- .endpoint-header {
173
  display: flex;
174
  align-items: center;
175
  gap: 1rem;
176
- margin-bottom: 0.75rem;
177
  }
178
 
179
  .method {
@@ -181,153 +147,125 @@ h1 {
181
  padding: 0.25rem 0.75rem;
182
  border-radius: 4px;
183
  font-weight: 600;
184
- font-size: 0.875rem;
185
  font-family: 'Courier New', monospace;
 
 
 
 
186
  text-transform: uppercase;
187
  }
188
 
189
- .method.get {
190
- background: #e3f2fd;
191
- color: #1976d2;
192
- }
193
-
194
  .method.post {
195
- background: #e8f5e9;
196
- color: #388e3c;
197
  }
198
 
199
  .method.put {
200
- background: #fff3e0;
201
- color: #f57c00;
202
  }
203
 
204
  .method.patch {
205
- background: #f3e5f5;
206
- color: #7b1fa2;
207
  }
208
 
209
  .method.delete {
210
- background: #ffebee;
211
- color: #d32f2f;
212
- }
213
-
214
- @media (prefers-color-scheme: dark) {
215
- .method.get {
216
- background: #1e3a5f;
217
- color: #64b5f6;
218
- }
219
-
220
- .method.post {
221
- background: #1b5e20;
222
- color: #81c784;
223
- }
224
-
225
- .method.put {
226
- background: #e65100;
227
- color: #ffb74d;
228
- }
229
-
230
- .method.patch {
231
- background: #4a148c;
232
- color: #ba68c8;
233
- }
234
-
235
- .method.delete {
236
- background: #b71c1c;
237
- color: #ef5350;
238
- }
239
  }
240
 
241
  .endpoint-path {
242
  font-family: 'Courier New', monospace;
243
- font-size: 1rem;
244
- color: var(--text-primary);
245
  font-weight: 500;
246
  }
247
 
248
- .endpoint-description {
249
- color: var(--text-secondary);
250
- margin-bottom: 0.5rem;
 
 
 
 
 
 
 
251
  }
252
 
253
- .endpoint-status {
254
- display: inline-flex;
255
- align-items: center;
256
- gap: 0.5rem;
257
- font-size: 0.875rem;
258
- color: var(--success-color);
259
- font-weight: 500;
260
  }
261
 
262
- .link-button {
263
- display: inline-block;
264
- background: var(--accent-color);
265
- color: white;
266
- padding: 0.75rem 1.5rem;
267
- border-radius: 8px;
268
- text-decoration: none;
269
- font-weight: 600;
270
- transition: background 0.2s, transform 0.2s;
271
- margin-top: 1rem;
272
  }
273
 
274
- .link-button:hover {
275
- background: var(--accent-hover);
276
- transform: translateY(-2px);
 
 
 
 
 
 
277
  }
278
 
279
  footer {
280
  text-align: center;
281
- padding: 2rem;
282
- border-top: 1px solid var(--border-color);
283
- color: var(--text-secondary);
284
- margin-top: 3rem;
 
 
 
285
  }
286
 
287
- .footer-links {
288
  display: flex;
289
- justify-content: center;
290
- gap: 2rem;
291
- margin-top: 1rem;
292
  }
293
 
294
- .footer-links a {
295
- color: var(--accent-color);
296
  text-decoration: none;
297
- font-weight: 500;
298
  transition: color 0.2s;
299
  }
300
 
301
- .footer-links a:hover {
302
- text-decoration: underline;
303
  }
304
 
305
  @media (max-width: 768px) {
306
- .container {
307
- padding: 1rem;
308
- }
309
-
310
- h1 {
311
- font-size: 2rem;
312
- }
313
-
314
- .version {
315
- display: block;
316
- margin: 0.5rem auto 0;
317
- width: fit-content;
318
- }
319
-
320
  .cards {
321
  grid-template-columns: 1fr;
322
  }
323
 
324
- .endpoint-header {
325
  flex-direction: column;
326
  align-items: flex-start;
 
 
 
 
 
327
  }
328
 
329
- .footer-links {
330
  flex-direction: column;
331
  gap: 0.5rem;
332
  }
 
 
 
 
333
  }
 
1
+ /* SwiftOps API - Main Stylesheet - Dark Mode */
2
 
3
  * {
4
  margin: 0;
 
6
  box-sizing: border-box;
7
  }
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  body {
10
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
11
+ background: #0a0a0a;
12
+ color: #e0e0e0;
13
  line-height: 1.6;
14
  min-height: 100vh;
15
  display: flex;
16
  flex-direction: column;
17
+ align-items: center;
18
+ padding: 2rem 1rem;
19
  }
20
 
21
  .container {
22
+ width: 100%;
23
+ max-width: 800px;
24
  margin: 0 auto;
 
 
25
  }
26
 
27
  header {
28
  text-align: center;
29
+ padding: 2rem 0 3rem;
30
+ border-bottom: 1px solid #2a2a2a;
31
  margin-bottom: 3rem;
32
  }
33
 
 
 
 
 
 
34
  h1 {
35
  font-size: 2.5rem;
36
  font-weight: 700;
37
  margin-bottom: 0.5rem;
38
+ color: #ffffff;
39
+ letter-spacing: -0.5px;
40
  }
41
 
42
+ h2 {
43
+ font-size: 1.5rem;
44
+ margin-bottom: 1.5rem;
45
+ color: #ffffff;
 
 
 
46
  font-weight: 600;
 
47
  }
48
 
49
+ h3 {
50
+ font-size: 1rem;
51
+ margin-bottom: 0.5rem;
52
+ color: #ffffff;
53
+ font-weight: 600;
 
 
54
  }
55
 
56
+ p {
57
+ color: #888;
58
+ line-height: 1.6;
59
+ }
60
+
61
+ a {
62
+ color: #4a9eff;
63
+ text-decoration: none;
64
+ transition: color 0.2s;
65
  }
66
 
67
+ a:hover {
68
+ color: #64b5f6;
 
 
 
 
69
  }
70
 
71
+ .description {
72
+ font-size: 1rem;
73
+ color: #888;
74
+ margin-top: 0.5rem;
75
  }
76
 
77
  .cards {
78
  display: grid;
79
+ grid-template-columns: repeat(3, 1fr);
80
+ gap: 1rem;
81
+ margin-bottom: 3rem;
82
  }
83
 
84
  .card {
85
+ background: #1a1a1a;
86
+ border: 1px solid #2a2a2a;
87
+ border-radius: 8px;
88
  padding: 1.5rem;
89
+ text-align: center;
90
+ transition: all 0.2s;
91
+ cursor: pointer;
92
+ text-decoration: none;
93
+ color: inherit;
94
+ display: block;
95
  }
96
 
97
  .card:hover {
98
+ border-color: #4a9eff;
99
+ transform: translateY(-2px);
100
+ box-shadow: 0 4px 12px rgba(74, 158, 255, 0.1);
101
  }
102
 
103
  .card h3 {
104
+ font-size: 1rem;
105
+ margin-bottom: 0.5rem;
106
+ color: #ffffff;
107
+ font-weight: 600;
108
  }
109
 
110
  .card p {
111
+ font-size: 0.875rem;
112
+ color: #888;
113
+ line-height: 1.4;
114
  }
115
 
116
+ .endpoints-section {
117
+ margin-bottom: 3rem;
118
  }
119
 
120
+ .endpoints-section h2 {
121
+ font-size: 1.5rem;
122
  margin-bottom: 1.5rem;
123
+ color: #ffffff;
124
+ font-weight: 600;
125
  }
126
 
127
  .endpoint {
128
+ background: #1a1a1a;
129
+ border: 1px solid #2a2a2a;
130
  border-radius: 8px;
131
  padding: 1.25rem;
132
  margin-bottom: 1rem;
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: space-between;
 
 
136
  }
137
 
138
+ .endpoint-left {
139
  display: flex;
140
  align-items: center;
141
  gap: 1rem;
142
+ flex: 1;
143
  }
144
 
145
  .method {
 
147
  padding: 0.25rem 0.75rem;
148
  border-radius: 4px;
149
  font-weight: 600;
150
+ font-size: 0.75rem;
151
  font-family: 'Courier New', monospace;
152
+ background: #1e3a5f;
153
+ color: #64b5f6;
154
+ min-width: 50px;
155
+ text-align: center;
156
  text-transform: uppercase;
157
  }
158
 
 
 
 
 
 
159
  .method.post {
160
+ background: #1b5e20;
161
+ color: #81c784;
162
  }
163
 
164
  .method.put {
165
+ background: #e65100;
166
+ color: #ffb74d;
167
  }
168
 
169
  .method.patch {
170
+ background: #4a148c;
171
+ color: #ba68c8;
172
  }
173
 
174
  .method.delete {
175
+ background: #b71c1c;
176
+ color: #ef5350;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  }
178
 
179
  .endpoint-path {
180
  font-family: 'Courier New', monospace;
181
+ font-size: 0.95rem;
182
+ color: #e0e0e0;
183
  font-weight: 500;
184
  }
185
 
186
+ .copy-btn, .btn {
187
+ background: #2a2a2a;
188
+ border: 1px solid #3a3a3a;
189
+ color: #888;
190
+ padding: 0.5rem 1rem;
191
+ border-radius: 6px;
192
+ cursor: pointer;
193
+ font-size: 0.875rem;
194
+ transition: all 0.2s;
195
+ font-family: inherit;
196
  }
197
 
198
+ .copy-btn:hover, .btn:hover {
199
+ background: #3a3a3a;
200
+ color: #4a9eff;
201
+ border-color: #4a9eff;
 
 
 
202
  }
203
 
204
+ .copy-btn.copied {
205
+ background: #1e4d2b;
206
+ color: #4ade80;
207
+ border-color: #4ade80;
 
 
 
 
 
 
208
  }
209
 
210
+ .btn-primary {
211
+ background: #1e3a5f;
212
+ color: #64b5f6;
213
+ border-color: #1e3a5f;
214
+ }
215
+
216
+ .btn-primary:hover {
217
+ background: #2a4a6f;
218
+ border-color: #4a9eff;
219
  }
220
 
221
  footer {
222
  text-align: center;
223
+ padding: 2rem 0;
224
+ border-top: 1px solid #2a2a2a;
225
+ color: #666;
226
+ font-size: 0.875rem;
227
+ margin-top: auto;
228
+ width: 100%;
229
+ max-width: 800px;
230
  }
231
 
232
+ .footer-content {
233
  display: flex;
234
+ justify-content: space-between;
235
+ align-items: center;
 
236
  }
237
 
238
+ .footer-link {
239
+ color: #4a9eff;
240
  text-decoration: none;
 
241
  transition: color 0.2s;
242
  }
243
 
244
+ .footer-link:hover {
245
+ color: #64b5f6;
246
  }
247
 
248
  @media (max-width: 768px) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  .cards {
250
  grid-template-columns: 1fr;
251
  }
252
 
253
+ .endpoint {
254
  flex-direction: column;
255
  align-items: flex-start;
256
+ gap: 1rem;
257
+ }
258
+
259
+ .copy-btn {
260
+ width: 100%;
261
  }
262
 
263
+ .footer-content {
264
  flex-direction: column;
265
  gap: 0.5rem;
266
  }
267
+
268
+ h1 {
269
+ font-size: 2rem;
270
+ }
271
  }
src/app/templates/base.html CHANGED
@@ -6,19 +6,198 @@
6
  <meta name="description" content="{% block meta_description %}SwiftOps API - Field Service Management Platform{% endblock %}">
7
  <title>{% block title %}SwiftOps API{% endblock %}</title>
8
 
9
- <!-- Favicon -->
10
- <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>πŸš€</text></svg>">
11
-
12
- <!-- Styles -->
13
- <link rel="stylesheet" href="{{ url_for('static', path='/css/main.css') }}">
14
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  {% block extra_css %}{% endblock %}
16
  </head>
17
  <body>
18
  {% block content %}{% endblock %}
19
 
20
- <!-- Scripts -->
21
- <script src="{{ url_for('static', path='/js/main.js') }}"></script>
22
  {% block extra_js %}{% endblock %}
23
  </body>
24
  </html>
 
6
  <meta name="description" content="{% block meta_description %}SwiftOps API - Field Service Management Platform{% endblock %}">
7
  <title>{% block title %}SwiftOps API{% endblock %}</title>
8
 
9
+ <style>
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ body {
17
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
18
+ background: #0a0a0a;
19
+ color: #e0e0e0;
20
+ line-height: 1.6;
21
+ min-height: 100vh;
22
+ display: flex;
23
+ flex-direction: column;
24
+ align-items: center;
25
+ padding: 2rem 1rem;
26
+ }
27
+
28
+ .container {
29
+ width: 100%;
30
+ max-width: 800px;
31
+ margin: 0 auto;
32
+ }
33
+
34
+ header {
35
+ text-align: center;
36
+ padding: 2rem 0 3rem;
37
+ border-bottom: 1px solid #2a2a2a;
38
+ margin-bottom: 3rem;
39
+ }
40
+
41
+ h1 {
42
+ font-size: 2.5rem;
43
+ font-weight: 700;
44
+ margin-bottom: 0.5rem;
45
+ color: #ffffff;
46
+ letter-spacing: -0.5px;
47
+ }
48
+
49
+ h2 {
50
+ font-size: 1.5rem;
51
+ margin-bottom: 1.5rem;
52
+ color: #ffffff;
53
+ font-weight: 600;
54
+ }
55
+
56
+ h3 {
57
+ font-size: 1rem;
58
+ margin-bottom: 0.5rem;
59
+ color: #ffffff;
60
+ font-weight: 600;
61
+ }
62
+
63
+ p {
64
+ color: #888;
65
+ line-height: 1.6;
66
+ }
67
+
68
+ a {
69
+ color: #4a9eff;
70
+ text-decoration: none;
71
+ transition: color 0.2s;
72
+ }
73
+
74
+ a:hover {
75
+ color: #64b5f6;
76
+ }
77
+
78
+ .description {
79
+ font-size: 1rem;
80
+ color: #888;
81
+ margin-top: 0.5rem;
82
+ }
83
+
84
+ .cards {
85
+ display: grid;
86
+ grid-template-columns: repeat(3, 1fr);
87
+ gap: 1rem;
88
+ margin-bottom: 3rem;
89
+ }
90
+
91
+ .card {
92
+ background: #1a1a1a;
93
+ border: 1px solid #2a2a2a;
94
+ border-radius: 8px;
95
+ padding: 1.5rem;
96
+ text-align: center;
97
+ transition: all 0.2s;
98
+ cursor: pointer;
99
+ text-decoration: none;
100
+ color: inherit;
101
+ display: block;
102
+ }
103
+
104
+ .card:hover {
105
+ border-color: #4a9eff;
106
+ transform: translateY(-2px);
107
+ box-shadow: 0 4px 12px rgba(74, 158, 255, 0.1);
108
+ }
109
+
110
+ .card h3 {
111
+ font-size: 1rem;
112
+ margin-bottom: 0.5rem;
113
+ color: #ffffff;
114
+ font-weight: 600;
115
+ }
116
+
117
+ .card p {
118
+ font-size: 0.875rem;
119
+ color: #888;
120
+ line-height: 1.4;
121
+ }
122
+
123
+ .btn {
124
+ background: #2a2a2a;
125
+ border: 1px solid #3a3a3a;
126
+ color: #e0e0e0;
127
+ padding: 0.75rem 1.5rem;
128
+ border-radius: 6px;
129
+ cursor: pointer;
130
+ font-size: 0.875rem;
131
+ transition: all 0.2s;
132
+ font-family: inherit;
133
+ text-decoration: none;
134
+ display: inline-block;
135
+ }
136
+
137
+ .btn:hover {
138
+ background: #3a3a3a;
139
+ color: #4a9eff;
140
+ border-color: #4a9eff;
141
+ }
142
+
143
+ .btn-primary {
144
+ background: #1e3a5f;
145
+ color: #64b5f6;
146
+ border-color: #1e3a5f;
147
+ }
148
+
149
+ .btn-primary:hover {
150
+ background: #2a4a6f;
151
+ border-color: #4a9eff;
152
+ }
153
+
154
+ footer {
155
+ text-align: center;
156
+ padding: 2rem 0;
157
+ border-top: 1px solid #2a2a2a;
158
+ color: #666;
159
+ font-size: 0.875rem;
160
+ margin-top: auto;
161
+ width: 100%;
162
+ max-width: 800px;
163
+ }
164
+
165
+ .footer-content {
166
+ display: flex;
167
+ justify-content: space-between;
168
+ align-items: center;
169
+ }
170
+
171
+ .footer-link {
172
+ color: #4a9eff;
173
+ text-decoration: none;
174
+ transition: color 0.2s;
175
+ }
176
+
177
+ .footer-link:hover {
178
+ color: #64b5f6;
179
+ }
180
+
181
+ @media (max-width: 768px) {
182
+ .cards {
183
+ grid-template-columns: 1fr;
184
+ }
185
+
186
+ .footer-content {
187
+ flex-direction: column;
188
+ gap: 0.5rem;
189
+ }
190
+
191
+ h1 {
192
+ font-size: 2rem;
193
+ }
194
+ }
195
+ </style>
196
  {% block extra_css %}{% endblock %}
197
  </head>
198
  <body>
199
  {% block content %}{% endblock %}
200
 
 
 
201
  {% block extra_js %}{% endblock %}
202
  </body>
203
  </html>