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/dist/247420.css CHANGED
@@ -826,936 +826,1341 @@
826
826
  }
827
827
 
828
828
  /* community.css */
829
- /* ============================================================
830
- 247420 design system — community surface (Discord-style chat)
831
- Tonal surfaces over borders. Indicator rails over hairlines.
832
- All tokens sourced from colors_and_type.css.
833
- ============================================================ */
834
-
835
- /* ============================================================
836
- Shell — top-level flex container for the community layout
837
- ============================================================ */
838
- .ds-247420 .cm-shell {
839
- display: flex;
840
- height: 100vh;
841
- width: 100%;
842
- overflow: hidden;
843
- background: var(--bg);
844
- color: var(--fg);
845
- font-family: var(--ff-body);
846
- font-size: var(--fs-sm);
847
- }
848
-
849
- .ds-247420 .cm-main {
850
- display: flex;
851
- flex-direction: column;
852
- flex: 1;
853
- min-width: 0;
854
- min-height: 0;
855
- background: var(--bg);
856
- position: relative;
857
- }
858
-
859
- /* ============================================================
860
- Server rail — thin vertical column, leftmost
861
- ============================================================ */
862
- .ds-247420 .cm-server-rail {
863
- flex: 0 0 72px;
864
- width: 72px;
865
- display: flex;
866
- flex-direction: column;
867
- align-items: center;
868
- gap: 8px;
869
- padding: 12px 0;
870
- background: color-mix(in oklab, var(--bg) 70%, var(--ink));
871
- overflow-y: auto;
872
- overflow-x: hidden;
873
- scrollbar-width: none;
874
- }
875
- .ds-247420 .cm-server-rail::-webkit-scrollbar { display: none; }
876
-
877
- .ds-247420 .cm-server-icon {
878
- position: relative;
879
- width: 48px;
880
- height: 48px;
881
- border-radius: var(--r-3);
882
- background: var(--bg-2);
883
- color: var(--fg);
884
- display: flex;
885
- align-items: center;
886
- justify-content: center;
887
- font-family: var(--ff-body);
888
- font-size: var(--fs-lg);
889
- font-weight: 600;
890
- letter-spacing: var(--tr-tight);
891
- cursor: pointer;
892
- overflow: hidden;
893
- transition:
894
- border-radius var(--dur-base) var(--ease),
895
- background var(--dur-snap) var(--ease),
896
- color var(--dur-snap) var(--ease),
897
- transform var(--dur-snap) var(--ease);
898
- user-select: none;
899
- }
900
- .ds-247420 .cm-server-icon img,
901
- .ds-247420 .cm-server-icon svg {
902
- width: 100%;
903
- height: 100%;
904
- object-fit: cover;
905
- display: block;
906
- }
907
- .ds-247420 .cm-server-icon:hover {
908
- border-radius: var(--r-2);
909
- background: var(--accent);
910
- color: var(--accent-fg);
911
- }
912
- .ds-247420 .cm-server-icon.active {
913
- border-radius: var(--r-2);
914
- background: var(--accent);
915
- color: var(--accent-fg);
916
- }
917
-
918
- .ds-247420 .cm-server-pill {
919
- position: absolute;
920
- left: -10px;
921
- top: 50%;
922
- transform: translateY(-50%);
923
- width: 4px;
924
- height: 8px;
925
- background: var(--fg);
926
- border-radius: 0 4px 4px 0;
927
- transition: height var(--dur-base) var(--ease);
928
- }
929
- .ds-247420 .cm-server-icon:hover .cm-server-pill { height: 20px; }
930
- .ds-247420 .cm-server-icon.active .cm-server-pill { height: 36px; background: var(--fg); }
931
-
932
- .ds-247420 .cm-server-badge {
933
- position: absolute;
934
- top: -2px;
935
- right: -2px;
936
- min-width: 18px;
937
- height: 18px;
938
- padding: 0 5px;
939
- background: var(--warn);
940
- color: var(--paper);
941
- font-family: var(--ff-mono);
942
- font-size: var(--fs-micro);
943
- font-weight: 700;
944
- border-radius: var(--r-pill);
945
- display: flex;
946
- align-items: center;
947
- justify-content: center;
948
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--bg) 70%, var(--ink));
949
- }
950
-
951
- .ds-247420 .cm-server-back,
952
- .ds-247420 .cm-server-add {
953
- width: 48px;
954
- height: 48px;
955
- border-radius: var(--r-3);
956
- background: var(--bg-2);
957
- color: var(--green-2);
958
- display: flex;
959
- align-items: center;
960
- justify-content: center;
961
- font-size: var(--fs-xl);
962
- font-weight: 400;
963
- cursor: pointer;
964
- border: 0;
965
- transition:
966
- border-radius var(--dur-base) var(--ease),
967
- background var(--dur-snap) var(--ease),
968
- color var(--dur-snap) var(--ease);
969
- }
970
- .ds-247420 .cm-server-back { color: var(--fg-2); }
971
- .ds-247420 .cm-server-back:hover,
972
- .ds-247420 .cm-server-add:hover {
973
- border-radius: var(--r-2);
974
- background: var(--green-2);
975
- color: var(--paper);
976
- }
829
+ /* ============================================================
830
+ 247420 design system — community surface (Discord-style chat)
831
+ Tonal surfaces over borders. Indicator rails over hairlines.
832
+ All tokens sourced from colors_and_type.css.
833
+ ============================================================ */
834
+
835
+ /* ============================================================
836
+ Shell — top-level flex container for the community layout
837
+ ============================================================ */
838
+ .ds-247420 .cm-shell {
839
+ display: flex;
840
+ height: 100vh;
841
+ width: 100%;
842
+ overflow: hidden;
843
+ background: var(--bg);
844
+ color: var(--fg);
845
+ font-family: var(--ff-body);
846
+ font-size: var(--fs-sm);
847
+ }
848
+
849
+ .ds-247420 .cm-main {
850
+ display: flex;
851
+ flex-direction: column;
852
+ flex: 1;
853
+ min-width: 0;
854
+ min-height: 0;
855
+ background: var(--bg);
856
+ position: relative;
857
+ }
858
+
859
+ /* ============================================================
860
+ Server rail — thin vertical column, leftmost
861
+ ============================================================ */
862
+ .ds-247420 .cm-server-rail {
863
+ flex: 0 0 72px;
864
+ width: 72px;
865
+ display: flex;
866
+ flex-direction: column;
867
+ align-items: center;
868
+ gap: 8px;
869
+ padding: 12px 0;
870
+ background: color-mix(in oklab, var(--bg) 70%, var(--ink));
871
+ overflow-y: auto;
872
+ overflow-x: hidden;
873
+ scrollbar-width: none;
874
+ }
875
+ .ds-247420 .cm-server-rail::-webkit-scrollbar { display: none; }
876
+
877
+ .ds-247420 .cm-server-icon {
878
+ position: relative;
879
+ width: 48px;
880
+ height: 48px;
881
+ border-radius: var(--r-3);
882
+ background: var(--bg-2);
883
+ color: var(--fg);
884
+ display: flex;
885
+ align-items: center;
886
+ justify-content: center;
887
+ font-family: var(--ff-body);
888
+ font-size: var(--fs-lg);
889
+ font-weight: 600;
890
+ letter-spacing: var(--tr-tight);
891
+ cursor: pointer;
892
+ overflow: hidden;
893
+ transition:
894
+ border-radius var(--dur-base) var(--ease),
895
+ background var(--dur-snap) var(--ease),
896
+ color var(--dur-snap) var(--ease),
897
+ transform var(--dur-snap) var(--ease);
898
+ user-select: none;
899
+ }
900
+ .ds-247420 .cm-server-icon img,
901
+ .ds-247420 .cm-server-icon svg {
902
+ width: 100%;
903
+ height: 100%;
904
+ object-fit: cover;
905
+ display: block;
906
+ }
907
+ .ds-247420 .cm-server-icon:hover {
908
+ border-radius: var(--r-2);
909
+ background: var(--accent);
910
+ color: var(--accent-fg);
911
+ }
912
+ .ds-247420 .cm-server-icon.active {
913
+ border-radius: var(--r-2);
914
+ background: var(--accent);
915
+ color: var(--accent-fg);
916
+ }
917
+
918
+ .ds-247420 .cm-server-pill {
919
+ position: absolute;
920
+ left: -10px;
921
+ top: 50%;
922
+ transform: translateY(-50%);
923
+ width: 4px;
924
+ height: 8px;
925
+ background: var(--fg);
926
+ border-radius: 0 4px 4px 0;
927
+ transition: height var(--dur-base) var(--ease);
928
+ }
929
+ .ds-247420 .cm-server-icon:hover .cm-server-pill { height: 20px; }
930
+ .ds-247420 .cm-server-icon.active .cm-server-pill { height: 36px; background: var(--fg); }
931
+
932
+ .ds-247420 .cm-server-badge {
933
+ position: absolute;
934
+ top: -2px;
935
+ right: -2px;
936
+ min-width: 18px;
937
+ height: 18px;
938
+ padding: 0 5px;
939
+ background: var(--warn);
940
+ color: var(--paper);
941
+ font-family: var(--ff-mono);
942
+ font-size: var(--fs-micro);
943
+ font-weight: 700;
944
+ border-radius: var(--r-pill);
945
+ display: flex;
946
+ align-items: center;
947
+ justify-content: center;
948
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--bg) 70%, var(--ink));
949
+ }
950
+
951
+ .ds-247420 .cm-server-back,
952
+ .ds-247420 .cm-server-add {
953
+ width: 48px;
954
+ height: 48px;
955
+ border-radius: var(--r-3);
956
+ background: var(--bg-2);
957
+ color: var(--green-2);
958
+ display: flex;
959
+ align-items: center;
960
+ justify-content: center;
961
+ font-size: var(--fs-xl);
962
+ font-weight: 400;
963
+ cursor: pointer;
964
+ border: 0;
965
+ transition:
966
+ border-radius var(--dur-base) var(--ease),
967
+ background var(--dur-snap) var(--ease),
968
+ color var(--dur-snap) var(--ease);
969
+ }
970
+ .ds-247420 .cm-server-back { color: var(--fg-2); }
971
+ .ds-247420 .cm-server-back:hover,
972
+ .ds-247420 .cm-server-add:hover {
973
+ border-radius: var(--r-2);
974
+ background: var(--green-2);
975
+ color: var(--paper);
976
+ }
977
+
978
+ .ds-247420 .cm-server-sep {
979
+ width: 32px;
980
+ height: 2px;
981
+ background: color-mix(in oklab, var(--fg) 12%, transparent);
982
+ border-radius: 2px;
983
+ margin: 4px 0;
984
+ flex-shrink: 0;
985
+ }
986
+
987
+ /* ============================================================
988
+ Channel sidebar — server name header + channel list
989
+ ============================================================ */
990
+ .ds-247420 .cm-channel-sidebar {
991
+ flex: 0 0 240px;
992
+ width: 240px;
993
+ display: flex;
994
+ flex-direction: column;
995
+ min-height: 0;
996
+ background: var(--bg-2);
997
+ position: relative;
998
+ }
999
+
1000
+ .ds-247420 .cm-server-header {
1001
+ display: flex;
1002
+ align-items: center;
1003
+ justify-content: space-between;
1004
+ gap: 8px;
1005
+ padding: 14px 16px;
1006
+ background: var(--bg-2);
1007
+ box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
1008
+ font-weight: 600;
1009
+ font-size: var(--fs-sm);
1010
+ letter-spacing: -0.01em;
1011
+ cursor: pointer;
1012
+ transition: background var(--dur-snap) var(--ease);
1013
+ user-select: none;
1014
+ flex-shrink: 0;
1015
+ }
1016
+ .ds-247420 .cm-server-header:hover {
1017
+ background: color-mix(in oklab, var(--fg) 6%, var(--bg-2));
1018
+ }
1019
+ .ds-247420 .cm-server-header-name {
1020
+ flex: 1;
1021
+ min-width: 0;
1022
+ overflow: hidden;
1023
+ text-overflow: ellipsis;
1024
+ white-space: nowrap;
1025
+ }
1026
+
1027
+ .ds-247420 .cm-channel-list {
1028
+ flex: 1;
1029
+ min-height: 0;
1030
+ overflow-y: auto;
1031
+ overflow-x: hidden;
1032
+ padding: 8px 0 16px;
1033
+ display: flex;
1034
+ flex-direction: column;
1035
+ gap: 2px;
1036
+ scrollbar-width: thin;
1037
+ scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
1038
+ }
1039
+ .ds-247420 .cm-channel-list::-webkit-scrollbar { width: 8px; }
1040
+ .ds-247420 .cm-channel-list::-webkit-scrollbar-track { background: transparent; }
1041
+ .ds-247420 .cm-channel-list::-webkit-scrollbar-thumb {
1042
+ background: color-mix(in oklab, var(--fg) 18%, transparent);
1043
+ border-radius: 4px;
1044
+ }
1045
+
1046
+ /* ============================================================
1047
+ Channel category — collapsible group header
1048
+ ============================================================ */
1049
+ .ds-247420 .cm-channel-category {
1050
+ display: flex;
1051
+ flex-direction: column;
1052
+ margin-top: 12px;
1053
+ }
1054
+ .ds-247420 .cm-channel-category:first-child { margin-top: 4px; }
1055
+
1056
+ .ds-247420 .cm-category-header {
1057
+ display: flex;
1058
+ align-items: center;
1059
+ gap: 4px;
1060
+ padding: 4px 8px 4px 8px;
1061
+ font-family: var(--ff-body);
1062
+ font-size: var(--fs-micro);
1063
+ font-weight: 600;
1064
+ color: var(--fg-3);
1065
+ letter-spacing: var(--tr-caps);
1066
+ text-transform: uppercase;
1067
+ cursor: pointer;
1068
+ user-select: none;
1069
+ transition: color var(--dur-snap) var(--ease);
1070
+ }
1071
+ .ds-247420 .cm-category-header:hover { color: var(--fg); }
1072
+ .ds-247420 .cm-category-header:hover .cm-cat-add { opacity: 1; }
1073
+
1074
+ .ds-247420 .cm-cat-arrow {
1075
+ display: inline-flex;
1076
+ align-items: center;
1077
+ justify-content: center;
1078
+ width: 12px;
1079
+ height: 12px;
1080
+ font-size: 10px;
1081
+ transform: rotate(90deg);
1082
+ transition: transform var(--dur-base) var(--ease);
1083
+ flex-shrink: 0;
1084
+ }
1085
+ .ds-247420 .cm-category-header.collapsed .cm-cat-arrow { transform: rotate(0deg); }
1086
+
1087
+ .ds-247420 .cm-cat-name {
1088
+ flex: 1;
1089
+ min-width: 0;
1090
+ overflow: hidden;
1091
+ text-overflow: ellipsis;
1092
+ white-space: nowrap;
1093
+ }
1094
+ .ds-247420 .cm-cat-extra {
1095
+ font-family: var(--ff-mono);
1096
+ font-size: var(--fs-micro);
1097
+ color: var(--fg-3);
1098
+ font-weight: 500;
1099
+ letter-spacing: 0;
1100
+ text-transform: none;
1101
+ }
1102
+ .ds-247420 .cm-cat-add {
1103
+ display: inline-flex;
1104
+ align-items: center;
1105
+ justify-content: center;
1106
+ width: 18px;
1107
+ height: 18px;
1108
+ border: 0;
1109
+ background: transparent;
1110
+ color: var(--fg-3);
1111
+ font-size: var(--fs-sm);
1112
+ cursor: pointer;
1113
+ opacity: 0;
1114
+ border-radius: var(--r-1);
1115
+ transition: opacity var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1116
+ }
1117
+ .ds-247420 .cm-cat-add:hover {
1118
+ color: var(--fg);
1119
+ background: color-mix(in oklab, var(--fg) 8%, transparent);
1120
+ }
1121
+
1122
+ .ds-247420 .cm-cat-channels {
1123
+ display: flex;
1124
+ flex-direction: column;
1125
+ gap: 1px;
1126
+ padding: 2px 0;
1127
+ }
1128
+
1129
+ /* ============================================================
1130
+ Channel item — pillish row with active rail and hover state
1131
+ ============================================================ */
1132
+ .ds-247420 .cm-channel-item-wrap {
1133
+ position: relative;
1134
+ padding: 0 8px;
1135
+ }
1136
+
1137
+ .ds-247420 .cm-channel-item {
1138
+ position: relative;
1139
+ display: flex;
1140
+ align-items: center;
1141
+ gap: 8px;
1142
+ padding: 6px 8px;
1143
+ border-radius: var(--r-1);
1144
+ color: var(--fg-3);
1145
+ cursor: pointer;
1146
+ user-select: none;
1147
+ transition:
1148
+ background var(--dur-snap) var(--ease),
1149
+ color var(--dur-snap) var(--ease);
1150
+ }
1151
+ .ds-247420 .cm-channel-item:hover {
1152
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
1153
+ color: var(--fg);
1154
+ }
1155
+ .ds-247420 .cm-channel-item:hover .cm-ch-actions { opacity: 1; }
1156
+
1157
+ .ds-247420 .cm-channel-item.active {
1158
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
1159
+ color: var(--fg);
1160
+ font-weight: 500;
1161
+ }
1162
+ .ds-247420 .cm-channel-item.active::before {
1163
+ content: '';
1164
+ position: absolute;
1165
+ left: -8px;
1166
+ top: 4px;
1167
+ bottom: 4px;
1168
+ width: 3px;
1169
+ background: var(--accent);
1170
+ border-radius: 0 3px 3px 0;
1171
+ }
1172
+
1173
+ .ds-247420 .cm-channel-item.voice-active {
1174
+ color: var(--green-2);
1175
+ }
1176
+ .ds-247420 .cm-channel-item.voice-active .cm-ch-icon { color: var(--green-2); }
1177
+ .ds-247420 .cm-channel-item.voice-active:hover {
1178
+ background: color-mix(in oklab, var(--green) 12%, transparent);
1179
+ }
1180
+
1181
+ .ds-247420 .cm-channel-item.voice-connecting {
1182
+ color: var(--sun);
1183
+ }
1184
+
1185
+ .ds-247420 .cm-ch-icon {
1186
+ flex: 0 0 18px;
1187
+ width: 18px;
1188
+ height: 18px;
1189
+ display: inline-flex;
1190
+ align-items: center;
1191
+ justify-content: center;
1192
+ font-family: var(--ff-mono);
1193
+ font-size: var(--fs-sm);
1194
+ color: var(--fg-3);
1195
+ opacity: 0.85;
1196
+ }
1197
+ .ds-247420 .cm-channel-item.active .cm-ch-icon { color: var(--fg-2); opacity: 1; }
1198
+
1199
+ .ds-247420 .cm-ch-spinner {
1200
+ width: 12px;
1201
+ height: 12px;
1202
+ border-radius: 50%;
1203
+ border: 2px solid color-mix(in oklab, var(--sun) 30%, transparent);
1204
+ border-top-color: var(--sun);
1205
+ animation: cm-spin 700ms linear infinite;
1206
+ flex-shrink: 0;
1207
+ }
1208
+ @keyframes cm-spin {
1209
+ to { transform: rotate(360deg); }
1210
+ }
1211
+
1212
+ .ds-247420 .cm-ch-name {
1213
+ flex: 1;
1214
+ min-width: 0;
1215
+ overflow: hidden;
1216
+ text-overflow: ellipsis;
1217
+ white-space: nowrap;
1218
+ font-size: var(--fs-sm);
1219
+ }
1220
+
1221
+ .ds-247420 .cm-ch-badge {
1222
+ flex-shrink: 0;
1223
+ min-width: 16px;
1224
+ height: 16px;
1225
+ padding: 0 5px;
1226
+ background: var(--warn);
1227
+ color: var(--paper);
1228
+ font-family: var(--ff-mono);
1229
+ font-size: var(--fs-micro);
1230
+ font-weight: 700;
1231
+ border-radius: var(--r-pill);
1232
+ display: inline-flex;
1233
+ align-items: center;
1234
+ justify-content: center;
1235
+ line-height: 1;
1236
+ }
1237
+
1238
+ .ds-247420 .cm-ch-actions {
1239
+ display: inline-flex;
1240
+ align-items: center;
1241
+ gap: 2px;
1242
+ opacity: 0;
1243
+ transition: opacity var(--dur-snap) var(--ease);
1244
+ flex-shrink: 0;
1245
+ }
1246
+ .ds-247420 .cm-channel-item.active .cm-ch-actions { opacity: 0.6; }
1247
+
1248
+ .ds-247420 .cm-ch-action-btn {
1249
+ width: 18px;
1250
+ height: 18px;
1251
+ display: inline-flex;
1252
+ align-items: center;
1253
+ justify-content: center;
1254
+ background: transparent;
1255
+ border: 0;
1256
+ color: var(--fg-3);
1257
+ cursor: pointer;
1258
+ border-radius: var(--r-1);
1259
+ font-size: var(--fs-tiny);
1260
+ transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1261
+ }
1262
+ .ds-247420 .cm-ch-action-btn:hover {
1263
+ color: var(--fg);
1264
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
1265
+ }
1266
+
1267
+ /* Voice users nested under a voice channel */
1268
+ .ds-247420 .cm-ch-voice-users {
1269
+ display: flex;
1270
+ flex-direction: column;
1271
+ gap: 1px;
1272
+ padding: 2px 8px 4px 32px;
1273
+ }
1274
+
1275
+ .ds-247420 .cm-ch-voice-user {
1276
+ display: flex;
1277
+ align-items: center;
1278
+ gap: 8px;
1279
+ padding: 3px 6px;
1280
+ border-radius: var(--r-1);
1281
+ color: var(--fg-2);
1282
+ font-size: var(--fs-xs);
1283
+ cursor: pointer;
1284
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1285
+ }
1286
+ .ds-247420 .cm-ch-voice-user:hover {
1287
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
1288
+ color: var(--fg);
1289
+ }
1290
+ .ds-247420 .cm-ch-voice-user.speaking {
1291
+ color: var(--green-2);
1292
+ }
1293
+ .ds-247420 .cm-ch-voice-user.speaking .cm-ch-voice-user-avatar {
1294
+ box-shadow: 0 0 0 2px var(--green-2);
1295
+ }
1296
+
1297
+ .ds-247420 .cm-ch-voice-user-avatar {
1298
+ flex: 0 0 20px;
1299
+ width: 20px;
1300
+ height: 20px;
1301
+ border-radius: 50%;
1302
+ background: var(--bg-3);
1303
+ color: var(--fg-2);
1304
+ display: inline-flex;
1305
+ align-items: center;
1306
+ justify-content: center;
1307
+ font-size: 10px;
1308
+ font-weight: 600;
1309
+ overflow: hidden;
1310
+ transition: box-shadow var(--dur-snap) var(--ease);
1311
+ }
1312
+ .ds-247420 .cm-ch-voice-user-avatar img {
1313
+ width: 100%;
1314
+ height: 100%;
1315
+ object-fit: cover;
1316
+ display: block;
1317
+ }
1318
+
1319
+ .ds-247420 .cm-ch-voice-user-name {
1320
+ flex: 1;
1321
+ min-width: 0;
1322
+ overflow: hidden;
1323
+ text-overflow: ellipsis;
1324
+ white-space: nowrap;
1325
+ }
1326
+
1327
+ /* ============================================================
1328
+ Voice strip — slots above user panel when in voice
1329
+ ============================================================ */
1330
+ .ds-247420 .cm-voice-strip {
1331
+ display: none;
1332
+ flex-direction: column;
1333
+ gap: 8px;
1334
+ padding: 10px 12px;
1335
+ background: color-mix(in oklab, var(--green) 18%, var(--bg-2));
1336
+ color: var(--fg);
1337
+ box-shadow: 0 -1px 0 color-mix(in oklab, var(--fg) 10%, transparent);
1338
+ flex-shrink: 0;
1339
+ }
1340
+ .ds-247420 .cm-voice-strip.open { display: flex; }
1341
+
1342
+ .ds-247420 .cm-vs-label {
1343
+ font-family: var(--ff-mono);
1344
+ font-size: var(--fs-micro);
1345
+ text-transform: uppercase;
1346
+ letter-spacing: var(--tr-caps);
1347
+ color: var(--green-2);
1348
+ font-weight: 700;
1349
+ display: inline-flex;
1350
+ align-items: center;
1351
+ gap: 6px;
1352
+ }
1353
+ .ds-247420 .cm-vs-label::before {
1354
+ content: '';
1355
+ width: 8px;
1356
+ height: 8px;
1357
+ border-radius: 50%;
1358
+ background: var(--green-2);
1359
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent);
1360
+ animation: cm-pulse 1.6s ease-in-out infinite;
1361
+ }
1362
+ @keyframes cm-pulse {
1363
+ 0%, 100% { box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent); }
1364
+ 50% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--green-2) 0%, transparent); }
1365
+ }
1366
+
1367
+ .ds-247420 .cm-vs-channel {
1368
+ font-size: var(--fs-sm);
1369
+ font-weight: 600;
1370
+ color: var(--fg);
1371
+ overflow: hidden;
1372
+ text-overflow: ellipsis;
1373
+ white-space: nowrap;
1374
+ }
1375
+ .ds-247420 .cm-vs-status {
1376
+ font-size: var(--fs-xs);
1377
+ color: var(--fg-2);
1378
+ display: flex;
1379
+ align-items: center;
1380
+ gap: 6px;
1381
+ flex-wrap: wrap;
1382
+ }
1383
+
1384
+ .ds-247420 .cm-vs-btn {
1385
+ display: inline-flex;
1386
+ align-items: center;
1387
+ justify-content: center;
1388
+ gap: 6px;
1389
+ height: 28px;
1390
+ padding: 0 10px;
1391
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
1392
+ color: var(--fg);
1393
+ border: 0;
1394
+ border-radius: var(--r-1);
1395
+ font-family: var(--ff-body);
1396
+ font-size: var(--fs-xs);
1397
+ font-weight: 600;
1398
+ cursor: pointer;
1399
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1400
+ }
1401
+ .ds-247420 .cm-vs-btn:hover {
1402
+ background: color-mix(in oklab, var(--fg) 18%, transparent);
1403
+ }
1404
+ .ds-247420 .cm-vs-btn.danger {
1405
+ background: var(--warn);
1406
+ color: var(--paper);
1407
+ }
1408
+ .ds-247420 .cm-vs-btn.danger:hover {
1409
+ background: color-mix(in oklab, var(--warn) 80%, var(--ink));
1410
+ }
1411
+
1412
+ /* ============================================================
1413
+ User panel — bottom of channel sidebar
1414
+ ============================================================ */
1415
+ .ds-247420 .cm-user-panel {
1416
+ display: flex;
1417
+ align-items: center;
1418
+ gap: 8px;
1419
+ padding: 8px 8px;
1420
+ background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
1421
+ flex-shrink: 0;
1422
+ }
1423
+
1424
+ .ds-247420 .cm-user-avatar {
1425
+ position: relative;
1426
+ flex: 0 0 32px;
1427
+ width: 32px;
1428
+ height: 32px;
1429
+ border-radius: 50%;
1430
+ background: var(--bg-3);
1431
+ color: var(--fg-2);
1432
+ display: inline-flex;
1433
+ align-items: center;
1434
+ justify-content: center;
1435
+ font-size: var(--fs-xs);
1436
+ font-weight: 600;
1437
+ overflow: hidden;
1438
+ }
1439
+ .ds-247420 .cm-user-avatar img {
1440
+ width: 100%;
1441
+ height: 100%;
1442
+ object-fit: cover;
1443
+ display: block;
1444
+ }
1445
+
1446
+ .ds-247420 .cm-user-status-dot {
1447
+ position: absolute;
1448
+ right: -2px;
1449
+ bottom: -2px;
1450
+ width: 12px;
1451
+ height: 12px;
1452
+ border-radius: 50%;
1453
+ background: var(--green-2);
1454
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--fg) 5%, var(--bg-2));
1455
+ }
1456
+
1457
+ .ds-247420 .cm-user-info {
1458
+ flex: 1;
1459
+ min-width: 0;
1460
+ display: flex;
1461
+ flex-direction: column;
1462
+ line-height: 1.2;
1463
+ }
1464
+ .ds-247420 .cm-user-name {
1465
+ font-size: var(--fs-xs);
1466
+ font-weight: 600;
1467
+ color: var(--fg);
1468
+ overflow: hidden;
1469
+ text-overflow: ellipsis;
1470
+ white-space: nowrap;
1471
+ }
1472
+ .ds-247420 .cm-user-tag {
1473
+ font-family: var(--ff-mono);
1474
+ font-size: var(--fs-micro);
1475
+ color: var(--fg-3);
1476
+ overflow: hidden;
1477
+ text-overflow: ellipsis;
1478
+ white-space: nowrap;
1479
+ }
1480
+
1481
+ .ds-247420 .cm-user-controls {
1482
+ display: inline-flex;
1483
+ align-items: center;
1484
+ gap: 2px;
1485
+ }
1486
+
1487
+ .ds-247420 .cm-user-btn {
1488
+ width: 28px;
1489
+ height: 28px;
1490
+ display: inline-flex;
1491
+ align-items: center;
1492
+ justify-content: center;
1493
+ background: transparent;
1494
+ border: 0;
1495
+ color: var(--fg-2);
1496
+ cursor: pointer;
1497
+ border-radius: var(--r-1);
1498
+ font-size: var(--fs-sm);
1499
+ transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1500
+ }
1501
+ .ds-247420 .cm-user-btn:hover {
1502
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
1503
+ color: var(--fg);
1504
+ }
1505
+ .ds-247420 .cm-user-btn.muted {
1506
+ color: var(--warn);
1507
+ }
1508
+ .ds-247420 .cm-user-btn.deafened {
1509
+ color: var(--warn);
1510
+ background: color-mix(in oklab, var(--warn) 18%, transparent);
1511
+ }
1512
+
1513
+ /* ============================================================
1514
+ Chat header — top of main column
1515
+ ============================================================ */
1516
+ .ds-247420 .cm-chat-header {
1517
+ display: flex;
1518
+ align-items: center;
1519
+ gap: 10px;
1520
+ padding: 12px 16px;
1521
+ background: var(--bg);
1522
+ box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
1523
+ flex-shrink: 0;
1524
+ min-height: 48px;
1525
+ }
1526
+
1527
+ .ds-247420 .cm-chat-header-icon {
1528
+ flex: 0 0 20px;
1529
+ width: 20px;
1530
+ height: 20px;
1531
+ display: inline-flex;
1532
+ align-items: center;
1533
+ justify-content: center;
1534
+ font-family: var(--ff-mono);
1535
+ font-size: var(--fs-lg);
1536
+ color: var(--fg-3);
1537
+ }
1538
+
1539
+ .ds-247420 .cm-chat-header-name {
1540
+ font-weight: 600;
1541
+ font-size: var(--fs-sm);
1542
+ color: var(--fg);
1543
+ letter-spacing: -0.01em;
1544
+ flex-shrink: 0;
1545
+ }
1546
+
1547
+ .ds-247420 .cm-chat-header-topic {
1548
+ flex: 1;
1549
+ min-width: 0;
1550
+ padding-left: 12px;
1551
+ margin-left: 4px;
1552
+ border-left: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
1553
+ color: var(--fg-3);
1554
+ font-size: var(--fs-xs);
1555
+ overflow: hidden;
1556
+ text-overflow: ellipsis;
1557
+ white-space: nowrap;
1558
+ }
1559
+
1560
+ .ds-247420 .cm-chat-header-toolbar {
1561
+ display: inline-flex;
1562
+ align-items: center;
1563
+ gap: 4px;
1564
+ flex-shrink: 0;
1565
+ }
1566
+
1567
+ /* ============================================================
1568
+ Member list — right column
1569
+ ============================================================ */
1570
+ .ds-247420 .cm-member-list {
1571
+ flex: 0 0 240px;
1572
+ width: 240px;
1573
+ display: flex;
1574
+ flex-direction: column;
1575
+ min-height: 0;
1576
+ overflow-y: auto;
1577
+ overflow-x: hidden;
1578
+ background: var(--bg-2);
1579
+ padding: 16px 0;
1580
+ scrollbar-width: thin;
1581
+ scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
1582
+ transition: width var(--dur-base) var(--ease), flex-basis var(--dur-base) var(--ease);
1583
+ }
1584
+ .ds-247420 .cm-member-list:not(.open) {
1585
+ width: 0;
1586
+ flex-basis: 0;
1587
+ padding: 0;
1588
+ overflow: hidden;
1589
+ }
1590
+ .ds-247420 .cm-member-list::-webkit-scrollbar { width: 8px; }
1591
+ .ds-247420 .cm-member-list::-webkit-scrollbar-thumb {
1592
+ background: color-mix(in oklab, var(--fg) 18%, transparent);
1593
+ border-radius: 4px;
1594
+ }
1595
+
1596
+ .ds-247420 .cm-member-category {
1597
+ padding: 12px 16px 6px;
1598
+ font-family: var(--ff-body);
1599
+ font-size: var(--fs-micro);
1600
+ font-weight: 600;
1601
+ color: var(--fg-3);
1602
+ letter-spacing: var(--tr-caps);
1603
+ text-transform: uppercase;
1604
+ }
1605
+
1606
+ .ds-247420 .cm-member-item {
1607
+ display: flex;
1608
+ align-items: center;
1609
+ gap: 10px;
1610
+ padding: 6px 12px;
1611
+ margin: 0 8px;
1612
+ border-radius: var(--r-1);
1613
+ color: var(--fg-2);
1614
+ cursor: pointer;
1615
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1616
+ }
1617
+ .ds-247420 .cm-member-item:hover {
1618
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
1619
+ color: var(--fg);
1620
+ }
1621
+
1622
+ .ds-247420 .cm-member-avatar {
1623
+ position: relative;
1624
+ flex: 0 0 28px;
1625
+ width: 28px;
1626
+ height: 28px;
1627
+ border-radius: 50%;
1628
+ background: var(--bg-3);
1629
+ color: var(--fg-2);
1630
+ display: inline-flex;
1631
+ align-items: center;
1632
+ justify-content: center;
1633
+ font-size: var(--fs-micro);
1634
+ font-weight: 600;
1635
+ overflow: hidden;
1636
+ }
1637
+ .ds-247420 .cm-member-avatar img {
1638
+ width: 100%;
1639
+ height: 100%;
1640
+ object-fit: cover;
1641
+ display: block;
1642
+ }
1643
+
1644
+ .ds-247420 .cm-member-status {
1645
+ position: absolute;
1646
+ right: -2px;
1647
+ bottom: -2px;
1648
+ width: 10px;
1649
+ height: 10px;
1650
+ border-radius: 50%;
1651
+ background: var(--fg-3);
1652
+ box-shadow: 0 0 0 2px var(--bg-2);
1653
+ }
1654
+ .ds-247420 .cm-member-status.online {
1655
+ background: var(--green-2);
1656
+ }
1657
+
1658
+ .ds-247420 .cm-member-name {
1659
+ flex: 1;
1660
+ min-width: 0;
1661
+ overflow: hidden;
1662
+ text-overflow: ellipsis;
1663
+ white-space: nowrap;
1664
+ font-size: var(--fs-sm);
1665
+ }
1666
+
1667
+ /* ============================================================
1668
+ Voice user (standalone, e.g. in voice stage area)
1669
+ ============================================================ */
1670
+ .ds-247420 .cm-voice-user {
1671
+ display: inline-flex;
1672
+ flex-direction: column;
1673
+ align-items: center;
1674
+ gap: 6px;
1675
+ padding: 10px;
1676
+ border-radius: var(--r-2);
1677
+ background: var(--bg-2);
1678
+ transition: box-shadow var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1679
+ }
1680
+ .ds-247420 .cm-voice-user.speaking {
1681
+ background: color-mix(in oklab, var(--green-2) 12%, var(--bg-2));
1682
+ box-shadow: 0 0 0 2px var(--green-2);
1683
+ }
1684
+
1685
+ .ds-247420 .cm-voice-user-avatar {
1686
+ width: 56px;
1687
+ height: 56px;
1688
+ border-radius: 50%;
1689
+ background: var(--bg-3);
1690
+ color: var(--fg-2);
1691
+ display: inline-flex;
1692
+ align-items: center;
1693
+ justify-content: center;
1694
+ font-size: var(--fs-lg);
1695
+ font-weight: 600;
1696
+ overflow: hidden;
1697
+ }
1698
+ .ds-247420 .cm-voice-user-avatar img {
1699
+ width: 100%;
1700
+ height: 100%;
1701
+ object-fit: cover;
1702
+ display: block;
1703
+ }
1704
+ .ds-247420 .cm-voice-user.speaking .cm-voice-user-avatar {
1705
+ box-shadow: 0 0 0 2px var(--green-2);
1706
+ }
1707
+
1708
+ .ds-247420 .cm-voice-user-name {
1709
+ font-size: var(--fs-xs);
1710
+ color: var(--fg);
1711
+ font-weight: 500;
1712
+ max-width: 100px;
1713
+ overflow: hidden;
1714
+ text-overflow: ellipsis;
1715
+ white-space: nowrap;
1716
+ text-align: center;
1717
+ }
1718
+
1719
+ /* ============================================================
1720
+ Responsive — collapse sidebars on narrow viewports
1721
+ ============================================================ */
1722
+ @media (max-width: 768px) {
1723
+ .ds-247420 .cm-channel-sidebar {
1724
+ position: absolute;
1725
+ z-index: 20;
1726
+ top: 0;
1727
+ left: 72px;
1728
+ bottom: 0;
1729
+ transform: translateX(-110%);
1730
+ transition: transform var(--dur-base) var(--ease);
1731
+ box-shadow: 2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
1732
+ }
1733
+ .ds-247420 .cm-channel-sidebar.open { transform: translateX(0); }
1734
+ .ds-247420 .cm-member-list { display: none; }
1735
+ .ds-247420 .cm-member-list.open {
1736
+ display: flex;
1737
+ position: absolute;
1738
+ z-index: 20;
1739
+ top: 0;
1740
+ right: 0;
1741
+ bottom: 0;
1742
+ width: 240px;
1743
+ flex-basis: 240px;
1744
+ box-shadow: -2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
1745
+ }
1746
+ .ds-247420 .cm-chat-header-topic { display: none; }
1747
+ }
1748
+
1749
+ @media (max-width: 480px) {
1750
+ .ds-247420 .cm-server-rail {
1751
+ flex: 0 0 56px;
1752
+ width: 56px;
1753
+ }
1754
+ .ds-247420 .cm-server-icon,
1755
+ .ds-247420 .cm-server-add,
1756
+ .ds-247420 .cm-server-back {
1757
+ width: 40px;
1758
+ height: 40px;
1759
+ }
1760
+ .ds-247420 .cm-channel-sidebar { left: 56px; }
1761
+ }
977
1762
 
978
- .ds-247420 .cm-server-sep {
979
- width: 32px;
980
- height: 2px;
981
- background: color-mix(in oklab, var(--fg) 12%, transparent);
982
- border-radius: 2px;
983
- margin: 4px 0;
984
- flex-shrink: 0;
985
- }
986
1763
 
987
1764
  /* ============================================================
988
- Channel sidebar server name header + channel list
1765
+ Overlaystoast, banner, mobile header, drawer, boot splash,
1766
+ context menu, command palette, emoji picker, reply bar.
1767
+ Added by overlays.js component surface.
989
1768
  ============================================================ */
990
- .ds-247420 .cm-channel-sidebar {
991
- flex: 0 0 240px;
992
- width: 240px;
993
- display: flex;
994
- flex-direction: column;
995
- min-height: 0;
996
- background: var(--bg-2);
997
- position: relative;
998
- }
999
1769
 
1000
- .ds-247420 .cm-server-header {
1001
- display: flex;
1002
- align-items: center;
1003
- justify-content: space-between;
1004
- gap: 8px;
1005
- padding: 14px 16px;
1770
+ /* ---- Toast ---- */
1771
+ .ds-247420 .cm-toast {
1772
+ position: fixed;
1773
+ bottom: 24px;
1774
+ right: 24px;
1775
+ z-index: 1100;
1776
+ padding: 10px 14px;
1777
+ border-radius: var(--r-2);
1006
1778
  background: var(--bg-2);
1007
- box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
1008
- font-weight: 600;
1009
- font-size: var(--fs-sm);
1010
- letter-spacing: -0.01em;
1011
- cursor: pointer;
1012
- transition: background var(--dur-snap) var(--ease);
1013
- user-select: none;
1014
- flex-shrink: 0;
1015
- }
1016
- .ds-247420 .cm-server-header:hover {
1017
- background: color-mix(in oklab, var(--fg) 6%, var(--bg-2));
1018
- }
1019
- .ds-247420 .cm-server-header-name {
1020
- flex: 1;
1021
- min-width: 0;
1022
- overflow: hidden;
1023
- text-overflow: ellipsis;
1024
- white-space: nowrap;
1025
- }
1026
-
1027
- .ds-247420 .cm-channel-list {
1028
- flex: 1;
1029
- min-height: 0;
1030
- overflow-y: auto;
1031
- overflow-x: hidden;
1032
- padding: 8px 0 16px;
1033
- display: flex;
1034
- flex-direction: column;
1035
- gap: 2px;
1036
- scrollbar-width: thin;
1037
- scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
1038
- }
1039
- .ds-247420 .cm-channel-list::-webkit-scrollbar { width: 8px; }
1040
- .ds-247420 .cm-channel-list::-webkit-scrollbar-track { background: transparent; }
1041
- .ds-247420 .cm-channel-list::-webkit-scrollbar-thumb {
1042
- background: color-mix(in oklab, var(--fg) 18%, transparent);
1043
- border-radius: 4px;
1044
- }
1045
-
1046
- /* ============================================================
1047
- Channel category — collapsible group header
1048
- ============================================================ */
1049
- .ds-247420 .cm-channel-category {
1050
- display: flex;
1051
- flex-direction: column;
1052
- margin-top: 12px;
1053
- }
1054
- .ds-247420 .cm-channel-category:first-child { margin-top: 4px; }
1055
-
1056
- .ds-247420 .cm-category-header {
1057
- display: flex;
1058
- align-items: center;
1059
- gap: 4px;
1060
- padding: 4px 8px 4px 8px;
1061
- font-family: var(--ff-body);
1062
- font-size: var(--fs-micro);
1063
- font-weight: 600;
1064
- color: var(--fg-3);
1065
- letter-spacing: var(--tr-caps);
1066
- text-transform: uppercase;
1067
- cursor: pointer;
1068
- user-select: none;
1069
- transition: color var(--dur-snap) var(--ease);
1070
- }
1071
- .ds-247420 .cm-category-header:hover { color: var(--fg); }
1072
- .ds-247420 .cm-category-header:hover .cm-cat-add { opacity: 1; }
1073
-
1074
- .ds-247420 .cm-cat-arrow {
1075
- display: inline-flex;
1076
- align-items: center;
1077
- justify-content: center;
1078
- width: 12px;
1079
- height: 12px;
1080
- font-size: 10px;
1081
- transform: rotate(90deg);
1082
- transition: transform var(--dur-base) var(--ease);
1083
- flex-shrink: 0;
1084
- }
1085
- .ds-247420 .cm-category-header.collapsed .cm-cat-arrow { transform: rotate(0deg); }
1086
-
1087
- .ds-247420 .cm-cat-name {
1088
- flex: 1;
1089
- min-width: 0;
1090
- overflow: hidden;
1091
- text-overflow: ellipsis;
1092
- white-space: nowrap;
1093
- }
1094
- .ds-247420 .cm-cat-extra {
1095
- font-family: var(--ff-mono);
1096
- font-size: var(--fs-micro);
1097
- color: var(--fg-3);
1098
- font-weight: 500;
1099
- letter-spacing: 0;
1100
- text-transform: none;
1101
- }
1102
- .ds-247420 .cm-cat-add {
1103
- display: inline-flex;
1104
- align-items: center;
1105
- justify-content: center;
1106
- width: 18px;
1107
- height: 18px;
1108
- border: 0;
1109
- background: transparent;
1110
- color: var(--fg-3);
1111
- font-size: var(--fs-sm);
1112
- cursor: pointer;
1113
- opacity: 0;
1114
- border-radius: var(--r-1);
1115
- transition: opacity var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1116
- }
1117
- .ds-247420 .cm-cat-add:hover {
1118
- color: var(--fg);
1119
- background: color-mix(in oklab, var(--fg) 8%, transparent);
1120
- }
1121
-
1122
- .ds-247420 .cm-cat-channels {
1123
- display: flex;
1124
- flex-direction: column;
1125
- gap: 1px;
1126
- padding: 2px 0;
1127
- }
1128
-
1129
- /* ============================================================
1130
- Channel item — pillish row with active rail and hover state
1131
- ============================================================ */
1132
- .ds-247420 .cm-channel-item-wrap {
1133
- position: relative;
1134
- padding: 0 8px;
1135
- }
1136
-
1137
- .ds-247420 .cm-channel-item {
1138
- position: relative;
1139
- display: flex;
1140
- align-items: center;
1141
- gap: 8px;
1142
- padding: 6px 8px;
1143
- border-radius: var(--r-1);
1144
- color: var(--fg-3);
1145
- cursor: pointer;
1146
- user-select: none;
1147
- transition:
1148
- background var(--dur-snap) var(--ease),
1149
- color var(--dur-snap) var(--ease);
1150
- }
1151
- .ds-247420 .cm-channel-item:hover {
1152
- background: color-mix(in oklab, var(--fg) 6%, transparent);
1153
- color: var(--fg);
1154
- }
1155
- .ds-247420 .cm-channel-item:hover .cm-ch-actions { opacity: 1; }
1156
-
1157
- .ds-247420 .cm-channel-item.active {
1158
- background: color-mix(in oklab, var(--fg) 10%, transparent);
1159
1779
  color: var(--fg);
1160
- font-weight: 500;
1161
- }
1162
- .ds-247420 .cm-channel-item.active::before {
1163
- content: '';
1164
- position: absolute;
1165
- left: -8px;
1166
- top: 4px;
1167
- bottom: 4px;
1168
- width: 3px;
1169
- background: var(--accent);
1170
- border-radius: 0 3px 3px 0;
1171
- }
1172
-
1173
- .ds-247420 .cm-channel-item.voice-active {
1174
- color: var(--green-2);
1175
- }
1176
- .ds-247420 .cm-channel-item.voice-active .cm-ch-icon { color: var(--green-2); }
1177
- .ds-247420 .cm-channel-item.voice-active:hover {
1178
- background: color-mix(in oklab, var(--green) 12%, transparent);
1179
- }
1180
-
1181
- .ds-247420 .cm-channel-item.voice-connecting {
1182
- color: var(--sun);
1183
- }
1184
-
1185
- .ds-247420 .cm-ch-icon {
1186
- flex: 0 0 18px;
1187
- width: 18px;
1188
- height: 18px;
1189
- display: inline-flex;
1190
- align-items: center;
1191
- justify-content: center;
1192
- font-family: var(--ff-mono);
1193
- font-size: var(--fs-sm);
1194
- color: var(--fg-3);
1195
- opacity: 0.85;
1196
- }
1197
- .ds-247420 .cm-channel-item.active .cm-ch-icon { color: var(--fg-2); opacity: 1; }
1198
-
1199
- .ds-247420 .cm-ch-spinner {
1200
- width: 12px;
1201
- height: 12px;
1202
- border-radius: 50%;
1203
- border: 2px solid color-mix(in oklab, var(--sun) 30%, transparent);
1204
- border-top-color: var(--sun);
1205
- animation: cm-spin 700ms linear infinite;
1206
- flex-shrink: 0;
1207
- }
1208
- @keyframes cm-spin {
1209
- to { transform: rotate(360deg); }
1210
- }
1211
-
1212
- .ds-247420 .cm-ch-name {
1213
- flex: 1;
1214
- min-width: 0;
1215
- overflow: hidden;
1216
- text-overflow: ellipsis;
1217
- white-space: nowrap;
1218
1780
  font-size: var(--fs-sm);
1219
- }
1220
-
1221
- .ds-247420 .cm-ch-badge {
1222
- flex-shrink: 0;
1223
- min-width: 16px;
1224
- height: 16px;
1225
- padding: 0 5px;
1226
- background: var(--warn);
1227
- color: var(--paper);
1228
- font-family: var(--ff-mono);
1229
- font-size: var(--fs-micro);
1230
- font-weight: 700;
1231
- border-radius: var(--r-pill);
1232
- display: inline-flex;
1233
- align-items: center;
1234
- justify-content: center;
1235
- line-height: 1;
1236
- }
1237
-
1238
- .ds-247420 .cm-ch-actions {
1239
- display: inline-flex;
1240
- align-items: center;
1241
- gap: 2px;
1242
- opacity: 0;
1243
- transition: opacity var(--dur-snap) var(--ease);
1244
- flex-shrink: 0;
1245
- }
1246
- .ds-247420 .cm-channel-item.active .cm-ch-actions { opacity: 0.6; }
1247
-
1248
- .ds-247420 .cm-ch-action-btn {
1249
- width: 18px;
1250
- height: 18px;
1251
- display: inline-flex;
1252
- align-items: center;
1253
- justify-content: center;
1254
- background: transparent;
1255
- border: 0;
1256
- color: var(--fg-3);
1257
- cursor: pointer;
1258
- border-radius: var(--r-1);
1259
- font-size: var(--fs-tiny);
1260
- transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1261
- }
1262
- .ds-247420 .cm-ch-action-btn:hover {
1263
- color: var(--fg);
1264
- background: color-mix(in oklab, var(--fg) 10%, transparent);
1265
- }
1266
-
1267
- /* Voice users nested under a voice channel */
1268
- .ds-247420 .cm-ch-voice-users {
1269
- display: flex;
1270
- flex-direction: column;
1271
- gap: 1px;
1272
- padding: 2px 8px 4px 32px;
1273
- }
1274
-
1275
- .ds-247420 .cm-ch-voice-user {
1276
- display: flex;
1277
- align-items: center;
1278
- gap: 8px;
1279
- padding: 3px 6px;
1280
- border-radius: var(--r-1);
1281
- color: var(--fg-2);
1282
- font-size: var(--fs-xs);
1283
- cursor: pointer;
1284
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1285
- }
1286
- .ds-247420 .cm-ch-voice-user:hover {
1287
- background: color-mix(in oklab, var(--fg) 6%, transparent);
1288
- color: var(--fg);
1289
- }
1290
- .ds-247420 .cm-ch-voice-user.speaking {
1291
- color: var(--green-2);
1292
- }
1293
- .ds-247420 .cm-ch-voice-user.speaking .cm-ch-voice-user-avatar {
1294
- box-shadow: 0 0 0 2px var(--green-2);
1295
- }
1296
-
1297
- .ds-247420 .cm-ch-voice-user-avatar {
1298
- flex: 0 0 20px;
1299
- width: 20px;
1300
- height: 20px;
1301
- border-radius: 50%;
1302
- background: var(--bg-3);
1303
- color: var(--fg-2);
1781
+ box-shadow: 0 8px 24px color-mix(in oklab, var(--ink) 35%, transparent);
1304
1782
  display: inline-flex;
1305
1783
  align-items: center;
1306
- justify-content: center;
1307
- font-size: 10px;
1308
- font-weight: 600;
1309
- overflow: hidden;
1310
- transition: box-shadow var(--dur-snap) var(--ease);
1311
- }
1312
- .ds-247420 .cm-ch-voice-user-avatar img {
1313
- width: 100%;
1314
- height: 100%;
1315
- object-fit: cover;
1316
- display: block;
1317
- }
1318
-
1319
- .ds-247420 .cm-ch-voice-user-name {
1320
- flex: 1;
1321
- min-width: 0;
1322
- overflow: hidden;
1323
- text-overflow: ellipsis;
1324
- white-space: nowrap;
1325
- }
1326
-
1327
- /* ============================================================
1328
- Voice strip — slots above user panel when in voice
1329
- ============================================================ */
1330
- .ds-247420 .cm-voice-strip {
1331
- display: none;
1332
- flex-direction: column;
1333
1784
  gap: 8px;
1334
- padding: 10px 12px;
1335
- background: color-mix(in oklab, var(--green) 18%, var(--bg-2));
1336
- color: var(--fg);
1337
- box-shadow: 0 -1px 0 color-mix(in oklab, var(--fg) 10%, transparent);
1338
- flex-shrink: 0;
1339
- }
1340
- .ds-247420 .cm-voice-strip.open { display: flex; }
1341
-
1342
- .ds-247420 .cm-vs-label {
1343
- font-family: var(--ff-mono);
1344
- font-size: var(--fs-micro);
1345
- text-transform: uppercase;
1346
- letter-spacing: var(--tr-caps);
1347
- color: var(--green-2);
1348
- font-weight: 700;
1349
- display: inline-flex;
1350
- align-items: center;
1351
- gap: 6px;
1352
- }
1353
- .ds-247420 .cm-vs-label::before {
1354
- content: '';
1355
- width: 8px;
1356
- height: 8px;
1357
- border-radius: 50%;
1358
- background: var(--green-2);
1359
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent);
1360
- animation: cm-pulse 1.6s ease-in-out infinite;
1361
- }
1362
- @keyframes cm-pulse {
1363
- 0%, 100% { box-shadow: 0 0 0 3px color-mix(in oklab, var(--green-2) 30%, transparent); }
1364
- 50% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--green-2) 0%, transparent); }
1365
- }
1366
-
1367
- .ds-247420 .cm-vs-channel {
1368
- font-size: var(--fs-sm);
1369
- font-weight: 600;
1370
- color: var(--fg);
1371
- overflow: hidden;
1372
- text-overflow: ellipsis;
1373
- white-space: nowrap;
1374
- }
1375
- .ds-247420 .cm-vs-status {
1376
- font-size: var(--fs-xs);
1377
- color: var(--fg-2);
1378
- display: flex;
1379
- align-items: center;
1380
- gap: 6px;
1381
- flex-wrap: wrap;
1785
+ max-width: 360px;
1786
+ animation: cm-toast-in var(--dur-base) var(--ease);
1382
1787
  }
1788
+ @keyframes cm-toast-in {
1789
+ from { transform: translateY(8px); opacity: 0; }
1790
+ to { transform: translateY(0); opacity: 1; }
1791
+ }
1792
+ .ds-247420 .cm-toast.tone-info { border-left: 3px solid var(--accent); }
1793
+ .ds-247420 .cm-toast.tone-success { border-left: 3px solid var(--green-2); }
1794
+ .ds-247420 .cm-toast.tone-warn { border-left: 3px solid var(--sun); }
1795
+ .ds-247420 .cm-toast.tone-error { border-left: 3px solid var(--warn); }
1383
1796
 
1384
- .ds-247420 .cm-vs-btn {
1385
- display: inline-flex;
1797
+ /* ---- Banner ---- */
1798
+ .ds-247420 .cm-banner {
1799
+ display: flex;
1386
1800
  align-items: center;
1387
- justify-content: center;
1388
- gap: 6px;
1389
- height: 28px;
1390
- padding: 0 10px;
1391
- background: color-mix(in oklab, var(--fg) 10%, transparent);
1801
+ gap: 10px;
1802
+ padding: 8px 14px;
1803
+ background: var(--bg-2);
1392
1804
  color: var(--fg);
1393
- border: 0;
1805
+ font-size: var(--fs-sm);
1806
+ border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 25%, transparent);
1807
+ }
1808
+ .ds-247420 .cm-banner-msg { flex: 1; min-width: 0; }
1809
+ .ds-247420 .cm-banner.tone-info { background: color-mix(in oklab, var(--accent) 14%, var(--bg-2)); }
1810
+ .ds-247420 .cm-banner.tone-success { background: color-mix(in oklab, var(--green-2) 14%, var(--bg-2)); }
1811
+ .ds-247420 .cm-banner.tone-warn { background: color-mix(in oklab, var(--sun) 18%, var(--bg-2)); }
1812
+ .ds-247420 .cm-banner.tone-error { background: color-mix(in oklab, var(--warn) 18%, var(--bg-2)); }
1813
+ .ds-247420 .cm-banner-action,
1814
+ .ds-247420 .cm-banner-dismiss {
1815
+ background: transparent;
1816
+ color: inherit;
1817
+ border: 1px solid color-mix(in oklab, var(--fg) 22%, transparent);
1394
1818
  border-radius: var(--r-1);
1395
- font-family: var(--ff-body);
1396
- font-size: var(--fs-xs);
1397
- font-weight: 600;
1819
+ padding: 4px 10px;
1398
1820
  cursor: pointer;
1399
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1400
- }
1401
- .ds-247420 .cm-vs-btn:hover {
1402
- background: color-mix(in oklab, var(--fg) 18%, transparent);
1403
- }
1404
- .ds-247420 .cm-vs-btn.danger {
1405
- background: var(--warn);
1406
- color: var(--paper);
1407
- }
1408
- .ds-247420 .cm-vs-btn.danger:hover {
1409
- background: color-mix(in oklab, var(--warn) 80%, var(--ink));
1821
+ font-size: var(--fs-xs);
1822
+ display: inline-flex;
1823
+ align-items: center;
1824
+ gap: 4px;
1825
+ transition: background var(--dur-snap) var(--ease);
1410
1826
  }
1827
+ .ds-247420 .cm-banner-action:hover,
1828
+ .ds-247420 .cm-banner-dismiss:hover { background: color-mix(in oklab, var(--fg) 12%, transparent); }
1829
+ .ds-247420 .cm-banner-dismiss { border: none; padding: 4px 8px; }
1411
1830
 
1412
- /* ============================================================
1413
- User panel — bottom of channel sidebar
1414
- ============================================================ */
1415
- .ds-247420 .cm-user-panel {
1831
+ /* ---- Mobile header ---- */
1832
+ .ds-247420 .cm-mobile-header {
1416
1833
  display: flex;
1417
1834
  align-items: center;
1418
- gap: 8px;
1419
- padding: 8px 8px;
1420
- background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
1421
- flex-shrink: 0;
1835
+ gap: 10px;
1836
+ padding: 8px 12px;
1837
+ height: 48px;
1838
+ background: var(--bg-2);
1839
+ color: var(--fg);
1840
+ border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 20%, transparent);
1422
1841
  }
1423
-
1424
- .ds-247420 .cm-user-avatar {
1425
- position: relative;
1426
- flex: 0 0 32px;
1427
- width: 32px;
1428
- height: 32px;
1429
- border-radius: 50%;
1430
- background: var(--bg-3);
1431
- color: var(--fg-2);
1842
+ .ds-247420 .cm-mh-btn {
1843
+ background: transparent;
1844
+ color: inherit;
1845
+ border: none;
1846
+ width: 36px;
1847
+ height: 36px;
1432
1848
  display: inline-flex;
1433
1849
  align-items: center;
1434
1850
  justify-content: center;
1435
- font-size: var(--fs-xs);
1436
- font-weight: 600;
1437
- overflow: hidden;
1438
- }
1439
- .ds-247420 .cm-user-avatar img {
1440
- width: 100%;
1441
- height: 100%;
1442
- object-fit: cover;
1443
- display: block;
1444
- }
1445
-
1446
- .ds-247420 .cm-user-status-dot {
1447
- position: absolute;
1448
- right: -2px;
1449
- bottom: -2px;
1450
- width: 12px;
1451
- height: 12px;
1452
- border-radius: 50%;
1453
- background: var(--green-2);
1454
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--fg) 5%, var(--bg-2));
1851
+ border-radius: var(--r-1);
1852
+ cursor: pointer;
1853
+ font-size: var(--fs-md);
1854
+ transition: background var(--dur-snap) var(--ease);
1455
1855
  }
1456
-
1457
- .ds-247420 .cm-user-info {
1856
+ .ds-247420 .cm-mh-btn:hover { background: color-mix(in oklab, var(--fg) 10%, transparent); }
1857
+ .ds-247420 .cm-mh-title {
1458
1858
  flex: 1;
1459
1859
  min-width: 0;
1460
- display: flex;
1461
- flex-direction: column;
1462
- line-height: 1.2;
1463
- }
1464
- .ds-247420 .cm-user-name {
1465
- font-size: var(--fs-xs);
1466
1860
  font-weight: 600;
1467
- color: var(--fg);
1861
+ font-size: var(--fs-md);
1468
1862
  overflow: hidden;
1469
1863
  text-overflow: ellipsis;
1470
1864
  white-space: nowrap;
1471
1865
  }
1472
- .ds-247420 .cm-user-tag {
1473
- font-family: var(--ff-mono);
1474
- font-size: var(--fs-micro);
1475
- color: var(--fg-3);
1476
- overflow: hidden;
1477
- text-overflow: ellipsis;
1478
- white-space: nowrap;
1866
+ @media (min-width: 769px) {
1867
+ .ds-247420 .cm-mobile-header { display: none; }
1479
1868
  }
1480
1869
 
1481
- .ds-247420 .cm-user-controls {
1482
- display: inline-flex;
1483
- align-items: center;
1484
- gap: 2px;
1870
+ /* ---- Drawer overlay ---- */
1871
+ .ds-247420 .cm-drawer-overlay {
1872
+ position: fixed;
1873
+ inset: 0;
1874
+ z-index: 1000;
1875
+ display: flex;
1876
+ }
1877
+ .ds-247420 .cm-drawer-backdrop {
1878
+ position: absolute;
1879
+ inset: 0;
1880
+ background: color-mix(in oklab, var(--ink) 55%, transparent);
1881
+ animation: cm-fade-in var(--dur-base) var(--ease);
1485
1882
  }
1883
+ @keyframes cm-fade-in { from { opacity: 0 } to { opacity: 1 } }
1884
+ .ds-247420 .cm-drawer-content {
1885
+ position: relative;
1886
+ background: var(--bg);
1887
+ color: var(--fg);
1888
+ height: 100%;
1889
+ width: min(320px, 86vw);
1890
+ box-shadow: 0 0 24px color-mix(in oklab, var(--ink) 40%, transparent);
1891
+ overflow-y: auto;
1892
+ display: flex;
1893
+ flex-direction: column;
1894
+ animation: cm-drawer-in-l var(--dur-base) var(--ease);
1895
+ }
1896
+ .ds-247420 .cm-drawer-content.side-left { margin-right: auto; }
1897
+ .ds-247420 .cm-drawer-content.side-right {
1898
+ margin-left: auto;
1899
+ animation-name: cm-drawer-in-r;
1900
+ }
1901
+ @keyframes cm-drawer-in-l { from { transform: translateX(-100%) } to { transform: translateX(0) } }
1902
+ @keyframes cm-drawer-in-r { from { transform: translateX(100%) } to { transform: translateX(0) } }
1486
1903
 
1487
- .ds-247420 .cm-user-btn {
1488
- width: 28px;
1489
- height: 28px;
1490
- display: inline-flex;
1904
+ /* ---- Boot overlay ---- */
1905
+ .ds-247420 .cm-boot-overlay {
1906
+ position: fixed;
1907
+ inset: 0;
1908
+ z-index: 1200;
1909
+ background: var(--bg);
1910
+ color: var(--fg);
1911
+ display: flex;
1912
+ flex-direction: column;
1491
1913
  align-items: center;
1492
1914
  justify-content: center;
1493
- background: transparent;
1494
- border: 0;
1915
+ gap: 16px;
1916
+ padding: 24px;
1917
+ }
1918
+ .ds-247420 .cm-boot-spinner {
1919
+ width: 48px;
1920
+ height: 48px;
1921
+ border-radius: 50%;
1922
+ border: 3px solid color-mix(in oklab, var(--fg) 14%, transparent);
1923
+ border-top-color: var(--accent);
1924
+ animation: cm-spin 0.9s linear infinite;
1925
+ }
1926
+ @keyframes cm-spin { to { transform: rotate(360deg); } }
1927
+ .ds-247420 .cm-boot-phase {
1928
+ font-size: var(--fs-md);
1495
1929
  color: var(--fg-2);
1496
- cursor: pointer;
1497
- border-radius: var(--r-1);
1498
- font-size: var(--fs-sm);
1499
- transition: color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1930
+ letter-spacing: var(--tr-tight);
1500
1931
  }
1501
- .ds-247420 .cm-user-btn:hover {
1502
- background: color-mix(in oklab, var(--fg) 10%, transparent);
1503
- color: var(--fg);
1932
+ .ds-247420 .cm-boot-progress {
1933
+ width: min(420px, 80vw);
1934
+ height: 6px;
1935
+ background: var(--bg-2);
1936
+ border-radius: 999px;
1937
+ overflow: hidden;
1504
1938
  }
1505
- .ds-247420 .cm-user-btn.muted {
1506
- color: var(--warn);
1939
+ .ds-247420 .cm-boot-bar {
1940
+ height: 100%;
1941
+ background: var(--accent);
1942
+ transition: width var(--dur-base) var(--ease);
1507
1943
  }
1508
- .ds-247420 .cm-user-btn.deafened {
1944
+ .ds-247420 .cm-boot-error {
1509
1945
  color: var(--warn);
1510
- background: color-mix(in oklab, var(--warn) 18%, transparent);
1946
+ font-size: var(--fs-sm);
1947
+ max-width: 480px;
1948
+ text-align: center;
1511
1949
  }
1512
1950
 
1513
- /* ============================================================
1514
- Chat header — top of main column
1515
- ============================================================ */
1516
- .ds-247420 .cm-chat-header {
1951
+ /* ---- Context menu ---- */
1952
+ .ds-247420 .cm-context-menu {
1953
+ position: fixed;
1954
+ z-index: 1300;
1955
+ min-width: 180px;
1956
+ padding: 4px;
1957
+ background: var(--bg-2);
1958
+ color: var(--fg);
1959
+ border-radius: var(--r-2);
1960
+ box-shadow: 0 8px 24px color-mix(in oklab, var(--ink) 45%, transparent);
1961
+ animation: cm-fade-in var(--dur-snap) var(--ease);
1962
+ }
1963
+ .ds-247420 .cm-cm-list { display: flex; flex-direction: column; gap: 1px; }
1964
+ .ds-247420 .cm-cm-item {
1965
+ background: transparent;
1966
+ color: inherit;
1967
+ border: none;
1968
+ text-align: left;
1969
+ padding: 8px 10px;
1970
+ border-radius: var(--r-1);
1971
+ font-size: var(--fs-sm);
1517
1972
  display: flex;
1518
1973
  align-items: center;
1519
- gap: 10px;
1520
- padding: 12px 16px;
1521
- background: var(--bg);
1522
- box-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 8%, transparent);
1523
- flex-shrink: 0;
1524
- min-height: 48px;
1974
+ gap: 8px;
1975
+ cursor: pointer;
1976
+ transition: background var(--dur-snap) var(--ease);
1977
+ }
1978
+ .ds-247420 .cm-cm-item:hover { background: color-mix(in oklab, var(--accent) 24%, transparent); color: var(--fg); }
1979
+ .ds-247420 .cm-cm-item.danger { color: var(--warn); }
1980
+ .ds-247420 .cm-cm-item.danger:hover { background: color-mix(in oklab, var(--warn) 22%, transparent); color: var(--warn); }
1981
+ .ds-247420 .cm-cm-icon { width: 18px; display: inline-flex; justify-content: center; }
1982
+ .ds-247420 .cm-cm-label { flex: 1; min-width: 0; }
1983
+ .ds-247420 .cm-cm-sep {
1984
+ height: 1px;
1985
+ background: color-mix(in oklab, var(--fg-3) 22%, transparent);
1986
+ margin: 4px 6px;
1525
1987
  }
1526
1988
 
1527
- .ds-247420 .cm-chat-header-icon {
1528
- flex: 0 0 20px;
1529
- width: 20px;
1530
- height: 20px;
1531
- display: inline-flex;
1532
- align-items: center;
1989
+ /* ---- Command palette ---- */
1990
+ .ds-247420 .cm-command-palette-wrap {
1991
+ position: fixed;
1992
+ inset: 0;
1993
+ z-index: 1400;
1994
+ display: flex;
1995
+ align-items: flex-start;
1533
1996
  justify-content: center;
1534
- font-family: var(--ff-mono);
1535
- font-size: var(--fs-lg);
1536
- color: var(--fg-3);
1997
+ padding-top: 12vh;
1537
1998
  }
1538
-
1539
- .ds-247420 .cm-chat-header-name {
1540
- font-weight: 600;
1541
- font-size: var(--fs-sm);
1999
+ .ds-247420 .cm-command-palette-backdrop {
2000
+ position: absolute;
2001
+ inset: 0;
2002
+ background: color-mix(in oklab, var(--ink) 50%, transparent);
2003
+ }
2004
+ .ds-247420 .cm-command-palette {
2005
+ position: relative;
2006
+ width: min(560px, 92vw);
2007
+ max-height: 60vh;
2008
+ display: flex;
2009
+ flex-direction: column;
2010
+ background: var(--bg-2);
1542
2011
  color: var(--fg);
1543
- letter-spacing: -0.01em;
1544
- flex-shrink: 0;
2012
+ border-radius: var(--r-2);
2013
+ box-shadow: 0 16px 40px color-mix(in oklab, var(--ink) 45%, transparent);
2014
+ overflow: hidden;
1545
2015
  }
1546
-
1547
- .ds-247420 .cm-chat-header-topic {
2016
+ .ds-247420 .cm-cp-input {
2017
+ background: transparent;
2018
+ border: none;
2019
+ border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
2020
+ color: var(--fg);
2021
+ font-size: var(--fs-md);
2022
+ padding: 14px 16px;
2023
+ outline: none;
2024
+ font-family: var(--ff-body);
2025
+ }
2026
+ .ds-247420 .cm-cp-input::placeholder { color: var(--fg-3); }
2027
+ .ds-247420 .cm-cp-list {
1548
2028
  flex: 1;
1549
- min-width: 0;
1550
- padding-left: 12px;
1551
- margin-left: 4px;
1552
- border-left: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
1553
- color: var(--fg-3);
1554
- font-size: var(--fs-xs);
1555
- overflow: hidden;
1556
- text-overflow: ellipsis;
1557
- white-space: nowrap;
2029
+ min-height: 0;
2030
+ overflow-y: auto;
2031
+ padding: 6px;
2032
+ display: flex;
2033
+ flex-direction: column;
2034
+ gap: 1px;
1558
2035
  }
1559
-
1560
- .ds-247420 .cm-chat-header-toolbar {
1561
- display: inline-flex;
2036
+ .ds-247420 .cm-cp-item {
2037
+ background: transparent;
2038
+ color: inherit;
2039
+ border: none;
2040
+ text-align: left;
2041
+ padding: 10px 12px;
2042
+ border-radius: var(--r-1);
2043
+ font-size: var(--fs-sm);
2044
+ display: flex;
1562
2045
  align-items: center;
1563
- gap: 4px;
1564
- flex-shrink: 0;
2046
+ gap: 10px;
2047
+ cursor: pointer;
2048
+ transition: background var(--dur-snap) var(--ease);
1565
2049
  }
2050
+ .ds-247420 .cm-cp-item:hover,
2051
+ .ds-247420 .cm-cp-item.selected {
2052
+ background: color-mix(in oklab, var(--accent) 22%, transparent);
2053
+ }
2054
+ .ds-247420 .cm-cp-icon { width: 20px; display: inline-flex; justify-content: center; }
2055
+ .ds-247420 .cm-cp-label { flex: 1; min-width: 0; }
2056
+ .ds-247420 .cm-cp-hint { color: var(--fg-3); font-size: var(--fs-xs); }
1566
2057
 
1567
- /* ============================================================
1568
- Member list — right column
1569
- ============================================================ */
1570
- .ds-247420 .cm-member-list {
1571
- flex: 0 0 240px;
1572
- width: 240px;
2058
+ /* ---- Emoji picker ---- */
2059
+ .ds-247420 .cm-emoji-picker {
2060
+ width: min(340px, 92vw);
2061
+ max-height: 360px;
2062
+ background: var(--bg-2);
2063
+ color: var(--fg);
2064
+ border-radius: var(--r-2);
2065
+ box-shadow: 0 12px 28px color-mix(in oklab, var(--ink) 40%, transparent);
1573
2066
  display: flex;
1574
2067
  flex-direction: column;
1575
- min-height: 0;
1576
- overflow-y: auto;
1577
- overflow-x: hidden;
1578
- background: var(--bg-2);
1579
- padding: 16px 0;
1580
- scrollbar-width: thin;
1581
- scrollbar-color: color-mix(in oklab, var(--fg) 18%, transparent) transparent;
1582
- transition: width var(--dur-base) var(--ease), flex-basis var(--dur-base) var(--ease);
1583
- }
1584
- .ds-247420 .cm-member-list:not(.open) {
1585
- width: 0;
1586
- flex-basis: 0;
1587
- padding: 0;
1588
2068
  overflow: hidden;
1589
2069
  }
1590
- .ds-247420 .cm-member-list::-webkit-scrollbar { width: 8px; }
1591
- .ds-247420 .cm-member-list::-webkit-scrollbar-thumb {
1592
- background: color-mix(in oklab, var(--fg) 18%, transparent);
1593
- border-radius: 4px;
1594
- }
1595
-
1596
- .ds-247420 .cm-member-category {
1597
- padding: 12px 16px 6px;
2070
+ .ds-247420 .cm-ep-search {
2071
+ background: var(--bg-3);
2072
+ border: none;
2073
+ color: var(--fg);
2074
+ padding: 8px 10px;
2075
+ font-size: var(--fs-sm);
2076
+ margin: 8px;
2077
+ border-radius: var(--r-1);
2078
+ outline: none;
1598
2079
  font-family: var(--ff-body);
1599
- font-size: var(--fs-micro);
1600
- font-weight: 600;
2080
+ }
2081
+ .ds-247420 .cm-ep-search::placeholder { color: var(--fg-3); }
2082
+ .ds-247420 .cm-ep-grid {
2083
+ flex: 1;
2084
+ min-height: 0;
2085
+ overflow-y: auto;
2086
+ padding: 4px 8px 8px;
2087
+ display: grid;
2088
+ grid-template-columns: repeat(8, 1fr);
2089
+ gap: 2px;
2090
+ }
2091
+ .ds-247420 .cm-ep-category {
2092
+ grid-column: 1 / -1;
2093
+ font-size: var(--fs-xs);
1601
2094
  color: var(--fg-3);
1602
- letter-spacing: var(--tr-caps);
1603
2095
  text-transform: uppercase;
2096
+ letter-spacing: var(--tr-wide);
2097
+ padding: 6px 2px 2px;
2098
+ }
2099
+ .ds-247420 .cm-ep-btn {
2100
+ background: transparent;
2101
+ border: none;
2102
+ cursor: pointer;
2103
+ font-size: 20px;
2104
+ line-height: 1;
2105
+ padding: 4px;
2106
+ border-radius: var(--r-1);
2107
+ transition: background var(--dur-snap) var(--ease);
1604
2108
  }
2109
+ .ds-247420 .cm-ep-btn:hover { background: color-mix(in oklab, var(--fg) 12%, transparent); }
1605
2110
 
1606
- .ds-247420 .cm-member-item {
2111
+ /* ---- Reply bar ---- */
2112
+ .ds-247420 .cm-reply-bar {
1607
2113
  display: flex;
1608
2114
  align-items: center;
1609
- gap: 10px;
2115
+ gap: 8px;
1610
2116
  padding: 6px 12px;
1611
- margin: 0 8px;
1612
- border-radius: var(--r-1);
2117
+ background: var(--bg-2);
1613
2118
  color: var(--fg-2);
2119
+ font-size: var(--fs-xs);
2120
+ border-top: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
2121
+ }
2122
+ .ds-247420 .cm-rb-quote { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2123
+ .ds-247420 .cm-rb-label { color: var(--fg-3); }
2124
+ .ds-247420 .cm-rb-author { color: var(--accent); font-weight: 600; }
2125
+ .ds-247420 .cm-rb-msg { color: var(--fg-3); }
2126
+ .ds-247420 .cm-rb-cancel {
2127
+ background: transparent;
2128
+ color: var(--fg-3);
2129
+ border: none;
1614
2130
  cursor: pointer;
2131
+ padding: 2px 6px;
2132
+ border-radius: var(--r-1);
1615
2133
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1616
2134
  }
1617
- .ds-247420 .cm-member-item:hover {
1618
- background: color-mix(in oklab, var(--fg) 6%, transparent);
1619
- color: var(--fg);
1620
- }
2135
+ .ds-247420 .cm-rb-cancel:hover { background: color-mix(in oklab, var(--warn) 18%, transparent); color: var(--warn); }
1621
2136
 
1622
- .ds-247420 .cm-member-avatar {
1623
- position: relative;
1624
- flex: 0 0 28px;
1625
- width: 28px;
1626
- height: 28px;
1627
- border-radius: 50%;
1628
- background: var(--bg-3);
1629
- color: var(--fg-2);
1630
- display: inline-flex;
1631
- align-items: center;
1632
- justify-content: center;
1633
- font-size: var(--fs-micro);
1634
- font-weight: 600;
1635
- overflow: hidden;
2137
+ /* ---- UserPanel extra buttons (active-toggle state) ---- */
2138
+ .ds-247420 .cm-user-controls .cm-user-btn.extra.active {
2139
+ background: color-mix(in oklab, var(--accent) 28%, transparent);
2140
+ color: var(--accent);
1636
2141
  }
1637
- .ds-247420 .cm-member-avatar img {
2142
+
2143
+ /* ---- VoiceUser: video stream + quality dot ---- */
2144
+ .ds-247420 .cm-voice-user-video {
1638
2145
  width: 100%;
1639
2146
  height: 100%;
1640
2147
  object-fit: cover;
1641
2148
  display: block;
2149
+ border-radius: 50%;
1642
2150
  }
1643
-
1644
- .ds-247420 .cm-member-status {
2151
+ .ds-247420 .cm-voice-user-avatar { position: relative; }
2152
+ .ds-247420 .cm-voice-user-quality {
1645
2153
  position: absolute;
1646
- right: -2px;
1647
- bottom: -2px;
2154
+ top: 2px;
2155
+ right: 2px;
1648
2156
  width: 10px;
1649
2157
  height: 10px;
1650
2158
  border-radius: 50%;
2159
+ border: 2px solid var(--bg-2);
1651
2160
  background: var(--fg-3);
1652
- box-shadow: 0 0 0 2px var(--bg-2);
1653
- }
1654
- .ds-247420 .cm-member-status.online {
1655
- background: var(--green-2);
1656
- }
1657
-
1658
- .ds-247420 .cm-member-name {
1659
- flex: 1;
1660
- min-width: 0;
1661
- overflow: hidden;
1662
- text-overflow: ellipsis;
1663
- white-space: nowrap;
1664
- font-size: var(--fs-sm);
1665
- }
1666
-
1667
- /* ============================================================
1668
- Voice user (standalone, e.g. in voice stage area)
1669
- ============================================================ */
1670
- .ds-247420 .cm-voice-user {
1671
- display: inline-flex;
1672
- flex-direction: column;
1673
- align-items: center;
1674
- gap: 6px;
1675
- padding: 10px;
1676
- border-radius: var(--r-2);
1677
- background: var(--bg-2);
1678
- transition: box-shadow var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
1679
- }
1680
- .ds-247420 .cm-voice-user.speaking {
1681
- background: color-mix(in oklab, var(--green-2) 12%, var(--bg-2));
1682
- box-shadow: 0 0 0 2px var(--green-2);
1683
- }
1684
-
1685
- .ds-247420 .cm-voice-user-avatar {
1686
- width: 56px;
1687
- height: 56px;
1688
- border-radius: 50%;
1689
- background: var(--bg-3);
1690
- color: var(--fg-2);
1691
- display: inline-flex;
1692
- align-items: center;
1693
- justify-content: center;
1694
- font-size: var(--fs-lg);
1695
- font-weight: 600;
1696
- overflow: hidden;
1697
- }
1698
- .ds-247420 .cm-voice-user-avatar img {
1699
- width: 100%;
1700
- height: 100%;
1701
- object-fit: cover;
1702
- display: block;
1703
- }
1704
- .ds-247420 .cm-voice-user.speaking .cm-voice-user-avatar {
1705
- box-shadow: 0 0 0 2px var(--green-2);
1706
- }
1707
-
1708
- .ds-247420 .cm-voice-user-name {
1709
- font-size: var(--fs-xs);
1710
- color: var(--fg);
1711
- font-weight: 500;
1712
- max-width: 100px;
1713
- overflow: hidden;
1714
- text-overflow: ellipsis;
1715
- white-space: nowrap;
1716
- text-align: center;
1717
- }
1718
-
1719
- /* ============================================================
1720
- Responsive — collapse sidebars on narrow viewports
1721
- ============================================================ */
1722
- @media (max-width: 768px) {
1723
- .ds-247420 .cm-channel-sidebar {
1724
- position: absolute;
1725
- z-index: 20;
1726
- top: 0;
1727
- left: 72px;
1728
- bottom: 0;
1729
- transform: translateX(-110%);
1730
- transition: transform var(--dur-base) var(--ease);
1731
- box-shadow: 2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
1732
- }
1733
- .ds-247420 .cm-channel-sidebar.open { transform: translateX(0); }
1734
- .ds-247420 .cm-member-list { display: none; }
1735
- .ds-247420 .cm-member-list.open {
1736
- display: flex;
1737
- position: absolute;
1738
- z-index: 20;
1739
- top: 0;
1740
- right: 0;
1741
- bottom: 0;
1742
- width: 240px;
1743
- flex-basis: 240px;
1744
- box-shadow: -2px 0 16px color-mix(in oklab, var(--ink) 30%, transparent);
1745
- }
1746
- .ds-247420 .cm-chat-header-topic { display: none; }
1747
- }
1748
-
1749
- @media (max-width: 480px) {
1750
- .ds-247420 .cm-server-rail {
1751
- flex: 0 0 56px;
1752
- width: 56px;
1753
- }
1754
- .ds-247420 .cm-server-icon,
1755
- .ds-247420 .cm-server-add,
1756
- .ds-247420 .cm-server-back {
1757
- width: 40px;
1758
- height: 40px;
1759
- }
1760
- .ds-247420 .cm-channel-sidebar { left: 56px; }
1761
2161
  }
2162
+ .ds-247420 .cm-voice-user-quality.q-excellent { background: var(--green-2); }
2163
+ .ds-247420 .cm-voice-user-quality.q-good { background: color-mix(in oklab, var(--green-2) 70%, var(--sun)); }
2164
+ .ds-247420 .cm-voice-user-quality.q-poor { background: var(--sun); }
2165
+ .ds-247420 .cm-voice-user-quality.q-lost { background: var(--warn); }
2166
+ .ds-247420 .cm-voice-user-quality.q-unknown { background: var(--fg-3); }