anentrypoint-design 0.0.121 → 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 (202) 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 +817 -1222
  5. package/dist/247420.css +2202 -2084
  6. package/dist/247420.js +13 -13
  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 -57
  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
package/community.css CHANGED
@@ -1,1338 +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
1
  /* ============================================================
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.
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.
940
5
  ============================================================ */
941
6
 
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);
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);
951
16
  color: var(--fg);
17
+ font-family: var(--ff-body);
952
18
  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
19
  }
960
- @keyframes cm-toast-in {
961
- from { transform: translateY(8px); opacity: 0; }
962
- to { transform: translateY(0); opacity: 1; }
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;
963
29
  }
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
30
 
969
- /* ---- Banner ---- */
970
- .cm-banner {
31
+ /* ============================================================
32
+ Server rail — thin vertical column, leftmost
33
+ ============================================================ */
34
+ .cm-server-rail {
35
+ flex: 0 0 72px;
36
+ width: 72px;
971
37
  display: flex;
38
+ flex-direction: column;
972
39
  align-items: center;
973
- gap: 10px;
974
- padding: 8px 14px;
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);
975
54
  background: var(--bg-2);
976
55
  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;
56
+ display: flex;
995
57
  align-items: center;
996
- gap: 4px;
997
- transition: background var(--dur-snap) var(--ease);
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);
998
88
  }
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
89
 
1003
- /* ---- Mobile header ---- */
1004
- .cm-mobile-header {
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);
1005
117
  display: flex;
1006
118
  align-items: center;
1007
- gap: 10px;
1008
- padding: 8px 12px;
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;
1009
126
  height: 48px;
127
+ border-radius: var(--r-3);
1010
128
  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;
129
+ color: var(--green-2);
130
+ display: flex;
1021
131
  align-items: center;
1022
132
  justify-content: center;
1023
- border-radius: var(--r-1);
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;
1024
183
  cursor: pointer;
1025
- font-size: var(--fs-md);
1026
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));
1027
190
  }
1028
- .cm-mh-btn:hover { background: color-mix(in oklab, var(--fg) 10%, transparent); }
1029
- .cm-mh-title {
191
+ .cm-server-header-name {
1030
192
  flex: 1;
1031
193
  min-width: 0;
1032
- font-weight: 600;
1033
- font-size: var(--fs-md);
1034
194
  overflow: hidden;
1035
195
  text-overflow: ellipsis;
1036
196
  white-space: nowrap;
1037
197
  }
1038
- @media (min-width: 769px) {
1039
- .cm-mobile-header { display: none; }
1040
- }
1041
198
 
1042
- /* ---- Drawer overlay ---- */
1043
- .cm-drawer-overlay {
1044
- position: fixed;
1045
- inset: 0;
1046
- z-index: 1000;
199
+ .cm-channel-list {
200
+ flex: 1;
201
+ min-height: 0;
202
+ overflow-y: auto;
203
+ overflow-x: hidden;
204
+ padding: 8px 0 16px;
1047
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;
1048
210
  }
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);
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;
1054
216
  }
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;
217
+
218
+ /* ============================================================
219
+ Channel category — collapsible group header
220
+ ============================================================ */
221
+ .cm-channel-category {
1064
222
  display: flex;
1065
223
  flex-direction: column;
1066
- animation: cm-drawer-in-l var(--dur-base) var(--ease);
224
+ margin-top: 12px;
1067
225
  }
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;
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);
1072
242
  }
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) } }
243
+ .cm-category-header:hover { color: var(--fg); }
244
+ .cm-category-header:hover .cm-cat-add { opacity: 1; }
1075
245
 
1076
- /* ---- Boot overlay ---- */
1077
- .cm-boot-overlay {
1078
- position: fixed;
1079
- inset: 0;
1080
- z-index: 1200;
1081
- background: var(--bg);
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 {
1082
290
  color: var(--fg);
291
+ background: color-mix(in oklab, var(--fg) 8%, transparent);
292
+ }
293
+
294
+ .cm-cat-channels {
1083
295
  display: flex;
1084
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;
1085
362
  align-items: center;
1086
363
  justify-content: center;
1087
- gap: 16px;
1088
- padding: 24px;
364
+ font-family: var(--ff-mono);
365
+ font-size: var(--fs-sm);
366
+ color: var(--fg-3);
367
+ opacity: 0.85;
1089
368
  }
1090
- .cm-boot-spinner {
1091
- width: 48px;
1092
- height: 48px;
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;
1093
374
  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;
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;
1097
379
  }
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);
380
+ @keyframes cm-spin {
381
+ to { transform: rotate(360deg); }
1103
382
  }
1104
- .cm-boot-progress {
1105
- width: min(420px, 80vw);
1106
- height: 6px;
1107
- background: var(--bg-2);
1108
- border-radius: 999px;
383
+
384
+ .cm-ch-name {
385
+ flex: 1;
386
+ min-width: 0;
1109
387
  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);
388
+ text-overflow: ellipsis;
389
+ white-space: nowrap;
1118
390
  font-size: var(--fs-sm);
1119
- max-width: 480px;
1120
- text-align: center;
1121
391
  }
1122
392
 
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);
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;
1134
408
  }
1135
- .cm-cm-list { display: flex; flex-direction: column; gap: 1px; }
1136
- .cm-cm-item {
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;
1137
426
  background: transparent;
1138
- color: inherit;
1139
- border: none;
1140
- text-align: left;
1141
- padding: 8px 10px;
427
+ border: 0;
428
+ color: var(--fg-3);
429
+ cursor: pointer;
1142
430
  border-radius: var(--r-1);
1143
- font-size: var(--fs-sm);
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 {
1144
448
  display: flex;
1145
449
  align-items: center;
1146
450
  gap: 8px;
451
+ padding: 3px 6px;
452
+ border-radius: var(--r-1);
453
+ color: var(--fg-2);
454
+ font-size: var(--fs-xs);
1147
455
  cursor: pointer;
1148
- transition: background var(--dur-snap) var(--ease);
456
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1149
457
  }
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;
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);
1159
467
  }
1160
468
 
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;
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;
1168
478
  justify-content: center;
1169
- padding-top: 12vh;
479
+ font-size: 10px;
480
+ font-weight: 600;
481
+ overflow: hidden;
482
+ transition: box-shadow var(--dur-snap) var(--ease);
1170
483
  }
1171
- .cm-command-palette-backdrop {
1172
- position: absolute;
1173
- inset: 0;
1174
- background: color-mix(in oklab, var(--ink) 50%, transparent);
484
+ .cm-ch-voice-user-avatar img {
485
+ width: 100%;
486
+ height: 100%;
487
+ object-fit: cover;
488
+ display: block;
1175
489
  }
1176
- .cm-command-palette {
1177
- position: relative;
1178
- width: min(560px, 92vw);
1179
- max-height: 60vh;
1180
- display: flex;
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;
1181
504
  flex-direction: column;
1182
- background: var(--bg-2);
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;
1183
542
  color: var(--fg);
1184
- border-radius: var(--r-2);
1185
- box-shadow: 0 16px 40px color-mix(in oklab, var(--ink) 45%, transparent);
1186
543
  overflow: hidden;
544
+ text-overflow: ellipsis;
545
+ white-space: nowrap;
1187
546
  }
1188
- .cm-cp-input {
1189
- background: transparent;
1190
- border: none;
1191
- border-bottom: 1px solid color-mix(in oklab, var(--fg-3) 22%, transparent);
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);
1192
564
  color: var(--fg);
1193
- font-size: var(--fs-md);
1194
- padding: 14px 16px;
1195
- outline: none;
565
+ border: 0;
566
+ border-radius: var(--r-1);
1196
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);
1197
579
  }
1198
- .cm-cp-input::placeholder { color: var(--fg-3); }
1199
- .cm-cp-list {
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 {
1200
630
  flex: 1;
1201
- min-height: 0;
1202
- overflow-y: auto;
1203
- padding: 6px;
631
+ min-width: 0;
1204
632
  display: flex;
1205
633
  flex-direction: column;
1206
- gap: 1px;
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;
1207
643
  }
1208
- .cm-cp-item {
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;
1209
665
  background: transparent;
1210
- color: inherit;
1211
- border: none;
1212
- text-align: left;
1213
- padding: 10px 12px;
666
+ border: 0;
667
+ color: var(--fg-2);
668
+ cursor: pointer;
1214
669
  border-radius: var(--r-1);
1215
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 {
1216
689
  display: flex;
1217
690
  align-items: center;
1218
691
  gap: 10px;
1219
- cursor: pointer;
1220
- transition: background var(--dur-snap) var(--ease);
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;
1221
697
  }
1222
- .cm-cp-item:hover,
1223
- .cm-cp-item.selected {
1224
- background: color-mix(in oklab, var(--accent) 22%, transparent);
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);
1225
709
  }
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
710
 
1230
- /* ---- Emoji picker ---- */
1231
- .cm-emoji-picker {
1232
- width: min(340px, 92vw);
1233
- max-height: 360px;
1234
- background: var(--bg-2);
711
+ .cm-chat-header-name {
712
+ font-weight: 600;
713
+ font-size: var(--fs-sm);
1235
714
  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;
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);
1240
727
  overflow: hidden;
728
+ text-overflow: ellipsis;
729
+ white-space: nowrap;
1241
730
  }
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);
731
+
732
+ .cm-chat-header-toolbar {
733
+ display: inline-flex;
734
+ align-items: center;
735
+ gap: 4px;
736
+ flex-shrink: 0;
1252
737
  }
1253
- .cm-ep-search::placeholder { color: var(--fg-3); }
1254
- .cm-ep-grid {
1255
- flex: 1;
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;
1256
747
  min-height: 0;
1257
748
  overflow-y: auto;
1258
- padding: 4px 8px 8px;
1259
- display: grid;
1260
- grid-template-columns: repeat(8, 1fr);
1261
- gap: 2px;
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;
1262
761
  }
1263
- .cm-ep-category {
1264
- grid-column: 1 / -1;
1265
- font-size: var(--fs-xs);
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;
1266
773
  color: var(--fg-3);
774
+ letter-spacing: var(--tr-caps);
1267
775
  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
776
  }
1281
- .cm-ep-btn:hover { background: color-mix(in oklab, var(--fg) 12%, transparent); }
1282
777
 
1283
- /* ---- Reply bar ---- */
1284
- .cm-reply-bar {
778
+ .cm-member-item {
1285
779
  display: flex;
1286
780
  align-items: center;
1287
- gap: 8px;
781
+ gap: 10px;
1288
782
  padding: 6px 12px;
1289
- background: var(--bg-2);
783
+ margin: 0 8px;
784
+ border-radius: var(--r-1);
1290
785
  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
786
  cursor: pointer;
1303
- padding: 2px 6px;
1304
- border-radius: var(--r-1);
1305
787
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1306
788
  }
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);
789
+ .cm-member-item:hover {
790
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
791
+ color: var(--fg);
1313
792
  }
1314
793
 
1315
- /* ---- VoiceUser: video stream + quality dot ---- */
1316
- .cm-voice-user-video {
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 {
1317
810
  width: 100%;
1318
811
  height: 100%;
1319
812
  object-fit: cover;
1320
813
  display: block;
1321
- border-radius: 50%;
1322
814
  }
1323
- .cm-voice-user-avatar { position: relative; }
1324
- .cm-voice-user-quality {
815
+
816
+ .cm-member-status {
1325
817
  position: absolute;
1326
- top: 2px;
1327
- right: 2px;
818
+ right: -2px;
819
+ bottom: -2px;
1328
820
  width: 10px;
1329
821
  height: 10px;
1330
822
  border-radius: 50%;
1331
- border: 2px solid var(--bg-2);
1332
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; }
1333
933
  }
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); }