smodusermc commited on
Commit
fcdcaad
·
verified ·
1 Parent(s): 3102be6

Update static/style.css

Browse files
Files changed (1) hide show
  1. static/style.css +795 -1229
static/style.css CHANGED
@@ -1,1374 +1,940 @@
1
- /* ============================================= *
2
- * InfinityChat - Complete Design System *
3
- * Light / Dark / Custom themes *
4
- * ============================================= */
 
5
 
6
- /* ---------- CSS Variables (Light Theme Default) ---------- */
7
  :root {
8
- /* Primary Palette */
9
- --primary: #2563EB;
10
- --primary-hover: #1D4ED8;
11
- --primary-light: #DBEAFE;
12
- --primary-dark: #1E40AF;
13
-
14
- /* Neutrals (Light) */
15
- --bg: #FFFFFF;
16
- --bg-secondary: #F9FAFB;
17
- --bg-tertiary: #F3F4F6;
18
- --bg-elevated: #FFFFFF;
19
-
20
- /* Text */
21
- --text: #111827;
22
- --text-secondary: #6B7280;
23
- --text-tertiary: #9CA3AF;
24
- --text-inverse: #FFFFFF;
25
-
26
- /* Borders */
27
- --border: #E5E7EB;
28
- --border-light: #F3F4F6;
29
- --border-focus: var(--primary);
30
-
31
- /* Message Bubbles */
32
- --bubble-self: var(--primary);
33
- --bubble-self-text: var(--text-inverse);
34
- --bubble-other: var(--bg-tertiary);
35
- --bubble-other-text: var(--text);
36
-
37
- /* Header */
38
- --header-bg: var(--bg-elevated);
39
- --header-border: var(--border);
40
- --header-text: var(--text);
41
-
42
- /* Input */
43
- --input-bg: var(--bg-tertiary);
44
- --input-border: var(--border);
45
- --input-text: var(--text);
46
- --input-placeholder: var(--text-tertiary);
47
-
48
- /* Status */
49
- --success: #10B981;
50
- --warning: #F59E0B;
51
- --error: #EF4444;
52
- --info: #3B82F6;
53
-
54
- /* Shadows */
55
- --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);
56
- --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
57
- --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
58
- --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
59
- --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
60
-
61
- /* Border Radius */
62
- --radius-xs: 4px;
63
- --radius-sm: 6px;
64
- --radius-md: 8px;
65
- --radius-lg: 12px;
66
- --radius-xl: 16px;
67
- --radius-2xl: 20px;
68
- --radius-full: 9999px;
69
-
70
- /* Transitions */
71
- --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
72
- --transition: 200ms cubic-bezier(0.4, 0, 0.2, 1);
73
- --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
74
-
75
- /* Typography */
76
- --font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
77
- --font-mono: 'SF Mono', 'Fira Code', monospace;
78
-
79
- /* Spacing */
80
- --space-1: 0.25rem;
81
- --space-2: 0.5rem;
82
- --space-3: 0.75rem;
83
- --space-4: 1rem;
84
- --space-5: 1.25rem;
85
- --space-6: 1.5rem;
86
- --space-8: 2rem;
87
- --space-10: 2.5rem;
88
- --space-12: 3rem;
89
-
90
- /* Layout */
91
- --header-height: 64px;
92
- }
93
-
94
- /* ---------- Dark Theme ---------- */
95
  [data-theme="dark"] {
96
- --primary: #60A5FA;
97
- --primary-hover: #3B82F6;
98
- --primary-light: #1E3A5F;
99
- --primary-dark: #1D4ED8;
100
 
101
- --bg: #111827;
102
- --bg-secondary: #1F2937;
103
- --bg-tertiary: #374151;
104
- --bg-elevated: #1F2937;
105
 
106
- --text: #F9FAFB;
107
- --text-secondary: #9CA3AF;
108
- --text-tertiary: #6B7280;
109
- --text-inverse: #111827;
110
 
111
- --border: #374151;
112
- --border-light: #1F2937;
113
 
114
- --bubble-self: var(--primary);
115
- --bubble-self-text: #111827;
116
- --bubble-other: var(--bg-tertiary);
117
- --bubble-other-text: var(--text);
118
 
119
- --header-bg: var(--bg-secondary);
120
- --header-border: var(--border);
121
- --header-text: var(--text);
122
 
123
- --input-bg: var(--bg-tertiary);
124
- --input-border: var(--border);
125
- --input-text: var(--text);
126
- --input-placeholder: var(--text-tertiary);
127
 
128
- --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.3);
129
- --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3);
130
- --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
131
- --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.4);
132
- --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.4);
133
  }
134
 
135
- /* ---------- Custom Theme ---------- */
136
- [data-theme="custom"] {
137
- /* Handled via JS inline style setting */
138
- }
139
-
140
- /* ---------- Global Reset ---------- */
141
- *, *::before, *::after {
142
- margin: 0;
143
- padding: 0;
144
- box-sizing: border-box;
145
- }
146
 
147
  html {
148
- font-size: 16px;
149
- -webkit-text-size-adjust: 100%;
150
- -webkit-font-smoothing: antialiased;
151
- -moz-osx-font-smoothing: grayscale;
152
- text-rendering: optimizeLegibility;
153
  }
154
 
155
  body {
156
- font-family: var(--font-family);
157
- font-size: 0.9375rem;
158
- line-height: 1.5;
159
- color: var(--text);
160
- background: var(--bg);
161
- overflow: hidden;
162
- height: 100vh;
163
- height: 100dvh;
164
- width: 100vw;
165
- }
166
-
167
- /* ---------- Scrollbar ---------- */
168
- ::-webkit-scrollbar {
169
- width: 6px;
170
- height: 6px;
171
- }
172
- ::-webkit-scrollbar-track {
173
- background: transparent;
174
- }
175
- ::-webkit-scrollbar-thumb {
176
- background: var(--border);
177
- border-radius: var(--radius-full);
178
- }
179
- ::-webkit-scrollbar-thumb:hover {
180
- background: var(--text-tertiary);
181
- }
182
 
183
- /* ---------- Typography ---------- */
184
- h1, h2, h3, h4, h5, h6 {
185
- font-weight: 600;
186
- line-height: 1.3;
187
- color: var(--text);
188
- }
189
- p {
190
- color: var(--text-secondary);
191
- }
192
- a {
193
- color: var(--primary);
194
- text-decoration: none;
195
- }
196
- a:hover {
197
- text-decoration: underline;
198
- }
199
- small {
200
- font-size: 0.8125rem;
201
- color: var(--text-tertiary);
202
- }
203
  .text-secondary { color: var(--text-secondary); }
204
- .text-success { color: var(--success); }
205
- .text-error { color: var(--error); }
206
- .text-warning { color: var(--warning); }
207
- .text-primary { color: var(--primary); }
208
-
209
- /* ---------- Buttons ---------- */
 
 
 
 
 
 
210
  .btn {
211
- display: inline-flex;
212
- align-items: center;
213
- justify-content: center;
214
- gap: var(--space-2);
215
- padding: 0.625rem 1.25rem;
216
- font-size: 0.875rem;
217
- font-weight: 500;
218
- font-family: inherit;
219
- border: 1px solid transparent;
220
- border-radius: var(--radius-md);
221
- cursor: pointer;
222
- transition: all var(--transition-fast);
223
- text-decoration: none;
224
- white-space: nowrap;
225
- line-height: 1.4;
226
- position: relative;
227
- overflow: hidden;
228
- }
229
- .btn:disabled {
230
- opacity: 0.6;
231
- cursor: not-allowed;
232
- pointer-events: none;
233
- }
234
- .btn:active {
235
- transform: scale(0.98);
236
- }
237
 
238
  .btn-primary {
239
- background: var(--primary);
240
- color: white;
241
- border-color: var(--primary);
242
- box-shadow: var(--shadow-xs);
243
  }
244
  .btn-primary:hover:not(:disabled) {
245
- background: var(--primary-hover);
246
- border-color: var(--primary-hover);
247
- box-shadow: var(--shadow-sm);
248
- transform: translateY(-1px);
249
  }
250
 
251
  .btn-secondary {
252
- background: var(--bg-elevated);
253
- color: var(--text);
254
- border-color: var(--border);
 
255
  }
256
  .btn-secondary:hover:not(:disabled) {
257
- background: var(--bg-tertiary);
258
- border-color: var(--text-tertiary);
259
  }
260
 
261
  .btn-ghost {
262
- background: transparent;
263
- color: var(--text-secondary);
264
- border-color: transparent;
265
  }
266
  .btn-ghost:hover:not(:disabled) {
267
- background: var(--bg-tertiary);
268
- color: var(--text);
269
  }
270
 
271
- .btn-sm {
272
- padding: 0.375rem 0.75rem;
273
- font-size: 0.8125rem;
274
- border-radius: var(--radius-sm);
275
- }
276
- .btn-block { width: 100%; justify-content: center; }
277
 
278
  .btn-send {
279
- width: 40px;
280
- height: 40px;
281
- padding: 0;
282
- border-radius: var(--radius-full);
283
- background: var(--primary);
284
- color: white;
285
- border: none;
286
- box-shadow: var(--shadow-sm);
 
287
  }
288
  .btn-send:hover:not(:disabled) {
289
- background: var(--primary-hover);
290
- box-shadow: var(--shadow-md);
291
- transform: scale(1.05);
292
  }
293
  .btn-send:disabled {
294
- background: var(--bg-tertiary);
295
- color: var(--text-tertiary);
296
- box-shadow: none;
297
- transform: none;
298
  }
299
 
300
- /* Icon Button */
301
  .btn-icon {
302
- display: inline-flex;
303
- align-items: center;
304
- justify-content: center;
305
- width: 40px;
306
- height: 40px;
307
- background: transparent;
308
- border: none;
309
- border-radius: var(--radius-md);
310
- color: var(--text-secondary);
311
- cursor: pointer;
312
- transition: all var(--transition-fast);
313
- font-size: 1.125rem;
314
- position: relative;
315
- }
316
- .btn-icon:hover {
317
- background: var(--bg-tertiary);
318
- color: var(--text);
319
- }
320
- .btn-icon:active {
321
- background: var(--border);
322
- transform: scale(0.95);
323
- }
324
- .btn-icon-sm {
325
- width: 32px;
326
- height: 32px;
327
- font-size: 0.875rem;
328
- }
329
-
330
- /* Badge */
331
  .badge {
332
- position: absolute;
333
- top: 2px;
334
- right: 2px;
335
- min-width: 18px;
336
- height: 18px;
337
- padding: 0 4px;
338
- background: var(--error);
339
- color: white;
340
- font-size: 0.6875rem;
341
- font-weight: 600;
342
- border-radius: var(--radius-full);
343
- display: flex;
344
- align-items: center;
345
- justify-content: center;
346
- border: 2px solid var(--bg);
347
- }
348
-
349
- /* ---------- Forms ---------- */
350
- .form-group {
351
- margin-bottom: var(--space-4);
352
- }
353
  .form-group label {
354
- display: block;
355
- margin-bottom: var(--space-1);
356
- font-size: 0.875rem;
357
- font-weight: 500;
358
- color: var(--text);
359
- }
360
- .form-group label i {
361
- margin-right: var(--space-1);
362
- color: var(--text-secondary);
363
- }
364
-
365
- .input-wrapper {
366
- position: relative;
367
- display: flex;
368
- align-items: center;
369
- }
370
-
371
  .form-input {
372
- width: 100%;
373
- padding: 0.75rem 1rem;
374
- font-size: 0.9375rem;
375
- font-family: inherit;
376
- color: var(--input-text);
377
- background: var(--input-bg);
378
- border: 1px solid var(--input-border);
379
- border-radius: var(--radius-md);
380
- outline: none;
381
- transition: all var(--transition-fast);
382
- line-height: 1.5;
383
  }
384
  .form-input:focus {
385
- border-color: var(--border-focus);
386
- box-shadow: 0 0 0 3px var(--primary-light);
387
- }
388
- .form-input:disabled {
389
- opacity: 0.7;
390
- cursor: not-allowed;
391
- }
392
- .form-input::placeholder {
393
- color: var(--input-placeholder);
394
  }
 
 
395
 
396
  .input-toggle {
397
- position: absolute;
398
- right: var(--space-2);
399
- display: flex;
400
- align-items: center;
401
- justify-content: center;
402
- width: 32px;
403
- height: 32px;
404
- background: transparent;
405
- border: none;
406
- color: var(--text-tertiary);
407
- cursor: pointer;
408
- font-size: 0.875rem;
409
- border-radius: var(--radius-sm);
410
- }
411
- .input-toggle:hover {
412
- color: var(--text);
413
- background: var(--bg-tertiary);
414
- }
415
-
416
- .form-hint {
417
- display: block;
418
- margin-top: var(--space-1);
419
- font-size: 0.75rem;
420
- color: var(--text-tertiary);
421
- }
422
- .label-hint {
423
- font-weight: 400;
424
- font-size: 0.75rem;
425
- color: var(--text-tertiary);
426
- }
427
-
428
- /* Password Strength */
429
- .password-strength {
430
- margin-top: var(--space-2);
431
- margin-bottom: var(--space-4);
432
- display: flex;
433
- align-items: center;
434
- gap: var(--space-2);
435
- }
436
- .strength-bar {
437
- flex: 1;
438
- height: 4px;
439
- background: var(--bg-tertiary);
440
- border-radius: var(--radius-full);
441
- overflow: hidden;
442
- }
443
- .strength-fill {
444
- height: 100%;
445
- width: 0;
446
- background: var(--error);
447
- border-radius: var(--radius-full);
448
- transition: all var(--transition);
449
- }
450
- .strength-fill.weak { background: var(--error); width: 25%; }
451
- .strength-fill.fair { background: var(--warning); width: 50%; }
452
- .strength-fill.good { background: #3B82F6; width: 75%; }
453
- .strength-fill.strong { background: var(--success); width: 100%; }
454
- .strength-text {
455
- font-size: 0.75rem;
456
- font-weight: 500;
457
- min-width: 50px;
458
- }
459
-
460
- /* ---------- Alerts ---------- */
461
  .alert {
462
- padding: var(--space-3) var(--space-4);
463
- border-radius: var(--radius-md);
464
- display: flex;
465
- align-items: center;
466
- gap: var(--space-2);
467
- font-size: 0.875rem;
468
- margin-top: var(--space-4);
469
- display: none;
470
- }
471
- .alert:not(:empty) {
472
- display: flex;
473
- }
474
- .alert i {
475
- font-size: 1.125rem;
476
- }
477
- .alert-error {
478
- background: #FEF2F2;
479
- color: var(--error);
480
- border: 1px solid #FCA5A5;
481
- }
482
-
483
- /* ---------- Spinner ---------- */
484
  .spinner {
485
- width: 24px;
486
- height: 24px;
487
- border: 3px solid var(--border);
488
- border-top-color: var(--primary);
489
- border-radius: 50%;
490
- animation: spin 0.8s linear infinite;
491
  }
492
- .spinner-sm { width: 16px; height: 16px; border-width: 2px; }
493
- @keyframes spin { to { transform: rotate(360deg); } }
494
 
495
- /* ========== AUTH SCREEN ========== */
496
  #auth-screen {
497
- background: var(--bg);
498
- position: relative;
499
- overflow: hidden;
500
- justify-content: center;
501
- align-items: center;
502
- padding: var(--space-4);
503
- }
504
- .auth-bg {
505
- position: absolute;
506
- top: 0; left: 0; width: 100%; height: 100%;
507
- pointer-events: none; z-index: 0;
508
- }
509
  .auth-bg-circle {
510
- position: absolute;
511
- border-radius: 50%;
512
- background: var(--primary-light);
513
- opacity: 0.4;
514
- filter: blur(60px);
515
  }
516
- .auth-bg-circle-1 { width: 300px; height: 300px; top: -100px; right: -50px; }
517
- .auth-bg-circle-2 { width: 200px; height: 200px; bottom: -80px; left: -50px; }
518
- .auth-bg-circle-3 { width: 150px; height: 150px; top: 40%; left: 40%; }
519
 
520
  .auth-container {
521
- position: relative;
522
- z-index: 1;
523
- width: 100%;
524
- max-width: 440px;
525
- background: var(--bg-elevated);
526
- border-radius: var(--radius-2xl);
527
- box-shadow: var(--shadow-xl);
528
- padding: var(--space-8);
529
- }
530
- .auth-header {
531
- text-align: center;
532
- margin-bottom: var(--space-8);
533
- }
534
  .auth-logo {
535
- width: 64px;
536
- height: 64px;
537
- margin: 0 auto var(--space-4);
538
- background: var(--primary);
539
- color: white;
540
- border-radius: var(--radius-xl);
541
- display: flex;
542
- align-items: center;
543
- justify-content: center;
544
- font-size: 1.75rem;
545
- box-shadow: var(--shadow-lg);
546
- }
547
- .auth-title {
548
- font-size: 1.75rem;
549
- font-weight: 700;
550
- margin-bottom: var(--space-1);
551
- color: var(--text);
552
- }
553
- .auth-subtitle {
554
- font-size: 0.875rem;
555
- color: var(--text-secondary);
556
- }
557
  .auth-tabs {
558
- display: flex;
559
- gap: var(--space-2);
560
- margin-bottom: var(--space-6);
561
- background: var(--bg-tertiary);
562
- padding: var(--space-1);
563
- border-radius: var(--radius-md);
564
  }
565
  .auth-tab {
566
- flex: 1;
567
- display: flex;
568
- align-items: center;
569
- justify-content: center;
570
- gap: var(--space-2);
571
- padding: var(--space-2) var(--space-4);
572
- font-size: 0.875rem;
573
- font-weight: 500;
574
- color: var(--text-secondary);
575
- background: transparent;
576
- border: none;
577
- border-radius: var(--radius-sm);
578
- cursor: pointer;
579
- transition: all var(--transition-fast);
580
  }
581
  .auth-tab.active {
582
- background: var(--bg-elevated);
583
- color: var(--text);
584
- box-shadow: var(--shadow-sm);
585
- }
586
- .auth-form {
587
- display: none;
588
- }
589
- .auth-form.active {
590
- display: block;
591
  }
 
 
 
592
  .auth-loading {
593
- display: flex;
594
- align-items: center;
595
- justify-content: center;
596
- gap: var(--space-2);
597
- margin-top: var(--space-4);
598
- color: var(--text-secondary);
599
  }
600
- .auth-loading.hidden { display: none; }
601
 
602
- /* ========== CHAT HEADER ========== */
603
  .chat-header {
604
- display: flex;
605
- align-items: center;
606
- justify-content: space-between;
607
- padding: 0 var(--space-4);
608
- height: var(--header-height);
609
- background: var(--header-bg);
610
- border-bottom: 1px solid var(--header-border);
611
- flex-shrink: 0;
612
- z-index: 10;
613
- }
614
- .header-section {
615
- display: flex;
616
- align-items: center;
617
- gap: var(--space-3);
 
 
 
618
  }
619
  .header-avatar-img {
620
- width: 40px;
621
- height: 40px;
622
- border-radius: var(--radius-full);
623
- object-fit: cover;
624
- border: 2px solid var(--border);
625
- }
626
- .header-avatar-img.hidden,
627
- #header-avatar-placeholder.hidden {
628
- display: none;
629
- }
630
- .header-info {
631
- display: flex;
632
- flex-direction: column;
633
- }
634
- .header-name {
635
- font-size: 1rem;
636
- font-weight: 600;
637
- line-height: 1.3;
638
- color: var(--text);
639
- }
640
  .header-status {
641
- font-size: 0.75rem;
642
- color: var(--text-secondary);
643
- display: flex;
644
- align-items: center;
645
- gap: var(--space-1);
646
- }
647
- .status-dot {
648
- width: 8px;
649
- height: 8px;
650
- border-radius: 50%;
651
- background: var(--text-tertiary);
652
  }
653
- .status-dot.online { background: var(--success); }
 
654
 
655
- /* Connection Status */
656
  .connection-status {
657
- height: 28px;
658
- padding: 0 var(--space-4);
659
- background: var(--bg-secondary);
660
- border-bottom: 1px solid var(--border-light);
661
- display: flex;
662
- align-items: center;
663
- gap: var(--space-2);
664
- font-size: 0.75rem;
665
- color: var(--text-secondary);
666
- }
667
- .connection-status.connected { color: var(--success); }
668
- .connection-status.reconnecting { color: var(--warning); }
669
- .connection-status.disconnected { color: var(--error); }
670
-
671
- /* ========== MESSAGES CONTAINER ========== */
672
  .messages-container {
673
- flex: 1;
674
- overflow: hidden;
675
- position: relative;
676
- background: var(--bg);
677
  }
678
  .messages-scroll {
679
- height: 100%;
680
- overflow-y: auto;
681
- padding: var(--space-4);
682
- scroll-behavior: smooth;
683
- }
684
- .load-more {
685
- text-align: center;
686
- margin-bottom: var(--space-4);
687
- }
688
- .load-more .btn {
689
- font-size: 0.8125rem;
690
  }
 
691
  .messages-list {
692
- display: flex;
693
- flex-direction: column;
694
- gap: var(--space-2);
695
- min-height: 100%;
696
  }
697
  .empty-state {
698
- display: flex;
699
- flex-direction: column;
700
- align-items: center;
701
- justify-content: center;
702
- padding: var(--space-12) var(--space-4);
703
- text-align: center;
704
- color: var(--text-secondary);
705
- opacity: 0.7;
706
- height: 100%;
707
- }
708
- .empty-icon {
709
- font-size: 3rem;
710
- margin-bottom: var(--space-4);
711
- color: var(--text-tertiary);
712
- }
713
- .empty-state h3 {
714
- margin-bottom: var(--space-1);
715
- font-size: 1.125rem;
716
- color: var(--text);
717
- }
718
- .empty-state p {
719
- color: var(--text-secondary);
720
  }
 
 
 
721
 
722
  .scroll-bottom-btn {
723
- position: absolute;
724
- bottom: var(--space-4);
725
- right: var(--space-4);
726
- width: 36px;
727
- height: 36px;
728
- background: var(--bg-elevated);
729
- border: 1px solid var(--border);
730
- border-radius: var(--radius-full);
731
- box-shadow: var(--shadow-md);
732
- display: flex;
733
- align-items: center;
734
- justify-content: center;
735
- cursor: pointer;
736
- transition: all var(--transition-fast);
737
- z-index: 5;
738
- color: var(--text-secondary);
739
- }
740
- .scroll-bottom-btn:hover {
741
- background: var(--bg-tertiary);
742
- transform: scale(1.05);
743
- }
744
-
745
- /* ========== MESSAGE BUBBLES ========== */
746
  .message-wrapper {
747
- display: flex;
748
- flex-direction: column;
749
- animation: messageSlide 0.3s ease;
750
- }
751
- .message-wrapper.self { align-items: flex-end; }
752
- .message-wrapper.other { align-items: flex-start; }
753
- .message-sender {
754
- font-size: 0.75rem;
755
- font-weight: 500;
756
- margin-bottom: var(--space-1);
757
- color: var(--primary);
758
- padding: 0 var(--space-3);
759
  }
 
 
 
 
 
760
  .message-bubble {
761
- max-width: 75%;
762
- padding: 0.625rem 1rem;
763
- border-radius: var(--radius-lg);
764
- word-wrap: break-word;
765
- overflow-wrap: break-word;
766
- white-space: pre-wrap;
767
- line-height: 1.5;
768
- position: relative;
769
- }
770
- .message-self .message-bubble {
771
- background: var(--bubble-self);
772
- color: var(--bubble-self-text);
773
- border-bottom-right-radius: var(--radius-sm);
774
- }
775
- .message-other .message-bubble {
776
- background: var(--bubble-other);
777
- color: var(--bubble-other-text);
778
- border-bottom-left-radius: var(--radius-sm);
779
  }
780
  .message-bubble.deleted {
781
- opacity: 0.6;
782
- font-style: italic;
783
- color: var(--text-secondary);
784
- }
785
- .message-text {
786
- font-size: 0.9375rem;
787
  }
 
 
788
  .message-meta {
789
- display: flex;
790
- align-items: center;
791
- gap: var(--space-2);
792
- margin-top: var(--space-1);
793
- font-size: 0.6875rem;
794
- }
795
- .message-self .message-meta { justify-content: flex-end; opacity: 0.9; }
796
- .message-other .message-meta { color: var(--text-tertiary); }
797
- .message-time { white-space: nowrap; }
798
- .message-status { display: inline-flex; align-items: center; gap: 2px; }
799
- .message-status .fa-check { font-size: 0.625rem; }
800
- .message-status.read { color: var(--primary); }
 
 
 
 
801
  .message-actions {
802
- display: flex;
803
- gap: 2px;
804
- margin-top: var(--space-1);
805
- opacity: 0;
806
- transition: opacity var(--transition-fast);
807
  }
808
- .message-wrapper:hover .message-actions { opacity: 1; }
809
  .message-actions button {
810
- width: 28px;
811
- height: 28px;
812
- background: transparent;
813
- border: none;
814
- border-radius: var(--radius-sm);
815
- color: inherit;
816
- cursor: pointer;
817
- font-size: 0.75rem;
818
- transition: all var(--transition-fast);
819
- display: flex;
820
- align-items: center;
821
- justify-content: center;
822
- }
823
- .message-other .message-actions button { color: var(--text-secondary); }
824
- .message-other .message-actions button:hover { background: var(--bg-tertiary); color: var(--text); }
825
- .message-self .message-actions button:hover { background: rgba(255,255,255,0.2); }
826
-
827
- /* Reply Indicator */
828
- .reply-indicator {
829
- display: flex;
830
- align-items: center;
831
- gap: var(--space-2);
832
- padding: var(--space-1) var(--space-2);
833
- margin-bottom: var(--space-2);
834
- font-size: 0.75rem;
835
- background: rgba(0,0,0,0.05);
836
- border-radius: var(--radius-sm);
837
- border-left: 3px solid var(--primary);
838
- color: var(--text-secondary);
839
  }
840
- [data-theme="dark"] .reply-indicator {
841
- background: rgba(255,255,255,0.05);
 
 
 
 
 
 
 
 
 
 
842
  }
 
 
843
 
844
  /* Attachments */
845
- .attachment { margin-top: var(--space-2); border-radius: var(--radius-md); overflow: hidden; }
846
- .attachment img {
847
- max-width: 100%;
848
- max-height: 300px;
849
- object-fit: cover;
850
- border-radius: var(--radius-md);
851
- cursor: pointer;
852
- display: block;
853
- }
854
- .attachment video {
855
- max-width: 100%;
856
- max-height: 300px;
857
- border-radius: var(--radius-md);
858
- }
859
- .attachment audio { width: 100%; }
860
  .attachment-file {
861
- display: flex;
862
- align-items: center;
863
- gap: var(--space-2);
864
- padding: var(--space-2) var(--space-3);
865
- background: var(--bg-secondary);
866
- border-radius: var(--radius-md);
867
- cursor: pointer;
868
- transition: all var(--transition-fast);
869
- color: var(--text);
870
- }
871
- .attachment-file:hover { background: var(--bg-tertiary); }
872
- .attachment-file .fa-file { font-size: 1.5rem; color: var(--primary); }
873
- .file-info { flex: 1; min-width: 0; }
874
- .file-name {
875
- font-size: 0.875rem;
876
- font-weight: 500;
877
- white-space: nowrap;
878
- overflow: hidden;
879
- text-overflow: ellipsis;
880
- }
881
- .file-size { font-size: 0.75rem; color: var(--text-tertiary); }
882
- .edited-label { font-size: 0.6875rem; font-style: italic; opacity: 0.7; }
883
-
884
- @keyframes messageSlide {
885
- from { opacity: 0; transform: translateY(10px); }
886
- to { opacity: 1; transform: translateY(0); }
887
- }
888
-
889
- /* ========== TYPING INDICATOR ========== */
890
  .typing-indicator {
891
- padding: var(--space-2) var(--space-4);
892
- background: var(--bg-secondary);
893
- border-top: 1px solid var(--border-light);
894
- display: flex;
895
- align-items: center;
896
- gap: var(--space-2);
897
- height: 36px;
898
- flex-shrink: 0;
899
- color: var(--text-secondary);
900
- }
901
- .typing-dots { display: flex; gap: 3px; }
902
  .typing-dot {
903
- width: 6px;
904
- height: 6px;
905
- border-radius: 50%;
906
- background: var(--text-tertiary);
907
- animation: typingBounce 1.4s infinite ease-in-out both;
908
- }
909
- .typing-dot:nth-child(1) { animation-delay: -0.32s; }
910
- .typing-dot:nth-child(2) { animation-delay: -0.16s; }
911
- @keyframes typingBounce { 0%, 80%, 100% { transform: scale(0); } 40% { transform: scale(1); } }
912
- .typing-text { font-size: 0.8125rem; }
913
-
914
- /* ========== REPLY PREVIEW ========== */
915
- .reply-preview {
916
- flex-shrink: 0;
917
- border-top: 1px solid var(--border-light);
918
- }
919
  .reply-bar {
920
- display: flex;
921
- align-items: center;
922
- gap: var(--space-3);
923
- padding: var(--space-2) var(--space-4);
924
- background: var(--bg-secondary);
925
- color: var(--text);
926
- }
927
- .reply-icon { color: var(--text-secondary); flex-shrink: 0; }
928
- .reply-content { flex: 1; min-width: 0; }
929
- .reply-label { font-size: 0.75rem; font-weight: 600; color: var(--primary); }
930
- .reply-text {
931
- font-size: 0.8125rem;
932
- color: var(--text-secondary);
933
- display: block;
934
- overflow: hidden;
935
- text-overflow: ellipsis;
936
- white-space: nowrap;
937
- }
938
-
939
- /* ========== COMPOSE AREA ========== */
940
  .compose-area {
941
- flex-shrink: 0;
942
- border-top: 1px solid var(--border);
943
- background: var(--bg-elevated);
944
- }
945
- .compose-form {
946
- display: flex;
947
- align-items: flex-end;
948
- padding: var(--space-2) var(--space-3);
949
- gap: var(--space-2);
950
- }
951
- .compose-tools {
952
- display: flex;
953
- flex-direction: column;
954
- gap: 2px;
955
- padding-bottom: var(--space-1);
956
- }
957
- .input-area { flex: 1; }
958
  .message-input {
959
- width: 100%;
960
- resize: none;
961
- padding: 0.625rem 1rem;
962
- font-size: 0.9375rem;
963
- font-family: inherit;
964
- color: var(--input-text);
965
- background: var(--input-bg);
966
- border: 1px solid var(--input-border);
967
- border-radius: var(--radius-xl);
968
- outline: none;
969
- min-height: 40px;
970
- max-height: 120px;
971
- line-height: 1.5;
972
- transition: all var(--transition-fast);
973
- overflow-y: auto;
974
  }
975
  .message-input:focus {
976
- border-color: var(--border-focus);
977
- box-shadow: 0 0 0 3px var(--primary-light);
978
- }
979
- .message-input::placeholder { color: var(--input-placeholder); }
980
-
981
- .upload-preview {
982
- display: flex;
983
- align-items: center;
984
- justify-content: space-between;
985
- padding: var(--space-2) var(--space-4);
986
- background: var(--bg-secondary);
987
- border-bottom: 1px solid var(--border-light);
988
- color: var(--text);
989
- }
990
- .upload-info {
991
- display: flex;
992
- align-items: center;
993
- gap: var(--space-2);
994
- font-size: 0.8125rem;
995
  }
 
996
  .upload-progress {
997
- padding: var(--space-2) var(--space-4);
998
- background: var(--bg-secondary);
999
- display: flex;
1000
- align-items: center;
1001
- gap: var(--space-3);
1002
- color: var(--text);
1003
- }
1004
- .progress-track {
1005
- flex: 1;
1006
- height: 4px;
1007
- background: var(--border);
1008
- border-radius: var(--radius-full);
1009
- overflow: hidden;
1010
- }
1011
- .progress-fill {
1012
- height: 100%;
1013
- background: var(--primary);
1014
- border-radius: var(--radius-full);
1015
- transition: width var(--transition);
1016
- }
1017
- .progress-text {
1018
- font-size: 0.75rem;
1019
- font-weight: 500;
1020
- color: var(--text-secondary);
1021
- min-width: 36px;
1022
- }
1023
-
1024
- /* ========== MODALS ========== */
1025
  .modal {
1026
- position: fixed;
1027
- inset: 0;
1028
- z-index: 100;
1029
- display: flex;
1030
- align-items: center;
1031
- justify-content: center;
1032
- padding: var(--space-4);
1033
- visibility: hidden;
1034
- opacity: 0;
1035
- transition: all var(--transition);
1036
- }
1037
- .modal:not(.hidden) { visibility: visible; opacity: 1; }
1038
  .modal-backdrop {
1039
- position: absolute;
1040
- inset: 0;
1041
- background: rgba(0,0,0,0.5);
1042
- backdrop-filter: blur(4px);
1043
  }
1044
  .modal-container {
1045
- position: relative;
1046
- width: 100%;
1047
- max-width: 520px;
1048
- max-height: 90vh;
1049
- background: var(--bg-elevated);
1050
- border-radius: var(--radius-xl);
1051
- box-shadow: var(--shadow-xl);
1052
- overflow: hidden;
1053
- display: flex;
1054
- flex-direction: column;
1055
- color: var(--text);
1056
- }
1057
- .modal-sm { max-width: 400px; }
1058
  .modal-header {
1059
- display: flex;
1060
- align-items: center;
1061
- justify-content: space-between;
1062
- padding: var(--space-4) var(--space-6);
1063
- border-bottom: 1px solid var(--border);
1064
- }
1065
- .modal-header h2 {
1066
- font-size: 1.125rem;
1067
- font-weight: 600;
1068
- color: var(--text);
1069
- }
1070
- .modal-header h2 i { margin-right: var(--space-2); color: var(--primary); }
1071
- .modal-body {
1072
- padding: var(--space-6);
1073
- overflow-y: auto;
1074
- flex: 1;
1075
- }
1076
  .modal-footer {
1077
- padding: var(--space-4) var(--space-6);
1078
- border-top: 1px solid var(--border);
1079
- display: flex;
1080
- justify-content: flex-end;
1081
- gap: var(--space-2);
1082
- background: var(--bg-secondary);
1083
  }
1084
 
1085
- /* Settings Styles */
1086
- .settings-section {
1087
- margin-bottom: var(--space-8);
1088
- }
1089
- .settings-section:last-child { margin-bottom: 0; }
1090
  .settings-section h3 {
1091
- font-size: 0.75rem;
1092
- font-weight: 600;
1093
- text-transform: uppercase;
1094
- letter-spacing: 0.05em;
1095
- color: var(--text-secondary);
1096
- margin-bottom: var(--space-4);
1097
- padding-bottom: var(--space-2);
1098
- border-bottom: 1px solid var(--border-light);
1099
- }
1100
- .settings-row { margin-bottom: var(--space-4); }
1101
  .avatar-section {
1102
- display: flex;
1103
- align-items: center;
1104
- gap: var(--space-4);
1105
- margin-bottom: var(--space-4);
1106
  }
1107
  .settings-avatar {
1108
- width: 72px;
1109
- height: 72px;
1110
- border-radius: var(--radius-full);
1111
- background: var(--bg-tertiary);
1112
- display: flex;
1113
- align-items: center;
1114
- justify-content: center;
1115
- font-size: 2rem;
1116
- color: var(--text-secondary);
1117
- overflow: hidden;
1118
  }
1119
  .settings-avatar-img {
1120
- width: 72px;
1121
- height: 72px;
1122
- border-radius: var(--radius-full);
1123
- object-fit: cover;
1124
- }
1125
- .theme-selector {
1126
- display: grid;
1127
- grid-template-columns: repeat(3, 1fr);
1128
- gap: var(--space-3);
1129
- margin-top: var(--space-2);
1130
  }
 
 
 
1131
  .theme-option {
1132
- display: flex;
1133
- flex-direction: column;
1134
- align-items: center;
1135
- gap: var(--space-2);
1136
- padding: var(--space-3);
1137
- background: var(--bg-secondary);
1138
- border: 2px solid var(--border);
1139
- border-radius: var(--radius-md);
1140
- cursor: pointer;
1141
- transition: all var(--transition-fast);
1142
- font-size: 0.75rem;
1143
- font-weight: 500;
1144
- text-align: center;
1145
- color: var(--text);
1146
- }
1147
- .theme-option.active {
1148
- border-color: var(--primary);
1149
- background: var(--primary-light);
1150
- }
1151
  .theme-preview {
1152
- width: 60px;
1153
- height: 40px;
1154
- border-radius: var(--radius-sm);
1155
- overflow: hidden;
1156
- border: 1px solid var(--border);
1157
- }
1158
- .theme-preview-header { height: 8px; background: var(--bg-secondary); }
1159
- .theme-preview-body { padding: 4px; display: flex; flex-direction: column; gap: 2px; }
1160
- .theme-preview-message { height: 6px; border-radius: 3px; width: 70%; }
1161
- .theme-preview-message.self { background: var(--primary); align-self: flex-end; }
1162
- .theme-preview-message.other { background: var(--bg-tertiary); }
1163
- .theme-preview-light { background: #FFFFFF; }
1164
- .theme-preview-dark { background: #1F2937; }
1165
- .theme-preview-light .theme-preview-header { background: #F9FAFB; }
1166
- .theme-preview-dark .theme-preview-header { background: #111827; }
1167
- .theme-preview-light .theme-preview-message.other { background: #F3F4F6; }
1168
- .theme-preview-dark .theme-preview-message.other { background: #374151; }
 
 
 
 
 
 
 
 
1169
 
1170
  .custom-theme-section {
1171
- margin-top: var(--space-4);
1172
- padding: var(--space-4);
1173
- background: var(--bg-secondary);
1174
- border-radius: var(--radius-md);
1175
- border: 1px solid var(--border);
1176
- }
1177
- .color-picker-row {
1178
- display: grid;
1179
- grid-template-columns: repeat(3, 1fr);
1180
- gap: var(--space-4);
1181
  }
 
1182
  .color-picker-group label {
1183
- display: block;
1184
- font-size: 0.75rem;
1185
- font-weight: 500;
1186
- margin-bottom: var(--space-2);
1187
- color: var(--text);
1188
- }
1189
- .color-input-wrapper {
1190
- display: flex;
1191
- align-items: center;
1192
- gap: var(--space-2);
1193
  }
 
1194
  .color-input-wrapper input[type="color"] {
1195
- width: 36px;
1196
- height: 36px;
1197
- border: 1px solid var(--border);
1198
- border-radius: var(--radius-sm);
1199
- padding: 2px;
1200
- cursor: pointer;
1201
- background: none;
1202
- }
1203
- .color-hex {
1204
- font-size: 0.75rem;
1205
- font-family: var(--font-mono);
1206
- color: var(--text-secondary);
1207
- }
1208
- .about-info {
1209
- display: flex;
1210
- flex-direction: column;
1211
- gap: var(--space-3);
1212
  }
 
 
 
 
1213
  .about-row {
1214
- display: flex;
1215
- justify-content: space-between;
1216
- align-items: center;
1217
- padding: var(--space-2) 0;
1218
- border-bottom: 1px solid var(--border-light);
1219
- font-size: 0.875rem;
1220
- color: var(--text);
1221
- }
1222
- .about-row:last-child { border-bottom: none; }
1223
-
1224
- /* Online Users Modal */
1225
- .online-users-list {
1226
- max-height: 300px;
1227
- overflow-y: auto;
1228
- }
1229
- .loading-state {
1230
- display: flex;
1231
- align-items: center;
1232
- justify-content: center;
1233
- gap: var(--space-2);
1234
- padding: var(--space-8);
1235
- color: var(--text-secondary);
1236
- }
1237
- .user-item {
1238
- display: flex;
1239
- align-items: center;
1240
- gap: var(--space-3);
1241
- padding: var(--space-2) var(--space-4);
1242
- transition: background var(--transition-fast);
1243
- color: var(--text);
1244
- }
1245
- .user-item:hover { background: var(--bg-secondary); }
1246
- .user-avatar {
1247
- width: 40px;
1248
- height: 40px;
1249
- border-radius: var(--radius-full);
1250
- background: var(--bg-tertiary);
1251
- display: flex;
1252
- align-items: center;
1253
- justify-content: center;
1254
- color: var(--text-secondary);
1255
- font-size: 1rem;
1256
- overflow: hidden;
1257
- }
1258
- .user-avatar img { width: 100%; height: 100%; object-fit: cover; }
1259
- .user-info { flex: 1; }
1260
- .user-name { font-weight: 500; font-size: 0.875rem; }
1261
- .user-status-text { font-size: 0.75rem; color: var(--text-secondary); }
1262
-
1263
- /* Emoji Picker */
1264
  .emoji-picker {
1265
- position: fixed;
1266
- bottom: 100px;
1267
- left: 50%;
1268
- transform: translateX(-50%);
1269
- z-index: 50;
1270
- background: var(--bg-elevated);
1271
- border: 1px solid var(--border);
1272
- border-radius: var(--radius-lg);
1273
- box-shadow: var(--shadow-xl);
1274
- width: 320px;
1275
- max-height: 350px;
1276
- overflow: hidden;
1277
- }
1278
- .emoji-header {
1279
- border-bottom: 1px solid var(--border);
1280
- padding: var(--space-2);
1281
- }
1282
- .emoji-categories { display: flex; gap: 2px; }
1283
  .emoji-cat {
1284
- width: 36px;
1285
- height: 36px;
1286
- border: none;
1287
- background: transparent;
1288
- border-radius: var(--radius-sm);
1289
- cursor: pointer;
1290
- color: var(--text-secondary);
1291
- font-size: 0.875rem;
1292
- transition: all var(--transition-fast);
1293
- }
1294
- .emoji-cat.active {
1295
- background: var(--primary-light);
1296
- color: var(--primary);
1297
- }
1298
- .emoji-cat:hover { background: var(--bg-tertiary); }
1299
  .emoji-grid {
1300
- padding: var(--space-2);
1301
- display: grid;
1302
- grid-template-columns: repeat(8, 1fr);
1303
- gap: 2px;
1304
- max-height: 280px;
1305
- overflow-y: auto;
1306
  }
1307
  .emoji-item {
1308
- width: 36px;
1309
- height: 36px;
1310
- display: flex;
1311
- align-items: center;
1312
- justify-content: center;
1313
- font-size: 1.25rem;
1314
- cursor: pointer;
1315
- border-radius: var(--radius-sm);
1316
- border: none;
1317
- background: transparent;
1318
- transition: background var(--transition-fast);
1319
- }
1320
- .emoji-item:hover { background: var(--bg-tertiary); }
1321
-
1322
- /* Toast Notifications */
1323
- .toast-container {
1324
- position: fixed;
1325
- top: var(--space-4);
1326
- right: var(--space-4);
1327
- z-index: 200;
1328
- display: flex;
1329
- flex-direction: column;
1330
- gap: var(--space-2);
1331
- max-width: 360px;
1332
  }
 
 
 
 
1333
  .toast {
1334
- padding: var(--space-3) var(--space-4);
1335
- background: var(--bg-elevated);
1336
- border: 1px solid var(--border);
1337
- border-radius: var(--radius-md);
1338
- box-shadow: var(--shadow-md);
1339
- display: flex;
1340
- align-items: center;
1341
- gap: var(--space-3);
1342
- animation: toastSlide 0.3s ease;
1343
- font-size: 0.875rem;
1344
- color: var(--text);
1345
- }
1346
- .toast.toast-success { border-left: 3px solid var(--success); }
1347
- .toast.toast-error { border-left: 3px solid var(--error); }
1348
- .toast.toast-warning { border-left: 3px solid var(--warning); }
1349
- .toast.toast-info { border-left: 3px solid var(--info); }
1350
- @keyframes toastSlide { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
1351
-
1352
- /* ========== UTILITY ========== */
1353
- .hidden { display: none !important; }
1354
-
1355
- /* ========== RESPONSIVE ========== */
1356
- @media (max-width: 640px) {
1357
- .auth-container { padding: var(--space-6); border-radius: var(--radius-xl); }
1358
- .message-bubble { max-width: 85%; }
1359
- .compose-form { padding: var(--space-1) var(--space-2); }
1360
- .modal { padding: 0; align-items: flex-end; }
1361
- .modal-container { max-height: 85vh; border-radius: var(--radius-xl) var(--radius-xl) 0 0; }
1362
- .color-picker-row { grid-template-columns: 1fr; }
1363
- .theme-selector { grid-template-columns: 1fr; }
1364
- .emoji-picker { left: 8px; right: 8px; transform: none; width: auto; }
1365
- }
1366
-
1367
- @media (min-width: 768px) {
1368
- .message-bubble { max-width: 65%; }
1369
- .compose-form { padding: var(--space-2) var(--space-4); }
1370
- }
1371
-
1372
- @media (min-width: 1024px) {
1373
- .message-bubble { max-width: 55%; }
1374
- }
 
1
+ /* ==============================================
2
+ InfinityChat — Full Design System
3
+ All colours flow from :root variables only.
4
+ No hardcoded light/dark splits on elements.
5
+ ============================================== */
6
 
7
+ /* ---- Light Theme (default on :root) ---- */
8
  :root {
9
+ --primary: #2563EB;
10
+ --primary-hover: #1D4ED8;
11
+ --primary-light: #DBEAFE;
12
+ --primary-dark: #1E40AF;
13
+
14
+ --bg: #FFFFFF;
15
+ --bg-secondary: #F9FAFB;
16
+ --bg-tertiary: #F3F4F6;
17
+ --bg-elevated: #FFFFFF;
18
+
19
+ --text: #111827;
20
+ --text-secondary: #4B5563;
21
+ --text-tertiary: #9CA3AF;
22
+ --text-inverse: #FFFFFF;
23
+
24
+ --border: #E5E7EB;
25
+ --border-light: #F3F4F6;
26
+
27
+ --bubble-self: #2563EB;
28
+ --bubble-self-text: #FFFFFF;
29
+ --bubble-other: #F3F4F6;
30
+ --bubble-other-text: #111827;
31
+
32
+ --header-bg: #FFFFFF;
33
+ --header-border: #E5E7EB;
34
+
35
+ --input-bg: #F3F4F6;
36
+ --input-border: #E5E7EB;
37
+ --input-text: #111827;
38
+ --input-placeholder:#9CA3AF;
39
+
40
+ --success: #10B981;
41
+ --warning: #F59E0B;
42
+ --error: #EF4444;
43
+ --info: #3B82F6;
44
+
45
+ --shadow-xs: 0 1px 2px rgba(0,0,0,0.05);
46
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.10), 0 1px 2px rgba(0,0,0,0.06);
47
+ --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.10), 0 2px 4px -1px rgba(0,0,0,0.06);
48
+ --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.10), 0 4px 6px -2px rgba(0,0,0,0.05);
49
+ --shadow-xl: 0 20px 25px -5px rgba(0,0,0,0.10), 0 10px 10px -5px rgba(0,0,0,0.04);
50
+
51
+ --radius-xs: 4px;
52
+ --radius-sm: 6px;
53
+ --radius-md: 8px;
54
+ --radius-lg: 12px;
55
+ --radius-xl: 16px;
56
+ --radius-2xl: 20px;
57
+ --radius-full: 9999px;
58
+
59
+ --transition-fast: 150ms cubic-bezier(0.4,0,0.2,1);
60
+ --transition: 200ms cubic-bezier(0.4,0,0.2,1);
61
+ --transition-slow: 300ms cubic-bezier(0.4,0,0.2,1);
62
+
63
+ --font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
64
+ --font-mono: 'SF Mono', 'Fira Code', monospace;
65
+
66
+ --header-height: 64px;
67
+ }
68
+
69
+ /* ---- Dark Theme ---- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  [data-theme="dark"] {
71
+ --primary: #60A5FA;
72
+ --primary-hover: #3B82F6;
73
+ --primary-light: #1E3A5F;
74
+ --primary-dark: #1D4ED8;
75
 
76
+ --bg: #0F172A;
77
+ --bg-secondary: #1E293B;
78
+ --bg-tertiary: #334155;
79
+ --bg-elevated: #1E293B;
80
 
81
+ --text: #F1F5F9;
82
+ --text-secondary: #94A3B8;
83
+ --text-tertiary: #64748B;
84
+ --text-inverse: #0F172A;
85
 
86
+ --border: #334155;
87
+ --border-light: #1E293B;
88
 
89
+ --bubble-self: #3B82F6;
90
+ --bubble-self-text: #FFFFFF;
91
+ --bubble-other: #334155;
92
+ --bubble-other-text: #F1F5F9;
93
 
94
+ --header-bg: #1E293B;
95
+ --header-border: #334155;
 
96
 
97
+ --input-bg: #334155;
98
+ --input-border: #475569;
99
+ --input-text: #F1F5F9;
100
+ --input-placeholder:#64748B;
101
 
102
+ --shadow-xs: 0 1px 2px rgba(0,0,0,0.4);
103
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.5);
104
+ --shadow-md: 0 4px 6px rgba(0,0,0,0.5);
105
+ --shadow-lg: 0 10px 15px rgba(0,0,0,0.5);
106
+ --shadow-xl: 0 20px 25px rgba(0,0,0,0.5);
107
  }
108
 
109
+ /* ---- Reset ---- */
110
+ *, *::before, *::after { margin:0; padding:0; box-sizing:border-box; }
 
 
 
 
 
 
 
 
 
111
 
112
  html {
113
+ font-size: 16px;
114
+ -webkit-text-size-adjust: 100%;
115
+ -webkit-font-smoothing: antialiased;
116
+ -moz-osx-font-smoothing: grayscale;
 
117
  }
118
 
119
  body {
120
+ font-family: var(--font-family);
121
+ font-size: 0.9375rem;
122
+ line-height: 1.5;
123
+ color: var(--text);
124
+ background: var(--bg);
125
+ overflow: hidden;
126
+ height: 100vh;
127
+ height: 100dvh;
128
+ width: 100vw;
129
+ }
130
+
131
+ /* ---- Scrollbar ---- */
132
+ ::-webkit-scrollbar { width:6px; height:6px; }
133
+ ::-webkit-scrollbar-track { background: transparent; }
134
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: var(--radius-full); }
135
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-tertiary); }
136
+
137
+ /* ---- Typography ---- */
138
+ h1,h2,h3,h4,h5,h6 { font-weight:600; line-height:1.3; color: var(--text); }
139
+ p { color: var(--text-secondary); }
140
+ a { color: var(--primary); text-decoration:none; }
141
+ a:hover { text-decoration: underline; }
 
 
 
 
142
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  .text-secondary { color: var(--text-secondary); }
144
+ .text-success { color: var(--success); }
145
+ .text-error { color: var(--error); }
146
+ .text-warning { color: var(--warning); }
147
+ .text-primary { color: var(--primary); }
148
+
149
+ /* ---- Screens ---- */
150
+ .screen { display:none; width:100%; height:100vh; }
151
+ .screen.active { display:flex; }
152
+ #chat-screen { flex-direction:column; }
153
+ .hidden { display:none !important; }
154
+
155
+ /* ---- Buttons ---- */
156
  .btn {
157
+ display: inline-flex;
158
+ align-items: center;
159
+ justify-content: center;
160
+ gap: 0.5rem;
161
+ padding: 0.625rem 1.25rem;
162
+ font-size: 0.875rem;
163
+ font-weight: 500;
164
+ font-family: inherit;
165
+ border: 1px solid transparent;
166
+ border-radius: var(--radius-md);
167
+ cursor: pointer;
168
+ transition: all var(--transition-fast);
169
+ white-space: nowrap;
170
+ line-height: 1.4;
171
+ position: relative;
172
+ overflow: hidden;
173
+ }
174
+ .btn:disabled { opacity:0.6; cursor:not-allowed; pointer-events:none; }
175
+ .btn:active:not(:disabled) { transform: scale(0.98); }
 
 
 
 
 
 
 
176
 
177
  .btn-primary {
178
+ background: var(--primary);
179
+ color: var(--text-inverse);
180
+ border-color: var(--primary);
181
+ box-shadow: var(--shadow-xs);
182
  }
183
  .btn-primary:hover:not(:disabled) {
184
+ background: var(--primary-hover);
185
+ border-color: var(--primary-hover);
186
+ box-shadow: var(--shadow-sm);
187
+ transform: translateY(-1px);
188
  }
189
 
190
  .btn-secondary {
191
+ background: var(--bg-elevated);
192
+ color: var(--text);
193
+ border-color: var(--border);
194
+ box-shadow: var(--shadow-xs);
195
  }
196
  .btn-secondary:hover:not(:disabled) {
197
+ background: var(--bg-tertiary);
198
+ border-color: var(--text-tertiary);
199
  }
200
 
201
  .btn-ghost {
202
+ background: transparent;
203
+ color: var(--text-secondary);
204
+ border-color: transparent;
205
  }
206
  .btn-ghost:hover:not(:disabled) {
207
+ background: var(--bg-tertiary);
208
+ color: var(--text);
209
  }
210
 
211
+ .btn-sm { padding:0.375rem 0.75rem; font-size:0.8125rem; border-radius:var(--radius-sm); }
212
+ .btn-block { width:100%; justify-content:center; }
 
 
 
 
213
 
214
  .btn-send {
215
+ flex-shrink: 0;
216
+ width: 42px;
217
+ height: 42px;
218
+ padding: 0;
219
+ border-radius: var(--radius-full);
220
+ background: var(--primary);
221
+ color: #fff;
222
+ border: none;
223
+ box-shadow: var(--shadow-sm);
224
  }
225
  .btn-send:hover:not(:disabled) {
226
+ background: var(--primary-hover);
227
+ box-shadow: var(--shadow-md);
228
+ transform: scale(1.05);
229
  }
230
  .btn-send:disabled {
231
+ background: var(--bg-tertiary);
232
+ color: var(--text-tertiary);
233
+ box-shadow: none;
234
+ transform: none;
235
  }
236
 
 
237
  .btn-icon {
238
+ display: inline-flex;
239
+ align-items: center;
240
+ justify-content: center;
241
+ width: 40px;
242
+ height: 40px;
243
+ background: transparent;
244
+ border: none;
245
+ border-radius: var(--radius-md);
246
+ color: var(--text-secondary);
247
+ cursor: pointer;
248
+ transition: all var(--transition-fast);
249
+ font-size: 1.0625rem;
250
+ position: relative;
251
+ flex-shrink: 0;
252
+ }
253
+ .btn-icon:hover { background: var(--bg-tertiary); color: var(--text); }
254
+ .btn-icon:active { transform: scale(0.94); }
255
+ .btn-icon-sm { width:32px; height:32px; font-size:0.875rem; }
256
+
 
 
 
 
 
 
 
 
 
 
257
  .badge {
258
+ position: absolute;
259
+ top: 2px; right: 2px;
260
+ min-width: 18px; height: 18px;
261
+ padding: 0 4px;
262
+ background: var(--error);
263
+ color: #fff;
264
+ font-size: 0.6875rem;
265
+ font-weight: 600;
266
+ border-radius: var(--radius-full);
267
+ display: flex;
268
+ align-items: center;
269
+ justify-content: center;
270
+ border: 2px solid var(--header-bg);
271
+ }
272
+
273
+ /* ---- Forms ---- */
274
+ .form-group { margin-bottom: 1rem; }
 
 
 
 
275
  .form-group label {
276
+ display: block;
277
+ margin-bottom: 0.25rem;
278
+ font-size: 0.875rem;
279
+ font-weight: 500;
280
+ color: var(--text);
281
+ }
282
+ .form-group label i { margin-right:0.25rem; color:var(--text-secondary); }
283
+ .input-wrapper { position:relative; display:flex; align-items:center; }
 
 
 
 
 
 
 
 
 
284
  .form-input {
285
+ width: 100%;
286
+ padding: 0.75rem 1rem;
287
+ font-size: 0.9375rem;
288
+ font-family: inherit;
289
+ color: var(--input-text);
290
+ background: var(--input-bg);
291
+ border: 1.5px solid var(--input-border);
292
+ border-radius: var(--radius-md);
293
+ outline: none;
294
+ transition: all var(--transition-fast);
295
+ line-height: 1.5;
296
  }
297
  .form-input:focus {
298
+ border-color: var(--primary);
299
+ box-shadow: 0 0 0 3px var(--primary-light);
300
+ background: var(--bg-elevated);
 
 
 
 
 
 
301
  }
302
+ .form-input:disabled { opacity:0.6; cursor:not-allowed; }
303
+ .form-input::placeholder { color: var(--input-placeholder); }
304
 
305
  .input-toggle {
306
+ position: absolute;
307
+ right: 0.5rem;
308
+ width: 32px; height: 32px;
309
+ background: transparent;
310
+ border: none;
311
+ color: var(--text-tertiary);
312
+ cursor: pointer;
313
+ font-size: 0.875rem;
314
+ border-radius: var(--radius-sm);
315
+ display: flex; align-items: center; justify-content: center;
316
+ }
317
+ .input-toggle:hover { color: var(--text); background: var(--bg-tertiary); }
318
+
319
+ .form-hint { display:block; margin-top:0.25rem; font-size:0.75rem; color:var(--text-tertiary); }
320
+ .label-hint { font-weight:400; font-size:0.75rem; color:var(--text-tertiary); }
321
+
322
+ /* Password strength */
323
+ .password-strength { display:flex; align-items:center; gap:0.5rem; margin-bottom:1rem; }
324
+ .strength-bar { flex:1; height:4px; background:var(--bg-tertiary); border-radius:var(--radius-full); overflow:hidden; }
325
+ .strength-fill { height:100%; width:0; border-radius:var(--radius-full); transition:all var(--transition); }
326
+ .strength-fill.weak { background:var(--error); width:25%; }
327
+ .strength-fill.fair { background:var(--warning); width:50%; }
328
+ .strength-fill.good { background:var(--info); width:75%; }
329
+ .strength-fill.strong { background:var(--success); width:100%; }
330
+ .strength-text { font-size:0.75rem; font-weight:500; color:var(--text-secondary); min-width:50px; }
331
+
332
+ /* Alert */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
333
  .alert {
334
+ display: none;
335
+ align-items: center;
336
+ gap: 0.5rem;
337
+ padding: 0.75rem 1rem;
338
+ border-radius: var(--radius-md);
339
+ font-size: 0.875rem;
340
+ margin-top: 1rem;
341
+ }
342
+ .alert.visible { display:flex; }
343
+ .alert-error { background:#FEF2F2; color:#B91C1C; border:1px solid #FECACA; }
344
+ [data-theme="dark"] .alert-error { background:#2D1515; color:#FCA5A5; border-color:#7F1D1D; }
345
+
346
+ /* Spinner */
 
 
 
 
 
 
 
 
 
347
  .spinner {
348
+ width:24px; height:24px;
349
+ border:3px solid var(--border);
350
+ border-top-color: var(--primary);
351
+ border-radius:50%;
352
+ animation:spin 0.8s linear infinite;
 
353
  }
354
+ .spinner-sm { width:16px; height:16px; border-width:2px; }
355
+ @keyframes spin { to { transform:rotate(360deg); } }
356
 
357
+ /* ======= AUTH SCREEN ======= */
358
  #auth-screen {
359
+ background: var(--bg-secondary);
360
+ flex-direction: column;
361
+ align-items: center;
362
+ justify-content: center;
363
+ padding: 1rem;
364
+ overflow-y: auto;
365
+ }
366
+ .auth-bg { position:fixed; inset:0; pointer-events:none; overflow:hidden; z-index:0; }
 
 
 
 
367
  .auth-bg-circle {
368
+ position:absolute; border-radius:50%;
369
+ background: var(--primary-light);
370
+ opacity: 0.5; filter:blur(70px);
 
 
371
  }
372
+ .auth-bg-circle-1 { width:350px; height:350px; top:-120px; right:-80px; }
373
+ .auth-bg-circle-2 { width:250px; height:250px; bottom:-100px; left:-60px; }
374
+ .auth-bg-circle-3 { width:180px; height:180px; top:45%; left:38%; }
375
 
376
  .auth-container {
377
+ position: relative;
378
+ z-index: 1;
379
+ width: 100%;
380
+ max-width: 420px;
381
+ background: var(--bg-elevated);
382
+ border-radius: var(--radius-2xl);
383
+ box-shadow: var(--shadow-xl);
384
+ padding: 2.5rem 2rem;
385
+ border: 1px solid var(--border);
386
+ }
387
+ .auth-header { text-align:center; margin-bottom:2rem; }
 
 
388
  .auth-logo {
389
+ width:64px; height:64px;
390
+ margin:0 auto 1rem;
391
+ background: var(--primary);
392
+ color: #fff;
393
+ border-radius: var(--radius-xl);
394
+ display:flex; align-items:center; justify-content:center;
395
+ font-size:1.75rem;
396
+ box-shadow: var(--shadow-lg);
397
+ }
398
+ .auth-title { font-size:1.75rem; font-weight:700; color:var(--text); margin-bottom:0.25rem; }
399
+ .auth-subtitle { font-size:0.875rem; color:var(--text-secondary); }
 
 
 
 
 
 
 
 
 
 
 
400
  .auth-tabs {
401
+ display:flex; gap:0.25rem;
402
+ margin-bottom:1.5rem;
403
+ background: var(--bg-tertiary);
404
+ padding:0.25rem;
405
+ border-radius: var(--radius-md);
 
406
  }
407
  .auth-tab {
408
+ flex:1;
409
+ display:flex; align-items:center; justify-content:center; gap:0.4rem;
410
+ padding:0.5rem 1rem;
411
+ font-size:0.875rem; font-weight:500;
412
+ color: var(--text-secondary);
413
+ background: transparent;
414
+ border:none; border-radius:var(--radius-sm);
415
+ cursor:pointer;
416
+ transition: all var(--transition-fast);
 
 
 
 
 
417
  }
418
  .auth-tab.active {
419
+ background: var(--bg-elevated);
420
+ color: var(--text);
421
+ box-shadow: var(--shadow-sm);
 
 
 
 
 
 
422
  }
423
+ .auth-form { display:none; }
424
+ .auth-form.active { display:block; }
425
+ .auth-form .btn-block { margin-top:0.5rem; }
426
  .auth-loading {
427
+ display:flex; align-items:center; justify-content:center;
428
+ gap:0.5rem; margin-top:1rem; color:var(--text-secondary);
 
 
 
 
429
  }
430
+ .auth-loading.hidden { display:none !important; }
431
 
432
+ /* ======= CHAT HEADER ======= */
433
  .chat-header {
434
+ display:flex; align-items:center; justify-content:space-between;
435
+ padding:0 1rem;
436
+ height: var(--header-height);
437
+ background: var(--header-bg);
438
+ border-bottom:1px solid var(--header-border);
439
+ flex-shrink:0;
440
+ z-index:10;
441
+ }
442
+ .header-section { display:flex; align-items:center; gap:0.75rem; }
443
+ .header-avatar-wrap {
444
+ width:40px; height:40px;
445
+ border-radius:var(--radius-full);
446
+ background: var(--bg-tertiary);
447
+ display:flex; align-items:center; justify-content:center;
448
+ color: var(--text-secondary);
449
+ font-size:1.75rem;
450
+ overflow:hidden; flex-shrink:0;
451
  }
452
  .header-avatar-img {
453
+ width:40px; height:40px;
454
+ border-radius:var(--radius-full);
455
+ object-fit:cover;
456
+ border:2px solid var(--border);
457
+ flex-shrink:0;
458
+ }
459
+ .header-info { display:flex; flex-direction:column; }
460
+ .header-name { font-size:1rem; font-weight:600; color:var(--text); line-height:1.3; }
 
 
 
 
 
 
 
 
 
 
 
 
461
  .header-status {
462
+ font-size:0.75rem;
463
+ color:var(--text-secondary);
464
+ display:flex; align-items:center; gap:0.25rem;
 
 
 
 
 
 
 
 
465
  }
466
+ .status-dot { width:8px; height:8px; border-radius:50%; background:var(--text-tertiary); }
467
+ .status-dot.online { background:var(--success); }
468
 
469
+ /* ======= CONNECTION STATUS ======= */
470
  .connection-status {
471
+ height:28px;
472
+ display:flex; align-items:center; gap:0.5rem;
473
+ padding:0 1rem;
474
+ font-size:0.75rem;
475
+ background: var(--bg-secondary);
476
+ border-bottom:1px solid var(--border-light);
477
+ color: var(--text-secondary);
478
+ flex-shrink:0;
479
+ }
480
+ .connection-status.connected { color:var(--success); }
481
+ .connection-status.reconnecting { color:var(--warning); }
482
+ .connection-status.disconnected { color:var(--error); }
483
+
484
+ /* ======= MESSAGES ======= */
 
485
  .messages-container {
486
+ flex:1; overflow:hidden; position:relative;
487
+ background: var(--bg);
 
 
488
  }
489
  .messages-scroll {
490
+ height:100%; overflow-y:auto;
491
+ padding:1rem 1rem 1.5rem;
 
 
 
 
 
 
 
 
 
492
  }
493
+ .load-more { text-align:center; margin-bottom:1rem; }
494
  .messages-list {
495
+ display:flex; flex-direction:column;
496
+ gap:0.25rem; min-height:100%;
 
 
497
  }
498
  .empty-state {
499
+ display:flex; flex-direction:column;
500
+ align-items:center; justify-content:center;
501
+ padding:4rem 1rem; text-align:center;
502
+ color: var(--text-secondary);
503
+ flex:1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
504
  }
505
+ .empty-icon { font-size:3.5rem; color:var(--text-tertiary); margin-bottom:1.25rem; }
506
+ .empty-state h3 { font-size:1.125rem; color:var(--text); margin-bottom:0.25rem; }
507
+ .empty-state p { color:var(--text-secondary); font-size:0.9rem; }
508
 
509
  .scroll-bottom-btn {
510
+ position:absolute; bottom:1rem; right:1rem;
511
+ width:36px; height:36px;
512
+ background: var(--bg-elevated);
513
+ border:1px solid var(--border);
514
+ border-radius:var(--radius-full);
515
+ box-shadow: var(--shadow-md);
516
+ display:flex; align-items:center; justify-content:center;
517
+ cursor:pointer;
518
+ transition: all var(--transition-fast);
519
+ z-index:5; color:var(--text-secondary);
520
+ }
521
+ .scroll-bottom-btn:hover { background:var(--bg-tertiary); transform:scale(1.05); }
522
+
523
+ /* ======= MESSAGE BUBBLES ======= */
 
 
 
 
 
 
 
 
 
524
  .message-wrapper {
525
+ display:flex; flex-direction:column;
526
+ animation: msgIn 0.25s ease;
 
 
 
 
 
 
 
 
 
 
527
  }
528
+ .message-wrapper.self { align-items:flex-end; }
529
+ .message-wrapper.other { align-items:flex-start; }
530
+
531
+ @keyframes msgIn { from { opacity:0; transform:translateY(8px); } to { opacity:1; transform:translateY(0); } }
532
+
533
  .message-bubble {
534
+ max-width:72%;
535
+ padding:0.625rem 0.875rem;
536
+ border-radius:var(--radius-lg);
537
+ word-wrap:break-word; overflow-wrap:break-word; white-space:pre-wrap;
538
+ line-height:1.55;
539
+ }
540
+ .message-wrapper.self .message-bubble {
541
+ background: var(--bubble-self);
542
+ color: var(--bubble-self-text);
543
+ border-bottom-right-radius: var(--radius-xs);
544
+ }
545
+ .message-wrapper.other .message-bubble {
546
+ background: var(--bubble-other);
547
+ color: var(--bubble-other-text);
548
+ border-bottom-left-radius: var(--radius-xs);
 
 
 
549
  }
550
  .message-bubble.deleted {
551
+ opacity:0.55;
552
+ font-style:italic;
553
+ color: var(--text-secondary) !important;
554
+ background: var(--bg-tertiary) !important;
 
 
555
  }
556
+ .message-text { font-size:0.9375rem; }
557
+
558
  .message-meta {
559
+ display:flex; align-items:center; gap:0.35rem;
560
+ margin-top:0.2rem; font-size:0.6875rem;
561
+ }
562
+ .message-wrapper.self .message-meta {
563
+ justify-content:flex-end;
564
+ color: rgba(255,255,255,0.75);
565
+ }
566
+ .message-wrapper.other .message-meta { color:var(--text-tertiary); }
567
+ [data-theme="dark"] .message-wrapper.self .message-meta { color:rgba(255,255,255,0.65); }
568
+
569
+ .message-status { display:inline-flex; align-items:center; }
570
+ .message-status.read { color: #93C5FD; }
571
+ [data-theme="light"] .message-status.read { color: #A5D6A7; }
572
+
573
+ .edited-label { font-style:italic; opacity:0.7; }
574
+
575
  .message-actions {
576
+ display:flex; gap:2px;
577
+ margin-top:0.2rem;
578
+ opacity:0;
579
+ transition:opacity var(--transition-fast);
 
580
  }
581
+ .message-wrapper:hover .message-actions { opacity:1; }
582
  .message-actions button {
583
+ width:26px; height:26px;
584
+ background:transparent; border:none;
585
+ border-radius:var(--radius-sm);
586
+ cursor:pointer; font-size:0.7rem;
587
+ transition:all var(--transition-fast);
588
+ display:flex; align-items:center; justify-content:center;
589
+ color: var(--text-tertiary);
590
+ }
591
+ .message-wrapper.other .message-actions button:hover {
592
+ background:var(--bg-tertiary); color:var(--text);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
593
  }
594
+ .message-wrapper.self .message-actions button { color:rgba(255,255,255,0.6); }
595
+ .message-wrapper.self .message-actions button:hover { background:rgba(255,255,255,0.15); color:#fff; }
596
+
597
+ /* Reply indicator */
598
+ .reply-indicator {
599
+ display:flex; align-items:center; gap:0.4rem;
600
+ padding:0.2rem 0.5rem; margin-bottom:0.35rem;
601
+ font-size:0.75rem;
602
+ border-left:3px solid var(--primary);
603
+ border-radius:0 var(--radius-sm) var(--radius-sm) 0;
604
+ background: rgba(0,0,0,0.06);
605
+ color: var(--text-secondary);
606
  }
607
+ [data-theme="dark"] .reply-indicator { background:rgba(255,255,255,0.07); }
608
+ .message-wrapper.self .reply-indicator { color:rgba(255,255,255,0.8); background:rgba(255,255,255,0.12); }
609
 
610
  /* Attachments */
611
+ .attachment { margin-top:0.4rem; border-radius:var(--radius-md); overflow:hidden; }
612
+ .attachment img { max-width:100%; max-height:280px; object-fit:cover; border-radius:var(--radius-md); cursor:pointer; display:block; }
613
+ .attachment video { max-width:100%; max-height:280px; border-radius:var(--radius-md); }
614
+ .attachment audio { width:100%; }
 
 
 
 
 
 
 
 
 
 
 
615
  .attachment-file {
616
+ display:flex; align-items:center; gap:0.5rem;
617
+ padding:0.5rem 0.75rem;
618
+ background:var(--bg-secondary);
619
+ border:1px solid var(--border);
620
+ border-radius:var(--radius-md);
621
+ cursor:pointer;
622
+ transition:all var(--transition-fast);
623
+ color:var(--text);
624
+ }
625
+ .attachment-file:hover { background:var(--bg-tertiary); border-color:var(--primary); }
626
+ .attachment-file .fa-file-alt { font-size:1.4rem; color:var(--primary); }
627
+ .file-info { flex:1; min-width:0; }
628
+ .file-name { font-size:0.875rem; font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; color:var(--text); }
629
+ .file-size { font-size:0.75rem; color:var(--text-tertiary); }
630
+
631
+ /* ======= TYPING INDICATOR ======= */
 
 
 
 
 
 
 
 
 
 
 
 
 
632
  .typing-indicator {
633
+ display:flex; align-items:center; gap:0.5rem;
634
+ padding:0 1rem;
635
+ height:32px;
636
+ background: var(--bg-secondary);
637
+ border-top:1px solid var(--border-light);
638
+ flex-shrink:0;
639
+ color: var(--text-secondary);
640
+ }
641
+ .typing-dots { display:flex; gap:3px; }
 
 
642
  .typing-dot {
643
+ width:6px; height:6px;
644
+ border-radius:50%;
645
+ background: var(--text-tertiary);
646
+ animation: typeBounce 1.4s infinite ease-in-out both;
647
+ }
648
+ .typing-dot:nth-child(1) { animation-delay:-0.32s; }
649
+ .typing-dot:nth-child(2) { animation-delay:-0.16s; }
650
+ @keyframes typeBounce { 0%,80%,100%{transform:scale(0);}40%{transform:scale(1);} }
651
+ .typing-text { font-size:0.8125rem; color:var(--text-secondary); }
652
+
653
+ /* ======= REPLY PREVIEW ======= */
654
+ .reply-preview { flex-shrink:0; border-top:1px solid var(--border-light); }
 
 
 
 
655
  .reply-bar {
656
+ display:flex; align-items:center; gap:0.75rem;
657
+ padding:0.5rem 1rem;
658
+ background: var(--bg-secondary);
659
+ color:var(--text);
660
+ }
661
+ .reply-icon { color:var(--primary); flex-shrink:0; }
662
+ .reply-content { flex:1; min-width:0; }
663
+ .reply-label { font-size:0.75rem; font-weight:600; color:var(--primary); display:block; }
664
+ .reply-text { font-size:0.8125rem; color:var(--text-secondary); display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
665
+
666
+ /* ======= COMPOSE ======= */
 
 
 
 
 
 
 
 
 
667
  .compose-area {
668
+ flex-shrink:0;
669
+ border-top:1px solid var(--border);
670
+ background: var(--bg-elevated);
671
+ }
672
+ .upload-preview {
673
+ display:flex; align-items:center; justify-content:space-between;
674
+ padding:0.4rem 1rem;
675
+ background: var(--bg-secondary);
676
+ border-bottom:1px solid var(--border-light);
677
+ color:var(--text);
678
+ }
679
+ .upload-info { display:flex; align-items:center; gap:0.5rem; font-size:0.8125rem; color:var(--text-secondary); }
680
+ .compose-form { display:flex; align-items:flex-end; gap:0.5rem; padding:0.5rem 0.75rem; }
681
+ .compose-tools { display:flex; gap:2px; padding-bottom:0.1rem; }
682
+ .input-area { flex:1; }
 
 
683
  .message-input {
684
+ width:100%; resize:none;
685
+ padding:0.625rem 1rem;
686
+ font-size:0.9375rem; font-family:inherit;
687
+ color: var(--input-text);
688
+ background: var(--input-bg);
689
+ border:1.5px solid var(--input-border);
690
+ border-radius:var(--radius-xl);
691
+ outline:none;
692
+ min-height:42px; max-height:120px;
693
+ line-height:1.5;
694
+ transition:all var(--transition-fast);
695
+ overflow-y:auto;
 
 
 
696
  }
697
  .message-input:focus {
698
+ border-color: var(--primary);
699
+ box-shadow:0 0 0 3px var(--primary-light);
700
+ background: var(--bg-elevated);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
701
  }
702
+ .message-input::placeholder { color:var(--input-placeholder); }
703
  .upload-progress {
704
+ display:flex; align-items:center; gap:0.75rem;
705
+ padding:0.5rem 1rem;
706
+ background:var(--bg-secondary);
707
+ border-top:1px solid var(--border-light);
708
+ color:var(--text);
709
+ }
710
+ .progress-track { flex:1; height:4px; background:var(--border); border-radius:var(--radius-full); overflow:hidden; }
711
+ .progress-fill { height:100%; background:var(--primary); border-radius:var(--radius-full); transition:width var(--transition); }
712
+ .progress-text { font-size:0.75rem; font-weight:500; color:var(--text-secondary); min-width:36px; }
713
+
714
+ /* ======= MODALS ======= */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
715
  .modal {
716
+ position:fixed; inset:0; z-index:100;
717
+ display:flex; align-items:center; justify-content:center;
718
+ padding:1rem;
719
+ }
720
+ .modal.hidden { display:none !important; }
 
 
 
 
 
 
 
721
  .modal-backdrop {
722
+ position:absolute; inset:0;
723
+ background:rgba(0,0,0,0.55);
724
+ backdrop-filter:blur(4px);
 
725
  }
726
  .modal-container {
727
+ position:relative; width:100%;
728
+ max-width:520px; max-height:90vh;
729
+ background: var(--bg-elevated);
730
+ border-radius:var(--radius-xl);
731
+ box-shadow: var(--shadow-xl);
732
+ overflow:hidden;
733
+ display:flex; flex-direction:column;
734
+ border:1px solid var(--border);
735
+ color:var(--text);
736
+ }
737
+ .modal-sm { max-width:400px; }
 
 
738
  .modal-header {
739
+ display:flex; align-items:center; justify-content:space-between;
740
+ padding:1rem 1.5rem;
741
+ border-bottom:1px solid var(--border);
742
+ background: var(--bg-elevated);
743
+ }
744
+ .modal-header h2 { font-size:1.0625rem; font-weight:600; color:var(--text); }
745
+ .modal-header h2 i { margin-right:0.5rem; color:var(--primary); }
746
+ .modal-body { padding:1.5rem; overflow-y:auto; flex:1; background:var(--bg-elevated); }
 
 
 
 
 
 
 
 
 
747
  .modal-footer {
748
+ display:flex; justify-content:flex-end; gap:0.5rem;
749
+ padding:1rem 1.5rem;
750
+ border-top:1px solid var(--border);
751
+ background: var(--bg-secondary);
 
 
752
  }
753
 
754
+ /* Settings sections */
755
+ .settings-section { margin-bottom:2rem; }
756
+ .settings-section:last-child { margin-bottom:0; }
 
 
757
  .settings-section h3 {
758
+ font-size:0.75rem; font-weight:600;
759
+ text-transform:uppercase; letter-spacing:0.05em;
760
+ color:var(--text-secondary);
761
+ margin-bottom:1rem;
762
+ padding-bottom:0.5rem;
763
+ border-bottom:1px solid var(--border-light);
764
+ }
 
 
 
765
  .avatar-section {
766
+ display:flex; align-items:center; gap:1rem;
767
+ margin-bottom:1rem;
 
 
768
  }
769
  .settings-avatar {
770
+ width:72px; height:72px;
771
+ border-radius:var(--radius-full);
772
+ background: var(--bg-tertiary);
773
+ display:flex; align-items:center; justify-content:center;
774
+ font-size:2rem; color:var(--text-secondary);
775
+ overflow:hidden; flex-shrink:0;
 
 
 
 
776
  }
777
  .settings-avatar-img {
778
+ width:72px; height:72px;
779
+ border-radius:var(--radius-full);
780
+ object-fit:cover; flex-shrink:0;
 
 
 
 
 
 
 
781
  }
782
+
783
+ /* Theme selector */
784
+ .theme-selector { display:grid; grid-template-columns:repeat(3,1fr); gap:0.75rem; }
785
  .theme-option {
786
+ display:flex; flex-direction:column; align-items:center; gap:0.5rem;
787
+ padding:0.75rem; font-size:0.8rem; font-weight:500;
788
+ color:var(--text);
789
+ background:var(--bg-secondary);
790
+ border:2px solid var(--border);
791
+ border-radius:var(--radius-md);
792
+ cursor:pointer;
793
+ transition:all var(--transition-fast);
794
+ }
795
+ .theme-option:hover { border-color:var(--text-tertiary); }
796
+ .theme-option.active { border-color:var(--primary); background:var(--primary-light); color:var(--primary); }
 
 
 
 
 
 
 
 
797
  .theme-preview {
798
+ width:56px; height:38px;
799
+ border-radius:var(--radius-sm);
800
+ overflow:hidden; border:1px solid var(--border);
801
+ }
802
+ .theme-preview-header { height:8px; }
803
+ .theme-preview-body { padding:3px; display:flex; flex-direction:column; gap:2px; }
804
+ .theme-preview-message { height:6px; border-radius:3px; }
805
+ .theme-preview-message.self { width:65%; align-self:flex-end; }
806
+ .theme-preview-message.other { width:55%; }
807
+
808
+ /* Light preview colours */
809
+ .theme-preview-light { background:#FFFFFF; }
810
+ .theme-preview-light .theme-preview-header { background:#F9FAFB; }
811
+ .theme-preview-light .theme-preview-message.self { background:#2563EB; }
812
+ .theme-preview-light .theme-preview-message.other { background:#F3F4F6; }
813
+ /* Dark preview colours */
814
+ .theme-preview-dark { background:#0F172A; }
815
+ .theme-preview-dark .theme-preview-header { background:#1E293B; }
816
+ .theme-preview-dark .theme-preview-message.self { background:#3B82F6; }
817
+ .theme-preview-dark .theme-preview-message.other { background:#334155; }
818
+ /* Custom preview */
819
+ .theme-preview-custom { background: linear-gradient(135deg,#6366F1,#EC4899); }
820
+ .theme-preview-custom .theme-preview-header { background:rgba(0,0,0,0.2); }
821
+ .theme-preview-custom .theme-preview-message.self { background:#F9FAFB; }
822
+ .theme-preview-custom .theme-preview-message.other { background:rgba(255,255,255,0.4); }
823
 
824
  .custom-theme-section {
825
+ margin-top:0.75rem; padding:1rem;
826
+ background:var(--bg-secondary);
827
+ border-radius:var(--radius-md);
828
+ border:1px solid var(--border);
 
 
 
 
 
 
829
  }
830
+ .color-picker-row { display:grid; grid-template-columns:repeat(3,1fr); gap:1rem; }
831
  .color-picker-group label {
832
+ display:block; font-size:0.75rem; font-weight:500;
833
+ margin-bottom:0.4rem; color:var(--text);
 
 
 
 
 
 
 
 
834
  }
835
+ .color-input-wrapper { display:flex; align-items:center; gap:0.4rem; }
836
  .color-input-wrapper input[type="color"] {
837
+ width:36px; height:36px;
838
+ border:1px solid var(--border); border-radius:var(--radius-sm);
839
+ padding:2px; cursor:pointer; background:none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
840
  }
841
+ .color-hex { font-size:0.75rem; font-family:var(--font-mono); color:var(--text-secondary); }
842
+
843
+ /* About rows */
844
+ .about-info { display:flex; flex-direction:column; gap:0; }
845
  .about-row {
846
+ display:flex; justify-content:space-between; align-items:center;
847
+ padding:0.625rem 0;
848
+ border-bottom:1px solid var(--border-light);
849
+ font-size:0.875rem; color:var(--text);
850
+ }
851
+ .about-row:last-child { border-bottom:none; }
852
+
853
+ /* Online users modal */
854
+ .online-users-list { max-height:300px; overflow-y:auto; background:var(--bg-elevated); }
855
+ .loading-state { display:flex; align-items:center; justify-content:center; gap:0.5rem; padding:2rem; color:var(--text-secondary); }
856
+ .user-item { display:flex; align-items:center; gap:0.75rem; padding:0.6rem 1.25rem; transition:background var(--transition-fast); color:var(--text); }
857
+ .user-item:hover { background:var(--bg-secondary); }
858
+ .user-avatar { width:40px; height:40px; border-radius:var(--radius-full); background:var(--bg-tertiary); display:flex; align-items:center; justify-content:center; color:var(--text-secondary); font-size:1.2rem; overflow:hidden; flex-shrink:0; }
859
+ .user-avatar img { width:100%; height:100%; object-fit:cover; }
860
+ .user-info { flex:1; }
861
+ .user-name { font-size:0.875rem; font-weight:500; color:var(--text); }
862
+ .user-status-text { font-size:0.75rem; color:var(--text-secondary); }
863
+
864
+ /* ======= EMOJI PICKER ======= */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
865
  .emoji-picker {
866
+ position:fixed; bottom:80px; left:60px;
867
+ z-index:200;
868
+ background:var(--bg-elevated);
869
+ border:1px solid var(--border);
870
+ border-radius:var(--radius-lg);
871
+ box-shadow:var(--shadow-xl);
872
+ width:300px; max-height:320px;
873
+ overflow:hidden;
874
+ display:flex; flex-direction:column;
875
+ }
876
+ .emoji-header { border-bottom:1px solid var(--border); padding:0.4rem; background:var(--bg-secondary); }
877
+ .emoji-categories { display:flex; gap:2px; }
 
 
 
 
 
 
878
  .emoji-cat {
879
+ width:34px; height:34px; border:none;
880
+ background:transparent; border-radius:var(--radius-sm);
881
+ cursor:pointer; color:var(--text-secondary);
882
+ font-size:0.8rem; transition:all var(--transition-fast);
883
+ }
884
+ .emoji-cat:hover { background:var(--bg-tertiary); color:var(--text); }
885
+ .emoji-cat.active { background:var(--primary-light); color:var(--primary); }
 
 
 
 
 
 
 
 
886
  .emoji-grid {
887
+ padding:0.4rem;
888
+ display:grid; grid-template-columns:repeat(8,1fr);
889
+ gap:1px; overflow-y:auto; flex:1;
890
+ background:var(--bg-elevated);
 
 
891
  }
892
  .emoji-item {
893
+ width:34px; height:34px;
894
+ display:flex; align-items:center; justify-content:center;
895
+ font-size:1.2rem; cursor:pointer;
896
+ border-radius:var(--radius-sm);
897
+ border:none; background:transparent;
898
+ transition:background var(--transition-fast);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
899
  }
900
+ .emoji-item:hover { background:var(--bg-tertiary); }
901
+
902
+ /* ======= TOASTS ======= */
903
+ .toast-container { position:fixed; top:1rem; right:1rem; z-index:300; display:flex; flex-direction:column; gap:0.5rem; max-width:340px; pointer-events:none; }
904
  .toast {
905
+ padding:0.75rem 1rem;
906
+ background:var(--bg-elevated);
907
+ border:1px solid var(--border);
908
+ border-radius:var(--radius-md);
909
+ box-shadow:var(--shadow-lg);
910
+ display:flex; align-items:center; gap:0.75rem;
911
+ font-size:0.875rem; color:var(--text);
912
+ animation:toastIn 0.3s ease;
913
+ pointer-events:auto;
914
+ }
915
+ .toast-success { border-left:4px solid var(--success); }
916
+ .toast-error { border-left:4px solid var(--error); }
917
+ .toast-warning { border-left:4px solid var(--warning); }
918
+ .toast-info { border-left:4px solid var(--info); }
919
+ .toast-success i { color:var(--success); }
920
+ .toast-error i { color:var(--error); }
921
+ .toast-warning i { color:var(--warning); }
922
+ .toast-info i { color:var(--info); }
923
+ @keyframes toastIn { from{transform:translateX(100%);opacity:0;} to{transform:translateX(0);opacity:1;} }
924
+
925
+ /* ======= RESPONSIVE ======= */
926
+ @media (max-width:640px) {
927
+ .auth-container { padding:1.5rem 1.25rem; border-radius:var(--radius-xl); }
928
+ .message-bubble { max-width:88%; }
929
+ .compose-form { padding:0.4rem 0.5rem; }
930
+ .modal { padding:0; align-items:flex-end; }
931
+ .modal-container { max-height:88vh; border-radius:var(--radius-xl) var(--radius-xl) 0 0; max-width:100%; }
932
+ .color-picker-row { grid-template-columns:1fr; }
933
+ .theme-selector { grid-template-columns:repeat(3,1fr); }
934
+ .emoji-picker { left:8px; right:8px; bottom:72px; width:auto; }
935
+ }
936
+ @media (min-width:768px) {
937
+ .message-bubble { max-width:65%; }
938
+ .compose-form { padding:0.6rem 1rem; }
939
+ }
940
+ @media (min-width:1024px) { .message-bubble { max-width:55%; } }