Karan6124 commited on
Commit
cd82a7e
·
1 Parent(s): 9fc8a82

style: premium dashboard UI overhaul — design tokens, refined panels and animations

Browse files
frontend/src/App.css CHANGED
@@ -1,13 +1,35 @@
1
- /* App Layout & Component Grid Styles */
 
 
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  .app-container {
4
  display: flex;
5
  flex-direction: column;
6
  min-height: 100vh;
7
  width: 100%;
 
8
  }
9
 
10
- /* 1. Login Page Styles */
11
  .login-page {
12
  display: flex;
13
  align-items: center;
@@ -86,38 +108,43 @@
86
  border-color: var(--neon-violet);
87
  }
88
 
89
- /* 2. Main Dashboard Styles */
90
  .dashboard-header {
91
  display: flex;
92
  align-items: center;
93
  justify-content: space-between;
94
- padding: 16px 24px;
 
95
  border-bottom: 1px solid var(--border-glass);
96
- background: rgba(6, 7, 13, 0.8);
97
- backdrop-filter: blur(10px);
 
98
  position: sticky;
99
  top: 0;
100
  z-index: 100;
 
101
  }
102
 
103
  .header-left {
104
  display: flex;
105
  align-items: center;
106
- gap: 12px;
 
107
  }
108
 
109
  .logo-text {
110
- font-size: 22px;
111
  font-weight: 700;
112
  background: linear-gradient(135deg, var(--neon-cyan), var(--neon-violet));
113
  -webkit-background-clip: text;
114
  -webkit-text-fill-color: transparent;
 
115
  }
116
 
117
  .header-right {
118
  display: flex;
119
  align-items: center;
120
- gap: 20px;
121
  }
122
 
123
  .credits-badge {
@@ -125,28 +152,39 @@
125
  align-items: center;
126
  gap: 8px;
127
  background: rgba(161, 84, 255, 0.08);
128
- border: 1px solid rgba(161, 84, 255, 0.25);
129
- padding: 6px 12px;
130
  border-radius: 99px;
131
- font-size: 14px;
132
  font-weight: 600;
133
  color: var(--neon-violet);
 
 
 
 
 
134
  }
135
 
136
  .recharge-btn {
137
  background: linear-gradient(135deg, var(--neon-cyan), var(--neon-violet));
138
- color: #000000;
139
- font-weight: 600;
140
- font-size: 12px;
141
- padding: 4px 10px;
 
142
  border-radius: 99px;
143
- box-shadow: 0 0 10px rgba(0, 242, 254, 0.3);
 
 
 
 
 
144
  }
145
 
146
  .user-profile {
147
  display: flex;
148
  align-items: center;
149
- gap: 10px;
150
  }
151
 
152
  .avatar {
@@ -157,25 +195,26 @@
157
 
158
  .avatar-upload-wrapper {
159
  position: relative;
160
- width: 32px;
161
- height: 32px;
162
  border-radius: 50%;
163
- border: 1px solid var(--neon-cyan);
164
  overflow: hidden;
165
  cursor: pointer;
166
  background: rgba(255, 255, 255, 0.05);
167
  display: flex;
168
  align-items: center;
169
  justify-content: center;
170
- transition: border-color 0.2s ease, transform 0.1s ease;
171
  }
172
 
173
  .avatar-upload-wrapper:hover {
174
- border-color: #ffffff;
 
175
  }
176
 
177
  .avatar-upload-wrapper:active {
178
- transform: scale(0.95);
179
  }
180
 
181
  .avatar-hover-overlay {
@@ -203,18 +242,23 @@
203
  }
204
 
205
  .profile-name {
206
- font-size: 14px;
207
  color: var(--text-primary);
208
  font-weight: 500;
 
209
  }
210
 
211
  .logout-btn {
 
 
 
212
  background: transparent;
213
- color: var(--text-secondary);
214
  border: 1px solid var(--border-glass);
215
- padding: 6px 12px;
216
- border-radius: 6px;
217
- font-size: 13px;
 
218
  }
219
 
220
  .logout-btn:hover {
@@ -223,21 +267,22 @@
223
  color: var(--bear-red);
224
  }
225
 
226
- /* 3. Grid Structure */
227
  .dashboard-grid {
228
  display: grid;
229
- grid-template-columns: 280px 1fr 320px;
230
- gap: 16px;
231
- padding: 16px;
232
  flex: 1;
233
  max-width: 1600px;
234
  margin: 0 auto;
235
  width: 100%;
 
236
  }
237
 
238
  @media (max-width: 1200px) {
239
  .dashboard-grid {
240
- grid-template-columns: 260px 1fr;
241
  }
242
  .right-sidebar {
243
  grid-column: span 2;
@@ -253,18 +298,36 @@
253
  }
254
  }
255
 
256
- /* Sidebars and Panels */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  .panel-title {
258
- font-size: 16px;
259
- color: var(--text-primary);
260
- padding: 16px;
 
 
 
261
  border-bottom: 1px solid var(--border-glass);
262
  display: flex;
263
  align-items: center;
264
  justify-content: space-between;
265
  }
266
 
267
- /* 4. Watchlist Panel */
268
  .watchlist-container {
269
  display: flex;
270
  flex-direction: column;
@@ -273,24 +336,51 @@
273
  }
274
 
275
  .watchlist-search {
276
- padding: 12px;
277
  display: flex;
278
  gap: 8px;
279
  border-bottom: 1px solid var(--border-glass);
 
280
  }
281
 
282
  .watchlist-search input {
283
  flex: 1;
284
  font-size: 13px;
285
  padding: 8px 12px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
286
  }
287
 
288
  .add-btn {
289
- background: var(--neon-cyan);
290
- color: #000000;
 
291
  width: 36px;
292
  height: 36px;
293
  border-radius: 8px;
 
 
 
 
 
 
 
 
 
 
294
  box-shadow: 0 0 10px rgba(0, 242, 254, 0.2);
295
  }
296
 
@@ -298,39 +388,77 @@
298
  flex: 1;
299
  overflow-y: auto;
300
  padding: 8px;
 
 
301
  }
302
 
303
  .watchlist-item {
304
  display: flex;
305
  align-items: center;
306
  justify-content: space-between;
307
- padding: 12px 16px;
308
- border-radius: 8px;
309
  cursor: pointer;
310
- margin-bottom: 6px;
311
- transition: all 0.2s ease;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  }
313
 
314
  .watchlist-item:hover {
315
  background: rgba(255, 255, 255, 0.03);
 
 
 
 
 
316
  }
317
 
318
  .watchlist-item.active {
319
- background: rgba(0, 242, 254, 0.05);
320
- border-left: 3px solid var(--neon-cyan);
 
 
 
 
 
321
  }
322
 
323
  .ticker-symbol {
324
  font-weight: 600;
 
325
  color: var(--text-primary);
 
 
 
 
 
326
  }
327
 
328
  .delete-ticker-btn {
329
  background: transparent;
330
  color: var(--text-muted);
331
- width: 28px;
332
- height: 28px;
333
  border-radius: 6px;
 
 
 
334
  opacity: 0;
335
  transition: all 0.2s ease;
336
  }
@@ -340,21 +468,21 @@
340
  }
341
 
342
  .delete-ticker-btn:hover {
343
- background: rgba(255, 23, 68, 0.1);
344
  color: var(--bear-red);
345
  }
346
 
347
- /* 5. Center View (Chart & Insight) */
348
  .center-content {
349
  display: flex;
350
  flex-direction: column;
351
- gap: 16px;
352
  }
353
 
354
  /* Chart Styles */
355
  .chart-panel {
356
- padding: 20px;
357
- height: 420px;
358
  display: flex;
359
  flex-direction: column;
360
  }
@@ -362,51 +490,69 @@
362
  .chart-header {
363
  display: flex;
364
  justify-content: space-between;
365
- align-items: center;
366
- margin-bottom: 20px;
367
  }
368
 
369
  .active-stock-info {
370
  display: flex;
371
- align-items: baseline;
372
- gap: 12px;
 
 
 
 
 
 
 
 
 
373
  }
374
 
375
  .active-price {
376
- font-size: 28px;
377
  font-weight: 700;
378
  color: var(--text-primary);
379
  font-family: var(--font-display);
 
 
380
  }
381
 
382
  .live-indicator {
383
- display: flex;
384
  align-items: center;
385
  gap: 6px;
386
- font-size: 11px;
387
  color: var(--bull-green);
388
  text-transform: uppercase;
389
  font-weight: 700;
390
  letter-spacing: 0.1em;
 
 
 
 
 
 
391
  }
392
 
393
  .live-dot {
394
- width: 6px;
395
- height: 6px;
396
  background: var(--bull-green);
397
  border-radius: 50%;
398
  animation: pulseGlow 1.5s infinite;
 
399
  }
400
 
401
  .chart-container {
402
  flex: 1;
403
- min-height: 250px;
404
  position: relative;
405
  }
406
 
407
- /* AI Insights View */
408
  .insight-panel {
409
- padding: 24px;
410
  }
411
 
412
  .insight-cta {
@@ -414,23 +560,37 @@
414
  flex-direction: column;
415
  align-items: center;
416
  justify-content: center;
417
- padding: 40px;
418
  text-align: center;
419
- gap: 16px;
 
 
 
 
 
 
 
420
  }
421
 
422
  .insight-btn {
423
  background: linear-gradient(135deg, var(--neon-cyan), var(--neon-violet));
424
- color: #000000;
425
- font-size: 16px;
426
- font-weight: 600;
427
- padding: 14px 28px;
428
  border-radius: 99px;
429
  box-shadow: 0 0 20px rgba(161, 84, 255, 0.3);
 
 
430
  }
431
 
432
  .insight-btn:hover {
433
- box-shadow: 0 0 30px rgba(161, 84, 255, 0.5);
 
 
 
 
 
434
  }
435
 
436
  .insight-loading {
@@ -443,9 +603,9 @@
443
  }
444
 
445
  .spinner {
446
- width: 48px;
447
- height: 48px;
448
- border: 3px solid rgba(255, 255, 255, 0.05);
449
  border-top-color: var(--neon-cyan);
450
  border-radius: 50%;
451
  animation: spin 1s linear infinite;
@@ -484,14 +644,14 @@
484
 
485
  .gauge-bg {
486
  fill: none;
487
- stroke: rgba(255, 255, 255, 0.04);
488
- stroke-width: 8;
489
  }
490
 
491
  .gauge-fill {
492
  fill: none;
493
  stroke: url(#cyan-violet-grad);
494
- stroke-width: 8;
495
  stroke-linecap: round;
496
  transition: stroke-dasharray 0.8s cubic-bezier(0.16, 1, 0.3, 1);
497
  }
@@ -504,16 +664,18 @@
504
  }
505
 
506
  .gauge-percentage {
507
- font-size: 32px;
508
  font-weight: 700;
509
  font-family: var(--font-display);
 
510
  }
511
 
512
  .gauge-label {
513
- font-size: 11px;
514
  color: var(--text-secondary);
515
  text-transform: uppercase;
516
- letter-spacing: 0.05em;
 
517
  }
518
 
519
  .insight-text-container {
@@ -527,11 +689,12 @@
527
  display: inline-flex;
528
  align-self: flex-start;
529
  padding: 4px 10px;
530
- border-radius: 4px;
531
- font-size: 11px;
532
  font-weight: 700;
533
  text-transform: uppercase;
534
- letter-spacing: 0.05em;
 
535
  }
536
 
537
  .tag-bullish {
@@ -548,15 +711,22 @@
548
 
549
  .insight-explanation {
550
  color: var(--text-secondary);
551
- font-size: 15px;
552
- line-height: 160%;
553
  }
554
 
555
- /* 6. Alerts & Config Panel (Right Sidebar) */
 
 
 
 
 
 
 
556
  .right-sidebar {
557
  display: flex;
558
  flex-direction: column;
559
- gap: 16px;
560
  }
561
 
562
  .alerts-panel {
@@ -566,40 +736,76 @@
566
  }
567
 
568
  .alert-form {
569
- padding: 16px;
570
  border-bottom: 1px solid var(--border-glass);
571
  display: flex;
572
  flex-direction: column;
573
- gap: 12px;
 
 
 
 
 
 
574
  }
575
 
576
- .alert-form select, .alert-form input {
 
577
  font-size: 13px;
578
  width: 100%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
579
  }
580
 
581
  .alert-submit-btn {
582
- background: rgba(255, 255, 255, 0.05);
583
- border: 1px solid var(--border-glass);
584
- color: var(--text-primary);
585
  width: 100%;
586
- padding: 10px;
587
- border-radius: 8px;
 
 
 
 
588
  }
589
 
590
  .alert-submit-btn:hover {
591
- background: var(--neon-cyan);
592
- color: #000000;
593
  border-color: var(--neon-cyan);
 
594
  }
595
 
596
  .alerts-list {
597
  flex: 1;
598
  overflow-y: auto;
599
- padding: 16px;
600
  display: flex;
601
  flex-direction: column;
602
- gap: 10px;
 
 
603
  }
604
 
605
  .alert-item {
@@ -609,60 +815,94 @@
609
  padding: 10px 12px;
610
  background: rgba(255, 255, 255, 0.02);
611
  border: 1px solid var(--border-glass);
612
- border-radius: 8px;
 
 
 
 
 
613
  }
614
 
615
  .alert-info {
616
  display: flex;
617
  flex-direction: column;
618
- gap: 4px;
619
  }
620
 
621
  .alert-ticker {
622
- font-weight: 600;
623
- font-size: 14px;
 
 
624
  }
625
 
626
  .alert-condition {
627
  font-size: 11px;
628
- color: var(--text-secondary);
629
  text-transform: uppercase;
 
 
630
  }
631
 
632
  .deactivate-alert-btn {
633
  background: transparent;
634
  color: var(--text-muted);
635
- width: 28px;
636
- height: 28px;
637
  border-radius: 6px;
 
 
 
 
638
  }
639
 
640
  .deactivate-alert-btn:hover {
641
- background: rgba(255, 23, 68, 0.1);
642
  color: var(--bear-red);
643
  }
644
 
645
- /* 7. Recharge / Payment Modal */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
646
  .modal-overlay {
647
  position: fixed;
648
  top: 0;
649
  left: 0;
650
  right: 0;
651
  bottom: 0;
652
- background: rgba(0, 0, 0, 0.85);
653
  display: flex;
654
  align-items: center;
655
  justify-content: center;
656
  z-index: 1000;
657
- backdrop-filter: blur(8px);
658
  }
659
 
660
  .modal-content {
661
  width: 420px;
662
- max-width: 100%;
663
  padding: 32px;
664
  text-align: center;
665
  animation: slideUp 0.3s ease forwards;
 
666
  }
667
 
668
  .modal-header {
@@ -677,12 +917,22 @@
677
  color: var(--text-secondary);
678
  width: 28px;
679
  height: 28px;
 
 
 
 
 
 
 
 
 
 
680
  }
681
 
682
  .recharge-packages {
683
  display: flex;
684
  flex-direction: column;
685
- gap: 12px;
686
  margin-bottom: 24px;
687
  }
688
 
@@ -690,33 +940,74 @@
690
  display: flex;
691
  justify-content: space-between;
692
  align-items: center;
693
- padding: 16px;
694
  background: rgba(255, 255, 255, 0.02);
695
  border: 1px solid var(--border-glass);
696
  border-radius: 12px;
697
  cursor: pointer;
698
  transition: all 0.2s ease;
 
699
  }
700
 
701
  .package-card:hover {
702
- border-color: var(--neon-cyan);
703
- background: rgba(0, 242, 254, 0.03);
 
704
  }
705
 
706
  .package-credits {
707
  font-weight: 600;
708
- font-size: 16px;
 
709
  }
710
 
711
  .package-price {
712
  color: var(--neon-cyan);
713
- font-weight: 600;
 
 
 
 
 
 
 
714
  }
715
 
716
- /* ==========================================================================
717
- 8. Premium Cyberpunk Landing Page Styles
718
- ========================================================================== */
 
719
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
720
  .landing-page-container {
721
  min-height: 100vh;
722
  width: 100%;
@@ -727,13 +1018,9 @@
727
  overflow-x: hidden;
728
  }
729
 
730
- /* Mesh glowing backgrounds */
731
  .bg-glow-mesh {
732
  position: absolute;
733
- top: 0;
734
- left: 0;
735
- right: 0;
736
- bottom: 0;
737
  pointer-events: none;
738
  z-index: 0;
739
  overflow: hidden;
@@ -747,34 +1034,29 @@
747
  }
748
 
749
  .mesh-cyan {
750
- width: 400px;
751
- height: 400px;
752
  background: var(--neon-cyan);
753
- top: -100px;
754
- left: 10%;
755
  animation: floatLight 20s infinite ease-in-out;
756
  }
757
 
758
  .mesh-violet {
759
- width: 500px;
760
- height: 500px;
761
  background: var(--neon-violet);
762
- bottom: -150px;
763
- right: 10%;
764
  animation: floatLight2 25s infinite ease-in-out;
765
  }
766
 
767
  @keyframes floatLight {
768
  0%, 100% { transform: translate(0, 0) scale(1); }
769
- 50% { transform: translate(50px, 30px) scale(1.1); }
770
  }
771
 
772
  @keyframes floatLight2 {
773
  0%, 100% { transform: translate(0, 0) scale(1.1); }
774
- 50% { transform: translate(-40px, -60px) scale(0.9); }
775
  }
776
 
777
- /* Landing Header */
778
  .landing-header {
779
  display: flex;
780
  align-items: center;
@@ -799,7 +1081,6 @@
799
  letter-spacing: -0.02em;
800
  }
801
 
802
- /* Landing Main Grid */
803
  .landing-main {
804
  max-width: 1200px;
805
  width: 100%;
@@ -820,7 +1101,6 @@
820
  }
821
  }
822
 
823
- /* Hero Section */
824
  .landing-hero {
825
  display: flex;
826
  flex-direction: column;
@@ -858,9 +1138,7 @@
858
  }
859
 
860
  @media (max-width: 640px) {
861
- .hero-title {
862
- font-size: 36px;
863
- }
864
  }
865
 
866
  .hero-subtitle {
@@ -870,7 +1148,6 @@
870
  margin-bottom: 12px;
871
  }
872
 
873
- /* Dashboard Mockup */
874
  .dashboard-mockup {
875
  border-radius: 12px;
876
  overflow: hidden;
@@ -897,9 +1174,9 @@
897
  border-radius: 50%;
898
  }
899
 
900
- .mockup-dots .red { background: #ff5f56; }
901
  .mockup-dots .yellow { background: #ffbd2e; }
902
- .mockup-dots .green { background: #27c93f; }
903
 
904
  .mockup-url {
905
  margin: 0 auto;
@@ -993,7 +1270,6 @@
993
  color: var(--text-secondary);
994
  }
995
 
996
- /* Authentication Card */
997
  .landing-auth-panel {
998
  display: flex;
999
  justify-content: center;
@@ -1101,7 +1377,6 @@
1101
  color: var(--text-secondary);
1102
  }
1103
 
1104
- /* Landing Features Grid */
1105
  .landing-features {
1106
  max-width: 1200px;
1107
  width: 100%;
@@ -1117,9 +1392,7 @@
1117
  }
1118
 
1119
  @media (max-width: 768px) {
1120
- .features-grid {
1121
- grid-template-columns: 1fr;
1122
- }
1123
  }
1124
 
1125
  .feature-card {
@@ -1154,7 +1427,6 @@
1154
  color: var(--text-secondary);
1155
  }
1156
 
1157
- /* Landing Footer */
1158
  .landing-footer {
1159
  text-align: center;
1160
  padding: 40px 24px;
@@ -1164,106 +1436,3 @@
1164
  font-size: 13px;
1165
  z-index: 10;
1166
  }
1167
-
1168
- /* Custom UI Polish tags */
1169
- .triggered-badge {
1170
- background: rgba(255, 23, 68, 0.12);
1171
- border: 1px solid rgba(255, 23, 68, 0.3);
1172
- color: var(--bear-red);
1173
- font-size: 9px;
1174
- font-weight: 700;
1175
- padding: 2px 6px;
1176
- border-radius: 4px;
1177
- letter-spacing: 0.05em;
1178
- }
1179
-
1180
- .insight-reason-body p {
1181
- margin: 0 0 10px 0;
1182
- }
1183
- .insight-reason-body p:last-child {
1184
- margin-bottom: 0;
1185
- }
1186
-
1187
- /* ==========================================
1188
- Animated Cyberpunk Glows & Micro-animations
1189
- ========================================== */
1190
- @keyframes pulseGlow {
1191
- 0% {
1192
- transform: scale(0.95);
1193
- box-shadow: 0 0 0 0 rgba(0, 242, 254, 0.7);
1194
- }
1195
- 70% {
1196
- transform: scale(1.2);
1197
- box-shadow: 0 0 0 6px rgba(0, 242, 254, 0);
1198
- }
1199
- 100% {
1200
- transform: scale(0.95);
1201
- box-shadow: 0 0 0 0 rgba(0, 242, 254, 0);
1202
- }
1203
- }
1204
-
1205
- /* Neon logo glow effects */
1206
- .glow-cyan {
1207
- filter: drop-shadow(0 0 6px rgba(0, 242, 254, 0.75));
1208
- }
1209
- .glow-violet {
1210
- filter: drop-shadow(0 0 6px rgba(161, 84, 255, 0.75));
1211
- }
1212
-
1213
- /* Hover scales and glows on glass panels */
1214
- .glass-panel {
1215
- transition: border-color 0.3s ease, box-shadow 0.3s ease, transform 0.3s ease;
1216
- }
1217
- .glass-panel:hover {
1218
- border-color: rgba(0, 242, 254, 0.25);
1219
- box-shadow: 0 8px 32px 0 rgba(0, 242, 254, 0.03), inset 0 0 12px rgba(255, 255, 255, 0.02);
1220
- }
1221
-
1222
- /* Watchlist items neon hover indicator */
1223
- .watchlist-item {
1224
- position: relative;
1225
- overflow: hidden;
1226
- }
1227
- .watchlist-item::after {
1228
- content: '';
1229
- position: absolute;
1230
- left: 0;
1231
- top: 0;
1232
- bottom: 0;
1233
- width: 3px;
1234
- background: var(--neon-cyan);
1235
- transform: scaleY(0);
1236
- transition: transform 0.2s ease;
1237
- transform-origin: bottom;
1238
- }
1239
- .watchlist-item:hover::after {
1240
- transform: scaleY(1);
1241
- }
1242
- .watchlist-item.active {
1243
- box-shadow: inset 0 0 12px rgba(0, 242, 254, 0.05);
1244
- }
1245
-
1246
- /* AI Analyst Pulsing bias tags */
1247
- .insight-tag {
1248
- animation: pulsePill 2s infinite ease-in-out;
1249
- }
1250
- @keyframes pulsePill {
1251
- 0%, 100% { opacity: 1; }
1252
- 50% { opacity: 0.8; }
1253
- }
1254
-
1255
- /* Stock Chart transition */
1256
- .mini-chart-container, .chart-container {
1257
- animation: fadeInChart 0.6s cubic-bezier(0.16, 1, 0.3, 1);
1258
- }
1259
- @keyframes fadeInChart {
1260
- from {
1261
- opacity: 0;
1262
- transform: translateY(10px);
1263
- }
1264
- to {
1265
- opacity: 1;
1266
- transform: translateY(0);
1267
- }
1268
- }
1269
-
 
1
+ /* ==========================================
2
+ QUANTIQ DASHBOARD — PREMIUM CSS SYSTEM
3
+ ========================================== */
4
 
5
+ /* ─── 0. CSS VARIABLES ─────────────────── */
6
+ :root {
7
+ --neon-cyan: #00f2fe;
8
+ --neon-violet: #a154ff;
9
+ --bull-green: #00e676;
10
+ --bear-red: #ff1744;
11
+ --bg-space: #06070d;
12
+ --bg-panel: #0d101b;
13
+ --bg-card: #111420;
14
+ --border-glass: rgba(255, 255, 255, 0.07);
15
+ --border-glow: rgba(0, 242, 254, 0.18);
16
+ --text-primary: #f1f5f9;
17
+ --text-secondary: #94a3b8;
18
+ --text-muted: #475569;
19
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
20
+ --font-display: 'Instrument Serif', serif;
21
+ }
22
+
23
+ /* ─── App Layout ────────────────────────── */
24
  .app-container {
25
  display: flex;
26
  flex-direction: column;
27
  min-height: 100vh;
28
  width: 100%;
29
+ background: var(--bg-space);
30
  }
31
 
32
+ /* ─── 1. Login Page ─────────────────────── */
33
  .login-page {
34
  display: flex;
35
  align-items: center;
 
108
  border-color: var(--neon-violet);
109
  }
110
 
111
+ /* ─── 2. Dashboard Header / Navbar ─────── */
112
  .dashboard-header {
113
  display: flex;
114
  align-items: center;
115
  justify-content: space-between;
116
+ padding: 0 28px;
117
+ height: 60px;
118
  border-bottom: 1px solid var(--border-glass);
119
+ background: rgba(6, 7, 13, 0.92);
120
+ backdrop-filter: blur(20px);
121
+ -webkit-backdrop-filter: blur(20px);
122
  position: sticky;
123
  top: 0;
124
  z-index: 100;
125
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.04), 0 4px 24px rgba(0, 0, 0, 0.4);
126
  }
127
 
128
  .header-left {
129
  display: flex;
130
  align-items: center;
131
+ gap: 10px;
132
+ user-select: none;
133
  }
134
 
135
  .logo-text {
136
+ font-size: 20px;
137
  font-weight: 700;
138
  background: linear-gradient(135deg, var(--neon-cyan), var(--neon-violet));
139
  -webkit-background-clip: text;
140
  -webkit-text-fill-color: transparent;
141
+ letter-spacing: -0.02em;
142
  }
143
 
144
  .header-right {
145
  display: flex;
146
  align-items: center;
147
+ gap: 16px;
148
  }
149
 
150
  .credits-badge {
 
152
  align-items: center;
153
  gap: 8px;
154
  background: rgba(161, 84, 255, 0.08);
155
+ border: 1px solid rgba(161, 84, 255, 0.2);
156
+ padding: 5px 10px 5px 10px;
157
  border-radius: 99px;
158
+ font-size: 13px;
159
  font-weight: 600;
160
  color: var(--neon-violet);
161
+ transition: border-color 0.2s ease;
162
+ }
163
+
164
+ .credits-badge:hover {
165
+ border-color: rgba(161, 84, 255, 0.45);
166
  }
167
 
168
  .recharge-btn {
169
  background: linear-gradient(135deg, var(--neon-cyan), var(--neon-violet));
170
+ color: #08060e;
171
+ font-weight: 700;
172
+ font-size: 11px;
173
+ letter-spacing: 0.06em;
174
+ padding: 3px 9px;
175
  border-radius: 99px;
176
+ box-shadow: 0 0 10px rgba(0, 242, 254, 0.25);
177
+ transition: box-shadow 0.2s ease;
178
+ }
179
+
180
+ .recharge-btn:hover {
181
+ box-shadow: 0 0 18px rgba(0, 242, 254, 0.5);
182
  }
183
 
184
  .user-profile {
185
  display: flex;
186
  align-items: center;
187
+ gap: 9px;
188
  }
189
 
190
  .avatar {
 
195
 
196
  .avatar-upload-wrapper {
197
  position: relative;
198
+ width: 34px;
199
+ height: 34px;
200
  border-radius: 50%;
201
+ border: 1.5px solid rgba(0, 242, 254, 0.4);
202
  overflow: hidden;
203
  cursor: pointer;
204
  background: rgba(255, 255, 255, 0.05);
205
  display: flex;
206
  align-items: center;
207
  justify-content: center;
208
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;
209
  }
210
 
211
  .avatar-upload-wrapper:hover {
212
+ border-color: var(--neon-cyan);
213
+ box-shadow: 0 0 10px rgba(0, 242, 254, 0.3);
214
  }
215
 
216
  .avatar-upload-wrapper:active {
217
+ transform: scale(0.93);
218
  }
219
 
220
  .avatar-hover-overlay {
 
242
  }
243
 
244
  .profile-name {
245
+ font-size: 13.5px;
246
  color: var(--text-primary);
247
  font-weight: 500;
248
+ letter-spacing: -0.01em;
249
  }
250
 
251
  .logout-btn {
252
+ display: flex;
253
+ align-items: center;
254
+ justify-content: center;
255
  background: transparent;
256
+ color: var(--text-muted);
257
  border: 1px solid var(--border-glass);
258
+ width: 34px;
259
+ height: 34px;
260
+ border-radius: 8px;
261
+ transition: all 0.2s ease;
262
  }
263
 
264
  .logout-btn:hover {
 
267
  color: var(--bear-red);
268
  }
269
 
270
+ /* ─── 3. Dashboard Grid ─────────────────── */
271
  .dashboard-grid {
272
  display: grid;
273
+ grid-template-columns: 260px 1fr 300px;
274
+ gap: 14px;
275
+ padding: 14px;
276
  flex: 1;
277
  max-width: 1600px;
278
  margin: 0 auto;
279
  width: 100%;
280
+ box-sizing: border-box;
281
  }
282
 
283
  @media (max-width: 1200px) {
284
  .dashboard-grid {
285
+ grid-template-columns: 240px 1fr;
286
  }
287
  .right-sidebar {
288
  grid-column: span 2;
 
298
  }
299
  }
300
 
301
+ /* ─── Glass Panel Base ──────────────────── */
302
+ .glass-panel {
303
+ background: rgba(13, 16, 27, 0.85);
304
+ border: 1px solid var(--border-glass);
305
+ border-radius: 14px;
306
+ backdrop-filter: blur(12px);
307
+ -webkit-backdrop-filter: blur(12px);
308
+ transition: border-color 0.3s ease, box-shadow 0.3s ease;
309
+ overflow: hidden;
310
+ }
311
+
312
+ .glass-panel:hover {
313
+ border-color: rgba(0, 242, 254, 0.12);
314
+ box-shadow: 0 4px 30px rgba(0, 0, 0, 0.25);
315
+ }
316
+
317
  .panel-title {
318
+ font-size: 13px;
319
+ font-weight: 600;
320
+ letter-spacing: 0.04em;
321
+ text-transform: uppercase;
322
+ color: var(--text-secondary);
323
+ padding: 14px 16px;
324
  border-bottom: 1px solid var(--border-glass);
325
  display: flex;
326
  align-items: center;
327
  justify-content: space-between;
328
  }
329
 
330
+ /* ─── 4. Watchlist Panel ────────────────── */
331
  .watchlist-container {
332
  display: flex;
333
  flex-direction: column;
 
336
  }
337
 
338
  .watchlist-search {
339
+ padding: 10px 12px;
340
  display: flex;
341
  gap: 8px;
342
  border-bottom: 1px solid var(--border-glass);
343
+ background: rgba(0, 0, 0, 0.15);
344
  }
345
 
346
  .watchlist-search input {
347
  flex: 1;
348
  font-size: 13px;
349
  padding: 8px 12px;
350
+ background: rgba(255, 255, 255, 0.04);
351
+ border: 1px solid var(--border-glass);
352
+ border-radius: 8px;
353
+ color: var(--text-primary);
354
+ outline: none;
355
+ transition: border-color 0.2s ease;
356
+ }
357
+
358
+ .watchlist-search input::placeholder {
359
+ color: var(--text-muted);
360
+ }
361
+
362
+ .watchlist-search input:focus {
363
+ border-color: rgba(0, 242, 254, 0.4);
364
+ background: rgba(0, 242, 254, 0.03);
365
  }
366
 
367
  .add-btn {
368
+ background: rgba(0, 242, 254, 0.1);
369
+ border: 1px solid rgba(0, 242, 254, 0.25);
370
+ color: var(--neon-cyan);
371
  width: 36px;
372
  height: 36px;
373
  border-radius: 8px;
374
+ display: flex;
375
+ align-items: center;
376
+ justify-content: center;
377
+ transition: all 0.2s ease;
378
+ flex-shrink: 0;
379
+ }
380
+
381
+ .add-btn:hover {
382
+ background: rgba(0, 242, 254, 0.18);
383
+ border-color: var(--neon-cyan);
384
  box-shadow: 0 0 10px rgba(0, 242, 254, 0.2);
385
  }
386
 
 
388
  flex: 1;
389
  overflow-y: auto;
390
  padding: 8px;
391
+ scrollbar-width: thin;
392
+ scrollbar-color: rgba(255,255,255,0.06) transparent;
393
  }
394
 
395
  .watchlist-item {
396
  display: flex;
397
  align-items: center;
398
  justify-content: space-between;
399
+ padding: 11px 14px;
400
+ border-radius: 9px;
401
  cursor: pointer;
402
+ margin-bottom: 4px;
403
+ border: 1px solid transparent;
404
+ transition: all 0.18s ease;
405
+ position: relative;
406
+ overflow: hidden;
407
+ }
408
+
409
+ .watchlist-item::before {
410
+ content: '';
411
+ position: absolute;
412
+ left: 0;
413
+ top: 0;
414
+ bottom: 0;
415
+ width: 3px;
416
+ border-radius: 2px 0 0 2px;
417
+ background: var(--neon-cyan);
418
+ transform: scaleY(0);
419
+ transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1);
420
+ transform-origin: bottom;
421
  }
422
 
423
  .watchlist-item:hover {
424
  background: rgba(255, 255, 255, 0.03);
425
+ border-color: rgba(255, 255, 255, 0.06);
426
+ }
427
+
428
+ .watchlist-item:hover::before {
429
+ transform: scaleY(1);
430
  }
431
 
432
  .watchlist-item.active {
433
+ background: rgba(0, 242, 254, 0.06);
434
+ border-color: rgba(0, 242, 254, 0.14);
435
+ box-shadow: inset 0 0 16px rgba(0, 242, 254, 0.04);
436
+ }
437
+
438
+ .watchlist-item.active::before {
439
+ transform: scaleY(1);
440
  }
441
 
442
  .ticker-symbol {
443
  font-weight: 600;
444
+ font-size: 14px;
445
  color: var(--text-primary);
446
+ letter-spacing: 0.02em;
447
+ }
448
+
449
+ .watchlist-item.active .ticker-symbol {
450
+ color: var(--neon-cyan);
451
  }
452
 
453
  .delete-ticker-btn {
454
  background: transparent;
455
  color: var(--text-muted);
456
+ width: 26px;
457
+ height: 26px;
458
  border-radius: 6px;
459
+ display: flex;
460
+ align-items: center;
461
+ justify-content: center;
462
  opacity: 0;
463
  transition: all 0.2s ease;
464
  }
 
468
  }
469
 
470
  .delete-ticker-btn:hover {
471
+ background: rgba(255, 23, 68, 0.12);
472
  color: var(--bear-red);
473
  }
474
 
475
+ /* ─── 5. Center Content (Chart + AI) ───── */
476
  .center-content {
477
  display: flex;
478
  flex-direction: column;
479
+ gap: 14px;
480
  }
481
 
482
  /* Chart Styles */
483
  .chart-panel {
484
+ padding: 20px 20px 16px;
485
+ min-height: 400px;
486
  display: flex;
487
  flex-direction: column;
488
  }
 
490
  .chart-header {
491
  display: flex;
492
  justify-content: space-between;
493
+ align-items: flex-start;
494
+ margin-bottom: 18px;
495
  }
496
 
497
  .active-stock-info {
498
  display: flex;
499
+ flex-direction: column;
500
+ gap: 4px;
501
+ }
502
+
503
+ .active-stock-info h2 {
504
+ font-size: 13px;
505
+ font-weight: 600;
506
+ letter-spacing: 0.08em;
507
+ text-transform: uppercase;
508
+ color: var(--text-muted);
509
+ margin: 0 0 2px;
510
  }
511
 
512
  .active-price {
513
+ font-size: 32px;
514
  font-weight: 700;
515
  color: var(--text-primary);
516
  font-family: var(--font-display);
517
+ letter-spacing: -0.02em;
518
+ line-height: 1;
519
  }
520
 
521
  .live-indicator {
522
+ display: inline-flex;
523
  align-items: center;
524
  gap: 6px;
525
+ font-size: 10px;
526
  color: var(--bull-green);
527
  text-transform: uppercase;
528
  font-weight: 700;
529
  letter-spacing: 0.1em;
530
+ background: rgba(0, 230, 118, 0.08);
531
+ border: 1px solid rgba(0, 230, 118, 0.2);
532
+ padding: 3px 8px;
533
+ border-radius: 99px;
534
+ margin-top: 6px;
535
+ width: fit-content;
536
  }
537
 
538
  .live-dot {
539
+ width: 5px;
540
+ height: 5px;
541
  background: var(--bull-green);
542
  border-radius: 50%;
543
  animation: pulseGlow 1.5s infinite;
544
+ flex-shrink: 0;
545
  }
546
 
547
  .chart-container {
548
  flex: 1;
549
+ min-height: 260px;
550
  position: relative;
551
  }
552
 
553
+ /* ─── 6. AI Analyst Panel ───────────────── */
554
  .insight-panel {
555
+ padding: 20px;
556
  }
557
 
558
  .insight-cta {
 
560
  flex-direction: column;
561
  align-items: center;
562
  justify-content: center;
563
+ padding: 36px 24px;
564
  text-align: center;
565
+ gap: 18px;
566
+ }
567
+
568
+ .insight-cta-description {
569
+ color: var(--text-secondary);
570
+ font-size: 14px;
571
+ line-height: 160%;
572
+ max-width: 460px;
573
  }
574
 
575
  .insight-btn {
576
  background: linear-gradient(135deg, var(--neon-cyan), var(--neon-violet));
577
+ color: #08060e;
578
+ font-size: 14px;
579
+ font-weight: 700;
580
+ padding: 12px 28px;
581
  border-radius: 99px;
582
  box-shadow: 0 0 20px rgba(161, 84, 255, 0.3);
583
+ letter-spacing: 0.01em;
584
+ transition: box-shadow 0.25s ease, transform 0.15s ease;
585
  }
586
 
587
  .insight-btn:hover {
588
+ box-shadow: 0 0 32px rgba(161, 84, 255, 0.55);
589
+ transform: translateY(-1px);
590
+ }
591
+
592
+ .insight-btn:active {
593
+ transform: translateY(0);
594
  }
595
 
596
  .insight-loading {
 
603
  }
604
 
605
  .spinner {
606
+ width: 40px;
607
+ height: 40px;
608
+ border: 2px solid rgba(255, 255, 255, 0.05);
609
  border-top-color: var(--neon-cyan);
610
  border-radius: 50%;
611
  animation: spin 1s linear infinite;
 
644
 
645
  .gauge-bg {
646
  fill: none;
647
+ stroke: rgba(255, 255, 255, 0.05);
648
+ stroke-width: 7;
649
  }
650
 
651
  .gauge-fill {
652
  fill: none;
653
  stroke: url(#cyan-violet-grad);
654
+ stroke-width: 7;
655
  stroke-linecap: round;
656
  transition: stroke-dasharray 0.8s cubic-bezier(0.16, 1, 0.3, 1);
657
  }
 
664
  }
665
 
666
  .gauge-percentage {
667
+ font-size: 30px;
668
  font-weight: 700;
669
  font-family: var(--font-display);
670
+ color: var(--text-primary);
671
  }
672
 
673
  .gauge-label {
674
+ font-size: 10px;
675
  color: var(--text-secondary);
676
  text-transform: uppercase;
677
+ letter-spacing: 0.08em;
678
+ font-weight: 600;
679
  }
680
 
681
  .insight-text-container {
 
689
  display: inline-flex;
690
  align-self: flex-start;
691
  padding: 4px 10px;
692
+ border-radius: 5px;
693
+ font-size: 10px;
694
  font-weight: 700;
695
  text-transform: uppercase;
696
+ letter-spacing: 0.07em;
697
+ animation: pulsePill 2s infinite ease-in-out;
698
  }
699
 
700
  .tag-bullish {
 
711
 
712
  .insight-explanation {
713
  color: var(--text-secondary);
714
+ font-size: 14px;
715
+ line-height: 165%;
716
  }
717
 
718
+ .insight-reason-body p {
719
+ margin: 0 0 10px 0;
720
+ }
721
+ .insight-reason-body p:last-child {
722
+ margin-bottom: 0;
723
+ }
724
+
725
+ /* ─── 7. Right Sidebar (Alerts) ─────────── */
726
  .right-sidebar {
727
  display: flex;
728
  flex-direction: column;
729
+ gap: 14px;
730
  }
731
 
732
  .alerts-panel {
 
736
  }
737
 
738
  .alert-form {
739
+ padding: 14px;
740
  border-bottom: 1px solid var(--border-glass);
741
  display: flex;
742
  flex-direction: column;
743
+ gap: 10px;
744
+ background: rgba(0, 0, 0, 0.1);
745
+ }
746
+
747
+ .alert-form-row {
748
+ display: flex;
749
+ gap: 8px;
750
  }
751
 
752
+ .alert-form select,
753
+ .alert-form input[type="number"] {
754
  font-size: 13px;
755
  width: 100%;
756
+ background: rgba(255, 255, 255, 0.04);
757
+ border: 1px solid var(--border-glass);
758
+ border-radius: 8px;
759
+ color: var(--text-primary);
760
+ padding: 8px 10px;
761
+ outline: none;
762
+ transition: border-color 0.2s ease;
763
+ appearance: none;
764
+ -webkit-appearance: none;
765
+ }
766
+
767
+ .alert-form select option {
768
+ background: var(--bg-panel);
769
+ }
770
+
771
+ .alert-form select:focus,
772
+ .alert-form input[type="number"]:focus {
773
+ border-color: rgba(0, 242, 254, 0.4);
774
+ background: rgba(0, 242, 254, 0.03);
775
+ }
776
+
777
+ .alert-form input[type="number"]::placeholder {
778
+ color: var(--text-muted);
779
  }
780
 
781
  .alert-submit-btn {
782
+ background: rgba(0, 242, 254, 0.07);
783
+ border: 1px solid rgba(0, 242, 254, 0.18);
784
+ color: var(--neon-cyan);
785
  width: 100%;
786
+ padding: 9px;
787
+ border-radius: 9px;
788
+ font-size: 13px;
789
+ font-weight: 600;
790
+ letter-spacing: 0.02em;
791
+ transition: all 0.2s ease;
792
  }
793
 
794
  .alert-submit-btn:hover {
795
+ background: rgba(0, 242, 254, 0.14);
 
796
  border-color: var(--neon-cyan);
797
+ box-shadow: 0 0 12px rgba(0, 242, 254, 0.15);
798
  }
799
 
800
  .alerts-list {
801
  flex: 1;
802
  overflow-y: auto;
803
+ padding: 12px;
804
  display: flex;
805
  flex-direction: column;
806
+ gap: 8px;
807
+ scrollbar-width: thin;
808
+ scrollbar-color: rgba(255,255,255,0.06) transparent;
809
  }
810
 
811
  .alert-item {
 
815
  padding: 10px 12px;
816
  background: rgba(255, 255, 255, 0.02);
817
  border: 1px solid var(--border-glass);
818
+ border-radius: 9px;
819
+ transition: border-color 0.2s ease;
820
+ }
821
+
822
+ .alert-item:hover {
823
+ border-color: rgba(255, 255, 255, 0.12);
824
  }
825
 
826
  .alert-info {
827
  display: flex;
828
  flex-direction: column;
829
+ gap: 3px;
830
  }
831
 
832
  .alert-ticker {
833
+ font-weight: 700;
834
+ font-size: 13px;
835
+ color: var(--text-primary);
836
+ letter-spacing: 0.03em;
837
  }
838
 
839
  .alert-condition {
840
  font-size: 11px;
841
+ color: var(--text-muted);
842
  text-transform: uppercase;
843
+ letter-spacing: 0.04em;
844
+ font-weight: 500;
845
  }
846
 
847
  .deactivate-alert-btn {
848
  background: transparent;
849
  color: var(--text-muted);
850
+ width: 26px;
851
+ height: 26px;
852
  border-radius: 6px;
853
+ display: flex;
854
+ align-items: center;
855
+ justify-content: center;
856
+ transition: all 0.2s ease;
857
  }
858
 
859
  .deactivate-alert-btn:hover {
860
+ background: rgba(255, 23, 68, 0.12);
861
  color: var(--bear-red);
862
  }
863
 
864
+ .alerts-empty {
865
+ padding: 28px 16px;
866
+ text-align: center;
867
+ color: var(--text-muted);
868
+ font-size: 13px;
869
+ line-height: 1.6;
870
+ }
871
+
872
+ /* Custom UI badges */
873
+ .triggered-badge {
874
+ background: rgba(255, 23, 68, 0.12);
875
+ border: 1px solid rgba(255, 23, 68, 0.3);
876
+ color: var(--bear-red);
877
+ font-size: 9px;
878
+ font-weight: 700;
879
+ padding: 2px 7px;
880
+ border-radius: 4px;
881
+ letter-spacing: 0.06em;
882
+ }
883
+
884
+ /* ─── 8. Recharge Modal ─────────────────── */
885
  .modal-overlay {
886
  position: fixed;
887
  top: 0;
888
  left: 0;
889
  right: 0;
890
  bottom: 0;
891
+ background: rgba(0, 0, 0, 0.88);
892
  display: flex;
893
  align-items: center;
894
  justify-content: center;
895
  z-index: 1000;
896
+ backdrop-filter: blur(10px);
897
  }
898
 
899
  .modal-content {
900
  width: 420px;
901
+ max-width: calc(100% - 32px);
902
  padding: 32px;
903
  text-align: center;
904
  animation: slideUp 0.3s ease forwards;
905
+ border-radius: 18px;
906
  }
907
 
908
  .modal-header {
 
917
  color: var(--text-secondary);
918
  width: 28px;
919
  height: 28px;
920
+ display: flex;
921
+ align-items: center;
922
+ justify-content: center;
923
+ border-radius: 6px;
924
+ transition: all 0.2s ease;
925
+ }
926
+
927
+ .close-btn:hover {
928
+ background: rgba(255, 255, 255, 0.06);
929
+ color: var(--text-primary);
930
  }
931
 
932
  .recharge-packages {
933
  display: flex;
934
  flex-direction: column;
935
+ gap: 10px;
936
  margin-bottom: 24px;
937
  }
938
 
 
940
  display: flex;
941
  justify-content: space-between;
942
  align-items: center;
943
+ padding: 14px 16px;
944
  background: rgba(255, 255, 255, 0.02);
945
  border: 1px solid var(--border-glass);
946
  border-radius: 12px;
947
  cursor: pointer;
948
  transition: all 0.2s ease;
949
+ text-align: left;
950
  }
951
 
952
  .package-card:hover {
953
+ border-color: rgba(0, 242, 254, 0.3);
954
+ background: rgba(0, 242, 254, 0.04);
955
+ box-shadow: 0 0 16px rgba(0, 242, 254, 0.06);
956
  }
957
 
958
  .package-credits {
959
  font-weight: 600;
960
+ font-size: 15px;
961
+ color: var(--text-primary);
962
  }
963
 
964
  .package-price {
965
  color: var(--neon-cyan);
966
+ font-weight: 700;
967
+ font-size: 15px;
968
+ }
969
+
970
+ /* ─── 9. Animations ─────────────────────── */
971
+ @keyframes slideUp {
972
+ from { opacity: 0; transform: translateY(20px); }
973
+ to { opacity: 1; transform: translateY(0); }
974
  }
975
 
976
+ @keyframes fadeIn {
977
+ from { opacity: 0; }
978
+ to { opacity: 1; }
979
+ }
980
 
981
+ @keyframes pulseGlow {
982
+ 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(0, 242, 254, 0.7); }
983
+ 70% { transform: scale(1.2); box-shadow: 0 0 0 5px rgba(0, 242, 254, 0); }
984
+ 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(0, 242, 254, 0); }
985
+ }
986
+
987
+ @keyframes pulsePill {
988
+ 0%, 100% { opacity: 1; }
989
+ 50% { opacity: 0.7; }
990
+ }
991
+
992
+ .mini-chart-container,
993
+ .chart-container {
994
+ animation: fadeInChart 0.5s cubic-bezier(0.16, 1, 0.3, 1);
995
+ }
996
+
997
+ @keyframes fadeInChart {
998
+ from { opacity: 0; transform: translateY(8px); }
999
+ to { opacity: 1; transform: translateY(0); }
1000
+ }
1001
+
1002
+ .animate-fade {
1003
+ animation: fadeIn 0.4s ease;
1004
+ }
1005
+
1006
+ /* Neon glow filter helpers */
1007
+ .glow-cyan { filter: drop-shadow(0 0 6px rgba(0, 242, 254, 0.7)); }
1008
+ .glow-violet { filter: drop-shadow(0 0 6px rgba(161, 84, 255, 0.7)); }
1009
+
1010
+ /* ─── 10. Landing Page Styles ───────────── */
1011
  .landing-page-container {
1012
  min-height: 100vh;
1013
  width: 100%;
 
1018
  overflow-x: hidden;
1019
  }
1020
 
 
1021
  .bg-glow-mesh {
1022
  position: absolute;
1023
+ top: 0; left: 0; right: 0; bottom: 0;
 
 
 
1024
  pointer-events: none;
1025
  z-index: 0;
1026
  overflow: hidden;
 
1034
  }
1035
 
1036
  .mesh-cyan {
1037
+ width: 400px; height: 400px;
 
1038
  background: var(--neon-cyan);
1039
+ top: -100px; left: 10%;
 
1040
  animation: floatLight 20s infinite ease-in-out;
1041
  }
1042
 
1043
  .mesh-violet {
1044
+ width: 500px; height: 500px;
 
1045
  background: var(--neon-violet);
1046
+ bottom: -150px; right: 10%;
 
1047
  animation: floatLight2 25s infinite ease-in-out;
1048
  }
1049
 
1050
  @keyframes floatLight {
1051
  0%, 100% { transform: translate(0, 0) scale(1); }
1052
+ 50% { transform: translate(50px, 30px) scale(1.1); }
1053
  }
1054
 
1055
  @keyframes floatLight2 {
1056
  0%, 100% { transform: translate(0, 0) scale(1.1); }
1057
+ 50% { transform: translate(-40px, -60px) scale(0.9); }
1058
  }
1059
 
 
1060
  .landing-header {
1061
  display: flex;
1062
  align-items: center;
 
1081
  letter-spacing: -0.02em;
1082
  }
1083
 
 
1084
  .landing-main {
1085
  max-width: 1200px;
1086
  width: 100%;
 
1101
  }
1102
  }
1103
 
 
1104
  .landing-hero {
1105
  display: flex;
1106
  flex-direction: column;
 
1138
  }
1139
 
1140
  @media (max-width: 640px) {
1141
+ .hero-title { font-size: 36px; }
 
 
1142
  }
1143
 
1144
  .hero-subtitle {
 
1148
  margin-bottom: 12px;
1149
  }
1150
 
 
1151
  .dashboard-mockup {
1152
  border-radius: 12px;
1153
  overflow: hidden;
 
1174
  border-radius: 50%;
1175
  }
1176
 
1177
+ .mockup-dots .red { background: #ff5f56; }
1178
  .mockup-dots .yellow { background: #ffbd2e; }
1179
+ .mockup-dots .green { background: #27c93f; }
1180
 
1181
  .mockup-url {
1182
  margin: 0 auto;
 
1270
  color: var(--text-secondary);
1271
  }
1272
 
 
1273
  .landing-auth-panel {
1274
  display: flex;
1275
  justify-content: center;
 
1377
  color: var(--text-secondary);
1378
  }
1379
 
 
1380
  .landing-features {
1381
  max-width: 1200px;
1382
  width: 100%;
 
1392
  }
1393
 
1394
  @media (max-width: 768px) {
1395
+ .features-grid { grid-template-columns: 1fr; }
 
 
1396
  }
1397
 
1398
  .feature-card {
 
1427
  color: var(--text-secondary);
1428
  }
1429
 
 
1430
  .landing-footer {
1431
  text-align: center;
1432
  padding: 40px 24px;
 
1436
  font-size: 13px;
1437
  z-index: 10;
1438
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/src/components/AIAnalyst.tsx CHANGED
@@ -50,16 +50,16 @@ export default function AIAnalyst({
50
 
51
  return (
52
  <div className="glass-panel insight-panel">
53
- <div className="panel-title" style={{ padding: '0 0 16px', borderBottom: '1px solid var(--border-glass)' }}>
54
  <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
55
- <Sparkles size={18} color="#a154ff" className="glow-violet" />
56
  <span>QuantIQ AI Analyst</span>
57
  </div>
58
  </div>
59
 
60
  {!insight && !loadingInsight && (
61
  <div className="insight-cta">
62
- <p style={{ color: 'var(--text-secondary)', marginBottom: '16px' }}>
63
  Analyze indicators, watchlists, alerts, and model prediction in a single ReAct workflow.
64
  </p>
65
  <button className="insight-btn" onClick={onTriggerInsight}>
 
50
 
51
  return (
52
  <div className="glass-panel insight-panel">
53
+ <div className="panel-title">
54
  <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
55
+ <Sparkles size={16} color="#a154ff" className="glow-violet" />
56
  <span>QuantIQ AI Analyst</span>
57
  </div>
58
  </div>
59
 
60
  {!insight && !loadingInsight && (
61
  <div className="insight-cta">
62
+ <p className="insight-cta-description">
63
  Analyze indicators, watchlists, alerts, and model prediction in a single ReAct workflow.
64
  </p>
65
  <button className="insight-btn" onClick={onTriggerInsight}>
frontend/src/components/PriceAlerts.tsx CHANGED
@@ -51,7 +51,7 @@ export default function PriceAlerts({
51
  </div>
52
 
53
  <form className="alert-form" onSubmit={handleSubmit}>
54
- <div style={{ display: 'flex', gap: '8px' }}>
55
  <select
56
  value={alertCondition}
57
  onChange={(e) => setAlertCondition(e.target.value)}
@@ -98,7 +98,7 @@ export default function PriceAlerts({
98
  </div>
99
  ))
100
  ) : (
101
- <div style={{ padding: '20px', textAlign: 'center', color: 'var(--text-muted)' }}>
102
  No active alerts for {activeTicker}.
103
  </div>
104
  )}
 
51
  </div>
52
 
53
  <form className="alert-form" onSubmit={handleSubmit}>
54
+ <div className="alert-form-row">
55
  <select
56
  value={alertCondition}
57
  onChange={(e) => setAlertCondition(e.target.value)}
 
98
  </div>
99
  ))
100
  ) : (
101
+ <div className="alerts-empty">
102
  No active alerts for {activeTicker}.
103
  </div>
104
  )}
frontend/src/components/StockChart.tsx CHANGED
@@ -17,16 +17,14 @@ export default function StockChart({ activeTicker, chartData }: StockChartProps)
17
  return (
18
  <div className="glass-panel chart-panel">
19
  <div className="chart-header">
20
- <div>
21
  <h2>{activeTicker}</h2>
22
- <div className="active-stock-info">
23
- <span className="active-price">
24
- {currentPrice !== null ? `$${currentPrice}` : 'Loading...'}
25
- </span>
26
- <div className="live-indicator">
27
- <span className="live-dot"></span>
28
- <span>Live</span>
29
- </div>
30
  </div>
31
  </div>
32
  </div>
 
17
  return (
18
  <div className="glass-panel chart-panel">
19
  <div className="chart-header">
20
+ <div className="active-stock-info">
21
  <h2>{activeTicker}</h2>
22
+ <span className="active-price">
23
+ {currentPrice !== null ? `$${currentPrice.toFixed(2)}` : '—'}
24
+ </span>
25
+ <div className="live-indicator">
26
+ <span className="live-dot"></span>
27
+ <span>Live</span>
 
 
28
  </div>
29
  </div>
30
  </div>