@fyresmith/hive-server 4.0.1 → 5.0.0

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.
@@ -0,0 +1,1040 @@
1
+ /* ============================================================
2
+ Hive — plugin styles
3
+ ============================================================ */
4
+
5
+ /* ============================================================
6
+ Offline modal
7
+ ============================================================ */
8
+
9
+ #hive-offline-overlay {
10
+ position: fixed;
11
+ inset: 0;
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: center;
15
+ padding: 20px;
16
+ background:
17
+ radial-gradient(circle at 50% 22%, rgba(255, 255, 255, 0.08), transparent 48%),
18
+ var(--background-modifier-cover, rgba(0, 0, 0, 0.5));
19
+ backdrop-filter: blur(4px);
20
+ z-index: 9999;
21
+ }
22
+
23
+ #hive-offline-modal {
24
+ width: min(480px, 100%);
25
+ background: var(--background-primary);
26
+ border: 1px solid var(--background-modifier-border);
27
+ border-radius: 18px;
28
+ box-shadow: 0 20px 48px rgba(0, 0, 0, 0.38);
29
+ padding: 24px 24px 20px;
30
+ text-align: center;
31
+ }
32
+
33
+ #hive-offline-modal .hive-offline-icon {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ margin: 0 auto 12px;
38
+ width: 40px;
39
+ height: 40px;
40
+ border-radius: 50%;
41
+ background: color-mix(in srgb, var(--text-accent) 12%, transparent);
42
+ color: var(--text-accent);
43
+ }
44
+
45
+ #hive-offline-modal .hive-offline-icon svg {
46
+ width: 20px;
47
+ height: 20px;
48
+ }
49
+
50
+ #hive-offline-modal .hive-offline-title {
51
+ margin: 0;
52
+ font-size: 20px;
53
+ letter-spacing: -0.01em;
54
+ }
55
+
56
+ #hive-offline-modal .hive-offline-subtitle {
57
+ margin: 10px auto 0;
58
+ color: var(--text-muted);
59
+ line-height: 1.4;
60
+ max-width: 40ch;
61
+ }
62
+
63
+ #hive-offline-modal .hive-offline-actions {
64
+ margin-top: 16px;
65
+ display: flex;
66
+ flex-wrap: wrap;
67
+ justify-content: center;
68
+ align-items: center;
69
+ gap: 8px;
70
+ }
71
+
72
+ #hive-offline-modal button {
73
+ min-width: 156px;
74
+ }
75
+
76
+ #hive-offline-modal.is-connecting .hive-offline-actions {
77
+ margin-top: 18px;
78
+ }
79
+
80
+ .hive-offline-loader {
81
+ margin: 14px auto 0;
82
+ display: inline-flex;
83
+ align-items: center;
84
+ gap: 8px;
85
+ height: 18px;
86
+ }
87
+
88
+ .hive-offline-loader-dot {
89
+ width: 7px;
90
+ height: 7px;
91
+ border-radius: 999px;
92
+ background: var(--text-accent);
93
+ opacity: 0.35;
94
+ animation: hive-offline-bounce 0.9s ease-in-out infinite;
95
+ will-change: transform, opacity;
96
+ }
97
+
98
+ .hive-offline-loader-dot:nth-child(2) {
99
+ animation-delay: 0.12s;
100
+ }
101
+
102
+ .hive-offline-loader-dot:nth-child(3) {
103
+ animation-delay: 0.24s;
104
+ }
105
+
106
+ @keyframes hive-offline-bounce {
107
+ 0%, 80%, 100% {
108
+ transform: translateY(0);
109
+ opacity: 0.28;
110
+ }
111
+ 40% {
112
+ transform: translateY(-4px);
113
+ opacity: 0.92;
114
+ }
115
+ }
116
+
117
+ /* Inline settings panel inside offline modal */
118
+ .hive-offline-settings {
119
+ margin: 16px 0 0;
120
+ padding: 14px 0 0;
121
+ border-top: 1px solid var(--background-modifier-border);
122
+ text-align: left;
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: 10px;
126
+ }
127
+
128
+ .hive-offline-settings-label {
129
+ font-size: 11px;
130
+ font-weight: 600;
131
+ text-transform: uppercase;
132
+ letter-spacing: 0.05em;
133
+ color: var(--text-muted);
134
+ margin-bottom: 4px;
135
+ }
136
+
137
+ .hive-offline-settings input[type="text"] {
138
+ width: 100%;
139
+ box-sizing: border-box;
140
+ }
141
+
142
+ .hive-offline-user-row {
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 8px;
146
+ }
147
+
148
+ .hive-offline-user-avatar {
149
+ width: 24px;
150
+ height: 24px;
151
+ border-radius: 50%;
152
+ object-fit: cover;
153
+ flex-shrink: 0;
154
+ }
155
+
156
+ .hive-offline-user-name {
157
+ font-size: 13px;
158
+ font-weight: 500;
159
+ flex: 1;
160
+ }
161
+
162
+ .hive-offline-not-signed-in {
163
+ font-size: 12px;
164
+ color: var(--text-muted);
165
+ margin: 0;
166
+ }
167
+
168
+ /* ============================================================
169
+ Settings panel
170
+ ============================================================ */
171
+
172
+ .hive-settings .hive-settings-card {
173
+ border: 1px solid var(--background-modifier-border);
174
+ background: var(--background-secondary);
175
+ border-radius: 12px;
176
+ padding: 16px;
177
+ margin-bottom: 14px;
178
+ }
179
+
180
+ .hive-settings .hive-status-label {
181
+ display: inline-flex;
182
+ padding: 4px 10px;
183
+ border-radius: 999px;
184
+ background: var(--background-modifier-hover);
185
+ color: var(--text-muted);
186
+ font-size: 12px;
187
+ font-weight: 600;
188
+ }
189
+
190
+ .hive-settings .hive-status-label[data-status="connected"] {
191
+ background: color-mix(in srgb, var(--color-green) 15%, transparent);
192
+ color: var(--color-green);
193
+ }
194
+
195
+ .hive-settings .hive-status-label[data-status="connecting"] {
196
+ background: color-mix(in srgb, var(--color-yellow) 15%, transparent);
197
+ color: var(--color-yellow);
198
+ }
199
+
200
+ .hive-settings .hive-status-label[data-status="auth-required"] {
201
+ background: color-mix(in srgb, var(--color-orange) 15%, transparent);
202
+ color: var(--color-orange);
203
+ }
204
+
205
+ .hive-settings .hive-status-label[data-status="disconnected"] {
206
+ background: color-mix(in srgb, var(--color-red) 15%, transparent);
207
+ color: var(--color-red);
208
+ }
209
+
210
+ .hive-settings .hive-user-row {
211
+ margin-top: 12px;
212
+ display: flex;
213
+ align-items: center;
214
+ gap: 12px;
215
+ }
216
+
217
+ .hive-settings .hive-user-avatar {
218
+ width: 42px;
219
+ height: 42px;
220
+ border-radius: 50%;
221
+ object-fit: cover;
222
+ }
223
+
224
+ .hive-settings .hive-user-meta {
225
+ display: flex;
226
+ flex-direction: column;
227
+ gap: 2px;
228
+ }
229
+
230
+ .hive-settings .hive-user-name {
231
+ font-weight: 600;
232
+ }
233
+
234
+ .hive-settings .hive-user-empty {
235
+ color: var(--text-muted);
236
+ font-size: 12px;
237
+ margin-top: 10px;
238
+ }
239
+
240
+ .hive-settings .hive-settings-actions {
241
+ margin-top: 14px;
242
+ display: flex;
243
+ flex-wrap: wrap;
244
+ gap: 10px;
245
+ }
246
+
247
+ .hive-settings hr.hive-section-divider {
248
+ border: none;
249
+ border-top: 1px solid var(--background-modifier-border);
250
+ margin: 20px 0 8px;
251
+ }
252
+
253
+ /* Offline editor state */
254
+ .vault-offline .cm-content {
255
+ opacity: 0.5;
256
+ transition: opacity 0.2s;
257
+ }
258
+
259
+ .vault-offline .cm-cursor {
260
+ display: none !important;
261
+ }
262
+
263
+ .vault-offline .workspace {
264
+ filter: grayscale(0.15);
265
+ }
266
+
267
+ /* Per-editor collab loading gate */
268
+ .hive-collab-container {
269
+ position: relative;
270
+ }
271
+
272
+ .hive-collab-lock .cm-editor {
273
+ pointer-events: none;
274
+ }
275
+
276
+ .hive-collab-loading-overlay {
277
+ position: absolute;
278
+ inset: 0;
279
+ display: none;
280
+ align-items: center;
281
+ justify-content: center;
282
+ background: color-mix(in srgb, var(--background-primary) 65%, transparent);
283
+ z-index: 25;
284
+ }
285
+
286
+ .hive-collab-loading-overlay.is-visible {
287
+ display: flex;
288
+ }
289
+
290
+ .hive-collab-loading-card {
291
+ display: inline-flex;
292
+ align-items: center;
293
+ gap: 10px;
294
+ padding: 10px 14px;
295
+ border-radius: 999px;
296
+ background: var(--background-secondary);
297
+ border: 1px solid var(--background-modifier-border);
298
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.22);
299
+ }
300
+
301
+ .hive-collab-loading-text {
302
+ font-size: 12px;
303
+ color: var(--text-muted);
304
+ }
305
+
306
+ .hive-collab-spinner {
307
+ width: 14px;
308
+ height: 14px;
309
+ border-radius: 50%;
310
+ border: 2px solid var(--background-modifier-border);
311
+ border-top-color: var(--text-accent);
312
+ animation: hive-spin 0.8s linear infinite;
313
+ will-change: transform;
314
+ }
315
+
316
+ @keyframes hive-spin {
317
+ from { transform: rotate(0deg); }
318
+ to { transform: rotate(360deg); }
319
+ }
320
+
321
+ /* ============================================================
322
+ File tree avatar chips
323
+ ============================================================ */
324
+
325
+ .hive-avatars {
326
+ position: absolute;
327
+ right: 8px;
328
+ top: 50%;
329
+ transform: translateY(-50%);
330
+ display: inline-flex;
331
+ align-items: center;
332
+ max-width: 88px;
333
+ justify-content: flex-end;
334
+ }
335
+
336
+ .nav-file-title.has-hive-avatars {
337
+ padding-right: 76px;
338
+ }
339
+
340
+ .hive-avatar {
341
+ width: 16px;
342
+ height: 16px;
343
+ border-radius: 50%;
344
+ border: 2px solid transparent;
345
+ margin-left: -4px;
346
+ object-fit: cover;
347
+ background: var(--background-secondary);
348
+ }
349
+
350
+ .hive-avatar:first-child {
351
+ margin-left: 0;
352
+ }
353
+
354
+ .hive-avatar-fallback {
355
+ display: inline-flex;
356
+ align-items: center;
357
+ justify-content: center;
358
+ font-size: 8px;
359
+ font-weight: 700;
360
+ color: #fff;
361
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
362
+ flex-shrink: 0;
363
+ }
364
+
365
+ .hive-avatar-overflow {
366
+ display: inline-flex;
367
+ align-items: center;
368
+ justify-content: center;
369
+ width: 16px;
370
+ height: 16px;
371
+ border-radius: 999px;
372
+ background: var(--background-modifier-hover);
373
+ border: 2px solid var(--background-modifier-border);
374
+ font-size: 8px;
375
+ font-weight: 700;
376
+ color: var(--text-muted);
377
+ margin-left: -4px;
378
+ flex-shrink: 0;
379
+ }
380
+
381
+ .hive-avatar.is-typing {
382
+ animation: hive-pulse 1.2s ease-in-out infinite alternate;
383
+ will-change: transform;
384
+ }
385
+
386
+ @keyframes hive-pulse {
387
+ from { transform: scale(1); }
388
+ to { transform: scale(1.1); }
389
+ }
390
+
391
+ /* ============================================================
392
+ Yjs in-editor presence — selections and cursor labels
393
+ ============================================================ */
394
+
395
+ /* Shared selection highlight */
396
+ .cm-ySelection {
397
+ opacity: 0.2;
398
+ border-radius: 3px;
399
+ box-shadow: none;
400
+ }
401
+
402
+ /* Remote caret */
403
+ .cm-ySelectionCaret {
404
+ position: relative;
405
+ border-left-width: 2px !important;
406
+ border-right-width: 0 !important;
407
+ margin-left: -1px;
408
+ border-radius: 0;
409
+ filter: none;
410
+ }
411
+
412
+ .cm-ySelectionCaretDot {
413
+ display: none !important;
414
+ }
415
+
416
+ .cm-ySelectionCaret::before {
417
+ content: '';
418
+ position: absolute;
419
+ top: -2px;
420
+ left: -2px;
421
+ width: 5px;
422
+ height: 5px;
423
+ background-color: inherit;
424
+ border-radius: 1px;
425
+ }
426
+
427
+ /* Cursor name label */
428
+ .cm-editor .cm-ySelectionInfo {
429
+ position: absolute;
430
+ top: -2.05em;
431
+ left: -1px;
432
+ font-family: var(--font-interface, system-ui, -apple-system, sans-serif);
433
+ font-size: 11px;
434
+ font-weight: 500;
435
+ padding: 3px 7px;
436
+ border-radius: 6px;
437
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
438
+ white-space: nowrap;
439
+ pointer-events: none;
440
+ z-index: 100;
441
+ opacity: 0;
442
+ box-shadow: none;
443
+ letter-spacing: 0;
444
+ line-height: 1;
445
+ border: 1px solid rgba(255, 255, 255, 0.2);
446
+ transition: opacity 0.14s ease;
447
+ }
448
+
449
+ .cm-ySelectionCaret:hover > .cm-ySelectionInfo {
450
+ opacity: 1;
451
+ }
452
+
453
+ .cm-ySelectionInfo.hive-caret-profile-info {
454
+ width: 26px;
455
+ height: 26px;
456
+ border-radius: 999px;
457
+ padding: 0;
458
+ overflow: hidden;
459
+ background: transparent !important;
460
+ border: 0;
461
+ }
462
+
463
+ .hive-caret-profile-image {
464
+ width: 100%;
465
+ height: 100%;
466
+ display: block;
467
+ object-fit: cover;
468
+ border-radius: inherit;
469
+ border: 2px solid var(--hive-caret-color, #fff);
470
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.26);
471
+ }
472
+
473
+ .cm-ySelectionCaret:hover > .cm-ySelectionInfo.hive-caret-profile-info {
474
+ opacity: 1;
475
+ }
476
+
477
+ /* ============================================================
478
+ Accessibility — reduced motion
479
+ ============================================================ */
480
+
481
+ @media (prefers-reduced-motion: reduce) {
482
+ .hive-offline-loader-dot,
483
+ .hive-collab-spinner,
484
+ .hive-avatar.is-typing {
485
+ animation: none;
486
+ }
487
+ }
488
+
489
+ /* ============================================================
490
+ Reconnect Banner
491
+ ============================================================ */
492
+
493
+ #hive-reconnect-banner {
494
+ position: fixed;
495
+ top: 0;
496
+ left: 0;
497
+ right: 0;
498
+ z-index: 9000;
499
+ display: flex;
500
+ align-items: center;
501
+ justify-content: center;
502
+ gap: 12px;
503
+ padding: 8px 16px;
504
+ background: color-mix(in srgb, var(--color-yellow) 18%, var(--background-primary));
505
+ border-bottom: 1px solid color-mix(in srgb, var(--color-yellow) 40%, transparent);
506
+ color: var(--color-yellow);
507
+ font-size: 13px;
508
+ }
509
+
510
+ .hive-reconnect-text {
511
+ display: flex;
512
+ align-items: center;
513
+ gap: 2px;
514
+ }
515
+
516
+ .hive-reconnect-dots {
517
+ display: inline-block;
518
+ animation: hive-reconnect-dots 1.2s step-end infinite;
519
+ min-width: 1.5ch;
520
+ }
521
+
522
+ @keyframes hive-reconnect-dots {
523
+ 0% { content: '.'; }
524
+ 33% { content: '..'; }
525
+ 66% { content: '...'; }
526
+ 100% { content: ''; }
527
+ }
528
+
529
+ .hive-reconnect-btn {
530
+ padding: 3px 10px;
531
+ font-size: 12px;
532
+ border-radius: 999px;
533
+ background: color-mix(in srgb, var(--color-yellow) 20%, transparent);
534
+ border: 1px solid color-mix(in srgb, var(--color-yellow) 50%, transparent);
535
+ color: var(--color-yellow);
536
+ cursor: pointer;
537
+ }
538
+
539
+ .hive-reconnect-btn:hover {
540
+ background: color-mix(in srgb, var(--color-yellow) 30%, transparent);
541
+ }
542
+
543
+ /* ============================================================
544
+ Users Panel (sidebar ItemView)
545
+ ============================================================ */
546
+
547
+ .hive-users-panel {
548
+ display: flex;
549
+ flex-direction: column;
550
+ height: 100%;
551
+ overflow-y: auto;
552
+ }
553
+
554
+ /* ── Connection header ─────────────────────────────────────── */
555
+
556
+ .hive-panel-conn-header {
557
+ display: flex;
558
+ align-items: center;
559
+ gap: 7px;
560
+ padding: 8px 12px;
561
+ font-size: 11px;
562
+ font-weight: 600;
563
+ color: var(--text-muted);
564
+ border-bottom: 1px solid var(--background-modifier-border);
565
+ flex-shrink: 0;
566
+ }
567
+
568
+ .hive-conn-dot {
569
+ width: 7px;
570
+ height: 7px;
571
+ border-radius: 50%;
572
+ flex-shrink: 0;
573
+ background: var(--color-red);
574
+ opacity: 0.6;
575
+ }
576
+
577
+ .hive-conn-dot.is-connected {
578
+ background: var(--color-green);
579
+ opacity: 1;
580
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-green) 22%, transparent);
581
+ }
582
+
583
+ .hive-conn-dot.is-connecting {
584
+ background: var(--color-yellow);
585
+ opacity: 1;
586
+ }
587
+
588
+ /* ── Section layout ────────────────────────────────────────── */
589
+
590
+ .hive-panel-section {
591
+ display: flex;
592
+ flex-direction: column;
593
+ gap: 6px;
594
+ padding: 14px 10px 8px;
595
+ }
596
+
597
+ .hive-panel-section + .hive-panel-section {
598
+ padding-top: 10px;
599
+ border-top: 1px solid var(--background-modifier-border);
600
+ }
601
+
602
+ .hive-panel-section-label {
603
+ display: flex;
604
+ align-items: center;
605
+ justify-content: space-between;
606
+ padding: 0 2px;
607
+ font-size: 10px;
608
+ font-weight: 700;
609
+ text-transform: uppercase;
610
+ letter-spacing: 0.07em;
611
+ color: var(--text-faint);
612
+ margin-bottom: 2px;
613
+ }
614
+
615
+ .hive-panel-section-count {
616
+ display: inline-flex;
617
+ align-items: center;
618
+ justify-content: center;
619
+ min-width: 18px;
620
+ height: 16px;
621
+ padding: 0 5px;
622
+ border-radius: 999px;
623
+ background: var(--background-modifier-hover);
624
+ font-size: 10px;
625
+ font-weight: 600;
626
+ color: var(--text-faint);
627
+ }
628
+
629
+ .hive-panel-empty-hint {
630
+ padding: 8px 2px 4px;
631
+ font-size: 12px;
632
+ color: var(--text-faint);
633
+ }
634
+
635
+ /* ── Self card ─────────────────────────────────────────────── */
636
+
637
+ .hive-self-card {
638
+ display: flex;
639
+ align-items: center;
640
+ gap: 10px;
641
+ padding: 9px 10px;
642
+ background: var(--background-secondary);
643
+ border: 1px solid var(--background-modifier-border);
644
+ border-radius: 9px;
645
+ }
646
+
647
+ .hive-self-card-info {
648
+ flex: 1;
649
+ min-width: 0;
650
+ display: flex;
651
+ flex-direction: column;
652
+ gap: 5px;
653
+ }
654
+
655
+ .hive-self-name {
656
+ font-weight: 600;
657
+ font-size: 13px;
658
+ color: var(--text-normal);
659
+ white-space: nowrap;
660
+ overflow: hidden;
661
+ text-overflow: ellipsis;
662
+ line-height: 1;
663
+ }
664
+
665
+ /* ── Remote user cards ─────────────────────────────────────── */
666
+
667
+ .hive-user-card {
668
+ position: relative;
669
+ padding: 9px 10px 9px 14px;
670
+ border-radius: 9px;
671
+ background: var(--background-secondary);
672
+ border: 1px solid var(--background-modifier-border);
673
+ overflow: hidden;
674
+ transition: border-color 0.12s;
675
+ }
676
+
677
+ /* Colored left accent bar */
678
+ .hive-user-card::before {
679
+ content: '';
680
+ position: absolute;
681
+ left: 0;
682
+ top: 6px;
683
+ bottom: 6px;
684
+ width: 3px;
685
+ border-radius: 0 2px 2px 0;
686
+ background: var(--user-color, var(--text-muted));
687
+ opacity: 0.75;
688
+ }
689
+
690
+ .hive-user-card.is-following {
691
+ border-color: color-mix(in srgb, var(--user-color, var(--text-accent)) 45%, transparent);
692
+ background: color-mix(in srgb, var(--user-color, var(--text-accent)) 5%, var(--background-secondary));
693
+ }
694
+
695
+ .hive-user-card.is-following::before {
696
+ opacity: 1;
697
+ }
698
+
699
+ .hive-user-card-header {
700
+ display: flex;
701
+ align-items: center;
702
+ gap: 8px;
703
+ }
704
+
705
+ /* Avatar — shared between self and remote */
706
+ .hive-user-card-avatar,
707
+ .hive-user-avatar-fallback {
708
+ width: 26px;
709
+ height: 26px;
710
+ border-radius: 50%;
711
+ flex-shrink: 0;
712
+ }
713
+
714
+ .hive-user-card-avatar {
715
+ object-fit: cover;
716
+ background: var(--background-modifier-hover);
717
+ }
718
+
719
+ .hive-user-avatar-fallback {
720
+ display: flex;
721
+ align-items: center;
722
+ justify-content: center;
723
+ font-size: 11px;
724
+ font-weight: 700;
725
+ color: #fff;
726
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
727
+ background: var(--text-muted); /* overridden by inline style */
728
+ }
729
+
730
+ .hive-user-card-info {
731
+ flex: 1;
732
+ min-width: 0;
733
+ display: flex;
734
+ flex-direction: column;
735
+ gap: 2px;
736
+ }
737
+
738
+ .hive-user-card-name {
739
+ display: block;
740
+ font-weight: 600;
741
+ font-size: 13px;
742
+ color: var(--text-normal);
743
+ white-space: nowrap;
744
+ overflow: hidden;
745
+ text-overflow: ellipsis;
746
+ line-height: 1.3;
747
+ }
748
+
749
+ /* Action buttons (icon buttons, right side of header) */
750
+ .hive-user-card-actions {
751
+ display: flex;
752
+ gap: 2px;
753
+ flex-shrink: 0;
754
+ margin-left: 4px;
755
+ }
756
+
757
+ .hive-user-card-action {
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: center;
761
+ width: 26px;
762
+ height: 26px;
763
+ border-radius: 6px;
764
+ background: transparent;
765
+ border: none;
766
+ cursor: pointer;
767
+ color: var(--text-muted);
768
+ padding: 0;
769
+ transition: background 0.1s, color 0.1s;
770
+ }
771
+
772
+ .hive-user-card-action svg {
773
+ width: 14px;
774
+ height: 14px;
775
+ }
776
+
777
+ .hive-user-card-action:hover {
778
+ background: var(--background-modifier-hover);
779
+ color: var(--text-normal);
780
+ }
781
+
782
+ .hive-user-card-action.is-active {
783
+ color: var(--user-color, var(--text-accent));
784
+ background: color-mix(in srgb, var(--user-color, var(--text-accent)) 12%, transparent);
785
+ }
786
+
787
+ .hive-user-card-action.is-active:hover {
788
+ background: color-mix(in srgb, var(--user-color, var(--text-accent)) 20%, transparent);
789
+ }
790
+
791
+ /* ── File chips ────────────────────────────────────────────── */
792
+
793
+ .hive-user-card-files {
794
+ display: flex;
795
+ flex-wrap: wrap;
796
+ align-items: center;
797
+ gap: 4px;
798
+ margin-top: 7px;
799
+ }
800
+
801
+ .hive-file-chip {
802
+ display: inline-flex;
803
+ align-items: center;
804
+ gap: 4px;
805
+ max-width: 100%;
806
+ padding: 3px 7px 3px 5px;
807
+ border-radius: 5px;
808
+ background: var(--background-primary);
809
+ border: 1px solid var(--background-modifier-border);
810
+ font-size: 11px;
811
+ color: var(--text-muted);
812
+ cursor: pointer;
813
+ white-space: nowrap;
814
+ overflow: hidden;
815
+ transition: border-color 0.1s, color 0.1s;
816
+ }
817
+
818
+ .hive-file-chip:hover {
819
+ border-color: color-mix(in srgb, var(--user-color, var(--text-accent)) 60%, transparent);
820
+ color: var(--text-normal);
821
+ }
822
+
823
+ .hive-file-chip-icon {
824
+ display: flex;
825
+ align-items: center;
826
+ flex-shrink: 0;
827
+ color: var(--text-faint);
828
+ }
829
+
830
+ .hive-file-chip-icon svg {
831
+ width: 11px;
832
+ height: 11px;
833
+ }
834
+
835
+ .hive-file-chip-name {
836
+ overflow: hidden;
837
+ text-overflow: ellipsis;
838
+ min-width: 0;
839
+ }
840
+
841
+ /* ── Disconnected / empty state ────────────────────────────── */
842
+
843
+ .hive-panel-disconnected {
844
+ display: flex;
845
+ flex-direction: column;
846
+ align-items: center;
847
+ gap: 10px;
848
+ padding: 28px 16px 20px;
849
+ text-align: center;
850
+ }
851
+
852
+ .hive-panel-disconnected-icon {
853
+ color: var(--text-faint);
854
+ opacity: 0.5;
855
+ }
856
+
857
+ .hive-panel-disconnected-icon svg {
858
+ width: 28px;
859
+ height: 28px;
860
+ }
861
+
862
+ .hive-panel-disconnected-text {
863
+ font-size: 12px;
864
+ color: var(--text-muted);
865
+ line-height: 1.5;
866
+ max-width: 22ch;
867
+ }
868
+
869
+ .hive-panel-connect-btn {
870
+ padding: 5px 16px;
871
+ font-size: 12px;
872
+ font-weight: 500;
873
+ border-radius: 999px;
874
+ background: var(--interactive-accent);
875
+ color: var(--text-on-accent);
876
+ border: none;
877
+ cursor: pointer;
878
+ }
879
+
880
+ .hive-panel-connect-btn:hover {
881
+ background: var(--interactive-accent-hover);
882
+ }
883
+
884
+ /* ============================================================
885
+ Active Editor Banner
886
+ ============================================================ */
887
+
888
+ .hive-active-editors-banner {
889
+ display: none;
890
+ align-items: center;
891
+ gap: 7px;
892
+ padding: 4px 8px 4px 10px;
893
+ background: color-mix(in srgb, var(--background-modifier-border) 40%, var(--background-primary));
894
+ border-bottom: 1px solid var(--background-modifier-border);
895
+ font-size: 11px;
896
+ color: var(--text-muted);
897
+ flex-shrink: 0;
898
+ position: relative;
899
+ z-index: 5;
900
+ }
901
+
902
+ .hive-active-editors-banner.is-visible { display: flex; }
903
+ .hive-active-editors-banner.is-dismissed { display: none !important; }
904
+
905
+ .hive-active-editors-label {
906
+ font-size: 10px;
907
+ font-weight: 600;
908
+ text-transform: uppercase;
909
+ letter-spacing: 0.05em;
910
+ color: var(--text-faint);
911
+ flex-shrink: 0;
912
+ }
913
+
914
+ .hive-active-editors-avatars {
915
+ display: flex;
916
+ align-items: center;
917
+ gap: -4px; /* stacked via negative margin on children */
918
+ flex: 1;
919
+ }
920
+
921
+ .hive-active-editors-avatar,
922
+ .hive-active-editors-avatar-fallback {
923
+ width: 18px;
924
+ height: 18px;
925
+ border-radius: 50%;
926
+ flex-shrink: 0;
927
+ margin-left: -4px;
928
+ border: 2px solid var(--background-primary);
929
+ }
930
+
931
+ .hive-active-editors-avatar {
932
+ object-fit: cover;
933
+ }
934
+
935
+ .hive-active-editors-avatar:first-child,
936
+ .hive-active-editors-avatar-fallback:first-child {
937
+ margin-left: 0;
938
+ }
939
+
940
+ .hive-active-editors-avatar-fallback {
941
+ display: flex;
942
+ align-items: center;
943
+ justify-content: center;
944
+ font-size: 8px;
945
+ font-weight: 700;
946
+ color: #fff;
947
+ background: var(--text-muted);
948
+ }
949
+
950
+ .hive-active-editors-dismiss {
951
+ display: flex;
952
+ align-items: center;
953
+ justify-content: center;
954
+ width: 20px;
955
+ height: 20px;
956
+ border-radius: 4px;
957
+ background: transparent;
958
+ border: none;
959
+ cursor: pointer;
960
+ color: var(--text-faint);
961
+ padding: 0;
962
+ flex-shrink: 0;
963
+ margin-left: auto;
964
+ }
965
+
966
+ .hive-active-editors-dismiss svg {
967
+ width: 12px;
968
+ height: 12px;
969
+ }
970
+
971
+ .hive-active-editors-dismiss:hover {
972
+ background: var(--background-modifier-hover);
973
+ color: var(--text-muted);
974
+ }
975
+
976
+ /* ============================================================
977
+ Scrollbar Cursor Markers
978
+ ============================================================ */
979
+
980
+ .hive-scrollbar-markers {
981
+ position: absolute;
982
+ top: 0;
983
+ right: 0;
984
+ bottom: 0;
985
+ width: 6px;
986
+ pointer-events: none;
987
+ z-index: 10;
988
+ }
989
+
990
+ .hive-scrollbar-marker {
991
+ position: absolute;
992
+ right: 0;
993
+ width: 6px;
994
+ height: 3px;
995
+ border-radius: 1px;
996
+ transform: translateY(-50%);
997
+ }
998
+
999
+ /* ============================================================
1000
+ Claim Badge in File Tree
1001
+ ============================================================ */
1002
+
1003
+ .hive-claim-badge {
1004
+ position: absolute;
1005
+ right: 4px;
1006
+ top: 50%;
1007
+ transform: translateY(-50%);
1008
+ display: inline-flex;
1009
+ align-items: center;
1010
+ justify-content: center;
1011
+ width: 14px;
1012
+ height: 14px;
1013
+ border-radius: 50%;
1014
+ font-size: 7px;
1015
+ font-weight: 700;
1016
+ color: #fff;
1017
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
1018
+ flex-shrink: 0;
1019
+ border: 1px solid rgba(255, 255, 255, 0.25);
1020
+ z-index: 1;
1021
+ }
1022
+
1023
+ .nav-file-title.has-hive-claim {
1024
+ padding-right: 22px;
1025
+ }
1026
+
1027
+ /* When both avatars and a claim badge are present */
1028
+ .nav-file-title.has-hive-avatars.has-hive-claim {
1029
+ padding-right: 100px;
1030
+ }
1031
+
1032
+ /* ============================================================
1033
+ Accessibility — reduced motion additions
1034
+ ============================================================ */
1035
+
1036
+ @media (prefers-reduced-motion: reduce) {
1037
+ .hive-reconnect-dots {
1038
+ animation: none;
1039
+ }
1040
+ }