@firedrill-tools/slack 0.1.1

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 (58) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +369 -0
  3. package/firedrill/agent.target.json +17 -0
  4. package/firedrill/baseline.scenario.json +5 -0
  5. package/firedrill/bounds.scenario.json +112 -0
  6. package/firedrill/conformance.suite.json +21 -0
  7. package/firedrill/history-unavailable.scenario.json +11 -0
  8. package/firedrill/open-long-handles.scenario.json +263 -0
  9. package/firedrill/open-member-bound.scenario.json +24 -0
  10. package/firedrill/post-rate-limited.scenario.json +11 -0
  11. package/firedrill/response-budget.scenario.json +24 -0
  12. package/firedrill/slack-bounds.drill.json +428 -0
  13. package/firedrill/slack-denied.drill.json +74 -0
  14. package/firedrill/slack-fresh-install.drill.json +132 -0
  15. package/firedrill/slack-history-unavailable.drill.json +83 -0
  16. package/firedrill/slack-invalid-auth.drill.json +408 -0
  17. package/firedrill/slack-mcp-aliases.drill.json +219 -0
  18. package/firedrill/slack-open-long-handles.drill.json +82 -0
  19. package/firedrill/slack-open-member-bound.drill.json +135 -0
  20. package/firedrill/slack-post-rate-limited.drill.json +96 -0
  21. package/firedrill/slack-response-budget.drill.json +118 -0
  22. package/firedrill/slack-thread-many-repliers.drill.json +100 -0
  23. package/firedrill/slack-ts-sequence-full.drill.json +165 -0
  24. package/firedrill/slack-visibility.drill.json +110 -0
  25. package/firedrill/slack-web-api-flow.drill.json +896 -0
  26. package/firedrill/thread-many-repliers.scenario.json +79 -0
  27. package/firedrill/tools/slack/app/assets/ATTRIBUTION.md +40 -0
  28. package/firedrill/tools/slack/app/assets/fonts/OFL.txt +93 -0
  29. package/firedrill/tools/slack/app/assets/fonts/lato-latin-400.woff2 +0 -0
  30. package/firedrill/tools/slack/app/assets/fonts/lato-latin-700.woff2 +0 -0
  31. package/firedrill/tools/slack/app/assets/fonts/lato-latin-900.woff2 +0 -0
  32. package/firedrill/tools/slack/app/assets/slack-wordmark.svg +1 -0
  33. package/firedrill/tools/slack/app/assets/slack.svg +1 -0
  34. package/firedrill/tools/slack/app/site/app.js +2202 -0
  35. package/firedrill/tools/slack/app/site/assets/fonts/lato-latin-400.woff2 +0 -0
  36. package/firedrill/tools/slack/app/site/assets/fonts/lato-latin-700.woff2 +0 -0
  37. package/firedrill/tools/slack/app/site/assets/fonts/lato-latin-900.woff2 +0 -0
  38. package/firedrill/tools/slack/app/site/assets/slack-wordmark.svg +1 -0
  39. package/firedrill/tools/slack/app/site/assets/slack.svg +1 -0
  40. package/firedrill/tools/slack/app/site/chrome.css +73 -0
  41. package/firedrill/tools/slack/app/site/chrome.js +96 -0
  42. package/firedrill/tools/slack/app/site/icons.js +96 -0
  43. package/firedrill/tools/slack/app/site/index.html +253 -0
  44. package/firedrill/tools/slack/app/site/styles.css +2719 -0
  45. package/firedrill/tools/slack/app/site/ui.js +491 -0
  46. package/firedrill/tools/slack/behavior.mjs +1171 -0
  47. package/firedrill/tools/slack/lib/access.mjs +138 -0
  48. package/firedrill/tools/slack/lib/budget.mjs +67 -0
  49. package/firedrill/tools/slack/lib/ids.mjs +146 -0
  50. package/firedrill/tools/slack/lib/search.mjs +172 -0
  51. package/firedrill/tools/slack/lib/wire.mjs +144 -0
  52. package/firedrill/tools/slack/slack.tool.json +6114 -0
  53. package/firedrill/ts-sequence-full.scenario.json +38 -0
  54. package/firedrill/world.json +2008 -0
  55. package/firedrill.json +5 -0
  56. package/package.json +62 -0
  57. package/starter.json +1562 -0
  58. package/test/conformance.mjs +1166 -0
@@ -0,0 +1,2719 @@
1
+ @font-face {
2
+ font-family: "Lato";
3
+ font-style: normal;
4
+ font-weight: 400;
5
+ font-display: swap;
6
+ src: url("./assets/fonts/lato-latin-400.woff2") format("woff2");
7
+ }
8
+ @font-face {
9
+ font-family: "Lato";
10
+ font-style: normal;
11
+ font-weight: 700;
12
+ font-display: swap;
13
+ src: url("./assets/fonts/lato-latin-700.woff2") format("woff2");
14
+ }
15
+ @font-face {
16
+ font-family: "Lato";
17
+ font-style: normal;
18
+ font-weight: 900;
19
+ font-display: swap;
20
+ src: url("./assets/fonts/lato-latin-900.woff2") format("woff2");
21
+ }
22
+
23
+ /* Aubergine theme tokens */
24
+ :root {
25
+ color-scheme: light;
26
+ --shell: #350d36;
27
+ --sidebar: #3f0e40;
28
+ --sidebar-hover: rgba(255, 255, 255, 0.1);
29
+ --sidebar-active: #1164a3;
30
+ --sidebar-text: rgba(255, 255, 255, 0.72);
31
+ --sidebar-text-strong: #ffffff;
32
+ --sidebar-border: rgba(255, 255, 255, 0.1);
33
+ --badge: #cd2553;
34
+ --surface: #ffffff;
35
+ --surface-2: #f8f8f8;
36
+ --surface-3: #f2f2f2;
37
+ --hover: rgba(29, 28, 29, 0.04);
38
+ --border: rgba(29, 28, 29, 0.13);
39
+ --border-strong: rgba(29, 28, 29, 0.3);
40
+ --text: #1d1c1d;
41
+ --text-2: #616061;
42
+ --text-3: #868686;
43
+ --link: #1264a3;
44
+ --link-hover: #0b4c8c;
45
+ --primary: #007a5a;
46
+ --primary-hover: #148567;
47
+ --danger: #e01e5a;
48
+ --danger-hover: #c41a4f;
49
+ --focus: #1d9bd1;
50
+ --reaction-own-bg: #e8f5fa;
51
+ --reaction-own-border: #1d9bd1;
52
+ --mention-bg: #e8f5fa;
53
+ --mention-text: #1264a3;
54
+ --highlight: #fff8e1;
55
+ --shadow-1: 0 0 0 1px rgba(29, 28, 29, 0.13), 0 4px 12px 0 rgba(0, 0, 0, 0.12);
56
+ --shadow-2: 0 0 0 1px rgba(29, 28, 29, 0.13), 0 18px 48px 0 rgba(0, 0, 0, 0.35);
57
+ --rail-width: 70px;
58
+ --sidebar-width: 260px;
59
+ --panel-width: 400px;
60
+ --topbar-height: 44px;
61
+ --header-height: 49px;
62
+ --font: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif;
63
+ --mono: "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace;
64
+ }
65
+
66
+ * {
67
+ box-sizing: border-box;
68
+ }
69
+ html,
70
+ body {
71
+ margin: 0;
72
+ height: 100%;
73
+ }
74
+ body {
75
+ font: 15px/1.46668 var(--font);
76
+ color: var(--text);
77
+ background: var(--shell);
78
+ overflow: hidden;
79
+ -webkit-font-smoothing: antialiased;
80
+ }
81
+ h1,
82
+ h2,
83
+ h3,
84
+ p,
85
+ pre,
86
+ ul,
87
+ dl,
88
+ dd,
89
+ figure {
90
+ margin: 0;
91
+ }
92
+ ul {
93
+ padding: 0;
94
+ list-style: none;
95
+ }
96
+ button,
97
+ input,
98
+ textarea,
99
+ select {
100
+ font: inherit;
101
+ color: inherit;
102
+ }
103
+ button {
104
+ cursor: pointer;
105
+ background: none;
106
+ border: 0;
107
+ padding: 0;
108
+ text-align: left;
109
+ }
110
+ button:disabled {
111
+ cursor: default;
112
+ }
113
+ [hidden] {
114
+ display: none !important;
115
+ }
116
+ .visually-hidden {
117
+ position: absolute;
118
+ width: 1px;
119
+ height: 1px;
120
+ overflow: hidden;
121
+ clip: rect(0 0 0 0);
122
+ white-space: nowrap;
123
+ }
124
+ :is(button, input, textarea, a, [tabindex]):focus-visible {
125
+ outline: 2px solid var(--focus);
126
+ outline-offset: 1px;
127
+ }
128
+ .sidebar :is(button, a):focus-visible,
129
+ .rail button:focus-visible,
130
+ .topbar :is(button, input):focus-visible {
131
+ outline-color: #fff;
132
+ }
133
+ .icon {
134
+ width: 20px;
135
+ height: 20px;
136
+ flex-shrink: 0;
137
+ display: inline-block;
138
+ vertical-align: middle;
139
+ }
140
+ html[data-busy] {
141
+ cursor: progress;
142
+ }
143
+
144
+ /* ---------------------------------------------------------------------------------------------
145
+ Shell: top bar, rail, workspace panel
146
+ --------------------------------------------------------------------------------------------- */
147
+ .shell {
148
+ height: 100%;
149
+ display: grid;
150
+ grid-template-columns: var(--rail-width) 1fr;
151
+ grid-template-rows: var(--topbar-height) 1fr;
152
+ grid-template-areas:
153
+ "topbar topbar"
154
+ "rail workspace";
155
+ }
156
+ .topbar {
157
+ grid-area: topbar;
158
+ display: grid;
159
+ grid-template-columns: var(--rail-width) minmax(0, 1fr) var(--rail-width);
160
+ align-items: center;
161
+ height: var(--topbar-height);
162
+ color: #fff;
163
+ padding: 0 8px 0 0;
164
+ }
165
+ .topbar-start {
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: flex-end;
169
+ gap: 2px;
170
+ padding-right: 4px;
171
+ grid-column: 1;
172
+ min-width: 0;
173
+ }
174
+ .topbar-end {
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: flex-end;
178
+ grid-column: 3;
179
+ }
180
+ .topbar-btn {
181
+ width: 32px;
182
+ height: 32px;
183
+ border-radius: 6px;
184
+ display: inline-flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ color: rgba(255, 255, 255, 0.85);
188
+ }
189
+ .topbar-btn:hover:not(:disabled) {
190
+ background: rgba(255, 255, 255, 0.14);
191
+ color: #fff;
192
+ }
193
+ .topbar-btn:disabled {
194
+ color: rgba(255, 255, 255, 0.35);
195
+ }
196
+ #nav-menu {
197
+ display: none;
198
+ }
199
+ .topbar-search {
200
+ grid-column: 2;
201
+ position: relative;
202
+ height: 26px;
203
+ width: min(100%, 732px);
204
+ margin: 0 auto;
205
+ display: flex;
206
+ align-items: center;
207
+ background: rgba(255, 255, 255, 0.14);
208
+ border: 1px solid rgba(255, 255, 255, 0.3);
209
+ border-radius: 6px;
210
+ padding: 0 8px;
211
+ gap: 8px;
212
+ }
213
+ .topbar-search:hover {
214
+ background: rgba(255, 255, 255, 0.2);
215
+ }
216
+ .topbar-search:focus-within {
217
+ background: #fff;
218
+ color: var(--text);
219
+ border-color: #fff;
220
+ box-shadow: 0 0 0 1px #fff;
221
+ }
222
+ .topbar-search .search-glyph {
223
+ color: inherit;
224
+ width: 16px;
225
+ height: 16px;
226
+ opacity: 0.85;
227
+ order: 2;
228
+ }
229
+ .topbar-search:focus-within .search-glyph {
230
+ order: 0;
231
+ }
232
+ .topbar-search input {
233
+ flex: 1;
234
+ min-width: 0;
235
+ background: transparent;
236
+ border: 0;
237
+ outline: none;
238
+ color: inherit;
239
+ font-size: 13px;
240
+ font-weight: 700;
241
+ text-align: center;
242
+ height: 24px;
243
+ order: 1;
244
+ }
245
+ .topbar-search:focus-within input,
246
+ .topbar-search.has-value input {
247
+ text-align: left;
248
+ font-weight: 400;
249
+ }
250
+ .topbar-search input::placeholder {
251
+ color: inherit;
252
+ opacity: 0.85;
253
+ }
254
+ .topbar-search:focus-within input::placeholder {
255
+ color: var(--text-2);
256
+ }
257
+ .search-clear {
258
+ order: 3;
259
+ width: 20px;
260
+ height: 20px;
261
+ border-radius: 50%;
262
+ display: inline-flex;
263
+ align-items: center;
264
+ justify-content: center;
265
+ color: inherit;
266
+ }
267
+ .search-clear .icon {
268
+ width: 14px;
269
+ height: 14px;
270
+ }
271
+
272
+ .rail {
273
+ grid-area: rail;
274
+ display: flex;
275
+ flex-direction: column;
276
+ align-items: center;
277
+ padding: 4px 0 8px;
278
+ gap: 4px;
279
+ color: #fff;
280
+ }
281
+ .rail-workspace {
282
+ width: 36px;
283
+ height: 36px;
284
+ margin-bottom: 8px;
285
+ border-radius: 8px;
286
+ }
287
+ .rail-tile {
288
+ width: 36px;
289
+ height: 36px;
290
+ border-radius: 8px;
291
+ display: inline-flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ background: #fff;
295
+ color: var(--sidebar);
296
+ font-size: 18px;
297
+ font-weight: 900;
298
+ box-shadow: 0 0 0 0 transparent;
299
+ transition: transform 0.1s;
300
+ }
301
+ .rail-workspace:hover .rail-tile {
302
+ transform: scale(1.06);
303
+ }
304
+ .rail-items {
305
+ display: flex;
306
+ flex-direction: column;
307
+ align-items: center;
308
+ gap: 8px;
309
+ }
310
+ .rail-item {
311
+ width: 60px;
312
+ display: flex;
313
+ flex-direction: column;
314
+ align-items: center;
315
+ gap: 4px;
316
+ color: rgba(255, 255, 255, 0.85);
317
+ }
318
+ .rail-icon {
319
+ width: 36px;
320
+ height: 36px;
321
+ border-radius: 8px;
322
+ display: inline-flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ }
326
+ .rail-item:hover .rail-icon {
327
+ background: rgba(255, 255, 255, 0.14);
328
+ }
329
+ .rail-item[aria-current="page"] .rail-icon {
330
+ background: rgba(255, 255, 255, 0.22);
331
+ color: #fff;
332
+ }
333
+ .rail-item[aria-current="page"] {
334
+ color: #fff;
335
+ }
336
+ .rail-label {
337
+ font-size: 11px;
338
+ font-weight: 700;
339
+ line-height: 1.2;
340
+ }
341
+ .rail-bottom {
342
+ margin-top: auto;
343
+ display: flex;
344
+ flex-direction: column;
345
+ align-items: center;
346
+ gap: 12px;
347
+ }
348
+ .rail-plus {
349
+ width: 36px;
350
+ height: 36px;
351
+ border-radius: 50%;
352
+ display: inline-flex;
353
+ align-items: center;
354
+ justify-content: center;
355
+ background: rgba(255, 255, 255, 0.14);
356
+ color: #fff;
357
+ }
358
+ .rail-plus:hover {
359
+ background: rgba(255, 255, 255, 0.24);
360
+ }
361
+ .rail-avatar {
362
+ position: relative;
363
+ width: 36px;
364
+ height: 36px;
365
+ border-radius: 8px;
366
+ }
367
+ .rail-avatar .avatar {
368
+ width: 36px;
369
+ height: 36px;
370
+ font-size: 16px;
371
+ border-radius: 8px;
372
+ }
373
+ .rail-avatar .presence {
374
+ position: absolute;
375
+ right: -3px;
376
+ bottom: -3px;
377
+ width: 12px;
378
+ height: 12px;
379
+ border: 2px solid var(--shell);
380
+ }
381
+
382
+ .workspace {
383
+ grid-area: workspace;
384
+ display: grid;
385
+ grid-template-columns: var(--sidebar-width) minmax(0, 1fr) auto;
386
+ min-height: 0;
387
+ margin: 0 4px 4px 0;
388
+ border-radius: 6px;
389
+ overflow: hidden;
390
+ border: 1px solid var(--sidebar-border);
391
+ background: var(--surface);
392
+ }
393
+
394
+ /* ---------------------------------------------------------------------------------------------
395
+ Sidebar
396
+ --------------------------------------------------------------------------------------------- */
397
+ .sidebar {
398
+ background: var(--sidebar);
399
+ color: var(--sidebar-text);
400
+ display: flex;
401
+ flex-direction: column;
402
+ min-height: 0;
403
+ border-right: 1px solid var(--sidebar-border);
404
+ }
405
+ .sidebar-header {
406
+ height: var(--header-height);
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: space-between;
410
+ padding: 0 12px 0 16px;
411
+ border-bottom: 1px solid var(--sidebar-border);
412
+ flex-shrink: 0;
413
+ }
414
+ .sidebar-title {
415
+ display: inline-flex;
416
+ align-items: center;
417
+ gap: 2px;
418
+ color: #fff;
419
+ font-size: 18px;
420
+ font-weight: 900;
421
+ height: 34px;
422
+ padding: 0 8px 0 8px;
423
+ margin-left: -8px;
424
+ border-radius: 6px;
425
+ min-width: 0;
426
+ }
427
+ .sidebar-title:hover {
428
+ background: var(--sidebar-hover);
429
+ }
430
+ .sidebar-title-text {
431
+ overflow: hidden;
432
+ text-overflow: ellipsis;
433
+ white-space: nowrap;
434
+ }
435
+ .sidebar-header-actions {
436
+ display: flex;
437
+ align-items: center;
438
+ gap: 4px;
439
+ }
440
+ .sidebar-filter,
441
+ .sidebar-compose {
442
+ width: 34px;
443
+ height: 34px;
444
+ border-radius: 8px;
445
+ display: inline-flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ color: #fff;
449
+ }
450
+ .sidebar-filter:hover {
451
+ background: var(--sidebar-hover);
452
+ }
453
+ .sidebar-compose {
454
+ background: rgba(255, 255, 255, 0.14);
455
+ }
456
+ .sidebar-compose:hover {
457
+ background: rgba(255, 255, 255, 0.24);
458
+ }
459
+ .sidebar-scroll {
460
+ flex: 1;
461
+ overflow-y: auto;
462
+ padding: 12px 0 8px;
463
+ min-height: 0;
464
+ }
465
+ .sidebar-section {
466
+ padding: 0 0 8px;
467
+ }
468
+ .section-toggle {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 6px;
472
+ height: 28px;
473
+ width: calc(100% - 16px);
474
+ margin: 0 8px;
475
+ padding: 0 8px;
476
+ border-radius: 6px;
477
+ color: var(--sidebar-text);
478
+ font-size: 15px;
479
+ }
480
+ .section-toggle:hover {
481
+ background: var(--sidebar-hover);
482
+ color: #fff;
483
+ }
484
+ .section-chevron {
485
+ width: 18px;
486
+ height: 18px;
487
+ transition: transform 0.15s;
488
+ }
489
+ .section-toggle[aria-expanded="false"] .section-chevron {
490
+ transform: rotate(-90deg);
491
+ }
492
+ .sidebar-list {
493
+ display: flex;
494
+ flex-direction: column;
495
+ }
496
+ .sb-link {
497
+ display: flex;
498
+ align-items: center;
499
+ gap: 8px;
500
+ height: 28px;
501
+ width: calc(100% - 16px);
502
+ margin: 0 8px;
503
+ padding: 0 8px 0 26px;
504
+ border-radius: 6px;
505
+ color: var(--sidebar-text);
506
+ font-size: 15px;
507
+ white-space: nowrap;
508
+ }
509
+ .sb-link:hover {
510
+ background: var(--sidebar-hover);
511
+ color: #fff;
512
+ }
513
+ .sb-link[aria-current="page"] {
514
+ background: var(--sidebar-active);
515
+ color: #fff;
516
+ }
517
+ .sb-link.unread {
518
+ color: #fff;
519
+ font-weight: 900;
520
+ }
521
+ .sb-glyph {
522
+ width: 20px;
523
+ height: 20px;
524
+ display: inline-flex;
525
+ align-items: center;
526
+ justify-content: center;
527
+ flex-shrink: 0;
528
+ position: relative;
529
+ }
530
+ .sb-glyph .icon {
531
+ width: 16px;
532
+ height: 16px;
533
+ }
534
+ .sb-glyph .avatar.sm {
535
+ border-radius: 4px;
536
+ }
537
+ .sb-glyph .presence {
538
+ position: absolute;
539
+ right: -3px;
540
+ bottom: -3px;
541
+ border: 2px solid var(--sidebar);
542
+ }
543
+ .sb-link[aria-current="page"] .sb-glyph .presence {
544
+ border-color: var(--sidebar-active);
545
+ }
546
+ .sb-name {
547
+ overflow: hidden;
548
+ text-overflow: ellipsis;
549
+ min-width: 0;
550
+ flex: 1;
551
+ }
552
+ .sb-meta {
553
+ font-size: 13px;
554
+ opacity: 0.8;
555
+ }
556
+ .sb-badge {
557
+ background: var(--badge);
558
+ color: #fff;
559
+ font-size: 11px;
560
+ font-weight: 700;
561
+ border-radius: 9px;
562
+ padding: 0 6px;
563
+ line-height: 18px;
564
+ }
565
+ .sidebar-add {
566
+ display: flex;
567
+ align-items: center;
568
+ gap: 8px;
569
+ height: 28px;
570
+ width: calc(100% - 16px);
571
+ margin: 0 8px;
572
+ padding: 0 8px 0 26px;
573
+ border-radius: 6px;
574
+ color: var(--sidebar-text);
575
+ }
576
+ .sidebar-add:hover {
577
+ background: var(--sidebar-hover);
578
+ color: #fff;
579
+ }
580
+ .add-box {
581
+ width: 20px;
582
+ height: 20px;
583
+ border-radius: 4px;
584
+ background: rgba(255, 255, 255, 0.1);
585
+ display: inline-flex;
586
+ align-items: center;
587
+ justify-content: center;
588
+ }
589
+ .add-box .icon {
590
+ width: 14px;
591
+ height: 14px;
592
+ }
593
+ .sidebar-denied,
594
+ .sidebar-empty,
595
+ .sidebar-note {
596
+ margin: 4px 16px 8px 34px;
597
+ font-size: 13px;
598
+ line-height: 1.4;
599
+ color: var(--sidebar-text);
600
+ }
601
+ .sidebar-denied {
602
+ margin: 0 12px 12px;
603
+ padding: 12px;
604
+ border: 1px solid var(--sidebar-border);
605
+ border-radius: 8px;
606
+ color: #fff;
607
+ }
608
+ .sidebar-denied strong {
609
+ display: block;
610
+ margin-bottom: 4px;
611
+ }
612
+ .sidebar-footer {
613
+ flex-shrink: 0;
614
+ padding: 8px 16px;
615
+ font-size: 11px;
616
+ color: rgba(255, 255, 255, 0.5);
617
+ border-top: 1px solid var(--sidebar-border);
618
+ }
619
+ .sk-side {
620
+ height: 14px;
621
+ margin: 7px 16px 7px 34px;
622
+ border-radius: 4px;
623
+ background: rgba(255, 255, 255, 0.12);
624
+ animation: pulse 1.2s ease-in-out infinite;
625
+ }
626
+
627
+ .presence {
628
+ display: inline-block;
629
+ width: 9px;
630
+ height: 9px;
631
+ border-radius: 50%;
632
+ border: 1.5px solid currentColor;
633
+ background: transparent;
634
+ color: rgba(255, 255, 255, 0.72);
635
+ }
636
+ .presence.active {
637
+ background: #2bac76;
638
+ border-color: #2bac76;
639
+ color: #2bac76;
640
+ }
641
+
642
+ /* ---------------------------------------------------------------------------------------------
643
+ Main pane
644
+ --------------------------------------------------------------------------------------------- */
645
+ .pane {
646
+ display: flex;
647
+ flex-direction: column;
648
+ min-width: 0;
649
+ min-height: 0;
650
+ background: var(--surface);
651
+ }
652
+ .pane-header {
653
+ height: var(--header-height);
654
+ display: flex;
655
+ align-items: center;
656
+ justify-content: space-between;
657
+ gap: 12px;
658
+ padding: 0 16px 0 20px;
659
+ border-bottom: 1px solid var(--border);
660
+ flex-shrink: 0;
661
+ }
662
+ .pane-title-wrap {
663
+ display: flex;
664
+ align-items: center;
665
+ gap: 8px;
666
+ min-width: 0;
667
+ }
668
+ .pane-title {
669
+ display: inline-flex;
670
+ align-items: center;
671
+ gap: 2px;
672
+ height: 30px;
673
+ padding: 0 8px;
674
+ margin-left: -8px;
675
+ border-radius: 6px;
676
+ font-size: 18px;
677
+ font-weight: 900;
678
+ color: var(--text);
679
+ min-width: 0;
680
+ }
681
+ .pane-title:hover {
682
+ background: var(--hover);
683
+ }
684
+ .pane-title-glyph {
685
+ display: inline-flex;
686
+ align-items: center;
687
+ }
688
+ .pane-title-glyph .icon {
689
+ width: 18px;
690
+ height: 18px;
691
+ }
692
+ .pane-title-glyph .avatar {
693
+ margin-right: 6px;
694
+ }
695
+ .pane-title-glyph .presence {
696
+ position: absolute;
697
+ right: 2px;
698
+ bottom: -2px;
699
+ border: 2px solid #fff;
700
+ color: var(--text-2);
701
+ }
702
+ .pane-title-glyph.with-avatar {
703
+ position: relative;
704
+ }
705
+ .pane-title-text {
706
+ overflow: hidden;
707
+ text-overflow: ellipsis;
708
+ white-space: nowrap;
709
+ }
710
+ .pane-title-chevron {
711
+ width: 18px;
712
+ height: 18px;
713
+ color: var(--text-2);
714
+ }
715
+ .pane-topic {
716
+ font-size: 13px;
717
+ color: var(--text-2);
718
+ overflow: hidden;
719
+ text-overflow: ellipsis;
720
+ white-space: nowrap;
721
+ min-width: 0;
722
+ height: 26px;
723
+ padding: 0 6px;
724
+ border-radius: 4px;
725
+ }
726
+ .pane-topic:hover {
727
+ background: var(--hover);
728
+ color: var(--text);
729
+ }
730
+ .pane-header-actions {
731
+ display: flex;
732
+ align-items: center;
733
+ gap: 8px;
734
+ flex-shrink: 0;
735
+ }
736
+ .members-pill {
737
+ display: inline-flex;
738
+ align-items: center;
739
+ gap: 6px;
740
+ height: 28px;
741
+ padding: 0 8px 0 4px;
742
+ border: 1px solid var(--border);
743
+ border-radius: 6px;
744
+ color: var(--text-2);
745
+ font-size: 13px;
746
+ font-weight: 700;
747
+ }
748
+ .members-pill:hover {
749
+ background: var(--hover);
750
+ color: var(--text);
751
+ }
752
+ .members-stack {
753
+ display: inline-flex;
754
+ }
755
+ .members-stack .avatar {
756
+ width: 20px;
757
+ height: 20px;
758
+ font-size: 10px;
759
+ border-radius: 4px;
760
+ border: 1px solid #fff;
761
+ margin-right: -6px;
762
+ }
763
+ .members-stack .avatar:last-child {
764
+ margin-right: 0;
765
+ }
766
+ .icon-btn {
767
+ width: 32px;
768
+ height: 32px;
769
+ border-radius: 6px;
770
+ display: inline-flex;
771
+ align-items: center;
772
+ justify-content: center;
773
+ color: var(--text-2);
774
+ }
775
+ .icon-btn:hover:not(:disabled) {
776
+ background: var(--hover);
777
+ color: var(--text);
778
+ }
779
+ .icon-btn:disabled {
780
+ opacity: 0.4;
781
+ }
782
+ .pane-tabs {
783
+ display: flex;
784
+ align-items: center;
785
+ gap: 4px;
786
+ height: 38px;
787
+ padding: 0 16px;
788
+ border-bottom: 1px solid var(--border);
789
+ flex-shrink: 0;
790
+ }
791
+ .pane-tab {
792
+ display: inline-flex;
793
+ align-items: center;
794
+ gap: 6px;
795
+ height: 38px;
796
+ padding: 0 8px;
797
+ font-size: 13px;
798
+ font-weight: 700;
799
+ color: var(--text-2);
800
+ border-bottom: 2px solid transparent;
801
+ margin-bottom: -1px;
802
+ }
803
+ .pane-tab .icon {
804
+ width: 16px;
805
+ height: 16px;
806
+ }
807
+ .pane-tab:hover {
808
+ color: var(--text);
809
+ }
810
+ .pane-tab[aria-current="page"] {
811
+ color: var(--text);
812
+ border-bottom-color: var(--text);
813
+ }
814
+ .tab-count {
815
+ font-size: 12px;
816
+ color: var(--text-2);
817
+ font-weight: 400;
818
+ }
819
+ .tab-count:empty {
820
+ display: none;
821
+ }
822
+ .pane-body {
823
+ flex: 1;
824
+ min-height: 0;
825
+ display: flex;
826
+ flex-direction: column;
827
+ position: relative;
828
+ }
829
+ .message-scroll {
830
+ flex: 1;
831
+ overflow-y: auto;
832
+ min-height: 0;
833
+ display: flex;
834
+ flex-direction: column;
835
+ }
836
+ .message-list {
837
+ margin-top: auto;
838
+ padding: 8px 0 12px;
839
+ }
840
+ .pane-footer {
841
+ flex-shrink: 0;
842
+ padding: 0 20px 24px;
843
+ }
844
+
845
+ /* Day divider */
846
+ .day-divider {
847
+ position: relative;
848
+ display: flex;
849
+ align-items: center;
850
+ justify-content: center;
851
+ height: 28px;
852
+ margin: 12px 20px 8px;
853
+ }
854
+ .day-divider::before {
855
+ content: "";
856
+ position: absolute;
857
+ left: 0;
858
+ right: 0;
859
+ top: 50%;
860
+ border-top: 1px solid var(--border);
861
+ }
862
+ .day-pill {
863
+ position: relative;
864
+ display: inline-flex;
865
+ align-items: center;
866
+ gap: 2px;
867
+ height: 28px;
868
+ padding: 0 8px 0 12px;
869
+ border: 1px solid var(--border);
870
+ border-radius: 24px;
871
+ background: #fff;
872
+ font-size: 13px;
873
+ font-weight: 700;
874
+ color: var(--text);
875
+ }
876
+ .day-pill .icon {
877
+ width: 16px;
878
+ height: 16px;
879
+ color: var(--text-2);
880
+ }
881
+ .day-pill:hover {
882
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
883
+ }
884
+
885
+ /* Messages */
886
+ .msg {
887
+ position: relative;
888
+ display: flex;
889
+ gap: 8px;
890
+ padding: 8px 20px;
891
+ }
892
+ .msg:hover,
893
+ .msg:focus-within {
894
+ background: var(--surface-2);
895
+ }
896
+ .msg.continued {
897
+ padding-top: 2px;
898
+ padding-bottom: 2px;
899
+ }
900
+ .msg.highlight {
901
+ background: var(--highlight);
902
+ }
903
+ .msg-gutter {
904
+ width: 36px;
905
+ flex-shrink: 0;
906
+ display: flex;
907
+ justify-content: flex-end;
908
+ align-items: flex-start;
909
+ }
910
+ .msg-gutter .avatar {
911
+ cursor: pointer;
912
+ }
913
+ .msg-hover-time {
914
+ font-size: 12px;
915
+ color: var(--text-2);
916
+ line-height: 22px;
917
+ visibility: hidden;
918
+ white-space: nowrap;
919
+ }
920
+ .msg.continued:hover .msg-hover-time,
921
+ .msg.continued:focus-within .msg-hover-time {
922
+ visibility: visible;
923
+ }
924
+ .msg-main {
925
+ flex: 1;
926
+ min-width: 0;
927
+ }
928
+ .msg-head {
929
+ display: flex;
930
+ align-items: baseline;
931
+ gap: 8px;
932
+ line-height: 22px;
933
+ }
934
+ .msg-author {
935
+ font-weight: 900;
936
+ color: var(--text);
937
+ border-radius: 4px;
938
+ }
939
+ .msg-author:hover {
940
+ text-decoration: underline;
941
+ color: var(--link-hover);
942
+ }
943
+ .app-badge {
944
+ font-size: 10px;
945
+ font-weight: 700;
946
+ line-height: 14px;
947
+ padding: 0 4px;
948
+ border-radius: 2px;
949
+ background: var(--border);
950
+ color: var(--text-2);
951
+ text-transform: uppercase;
952
+ align-self: center;
953
+ }
954
+ .msg-time {
955
+ font-size: 12px;
956
+ color: var(--text-2);
957
+ border-radius: 4px;
958
+ }
959
+ .msg-time:hover {
960
+ text-decoration: underline;
961
+ }
962
+ .msg-text {
963
+ white-space: pre-wrap;
964
+ overflow-wrap: anywhere;
965
+ line-height: 22px;
966
+ }
967
+ .msg-edited {
968
+ font-size: 12px;
969
+ color: var(--text-2);
970
+ margin-left: 4px;
971
+ }
972
+ .msg-broadcast {
973
+ font-size: 13px;
974
+ color: var(--text-2);
975
+ line-height: 20px;
976
+ }
977
+ .msg.system .msg-text,
978
+ .msg.system .msg-head {
979
+ color: var(--text-2);
980
+ font-size: 15px;
981
+ }
982
+ .msg.system .msg-gutter {
983
+ visibility: hidden;
984
+ }
985
+ .msg.tombstone .msg-text {
986
+ font-style: italic;
987
+ color: var(--text-2);
988
+ }
989
+ .msg-code {
990
+ font-family: var(--mono);
991
+ font-size: 12px;
992
+ padding: 2px 3px 1px;
993
+ border: 1px solid var(--border);
994
+ border-radius: 3px;
995
+ background: var(--surface-2);
996
+ color: var(--danger);
997
+ }
998
+ .msg-pre {
999
+ display: block;
1000
+ font-family: var(--mono);
1001
+ font-size: 12px;
1002
+ line-height: 1.5;
1003
+ padding: 8px;
1004
+ margin: 4px 0;
1005
+ border: 1px solid var(--border);
1006
+ border-radius: 4px;
1007
+ background: var(--surface-2);
1008
+ white-space: pre-wrap;
1009
+ overflow-wrap: anywhere;
1010
+ }
1011
+ .mention,
1012
+ .channel-link {
1013
+ display: inline;
1014
+ padding: 0 2px;
1015
+ border-radius: 3px;
1016
+ background: var(--mention-bg);
1017
+ color: var(--mention-text);
1018
+ font: inherit;
1019
+ line-height: inherit;
1020
+ }
1021
+ .mention:hover,
1022
+ .channel-link:hover {
1023
+ background: #d3e9f5;
1024
+ text-decoration: underline;
1025
+ }
1026
+ .msg-link {
1027
+ color: var(--link);
1028
+ text-decoration: none;
1029
+ overflow-wrap: anywhere;
1030
+ }
1031
+ .msg-link:hover {
1032
+ text-decoration: underline;
1033
+ }
1034
+ .msg-emoji {
1035
+ font-size: 1.15em;
1036
+ line-height: 1;
1037
+ vertical-align: -0.1em;
1038
+ }
1039
+ .msg-text.emoji-only {
1040
+ font-size: 32px;
1041
+ line-height: 40px;
1042
+ }
1043
+
1044
+ .msg-reactions {
1045
+ display: flex;
1046
+ flex-wrap: wrap;
1047
+ gap: 4px;
1048
+ margin-top: 4px;
1049
+ }
1050
+ .reaction {
1051
+ display: inline-flex;
1052
+ align-items: center;
1053
+ gap: 4px;
1054
+ height: 24px;
1055
+ padding: 0 8px 0 6px;
1056
+ border-radius: 12px;
1057
+ border: 1px solid transparent;
1058
+ background: var(--hover);
1059
+ font-size: 11px;
1060
+ font-weight: 700;
1061
+ color: var(--text-2);
1062
+ }
1063
+ .reaction:hover {
1064
+ border-color: var(--border-strong);
1065
+ background: #fff;
1066
+ }
1067
+ .reaction[aria-pressed="true"] {
1068
+ background: var(--reaction-own-bg);
1069
+ border-color: var(--reaction-own-border);
1070
+ color: var(--link);
1071
+ }
1072
+ .reaction-emoji {
1073
+ font-size: 15px;
1074
+ line-height: 1;
1075
+ }
1076
+ .reaction-add {
1077
+ width: 30px;
1078
+ justify-content: center;
1079
+ padding: 0;
1080
+ color: var(--text-2);
1081
+ }
1082
+ .reaction-add .icon {
1083
+ width: 16px;
1084
+ height: 16px;
1085
+ }
1086
+
1087
+ .msg-thread {
1088
+ display: flex;
1089
+ align-items: center;
1090
+ gap: 8px;
1091
+ margin: 6px -6px 0;
1092
+ padding: 4px 6px;
1093
+ border: 1px solid transparent;
1094
+ border-radius: 6px;
1095
+ width: fit-content;
1096
+ max-width: 100%;
1097
+ }
1098
+ .msg-thread:hover {
1099
+ background: #fff;
1100
+ border-color: var(--border);
1101
+ }
1102
+ .thread-avatars {
1103
+ display: inline-flex;
1104
+ gap: 2px;
1105
+ }
1106
+ .thread-avatars .avatar {
1107
+ width: 24px;
1108
+ height: 24px;
1109
+ font-size: 11px;
1110
+ border-radius: 4px;
1111
+ }
1112
+ .thread-link {
1113
+ font-size: 13px;
1114
+ font-weight: 700;
1115
+ color: var(--link);
1116
+ }
1117
+ .msg-thread:hover .thread-link {
1118
+ text-decoration: underline;
1119
+ }
1120
+ .thread-last {
1121
+ font-size: 13px;
1122
+ color: var(--text-2);
1123
+ }
1124
+ .thread-view {
1125
+ display: none;
1126
+ font-size: 13px;
1127
+ color: var(--text-2);
1128
+ margin-left: auto;
1129
+ align-items: center;
1130
+ }
1131
+ .msg-thread:hover .thread-last {
1132
+ display: none;
1133
+ }
1134
+ .msg-thread:hover .thread-view {
1135
+ display: inline-flex;
1136
+ }
1137
+
1138
+ /* Hover toolbar */
1139
+ .msg-actions {
1140
+ position: absolute;
1141
+ top: -16px;
1142
+ right: 20px;
1143
+ display: none;
1144
+ align-items: center;
1145
+ gap: 0;
1146
+ padding: 2px;
1147
+ background: #fff;
1148
+ border: 1px solid var(--border);
1149
+ border-radius: 6px;
1150
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
1151
+ z-index: 2;
1152
+ }
1153
+ .msg:hover .msg-actions,
1154
+ .msg:focus-within .msg-actions,
1155
+ .msg.menu-open .msg-actions {
1156
+ display: inline-flex;
1157
+ }
1158
+ .msg-actions .icon-btn,
1159
+ .msg-actions .quick-reaction {
1160
+ width: 32px;
1161
+ height: 32px;
1162
+ border-radius: 4px;
1163
+ }
1164
+ .quick-reaction {
1165
+ display: inline-flex;
1166
+ align-items: center;
1167
+ justify-content: center;
1168
+ font-size: 16px;
1169
+ line-height: 1;
1170
+ }
1171
+ .quick-reaction:hover {
1172
+ background: var(--hover);
1173
+ }
1174
+
1175
+ /* Load older / intro / states */
1176
+ .load-more {
1177
+ display: block;
1178
+ margin: 8px auto 4px;
1179
+ height: 28px;
1180
+ padding: 0 12px;
1181
+ border: 1px solid var(--border);
1182
+ border-radius: 24px;
1183
+ background: #fff;
1184
+ font-size: 13px;
1185
+ font-weight: 700;
1186
+ color: var(--link);
1187
+ }
1188
+ .load-more:hover {
1189
+ background: var(--surface-2);
1190
+ }
1191
+ .channel-intro {
1192
+ padding: 24px 20px 16px;
1193
+ }
1194
+ .intro-icon {
1195
+ width: 56px;
1196
+ height: 56px;
1197
+ border-radius: 12px;
1198
+ background: var(--surface-3);
1199
+ display: inline-flex;
1200
+ align-items: center;
1201
+ justify-content: center;
1202
+ margin-bottom: 12px;
1203
+ }
1204
+ .intro-icon .icon {
1205
+ width: 28px;
1206
+ height: 28px;
1207
+ }
1208
+ .intro-title {
1209
+ font-size: 22px;
1210
+ font-weight: 900;
1211
+ line-height: 1.3;
1212
+ margin-bottom: 8px;
1213
+ overflow-wrap: anywhere;
1214
+ }
1215
+ .intro-text {
1216
+ color: var(--text-2);
1217
+ margin-bottom: 12px;
1218
+ }
1219
+ .intro-actions {
1220
+ display: flex;
1221
+ flex-wrap: wrap;
1222
+ gap: 8px;
1223
+ }
1224
+ .state-card {
1225
+ margin: 24px 20px;
1226
+ padding: 24px;
1227
+ border: 1px solid var(--border);
1228
+ border-radius: 12px;
1229
+ text-align: center;
1230
+ max-width: 560px;
1231
+ align-self: center;
1232
+ width: calc(100% - 40px);
1233
+ }
1234
+ .state-card.error {
1235
+ border-color: rgba(224, 30, 90, 0.4);
1236
+ background: #fff6f8;
1237
+ }
1238
+ .state-title {
1239
+ font-size: 18px;
1240
+ font-weight: 900;
1241
+ margin-bottom: 8px;
1242
+ }
1243
+ .state-text {
1244
+ color: var(--text-2);
1245
+ margin-bottom: 12px;
1246
+ }
1247
+ .state-text:last-child {
1248
+ margin-bottom: 0;
1249
+ }
1250
+ .state-actions {
1251
+ display: flex;
1252
+ justify-content: center;
1253
+ gap: 8px;
1254
+ }
1255
+ .skeleton {
1256
+ padding: 12px 20px;
1257
+ }
1258
+ .sk-row {
1259
+ display: flex;
1260
+ gap: 8px;
1261
+ padding: 8px 0;
1262
+ }
1263
+ .sk-avatar {
1264
+ width: 36px;
1265
+ height: 36px;
1266
+ border-radius: 8px;
1267
+ background: var(--surface-3);
1268
+ animation: pulse 1.2s ease-in-out infinite;
1269
+ }
1270
+ .sk-lines {
1271
+ flex: 1;
1272
+ display: flex;
1273
+ flex-direction: column;
1274
+ gap: 8px;
1275
+ padding-top: 4px;
1276
+ }
1277
+ .sk-line {
1278
+ height: 12px;
1279
+ border-radius: 6px;
1280
+ background: var(--surface-3);
1281
+ animation: pulse 1.2s ease-in-out infinite;
1282
+ }
1283
+ .sk-line.short {
1284
+ width: 30%;
1285
+ }
1286
+ .sk-line.medium {
1287
+ width: 60%;
1288
+ }
1289
+ @keyframes pulse {
1290
+ 0%,
1291
+ 100% {
1292
+ opacity: 1;
1293
+ }
1294
+ 50% {
1295
+ opacity: 0.5;
1296
+ }
1297
+ }
1298
+
1299
+ /* Composer */
1300
+ .composer {
1301
+ border: 1px solid var(--border-strong);
1302
+ border-radius: 8px;
1303
+ background: #fff;
1304
+ display: flex;
1305
+ flex-direction: column;
1306
+ overflow: hidden;
1307
+ }
1308
+ .composer:focus-within {
1309
+ border-color: var(--text-2);
1310
+ box-shadow: 0 0 0 1px rgba(29, 28, 29, 0.12);
1311
+ }
1312
+ .composer-toolbar {
1313
+ display: flex;
1314
+ align-items: center;
1315
+ gap: 2px;
1316
+ padding: 4px 6px;
1317
+ background: var(--surface-2);
1318
+ }
1319
+ .composer.hide-toolbar .composer-toolbar {
1320
+ display: none;
1321
+ }
1322
+ .fmt-btn {
1323
+ width: 28px;
1324
+ height: 28px;
1325
+ border-radius: 4px;
1326
+ display: inline-flex;
1327
+ align-items: center;
1328
+ justify-content: center;
1329
+ color: var(--text-2);
1330
+ }
1331
+ .fmt-btn .icon {
1332
+ width: 16px;
1333
+ height: 16px;
1334
+ }
1335
+ .fmt-btn:hover:not(:disabled) {
1336
+ background: var(--hover);
1337
+ color: var(--text);
1338
+ }
1339
+ .fmt-btn[aria-pressed="true"] {
1340
+ background: rgba(29, 28, 29, 0.08);
1341
+ color: var(--text);
1342
+ }
1343
+ .fmt-divider {
1344
+ width: 1px;
1345
+ height: 20px;
1346
+ background: var(--border);
1347
+ margin: 0 4px;
1348
+ }
1349
+ .composer textarea {
1350
+ border: 0;
1351
+ outline: none;
1352
+ resize: none;
1353
+ padding: 10px 12px 6px;
1354
+ min-height: 40px;
1355
+ max-height: 40vh;
1356
+ font-size: 15px;
1357
+ line-height: 22px;
1358
+ color: var(--text);
1359
+ background: transparent;
1360
+ }
1361
+ .composer textarea::placeholder {
1362
+ color: var(--text-2);
1363
+ }
1364
+ .composer-actions {
1365
+ display: flex;
1366
+ align-items: center;
1367
+ justify-content: space-between;
1368
+ padding: 2px 6px 6px 8px;
1369
+ }
1370
+ .composer-actions-start,
1371
+ .composer-actions-end {
1372
+ display: flex;
1373
+ align-items: center;
1374
+ gap: 2px;
1375
+ }
1376
+ .composer-plus {
1377
+ width: 28px;
1378
+ height: 28px;
1379
+ border-radius: 50%;
1380
+ display: inline-flex;
1381
+ align-items: center;
1382
+ justify-content: center;
1383
+ background: var(--hover);
1384
+ color: var(--text-2);
1385
+ margin-right: 4px;
1386
+ }
1387
+ .composer-plus:hover {
1388
+ background: rgba(29, 28, 29, 0.1);
1389
+ color: var(--text);
1390
+ }
1391
+ .send-btn {
1392
+ width: 32px;
1393
+ height: 28px;
1394
+ border-radius: 4px;
1395
+ display: inline-flex;
1396
+ align-items: center;
1397
+ justify-content: center;
1398
+ background: var(--primary);
1399
+ color: #fff;
1400
+ }
1401
+ .send-btn .icon {
1402
+ width: 18px;
1403
+ height: 18px;
1404
+ }
1405
+ .send-btn:hover:not(:disabled) {
1406
+ background: var(--primary-hover);
1407
+ }
1408
+ .send-btn:disabled {
1409
+ background: transparent;
1410
+ color: rgba(29, 28, 29, 0.3);
1411
+ }
1412
+ .composer.disabled {
1413
+ opacity: 0.6;
1414
+ }
1415
+ .composer-note {
1416
+ margin: 6px 4px 0;
1417
+ font-size: 13px;
1418
+ color: var(--danger);
1419
+ display: flex;
1420
+ align-items: center;
1421
+ gap: 8px;
1422
+ }
1423
+ .composer-note .link-btn {
1424
+ color: var(--link);
1425
+ font-weight: 700;
1426
+ }
1427
+ .composer-hint {
1428
+ margin: 4px 8px 0;
1429
+ font-size: 12px;
1430
+ color: var(--text-2);
1431
+ text-align: right;
1432
+ }
1433
+ .composer-banner {
1434
+ border: 1px solid var(--border);
1435
+ border-radius: 8px;
1436
+ padding: 16px;
1437
+ background: var(--surface-2);
1438
+ text-align: center;
1439
+ }
1440
+ .composer-banner p {
1441
+ color: var(--text-2);
1442
+ margin-bottom: 12px;
1443
+ }
1444
+ .composer-banner p:last-child {
1445
+ margin-bottom: 0;
1446
+ }
1447
+ .composer-banner .banner-title {
1448
+ font-weight: 900;
1449
+ color: var(--text);
1450
+ margin-bottom: 4px;
1451
+ }
1452
+ .composer-banner .banner-actions {
1453
+ display: flex;
1454
+ justify-content: center;
1455
+ gap: 8px;
1456
+ }
1457
+ .join-bar {
1458
+ display: flex;
1459
+ flex-direction: column;
1460
+ align-items: center;
1461
+ gap: 12px;
1462
+ padding: 20px;
1463
+ border: 1px solid var(--border);
1464
+ border-radius: 8px;
1465
+ background: var(--surface-2);
1466
+ }
1467
+ .join-bar .join-title {
1468
+ font-size: 18px;
1469
+ font-weight: 900;
1470
+ }
1471
+ .join-bar .join-actions {
1472
+ display: flex;
1473
+ gap: 8px;
1474
+ }
1475
+
1476
+ /* Buttons */
1477
+ .btn {
1478
+ display: inline-flex;
1479
+ align-items: center;
1480
+ justify-content: center;
1481
+ gap: 6px;
1482
+ height: 36px;
1483
+ padding: 0 12px;
1484
+ border-radius: 4px;
1485
+ border: 1px solid var(--border-strong);
1486
+ background: #fff;
1487
+ font-weight: 700;
1488
+ font-size: 15px;
1489
+ color: var(--text);
1490
+ white-space: nowrap;
1491
+ }
1492
+ .btn .icon {
1493
+ width: 16px;
1494
+ height: 16px;
1495
+ }
1496
+ .btn:hover:not(:disabled) {
1497
+ background: var(--surface-2);
1498
+ }
1499
+ .btn.primary {
1500
+ background: var(--primary);
1501
+ border-color: var(--primary);
1502
+ color: #fff;
1503
+ }
1504
+ .btn.primary:hover:not(:disabled) {
1505
+ background: var(--primary-hover);
1506
+ }
1507
+ .btn.danger {
1508
+ background: var(--danger);
1509
+ border-color: var(--danger);
1510
+ color: #fff;
1511
+ }
1512
+ .btn.danger:hover:not(:disabled) {
1513
+ background: var(--danger-hover);
1514
+ }
1515
+ .btn.danger-outline {
1516
+ color: var(--danger);
1517
+ }
1518
+ .btn.small {
1519
+ height: 28px;
1520
+ font-size: 13px;
1521
+ padding: 0 10px;
1522
+ }
1523
+ .btn:disabled {
1524
+ opacity: 0.5;
1525
+ }
1526
+ .btn.joined {
1527
+ color: var(--primary);
1528
+ border-color: transparent;
1529
+ background: transparent;
1530
+ cursor: default;
1531
+ opacity: 1;
1532
+ }
1533
+ .link-btn {
1534
+ color: var(--link);
1535
+ font: inherit;
1536
+ padding: 0;
1537
+ }
1538
+ .link-btn:hover {
1539
+ text-decoration: underline;
1540
+ }
1541
+
1542
+ /* Avatars */
1543
+ .avatar {
1544
+ display: inline-flex;
1545
+ align-items: center;
1546
+ justify-content: center;
1547
+ flex-shrink: 0;
1548
+ color: #fff;
1549
+ font-weight: 900;
1550
+ border-radius: 8px;
1551
+ width: 36px;
1552
+ height: 36px;
1553
+ font-size: 16px;
1554
+ line-height: 1;
1555
+ user-select: none;
1556
+ }
1557
+ .avatar.sm {
1558
+ width: 20px;
1559
+ height: 20px;
1560
+ font-size: 10px;
1561
+ border-radius: 4px;
1562
+ }
1563
+ .avatar.md {
1564
+ width: 24px;
1565
+ height: 24px;
1566
+ font-size: 11px;
1567
+ border-radius: 6px;
1568
+ }
1569
+ .avatar.lg {
1570
+ width: 36px;
1571
+ height: 36px;
1572
+ font-size: 16px;
1573
+ border-radius: 8px;
1574
+ }
1575
+ .avatar.xl {
1576
+ width: 72px;
1577
+ height: 72px;
1578
+ font-size: 32px;
1579
+ border-radius: 12px;
1580
+ }
1581
+ .avatar.xxl {
1582
+ width: 100%;
1583
+ aspect-ratio: 1;
1584
+ height: auto;
1585
+ font-size: 96px;
1586
+ border-radius: 12px;
1587
+ }
1588
+ .avatar.hexa {
1589
+ border-radius: 8px;
1590
+ }
1591
+
1592
+ /* ---------------------------------------------------------------------------------------------
1593
+ Right side panel (thread / profile)
1594
+ --------------------------------------------------------------------------------------------- */
1595
+ .side-panel {
1596
+ width: var(--panel-width);
1597
+ border-left: 1px solid var(--border);
1598
+ display: flex;
1599
+ flex-direction: column;
1600
+ min-height: 0;
1601
+ background: #fff;
1602
+ }
1603
+ .side-header {
1604
+ height: var(--header-height);
1605
+ display: flex;
1606
+ align-items: center;
1607
+ justify-content: space-between;
1608
+ padding: 0 12px 0 16px;
1609
+ border-bottom: 1px solid var(--border);
1610
+ flex-shrink: 0;
1611
+ }
1612
+ .side-title-wrap {
1613
+ display: flex;
1614
+ align-items: baseline;
1615
+ gap: 8px;
1616
+ min-width: 0;
1617
+ }
1618
+ .side-title {
1619
+ font-size: 18px;
1620
+ font-weight: 900;
1621
+ }
1622
+ .side-subtitle {
1623
+ font-size: 13px;
1624
+ color: var(--text-2);
1625
+ overflow: hidden;
1626
+ text-overflow: ellipsis;
1627
+ white-space: nowrap;
1628
+ }
1629
+ .side-body {
1630
+ flex: 1;
1631
+ min-height: 0;
1632
+ overflow-y: auto;
1633
+ display: flex;
1634
+ flex-direction: column;
1635
+ }
1636
+ .thread-messages {
1637
+ padding: 8px 0;
1638
+ }
1639
+ .thread-messages .msg {
1640
+ padding-left: 16px;
1641
+ padding-right: 16px;
1642
+ }
1643
+ .thread-messages .msg-actions {
1644
+ right: 16px;
1645
+ }
1646
+ .replies-divider {
1647
+ display: flex;
1648
+ align-items: center;
1649
+ gap: 8px;
1650
+ padding: 8px 16px;
1651
+ font-size: 13px;
1652
+ color: var(--text-2);
1653
+ }
1654
+ .replies-divider::after {
1655
+ content: "";
1656
+ flex: 1;
1657
+ border-top: 1px solid var(--border);
1658
+ }
1659
+ .thread-composer {
1660
+ padding: 0 16px 16px;
1661
+ margin-top: auto;
1662
+ }
1663
+ .thread-composer .composer textarea {
1664
+ min-height: 36px;
1665
+ }
1666
+ .broadcast-check {
1667
+ display: flex;
1668
+ align-items: center;
1669
+ gap: 6px;
1670
+ font-size: 13px;
1671
+ color: var(--text-2);
1672
+ padding: 0 8px 6px;
1673
+ }
1674
+ .broadcast-check input {
1675
+ margin: 0;
1676
+ accent-color: var(--primary);
1677
+ }
1678
+
1679
+ /* Profile panel */
1680
+ .profile {
1681
+ padding: 16px;
1682
+ }
1683
+ .profile-avatar-wrap {
1684
+ padding: 0 16px 16px;
1685
+ }
1686
+ .profile-name {
1687
+ font-size: 22px;
1688
+ font-weight: 900;
1689
+ display: flex;
1690
+ align-items: center;
1691
+ gap: 8px;
1692
+ overflow-wrap: anywhere;
1693
+ }
1694
+ .profile-handle,
1695
+ .profile-title {
1696
+ color: var(--text-2);
1697
+ font-size: 15px;
1698
+ }
1699
+ .profile-status {
1700
+ margin-top: 8px;
1701
+ font-size: 15px;
1702
+ }
1703
+ .profile-time {
1704
+ display: flex;
1705
+ align-items: center;
1706
+ gap: 6px;
1707
+ margin-top: 8px;
1708
+ color: var(--text-2);
1709
+ font-size: 15px;
1710
+ }
1711
+ .profile-time .icon {
1712
+ width: 16px;
1713
+ height: 16px;
1714
+ }
1715
+ .profile-actions {
1716
+ display: flex;
1717
+ gap: 8px;
1718
+ margin-top: 16px;
1719
+ flex-wrap: wrap;
1720
+ }
1721
+ .profile-section {
1722
+ border-top: 1px solid var(--border);
1723
+ margin-top: 16px;
1724
+ padding-top: 16px;
1725
+ }
1726
+ .profile-section h3 {
1727
+ font-size: 15px;
1728
+ font-weight: 900;
1729
+ margin-bottom: 12px;
1730
+ }
1731
+ .profile-section dl {
1732
+ display: flex;
1733
+ flex-direction: column;
1734
+ gap: 12px;
1735
+ }
1736
+ .profile-section dt {
1737
+ font-size: 13px;
1738
+ font-weight: 700;
1739
+ color: var(--text-2);
1740
+ }
1741
+ .profile-section dd {
1742
+ color: var(--link);
1743
+ overflow-wrap: anywhere;
1744
+ }
1745
+ .profile-section dd.plain {
1746
+ color: var(--text);
1747
+ }
1748
+ .deactivated-badge {
1749
+ font-size: 11px;
1750
+ font-weight: 700;
1751
+ padding: 1px 6px;
1752
+ border-radius: 3px;
1753
+ background: var(--surface-3);
1754
+ color: var(--text-2);
1755
+ text-transform: uppercase;
1756
+ letter-spacing: 0.02em;
1757
+ }
1758
+
1759
+ /* ---------------------------------------------------------------------------------------------
1760
+ Pins, search, browse views
1761
+ --------------------------------------------------------------------------------------------- */
1762
+ .view-scroll {
1763
+ flex: 1;
1764
+ overflow-y: auto;
1765
+ min-height: 0;
1766
+ }
1767
+ .pins-list {
1768
+ padding: 12px 20px;
1769
+ display: flex;
1770
+ flex-direction: column;
1771
+ gap: 12px;
1772
+ }
1773
+ .pin-item {
1774
+ border: 1px solid var(--border);
1775
+ border-radius: 8px;
1776
+ overflow: hidden;
1777
+ }
1778
+ .pin-meta {
1779
+ display: flex;
1780
+ align-items: center;
1781
+ gap: 6px;
1782
+ padding: 8px 12px 0;
1783
+ font-size: 12px;
1784
+ color: var(--text-2);
1785
+ }
1786
+ .pin-meta .icon {
1787
+ width: 14px;
1788
+ height: 14px;
1789
+ }
1790
+ .pin-item .msg {
1791
+ padding-left: 12px;
1792
+ padding-right: 12px;
1793
+ }
1794
+ .pin-item .msg-actions {
1795
+ right: 12px;
1796
+ }
1797
+ .pin-actions {
1798
+ display: flex;
1799
+ gap: 8px;
1800
+ padding: 0 12px 12px 56px;
1801
+ }
1802
+
1803
+ .results-header {
1804
+ padding: 16px 20px 0;
1805
+ border-bottom: 1px solid var(--border);
1806
+ }
1807
+ .results-query {
1808
+ font-size: 22px;
1809
+ font-weight: 900;
1810
+ overflow-wrap: anywhere;
1811
+ margin-bottom: 8px;
1812
+ }
1813
+ .results-tabs {
1814
+ display: flex;
1815
+ gap: 4px;
1816
+ }
1817
+ .results-tab {
1818
+ display: inline-flex;
1819
+ align-items: center;
1820
+ gap: 6px;
1821
+ height: 38px;
1822
+ padding: 0 8px;
1823
+ font-size: 15px;
1824
+ font-weight: 700;
1825
+ color: var(--text-2);
1826
+ border-bottom: 2px solid transparent;
1827
+ margin-bottom: -1px;
1828
+ }
1829
+ .results-tab[aria-current="page"] {
1830
+ color: var(--text);
1831
+ border-bottom-color: var(--text);
1832
+ }
1833
+ .results-tab .count {
1834
+ font-size: 12px;
1835
+ font-weight: 700;
1836
+ padding: 0 6px;
1837
+ border-radius: 9px;
1838
+ background: var(--surface-3);
1839
+ color: var(--text-2);
1840
+ line-height: 18px;
1841
+ }
1842
+ .results-filters {
1843
+ display: flex;
1844
+ align-items: center;
1845
+ gap: 8px;
1846
+ padding: 12px 20px;
1847
+ border-bottom: 1px solid var(--border);
1848
+ flex-wrap: wrap;
1849
+ }
1850
+ .filter-chip {
1851
+ display: inline-flex;
1852
+ align-items: center;
1853
+ gap: 4px;
1854
+ height: 28px;
1855
+ padding: 0 8px 0 10px;
1856
+ border: 1px solid var(--border-strong);
1857
+ border-radius: 14px;
1858
+ font-size: 13px;
1859
+ font-weight: 700;
1860
+ color: var(--text);
1861
+ background: #fff;
1862
+ }
1863
+ .filter-chip .icon {
1864
+ width: 16px;
1865
+ height: 16px;
1866
+ color: var(--text-2);
1867
+ }
1868
+ .filter-chip:hover {
1869
+ background: var(--surface-2);
1870
+ }
1871
+ .filter-chip[aria-pressed="true"] {
1872
+ background: var(--sidebar-active);
1873
+ border-color: var(--sidebar-active);
1874
+ color: #fff;
1875
+ }
1876
+ .filter-chip[aria-pressed="true"] .icon {
1877
+ color: #fff;
1878
+ }
1879
+ .results-sort {
1880
+ margin-left: auto;
1881
+ font-size: 13px;
1882
+ color: var(--text-2);
1883
+ display: inline-flex;
1884
+ align-items: center;
1885
+ gap: 4px;
1886
+ }
1887
+ .result {
1888
+ display: block;
1889
+ width: 100%;
1890
+ padding: 12px 20px;
1891
+ border-bottom: 1px solid var(--border);
1892
+ }
1893
+ .result:hover {
1894
+ background: var(--surface-2);
1895
+ }
1896
+ .result-head {
1897
+ display: flex;
1898
+ align-items: center;
1899
+ gap: 8px;
1900
+ margin-bottom: 4px;
1901
+ font-size: 13px;
1902
+ color: var(--text-2);
1903
+ flex-wrap: wrap;
1904
+ }
1905
+ .result-channel {
1906
+ display: inline-flex;
1907
+ align-items: center;
1908
+ gap: 2px;
1909
+ font-weight: 700;
1910
+ color: var(--text);
1911
+ }
1912
+ .result-channel .icon {
1913
+ width: 14px;
1914
+ height: 14px;
1915
+ }
1916
+ .result-body {
1917
+ display: flex;
1918
+ gap: 8px;
1919
+ }
1920
+ .result-author {
1921
+ font-weight: 900;
1922
+ color: var(--text);
1923
+ margin-right: 6px;
1924
+ }
1925
+ .result-text {
1926
+ overflow-wrap: anywhere;
1927
+ white-space: pre-wrap;
1928
+ line-height: 22px;
1929
+ }
1930
+ .result-text mark {
1931
+ background: #fff3b0;
1932
+ color: inherit;
1933
+ font-weight: 700;
1934
+ }
1935
+ .results-pager {
1936
+ display: flex;
1937
+ align-items: center;
1938
+ justify-content: center;
1939
+ gap: 8px;
1940
+ padding: 16px;
1941
+ font-size: 13px;
1942
+ color: var(--text-2);
1943
+ }
1944
+ .pager-btn {
1945
+ width: 28px;
1946
+ height: 28px;
1947
+ border-radius: 4px;
1948
+ border: 1px solid var(--border);
1949
+ display: inline-flex;
1950
+ align-items: center;
1951
+ justify-content: center;
1952
+ color: var(--text-2);
1953
+ }
1954
+ .pager-btn:hover:not(:disabled) {
1955
+ background: var(--surface-2);
1956
+ }
1957
+ .pager-btn:disabled {
1958
+ opacity: 0.4;
1959
+ }
1960
+ .results-note {
1961
+ padding: 12px 20px;
1962
+ font-size: 13px;
1963
+ color: var(--text-2);
1964
+ }
1965
+
1966
+ .browse-header {
1967
+ display: flex;
1968
+ align-items: center;
1969
+ justify-content: space-between;
1970
+ gap: 12px;
1971
+ padding: 16px 20px 12px;
1972
+ }
1973
+ .browse-header h2 {
1974
+ font-size: 22px;
1975
+ font-weight: 900;
1976
+ }
1977
+ .browse-tools {
1978
+ display: flex;
1979
+ align-items: center;
1980
+ gap: 12px;
1981
+ padding: 0 20px 12px;
1982
+ border-bottom: 1px solid var(--border);
1983
+ flex-wrap: wrap;
1984
+ }
1985
+ .browse-tools .field {
1986
+ flex: 1;
1987
+ min-width: 200px;
1988
+ }
1989
+ .browse-row {
1990
+ display: flex;
1991
+ align-items: center;
1992
+ gap: 12px;
1993
+ padding: 12px 20px;
1994
+ border-bottom: 1px solid var(--border);
1995
+ }
1996
+ .browse-row:hover {
1997
+ background: var(--surface-2);
1998
+ }
1999
+ .browse-main {
2000
+ flex: 1;
2001
+ min-width: 0;
2002
+ }
2003
+ .browse-name {
2004
+ display: inline-flex;
2005
+ align-items: center;
2006
+ gap: 2px;
2007
+ font-weight: 900;
2008
+ color: var(--text);
2009
+ }
2010
+ .browse-name .icon {
2011
+ width: 16px;
2012
+ height: 16px;
2013
+ }
2014
+ .browse-name:hover {
2015
+ text-decoration: underline;
2016
+ }
2017
+ .browse-meta {
2018
+ font-size: 13px;
2019
+ color: var(--text-2);
2020
+ overflow: hidden;
2021
+ text-overflow: ellipsis;
2022
+ white-space: nowrap;
2023
+ }
2024
+ .browse-meta .dot::before {
2025
+ content: "·";
2026
+ margin: 0 4px;
2027
+ }
2028
+ .archived-badge {
2029
+ font-size: 11px;
2030
+ font-weight: 700;
2031
+ padding: 1px 6px;
2032
+ border-radius: 3px;
2033
+ background: var(--surface-3);
2034
+ color: var(--text-2);
2035
+ margin-left: 6px;
2036
+ vertical-align: middle;
2037
+ }
2038
+ .browse-join {
2039
+ opacity: 0;
2040
+ }
2041
+ .browse-row:hover .browse-join,
2042
+ .browse-row:focus-within .browse-join,
2043
+ .browse-join.joined {
2044
+ opacity: 1;
2045
+ }
2046
+
2047
+ /* ---------------------------------------------------------------------------------------------
2048
+ Menus, emoji picker, tooltips
2049
+ --------------------------------------------------------------------------------------------- */
2050
+ .menu {
2051
+ position: fixed;
2052
+ z-index: 40;
2053
+ min-width: 220px;
2054
+ max-width: min(360px, calc(100vw - 16px));
2055
+ max-height: calc(100vh - 16px);
2056
+ overflow-y: auto;
2057
+ padding: 12px 0;
2058
+ background: #fff;
2059
+ border-radius: 6px;
2060
+ box-shadow: var(--shadow-1);
2061
+ color: var(--text);
2062
+ }
2063
+ .menu-header {
2064
+ padding: 4px 24px 8px;
2065
+ font-size: 13px;
2066
+ font-weight: 700;
2067
+ color: var(--text-2);
2068
+ }
2069
+ .menu-item {
2070
+ display: flex;
2071
+ align-items: center;
2072
+ gap: 8px;
2073
+ width: 100%;
2074
+ min-height: 28px;
2075
+ padding: 0 24px;
2076
+ color: var(--text);
2077
+ font-size: 15px;
2078
+ white-space: nowrap;
2079
+ }
2080
+ .menu-item:hover:not(:disabled),
2081
+ .menu-item:focus-visible {
2082
+ background: var(--sidebar-active);
2083
+ color: #fff;
2084
+ outline: none;
2085
+ }
2086
+ .menu-item.danger {
2087
+ color: var(--danger);
2088
+ }
2089
+ .menu-item.danger:hover:not(:disabled),
2090
+ .menu-item.danger:focus-visible {
2091
+ background: var(--danger);
2092
+ color: #fff;
2093
+ }
2094
+ .menu-item:disabled {
2095
+ color: var(--text-3);
2096
+ }
2097
+ .menu-icon {
2098
+ width: 18px;
2099
+ height: 18px;
2100
+ color: inherit;
2101
+ }
2102
+ .menu-label {
2103
+ flex: 1;
2104
+ overflow: hidden;
2105
+ text-overflow: ellipsis;
2106
+ }
2107
+ .menu-detail {
2108
+ font-size: 13px;
2109
+ color: var(--text-2);
2110
+ }
2111
+ .menu-item:hover .menu-detail,
2112
+ .menu-item:focus-visible .menu-detail {
2113
+ color: rgba(255, 255, 255, 0.8);
2114
+ }
2115
+ .menu-divider {
2116
+ border-top: 1px solid var(--border);
2117
+ margin: 8px 0;
2118
+ }
2119
+ .menu-note {
2120
+ padding: 4px 24px 0;
2121
+ font-size: 13px;
2122
+ color: var(--text-2);
2123
+ white-space: normal;
2124
+ }
2125
+ .menu .avatar.sm {
2126
+ border-radius: 4px;
2127
+ }
2128
+
2129
+ .emoji-picker {
2130
+ width: 300px;
2131
+ padding: 8px;
2132
+ }
2133
+ .emoji-search {
2134
+ width: 100%;
2135
+ height: 32px;
2136
+ padding: 0 10px;
2137
+ border: 1px solid var(--border-strong);
2138
+ border-radius: 6px;
2139
+ margin-bottom: 8px;
2140
+ outline: none;
2141
+ }
2142
+ .emoji-search:focus {
2143
+ border-color: var(--focus);
2144
+ box-shadow: 0 0 0 3px rgba(29, 155, 209, 0.3);
2145
+ }
2146
+ .emoji-grid {
2147
+ display: grid;
2148
+ grid-template-columns: repeat(8, 1fr);
2149
+ gap: 2px;
2150
+ }
2151
+ .emoji-cell {
2152
+ height: 34px;
2153
+ border-radius: 6px;
2154
+ display: inline-flex;
2155
+ align-items: center;
2156
+ justify-content: center;
2157
+ font-size: 22px;
2158
+ line-height: 1;
2159
+ }
2160
+ .emoji-cell:hover,
2161
+ .emoji-cell:focus-visible {
2162
+ background: var(--surface-3);
2163
+ }
2164
+ .emoji-custom {
2165
+ display: flex;
2166
+ gap: 6px;
2167
+ margin-top: 8px;
2168
+ align-items: center;
2169
+ }
2170
+ .emoji-custom input {
2171
+ flex: 1;
2172
+ height: 32px;
2173
+ padding: 0 10px;
2174
+ border: 1px solid var(--border-strong);
2175
+ border-radius: 6px;
2176
+ outline: none;
2177
+ font-size: 13px;
2178
+ }
2179
+ .emoji-empty {
2180
+ padding: 12px;
2181
+ text-align: center;
2182
+ color: var(--text-2);
2183
+ font-size: 13px;
2184
+ }
2185
+
2186
+ /* ---------------------------------------------------------------------------------------------
2187
+ Modals
2188
+ --------------------------------------------------------------------------------------------- */
2189
+ .modal {
2190
+ border: 0;
2191
+ padding: 0;
2192
+ border-radius: 12px;
2193
+ width: min(520px, calc(100vw - 32px));
2194
+ max-height: calc(100vh - 48px);
2195
+ box-shadow: var(--shadow-2);
2196
+ color: var(--text);
2197
+ overflow: visible;
2198
+ }
2199
+ .modal::backdrop {
2200
+ background: rgba(29, 28, 29, 0.6);
2201
+ }
2202
+ .modal form {
2203
+ display: contents;
2204
+ }
2205
+ .modal-header {
2206
+ display: flex;
2207
+ align-items: flex-start;
2208
+ justify-content: space-between;
2209
+ gap: 12px;
2210
+ padding: 20px 28px 12px;
2211
+ }
2212
+ .modal-header h2 {
2213
+ font-size: 22px;
2214
+ font-weight: 900;
2215
+ line-height: 1.3;
2216
+ }
2217
+ .modal-subtitle {
2218
+ font-size: 15px;
2219
+ color: var(--text-2);
2220
+ margin-top: 2px;
2221
+ }
2222
+ .modal-close {
2223
+ margin: -4px -8px 0 0;
2224
+ }
2225
+ .modal-body {
2226
+ padding: 4px 28px 24px;
2227
+ overflow-y: auto;
2228
+ max-height: calc(100vh - 220px);
2229
+ }
2230
+ .modal-footer {
2231
+ display: flex;
2232
+ justify-content: flex-end;
2233
+ gap: 8px;
2234
+ padding: 0 28px 24px;
2235
+ }
2236
+ .modal-error {
2237
+ margin-top: 12px;
2238
+ font-size: 13px;
2239
+ color: var(--danger);
2240
+ font-weight: 700;
2241
+ }
2242
+ .field-label {
2243
+ display: block;
2244
+ font-size: 15px;
2245
+ font-weight: 700;
2246
+ margin-bottom: 8px;
2247
+ }
2248
+ .field {
2249
+ display: flex;
2250
+ align-items: center;
2251
+ height: 44px;
2252
+ border: 1px solid var(--border-strong);
2253
+ border-radius: 4px;
2254
+ padding: 0 12px;
2255
+ gap: 8px;
2256
+ background: #fff;
2257
+ }
2258
+ .field:focus-within {
2259
+ border-color: var(--focus);
2260
+ box-shadow: 0 0 0 4px rgba(29, 155, 209, 0.3);
2261
+ }
2262
+ .field input {
2263
+ flex: 1;
2264
+ min-width: 0;
2265
+ border: 0;
2266
+ outline: none;
2267
+ background: transparent;
2268
+ font-size: 15px;
2269
+ }
2270
+ .field-prefix {
2271
+ color: var(--text-2);
2272
+ display: inline-flex;
2273
+ }
2274
+ .field-prefix .icon {
2275
+ width: 18px;
2276
+ height: 18px;
2277
+ }
2278
+ .field-counter {
2279
+ font-size: 13px;
2280
+ color: var(--text-2);
2281
+ }
2282
+ .field-hint {
2283
+ font-size: 13px;
2284
+ color: var(--text-2);
2285
+ margin-top: 8px;
2286
+ }
2287
+ .field-textarea {
2288
+ width: 100%;
2289
+ border: 1px solid var(--border-strong);
2290
+ border-radius: 4px;
2291
+ padding: 10px 12px;
2292
+ font-size: 15px;
2293
+ resize: vertical;
2294
+ outline: none;
2295
+ }
2296
+ .field-textarea:focus {
2297
+ border-color: var(--focus);
2298
+ box-shadow: 0 0 0 4px rgba(29, 155, 209, 0.3);
2299
+ }
2300
+ .visibility {
2301
+ border: 0;
2302
+ padding: 0;
2303
+ margin: 20px 0 0;
2304
+ }
2305
+ .radio {
2306
+ display: flex;
2307
+ align-items: flex-start;
2308
+ gap: 10px;
2309
+ padding: 6px 0;
2310
+ cursor: pointer;
2311
+ }
2312
+ .radio input {
2313
+ margin: 4px 0 0;
2314
+ accent-color: var(--sidebar-active);
2315
+ }
2316
+ .radio small {
2317
+ color: var(--text-2);
2318
+ }
2319
+ .confirm-preview {
2320
+ margin-top: 12px;
2321
+ border: 1px solid var(--border);
2322
+ border-radius: 8px;
2323
+ padding: 4px 0;
2324
+ }
2325
+ .confirm-preview .msg {
2326
+ padding-left: 12px;
2327
+ padding-right: 12px;
2328
+ }
2329
+ .confirm-preview .msg:hover {
2330
+ background: transparent;
2331
+ }
2332
+ .confirm-preview .msg-actions {
2333
+ display: none !important;
2334
+ }
2335
+
2336
+ .people-selected {
2337
+ display: flex;
2338
+ flex-wrap: wrap;
2339
+ gap: 6px;
2340
+ margin-top: 8px;
2341
+ }
2342
+ .people-selected:empty {
2343
+ display: none;
2344
+ }
2345
+ .chip {
2346
+ display: inline-flex;
2347
+ align-items: center;
2348
+ gap: 6px;
2349
+ height: 26px;
2350
+ padding: 0 4px 0 4px;
2351
+ border-radius: 4px;
2352
+ background: var(--surface-3);
2353
+ font-size: 13px;
2354
+ font-weight: 700;
2355
+ }
2356
+ .chip .avatar.sm {
2357
+ border-radius: 3px;
2358
+ }
2359
+ .chip-remove {
2360
+ width: 20px;
2361
+ height: 20px;
2362
+ display: inline-flex;
2363
+ align-items: center;
2364
+ justify-content: center;
2365
+ border-radius: 4px;
2366
+ color: var(--text-2);
2367
+ }
2368
+ .chip-remove .icon {
2369
+ width: 14px;
2370
+ height: 14px;
2371
+ }
2372
+ .chip-remove:hover {
2373
+ background: rgba(29, 28, 29, 0.1);
2374
+ }
2375
+ .people-list {
2376
+ margin-top: 12px;
2377
+ max-height: 280px;
2378
+ overflow-y: auto;
2379
+ border: 1px solid var(--border);
2380
+ border-radius: 8px;
2381
+ }
2382
+ .person-row {
2383
+ display: flex;
2384
+ align-items: center;
2385
+ gap: 10px;
2386
+ width: 100%;
2387
+ padding: 8px 12px;
2388
+ }
2389
+ .person-row:hover:not(:disabled),
2390
+ .person-row[aria-selected="true"] {
2391
+ background: var(--surface-2);
2392
+ }
2393
+ .person-row:disabled {
2394
+ opacity: 0.5;
2395
+ }
2396
+ .person-name {
2397
+ font-weight: 700;
2398
+ }
2399
+ .person-handle {
2400
+ color: var(--text-2);
2401
+ font-size: 13px;
2402
+ margin-left: 6px;
2403
+ }
2404
+ .person-title {
2405
+ font-size: 13px;
2406
+ color: var(--text-2);
2407
+ }
2408
+ .person-check {
2409
+ margin-left: auto;
2410
+ width: 20px;
2411
+ height: 20px;
2412
+ border: 1px solid var(--border-strong);
2413
+ border-radius: 4px;
2414
+ display: inline-flex;
2415
+ align-items: center;
2416
+ justify-content: center;
2417
+ color: #fff;
2418
+ }
2419
+ .person-row[aria-selected="true"] .person-check {
2420
+ background: var(--sidebar-active);
2421
+ border-color: var(--sidebar-active);
2422
+ }
2423
+ .person-check .icon {
2424
+ width: 14px;
2425
+ height: 14px;
2426
+ }
2427
+ .people-empty {
2428
+ padding: 16px;
2429
+ text-align: center;
2430
+ color: var(--text-2);
2431
+ font-size: 13px;
2432
+ }
2433
+
2434
+ .details-title {
2435
+ display: flex;
2436
+ align-items: center;
2437
+ gap: 4px;
2438
+ }
2439
+ .details-title .icon {
2440
+ width: 20px;
2441
+ height: 20px;
2442
+ }
2443
+ .modal-tabs {
2444
+ display: flex;
2445
+ gap: 4px;
2446
+ padding: 0 28px;
2447
+ border-bottom: 1px solid var(--border);
2448
+ }
2449
+ .modal-tab {
2450
+ height: 38px;
2451
+ padding: 0 8px;
2452
+ font-size: 15px;
2453
+ font-weight: 700;
2454
+ color: var(--text-2);
2455
+ border-bottom: 2px solid transparent;
2456
+ margin-bottom: -1px;
2457
+ display: inline-flex;
2458
+ align-items: center;
2459
+ gap: 6px;
2460
+ }
2461
+ .modal-tab[aria-current="page"] {
2462
+ color: var(--text);
2463
+ border-bottom-color: var(--text);
2464
+ }
2465
+ .details-body {
2466
+ padding: 16px 28px 24px;
2467
+ min-height: 240px;
2468
+ }
2469
+ .detail-block {
2470
+ border: 1px solid var(--border);
2471
+ border-radius: 12px;
2472
+ padding: 0;
2473
+ margin-bottom: 12px;
2474
+ overflow: hidden;
2475
+ }
2476
+ .detail-row {
2477
+ display: flex;
2478
+ align-items: flex-start;
2479
+ justify-content: space-between;
2480
+ gap: 12px;
2481
+ padding: 12px 16px;
2482
+ }
2483
+ .detail-row + .detail-row {
2484
+ border-top: 1px solid var(--border);
2485
+ }
2486
+ .detail-label {
2487
+ font-weight: 900;
2488
+ font-size: 15px;
2489
+ margin-bottom: 2px;
2490
+ }
2491
+ .detail-value {
2492
+ color: var(--text);
2493
+ overflow-wrap: anywhere;
2494
+ }
2495
+ .detail-value.muted {
2496
+ color: var(--text-2);
2497
+ }
2498
+ .detail-edit {
2499
+ color: var(--link);
2500
+ font-weight: 700;
2501
+ font-size: 13px;
2502
+ flex-shrink: 0;
2503
+ }
2504
+ .detail-edit:hover {
2505
+ text-decoration: underline;
2506
+ }
2507
+ .detail-footer {
2508
+ font-size: 12px;
2509
+ color: var(--text-3);
2510
+ margin-top: 8px;
2511
+ }
2512
+ .member-row {
2513
+ display: flex;
2514
+ align-items: center;
2515
+ gap: 10px;
2516
+ padding: 8px 0;
2517
+ width: 100%;
2518
+ border-radius: 6px;
2519
+ }
2520
+ .member-row:hover {
2521
+ background: var(--surface-2);
2522
+ }
2523
+ .member-main {
2524
+ min-width: 0;
2525
+ flex: 1;
2526
+ }
2527
+ .member-name {
2528
+ font-weight: 900;
2529
+ display: flex;
2530
+ align-items: center;
2531
+ gap: 6px;
2532
+ }
2533
+ .member-sub {
2534
+ font-size: 13px;
2535
+ color: var(--text-2);
2536
+ overflow: hidden;
2537
+ text-overflow: ellipsis;
2538
+ white-space: nowrap;
2539
+ }
2540
+ .members-toolbar {
2541
+ display: flex;
2542
+ gap: 8px;
2543
+ align-items: center;
2544
+ margin-bottom: 8px;
2545
+ }
2546
+ .members-toolbar .field {
2547
+ flex: 1;
2548
+ height: 36px;
2549
+ }
2550
+ .settings-row {
2551
+ display: flex;
2552
+ align-items: center;
2553
+ justify-content: space-between;
2554
+ gap: 12px;
2555
+ padding: 12px 16px;
2556
+ }
2557
+ .settings-row + .settings-row {
2558
+ border-top: 1px solid var(--border);
2559
+ }
2560
+
2561
+ .about-body {
2562
+ padding-top: 8px;
2563
+ }
2564
+ .about-brand {
2565
+ display: flex;
2566
+ align-items: center;
2567
+ gap: 12px;
2568
+ margin-bottom: 16px;
2569
+ }
2570
+ .about-wordmark {
2571
+ height: 24px;
2572
+ width: auto;
2573
+ }
2574
+ .about-list {
2575
+ display: grid;
2576
+ grid-template-columns: max-content 1fr;
2577
+ gap: 8px 16px;
2578
+ font-size: 15px;
2579
+ margin-bottom: 12px;
2580
+ }
2581
+ .about-list dt {
2582
+ font-weight: 700;
2583
+ color: var(--text-2);
2584
+ }
2585
+ .about-list dd {
2586
+ overflow-wrap: anywhere;
2587
+ }
2588
+
2589
+ /* Toast */
2590
+ .toast {
2591
+ position: fixed;
2592
+ left: 50%;
2593
+ bottom: 24px;
2594
+ transform: translateX(-50%);
2595
+ z-index: 50;
2596
+ background: var(--text);
2597
+ color: #fff;
2598
+ padding: 10px 16px;
2599
+ border-radius: 8px;
2600
+ font-size: 15px;
2601
+ font-weight: 700;
2602
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
2603
+ max-width: min(600px, calc(100vw - 32px));
2604
+ }
2605
+ .toast[data-error="true"] {
2606
+ background: var(--danger);
2607
+ }
2608
+
2609
+ /* ---------------------------------------------------------------------------------------------
2610
+ Responsive
2611
+ --------------------------------------------------------------------------------------------- */
2612
+ @media (max-width: 1100px) {
2613
+ :root {
2614
+ --panel-width: 340px;
2615
+ }
2616
+ }
2617
+ @media (max-width: 900px) {
2618
+ .side-panel {
2619
+ position: absolute;
2620
+ right: 0;
2621
+ top: 0;
2622
+ bottom: 0;
2623
+ width: min(var(--panel-width), 100%);
2624
+ z-index: 20;
2625
+ box-shadow: -8px 0 24px rgba(0, 0, 0, 0.2);
2626
+ }
2627
+ .workspace {
2628
+ position: relative;
2629
+ }
2630
+ }
2631
+ @media (max-width: 768px) {
2632
+ :root {
2633
+ --rail-width: 0px;
2634
+ --sidebar-width: 280px;
2635
+ }
2636
+ .rail {
2637
+ display: none;
2638
+ }
2639
+ .shell {
2640
+ grid-template-columns: 1fr;
2641
+ grid-template-areas:
2642
+ "topbar"
2643
+ "workspace";
2644
+ }
2645
+ .topbar {
2646
+ grid-template-columns: auto minmax(0, 1fr) auto;
2647
+ padding: 0 8px;
2648
+ }
2649
+ .topbar-start {
2650
+ padding-right: 8px;
2651
+ }
2652
+ #nav-menu {
2653
+ display: inline-flex;
2654
+ }
2655
+ #nav-back,
2656
+ #nav-forward,
2657
+ #nav-history {
2658
+ display: none;
2659
+ }
2660
+ .workspace {
2661
+ grid-template-columns: minmax(0, 1fr);
2662
+ margin: 0;
2663
+ border-radius: 0;
2664
+ border: 0;
2665
+ }
2666
+ .sidebar {
2667
+ position: absolute;
2668
+ left: 0;
2669
+ top: 0;
2670
+ bottom: 0;
2671
+ width: var(--sidebar-width);
2672
+ z-index: 30;
2673
+ transform: translateX(-100%);
2674
+ transition: transform 0.2s;
2675
+ box-shadow: 8px 0 24px rgba(0, 0, 0, 0.3);
2676
+ }
2677
+ .shell.sidebar-open .sidebar {
2678
+ transform: translateX(0);
2679
+ }
2680
+ .side-panel {
2681
+ width: 100%;
2682
+ }
2683
+ .pane-header {
2684
+ padding: 0 8px 0 12px;
2685
+ }
2686
+ .pane-footer {
2687
+ padding: 0 12px 12px;
2688
+ }
2689
+ .msg {
2690
+ padding-left: 12px;
2691
+ padding-right: 12px;
2692
+ }
2693
+ .msg-actions {
2694
+ right: 12px;
2695
+ }
2696
+ .day-divider {
2697
+ margin-left: 12px;
2698
+ margin-right: 12px;
2699
+ }
2700
+ .members-count {
2701
+ display: none;
2702
+ }
2703
+ .pane-topic {
2704
+ display: none;
2705
+ }
2706
+ .modal-header,
2707
+ .modal-body,
2708
+ .modal-footer,
2709
+ .modal-tabs,
2710
+ .details-body {
2711
+ padding-left: 16px;
2712
+ padding-right: 16px;
2713
+ }
2714
+ .state-card {
2715
+ margin: 16px 12px;
2716
+ width: calc(100% - 24px);
2717
+ padding: 16px;
2718
+ }
2719
+ }