gaialive commited on
Commit
4b7501f
·
verified ·
1 Parent(s): 17b5182

Update web/src/App.css

Browse files
Files changed (1) hide show
  1. web/src/App.css +514 -147
web/src/App.css CHANGED
@@ -1,147 +1,514 @@
1
- /* Main App Layout */
2
- .terra-app {
3
- display: flex;
4
- height: 100vh;
5
- background-color: #f4f6f8;
6
- overflow: hidden;
7
- }
8
-
9
- .terra-sidebar {
10
- /* Assuming sidebar styles are in its own CSS file */
11
- }
12
-
13
- .terra-main {
14
- flex-grow: 1;
15
- display: flex;
16
- flex-direction: column;
17
- overflow-y: auto;
18
- background-color: #e9ecef;
19
- }
20
-
21
- /* Header */
22
- .terra-header {
23
- background: #fff;
24
- padding: 20px 30px;
25
- border-bottom: 1px solid #dee2e6;
26
- display: flex;
27
- justify-content: space-between;
28
- align-items: center;
29
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
30
- }
31
-
32
- .header-left .page-title {
33
- margin: 0;
34
- font-size: 1.8rem;
35
- color: #343a40;
36
- }
37
-
38
- .header-left .page-subtitle {
39
- margin: 5px 0 0 0;
40
- font-size: 1rem;
41
- color: #6c757d;
42
- }
43
-
44
- .header-right {
45
- display: flex;
46
- align-items: center;
47
- }
48
-
49
- .header-stats {
50
- display: flex;
51
- gap: 20px;
52
- }
53
-
54
- .header-stat {
55
- display: flex;
56
- align-items: center;
57
- gap: 10px;
58
- background-color: #f8f9fa;
59
- padding: 8px 12px;
60
- border-radius: 8px;
61
- border: 1px solid #dee2e6;
62
- }
63
-
64
- .header-stat span {
65
- font-size: 1.5rem;
66
- }
67
-
68
- .header-stat > div > div:first-child {
69
- font-weight: bold;
70
- font-size: 1rem;
71
- color: #212529;
72
- }
73
-
74
- .header-stat > div > div:last-child {
75
- font-size: 0.8rem;
76
- color: #6c757d;
77
- }
78
-
79
- /* Main Content Area */
80
- .terra-content {
81
- flex-grow: 1;
82
- padding: 30px;
83
- overflow-y: auto;
84
- }
85
-
86
- /* General Card Styling */
87
- .card {
88
- background: white;
89
- border-radius: 12px;
90
- padding: 25px;
91
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
92
- border: 1px solid #e9ecef;
93
- }
94
-
95
- .grid {
96
- display: grid;
97
- gap: 25px;
98
- }
99
-
100
- .grid-2 {
101
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
102
- }
103
-
104
- .grid-3 {
105
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
106
- }
107
-
108
- .grid-4 {
109
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
110
- }
111
-
112
- /* Button Styling */
113
- .btn {
114
- padding: 10px 20px;
115
- border-radius: 8px;
116
- border: none;
117
- cursor: pointer;
118
- font-weight: bold;
119
- transition: all 0.2s ease;
120
- }
121
-
122
- .btn-primary {
123
- background-color: #2E7D32;
124
- color: white;
125
- }
126
-
127
- .btn-primary:hover {
128
- background-color: #1B5E20;
129
- }
130
-
131
- .btn-secondary {
132
- background-color: #6c757d;
133
- color: white;
134
- }
135
-
136
- .btn-secondary:hover {
137
- background-color: #5a6268;
138
- }
139
-
140
- /* Legacy styles from App.js - can be refactored or removed */
141
- .terra-sidebar.open {
142
- /* These styles might be from an older version and could conflict */
143
- }
144
-
145
- .terra-logo, .terra-nav, .terra-footer {
146
- /* These styles might be from an older version and could conflict */
147
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Grid Layouts for Dashboard */
2
+ .grid {
3
+ display: grid;
4
+ gap: 20px;
5
+ }
6
+
7
+ .grid-3 {
8
+ display: grid;
9
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
10
+ gap: 20px;
11
+ }
12
+
13
+ .grid-4 {
14
+ display: grid;
15
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
16
+ gap: 20px;
17
+ }
18
+
19
+ /* Card Component */
20
+ .card {
21
+ background: white;
22
+ border-radius: 12px;
23
+ padding: 24px;
24
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
25
+ border: 1px solid rgba(0, 0, 0, 0.1);
26
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
27
+ display: flex;
28
+ flex-direction: column;
29
+ height: 100%;
30
+ }
31
+
32
+ .card:hover {
33
+ transform: translateY(-2px);
34
+ box-shadow: 0 8px 15px rgba(0, 0, 0, 0.15);
35
+ }
36
+
37
+ /* Card content that grows to push button to bottom */
38
+ .card-content {
39
+ flex: 1;
40
+ display: flex;
41
+ flex-direction: column;
42
+ }
43
+
44
+ .card-description {
45
+ flex: 1;
46
+ margin-bottom: 20px;
47
+ }
48
+
49
+ .card-button {
50
+ margin-top: auto;
51
+ transition: all 0.2s ease;
52
+ }
53
+
54
+ .card-button:hover {
55
+ transform: translateY(-1px);
56
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
57
+ }
58
+
59
+ /* Responsive adjustments */
60
+ @media (max-width: 768px) {
61
+ .grid-3, .grid-4 {
62
+ grid-template-columns: 1fr;
63
+ }
64
+
65
+ .card {
66
+ padding: 16px;
67
+ }
68
+ }
69
+
70
+ /* Main App Container */
71
+ .terra-app {
72
+ display: flex;
73
+ height: 100vh;
74
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
75
+ }
76
+
77
+ /* Sidebar */
78
+ .terra-sidebar {
79
+ background: rgba(255, 255, 255, 0.95);
80
+ backdrop-filter: blur(10px);
81
+ color: #333;
82
+ transition: width 0.3s ease;
83
+ display: flex;
84
+ flex-direction: column;
85
+ box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
86
+ position: relative;
87
+ z-index: 100;
88
+ border-right: 1px solid rgba(0, 0, 0, 0.1);
89
+ }
90
+
91
+ .terra-sidebar.open {
92
+ width: 280px;
93
+ }
94
+
95
+ .terra-sidebar.closed {
96
+ width: 70px;
97
+ }
98
+
99
+ /* Logo Section */
100
+ .terra-logo {
101
+ padding: 24px 20px;
102
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
103
+ display: flex;
104
+ align-items: center;
105
+ min-height: 90px;
106
+ }
107
+
108
+ .logo-container {
109
+ display: flex;
110
+ align-items: center;
111
+ gap: 16px;
112
+ flex: 1;
113
+ }
114
+
115
+ .logo-icon {
116
+ font-size: 2.5rem;
117
+ }
118
+
119
+ .logo-text h1 {
120
+ font-size: 1.6rem;
121
+ font-weight: 700;
122
+ margin-bottom: 4px;
123
+ color: #2E7D32;
124
+ }
125
+
126
+ .logo-text p {
127
+ font-size: 0.8rem;
128
+ color: #666;
129
+ }
130
+
131
+ /* Navigation */
132
+ .terra-nav {
133
+ flex: 1;
134
+ padding: 16px 0;
135
+ overflow-y: auto;
136
+ }
137
+
138
+ .terra-nav::-webkit-scrollbar {
139
+ width: 4px;
140
+ }
141
+
142
+ .terra-nav::-webkit-scrollbar-track {
143
+ background: transparent;
144
+ }
145
+
146
+ .terra-nav::-webkit-scrollbar-thumb {
147
+ background: rgba(0, 0, 0, 0.2);
148
+ border-radius: 2px;
149
+ }
150
+
151
+ .nav-item {
152
+ display: flex;
153
+ align-items: center;
154
+ padding: 14px 20px;
155
+ margin: 3px 12px;
156
+ border-radius: 8px;
157
+ cursor: pointer;
158
+ transition: all 0.3s ease;
159
+ position: relative;
160
+ color: #333;
161
+ }
162
+
163
+ .nav-item:hover {
164
+ background: rgba(46, 125, 50, 0.1);
165
+ transform: translateX(2px);
166
+ }
167
+
168
+ .nav-item.active {
169
+ background: rgba(46, 125, 50, 0.15);
170
+ border-left: 3px solid #2E7D32;
171
+ color: #2E7D32;
172
+ }
173
+
174
+ .nav-icon {
175
+ font-size: 1.5rem;
176
+ margin-right: 14px;
177
+ min-width: 28px;
178
+ text-align: center;
179
+ }
180
+
181
+ .nav-content {
182
+ flex: 1;
183
+ }
184
+
185
+ .nav-name {
186
+ font-weight: 600;
187
+ font-size: 0.95rem;
188
+ display: block;
189
+ margin-bottom: 3px;
190
+ }
191
+
192
+ .nav-desc {
193
+ font-size: 0.75rem;
194
+ opacity: 0.7;
195
+ color: #666;
196
+ }
197
+
198
+ /* Sidebar Footer */
199
+ .sidebar-footer {
200
+ padding: 20px;
201
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
202
+ }
203
+
204
+ .footer-stats {
205
+ display: flex;
206
+ gap: 16px;
207
+ }
208
+
209
+ .stat {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 10px;
213
+ flex: 1;
214
+ }
215
+
216
+ .stat-icon {
217
+ font-size: 1.3rem;
218
+ }
219
+
220
+ .stat-value {
221
+ font-weight: 700;
222
+ font-size: 0.95rem;
223
+ color: #2E7D32;
224
+ }
225
+
226
+ .stat-label {
227
+ font-size: 0.7rem;
228
+ color: #666;
229
+ }
230
+
231
+ /* Main Content */
232
+ .terra-main {
233
+ flex: 1;
234
+ display: flex;
235
+ flex-direction: column;
236
+ background: linear-gradient(135deg, #f8fdf8 0%, #f0f9f0 100%);
237
+ }
238
+
239
+ /* Header */
240
+ .terra-header {
241
+ background: rgba(255, 255, 255, 0.95);
242
+ backdrop-filter: blur(10px);
243
+ border-bottom: 1px solid rgba(76, 175, 80, 0.1);
244
+ padding: 24px 32px;
245
+ display: flex;
246
+ justify-content: space-between;
247
+ align-items: center;
248
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
249
+ }
250
+
251
+ .header-left {
252
+ flex: 1;
253
+ }
254
+
255
+ .page-title {
256
+ display: flex;
257
+ align-items: center;
258
+ gap: 16px;
259
+ margin: 0 0 8px 0;
260
+ color: #2d5016;
261
+ font-size: 2rem;
262
+ font-weight: 700;
263
+ }
264
+
265
+ .title-icon {
266
+ font-size: 2.2rem;
267
+ }
268
+
269
+ .page-subtitle {
270
+ margin: 0;
271
+ color: #4a7c23;
272
+ font-size: 1rem;
273
+ font-weight: 500;
274
+ }
275
+
276
+ .header-right {
277
+ display: flex;
278
+ align-items: center;
279
+ }
280
+
281
+ .header-stats {
282
+ display: flex;
283
+ gap: 20px;
284
+ }
285
+
286
+ .header-stat {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 12px;
290
+ background: rgba(76, 175, 80, 0.1);
291
+ padding: 16px 20px;
292
+ border-radius: 12px;
293
+ border: 1px solid rgba(76, 175, 80, 0.2);
294
+ transition: all 0.3s ease;
295
+ }
296
+
297
+ .header-stat:hover {
298
+ background: rgba(76, 175, 80, 0.15);
299
+ transform: translateY(-2px);
300
+ }
301
+
302
+ .header-stat span {
303
+ font-size: 1.6rem;
304
+ }
305
+
306
+ .header-stat > div > div:first-child {
307
+ font-weight: 700;
308
+ font-size: 1.2rem;
309
+ color: #2d5016;
310
+ }
311
+
312
+ .header-stat > div > div:last-child {
313
+ font-size: 0.8rem;
314
+ color: #4a7c23;
315
+ font-weight: 500;
316
+ }
317
+
318
+ /* Content Area */
319
+ .terra-content {
320
+ flex: 1;
321
+ padding: 32px;
322
+ overflow-y: auto;
323
+ background: transparent;
324
+ }
325
+
326
+ .terra-content::-webkit-scrollbar {
327
+ width: 8px;
328
+ }
329
+
330
+ .terra-content::-webkit-scrollbar-track {
331
+ background: rgba(76, 175, 80, 0.1);
332
+ border-radius: 4px;
333
+ }
334
+
335
+ .terra-content::-webkit-scrollbar-thumb {
336
+ background: rgba(76, 175, 80, 0.3);
337
+ border-radius: 4px;
338
+ }
339
+
340
+ .terra-content::-webkit-scrollbar-thumb:hover {
341
+ background: rgba(76, 175, 80, 0.5);
342
+ }
343
+
344
+ /* Page Transition Animation */
345
+ .terra-content > * {
346
+ animation: fadeInUp 0.5s ease-out;
347
+ }
348
+
349
+ @keyframes fadeInUp {
350
+ from {
351
+ opacity: 0;
352
+ transform: translateY(20px);
353
+ }
354
+ to {
355
+ opacity: 1;
356
+ transform: translateY(0);
357
+ }
358
+ }
359
+
360
+ /* Responsive Design */
361
+ @media (max-width: 1024px) {
362
+ .terra-sidebar.open {
363
+ width: 260px;
364
+ }
365
+
366
+ .header-stats {
367
+ gap: 16px;
368
+ }
369
+
370
+ .header-stat {
371
+ padding: 12px 16px;
372
+ }
373
+ }
374
+
375
+ @media (max-width: 768px) {
376
+ .terra-sidebar {
377
+ position: fixed;
378
+ left: 0;
379
+ top: 0;
380
+ height: 100vh;
381
+ z-index: 1000;
382
+ transform: translateX(-100%);
383
+ transition: transform 0.3s ease;
384
+ }
385
+
386
+ .terra-sidebar.open {
387
+ transform: translateX(0);
388
+ width: 280px;
389
+ }
390
+
391
+ .terra-sidebar.closed {
392
+ transform: translateX(-100%);
393
+ }
394
+
395
+ .terra-header {
396
+ padding: 20px 24px;
397
+ flex-direction: column;
398
+ align-items: flex-start;
399
+ gap: 16px;
400
+ }
401
+
402
+ .header-stats {
403
+ width: 100%;
404
+ justify-content: space-between;
405
+ flex-wrap: wrap;
406
+ gap: 12px;
407
+ }
408
+
409
+ .header-stat {
410
+ flex: 1;
411
+ min-width: 140px;
412
+ padding: 12px 16px;
413
+ }
414
+
415
+ .terra-content {
416
+ padding: 24px 20px;
417
+ }
418
+
419
+ .page-title {
420
+ font-size: 1.6rem;
421
+ }
422
+
423
+ .title-icon {
424
+ font-size: 1.8rem;
425
+ }
426
+ }
427
+
428
+ @media (max-width: 480px) {
429
+ .terra-logo {
430
+ padding: 20px 16px;
431
+ }
432
+
433
+ .logo-text h1 {
434
+ font-size: 1.3rem;
435
+ }
436
+
437
+ .nav-item {
438
+ padding: 12px 16px;
439
+ margin: 2px 8px;
440
+ }
441
+
442
+ .nav-name {
443
+ font-size: 0.9rem;
444
+ }
445
+
446
+ .nav-desc {
447
+ font-size: 0.7rem;
448
+ }
449
+
450
+ .header-stats {
451
+ flex-direction: column;
452
+ width: 100%;
453
+ }
454
+
455
+ .header-stat {
456
+ width: 100%;
457
+ }
458
+
459
+ .terra-content {
460
+ padding: 20px 16px;
461
+ }
462
+ }
463
+
464
+ /* Focus States for Accessibility */
465
+ .nav-item:focus,
466
+ .sidebar-toggle:focus,
467
+ .header-stat:focus {
468
+ outline: 2px solid #a8e6a3;
469
+ outline-offset: 2px;
470
+ }
471
+
472
+ /* High Contrast Mode */
473
+ @media (prefers-contrast: high) {
474
+ .terra-sidebar {
475
+ background: #2d5016;
476
+ }
477
+
478
+ .nav-item.active {
479
+ background: rgba(255, 255, 255, 0.3);
480
+ }
481
+ }
482
+
483
+ /* Reduced Motion */
484
+ @media (prefers-reduced-motion: reduce) {
485
+ * {
486
+ animation-duration: 0.01ms !important;
487
+ animation-iteration-count: 1 !important;
488
+ transition-duration: 0.01ms !important;
489
+ }
490
+ }
491
+ /*
492
+ Global Button Styles */
493
+ button {
494
+ transition: all 0.3s ease;
495
+ }
496
+
497
+ button:hover:not(:disabled) {
498
+ transform: translateY(-2px);
499
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
500
+ }
501
+
502
+ button:active:not(:disabled) {
503
+ transform: translateY(0);
504
+ }
505
+
506
+ button:disabled {
507
+ opacity: 0.6;
508
+ cursor: not-allowed !important;
509
+ }
510
+
511
+ /* Ensure all buttons have proper cursor */
512
+ button:not(:disabled) {
513
+ cursor: pointer;
514
+ }