anentrypoint-design 0.0.118 → 0.0.121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/community.css CHANGED
@@ -1,933 +1,1338 @@
1
- /* ============================================================
2
- 247420 design system — community surface (Discord-style chat)
3
- Tonal surfaces over borders. Indicator rails over hairlines.
4
- All tokens sourced from colors_and_type.css.
5
- ============================================================ */
1
+ /* ============================================================
2
+ 247420 design system — community surface (Discord-style chat)
3
+ Tonal surfaces over borders. Indicator rails over hairlines.
4
+ All tokens sourced from colors_and_type.css.
5
+ ============================================================ */
6
+
7
+ /* ============================================================
8
+ Shell — top-level flex container for the community layout
9
+ ============================================================ */
10
+ .cm-shell {
11
+ display: flex;
12
+ height: 100vh;
13
+ width: 100%;
14
+ overflow: hidden;
15
+ background: var(--bg);
16
+ color: var(--fg);
17
+ font-family: var(--ff-body);
18
+ font-size: var(--fs-sm);
19
+ }
20
+
21
+ .cm-main {
22
+ display: flex;
23
+ flex-direction: column;
24
+ flex: 1;
25
+ min-width: 0;
26
+ min-height: 0;
27
+ background: var(--bg);
28
+ position: relative;
29
+ }
30
+
31
+ /* ============================================================
32
+ Server rail — thin vertical column, leftmost
33
+ ============================================================ */
34
+ .cm-server-rail {
35
+ flex: 0 0 72px;
36
+ width: 72px;
37
+ display: flex;
38
+ flex-direction: column;
39
+ align-items: center;
40
+ gap: 8px;
41
+ padding: 12px 0;
42
+ background: color-mix(in oklab, var(--bg) 70%, var(--ink));
43
+ overflow-y: auto;
44
+ overflow-x: hidden;
45
+ scrollbar-width: none;
46
+ }
47
+ .cm-server-rail::-webkit-scrollbar { display: none; }
48
+
49
+ .cm-server-icon {
50
+ position: relative;
51
+ width: 48px;
52
+ height: 48px;
53
+ border-radius: var(--r-3);
54
+ background: var(--bg-2);
55
+ color: var(--fg);
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ font-family: var(--ff-body);
60
+ font-size: var(--fs-lg);
61
+ font-weight: 600;
62
+ letter-spacing: var(--tr-tight);
63
+ cursor: pointer;
64
+ overflow: hidden;
65
+ transition:
66
+ border-radius var(--dur-base) var(--ease),
67
+ background var(--dur-snap) var(--ease),
68
+ color var(--dur-snap) var(--ease),
69
+ transform var(--dur-snap) var(--ease);
70
+ user-select: none;
71
+ }
72
+ .cm-server-icon img,
73
+ .cm-server-icon svg {
74
+ width: 100%;
75
+ height: 100%;
76
+ object-fit: cover;
77
+ display: block;
78
+ }
79
+ .cm-server-icon:hover {
80
+ border-radius: var(--r-2);
81
+ background: var(--accent);
82
+ color: var(--accent-fg);
83
+ }
84
+ .cm-server-icon.active {
85
+ border-radius: var(--r-2);
86
+ background: var(--accent);
87
+ color: var(--accent-fg);
88
+ }
89
+
90
+ .cm-server-pill {
91
+ position: absolute;
92
+ left: -10px;
93
+ top: 50%;
94
+ transform: translateY(-50%);
95
+ width: 4px;
96
+ height: 8px;
97
+ background: var(--fg);
98
+ border-radius: 0 4px 4px 0;
99
+ transition: height var(--dur-base) var(--ease);
100
+ }
101
+ .cm-server-icon:hover .cm-server-pill { height: 20px; }
102
+ .cm-server-icon.active .cm-server-pill { height: 36px; background: var(--fg); }
103
+
104
+ .cm-server-badge {
105
+ position: absolute;
106
+ top: -2px;
107
+ right: -2px;
108
+ min-width: 18px;
109
+ height: 18px;
110
+ padding: 0 5px;
111
+ background: var(--warn);
112
+ color: var(--paper);
113
+ font-family: var(--ff-mono);
114
+ font-size: var(--fs-micro);
115
+ font-weight: 700;
116
+ border-radius: var(--r-pill);
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--bg) 70%, var(--ink));
121
+ }
122
+
123
+ .cm-server-back,
124
+ .cm-server-add {
125
+ width: 48px;
126
+ height: 48px;
127
+ border-radius: var(--r-3);
128
+ background: var(--bg-2);
129
+ color: var(--green-2);
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ font-size: var(--fs-xl);
134
+ font-weight: 400;
135
+ cursor: pointer;
136
+ border: 0;
137
+ transition:
138
+ border-radius var(--dur-base) var(--ease),
139
+ background var(--dur-snap) var(--ease),
140
+ color var(--dur-snap) var(--ease);
141
+ }
142
+ .cm-server-back { color: var(--fg-2); }
143
+ .cm-server-back:hover,
144
+ .cm-server-add:hover {
145
+ border-radius: var(--r-2);
146
+ background: var(--green-2);
147
+ color: var(--paper);
148
+ }
149
+
150
+ .cm-server-sep {
151
+ width: 32px;
152
+ height: 2px;
153
+ background: color-mix(in oklab, var(--fg) 12%, transparent);
154
+ border-radius: 2px;
155
+ margin: 4px 0;
156
+ flex-shrink: 0;
157
+ }
158
+
159
+ /* ============================================================
160
+ Channel sidebar — server name header + channel list
161
+ ============================================================ */
162
+ .cm-channel-sidebar {
163
+ flex: 0 0 240px;
164
+ width: 240px;
165
+ display: flex;
166
+ flex-direction: column;
167
+ min-height: 0;
168
+ background: var(--bg-2);
169
+ position: relative;
170
+ }
171
+
172
+ .cm-server-header {
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: space-between;
176
+ gap: 8px;
177
+ padding: 14px 16px;
178
+ background: var(--bg-2);
179
+ box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
180
+ font-weight: 600;
181
+ font-size: var(--fs-sm);
182
+ letter-spacing: -0.01em;
183
+ cursor: pointer;
184
+ transition: background var(--dur-snap) var(--ease);
185
+ user-select: none;
186
+ flex-shrink: 0;
187
+ }
188
+ .cm-server-header:hover {
189
+ background: color-mix(in oklab, var(--fg) 6%, var(--bg-2));
190
+ }
191
+ .cm-server-header-name {
192
+ flex: 1;
193
+ min-width: 0;
194
+ overflow: hidden;
195
+ text-overflow: ellipsis;
196
+ white-space: nowrap;
197
+ }
198
+
199
+ .cm-channel-list {
200
+ flex: 1;
201
+ min-height: 0;
202
+ overflow-y: auto;
203
+ overflow-x: hidden;
204
+ padding: 8px 0 16px;
205
+ display: flex;
206
+ flex-direction: column;
207
+ gap: 2px;
208
+ scrollbar-width: thin;
209
+ scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
210
+ }
211
+ .cm-channel-list::-webkit-scrollbar { width: 8px; }
212
+ .cm-channel-list::-webkit-scrollbar-track { background: transparent; }
213
+ .cm-channel-list::-webkit-scrollbar-thumb {
214
+ background: color-mix(in oklab, var(--fg) 18%, transparent);
215
+ border-radius: 4px;
216
+ }
217
+
218
+ /* ============================================================
219
+ Channel category — collapsible group header
220
+ ============================================================ */
221
+ .cm-channel-category {
222
+ display: flex;
223
+ flex-direction: column;
224
+ margin-top: 12px;
225
+ }
226
+ .cm-channel-category:first-child { margin-top: 4px; }
227
+
228
+ .cm-category-header {
229
+ display: flex;
230
+ align-items: center;
231
+ gap: 4px;
232
+ padding: 4px 8px 4px 8px;
233
+ font-family: var(--ff-body);
234
+ font-size: var(--fs-micro);
235
+ font-weight: 600;
236
+ color: var(--fg-3);
237
+ letter-spacing: var(--tr-caps);
238
+ text-transform: uppercase;
239
+ cursor: pointer;
240
+ user-select: none;
241
+ transition: color var(--dur-snap) var(--ease);
242
+ }
243
+ .cm-category-header:hover { color: var(--fg); }
244
+ .cm-category-header:hover .cm-cat-add { opacity: 1; }
245
+
246
+ .cm-cat-arrow {
247
+ display: inline-flex;
248
+ align-items: center;
249
+ justify-content: center;
250
+ width: 12px;
251
+ height: 12px;
252
+ font-size: 10px;
253
+ transform: rotate(90deg);
254
+ transition: transform var(--dur-base) var(--ease);
255
+ flex-shrink: 0;
256
+ }
257
+ .cm-category-header.collapsed .cm-cat-arrow { transform: rotate(0deg); }
258
+
259
+ .cm-cat-name {
260
+ flex: 1;
261
+ min-width: 0;
262
+ overflow: hidden;
263
+ text-overflow: ellipsis;
264
+ white-space: nowrap;
265
+ }
266
+ .cm-cat-extra {
267
+ font-family: var(--ff-mono);
268
+ font-size: var(--fs-micro);
269
+ color: var(--fg-3);
270
+ font-weight: 500;
271
+ letter-spacing: 0;
272
+ text-transform: none;
273
+ }
274
+ .cm-cat-add {
275
+ display: inline-flex;
276
+ align-items: center;
277
+ justify-content: center;
278
+ width: 18px;
279
+ height: 18px;
280
+ border: 0;
281
+ background: transparent;
282
+ color: var(--fg-3);
283
+ font-size: var(--fs-sm);
284
+ cursor: pointer;
285
+ opacity: 0;
286
+ border-radius: var(--r-1);
287
+ transition: opacity var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
288
+ }
289
+ .cm-cat-add:hover {
290
+ color: var(--fg);
291
+ background: color-mix(in oklab, var(--fg) 8%, transparent);
292
+ }
293
+
294
+ .cm-cat-channels {
295
+ display: flex;
296
+ flex-direction: column;
297
+ gap: 1px;
298
+ padding: 2px 0;
299
+ }
300
+
301
+ /* ============================================================
302
+ Channel item — pillish row with active rail and hover state
303
+ ============================================================ */
304
+ .cm-channel-item-wrap {
305
+ position: relative;
306
+ padding: 0 8px;
307
+ }
308
+
309
+ .cm-channel-item {
310
+ position: relative;
311
+ display: flex;
312
+ align-items: center;
313
+ gap: 8px;
314
+ padding: 6px 8px;
315
+ border-radius: var(--r-1);
316
+ color: var(--fg-3);
317
+ cursor: pointer;
318
+ user-select: none;
319
+ transition:
320
+ background var(--dur-snap) var(--ease),
321
+ color var(--dur-snap) var(--ease);
322
+ }
323
+ .cm-channel-item:hover {
324
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
325
+ color: var(--fg);
326
+ }
327
+ .cm-channel-item:hover .cm-ch-actions { opacity: 1; }
328
+
329
+ .cm-channel-item.active {
330
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
331
+ color: var(--fg);
332
+ font-weight: 500;
333
+ }
334
+ .cm-channel-item.active::before {
335
+ content: '';
336
+ position: absolute;
337
+ left: -8px;
338
+ top: 4px;
339
+ bottom: 4px;
340
+ width: 3px;
341
+ background: var(--accent);
342
+ border-radius: 0 3px 3px 0;
343
+ }
344
+
345
+ .cm-channel-item.voice-active {
346
+ color: var(--green-2);
347
+ }
348
+ .cm-channel-item.voice-active .cm-ch-icon { color: var(--green-2); }
349
+ .cm-channel-item.voice-active:hover {
350
+ background: color-mix(in oklab, var(--green) 12%, transparent);
351
+ }
352
+
353
+ .cm-channel-item.voice-connecting {
354
+ color: var(--sun);
355
+ }
356
+
357
+ .cm-ch-icon {
358
+ flex: 0 0 18px;
359
+ width: 18px;
360
+ height: 18px;
361
+ display: inline-flex;
362
+ align-items: center;
363
+ justify-content: center;
364
+ font-family: var(--ff-mono);
365
+ font-size: var(--fs-sm);
366
+ color: var(--fg-3);
367
+ opacity: 0.85;
368
+ }
369
+ .cm-channel-item.active .cm-ch-icon { color: var(--fg-2); opacity: 1; }
370
+
371
+ .cm-ch-spinner {
372
+ width: 12px;
373
+ height: 12px;
374
+ border-radius: 50%;
375
+ border: 2px solid color-mix(in oklab, var(--sun) 30%, transparent);
376
+ border-top-color: var(--sun);
377
+ animation: cm-spin 700ms linear infinite;
378
+ flex-shrink: 0;
379
+ }
380
+ @keyframes cm-spin {
381
+ to { transform: rotate(360deg); }
382
+ }
383
+
384
+ .cm-ch-name {
385
+ flex: 1;
386
+ min-width: 0;
387
+ overflow: hidden;
388
+ text-overflow: ellipsis;
389
+ white-space: nowrap;
390
+ font-size: var(--fs-sm);
391
+ }
392
+
393
+ .cm-ch-badge {
394
+ flex-shrink: 0;
395
+ min-width: 16px;
396
+ height: 16px;
397
+ padding: 0 5px;
398
+ background: var(--warn);
399
+ color: var(--paper);
400
+ font-family: var(--ff-mono);
401
+ font-size: var(--fs-micro);
402
+ font-weight: 700;
403
+ border-radius: var(--r-pill);
404
+ display: inline-flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ line-height: 1;
408
+ }
409
+
410
+ .cm-ch-actions {
411
+ display: inline-flex;
412
+ align-items: center;
413
+ gap: 2px;
414
+ opacity: 0;
415
+ transition: opacity var(--dur-snap) var(--ease);
416
+ flex-shrink: 0;
417
+ }
418
+ .cm-channel-item.active .cm-ch-actions { opacity: 0.6; }
419
+
420
+ .cm-ch-action-btn {
421
+ width: 18px;
422
+ height: 18px;
423
+ display: inline-flex;
424
+ align-items: center;
425
+ justify-content: center;
426
+ background: transparent;
427
+ border: 0;
428
+ color: var(--fg-3);
429
+ cursor: pointer;
430
+ border-radius: var(--r-1);
431
+ font-size: var(--fs-tiny);
432
+ transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
433
+ }
434
+ .cm-ch-action-btn:hover {
435
+ color: var(--fg);
436
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
437
+ }
438
+
439
+ /* Voice users nested under a voice channel */
440
+ .cm-ch-voice-users {
441
+ display: flex;
442
+ flex-direction: column;
443
+ gap: 1px;
444
+ padding: 2px 8px 4px 32px;
445
+ }
446
+
447
+ .cm-ch-voice-user {
448
+ display: flex;
449
+ align-items: center;
450
+ gap: 8px;
451
+ padding: 3px 6px;
452
+ border-radius: var(--r-1);
453
+ color: var(--fg-2);
454
+ font-size: var(--fs-xs);
455
+ cursor: pointer;
456
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
457
+ }
458
+ .cm-ch-voice-user:hover {
459
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
460
+ color: var(--fg);
461
+ }
462
+ .cm-ch-voice-user.speaking {
463
+ color: var(--green-2);
464
+ }
465
+ .cm-ch-voice-user.speaking .cm-ch-voice-user-avatar {
466
+ box-shadow: 0 0 0 2px var(--green-2);
467
+ }
468
+
469
+ .cm-ch-voice-user-avatar {
470
+ flex: 0 0 20px;
471
+ width: 20px;
472
+ height: 20px;
473
+ border-radius: 50%;
474
+ background: var(--bg-3);
475
+ color: var(--fg-2);
476
+ display: inline-flex;
477
+ align-items: center;
478
+ justify-content: center;
479
+ font-size: 10px;
480
+ font-weight: 600;
481
+ overflow: hidden;
482
+ transition: box-shadow var(--dur-snap) var(--ease);
483
+ }
484
+ .cm-ch-voice-user-avatar img {
485
+ width: 100%;
486
+ height: 100%;
487
+ object-fit: cover;
488
+ display: block;
489
+ }
490
+
491
+ .cm-ch-voice-user-name {
492
+ flex: 1;
493
+ min-width: 0;
494
+ overflow: hidden;
495
+ text-overflow: ellipsis;
496
+ white-space: nowrap;
497
+ }
498
+
499
+ /* ============================================================
500
+ Voice strip — slots above user panel when in voice
501
+ ============================================================ */
502
+ .cm-voice-strip {
503
+ display: none;
504
+ flex-direction: column;
505
+ gap: 8px;
506
+ padding: 10px 12px;
507
+ background: color-mix(in oklab, var(--green) 18%, var(--bg-2));
508
+ color: var(--fg);
509
+ box-shadow: 0 -1px 0 color-mix(in oklab, var(--fg) 10%, transparent);
510
+ flex-shrink: 0;
511
+ }
512
+ .cm-voice-strip.open { display: flex; }
513
+
514
+ .cm-vs-label {
515
+ font-family: var(--ff-mono);
516
+ font-size: var(--fs-micro);
517
+ text-transform: uppercase;
518
+ letter-spacing: var(--tr-caps);
519
+ color: var(--green-2);
520
+ font-weight: 700;
521
+ display: inline-flex;
522
+ align-items: center;
523
+ gap: 6px;
524
+ }
525
+ .cm-vs-label::before {
526
+ content: '';
527
+ width: 8px;
528
+ height: 8px;
529
+ border-radius: 50%;
530
+ background: var(--green-2);
531
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent);
532
+ animation: cm-pulse 1.6s ease-in-out infinite;
533
+ }
534
+ @keyframes cm-pulse {
535
+ 0%, 100% { box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent); }
536
+ 50% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--green-2) 0%, transparent); }
537
+ }
538
+
539
+ .cm-vs-channel {
540
+ font-size: var(--fs-sm);
541
+ font-weight: 600;
542
+ color: var(--fg);
543
+ overflow: hidden;
544
+ text-overflow: ellipsis;
545
+ white-space: nowrap;
546
+ }
547
+ .cm-vs-status {
548
+ font-size: var(--fs-xs);
549
+ color: var(--fg-2);
550
+ display: flex;
551
+ align-items: center;
552
+ gap: 6px;
553
+ flex-wrap: wrap;
554
+ }
555
+
556
+ .cm-vs-btn {
557
+ display: inline-flex;
558
+ align-items: center;
559
+ justify-content: center;
560
+ gap: 6px;
561
+ height: 28px;
562
+ padding: 0 10px;
563
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
564
+ color: var(--fg);
565
+ border: 0;
566
+ border-radius: var(--r-1);
567
+ font-family: var(--ff-body);
568
+ font-size: var(--fs-xs);
569
+ font-weight: 600;
570
+ cursor: pointer;
571
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
572
+ }
573
+ .cm-vs-btn:hover {
574
+ background: color-mix(in oklab, var(--fg) 18%, transparent);
575
+ }
576
+ .cm-vs-btn.danger {
577
+ background: var(--warn);
578
+ color: var(--paper);
579
+ }
580
+ .cm-vs-btn.danger:hover {
581
+ background: color-mix(in oklab, var(--warn) 80%, var(--ink));
582
+ }
583
+
584
+ /* ============================================================
585
+ User panel — bottom of channel sidebar
586
+ ============================================================ */
587
+ .cm-user-panel {
588
+ display: flex;
589
+ align-items: center;
590
+ gap: 8px;
591
+ padding: 8px 8px;
592
+ background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
593
+ flex-shrink: 0;
594
+ }
595
+
596
+ .cm-user-avatar {
597
+ position: relative;
598
+ flex: 0 0 32px;
599
+ width: 32px;
600
+ height: 32px;
601
+ border-radius: 50%;
602
+ background: var(--bg-3);
603
+ color: var(--fg-2);
604
+ display: inline-flex;
605
+ align-items: center;
606
+ justify-content: center;
607
+ font-size: var(--fs-xs);
608
+ font-weight: 600;
609
+ overflow: hidden;
610
+ }
611
+ .cm-user-avatar img {
612
+ width: 100%;
613
+ height: 100%;
614
+ object-fit: cover;
615
+ display: block;
616
+ }
617
+
618
+ .cm-user-status-dot {
619
+ position: absolute;
620
+ right: -2px;
621
+ bottom: -2px;
622
+ width: 12px;
623
+ height: 12px;
624
+ border-radius: 50%;
625
+ background: var(--green-2);
626
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--fg) 5%, var(--bg-2));
627
+ }
628
+
629
+ .cm-user-info {
630
+ flex: 1;
631
+ min-width: 0;
632
+ display: flex;
633
+ flex-direction: column;
634
+ line-height: 1.2;
635
+ }
636
+ .cm-user-name {
637
+ font-size: var(--fs-xs);
638
+ font-weight: 600;
639
+ color: var(--fg);
640
+ overflow: hidden;
641
+ text-overflow: ellipsis;
642
+ white-space: nowrap;
643
+ }
644
+ .cm-user-tag {
645
+ font-family: var(--ff-mono);
646
+ font-size: var(--fs-micro);
647
+ color: var(--fg-3);
648
+ overflow: hidden;
649
+ text-overflow: ellipsis;
650
+ white-space: nowrap;
651
+ }
652
+
653
+ .cm-user-controls {
654
+ display: inline-flex;
655
+ align-items: center;
656
+ gap: 2px;
657
+ }
658
+
659
+ .cm-user-btn {
660
+ width: 28px;
661
+ height: 28px;
662
+ display: inline-flex;
663
+ align-items: center;
664
+ justify-content: center;
665
+ background: transparent;
666
+ border: 0;
667
+ color: var(--fg-2);
668
+ cursor: pointer;
669
+ border-radius: var(--r-1);
670
+ font-size: var(--fs-sm);
671
+ transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
672
+ }
673
+ .cm-user-btn:hover {
674
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
675
+ color: var(--fg);
676
+ }
677
+ .cm-user-btn.muted {
678
+ color: var(--warn);
679
+ }
680
+ .cm-user-btn.deafened {
681
+ color: var(--warn);
682
+ background: color-mix(in oklab, var(--warn) 18%, transparent);
683
+ }
684
+
685
+ /* ============================================================
686
+ Chat header — top of main column
687
+ ============================================================ */
688
+ .cm-chat-header {
689
+ display: flex;
690
+ align-items: center;
691
+ gap: 10px;
692
+ padding: 12px 16px;
693
+ background: var(--bg);
694
+ box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
695
+ flex-shrink: 0;
696
+ min-height: 48px;
697
+ }
698
+
699
+ .cm-chat-header-icon {
700
+ flex: 0 0 20px;
701
+ width: 20px;
702
+ height: 20px;
703
+ display: inline-flex;
704
+ align-items: center;
705
+ justify-content: center;
706
+ font-family: var(--ff-mono);
707
+ font-size: var(--fs-lg);
708
+ color: var(--fg-3);
709
+ }
710
+
711
+ .cm-chat-header-name {
712
+ font-weight: 600;
713
+ font-size: var(--fs-sm);
714
+ color: var(--fg);
715
+ letter-spacing: -0.01em;
716
+ flex-shrink: 0;
717
+ }
718
+
719
+ .cm-chat-header-topic {
720
+ flex: 1;
721
+ min-width: 0;
722
+ padding-left: 12px;
723
+ margin-left: 4px;
724
+ border-left: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
725
+ color: var(--fg-3);
726
+ font-size: var(--fs-xs);
727
+ overflow: hidden;
728
+ text-overflow: ellipsis;
729
+ white-space: nowrap;
730
+ }
731
+
732
+ .cm-chat-header-toolbar {
733
+ display: inline-flex;
734
+ align-items: center;
735
+ gap: 4px;
736
+ flex-shrink: 0;
737
+ }
738
+
739
+ /* ============================================================
740
+ Member list — right column
741
+ ============================================================ */
742
+ .cm-member-list {
743
+ flex: 0 0 240px;
744
+ width: 240px;
745
+ display: flex;
746
+ flex-direction: column;
747
+ min-height: 0;
748
+ overflow-y: auto;
749
+ overflow-x: hidden;
750
+ background: var(--bg-2);
751
+ padding: 16px 0;
752
+ scrollbar-width: thin;
753
+ scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
754
+ transition: width var(--dur-base) var(--ease), flex-basis var(--dur-base) var(--ease);
755
+ }
756
+ .cm-member-list:not(.open) {
757
+ width: 0;
758
+ flex-basis: 0;
759
+ padding: 0;
760
+ overflow: hidden;
761
+ }
762
+ .cm-member-list::-webkit-scrollbar { width: 8px; }
763
+ .cm-member-list::-webkit-scrollbar-thumb {
764
+ background: color-mix(in oklab, var(--fg) 18%, transparent);
765
+ border-radius: 4px;
766
+ }
767
+
768
+ .cm-member-category {
769
+ padding: 12px 16px 6px;
770
+ font-family: var(--ff-body);
771
+ font-size: var(--fs-micro);
772
+ font-weight: 600;
773
+ color: var(--fg-3);
774
+ letter-spacing: var(--tr-caps);
775
+ text-transform: uppercase;
776
+ }
777
+
778
+ .cm-member-item {
779
+ display: flex;
780
+ align-items: center;
781
+ gap: 10px;
782
+ padding: 6px 12px;
783
+ margin: 0 8px;
784
+ border-radius: var(--r-1);
785
+ color: var(--fg-2);
786
+ cursor: pointer;
787
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
788
+ }
789
+ .cm-member-item:hover {
790
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
791
+ color: var(--fg);
792
+ }
793
+
794
+ .cm-member-avatar {
795
+ position: relative;
796
+ flex: 0 0 28px;
797
+ width: 28px;
798
+ height: 28px;
799
+ border-radius: 50%;
800
+ background: var(--bg-3);
801
+ color: var(--fg-2);
802
+ display: inline-flex;
803
+ align-items: center;
804
+ justify-content: center;
805
+ font-size: var(--fs-micro);
806
+ font-weight: 600;
807
+ overflow: hidden;
808
+ }
809
+ .cm-member-avatar img {
810
+ width: 100%;
811
+ height: 100%;
812
+ object-fit: cover;
813
+ display: block;
814
+ }
815
+
816
+ .cm-member-status {
817
+ position: absolute;
818
+ right: -2px;
819
+ bottom: -2px;
820
+ width: 10px;
821
+ height: 10px;
822
+ border-radius: 50%;
823
+ background: var(--fg-3);
824
+ box-shadow: 0 0 0 2px var(--bg-2);
825
+ }
826
+ .cm-member-status.online {
827
+ background: var(--green-2);
828
+ }
829
+
830
+ .cm-member-name {
831
+ flex: 1;
832
+ min-width: 0;
833
+ overflow: hidden;
834
+ text-overflow: ellipsis;
835
+ white-space: nowrap;
836
+ font-size: var(--fs-sm);
837
+ }
838
+
839
+ /* ============================================================
840
+ Voice user (standalone, e.g. in voice stage area)
841
+ ============================================================ */
842
+ .cm-voice-user {
843
+ display: inline-flex;
844
+ flex-direction: column;
845
+ align-items: center;
846
+ gap: 6px;
847
+ padding: 10px;
848
+ border-radius: var(--r-2);
849
+ background: var(--bg-2);
850
+ transition: box-shadow var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
851
+ }
852
+ .cm-voice-user.speaking {
853
+ background: color-mix(in oklab, var(--green-2) 12%, var(--bg-2));
854
+ box-shadow: 0 0 0 2px var(--green-2);
855
+ }
856
+
857
+ .cm-voice-user-avatar {
858
+ width: 56px;
859
+ height: 56px;
860
+ border-radius: 50%;
861
+ background: var(--bg-3);
862
+ color: var(--fg-2);
863
+ display: inline-flex;
864
+ align-items: center;
865
+ justify-content: center;
866
+ font-size: var(--fs-lg);
867
+ font-weight: 600;
868
+ overflow: hidden;
869
+ }
870
+ .cm-voice-user-avatar img {
871
+ width: 100%;
872
+ height: 100%;
873
+ object-fit: cover;
874
+ display: block;
875
+ }
876
+ .cm-voice-user.speaking .cm-voice-user-avatar {
877
+ box-shadow: 0 0 0 2px var(--green-2);
878
+ }
879
+
880
+ .cm-voice-user-name {
881
+ font-size: var(--fs-xs);
882
+ color: var(--fg);
883
+ font-weight: 500;
884
+ max-width: 100px;
885
+ overflow: hidden;
886
+ text-overflow: ellipsis;
887
+ white-space: nowrap;
888
+ text-align: center;
889
+ }
890
+
891
+ /* ============================================================
892
+ Responsive — collapse sidebars on narrow viewports
893
+ ============================================================ */
894
+ @media (max-width: 768px) {
895
+ .cm-channel-sidebar {
896
+ position: absolute;
897
+ z-index: 20;
898
+ top: 0;
899
+ left: 72px;
900
+ bottom: 0;
901
+ transform: translateX(-110%);
902
+ transition: transform var(--dur-base) var(--ease);
903
+ box-shadow: 2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
904
+ }
905
+ .cm-channel-sidebar.open { transform: translateX(0); }
906
+ .cm-member-list { display: none; }
907
+ .cm-member-list.open {
908
+ display: flex;
909
+ position: absolute;
910
+ z-index: 20;
911
+ top: 0;
912
+ right: 0;
913
+ bottom: 0;
914
+ width: 240px;
915
+ flex-basis: 240px;
916
+ box-shadow: -2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
917
+ }
918
+ .cm-chat-header-topic { display: none; }
919
+ }
920
+
921
+ @media (max-width: 480px) {
922
+ .cm-server-rail {
923
+ flex: 0 0 56px;
924
+ width: 56px;
925
+ }
926
+ .cm-server-icon,
927
+ .cm-server-add,
928
+ .cm-server-back {
929
+ width: 40px;
930
+ height: 40px;
931
+ }
932
+ .cm-channel-sidebar { left: 56px; }
933
+ }
6
934
 
7
- /* ============================================================
8
- Shell — top-level flex container for the community layout
9
- ============================================================ */
10
- .cm-shell {
11
- display: flex;
12
- height: 100vh;
13
- width: 100%;
14
- overflow: hidden;
15
- background: var(--bg);
16
- color: var(--fg);
17
- font-family: var(--ff-body);
18
- font-size: var(--fs-sm);
19
- }
20
-
21
- .cm-main {
22
- display: flex;
23
- flex-direction: column;
24
- flex: 1;
25
- min-width: 0;
26
- min-height: 0;
27
- background: var(--bg);
28
- position: relative;
29
- }
30
935
 
31
936
  /* ============================================================
32
- Server rail thin vertical column, leftmost
937
+ Overlaystoast, banner, mobile header, drawer, boot splash,
938
+ context menu, command palette, emoji picker, reply bar.
939
+ Added by overlays.js component surface.
33
940
  ============================================================ */
34
- .cm-server-rail {
35
- flex: 0 0 72px;
36
- width: 72px;
37
- display: flex;
38
- flex-direction: column;
39
- align-items: center;
40
- gap: 8px;
41
- padding: 12px 0;
42
- background: color-mix(in oklab, var(--bg) 70%, var(--ink));
43
- overflow-y: auto;
44
- overflow-x: hidden;
45
- scrollbar-width: none;
46
- }
47
- .cm-server-rail::-webkit-scrollbar { display: none; }
48
941
 
49
- .cm-server-icon {
50
- position: relative;
51
- width: 48px;
52
- height: 48px;
53
- border-radius: var(--r-3);
54
- background: var(--bg-2);
55
- color: var(--fg);
56
- display: flex;
57
- align-items: center;
58
- justify-content: center;
59
- font-family: var(--ff-body);
60
- font-size: var(--fs-lg);
61
- font-weight: 600;
62
- letter-spacing: var(--tr-tight);
63
- cursor: pointer;
64
- overflow: hidden;
65
- transition:
66
- border-radius var(--dur-base) var(--ease),
67
- background var(--dur-snap) var(--ease),
68
- color var(--dur-snap) var(--ease),
69
- transform var(--dur-snap) var(--ease);
70
- user-select: none;
71
- }
72
- .cm-server-icon img,
73
- .cm-server-icon svg {
74
- width: 100%;
75
- height: 100%;
76
- object-fit: cover;
77
- display: block;
78
- }
79
- .cm-server-icon:hover {
80
- border-radius: var(--r-2);
81
- background: var(--accent);
82
- color: var(--accent-fg);
83
- }
84
- .cm-server-icon.active {
942
+ /* ---- Toast ---- */
943
+ .cm-toast {
944
+ position: fixed;
945
+ bottom: 24px;
946
+ right: 24px;
947
+ z-index: 1100;
948
+ padding: 10px 14px;
85
949
  border-radius: var(--r-2);
86
- background: var(--accent);
87
- color: var(--accent-fg);
88
- }
89
-
90
- .cm-server-pill {
91
- position: absolute;
92
- left: -10px;
93
- top: 50%;
94
- transform: translateY(-50%);
95
- width: 4px;
96
- height: 8px;
97
- background: var(--fg);
98
- border-radius: 0 4px 4px 0;
99
- transition: height var(--dur-base) var(--ease);
100
- }
101
- .cm-server-icon:hover .cm-server-pill { height: 20px; }
102
- .cm-server-icon.active .cm-server-pill { height: 36px; background: var(--fg); }
103
-
104
- .cm-server-badge {
105
- position: absolute;
106
- top: -2px;
107
- right: -2px;
108
- min-width: 18px;
109
- height: 18px;
110
- padding: 0 5px;
111
- background: var(--warn);
112
- color: var(--paper);
113
- font-family: var(--ff-mono);
114
- font-size: var(--fs-micro);
115
- font-weight: 700;
116
- border-radius: var(--r-pill);
117
- display: flex;
118
- align-items: center;
119
- justify-content: center;
120
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--bg) 70%, var(--ink));
121
- }
122
-
123
- .cm-server-back,
124
- .cm-server-add {
125
- width: 48px;
126
- height: 48px;
127
- border-radius: var(--r-3);
128
950
  background: var(--bg-2);
129
- color: var(--green-2);
130
- display: flex;
951
+ color: var(--fg);
952
+ font-size: var(--fs-sm);
953
+ box-shadow: 0 8px 24px color-mix(in oklab, var(--ink) 35%, transparent);
954
+ display: inline-flex;
131
955
  align-items: center;
132
- justify-content: center;
133
- font-size: var(--fs-xl);
134
- font-weight: 400;
135
- cursor: pointer;
136
- border: 0;
137
- transition:
138
- border-radius var(--dur-base) var(--ease),
139
- background var(--dur-snap) var(--ease),
140
- color var(--dur-snap) var(--ease);
141
- }
142
- .cm-server-back { color: var(--fg-2); }
143
- .cm-server-back:hover,
144
- .cm-server-add:hover {
145
- border-radius: var(--r-2);
146
- background: var(--green-2);
147
- color: var(--paper);
148
- }
149
-
150
- .cm-server-sep {
151
- width: 32px;
152
- height: 2px;
153
- background: color-mix(in oklab, var(--fg) 12%, transparent);
154
- border-radius: 2px;
155
- margin: 4px 0;
156
- flex-shrink: 0;
956
+ gap: 8px;
957
+ max-width: 360px;
958
+ animation: cm-toast-in var(--dur-base) var(--ease);
157
959
  }
158
-
159
- /* ============================================================
160
- Channel sidebar server name header + channel list
161
- ============================================================ */
162
- .cm-channel-sidebar {
163
- flex: 0 0 240px;
164
- width: 240px;
165
- display: flex;
166
- flex-direction: column;
167
- min-height: 0;
168
- background: var(--bg-2);
169
- position: relative;
960
+ @keyframes cm-toast-in {
961
+ from { transform: translateY(8px); opacity: 0; }
962
+ to { transform: translateY(0); opacity: 1; }
170
963
  }
964
+ .cm-toast.tone-info { border-left: 3px solid var(--accent); }
965
+ .cm-toast.tone-success { border-left: 3px solid var(--green-2); }
966
+ .cm-toast.tone-warn { border-left: 3px solid var(--sun); }
967
+ .cm-toast.tone-error { border-left: 3px solid var(--warn); }
171
968
 
172
- .cm-server-header {
969
+ /* ---- Banner ---- */
970
+ .cm-banner {
173
971
  display: flex;
174
972
  align-items: center;
175
- justify-content: space-between;
176
- gap: 8px;
177
- padding: 14px 16px;
973
+ gap: 10px;
974
+ padding: 8px 14px;
178
975
  background: var(--bg-2);
179
- box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
180
- font-weight: 600;
976
+ color: var(--fg);
181
977
  font-size: var(--fs-sm);
182
- letter-spacing: -0.01em;
978
+ border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 25%, transparent);
979
+ }
980
+ .cm-banner-msg { flex: 1; min-width: 0; }
981
+ .cm-banner.tone-info { background: color-mix(in oklab, var(--accent) 14%, var(--bg-2)); }
982
+ .cm-banner.tone-success { background: color-mix(in oklab, var(--green-2) 14%, var(--bg-2)); }
983
+ .cm-banner.tone-warn { background: color-mix(in oklab, var(--sun) 18%, var(--bg-2)); }
984
+ .cm-banner.tone-error { background: color-mix(in oklab, var(--warn) 18%, var(--bg-2)); }
985
+ .cm-banner-action,
986
+ .cm-banner-dismiss {
987
+ background: transparent;
988
+ color: inherit;
989
+ border: 1px solid color-mix(in oklab, var(--fg) 22%, transparent);
990
+ border-radius: var(--r-1);
991
+ padding: 4px 10px;
183
992
  cursor: pointer;
993
+ font-size: var(--fs-xs);
994
+ display: inline-flex;
995
+ align-items: center;
996
+ gap: 4px;
184
997
  transition: background var(--dur-snap) var(--ease);
185
- user-select: none;
186
- flex-shrink: 0;
187
- }
188
- .cm-server-header:hover {
189
- background: color-mix(in oklab, var(--fg) 6%, var(--bg-2));
190
- }
191
- .cm-server-header-name {
192
- flex: 1;
193
- min-width: 0;
194
- overflow: hidden;
195
- text-overflow: ellipsis;
196
- white-space: nowrap;
197
- }
198
-
199
- .cm-channel-list {
200
- flex: 1;
201
- min-height: 0;
202
- overflow-y: auto;
203
- overflow-x: hidden;
204
- padding: 8px 0 16px;
205
- display: flex;
206
- flex-direction: column;
207
- gap: 2px;
208
- scrollbar-width: thin;
209
- scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
210
- }
211
- .cm-channel-list::-webkit-scrollbar { width: 8px; }
212
- .cm-channel-list::-webkit-scrollbar-track { background: transparent; }
213
- .cm-channel-list::-webkit-scrollbar-thumb {
214
- background: color-mix(in oklab, var(--fg) 18%, transparent);
215
- border-radius: 4px;
216
998
  }
999
+ .cm-banner-action:hover,
1000
+ .cm-banner-dismiss:hover { background: color-mix(in oklab, var(--fg) 12%, transparent); }
1001
+ .cm-banner-dismiss { border: none; padding: 4px 8px; }
217
1002
 
218
- /* ============================================================
219
- Channel category — collapsible group header
220
- ============================================================ */
221
- .cm-channel-category {
222
- display: flex;
223
- flex-direction: column;
224
- margin-top: 12px;
225
- }
226
- .cm-channel-category:first-child { margin-top: 4px; }
227
-
228
- .cm-category-header {
1003
+ /* ---- Mobile header ---- */
1004
+ .cm-mobile-header {
229
1005
  display: flex;
230
1006
  align-items: center;
231
- gap: 4px;
232
- padding: 4px 8px 4px 8px;
233
- font-family: var(--ff-body);
234
- font-size: var(--fs-micro);
235
- font-weight: 600;
236
- color: var(--fg-3);
237
- letter-spacing: var(--tr-caps);
238
- text-transform: uppercase;
239
- cursor: pointer;
240
- user-select: none;
241
- transition: color var(--dur-snap) var(--ease);
1007
+ gap: 10px;
1008
+ padding: 8px 12px;
1009
+ height: 48px;
1010
+ background: var(--bg-2);
1011
+ color: var(--fg);
1012
+ border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 20%, transparent);
242
1013
  }
243
- .cm-category-header:hover { color: var(--fg); }
244
- .cm-category-header:hover .cm-cat-add { opacity: 1; }
245
-
246
- .cm-cat-arrow {
1014
+ .cm-mh-btn {
1015
+ background: transparent;
1016
+ color: inherit;
1017
+ border: none;
1018
+ width: 36px;
1019
+ height: 36px;
247
1020
  display: inline-flex;
248
1021
  align-items: center;
249
1022
  justify-content: center;
250
- width: 12px;
251
- height: 12px;
252
- font-size: 10px;
253
- transform: rotate(90deg);
254
- transition: transform var(--dur-base) var(--ease);
255
- flex-shrink: 0;
256
- }
257
- .cm-category-header.collapsed .cm-cat-arrow { transform: rotate(0deg); }
258
-
259
- .cm-cat-name {
1023
+ border-radius: var(--r-1);
1024
+ cursor: pointer;
1025
+ font-size: var(--fs-md);
1026
+ transition: background var(--dur-snap) var(--ease);
1027
+ }
1028
+ .cm-mh-btn:hover { background: color-mix(in oklab, var(--fg) 10%, transparent); }
1029
+ .cm-mh-title {
260
1030
  flex: 1;
261
1031
  min-width: 0;
1032
+ font-weight: 600;
1033
+ font-size: var(--fs-md);
262
1034
  overflow: hidden;
263
1035
  text-overflow: ellipsis;
264
1036
  white-space: nowrap;
265
1037
  }
266
- .cm-cat-extra {
267
- font-family: var(--ff-mono);
268
- font-size: var(--fs-micro);
269
- color: var(--fg-3);
270
- font-weight: 500;
271
- letter-spacing: 0;
272
- text-transform: none;
273
- }
274
- .cm-cat-add {
275
- display: inline-flex;
276
- align-items: center;
277
- justify-content: center;
278
- width: 18px;
279
- height: 18px;
280
- border: 0;
281
- background: transparent;
282
- color: var(--fg-3);
283
- font-size: var(--fs-sm);
284
- cursor: pointer;
285
- opacity: 0;
286
- border-radius: var(--r-1);
287
- transition: opacity var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
288
- }
289
- .cm-cat-add:hover {
290
- color: var(--fg);
291
- background: color-mix(in oklab, var(--fg) 8%, transparent);
1038
+ @media (min-width: 769px) {
1039
+ .cm-mobile-header { display: none; }
292
1040
  }
293
1041
 
294
- .cm-cat-channels {
1042
+ /* ---- Drawer overlay ---- */
1043
+ .cm-drawer-overlay {
1044
+ position: fixed;
1045
+ inset: 0;
1046
+ z-index: 1000;
295
1047
  display: flex;
296
- flex-direction: column;
297
- gap: 1px;
298
- padding: 2px 0;
299
1048
  }
300
-
301
- /* ============================================================
302
- Channel item — pillish row with active rail and hover state
303
- ============================================================ */
304
- .cm-channel-item-wrap {
305
- position: relative;
306
- padding: 0 8px;
1049
+ .cm-drawer-backdrop {
1050
+ position: absolute;
1051
+ inset: 0;
1052
+ background: color-mix(in oklab, var(--ink) 55%, transparent);
1053
+ animation: cm-fade-in var(--dur-base) var(--ease);
307
1054
  }
308
-
309
- .cm-channel-item {
1055
+ @keyframes cm-fade-in { from { opacity: 0 } to { opacity: 1 } }
1056
+ .cm-drawer-content {
310
1057
  position: relative;
1058
+ background: var(--bg);
1059
+ color: var(--fg);
1060
+ height: 100%;
1061
+ width: min(320px, 86vw);
1062
+ box-shadow: 0 0 24px color-mix(in oklab, var(--ink) 40%, transparent);
1063
+ overflow-y: auto;
311
1064
  display: flex;
312
- align-items: center;
313
- gap: 8px;
314
- padding: 6px 8px;
315
- border-radius: var(--r-1);
316
- color: var(--fg-3);
317
- cursor: pointer;
318
- user-select: none;
319
- transition:
320
- background var(--dur-snap) var(--ease),
321
- color var(--dur-snap) var(--ease);
1065
+ flex-direction: column;
1066
+ animation: cm-drawer-in-l var(--dur-base) var(--ease);
322
1067
  }
323
- .cm-channel-item:hover {
324
- background: color-mix(in oklab, var(--fg) 6%, transparent);
325
- color: var(--fg);
1068
+ .cm-drawer-content.side-left { margin-right: auto; }
1069
+ .cm-drawer-content.side-right {
1070
+ margin-left: auto;
1071
+ animation-name: cm-drawer-in-r;
326
1072
  }
327
- .cm-channel-item:hover .cm-ch-actions { opacity: 1; }
1073
+ @keyframes cm-drawer-in-l { from { transform: translateX(-100%) } to { transform: translateX(0) } }
1074
+ @keyframes cm-drawer-in-r { from { transform: translateX(100%) } to { transform: translateX(0) } }
328
1075
 
329
- .cm-channel-item.active {
330
- background: color-mix(in oklab, var(--fg) 10%, transparent);
1076
+ /* ---- Boot overlay ---- */
1077
+ .cm-boot-overlay {
1078
+ position: fixed;
1079
+ inset: 0;
1080
+ z-index: 1200;
1081
+ background: var(--bg);
331
1082
  color: var(--fg);
332
- font-weight: 500;
333
- }
334
- .cm-channel-item.active::before {
335
- content: '';
336
- position: absolute;
337
- left: -8px;
338
- top: 4px;
339
- bottom: 4px;
340
- width: 3px;
341
- background: var(--accent);
342
- border-radius: 0 3px 3px 0;
343
- }
344
-
345
- .cm-channel-item.voice-active {
346
- color: var(--green-2);
347
- }
348
- .cm-channel-item.voice-active .cm-ch-icon { color: var(--green-2); }
349
- .cm-channel-item.voice-active:hover {
350
- background: color-mix(in oklab, var(--green) 12%, transparent);
351
- }
352
-
353
- .cm-channel-item.voice-connecting {
354
- color: var(--sun);
355
- }
356
-
357
- .cm-ch-icon {
358
- flex: 0 0 18px;
359
- width: 18px;
360
- height: 18px;
361
- display: inline-flex;
1083
+ display: flex;
1084
+ flex-direction: column;
362
1085
  align-items: center;
363
1086
  justify-content: center;
364
- font-family: var(--ff-mono);
365
- font-size: var(--fs-sm);
366
- color: var(--fg-3);
367
- opacity: 0.85;
1087
+ gap: 16px;
1088
+ padding: 24px;
368
1089
  }
369
- .cm-channel-item.active .cm-ch-icon { color: var(--fg-2); opacity: 1; }
370
-
371
- .cm-ch-spinner {
372
- width: 12px;
373
- height: 12px;
1090
+ .cm-boot-spinner {
1091
+ width: 48px;
1092
+ height: 48px;
374
1093
  border-radius: 50%;
375
- border: 2px solid color-mix(in oklab, var(--sun) 30%, transparent);
376
- border-top-color: var(--sun);
377
- animation: cm-spin 700ms linear infinite;
378
- flex-shrink: 0;
379
- }
380
- @keyframes cm-spin {
381
- to { transform: rotate(360deg); }
1094
+ border: 3px solid color-mix(in oklab, var(--fg) 14%, transparent);
1095
+ border-top-color: var(--accent);
1096
+ animation: cm-spin 0.9s linear infinite;
382
1097
  }
383
-
384
- .cm-ch-name {
385
- flex: 1;
386
- min-width: 0;
387
- overflow: hidden;
388
- text-overflow: ellipsis;
389
- white-space: nowrap;
390
- font-size: var(--fs-sm);
391
- }
392
-
393
- .cm-ch-badge {
394
- flex-shrink: 0;
395
- min-width: 16px;
396
- height: 16px;
397
- padding: 0 5px;
398
- background: var(--warn);
399
- color: var(--paper);
400
- font-family: var(--ff-mono);
401
- font-size: var(--fs-micro);
402
- font-weight: 700;
403
- border-radius: var(--r-pill);
404
- display: inline-flex;
405
- align-items: center;
406
- justify-content: center;
407
- line-height: 1;
408
- }
409
-
410
- .cm-ch-actions {
411
- display: inline-flex;
412
- align-items: center;
413
- gap: 2px;
414
- opacity: 0;
415
- transition: opacity var(--dur-snap) var(--ease);
416
- flex-shrink: 0;
417
- }
418
- .cm-channel-item.active .cm-ch-actions { opacity: 0.6; }
419
-
420
- .cm-ch-action-btn {
421
- width: 18px;
422
- height: 18px;
423
- display: inline-flex;
424
- align-items: center;
425
- justify-content: center;
426
- background: transparent;
427
- border: 0;
428
- color: var(--fg-3);
429
- cursor: pointer;
430
- border-radius: var(--r-1);
431
- font-size: var(--fs-tiny);
432
- transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
433
- }
434
- .cm-ch-action-btn:hover {
435
- color: var(--fg);
436
- background: color-mix(in oklab, var(--fg) 10%, transparent);
437
- }
438
-
439
- /* Voice users nested under a voice channel */
440
- .cm-ch-voice-users {
441
- display: flex;
442
- flex-direction: column;
443
- gap: 1px;
444
- padding: 2px 8px 4px 32px;
445
- }
446
-
447
- .cm-ch-voice-user {
448
- display: flex;
449
- align-items: center;
450
- gap: 8px;
451
- padding: 3px 6px;
452
- border-radius: var(--r-1);
1098
+ @keyframes cm-spin { to { transform: rotate(360deg); } }
1099
+ .cm-boot-phase {
1100
+ font-size: var(--fs-md);
453
1101
  color: var(--fg-2);
454
- font-size: var(--fs-xs);
455
- cursor: pointer;
456
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
457
- }
458
- .cm-ch-voice-user:hover {
459
- background: color-mix(in oklab, var(--fg) 6%, transparent);
460
- color: var(--fg);
461
- }
462
- .cm-ch-voice-user.speaking {
463
- color: var(--green-2);
464
- }
465
- .cm-ch-voice-user.speaking .cm-ch-voice-user-avatar {
466
- box-shadow: 0 0 0 2px var(--green-2);
1102
+ letter-spacing: var(--tr-tight);
467
1103
  }
468
-
469
- .cm-ch-voice-user-avatar {
470
- flex: 0 0 20px;
471
- width: 20px;
472
- height: 20px;
473
- border-radius: 50%;
474
- background: var(--bg-3);
475
- color: var(--fg-2);
476
- display: inline-flex;
477
- align-items: center;
478
- justify-content: center;
479
- font-size: 10px;
480
- font-weight: 600;
1104
+ .cm-boot-progress {
1105
+ width: min(420px, 80vw);
1106
+ height: 6px;
1107
+ background: var(--bg-2);
1108
+ border-radius: 999px;
481
1109
  overflow: hidden;
482
- transition: box-shadow var(--dur-snap) var(--ease);
483
1110
  }
484
- .cm-ch-voice-user-avatar img {
485
- width: 100%;
1111
+ .cm-boot-bar {
486
1112
  height: 100%;
487
- object-fit: cover;
488
- display: block;
1113
+ background: var(--accent);
1114
+ transition: width var(--dur-base) var(--ease);
489
1115
  }
490
-
491
- .cm-ch-voice-user-name {
492
- flex: 1;
493
- min-width: 0;
494
- overflow: hidden;
495
- text-overflow: ellipsis;
496
- white-space: nowrap;
1116
+ .cm-boot-error {
1117
+ color: var(--warn);
1118
+ font-size: var(--fs-sm);
1119
+ max-width: 480px;
1120
+ text-align: center;
497
1121
  }
498
1122
 
499
- /* ============================================================
500
- Voice strip — slots above user panel when in voice
501
- ============================================================ */
502
- .cm-voice-strip {
503
- display: none;
504
- flex-direction: column;
505
- gap: 8px;
506
- padding: 10px 12px;
507
- background: color-mix(in oklab, var(--green) 18%, var(--bg-2));
1123
+ /* ---- Context menu ---- */
1124
+ .cm-context-menu {
1125
+ position: fixed;
1126
+ z-index: 1300;
1127
+ min-width: 180px;
1128
+ padding: 4px;
1129
+ background: var(--bg-2);
508
1130
  color: var(--fg);
509
- box-shadow: 0 -1px 0 color-mix(in oklab, var(--fg) 10%, transparent);
510
- flex-shrink: 0;
511
- }
512
- .cm-voice-strip.open { display: flex; }
513
-
514
- .cm-vs-label {
515
- font-family: var(--ff-mono);
516
- font-size: var(--fs-micro);
517
- text-transform: uppercase;
518
- letter-spacing: var(--tr-caps);
519
- color: var(--green-2);
520
- font-weight: 700;
521
- display: inline-flex;
522
- align-items: center;
523
- gap: 6px;
524
- }
525
- .cm-vs-label::before {
526
- content: '';
527
- width: 8px;
528
- height: 8px;
529
- border-radius: 50%;
530
- background: var(--green-2);
531
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent);
532
- animation: cm-pulse 1.6s ease-in-out infinite;
533
- }
534
- @keyframes cm-pulse {
535
- 0%, 100% { box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent); }
536
- 50% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--green-2) 0%, transparent); }
1131
+ border-radius: var(--r-2);
1132
+ box-shadow: 0 8px 24px color-mix(in oklab, var(--ink) 45%, transparent);
1133
+ animation: cm-fade-in var(--dur-snap) var(--ease);
537
1134
  }
538
-
539
- .cm-vs-channel {
1135
+ .cm-cm-list { display: flex; flex-direction: column; gap: 1px; }
1136
+ .cm-cm-item {
1137
+ background: transparent;
1138
+ color: inherit;
1139
+ border: none;
1140
+ text-align: left;
1141
+ padding: 8px 10px;
1142
+ border-radius: var(--r-1);
540
1143
  font-size: var(--fs-sm);
541
- font-weight: 600;
542
- color: var(--fg);
543
- overflow: hidden;
544
- text-overflow: ellipsis;
545
- white-space: nowrap;
546
- }
547
- .cm-vs-status {
548
- font-size: var(--fs-xs);
549
- color: var(--fg-2);
550
1144
  display: flex;
551
1145
  align-items: center;
552
- gap: 6px;
553
- flex-wrap: wrap;
554
- }
555
-
556
- .cm-vs-btn {
557
- display: inline-flex;
558
- align-items: center;
559
- justify-content: center;
560
- gap: 6px;
561
- height: 28px;
562
- padding: 0 10px;
563
- background: color-mix(in oklab, var(--fg) 10%, transparent);
564
- color: var(--fg);
565
- border: 0;
566
- border-radius: var(--r-1);
567
- font-family: var(--ff-body);
568
- font-size: var(--fs-xs);
569
- font-weight: 600;
1146
+ gap: 8px;
570
1147
  cursor: pointer;
571
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
572
- }
573
- .cm-vs-btn:hover {
574
- background: color-mix(in oklab, var(--fg) 18%, transparent);
575
- }
576
- .cm-vs-btn.danger {
577
- background: var(--warn);
578
- color: var(--paper);
1148
+ transition: background var(--dur-snap) var(--ease);
579
1149
  }
580
- .cm-vs-btn.danger:hover {
581
- background: color-mix(in oklab, var(--warn) 80%, var(--ink));
1150
+ .cm-cm-item:hover { background: color-mix(in oklab, var(--accent) 24%, transparent); color: var(--fg); }
1151
+ .cm-cm-item.danger { color: var(--warn); }
1152
+ .cm-cm-item.danger:hover { background: color-mix(in oklab, var(--warn) 22%, transparent); color: var(--warn); }
1153
+ .cm-cm-icon { width: 18px; display: inline-flex; justify-content: center; }
1154
+ .cm-cm-label { flex: 1; min-width: 0; }
1155
+ .cm-cm-sep {
1156
+ height: 1px;
1157
+ background: color-mix(in oklab, var(--fg-3) 22%, transparent);
1158
+ margin: 4px 6px;
582
1159
  }
583
1160
 
584
- /* ============================================================
585
- User panel — bottom of channel sidebar
586
- ============================================================ */
587
- .cm-user-panel {
1161
+ /* ---- Command palette ---- */
1162
+ .cm-command-palette-wrap {
1163
+ position: fixed;
1164
+ inset: 0;
1165
+ z-index: 1400;
588
1166
  display: flex;
589
- align-items: center;
590
- gap: 8px;
591
- padding: 8px 8px;
592
- background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
593
- flex-shrink: 0;
594
- }
595
-
596
- .cm-user-avatar {
597
- position: relative;
598
- flex: 0 0 32px;
599
- width: 32px;
600
- height: 32px;
601
- border-radius: 50%;
602
- background: var(--bg-3);
603
- color: var(--fg-2);
604
- display: inline-flex;
605
- align-items: center;
1167
+ align-items: flex-start;
606
1168
  justify-content: center;
607
- font-size: var(--fs-xs);
608
- font-weight: 600;
609
- overflow: hidden;
1169
+ padding-top: 12vh;
610
1170
  }
611
- .cm-user-avatar img {
612
- width: 100%;
613
- height: 100%;
614
- object-fit: cover;
615
- display: block;
616
- }
617
-
618
- .cm-user-status-dot {
1171
+ .cm-command-palette-backdrop {
619
1172
  position: absolute;
620
- right: -2px;
621
- bottom: -2px;
622
- width: 12px;
623
- height: 12px;
624
- border-radius: 50%;
625
- background: var(--green-2);
626
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--fg) 5%, var(--bg-2));
1173
+ inset: 0;
1174
+ background: color-mix(in oklab, var(--ink) 50%, transparent);
627
1175
  }
628
-
629
- .cm-user-info {
630
- flex: 1;
631
- min-width: 0;
1176
+ .cm-command-palette {
1177
+ position: relative;
1178
+ width: min(560px, 92vw);
1179
+ max-height: 60vh;
632
1180
  display: flex;
633
1181
  flex-direction: column;
634
- line-height: 1.2;
635
- }
636
- .cm-user-name {
637
- font-size: var(--fs-xs);
638
- font-weight: 600;
1182
+ background: var(--bg-2);
639
1183
  color: var(--fg);
1184
+ border-radius: var(--r-2);
1185
+ box-shadow: 0 16px 40px color-mix(in oklab, var(--ink) 45%, transparent);
640
1186
  overflow: hidden;
641
- text-overflow: ellipsis;
642
- white-space: nowrap;
643
1187
  }
644
- .cm-user-tag {
645
- font-family: var(--ff-mono);
646
- font-size: var(--fs-micro);
647
- color: var(--fg-3);
648
- overflow: hidden;
649
- text-overflow: ellipsis;
650
- white-space: nowrap;
1188
+ .cm-cp-input {
1189
+ background: transparent;
1190
+ border: none;
1191
+ border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
1192
+ color: var(--fg);
1193
+ font-size: var(--fs-md);
1194
+ padding: 14px 16px;
1195
+ outline: none;
1196
+ font-family: var(--ff-body);
651
1197
  }
652
-
653
- .cm-user-controls {
654
- display: inline-flex;
655
- align-items: center;
656
- gap: 2px;
1198
+ .cm-cp-input::placeholder { color: var(--fg-3); }
1199
+ .cm-cp-list {
1200
+ flex: 1;
1201
+ min-height: 0;
1202
+ overflow-y: auto;
1203
+ padding: 6px;
1204
+ display: flex;
1205
+ flex-direction: column;
1206
+ gap: 1px;
657
1207
  }
658
-
659
- .cm-user-btn {
660
- width: 28px;
661
- height: 28px;
662
- display: inline-flex;
663
- align-items: center;
664
- justify-content: center;
1208
+ .cm-cp-item {
665
1209
  background: transparent;
666
- border: 0;
667
- color: var(--fg-2);
668
- cursor: pointer;
1210
+ color: inherit;
1211
+ border: none;
1212
+ text-align: left;
1213
+ padding: 10px 12px;
669
1214
  border-radius: var(--r-1);
670
1215
  font-size: var(--fs-sm);
671
- transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
672
- }
673
- .cm-user-btn:hover {
674
- background: color-mix(in oklab, var(--fg) 10%, transparent);
675
- color: var(--fg);
676
- }
677
- .cm-user-btn.muted {
678
- color: var(--warn);
679
- }
680
- .cm-user-btn.deafened {
681
- color: var(--warn);
682
- background: color-mix(in oklab, var(--warn) 18%, transparent);
683
- }
684
-
685
- /* ============================================================
686
- Chat header — top of main column
687
- ============================================================ */
688
- .cm-chat-header {
689
1216
  display: flex;
690
1217
  align-items: center;
691
1218
  gap: 10px;
692
- padding: 12px 16px;
693
- background: var(--bg);
694
- box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
695
- flex-shrink: 0;
696
- min-height: 48px;
1219
+ cursor: pointer;
1220
+ transition: background var(--dur-snap) var(--ease);
697
1221
  }
698
-
699
- .cm-chat-header-icon {
700
- flex: 0 0 20px;
701
- width: 20px;
702
- height: 20px;
703
- display: inline-flex;
704
- align-items: center;
705
- justify-content: center;
706
- font-family: var(--ff-mono);
707
- font-size: var(--fs-lg);
708
- color: var(--fg-3);
1222
+ .cm-cp-item:hover,
1223
+ .cm-cp-item.selected {
1224
+ background: color-mix(in oklab, var(--accent) 22%, transparent);
709
1225
  }
1226
+ .cm-cp-icon { width: 20px; display: inline-flex; justify-content: center; }
1227
+ .cm-cp-label { flex: 1; min-width: 0; }
1228
+ .cm-cp-hint { color: var(--fg-3); font-size: var(--fs-xs); }
710
1229
 
711
- .cm-chat-header-name {
712
- font-weight: 600;
713
- font-size: var(--fs-sm);
1230
+ /* ---- Emoji picker ---- */
1231
+ .cm-emoji-picker {
1232
+ width: min(340px, 92vw);
1233
+ max-height: 360px;
1234
+ background: var(--bg-2);
714
1235
  color: var(--fg);
715
- letter-spacing: -0.01em;
716
- flex-shrink: 0;
717
- }
718
-
719
- .cm-chat-header-topic {
720
- flex: 1;
721
- min-width: 0;
722
- padding-left: 12px;
723
- margin-left: 4px;
724
- border-left: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
725
- color: var(--fg-3);
726
- font-size: var(--fs-xs);
1236
+ border-radius: var(--r-2);
1237
+ box-shadow: 0 12px 28px color-mix(in oklab, var(--ink) 40%, transparent);
1238
+ display: flex;
1239
+ flex-direction: column;
727
1240
  overflow: hidden;
728
- text-overflow: ellipsis;
729
- white-space: nowrap;
730
1241
  }
731
-
732
- .cm-chat-header-toolbar {
733
- display: inline-flex;
734
- align-items: center;
735
- gap: 4px;
736
- flex-shrink: 0;
1242
+ .cm-ep-search {
1243
+ background: var(--bg-3);
1244
+ border: none;
1245
+ color: var(--fg);
1246
+ padding: 8px 10px;
1247
+ font-size: var(--fs-sm);
1248
+ margin: 8px;
1249
+ border-radius: var(--r-1);
1250
+ outline: none;
1251
+ font-family: var(--ff-body);
737
1252
  }
738
-
739
- /* ============================================================
740
- Member list — right column
741
- ============================================================ */
742
- .cm-member-list {
743
- flex: 0 0 240px;
744
- width: 240px;
745
- display: flex;
746
- flex-direction: column;
1253
+ .cm-ep-search::placeholder { color: var(--fg-3); }
1254
+ .cm-ep-grid {
1255
+ flex: 1;
747
1256
  min-height: 0;
748
1257
  overflow-y: auto;
749
- overflow-x: hidden;
750
- background: var(--bg-2);
751
- padding: 16px 0;
752
- scrollbar-width: thin;
753
- scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
754
- transition: width var(--dur-base) var(--ease), flex-basis var(--dur-base) var(--ease);
755
- }
756
- .cm-member-list:not(.open) {
757
- width: 0;
758
- flex-basis: 0;
759
- padding: 0;
760
- overflow: hidden;
761
- }
762
- .cm-member-list::-webkit-scrollbar { width: 8px; }
763
- .cm-member-list::-webkit-scrollbar-thumb {
764
- background: color-mix(in oklab, var(--fg) 18%, transparent);
765
- border-radius: 4px;
1258
+ padding: 4px 8px 8px;
1259
+ display: grid;
1260
+ grid-template-columns: repeat(8, 1fr);
1261
+ gap: 2px;
766
1262
  }
767
-
768
- .cm-member-category {
769
- padding: 12px 16px 6px;
770
- font-family: var(--ff-body);
771
- font-size: var(--fs-micro);
772
- font-weight: 600;
1263
+ .cm-ep-category {
1264
+ grid-column: 1 / -1;
1265
+ font-size: var(--fs-xs);
773
1266
  color: var(--fg-3);
774
- letter-spacing: var(--tr-caps);
775
1267
  text-transform: uppercase;
1268
+ letter-spacing: var(--tr-wide);
1269
+ padding: 6px 2px 2px;
1270
+ }
1271
+ .cm-ep-btn {
1272
+ background: transparent;
1273
+ border: none;
1274
+ cursor: pointer;
1275
+ font-size: 20px;
1276
+ line-height: 1;
1277
+ padding: 4px;
1278
+ border-radius: var(--r-1);
1279
+ transition: background var(--dur-snap) var(--ease);
776
1280
  }
1281
+ .cm-ep-btn:hover { background: color-mix(in oklab, var(--fg) 12%, transparent); }
777
1282
 
778
- .cm-member-item {
1283
+ /* ---- Reply bar ---- */
1284
+ .cm-reply-bar {
779
1285
  display: flex;
780
1286
  align-items: center;
781
- gap: 10px;
1287
+ gap: 8px;
782
1288
  padding: 6px 12px;
783
- margin: 0 8px;
784
- border-radius: var(--r-1);
1289
+ background: var(--bg-2);
785
1290
  color: var(--fg-2);
1291
+ font-size: var(--fs-xs);
1292
+ border-top: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
1293
+ }
1294
+ .cm-rb-quote { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1295
+ .cm-rb-label { color: var(--fg-3); }
1296
+ .cm-rb-author { color: var(--accent); font-weight: 600; }
1297
+ .cm-rb-msg { color: var(--fg-3); }
1298
+ .cm-rb-cancel {
1299
+ background: transparent;
1300
+ color: var(--fg-3);
1301
+ border: none;
786
1302
  cursor: pointer;
1303
+ padding: 2px 6px;
1304
+ border-radius: var(--r-1);
787
1305
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
788
1306
  }
789
- .cm-member-item:hover {
790
- background: color-mix(in oklab, var(--fg) 6%, transparent);
791
- color: var(--fg);
792
- }
1307
+ .cm-rb-cancel:hover { background: color-mix(in oklab, var(--warn) 18%, transparent); color: var(--warn); }
793
1308
 
794
- .cm-member-avatar {
795
- position: relative;
796
- flex: 0 0 28px;
797
- width: 28px;
798
- height: 28px;
799
- border-radius: 50%;
800
- background: var(--bg-3);
801
- color: var(--fg-2);
802
- display: inline-flex;
803
- align-items: center;
804
- justify-content: center;
805
- font-size: var(--fs-micro);
806
- font-weight: 600;
807
- overflow: hidden;
1309
+ /* ---- UserPanel extra buttons (active-toggle state) ---- */
1310
+ .cm-user-controls .cm-user-btn.extra.active {
1311
+ background: color-mix(in oklab, var(--accent) 28%, transparent);
1312
+ color: var(--accent);
808
1313
  }
809
- .cm-member-avatar img {
1314
+
1315
+ /* ---- VoiceUser: video stream + quality dot ---- */
1316
+ .cm-voice-user-video {
810
1317
  width: 100%;
811
1318
  height: 100%;
812
1319
  object-fit: cover;
813
1320
  display: block;
1321
+ border-radius: 50%;
814
1322
  }
815
-
816
- .cm-member-status {
1323
+ .cm-voice-user-avatar { position: relative; }
1324
+ .cm-voice-user-quality {
817
1325
  position: absolute;
818
- right: -2px;
819
- bottom: -2px;
1326
+ top: 2px;
1327
+ right: 2px;
820
1328
  width: 10px;
821
1329
  height: 10px;
822
1330
  border-radius: 50%;
1331
+ border: 2px solid var(--bg-2);
823
1332
  background: var(--fg-3);
824
- box-shadow: 0 0 0 2px var(--bg-2);
825
- }
826
- .cm-member-status.online {
827
- background: var(--green-2);
828
- }
829
-
830
- .cm-member-name {
831
- flex: 1;
832
- min-width: 0;
833
- overflow: hidden;
834
- text-overflow: ellipsis;
835
- white-space: nowrap;
836
- font-size: var(--fs-sm);
837
- }
838
-
839
- /* ============================================================
840
- Voice user (standalone, e.g. in voice stage area)
841
- ============================================================ */
842
- .cm-voice-user {
843
- display: inline-flex;
844
- flex-direction: column;
845
- align-items: center;
846
- gap: 6px;
847
- padding: 10px;
848
- border-radius: var(--r-2);
849
- background: var(--bg-2);
850
- transition: box-shadow var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
851
- }
852
- .cm-voice-user.speaking {
853
- background: color-mix(in oklab, var(--green-2) 12%, var(--bg-2));
854
- box-shadow: 0 0 0 2px var(--green-2);
855
- }
856
-
857
- .cm-voice-user-avatar {
858
- width: 56px;
859
- height: 56px;
860
- border-radius: 50%;
861
- background: var(--bg-3);
862
- color: var(--fg-2);
863
- display: inline-flex;
864
- align-items: center;
865
- justify-content: center;
866
- font-size: var(--fs-lg);
867
- font-weight: 600;
868
- overflow: hidden;
869
- }
870
- .cm-voice-user-avatar img {
871
- width: 100%;
872
- height: 100%;
873
- object-fit: cover;
874
- display: block;
875
- }
876
- .cm-voice-user.speaking .cm-voice-user-avatar {
877
- box-shadow: 0 0 0 2px var(--green-2);
878
- }
879
-
880
- .cm-voice-user-name {
881
- font-size: var(--fs-xs);
882
- color: var(--fg);
883
- font-weight: 500;
884
- max-width: 100px;
885
- overflow: hidden;
886
- text-overflow: ellipsis;
887
- white-space: nowrap;
888
- text-align: center;
889
- }
890
-
891
- /* ============================================================
892
- Responsive — collapse sidebars on narrow viewports
893
- ============================================================ */
894
- @media (max-width: 768px) {
895
- .cm-channel-sidebar {
896
- position: absolute;
897
- z-index: 20;
898
- top: 0;
899
- left: 72px;
900
- bottom: 0;
901
- transform: translateX(-110%);
902
- transition: transform var(--dur-base) var(--ease);
903
- box-shadow: 2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
904
- }
905
- .cm-channel-sidebar.open { transform: translateX(0); }
906
- .cm-member-list { display: none; }
907
- .cm-member-list.open {
908
- display: flex;
909
- position: absolute;
910
- z-index: 20;
911
- top: 0;
912
- right: 0;
913
- bottom: 0;
914
- width: 240px;
915
- flex-basis: 240px;
916
- box-shadow: -2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
917
- }
918
- .cm-chat-header-topic { display: none; }
919
- }
920
-
921
- @media (max-width: 480px) {
922
- .cm-server-rail {
923
- flex: 0 0 56px;
924
- width: 56px;
925
- }
926
- .cm-server-icon,
927
- .cm-server-add,
928
- .cm-server-back {
929
- width: 40px;
930
- height: 40px;
931
- }
932
- .cm-channel-sidebar { left: 56px; }
933
1333
  }
1334
+ .cm-voice-user-quality.q-excellent { background: var(--green-2); }
1335
+ .cm-voice-user-quality.q-good { background: color-mix(in oklab, var(--green-2) 70%, var(--sun)); }
1336
+ .cm-voice-user-quality.q-poor { background: var(--sun); }
1337
+ .cm-voice-user-quality.q-lost { background: var(--warn); }
1338
+ .cm-voice-user-quality.q-unknown { background: var(--fg-3); }