anentrypoint-design 0.0.122 → 0.0.124

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.
Files changed (204) hide show
  1. package/README.md +253 -253
  2. package/app-shell.css +931 -594
  3. package/colors_and_type.css +226 -226
  4. package/community.css +933 -2255
  5. package/dist/247420.css +2276 -3075
  6. package/dist/247420.js +14 -14
  7. package/package.json +80 -80
  8. package/src/bootstrap.js +25 -25
  9. package/src/components/chat.js +199 -199
  10. package/src/components/community.js +190 -208
  11. package/src/components/content.js +269 -269
  12. package/src/components/editor-primitives.js +100 -0
  13. package/src/components/files-modals.js +107 -107
  14. package/src/components/files.js +118 -118
  15. package/src/components/freddie/helpers.js +50 -50
  16. package/src/components/freddie.js +33 -33
  17. package/src/components/shell.js +117 -117
  18. package/src/components/theme-toggle.js +70 -70
  19. package/src/components.js +59 -67
  20. package/src/debug.js +30 -30
  21. package/src/deck-stage.js +21 -21
  22. package/src/highlight.js +65 -32
  23. package/src/index.js +86 -86
  24. package/src/kits/os/about-app.js +52 -52
  25. package/src/kits/os/app-panes.css +152 -152
  26. package/src/kits/os/browser-app.js +58 -58
  27. package/src/kits/os/files-app.js +44 -44
  28. package/src/kits/os/freddie/helpers.js +59 -59
  29. package/src/kits/os/freddie/pages-chat.js +143 -143
  30. package/src/kits/os/freddie/pages-core.js +101 -101
  31. package/src/kits/os/freddie/pages-os.js +51 -51
  32. package/src/kits/os/freddie/pages-tools.js +183 -183
  33. package/src/kits/os/freddie/routes.js +24 -24
  34. package/src/kits/os/freddie-dashboard.css +51 -51
  35. package/src/kits/os/freddie-dashboard.js +101 -101
  36. package/src/kits/os/icons.js +17 -17
  37. package/src/kits/os/index.js +17 -17
  38. package/src/kits/os/launcher.css +61 -61
  39. package/src/kits/os/launcher.js +79 -79
  40. package/src/kits/os/monitor-app.js +34 -34
  41. package/src/kits/os/shell.js +214 -214
  42. package/src/kits/os/terminal-app.js +45 -45
  43. package/src/kits/os/theme.css +450 -450
  44. package/src/kits/os/validate.css +19 -19
  45. package/src/kits/os/validator-app.js +55 -55
  46. package/src/kits/os/wm.css +115 -115
  47. package/src/kits/os/wm.js +111 -111
  48. package/src/markdown.js +39 -39
  49. package/src/motion.js +35 -35
  50. package/src/page-html.js +196 -196
  51. package/src/styles.js +25 -25
  52. package/src/theme.js +99 -99
  53. package/src/web-components/ds-chat.js +116 -116
  54. package/dist/.nojekyll +0 -0
  55. package/dist/app-shell.css +0 -594
  56. package/dist/colors_and_type.css +0 -197
  57. package/dist/favicon.svg +0 -1
  58. package/dist/index.html +0 -308
  59. package/dist/preview/buttons.html +0 -28
  60. package/dist/preview/colors-core.html +0 -45
  61. package/dist/preview/colors-lore.html +0 -28
  62. package/dist/preview/colors-semantic.html +0 -34
  63. package/dist/preview/dateline.html +0 -19
  64. package/dist/preview/dropzone.html +0 -30
  65. package/dist/preview/file-grid.html +0 -19
  66. package/dist/preview/file-row.html +0 -20
  67. package/dist/preview/file-toolbar.html +0 -40
  68. package/dist/preview/file-viewer.html +0 -31
  69. package/dist/preview/header.html +0 -24
  70. package/dist/preview/icons-unicode.html +0 -26
  71. package/dist/preview/index-row.html +0 -25
  72. package/dist/preview/inputs.html +0 -22
  73. package/dist/preview/manifesto.html +0 -52
  74. package/dist/preview/motion-default.js +0 -106
  75. package/dist/preview/rules.html +0 -16
  76. package/dist/preview/spacing.html +0 -18
  77. package/dist/preview/stamps-lore.html +0 -20
  78. package/dist/preview/stamps.html +0 -14
  79. package/dist/preview/theme-ink.html +0 -15
  80. package/dist/preview/type-display.html +0 -16
  81. package/dist/preview/type-mono.html +0 -15
  82. package/dist/preview/type-prose.html +0 -11
  83. package/dist/preview/type-scale.html +0 -20
  84. package/dist/preview/wordmarks.html +0 -28
  85. package/dist/robots.txt +0 -8
  86. package/dist/site/content/globals/navigation.yaml +0 -5
  87. package/dist/site/content/globals/site.yaml +0 -16
  88. package/dist/site/content/pages/freddie.yaml +0 -88
  89. package/dist/site/content/pages/home.yaml +0 -190
  90. package/dist/site/theme.mjs +0 -368
  91. package/dist/sitemap.xml +0 -31
  92. package/dist/slides/deck-stage-overlay.js +0 -63
  93. package/dist/slides/deck-stage-state.js +0 -81
  94. package/dist/slides/deck-stage-style.js +0 -117
  95. package/dist/slides/deck-stage.js +0 -159
  96. package/dist/slides/index.html +0 -276
  97. package/dist/src/bootstrap.js +0 -25
  98. package/dist/src/components/chat.js +0 -199
  99. package/dist/src/components/community.js +0 -167
  100. package/dist/src/components/content.js +0 -213
  101. package/dist/src/components/files-modals.js +0 -107
  102. package/dist/src/components/files.js +0 -118
  103. package/dist/src/components/freddie/helpers.js +0 -50
  104. package/dist/src/components/freddie.js +0 -33
  105. package/dist/src/components/shell.js +0 -117
  106. package/dist/src/components/theme-toggle.js +0 -70
  107. package/dist/src/components.js +0 -52
  108. package/dist/src/debug.js +0 -30
  109. package/dist/src/deck-stage.js +0 -21
  110. package/dist/src/highlight.js +0 -32
  111. package/dist/src/index.js +0 -86
  112. package/dist/src/kits/os/about-app.js +0 -52
  113. package/dist/src/kits/os/app-panes.css +0 -152
  114. package/dist/src/kits/os/browser-app.js +0 -58
  115. package/dist/src/kits/os/files-app.js +0 -44
  116. package/dist/src/kits/os/freddie/helpers.js +0 -59
  117. package/dist/src/kits/os/freddie/pages-chat.js +0 -143
  118. package/dist/src/kits/os/freddie/pages-core.js +0 -101
  119. package/dist/src/kits/os/freddie/pages-os.js +0 -51
  120. package/dist/src/kits/os/freddie/pages-tools.js +0 -183
  121. package/dist/src/kits/os/freddie/routes.js +0 -24
  122. package/dist/src/kits/os/freddie-dashboard.css +0 -51
  123. package/dist/src/kits/os/freddie-dashboard.js +0 -101
  124. package/dist/src/kits/os/icons.js +0 -17
  125. package/dist/src/kits/os/index.js +0 -5
  126. package/dist/src/kits/os/launcher.css +0 -61
  127. package/dist/src/kits/os/launcher.js +0 -79
  128. package/dist/src/kits/os/monitor-app.js +0 -34
  129. package/dist/src/kits/os/shell.js +0 -214
  130. package/dist/src/kits/os/terminal-app.js +0 -45
  131. package/dist/src/kits/os/theme.css +0 -412
  132. package/dist/src/kits/os/validate.css +0 -19
  133. package/dist/src/kits/os/validator-app.js +0 -55
  134. package/dist/src/kits/os/wm.css +0 -115
  135. package/dist/src/kits/os/wm.js +0 -111
  136. package/dist/src/markdown.js +0 -39
  137. package/dist/src/motion.js +0 -35
  138. package/dist/src/page-html.js +0 -196
  139. package/dist/src/styles.js +0 -25
  140. package/dist/src/theme.js +0 -99
  141. package/dist/src/web-components/ds-chat.js +0 -45
  142. package/dist/ui_kits/aicat/README.md +0 -7
  143. package/dist/ui_kits/aicat/app.js +0 -156
  144. package/dist/ui_kits/aicat/index.html +0 -26
  145. package/dist/ui_kits/aicat/sample-square.png +0 -0
  146. package/dist/ui_kits/aicat/sample-svg.svg +0 -1
  147. package/dist/ui_kits/aicat/sample.pdf +0 -32
  148. package/dist/ui_kits/blog/README.md +0 -3
  149. package/dist/ui_kits/blog/index.html +0 -90
  150. package/dist/ui_kits/chat/README.md +0 -5
  151. package/dist/ui_kits/chat/app.js +0 -110
  152. package/dist/ui_kits/chat/index.html +0 -26
  153. package/dist/ui_kits/chat/sample-square.png +0 -0
  154. package/dist/ui_kits/chat/sample-svg.svg +0 -1
  155. package/dist/ui_kits/chat/sample.pdf +0 -32
  156. package/dist/ui_kits/community/app.js +0 -134
  157. package/dist/ui_kits/community/index.html +0 -24
  158. package/dist/ui_kits/dashboard/app.js +0 -92
  159. package/dist/ui_kits/dashboard/index.html +0 -26
  160. package/dist/ui_kits/docs/README.md +0 -3
  161. package/dist/ui_kits/docs/index.html +0 -123
  162. package/dist/ui_kits/error_404/app.js +0 -56
  163. package/dist/ui_kits/error_404/index.html +0 -26
  164. package/dist/ui_kits/file_browser/README.md +0 -48
  165. package/dist/ui_kits/file_browser/app.js +0 -231
  166. package/dist/ui_kits/file_browser/index.html +0 -33
  167. package/dist/ui_kits/gallery/app.js +0 -121
  168. package/dist/ui_kits/gallery/index.html +0 -26
  169. package/dist/ui_kits/homepage/README.md +0 -7
  170. package/dist/ui_kits/homepage/app.js +0 -167
  171. package/dist/ui_kits/homepage/index.html +0 -46
  172. package/dist/ui_kits/project_page/README.md +0 -3
  173. package/dist/ui_kits/project_page/app.js +0 -154
  174. package/dist/ui_kits/project_page/index.html +0 -45
  175. package/dist/ui_kits/search/app.js +0 -107
  176. package/dist/ui_kits/search/index.html +0 -26
  177. package/dist/ui_kits/settings/app.js +0 -133
  178. package/dist/ui_kits/settings/index.html +0 -26
  179. package/dist/ui_kits/signin/app.js +0 -115
  180. package/dist/ui_kits/signin/index.html +0 -26
  181. package/dist/ui_kits/slide_deck/app.js +0 -174
  182. package/dist/ui_kits/slide_deck/index.html +0 -26
  183. package/dist/ui_kits/system_primer/app.js +0 -152
  184. package/dist/ui_kits/system_primer/index.html +0 -26
  185. package/dist/ui_kits/terminal/app.js +0 -150
  186. package/dist/ui_kits/terminal/index.html +0 -26
  187. package/dist/vendor/webjsx/applyDiff.js +0 -182
  188. package/dist/vendor/webjsx/attributes.js +0 -154
  189. package/dist/vendor/webjsx/constants.js +0 -4
  190. package/dist/vendor/webjsx/createDOMElement.js +0 -52
  191. package/dist/vendor/webjsx/createElement.js +0 -75
  192. package/dist/vendor/webjsx/elementTags.js +0 -115
  193. package/dist/vendor/webjsx/factory.js +0 -6
  194. package/dist/vendor/webjsx/index.js +0 -6
  195. package/dist/vendor/webjsx/jsx-dev-runtime.js +0 -2
  196. package/dist/vendor/webjsx/jsx-runtime.js +0 -30
  197. package/dist/vendor/webjsx/jsx.js +0 -2
  198. package/dist/vendor/webjsx/package.json +0 -39
  199. package/dist/vendor/webjsx/renderSuspension.js +0 -25
  200. package/dist/vendor/webjsx/types.js +0 -5
  201. package/dist/vendor/webjsx/utils.js +0 -84
  202. package/src/components/overlays.js +0 -151
  203. package/src/components/surfaces.js +0 -399
  204. package/src/components/voice.js +0 -132
package/community.css CHANGED
@@ -1,2255 +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
- }
934
-
935
-
936
- /* ============================================================
937
- Overlays — toast, banner, mobile header, drawer, boot splash,
938
- context menu, command palette, emoji picker, reply bar.
939
- Added by overlays.js component surface.
940
- ============================================================ */
941
-
942
- /* ---- Toast ---- */
943
- .cm-toast {
944
- position: fixed;
945
- bottom: 24px;
946
- right: 24px;
947
- z-index: 1100;
948
- padding: 10px 14px;
949
- border-radius: var(--r-2);
950
- background: var(--bg-2);
951
- color: var(--fg);
952
- font-size: var(--fs-sm);
953
- box-shadow: 0 8px 24px color-mix(in oklab, var(--ink) 35%, transparent);
954
- display: inline-flex;
955
- align-items: center;
956
- gap: 8px;
957
- max-width: 360px;
958
- animation: cm-toast-in var(--dur-base) var(--ease);
959
- }
960
- @keyframes cm-toast-in {
961
- from { transform: translateY(8px); opacity: 0; }
962
- to { transform: translateY(0); opacity: 1; }
963
- }
964
- .cm-toast.tone-info { border-left: 3px solid var(--accent); }
965
- .cm-toast.tone-success { border-left: 3px solid var(--green-2); }
966
- .cm-toast.tone-warn { border-left: 3px solid var(--sun); }
967
- .cm-toast.tone-error { border-left: 3px solid var(--warn); }
968
-
969
- /* ---- Banner ---- */
970
- .cm-banner {
971
- display: flex;
972
- align-items: center;
973
- gap: 10px;
974
- padding: 8px 14px;
975
- background: var(--bg-2);
976
- color: var(--fg);
977
- font-size: var(--fs-sm);
978
- border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 25%, transparent);
979
- }
980
- .cm-banner-msg { flex: 1; min-width: 0; }
981
- .cm-banner.tone-info { background: color-mix(in oklab, var(--accent) 14%, var(--bg-2)); }
982
- .cm-banner.tone-success { background: color-mix(in oklab, var(--green-2) 14%, var(--bg-2)); }
983
- .cm-banner.tone-warn { background: color-mix(in oklab, var(--sun) 18%, var(--bg-2)); }
984
- .cm-banner.tone-error { background: color-mix(in oklab, var(--warn) 18%, var(--bg-2)); }
985
- .cm-banner-action,
986
- .cm-banner-dismiss {
987
- background: transparent;
988
- color: inherit;
989
- border: 1px solid color-mix(in oklab, var(--fg) 22%, transparent);
990
- border-radius: var(--r-1);
991
- padding: 4px 10px;
992
- cursor: pointer;
993
- font-size: var(--fs-xs);
994
- display: inline-flex;
995
- align-items: center;
996
- gap: 4px;
997
- transition: background var(--dur-snap) var(--ease);
998
- }
999
- .cm-banner-action:hover,
1000
- .cm-banner-dismiss:hover { background: color-mix(in oklab, var(--fg) 12%, transparent); }
1001
- .cm-banner-dismiss { border: none; padding: 4px 8px; }
1002
-
1003
- /* ---- Mobile header ---- */
1004
- .cm-mobile-header {
1005
- display: flex;
1006
- align-items: center;
1007
- gap: 10px;
1008
- padding: 8px 12px;
1009
- height: 48px;
1010
- background: var(--bg-2);
1011
- color: var(--fg);
1012
- border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 20%, transparent);
1013
- }
1014
- .cm-mh-btn {
1015
- background: transparent;
1016
- color: inherit;
1017
- border: none;
1018
- width: 36px;
1019
- height: 36px;
1020
- display: inline-flex;
1021
- align-items: center;
1022
- justify-content: center;
1023
- border-radius: var(--r-1);
1024
- cursor: pointer;
1025
- font-size: var(--fs-md);
1026
- transition: background var(--dur-snap) var(--ease);
1027
- }
1028
- .cm-mh-btn:hover { background: color-mix(in oklab, var(--fg) 10%, transparent); }
1029
- .cm-mh-title {
1030
- flex: 1;
1031
- min-width: 0;
1032
- font-weight: 600;
1033
- font-size: var(--fs-md);
1034
- overflow: hidden;
1035
- text-overflow: ellipsis;
1036
- white-space: nowrap;
1037
- }
1038
- @media (min-width: 769px) {
1039
- .cm-mobile-header { display: none; }
1040
- }
1041
-
1042
- /* ---- Drawer overlay ---- */
1043
- .cm-drawer-overlay {
1044
- position: fixed;
1045
- inset: 0;
1046
- z-index: 1000;
1047
- display: flex;
1048
- }
1049
- .cm-drawer-backdrop {
1050
- position: absolute;
1051
- inset: 0;
1052
- background: color-mix(in oklab, var(--ink) 55%, transparent);
1053
- animation: cm-fade-in var(--dur-base) var(--ease);
1054
- }
1055
- @keyframes cm-fade-in { from { opacity: 0 } to { opacity: 1 } }
1056
- .cm-drawer-content {
1057
- position: relative;
1058
- background: var(--bg);
1059
- color: var(--fg);
1060
- height: 100%;
1061
- width: min(320px, 86vw);
1062
- box-shadow: 0 0 24px color-mix(in oklab, var(--ink) 40%, transparent);
1063
- overflow-y: auto;
1064
- display: flex;
1065
- flex-direction: column;
1066
- animation: cm-drawer-in-l var(--dur-base) var(--ease);
1067
- }
1068
- .cm-drawer-content.side-left { margin-right: auto; }
1069
- .cm-drawer-content.side-right {
1070
- margin-left: auto;
1071
- animation-name: cm-drawer-in-r;
1072
- }
1073
- @keyframes cm-drawer-in-l { from { transform: translateX(-100%) } to { transform: translateX(0) } }
1074
- @keyframes cm-drawer-in-r { from { transform: translateX(100%) } to { transform: translateX(0) } }
1075
-
1076
- /* ---- Boot overlay ---- */
1077
- .cm-boot-overlay {
1078
- position: fixed;
1079
- inset: 0;
1080
- z-index: 1200;
1081
- background: var(--bg);
1082
- color: var(--fg);
1083
- display: flex;
1084
- flex-direction: column;
1085
- align-items: center;
1086
- justify-content: center;
1087
- gap: 16px;
1088
- padding: 24px;
1089
- }
1090
- .cm-boot-spinner {
1091
- width: 48px;
1092
- height: 48px;
1093
- border-radius: 50%;
1094
- border: 3px solid color-mix(in oklab, var(--fg) 14%, transparent);
1095
- border-top-color: var(--accent);
1096
- animation: cm-spin 0.9s linear infinite;
1097
- }
1098
- @keyframes cm-spin { to { transform: rotate(360deg); } }
1099
- .cm-boot-phase {
1100
- font-size: var(--fs-md);
1101
- color: var(--fg-2);
1102
- letter-spacing: var(--tr-tight);
1103
- }
1104
- .cm-boot-progress {
1105
- width: min(420px, 80vw);
1106
- height: 6px;
1107
- background: var(--bg-2);
1108
- border-radius: 999px;
1109
- overflow: hidden;
1110
- }
1111
- .cm-boot-bar {
1112
- height: 100%;
1113
- background: var(--accent);
1114
- transition: width var(--dur-base) var(--ease);
1115
- }
1116
- .cm-boot-error {
1117
- color: var(--warn);
1118
- font-size: var(--fs-sm);
1119
- max-width: 480px;
1120
- text-align: center;
1121
- }
1122
-
1123
- /* ---- Context menu ---- */
1124
- .cm-context-menu {
1125
- position: fixed;
1126
- z-index: 1300;
1127
- min-width: 180px;
1128
- padding: 4px;
1129
- background: var(--bg-2);
1130
- color: var(--fg);
1131
- border-radius: var(--r-2);
1132
- box-shadow: 0 8px 24px color-mix(in oklab, var(--ink) 45%, transparent);
1133
- animation: cm-fade-in var(--dur-snap) var(--ease);
1134
- }
1135
- .cm-cm-list { display: flex; flex-direction: column; gap: 1px; }
1136
- .cm-cm-item {
1137
- background: transparent;
1138
- color: inherit;
1139
- border: none;
1140
- text-align: left;
1141
- padding: 8px 10px;
1142
- border-radius: var(--r-1);
1143
- font-size: var(--fs-sm);
1144
- display: flex;
1145
- align-items: center;
1146
- gap: 8px;
1147
- cursor: pointer;
1148
- transition: background var(--dur-snap) var(--ease);
1149
- }
1150
- .cm-cm-item:hover { background: color-mix(in oklab, var(--accent) 24%, transparent); color: var(--fg); }
1151
- .cm-cm-item.danger { color: var(--warn); }
1152
- .cm-cm-item.danger:hover { background: color-mix(in oklab, var(--warn) 22%, transparent); color: var(--warn); }
1153
- .cm-cm-icon { width: 18px; display: inline-flex; justify-content: center; }
1154
- .cm-cm-label { flex: 1; min-width: 0; }
1155
- .cm-cm-sep {
1156
- height: 1px;
1157
- background: color-mix(in oklab, var(--fg-3) 22%, transparent);
1158
- margin: 4px 6px;
1159
- }
1160
-
1161
- /* ---- Command palette ---- */
1162
- .cm-command-palette-wrap {
1163
- position: fixed;
1164
- inset: 0;
1165
- z-index: 1400;
1166
- display: flex;
1167
- align-items: flex-start;
1168
- justify-content: center;
1169
- padding-top: 12vh;
1170
- }
1171
- .cm-command-palette-backdrop {
1172
- position: absolute;
1173
- inset: 0;
1174
- background: color-mix(in oklab, var(--ink) 50%, transparent);
1175
- }
1176
- .cm-command-palette {
1177
- position: relative;
1178
- width: min(560px, 92vw);
1179
- max-height: 60vh;
1180
- display: flex;
1181
- flex-direction: column;
1182
- background: var(--bg-2);
1183
- color: var(--fg);
1184
- border-radius: var(--r-2);
1185
- box-shadow: 0 16px 40px color-mix(in oklab, var(--ink) 45%, transparent);
1186
- overflow: hidden;
1187
- }
1188
- .cm-cp-input {
1189
- background: transparent;
1190
- border: none;
1191
- border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
1192
- color: var(--fg);
1193
- font-size: var(--fs-md);
1194
- padding: 14px 16px;
1195
- outline: none;
1196
- font-family: var(--ff-body);
1197
- }
1198
- .cm-cp-input::placeholder { color: var(--fg-3); }
1199
- .cm-cp-list {
1200
- flex: 1;
1201
- min-height: 0;
1202
- overflow-y: auto;
1203
- padding: 6px;
1204
- display: flex;
1205
- flex-direction: column;
1206
- gap: 1px;
1207
- }
1208
- .cm-cp-item {
1209
- background: transparent;
1210
- color: inherit;
1211
- border: none;
1212
- text-align: left;
1213
- padding: 10px 12px;
1214
- border-radius: var(--r-1);
1215
- font-size: var(--fs-sm);
1216
- display: flex;
1217
- align-items: center;
1218
- gap: 10px;
1219
- cursor: pointer;
1220
- transition: background var(--dur-snap) var(--ease);
1221
- }
1222
- .cm-cp-item:hover,
1223
- .cm-cp-item.selected {
1224
- background: color-mix(in oklab, var(--accent) 22%, transparent);
1225
- }
1226
- .cm-cp-icon { width: 20px; display: inline-flex; justify-content: center; }
1227
- .cm-cp-label { flex: 1; min-width: 0; }
1228
- .cm-cp-hint { color: var(--fg-3); font-size: var(--fs-xs); }
1229
-
1230
- /* ---- Emoji picker ---- */
1231
- .cm-emoji-picker {
1232
- width: min(340px, 92vw);
1233
- max-height: 360px;
1234
- background: var(--bg-2);
1235
- color: var(--fg);
1236
- border-radius: var(--r-2);
1237
- box-shadow: 0 12px 28px color-mix(in oklab, var(--ink) 40%, transparent);
1238
- display: flex;
1239
- flex-direction: column;
1240
- overflow: hidden;
1241
- }
1242
- .cm-ep-search {
1243
- background: var(--bg-3);
1244
- border: none;
1245
- color: var(--fg);
1246
- padding: 8px 10px;
1247
- font-size: var(--fs-sm);
1248
- margin: 8px;
1249
- border-radius: var(--r-1);
1250
- outline: none;
1251
- font-family: var(--ff-body);
1252
- }
1253
- .cm-ep-search::placeholder { color: var(--fg-3); }
1254
- .cm-ep-grid {
1255
- flex: 1;
1256
- min-height: 0;
1257
- overflow-y: auto;
1258
- padding: 4px 8px 8px;
1259
- display: grid;
1260
- grid-template-columns: repeat(8, 1fr);
1261
- gap: 2px;
1262
- }
1263
- .cm-ep-category {
1264
- grid-column: 1 / -1;
1265
- font-size: var(--fs-xs);
1266
- color: var(--fg-3);
1267
- text-transform: uppercase;
1268
- letter-spacing: var(--tr-wide);
1269
- padding: 6px 2px 2px;
1270
- }
1271
- .cm-ep-btn {
1272
- background: transparent;
1273
- border: none;
1274
- cursor: pointer;
1275
- font-size: 20px;
1276
- line-height: 1;
1277
- padding: 4px;
1278
- border-radius: var(--r-1);
1279
- transition: background var(--dur-snap) var(--ease);
1280
- }
1281
- .cm-ep-btn:hover { background: color-mix(in oklab, var(--fg) 12%, transparent); }
1282
-
1283
- /* ---- Reply bar ---- */
1284
- .cm-reply-bar {
1285
- display: flex;
1286
- align-items: center;
1287
- gap: 8px;
1288
- padding: 6px 12px;
1289
- background: var(--bg-2);
1290
- color: var(--fg-2);
1291
- font-size: var(--fs-xs);
1292
- border-top: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
1293
- }
1294
- .cm-rb-quote { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1295
- .cm-rb-label { color: var(--fg-3); }
1296
- .cm-rb-author { color: var(--accent); font-weight: 600; }
1297
- .cm-rb-msg { color: var(--fg-3); }
1298
- .cm-rb-cancel {
1299
- background: transparent;
1300
- color: var(--fg-3);
1301
- border: none;
1302
- cursor: pointer;
1303
- padding: 2px 6px;
1304
- border-radius: var(--r-1);
1305
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1306
- }
1307
- .cm-rb-cancel:hover { background: color-mix(in oklab, var(--warn) 18%, transparent); color: var(--warn); }
1308
-
1309
- /* ---- UserPanel extra buttons (active-toggle state) ---- */
1310
- .cm-user-controls .cm-user-btn.extra.active {
1311
- background: color-mix(in oklab, var(--accent) 28%, transparent);
1312
- color: var(--accent);
1313
- }
1314
-
1315
- /* ---- VoiceUser: video stream + quality dot ---- */
1316
- .cm-voice-user-video {
1317
- width: 100%;
1318
- height: 100%;
1319
- object-fit: cover;
1320
- display: block;
1321
- border-radius: 50%;
1322
- }
1323
- .cm-voice-user-avatar { position: relative; }
1324
- .cm-voice-user-quality {
1325
- position: absolute;
1326
- top: 2px;
1327
- right: 2px;
1328
- width: 10px;
1329
- height: 10px;
1330
- border-radius: 50%;
1331
- border: 2px solid var(--bg-2);
1332
- background: var(--fg-3);
1333
- }
1334
- .cm-voice-user-quality.q-excellent { background: var(--green-2); }
1335
- .cm-voice-user-quality.q-good { background: color-mix(in oklab, var(--green-2) 70%, var(--sun)); }
1336
- .cm-voice-user-quality.q-poor { background: var(--sun); }
1337
- .cm-voice-user-quality.q-lost { background: var(--warn); }
1338
- .cm-voice-user-quality.q-unknown { background: var(--fg-3); }
1339
-
1340
- /* =========================================================
1341
- Voice / audio / video components
1342
- ========================================================= */
1343
-
1344
- /* ---- PttButton ---- */
1345
- .cm-ptt-button {
1346
- display: inline-flex;
1347
- align-items: center;
1348
- gap: 8px;
1349
- padding: 8px 16px;
1350
- border-radius: 999px;
1351
- border: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
1352
- background: var(--bg-2);
1353
- color: var(--fg);
1354
- font-size: var(--fs-sm);
1355
- font-weight: 600;
1356
- cursor: pointer;
1357
- user-select: none;
1358
- transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease), transform var(--dur-snap) var(--ease);
1359
- }
1360
- .cm-ptt-button:hover { background: var(--bg-3); }
1361
- .cm-ptt-button:active { transform: scale(0.97); }
1362
- .cm-ptt-dot {
1363
- width: 10px; height: 10px; border-radius: 50%;
1364
- background: var(--fg-3);
1365
- transition: background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
1366
- }
1367
- .cm-ptt-button.idle .cm-ptt-dot { background: var(--fg-3); }
1368
- .cm-ptt-button.live {
1369
- background: color-mix(in oklab, var(--warn) 22%, var(--bg-2));
1370
- border-color: color-mix(in oklab, var(--warn) 60%, transparent);
1371
- color: var(--warn);
1372
- animation: cm-ptt-pulse 1.1s var(--ease) infinite;
1373
- }
1374
- .cm-ptt-button.live .cm-ptt-dot {
1375
- background: var(--warn);
1376
- box-shadow: 0 0 0 4px color-mix(in oklab, var(--warn) 30%, transparent);
1377
- }
1378
- .cm-ptt-button.queued {
1379
- background: color-mix(in oklab, var(--sun) 22%, var(--bg-2));
1380
- border-color: color-mix(in oklab, var(--sun) 60%, transparent);
1381
- color: var(--sun);
1382
- }
1383
- .cm-ptt-button.queued .cm-ptt-dot { background: var(--sun); }
1384
- .cm-ptt-button.realtime,
1385
- .cm-ptt-button.mode-realtime.realtime {
1386
- background: color-mix(in oklab, var(--green-2) 22%, var(--bg-2));
1387
- border-color: color-mix(in oklab, var(--green-2) 60%, transparent);
1388
- color: var(--green-2);
1389
- }
1390
- .cm-ptt-button.realtime .cm-ptt-dot {
1391
- background: var(--green-2);
1392
- box-shadow: 0 0 0 4px color-mix(in oklab, var(--green-2) 30%, transparent);
1393
- }
1394
- @keyframes cm-ptt-pulse {
1395
- 0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--warn) 40%, transparent); }
1396
- 50% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--warn) 0%, transparent); }
1397
- }
1398
-
1399
- /* ---- VadMeter ---- */
1400
- .cm-vad-meter {
1401
- display: inline-block;
1402
- position: relative;
1403
- background: var(--bg-3);
1404
- border-radius: var(--r-1);
1405
- overflow: hidden;
1406
- }
1407
- .cm-vad-track {
1408
- position: relative;
1409
- width: 100%;
1410
- height: 100%;
1411
- }
1412
- .cm-vad-bar {
1413
- position: absolute;
1414
- top: 0; left: 0; bottom: 0;
1415
- background: linear-gradient(90deg, var(--green-2), color-mix(in oklab, var(--green-2) 60%, var(--sun)));
1416
- transition: width 60ms linear;
1417
- }
1418
- .cm-vad-bar.active {
1419
- background: linear-gradient(90deg, var(--green-2), var(--sun));
1420
- }
1421
- .cm-vad-threshold {
1422
- position: absolute;
1423
- top: -2px; bottom: -2px;
1424
- width: 3px;
1425
- margin-left: -1px;
1426
- background: var(--fg);
1427
- border-radius: 2px;
1428
- pointer-events: none;
1429
- }
1430
- .cm-vad-hit {
1431
- position: absolute;
1432
- inset: 0;
1433
- cursor: ew-resize;
1434
- background: transparent;
1435
- }
1436
-
1437
- /* ---- WebcamPreview ---- */
1438
- .cm-webcam-preview {
1439
- display: flex;
1440
- flex-direction: column;
1441
- gap: 6px;
1442
- padding: 8px;
1443
- border-radius: var(--r-2);
1444
- background: var(--bg-2);
1445
- border: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
1446
- }
1447
- .cm-webcam-preview.disabled .cm-wc-video {
1448
- filter: grayscale(1) brightness(0.4);
1449
- }
1450
- .cm-wc-video {
1451
- width: 100%;
1452
- aspect-ratio: 4 / 3;
1453
- background: var(--bg-3);
1454
- border-radius: var(--r-1);
1455
- object-fit: cover;
1456
- display: block;
1457
- }
1458
- .cm-wc-controls {
1459
- display: flex;
1460
- gap: 6px;
1461
- align-items: center;
1462
- flex-wrap: wrap;
1463
- }
1464
- .cm-wc-select {
1465
- flex: 1;
1466
- min-width: 0;
1467
- background: var(--bg-3);
1468
- color: var(--fg);
1469
- border: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
1470
- border-radius: var(--r-1);
1471
- padding: 4px 6px;
1472
- font-size: var(--fs-xs);
1473
- cursor: pointer;
1474
- }
1475
- .cm-wc-toggle {
1476
- background: var(--bg-3);
1477
- color: var(--fg);
1478
- border: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
1479
- border-radius: var(--r-1);
1480
- padding: 4px 10px;
1481
- font-size: var(--fs-xs);
1482
- font-weight: 600;
1483
- cursor: pointer;
1484
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1485
- }
1486
- .cm-wc-toggle:hover { background: color-mix(in oklab, var(--accent) 18%, var(--bg-3)); }
1487
- .cm-wc-toggle.on {
1488
- background: color-mix(in oklab, var(--green-2) 22%, var(--bg-3));
1489
- color: var(--green-2);
1490
- border-color: color-mix(in oklab, var(--green-2) 50%, transparent);
1491
- }
1492
-
1493
- /* ---- AudioQueue ---- */
1494
- .cm-audio-queue {
1495
- display: flex;
1496
- flex-direction: column;
1497
- background: var(--bg-2);
1498
- border: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
1499
- border-radius: var(--r-2);
1500
- overflow: hidden;
1501
- }
1502
- .cm-aq-header {
1503
- display: flex;
1504
- align-items: center;
1505
- justify-content: space-between;
1506
- padding: 6px 10px;
1507
- background: var(--bg-3);
1508
- border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
1509
- }
1510
- .cm-aq-title {
1511
- font-size: var(--fs-xs);
1512
- font-weight: 600;
1513
- color: var(--fg-2);
1514
- text-transform: uppercase;
1515
- letter-spacing: 0.04em;
1516
- }
1517
- .cm-aq-pause {
1518
- background: transparent;
1519
- color: var(--fg);
1520
- border: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
1521
- border-radius: var(--r-1);
1522
- padding: 2px 8px;
1523
- cursor: pointer;
1524
- font-size: var(--fs-xs);
1525
- }
1526
- .cm-aq-pause:hover { background: color-mix(in oklab, var(--accent) 18%, transparent); }
1527
- .cm-aq-list { display: flex; flex-direction: column; max-height: 240px; overflow-y: auto; }
1528
- .cm-aq-item {
1529
- display: flex;
1530
- align-items: center;
1531
- gap: 8px;
1532
- padding: 6px 10px;
1533
- border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 10%, transparent);
1534
- font-size: var(--fs-sm);
1535
- color: var(--fg);
1536
- }
1537
- .cm-aq-item:last-child { border-bottom: none; }
1538
- .cm-aq-item.current { background: color-mix(in oklab, var(--accent) 12%, transparent); }
1539
- .cm-aq-item.live { background: color-mix(in oklab, var(--warn) 14%, transparent); }
1540
- .cm-aq-dot {
1541
- width: 8px; height: 8px;
1542
- border-radius: 50%;
1543
- background: var(--fg-3);
1544
- flex: 0 0 auto;
1545
- }
1546
- .cm-aq-speaker { flex: 1; font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1547
- .cm-aq-dur { color: var(--fg-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
1548
- .cm-aq-live-tag {
1549
- font-size: 10px;
1550
- font-weight: 700;
1551
- color: var(--warn);
1552
- background: color-mix(in oklab, var(--warn) 18%, transparent);
1553
- padding: 1px 6px;
1554
- border-radius: 999px;
1555
- letter-spacing: 0.06em;
1556
- }
1557
- .cm-aq-replay, .cm-aq-skip {
1558
- background: transparent;
1559
- color: var(--fg-2);
1560
- border: none;
1561
- padding: 2px 6px;
1562
- border-radius: var(--r-1);
1563
- cursor: pointer;
1564
- font-size: var(--fs-sm);
1565
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1566
- }
1567
- .cm-aq-replay:hover { background: color-mix(in oklab, var(--accent) 18%, transparent); color: var(--accent); }
1568
- .cm-aq-skip:hover { background: color-mix(in oklab, var(--warn) 18%, transparent); color: var(--warn); }
1569
-
1570
- /* ---- VoiceControls ---- */
1571
- .cm-voice-controls {
1572
- display: inline-flex;
1573
- align-items: center;
1574
- gap: 4px;
1575
- padding: 4px;
1576
- background: var(--bg-2);
1577
- border: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
1578
- border-radius: var(--r-2);
1579
- }
1580
- .cm-vc-btn {
1581
- background: transparent;
1582
- color: var(--fg);
1583
- border: none;
1584
- padding: 6px 10px;
1585
- border-radius: var(--r-1);
1586
- cursor: pointer;
1587
- font-size: var(--fs-sm);
1588
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1589
- }
1590
- .cm-vc-btn:hover { background: var(--bg-3); }
1591
- .cm-vc-btn.muted {
1592
- background: color-mix(in oklab, var(--warn) 18%, transparent);
1593
- color: var(--warn);
1594
- }
1595
- .cm-vc-btn.deafened {
1596
- background: color-mix(in oklab, var(--warn) 22%, transparent);
1597
- color: var(--warn);
1598
- }
1599
- .cm-vc-btn.active {
1600
- background: color-mix(in oklab, var(--green-2) 22%, transparent);
1601
- color: var(--green-2);
1602
- }
1603
- .cm-vc-btn.danger {
1604
- color: var(--warn);
1605
- }
1606
- .cm-vc-btn.danger:hover {
1607
- background: color-mix(in oklab, var(--warn) 22%, transparent);
1608
- }
1609
-
1610
- /* ---- MicMonitor ---- */
1611
- .cm-mic-monitor {
1612
- display: flex;
1613
- flex-direction: column;
1614
- gap: 4px;
1615
- padding: 6px 8px;
1616
- background: var(--bg-2);
1617
- border: 1px solid color-mix(in oklab, var(--fg-3) 18%, transparent);
1618
- border-radius: var(--r-1);
1619
- }
1620
- .cm-mm-label {
1621
- font-size: var(--fs-xs);
1622
- color: var(--fg-3);
1623
- text-transform: uppercase;
1624
- letter-spacing: 0.04em;
1625
- }
1626
- .cm-mm-row {
1627
- display: flex;
1628
- align-items: center;
1629
- gap: 6px;
1630
- height: 10px;
1631
- }
1632
- .cm-mm-cap {
1633
- font-size: 10px;
1634
- color: var(--fg-3);
1635
- width: 32px;
1636
- flex: 0 0 auto;
1637
- }
1638
- .cm-mm-bar {
1639
- height: 6px;
1640
- border-radius: 3px;
1641
- background: var(--fg-3);
1642
- transition: width 60ms linear;
1643
- min-width: 0;
1644
- }
1645
- .cm-mm-bar.raw { background: linear-gradient(90deg, var(--fg-3), var(--sun)); }
1646
- .cm-mm-bar.processed { background: linear-gradient(90deg, var(--green-2), var(--accent)); }
1647
-
1648
- /* ---- VideoLightbox ---- */
1649
- .cm-video-lightbox {
1650
- position: fixed;
1651
- inset: 0;
1652
- z-index: 1000;
1653
- display: flex;
1654
- align-items: center;
1655
- justify-content: center;
1656
- }
1657
- .cm-vl-backdrop {
1658
- position: absolute;
1659
- inset: 0;
1660
- background: color-mix(in oklab, var(--bg) 80%, black);
1661
- backdrop-filter: blur(6px);
1662
- cursor: pointer;
1663
- }
1664
- .cm-vl-content {
1665
- position: relative;
1666
- background: var(--bg-2);
1667
- border: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
1668
- border-radius: var(--r-2);
1669
- padding: 16px;
1670
- max-width: 90vw;
1671
- max-height: 90vh;
1672
- display: flex;
1673
- flex-direction: column;
1674
- gap: 8px;
1675
- }
1676
- .cm-vl-close {
1677
- position: absolute;
1678
- top: 8px; right: 8px;
1679
- background: var(--bg-3);
1680
- color: var(--fg);
1681
- border: none;
1682
- width: 28px;
1683
- height: 28px;
1684
- border-radius: 50%;
1685
- cursor: pointer;
1686
- font-size: var(--fs-sm);
1687
- }
1688
- .cm-vl-close:hover { background: color-mix(in oklab, var(--warn) 28%, var(--bg-3)); color: var(--warn); }
1689
- .cm-vl-label {
1690
- font-size: var(--fs-sm);
1691
- color: var(--fg-2);
1692
- font-weight: 600;
1693
- }
1694
- .cm-vl-video {
1695
- max-width: 86vw;
1696
- max-height: 80vh;
1697
- background: black;
1698
- border-radius: var(--r-1);
1699
- display: block;
1700
- }
1701
-
1702
- /* ============================================================
1703
- Surfaces — modals + popovers + thread panel + forum + page
1704
- ============================================================ */
1705
-
1706
- .cm-modal-backdrop {
1707
- position: fixed;
1708
- inset: 0;
1709
- background: rgba(0, 0, 0, 0.55);
1710
- display: flex;
1711
- align-items: center;
1712
- justify-content: center;
1713
- z-index: 1000;
1714
- }
1715
- .cm-modal-backdrop.transparent { background: transparent; }
1716
-
1717
- /* Thread panel */
1718
- .cm-thread-panel {
1719
- display: flex;
1720
- flex-direction: column;
1721
- width: 280px;
1722
- min-width: 220px;
1723
- background: var(--bg-2);
1724
- color: var(--fg);
1725
- border-left: 1px solid var(--bg-3);
1726
- height: 100%;
1727
- overflow: hidden;
1728
- }
1729
- .cm-tp-header {
1730
- display: flex;
1731
- align-items: center;
1732
- justify-content: space-between;
1733
- padding: 10px 12px;
1734
- background: var(--bg-3);
1735
- font-weight: 600;
1736
- font-size: var(--fs-sm);
1737
- }
1738
- .cm-tp-title { flex: 1; }
1739
- .cm-tp-header-actions { display: flex; gap: 4px; }
1740
- .cm-tp-new,
1741
- .cm-tp-close {
1742
- background: transparent;
1743
- color: var(--fg-2);
1744
- border: 0;
1745
- border-radius: 4px;
1746
- width: 24px;
1747
- height: 24px;
1748
- cursor: pointer;
1749
- font-size: 14px;
1750
- }
1751
- .cm-tp-new:hover,
1752
- .cm-tp-close:hover { background: var(--bg-2); color: var(--fg); }
1753
- .cm-tp-list { flex: 1; overflow-y: auto; padding: 4px 0; }
1754
- .cm-tp-item {
1755
- position: relative;
1756
- padding: 8px 12px;
1757
- cursor: pointer;
1758
- border-left: 2px solid transparent;
1759
- color: var(--fg-2);
1760
- }
1761
- .cm-tp-item:hover { background: var(--bg-3); color: var(--fg); }
1762
- .cm-tp-item.active {
1763
- background: var(--bg-3);
1764
- border-left-color: var(--accent);
1765
- color: var(--fg);
1766
- }
1767
- .cm-tp-item.unread { color: var(--fg); }
1768
- .cm-tp-item-row {
1769
- display: flex;
1770
- justify-content: space-between;
1771
- gap: 8px;
1772
- align-items: baseline;
1773
- }
1774
- .cm-tp-item-title {
1775
- font-weight: 600;
1776
- font-size: var(--fs-sm);
1777
- overflow: hidden;
1778
- text-overflow: ellipsis;
1779
- white-space: nowrap;
1780
- flex: 1;
1781
- }
1782
- .cm-tp-item-time { font-size: var(--fs-xs); color: var(--fg-3); }
1783
- .cm-tp-item-msg {
1784
- font-size: var(--fs-xs);
1785
- color: var(--fg-3);
1786
- overflow: hidden;
1787
- text-overflow: ellipsis;
1788
- white-space: nowrap;
1789
- margin-top: 2px;
1790
- }
1791
- .cm-tp-item-author { color: var(--fg-2); }
1792
- .cm-tp-item-dot {
1793
- position: absolute;
1794
- top: 12px;
1795
- right: 8px;
1796
- width: 8px;
1797
- height: 8px;
1798
- border-radius: 50%;
1799
- background: var(--accent);
1800
- }
1801
-
1802
- /* Forum view */
1803
- .cm-forum-view {
1804
- display: flex;
1805
- flex-direction: column;
1806
- flex: 1;
1807
- min-height: 0;
1808
- background: var(--bg);
1809
- }
1810
- .cm-fv-toolbar {
1811
- display: flex;
1812
- gap: 8px;
1813
- padding: 10px 12px;
1814
- background: var(--bg-2);
1815
- align-items: center;
1816
- }
1817
- .cm-fv-search {
1818
- flex: 1;
1819
- padding: 6px 10px;
1820
- background: var(--bg-3);
1821
- border: 0;
1822
- border-radius: 4px;
1823
- color: var(--fg);
1824
- font-size: var(--fs-sm);
1825
- outline: none;
1826
- }
1827
- .cm-fv-search:focus { background: var(--bg); box-shadow: inset 0 0 0 1px var(--accent); }
1828
- .cm-fv-sort {
1829
- padding: 6px 8px;
1830
- background: var(--bg-3);
1831
- color: var(--fg);
1832
- border: 0;
1833
- border-radius: 4px;
1834
- font-size: var(--fs-sm);
1835
- }
1836
- .cm-fv-new {
1837
- padding: 6px 12px;
1838
- background: var(--accent);
1839
- color: var(--fg);
1840
- border: 0;
1841
- border-radius: 4px;
1842
- cursor: pointer;
1843
- font-size: var(--fs-sm);
1844
- font-weight: 600;
1845
- }
1846
- .cm-fv-new:hover { filter: brightness(1.1); }
1847
- .cm-fv-list { flex: 1; overflow-y: auto; padding: 8px 12px; }
1848
- .cm-fv-post {
1849
- padding: 10px 12px;
1850
- margin-bottom: 6px;
1851
- background: var(--bg-2);
1852
- border-radius: 6px;
1853
- cursor: pointer;
1854
- border-left: 3px solid transparent;
1855
- }
1856
- .cm-fv-post:hover { background: var(--bg-3); border-left-color: var(--accent); }
1857
- .cm-fv-post-head {
1858
- display: flex;
1859
- justify-content: space-between;
1860
- gap: 8px;
1861
- align-items: baseline;
1862
- }
1863
- .cm-fv-post-title {
1864
- font-weight: 600;
1865
- color: var(--fg);
1866
- flex: 1;
1867
- overflow: hidden;
1868
- text-overflow: ellipsis;
1869
- white-space: nowrap;
1870
- }
1871
- .cm-fv-post-meta {
1872
- display: flex;
1873
- gap: 8px;
1874
- font-size: var(--fs-xs);
1875
- color: var(--fg-3);
1876
- }
1877
- .cm-fv-post-author { color: var(--fg-2); }
1878
- .cm-fv-post-snippet {
1879
- margin-top: 4px;
1880
- color: var(--fg-2);
1881
- font-size: var(--fs-sm);
1882
- overflow: hidden;
1883
- display: -webkit-box;
1884
- -webkit-line-clamp: 2;
1885
- -webkit-box-orient: vertical;
1886
- }
1887
- .cm-fv-post-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
1888
- .cm-fv-post-tag {
1889
- padding: 2px 8px;
1890
- background: var(--bg-3);
1891
- border-radius: 10px;
1892
- font-size: var(--fs-xs);
1893
- color: var(--fg-2);
1894
- }
1895
-
1896
- /* Page view */
1897
- .cm-page-view {
1898
- flex: 1;
1899
- display: flex;
1900
- flex-direction: column;
1901
- overflow-y: auto;
1902
- background: var(--bg);
1903
- padding: 20px 28px;
1904
- }
1905
- .cm-pv-head {
1906
- display: flex;
1907
- align-items: center;
1908
- justify-content: space-between;
1909
- margin-bottom: 16px;
1910
- border-bottom: 1px solid var(--bg-3);
1911
- padding-bottom: 12px;
1912
- }
1913
- .cm-pv-title {
1914
- margin: 0;
1915
- font-size: var(--fs-xl);
1916
- font-weight: 700;
1917
- color: var(--fg);
1918
- }
1919
- .cm-pv-edit {
1920
- padding: 6px 12px;
1921
- background: var(--bg-3);
1922
- color: var(--fg);
1923
- border: 0;
1924
- border-radius: 4px;
1925
- cursor: pointer;
1926
- font-size: var(--fs-sm);
1927
- }
1928
- .cm-pv-edit:hover { background: var(--accent); }
1929
- .cm-pv-content {
1930
- color: var(--fg);
1931
- font-size: var(--fs-md);
1932
- line-height: 1.6;
1933
- max-width: 760px;
1934
- }
1935
-
1936
- /* Auth modal */
1937
- .cm-auth-modal {
1938
- background: var(--bg-2);
1939
- color: var(--fg);
1940
- border-radius: 8px;
1941
- min-width: 380px;
1942
- max-width: 92vw;
1943
- display: flex;
1944
- flex-direction: column;
1945
- overflow: hidden;
1946
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
1947
- }
1948
- .cm-am-head {
1949
- display: flex;
1950
- align-items: center;
1951
- justify-content: space-between;
1952
- padding: 12px 16px;
1953
- background: var(--bg-3);
1954
- }
1955
- .cm-am-title { font-weight: 700; font-size: var(--fs-md); }
1956
- .cm-am-close {
1957
- background: transparent;
1958
- color: var(--fg-2);
1959
- border: 0;
1960
- width: 28px;
1961
- height: 28px;
1962
- border-radius: 4px;
1963
- cursor: pointer;
1964
- font-size: 15px;
1965
- }
1966
- .cm-am-close:hover { background: var(--bg-2); color: var(--fg); }
1967
- .cm-am-tabs {
1968
- display: flex;
1969
- background: var(--bg-3);
1970
- padding: 0 8px;
1971
- gap: 4px;
1972
- }
1973
- .cm-am-tab {
1974
- flex: 1;
1975
- padding: 8px 10px;
1976
- background: transparent;
1977
- color: var(--fg-2);
1978
- border: 0;
1979
- border-bottom: 2px solid transparent;
1980
- cursor: pointer;
1981
- font-size: var(--fs-sm);
1982
- }
1983
- .cm-am-tab:hover { color: var(--fg); }
1984
- .cm-am-tab.active {
1985
- color: var(--fg);
1986
- border-bottom-color: var(--accent);
1987
- font-weight: 600;
1988
- }
1989
- .cm-am-pane {
1990
- padding: 16px;
1991
- display: flex;
1992
- flex-direction: column;
1993
- gap: 10px;
1994
- }
1995
- .cm-am-text {
1996
- margin: 0;
1997
- color: var(--fg-2);
1998
- font-size: var(--fs-sm);
1999
- line-height: 1.5;
2000
- }
2001
- .cm-am-warn {
2002
- padding: 8px 10px;
2003
- background: var(--bg-3);
2004
- border-left: 3px solid var(--warn);
2005
- color: var(--fg);
2006
- font-size: var(--fs-xs);
2007
- border-radius: 4px;
2008
- }
2009
- .cm-am-textarea {
2010
- width: 100%;
2011
- padding: 8px 10px;
2012
- background: var(--bg-3);
2013
- color: var(--fg);
2014
- border: 0;
2015
- border-radius: 4px;
2016
- resize: vertical;
2017
- font-family: var(--ff-mono);
2018
- font-size: var(--fs-sm);
2019
- outline: none;
2020
- }
2021
- .cm-am-textarea:focus { box-shadow: inset 0 0 0 1px var(--accent); }
2022
- .cm-am-btn {
2023
- padding: 8px 14px;
2024
- background: var(--accent);
2025
- color: var(--fg);
2026
- border: 0;
2027
- border-radius: 4px;
2028
- cursor: pointer;
2029
- font-weight: 600;
2030
- font-size: var(--fs-sm);
2031
- }
2032
- .cm-am-btn:hover { filter: brightness(1.1); }
2033
- .cm-am-btn:disabled { opacity: 0.6; cursor: not-allowed; }
2034
- .cm-am-error {
2035
- margin: 0 16px 16px;
2036
- padding: 8px 10px;
2037
- background: var(--bg-3);
2038
- border-left: 3px solid var(--warn);
2039
- color: var(--warn);
2040
- font-size: var(--fs-xs);
2041
- border-radius: 4px;
2042
- }
2043
-
2044
- /* Settings popover */
2045
- .cm-settings-popover {
2046
- position: absolute;
2047
- background: var(--bg-2);
2048
- color: var(--fg);
2049
- border-radius: 6px;
2050
- min-width: 260px;
2051
- max-width: 360px;
2052
- max-height: 70vh;
2053
- overflow-y: auto;
2054
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
2055
- padding: 4px 0;
2056
- }
2057
- .cm-sp-head {
2058
- display: flex;
2059
- align-items: center;
2060
- justify-content: space-between;
2061
- padding: 8px 12px;
2062
- background: var(--bg-3);
2063
- }
2064
- .cm-sp-title { font-weight: 600; font-size: var(--fs-sm); }
2065
- .cm-sp-close {
2066
- background: transparent;
2067
- color: var(--fg-2);
2068
- border: 0;
2069
- width: 22px;
2070
- height: 22px;
2071
- border-radius: 4px;
2072
- cursor: pointer;
2073
- }
2074
- .cm-sp-close:hover { background: var(--bg-2); color: var(--fg); }
2075
- .cm-sp-section {
2076
- padding: 6px 0;
2077
- border-bottom: 1px solid var(--bg-3);
2078
- }
2079
- .cm-sp-section:last-child { border-bottom: 0; }
2080
- .cm-sp-section-label {
2081
- padding: 4px 12px;
2082
- font-size: var(--fs-xs);
2083
- color: var(--fg-3);
2084
- text-transform: uppercase;
2085
- letter-spacing: var(--tr-wide);
2086
- }
2087
- .cm-sp-header {
2088
- padding: 6px 12px;
2089
- font-weight: 600;
2090
- font-size: var(--fs-xs);
2091
- color: var(--fg-3);
2092
- text-transform: uppercase;
2093
- }
2094
- .cm-sp-text {
2095
- padding: 4px 12px;
2096
- font-size: var(--fs-xs);
2097
- color: var(--fg-3);
2098
- }
2099
- .cm-sp-row {
2100
- display: flex;
2101
- align-items: center;
2102
- justify-content: space-between;
2103
- gap: 8px;
2104
- padding: 6px 12px;
2105
- font-size: var(--fs-sm);
2106
- }
2107
- .cm-sp-row:hover { background: var(--bg-3); }
2108
- .cm-sp-row-label { color: var(--fg); }
2109
- .cm-sp-toggle input[type="checkbox"] { cursor: pointer; }
2110
- .cm-sp-select select {
2111
- background: var(--bg-3);
2112
- color: var(--fg);
2113
- border: 0;
2114
- border-radius: 4px;
2115
- padding: 3px 6px;
2116
- font-size: var(--fs-sm);
2117
- }
2118
- .cm-sp-btn {
2119
- flex: 1;
2120
- padding: 6px 10px;
2121
- background: var(--bg-3);
2122
- color: var(--fg);
2123
- border: 0;
2124
- border-radius: 4px;
2125
- cursor: pointer;
2126
- font-size: var(--fs-sm);
2127
- }
2128
- .cm-sp-btn:hover { background: var(--accent); }
2129
- .cm-sp-btn.danger { color: var(--warn); }
2130
- .cm-sp-btn.danger:hover { background: var(--warn); color: var(--bg); }
2131
-
2132
- /* Voice settings modal */
2133
- .cm-voice-settings-modal {
2134
- background: var(--bg-2);
2135
- color: var(--fg);
2136
- border-radius: 8px;
2137
- min-width: 440px;
2138
- max-width: 92vw;
2139
- max-height: 88vh;
2140
- display: flex;
2141
- flex-direction: column;
2142
- overflow: hidden;
2143
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2144
- }
2145
- .cm-vsm-head {
2146
- display: flex;
2147
- align-items: center;
2148
- justify-content: space-between;
2149
- padding: 12px 16px;
2150
- background: var(--bg-3);
2151
- flex: 0 0 auto;
2152
- }
2153
- .cm-vsm-title { font-weight: 700; font-size: var(--fs-md); }
2154
- .cm-vsm-close {
2155
- background: transparent;
2156
- color: var(--fg-2);
2157
- border: 0;
2158
- width: 28px;
2159
- height: 28px;
2160
- border-radius: 4px;
2161
- cursor: pointer;
2162
- font-size: 15px;
2163
- }
2164
- .cm-vsm-close:hover { background: var(--bg-2); color: var(--fg); }
2165
- .cm-vsm-section {
2166
- padding: 10px 16px;
2167
- border-bottom: 1px solid var(--bg-3);
2168
- overflow-y: auto;
2169
- }
2170
- .cm-vsm-section:last-of-type { border-bottom: 0; }
2171
- .cm-vsm-section-label {
2172
- font-size: var(--fs-xs);
2173
- color: var(--fg-3);
2174
- text-transform: uppercase;
2175
- letter-spacing: var(--tr-wide);
2176
- margin-bottom: 6px;
2177
- font-weight: 600;
2178
- }
2179
- .cm-vsm-row {
2180
- display: flex;
2181
- align-items: center;
2182
- gap: 10px;
2183
- padding: 6px 0;
2184
- font-size: var(--fs-sm);
2185
- }
2186
- .cm-vsm-row-label { flex: 0 0 140px; color: var(--fg); }
2187
- .cm-vsm-row select,
2188
- .cm-vsm-row input[type="range"] { flex: 1; }
2189
- .cm-vsm-row select {
2190
- background: var(--bg-3);
2191
- color: var(--fg);
2192
- border: 0;
2193
- border-radius: 4px;
2194
- padding: 4px 8px;
2195
- font-size: var(--fs-sm);
2196
- }
2197
- .cm-vsm-row-val {
2198
- flex: 0 0 64px;
2199
- text-align: right;
2200
- color: var(--fg-2);
2201
- font-size: var(--fs-xs);
2202
- font-family: var(--ff-mono);
2203
- }
2204
- .cm-vsm-toggle input[type="checkbox"] { cursor: pointer; }
2205
- .cm-vsm-radio {
2206
- display: flex;
2207
- gap: 4px;
2208
- flex: 1;
2209
- flex-wrap: wrap;
2210
- }
2211
- .cm-vsm-radio-btn {
2212
- padding: 6px 12px;
2213
- background: var(--bg-3);
2214
- color: var(--fg-2);
2215
- border: 0;
2216
- border-radius: 4px;
2217
- cursor: pointer;
2218
- font-size: var(--fs-sm);
2219
- }
2220
- .cm-vsm-radio-btn:hover { color: var(--fg); }
2221
- .cm-vsm-radio-btn.active {
2222
- background: var(--accent);
2223
- color: var(--fg);
2224
- font-weight: 600;
2225
- }
2226
- .cm-vsm-admin { background: var(--bg); }
2227
- .cm-vsm-actions {
2228
- display: flex;
2229
- justify-content: flex-end;
2230
- gap: 8px;
2231
- padding: 12px 16px;
2232
- background: var(--bg-3);
2233
- flex: 0 0 auto;
2234
- }
2235
- .cm-vsm-cancel {
2236
- padding: 8px 16px;
2237
- background: transparent;
2238
- color: var(--fg-2);
2239
- border: 0;
2240
- border-radius: 4px;
2241
- cursor: pointer;
2242
- font-size: var(--fs-sm);
2243
- }
2244
- .cm-vsm-cancel:hover { background: var(--bg-2); color: var(--fg); }
2245
- .cm-vsm-save {
2246
- padding: 8px 16px;
2247
- background: var(--green-2);
2248
- color: var(--fg);
2249
- border: 0;
2250
- border-radius: 4px;
2251
- cursor: pointer;
2252
- font-size: var(--fs-sm);
2253
- font-weight: 600;
2254
- }
2255
- .cm-vsm-save:hover { filter: brightness(1.1); }
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
+ }