anentrypoint-design 0.0.117 → 0.0.120

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 ADDED
@@ -0,0 +1,933 @@
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
+ }