instbyte 1.6.3 → 1.8.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.
@@ -1,3 +1,6 @@
1
+ /* ============================================================
2
+ CSS CUSTOM PROPERTIES
3
+ ============================================================ */
1
4
  :root {
2
5
  --color-primary: #111827;
3
6
  --color-primary-hover: #1f2937;
@@ -10,6 +13,10 @@
10
13
  --color-on-secondary: #ffffff;
11
14
  }
12
15
 
16
+
17
+ /* ============================================================
18
+ BASE
19
+ ============================================================ */
13
20
  body {
14
21
  font-family: system-ui;
15
22
  background: #f3f4f6;
@@ -23,65 +30,13 @@ header {
23
30
  border-bottom: 1px solid #e5e7eb;
24
31
  }
25
32
 
26
- .container {
27
- max-width: 900px;
28
- margin: 20px auto;
29
- padding: 0 12px;
30
- }
31
-
32
- .channel-bar {
33
- background: #e5e7eb;
34
- border-radius: 12px;
35
- padding: 6px;
36
- margin-bottom: 16px;
37
- display: flex;
38
- align-items: center;
39
- gap: 6px;
40
- position: relative;
41
- }
42
-
43
- .channels {
44
- flex: 1;
45
- display: flex;
46
- gap: 6px;
47
- }
48
-
49
- .channels::-webkit-scrollbar {
50
- display: none;
51
- }
52
-
53
- .channels button {
54
- position: relative;
55
- display: flex;
56
- align-items: center;
57
- gap: 4px;
58
- background: transparent;
33
+ button {
34
+ padding: 10px 14px;
59
35
  border: none;
60
- padding: 7px 12px;
61
- border-radius: 10px;
36
+ background: var(--color-primary);
37
+ color: var(--color-on-primary);
38
+ border-radius: 6px;
62
39
  cursor: pointer;
63
- font-size: 14px;
64
- color: #4b5563;
65
- transition: all 0.15s ease;
66
- }
67
-
68
- .channels button:hover {
69
- background: #d1d5db;
70
- color: #111827;
71
- }
72
-
73
- .channels button.active {
74
- background: #f9fafb;
75
- color: #111827;
76
- }
77
-
78
- .composer {
79
- background: #fff;
80
- padding: 12px;
81
- border-radius: 8px;
82
- margin-top: 12px;
83
- display: flex;
84
- gap: 8px;
85
40
  }
86
41
 
87
42
  input[type=text] {
@@ -91,85 +46,26 @@ input[type=text] {
91
46
  border-radius: 6px;
92
47
  }
93
48
 
94
- button {
95
- padding: 10px 14px;
96
- border: none;
97
- background: var(--color-primary);
98
- color: var(--color-on-primary);
99
- border-radius: 6px;
100
- cursor: pointer;
101
- }
102
-
103
49
  input[type=text]:focus {
104
50
  outline: none;
105
51
  border-color: var(--color-primary);
106
52
  box-shadow: 0 0 0 3px var(--color-primary-light);
107
53
  }
108
54
 
109
- .drop {
110
- border: 2px dashed #ccc;
111
- padding: 18px;
112
- margin-top: 12px;
113
- text-align: center;
114
- background: #fff;
115
- border-radius: 8px;
116
- }
117
55
 
118
- .item {
119
- background: #fff;
120
- padding: 12px;
121
- margin-top: 10px;
122
- border-radius: 8px;
123
- display: flex;
124
- flex-direction: column;
125
- }
126
-
127
- .item-top {
128
- display: flex;
129
- justify-content: space-between;
130
- align-items: center;
131
- }
132
-
133
- .meta {
134
- font-size: 12px;
135
- color: #6b7280;
136
- }
137
-
138
- .left {
139
- max-width: 70%;
140
- word-break: break-word;
141
- }
142
-
143
- .item-actions {
144
- display: flex;
145
- gap: 8px;
146
- }
147
-
148
- .icon-btn {
149
- background: #f9fafb;
150
- border: 1px solid #e5e7eb;
151
- border-radius: 6px;
152
- padding: 6px 8px;
153
- cursor: pointer;
154
- font-size: 14px;
155
- line-height: 1;
156
- color: #6b7280;
157
- }
158
-
159
- .icon-btn:hover {
160
- background: #e5e7eb;
161
- }
162
-
163
- .icon-btn.delete {
164
- color: #b91c1c;
165
- border-color: #fecaca;
166
- background: #fff;
56
+ /* ============================================================
57
+ LAYOUT
58
+ ============================================================ */
59
+ .container {
60
+ max-width: 900px;
61
+ margin: 20px auto;
62
+ padding: 0 12px;
167
63
  }
168
64
 
169
- .icon-btn.delete:hover {
170
- background: #fee2e2;
171
- }
172
65
 
66
+ /* ============================================================
67
+ HEADER
68
+ ============================================================ */
173
69
  .app-header {
174
70
  background: #ffffff;
175
71
  border-bottom: 1px solid #e5e7eb;
@@ -188,6 +84,7 @@ input[type=text]:focus {
188
84
 
189
85
  .logo {
190
86
  height: 24px;
87
+ filter: none;
191
88
  }
192
89
 
193
90
  .app-name {
@@ -202,6 +99,77 @@ input[type=text]:focus {
202
99
  justify-content: center;
203
100
  }
204
101
 
102
+ .header-right {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 8px;
106
+ font-size: 13px;
107
+ }
108
+
109
+ .username-display {
110
+ font-size: 13px;
111
+ color: #374151;
112
+ cursor: pointer;
113
+ border-bottom: 1px dashed transparent;
114
+ transition: border-color 0.15s ease, color 0.15s ease;
115
+ padding-bottom: 1px;
116
+ }
117
+
118
+ .username-display:hover {
119
+ color: #111827;
120
+ border-bottom-color: #9ca3af;
121
+ }
122
+
123
+ .online-count {
124
+ font-size: 12px;
125
+ color: #9ca3af;
126
+ }
127
+
128
+ .link-btn {
129
+ background: none;
130
+ border: none;
131
+ color: #6b7280;
132
+ cursor: pointer;
133
+ font-size: 13px;
134
+ padding: 0;
135
+ }
136
+
137
+ .link-btn:hover {
138
+ color: #111827;
139
+ }
140
+
141
+ .theme-toggle {
142
+ font-size: 15px;
143
+ padding: 2px 6px;
144
+ border-radius: 6px;
145
+ transition: background 0.15s ease;
146
+ }
147
+
148
+ .theme-toggle:hover {
149
+ background: #f3f4f6;
150
+ }
151
+
152
+ .logout-btn {
153
+ background: none;
154
+ border: 1px solid #e5e7eb;
155
+ color: #6b7280;
156
+ cursor: pointer;
157
+ font-size: 12px;
158
+ padding: 4px 10px;
159
+ border-radius: 6px;
160
+ transition: all 0.15s ease;
161
+ }
162
+
163
+ .logout-btn:hover {
164
+ background: #fee2e2;
165
+ border-color: #fecaca;
166
+ color: #b91c1c;
167
+ }
168
+
169
+
170
+ /* ============================================================
171
+ SEARCH
172
+ ============================================================ */
205
173
  .search-wrapper {
206
174
  position: relative;
207
175
  width: 100%;
@@ -232,22 +200,53 @@ input[type=text]:focus {
232
200
  color: #9ca3af;
233
201
  }
234
202
 
235
- .header-right {
203
+
204
+ /* ============================================================
205
+ CHANNEL BAR
206
+ ============================================================ */
207
+ .channel-bar {
208
+ background: #e5e7eb;
209
+ border-radius: 12px;
210
+ padding: 6px;
211
+ margin-bottom: 16px;
236
212
  display: flex;
237
213
  align-items: center;
238
- gap: 8px;
239
- font-size: 13px;
214
+ gap: 6px;
215
+ position: relative;
240
216
  }
241
217
 
242
- .link-btn {
243
- background: none;
218
+ .channels {
219
+ flex: 1;
220
+ display: flex;
221
+ gap: 6px;
222
+ }
223
+
224
+ .channels::-webkit-scrollbar {
225
+ display: none;
226
+ }
227
+
228
+ .channels button {
229
+ position: relative;
230
+ display: flex;
231
+ align-items: center;
232
+ gap: 4px;
233
+ background: transparent;
244
234
  border: none;
245
- color: #6b7280;
235
+ padding: 7px 12px;
236
+ border-radius: 10px;
246
237
  cursor: pointer;
247
- font-size: 13px;
238
+ font-size: 14px;
239
+ color: #4b5563;
240
+ transition: all 0.15s ease;
248
241
  }
249
242
 
250
- .link-btn:hover {
243
+ .channels button:hover {
244
+ background: #d1d5db;
245
+ color: #111827;
246
+ }
247
+
248
+ .channels button.active {
249
+ background: #f9fafb;
251
250
  color: #111827;
252
251
  }
253
252
 
@@ -261,42 +260,117 @@ input[type=text]:focus {
261
260
  cursor: pointer;
262
261
  }
263
262
 
263
+ .add-channel:hover {
264
+ background: #d1d5db;
265
+ }
266
+
264
267
  .add-channel-mobile {
265
268
  display: none;
266
269
  }
267
270
 
268
- .add-channel:hover {
269
- background: #d1d5db;
271
+ .ch-pin-dot {
272
+ display: inline-block;
273
+ width: 6px;
274
+ height: 6px;
275
+ background: #f59e0b;
276
+ border-radius: 50%;
277
+ flex-shrink: 0;
270
278
  }
271
279
 
272
- .size-tag {
280
+ .ch-unread-dot {
273
281
  display: inline-block;
274
- font-size: 11px;
275
- font-weight: 500;
276
- padding: 2px 7px;
282
+ width: 7px;
283
+ height: 7px;
284
+ background: #3b82f6;
285
+ border-radius: 50%;
286
+ flex-shrink: 0;
287
+ margin-left: 2px;
288
+ }
289
+
290
+ .ch-more {
291
+ display: inline-flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ width: 18px;
295
+ height: 18px;
277
296
  border-radius: 4px;
278
- margin-left: 6px;
279
- vertical-align: middle;
297
+ font-size: 13px;
298
+ color: #6b7280;
299
+ opacity: 0;
300
+ transition: opacity 0.12s ease, background 0.12s ease;
301
+ margin-left: 2px;
302
+ line-height: 1;
280
303
  }
281
304
 
282
- .size-tag.warn {
283
- background: #fef9c3;
284
- color: #854d0e;
305
+ .channels button:hover .ch-more,
306
+ .channels button.active .ch-more {
307
+ opacity: 1;
285
308
  }
286
309
 
287
- .size-tag.danger-light {
288
- background: #fee2e2;
289
- color: #b91c1c;
310
+ .ch-more:hover {
311
+ background: rgba(0, 0, 0, 0.1);
312
+ color: #111827;
313
+ }
314
+
315
+
316
+ /* ============================================================
317
+ COMPOSER
318
+ ============================================================ */
319
+ .composer {
320
+ background: #fff;
321
+ padding: 12px;
322
+ border-radius: 8px;
323
+ margin-top: 12px;
324
+ display: flex;
325
+ gap: 8px;
326
+ }
327
+
328
+ .drop {
329
+ border: 2px dashed #ccc;
330
+ padding: 18px;
331
+ margin-top: 12px;
332
+ text-align: center;
333
+ background: #fff;
334
+ border-radius: 8px;
335
+ }
336
+
337
+
338
+ /* ============================================================
339
+ ITEMS
340
+ ============================================================ */
341
+ .item {
342
+ background: #fff;
343
+ color: #111827;
344
+ padding: 12px;
345
+ margin-top: 10px;
346
+ border-radius: 8px;
347
+ display: flex;
348
+ flex-direction: column;
349
+ align-items: stretch;
350
+ transition: box-shadow 0.15s ease;
351
+ }
352
+
353
+ .item:hover {
354
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
355
+ }
356
+
357
+ .item-top {
358
+ display: flex;
359
+ justify-content: space-between;
360
+ align-items: center;
290
361
  }
291
362
 
292
- .size-tag.danger-dark {
293
- background: #7f1d1d;
294
- color: #fff;
363
+ .meta {
364
+ font-size: 12px;
365
+ color: #6b7280;
295
366
  }
296
367
 
297
368
  .left {
369
+ max-width: 70%;
370
+ word-break: break-word;
298
371
  cursor: pointer;
299
372
  position: relative;
373
+ color: #111827;
300
374
  }
301
375
 
302
376
  .left:hover::after {
@@ -320,68 +394,86 @@ input[type=text]:focus {
320
394
  transition: background 0.3s ease;
321
395
  }
322
396
 
323
- .qr-widget {
324
- position: fixed;
325
- bottom: 20px;
326
- right: 20px;
327
- z-index: 999;
397
+ .item-actions {
328
398
  display: flex;
329
- flex-direction: column;
330
- align-items: flex-end;
331
399
  gap: 8px;
332
400
  }
333
401
 
334
- .qr-card {
335
- background: #fff;
336
- border: 1px solid #e5e7eb;
337
- border-radius: 12px;
338
- padding: 16px;
402
+ .empty-state {
339
403
  text-align: center;
340
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
341
- display: none;
342
- width: 200px;
404
+ color: #9ca3af;
405
+ font-size: 14px;
406
+ padding: 60px 20px;
343
407
  }
344
408
 
345
- .qr-card.open {
346
- display: block;
347
- }
348
409
 
349
- .qr-card img {
350
- width: 160px;
351
- height: 160px;
352
- border-radius: 6px;
410
+ /* ============================================================
411
+ SIZE TAGS
412
+ ============================================================ */
413
+ .size-tag {
414
+ display: inline-block;
415
+ font-size: 11px;
416
+ font-weight: 500;
417
+ padding: 2px 7px;
418
+ border-radius: 4px;
419
+ margin-left: 6px;
420
+ vertical-align: middle;
353
421
  }
354
422
 
355
- .qr-card .qr-url {
356
- font-size: 11px;
357
- color: #6b7280;
358
- margin-top: 8px;
359
- word-break: break-all;
360
- line-height: 1.4;
423
+ .size-tag.warn {
424
+ background: #fef9c3;
425
+ color: #854d0e;
361
426
  }
362
427
 
363
- .qr-card .qr-label {
364
- font-size: 12px;
365
- font-weight: 600;
366
- color: #111827;
367
- margin-bottom: 10px;
428
+ .size-tag.danger-light {
429
+ background: #fee2e2;
430
+ color: #b91c1c;
368
431
  }
369
432
 
370
- .qr-toggle {
371
- background: #111827;
433
+ .size-tag.danger-dark {
434
+ background: #7f1d1d;
372
435
  color: #fff;
373
- border: none;
374
- border-radius: 20px;
375
- padding: 8px 14px;
376
- font-size: 13px;
436
+ }
437
+
438
+
439
+ /* ============================================================
440
+ ICON BUTTONS
441
+ ============================================================ */
442
+ .icon-btn {
443
+ background: #f9fafb;
444
+ border: 1px solid #e5e7eb;
445
+ border-radius: 6px;
446
+ padding: 6px 8px;
377
447
  cursor: pointer;
378
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
448
+ font-size: 14px;
449
+ line-height: 1;
450
+ color: #6b7280;
379
451
  }
380
452
 
381
- .qr-toggle:hover {
382
- background: #1f2937;
453
+ .icon-btn:hover {
454
+ background: #e5e7eb;
455
+ }
456
+
457
+ .icon-btn.delete {
458
+ color: #b91c1c;
459
+ border-color: #fecaca;
460
+ background: #fff;
461
+ }
462
+
463
+ .icon-btn.delete:hover {
464
+ background: #fee2e2;
465
+ }
466
+
467
+ .icon-btn.preview-active {
468
+ background: #eff6ff;
469
+ border-color: #bfdbfe;
470
+ color: #1d4ed8;
383
471
  }
384
472
 
473
+
474
+ /* ============================================================
475
+ MOVE DROPDOWN
476
+ ============================================================ */
385
477
  .move-wrapper {
386
478
  position: relative;
387
479
  }
@@ -432,40 +524,10 @@ input[type=text]:focus {
432
524
  cursor: default;
433
525
  }
434
526
 
435
- .ch-pin-dot {
436
- display: inline-block;
437
- width: 6px;
438
- height: 6px;
439
- background: #f59e0b;
440
- border-radius: 50%;
441
- flex-shrink: 0;
442
- }
443
-
444
- .ch-more {
445
- display: inline-flex;
446
- align-items: center;
447
- justify-content: center;
448
- width: 18px;
449
- height: 18px;
450
- border-radius: 4px;
451
- font-size: 13px;
452
- color: #6b7280;
453
- opacity: 0;
454
- transition: opacity 0.12s ease, background 0.12s ease;
455
- margin-left: 2px;
456
- line-height: 1;
457
- }
458
-
459
- .channels button:hover .ch-more,
460
- .channels button.active .ch-more {
461
- opacity: 1;
462
- }
463
-
464
- .ch-more:hover {
465
- background: rgba(0, 0, 0, 0.1);
466
- color: #111827;
467
- }
468
527
 
528
+ /* ============================================================
529
+ CONTEXT MENU
530
+ ============================================================ */
469
531
  .context-menu {
470
532
  position: fixed;
471
533
  background: #fff;
@@ -525,6 +587,10 @@ input[type=text]:focus {
525
587
  margin: 4px 0;
526
588
  }
527
589
 
590
+
591
+ /* ============================================================
592
+ MARKDOWN
593
+ ============================================================ */
528
594
  .markdown-body {
529
595
  line-height: 1.5;
530
596
  font-size: 14px;
@@ -579,6 +645,10 @@ input[type=text]:focus {
579
645
  padding-left: 20px;
580
646
  }
581
647
 
648
+
649
+ /* ============================================================
650
+ PREVIEW PANEL
651
+ ============================================================ */
582
652
  .preview-panel {
583
653
  display: none;
584
654
  margin-top: 10px;
@@ -596,96 +666,225 @@ input[type=text]:focus {
596
666
  display: block;
597
667
  }
598
668
 
599
- .preview-panel video,
600
- .preview-panel audio {
601
- width: 100%;
602
- border-radius: 6px;
603
- outline: none;
669
+ .preview-panel video,
670
+ .preview-panel audio {
671
+ width: 100%;
672
+ border-radius: 6px;
673
+ outline: none;
674
+ }
675
+
676
+ .preview-panel audio {
677
+ width: 100%;
678
+ height: 40px;
679
+ }
680
+
681
+ .preview-panel embed,
682
+ .preview-panel iframe {
683
+ width: 100%;
684
+ height: 480px;
685
+ border: none;
686
+ border-radius: 6px;
687
+ background: #f9fafb;
688
+ }
689
+
690
+ .preview-panel pre {
691
+ background: #f8fafc;
692
+ border: 1px solid #e5e7eb;
693
+ border-radius: 6px;
694
+ padding: 12px;
695
+ overflow-x: auto;
696
+ max-height: 400px;
697
+ overflow-y: auto;
698
+ margin: 0;
699
+ font-size: 12px;
700
+ font-family: ui-monospace, monospace;
701
+ line-height: 1.5;
702
+ }
703
+
704
+ .preview-panel pre code {
705
+ background: none;
706
+ padding: 0;
707
+ font-size: 12px;
708
+ }
709
+
710
+ .preview-truncated {
711
+ font-size: 11px;
712
+ color: #9ca3af;
713
+ margin-top: 6px;
714
+ text-align: right;
715
+ }
716
+
717
+ .preview-error {
718
+ font-size: 13px;
719
+ color: #9ca3af;
720
+ padding: 12px 0;
721
+ }
722
+
723
+ .preview-loading {
724
+ font-size: 13px;
725
+ color: #9ca3af;
726
+ padding: 12px 0;
727
+ }
728
+
729
+
730
+ /* ============================================================
731
+ QR WIDGET
732
+ ============================================================ */
733
+ .qr-widget {
734
+ position: fixed;
735
+ bottom: 20px;
736
+ right: 20px;
737
+ z-index: 999;
738
+ display: flex;
739
+ flex-direction: column;
740
+ align-items: flex-end;
741
+ gap: 8px;
742
+ }
743
+
744
+ .qr-card {
745
+ background: #fff;
746
+ border: 1px solid #e5e7eb;
747
+ border-radius: 12px;
748
+ padding: 16px;
749
+ text-align: center;
750
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
751
+ display: none;
752
+ width: 200px;
753
+ }
754
+
755
+ .qr-card.open {
756
+ display: block;
757
+ }
758
+
759
+ .qr-card img {
760
+ width: 160px;
761
+ height: 160px;
762
+ border-radius: 6px;
763
+ }
764
+
765
+ .qr-card .qr-url {
766
+ font-size: 11px;
767
+ color: #6b7280;
768
+ margin-top: 8px;
769
+ word-break: break-all;
770
+ line-height: 1.4;
771
+ }
772
+
773
+ .qr-card .qr-label {
774
+ font-size: 12px;
775
+ font-weight: 600;
776
+ color: #111827;
777
+ margin-bottom: 10px;
778
+ }
779
+
780
+ .qr-toggle {
781
+ background: #111827;
782
+ color: #fff;
783
+ border: none;
784
+ border-radius: 20px;
785
+ padding: 8px 14px;
786
+ font-size: 13px;
787
+ cursor: pointer;
788
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
789
+ }
790
+
791
+ .qr-toggle:hover {
792
+ background: #1f2937;
604
793
  }
605
794
 
606
- .preview-panel audio {
607
- width: 100%;
608
- height: 40px;
609
- }
610
795
 
611
- .preview-panel embed,
612
- .preview-panel iframe {
613
- width: 100%;
614
- height: 480px;
615
- border: none;
616
- border-radius: 6px;
617
- background: #f9fafb;
796
+ /* ============================================================
797
+ UNDO TOAST
798
+ ============================================================ */
799
+ .undo-toast {
800
+ position: fixed;
801
+ bottom: 30px;
802
+ left: 50%;
803
+ transform: translateX(-50%) translateY(80px);
804
+ background: #1f2937;
805
+ color: #f3f4f6;
806
+ padding: 12px 16px;
807
+ border-radius: 10px;
808
+ font-size: 13px;
809
+ display: flex;
810
+ align-items: center;
811
+ gap: 12px;
812
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);
813
+ z-index: 9999;
814
+ opacity: 0;
815
+ transition: transform 0.2s ease, opacity 0.2s ease;
816
+ min-width: 220px;
817
+ overflow: hidden;
618
818
  }
619
819
 
620
- .preview-panel pre {
621
- background: #f8fafc;
622
- border: 1px solid #e5e7eb;
623
- border-radius: 6px;
624
- padding: 12px;
625
- overflow-x: auto;
626
- max-height: 400px;
627
- overflow-y: auto;
628
- margin: 0;
629
- font-size: 12px;
630
- font-family: ui-monospace, monospace;
631
- line-height: 1.5;
820
+ .undo-toast.show {
821
+ transform: translateX(-50%) translateY(0);
822
+ opacity: 1;
632
823
  }
633
824
 
634
- .preview-panel pre code {
825
+ .undo-toast #undoBtn {
635
826
  background: none;
636
- padding: 0;
827
+ border: 1px solid #4b5563;
828
+ color: #f3f4f6;
829
+ padding: 4px 10px;
830
+ border-radius: 6px;
637
831
  font-size: 12px;
832
+ cursor: pointer;
833
+ flex-shrink: 0;
638
834
  }
639
835
 
640
- .preview-truncated {
641
- font-size: 11px;
642
- color: #9ca3af;
643
- margin-top: 6px;
644
- text-align: right;
836
+ .undo-toast #undoBtn:hover {
837
+ background: #374151;
645
838
  }
646
839
 
647
- .preview-error {
648
- font-size: 13px;
649
- color: #9ca3af;
650
- padding: 12px 0;
840
+ .undo-progress {
841
+ position: absolute;
842
+ bottom: 0;
843
+ left: 0;
844
+ height: 3px;
845
+ width: 100%;
846
+ background: #4b5563;
847
+ transform-origin: left;
848
+ animation: none;
651
849
  }
652
850
 
653
- .preview-loading {
654
- font-size: 13px;
655
- color: #9ca3af;
656
- padding: 12px 0;
851
+ .undo-progress.running {
852
+ animation: drain 5s linear forwards;
657
853
  }
658
854
 
659
- .icon-btn.preview-active {
660
- background: #eff6ff;
661
- border-color: #bfdbfe;
662
- color: #1d4ed8;
663
- }
855
+ @keyframes drain {
856
+ from {
857
+ transform: scaleX(1);
858
+ }
664
859
 
665
- /* Make item flex-direction column to allow panel below content */
666
- .item {
667
- flex-direction: column;
668
- align-items: stretch;
669
- transition: box-shadow 0.15s ease;
860
+ to {
861
+ transform: scaleX(0);
862
+ }
670
863
  }
671
864
 
672
- .item-top {
673
- display: flex;
674
- justify-content: space-between;
675
- align-items: center;
676
- }
677
865
 
678
- .item:hover {
679
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
866
+ /* ============================================================
867
+ LOAD MORE
868
+ ============================================================ */
869
+ .load-more-btn {
870
+ background: #f3f4f6;
871
+ color: #374151;
872
+ border: 1px solid #e5e7eb;
873
+ border-radius: 8px;
874
+ padding: 10px 24px;
875
+ font-size: 14px;
876
+ cursor: pointer;
877
+ transition: background 0.15s ease;
680
878
  }
681
879
 
682
- .empty-state {
683
- text-align: center;
684
- color: #9ca3af;
685
- font-size: 14px;
686
- padding: 60px 20px;
880
+ .load-more-btn:hover {
881
+ background: #e5e7eb;
687
882
  }
688
883
 
884
+
885
+ /* ============================================================
886
+ MOBILE
887
+ ============================================================ */
689
888
  @media (max-width: 640px) {
690
889
  .app-header {
691
890
  flex-wrap: wrap;
@@ -810,4 +1009,664 @@ input[type=text]:focus {
810
1009
  padding: 6px 12px;
811
1010
  font-size: 12px;
812
1011
  }
1012
+ }
1013
+
1014
+
1015
+ /* ============================================================
1016
+ DARK MODE
1017
+ Two selectors, identical rules — no duplication within each.
1018
+ Media query handles OS preference.
1019
+ [data-theme="dark"] handles manual override.
1020
+ ============================================================ */
1021
+
1022
+ @media (prefers-color-scheme: dark) {
1023
+ :root:not([data-theme="light"]) {
1024
+ body {
1025
+ background: #0f1117;
1026
+ }
1027
+
1028
+ .app-header {
1029
+ background: #1a1d27;
1030
+ border-bottom-color: #2d3148;
1031
+ }
1032
+
1033
+ .app-name {
1034
+ color: #f3f4f6;
1035
+ }
1036
+
1037
+ .logo {
1038
+ filter: invert(1) brightness(1.2);
1039
+ }
1040
+
1041
+ .username-display {
1042
+ color: #d1d5db;
1043
+ }
1044
+
1045
+ .username-display:hover {
1046
+ color: #f3f4f6;
1047
+ border-bottom-color: #6b7280;
1048
+ }
1049
+
1050
+ .online-count {
1051
+ color: #6b7280;
1052
+ }
1053
+
1054
+ .link-btn {
1055
+ color: #9ca3af;
1056
+ }
1057
+
1058
+ .link-btn:hover {
1059
+ color: #f3f4f6;
1060
+ }
1061
+
1062
+ .theme-toggle:hover {
1063
+ background: #2d3148;
1064
+ }
1065
+
1066
+ .logout-btn {
1067
+ border-color: #2d3148;
1068
+ color: #9ca3af;
1069
+ }
1070
+
1071
+ .logout-btn:hover {
1072
+ background: #2d1515;
1073
+ border-color: #7f1d1d;
1074
+ color: #f87171;
1075
+ }
1076
+
1077
+ .search-wrapper input {
1078
+ background: #252836;
1079
+ border-color: #2d3148;
1080
+ color: #f3f4f6;
1081
+ }
1082
+
1083
+ .search-wrapper input:focus {
1084
+ background: #2d3148;
1085
+ border-color: #4b5563;
1086
+ }
1087
+
1088
+ .search-wrapper input::placeholder {
1089
+ color: #6b7280;
1090
+ }
1091
+
1092
+ .search-icon {
1093
+ color: #6b7280;
1094
+ }
1095
+
1096
+ .channel-bar {
1097
+ background: #1a1d27;
1098
+ }
1099
+
1100
+ .channel-bar::after {
1101
+ background: linear-gradient(to right, transparent, #1a1d27);
1102
+ }
1103
+
1104
+ .channels button {
1105
+ color: #9ca3af;
1106
+ }
1107
+
1108
+ .channels button:hover {
1109
+ background: #2d3148;
1110
+ color: #f3f4f6;
1111
+ }
1112
+
1113
+ .channels button.active {
1114
+ background: #252836;
1115
+ color: #f3f4f6;
1116
+ }
1117
+
1118
+ .add-channel {
1119
+ color: #9ca3af;
1120
+ }
1121
+
1122
+ .add-channel:hover {
1123
+ background: #2d3148;
1124
+ }
1125
+
1126
+ .add-channel-mobile {
1127
+ color: #9ca3af;
1128
+ border-left-color: #2d3148;
1129
+ }
1130
+
1131
+ .add-channel-mobile:hover {
1132
+ background: #2d3148;
1133
+ color: #f3f4f6;
1134
+ }
1135
+
1136
+ .composer {
1137
+ background: #1a1d27;
1138
+ }
1139
+
1140
+ input[type=text] {
1141
+ background: #252836;
1142
+ border-color: #2d3148;
1143
+ color: #f3f4f6;
1144
+ }
1145
+
1146
+ input[type=text]::placeholder {
1147
+ color: #6b7280;
1148
+ }
1149
+
1150
+ .drop {
1151
+ background: #1a1d27;
1152
+ border-color: #2d3148;
1153
+ color: #6b7280;
1154
+ }
1155
+
1156
+ .item {
1157
+ background: #1a1d27;
1158
+ color: #e5e7eb;
1159
+ }
1160
+
1161
+ .item:hover {
1162
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
1163
+ }
1164
+
1165
+ .item a {
1166
+ color: #60a5fa;
1167
+ }
1168
+
1169
+ .left {
1170
+ color: #e5e7eb;
1171
+ }
1172
+
1173
+ .left.flash {
1174
+ background: #064e3b;
1175
+ }
1176
+
1177
+ .left:hover::after {
1178
+ background: #374151;
1179
+ color: #f3f4f6;
1180
+ }
1181
+
1182
+ .meta {
1183
+ color: #6b7280;
1184
+ }
1185
+
1186
+ .empty-state {
1187
+ color: #4b5563;
1188
+ }
1189
+
1190
+ .size-tag.warn {
1191
+ background: #422006;
1192
+ color: #fbbf24;
1193
+ }
1194
+
1195
+ .size-tag.danger-light {
1196
+ background: #2d1515;
1197
+ color: #f87171;
1198
+ }
1199
+
1200
+ .icon-btn {
1201
+ background: #252836;
1202
+ border-color: #2d3148;
1203
+ color: #9ca3af;
1204
+ }
1205
+
1206
+ .icon-btn:hover {
1207
+ background: #2d3148;
1208
+ }
1209
+
1210
+ .icon-btn.delete {
1211
+ background: #1a1d27;
1212
+ border-color: #7f1d1d;
1213
+ color: #f87171;
1214
+ }
1215
+
1216
+ .icon-btn.delete:hover {
1217
+ background: #2d1515;
1218
+ }
1219
+
1220
+ .icon-btn.preview-active {
1221
+ background: #1e3a5f;
1222
+ border-color: #2563eb;
1223
+ color: #60a5fa;
1224
+ }
1225
+
1226
+ .move-dropdown {
1227
+ background: #1a1d27;
1228
+ border-color: #2d3148;
1229
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
1230
+ }
1231
+
1232
+ .move-dropdown button {
1233
+ color: #d1d5db;
1234
+ }
1235
+
1236
+ .move-dropdown button:hover {
1237
+ background: #252836;
1238
+ color: #f3f4f6;
1239
+ }
1240
+
1241
+ .move-dropdown .dropdown-label {
1242
+ color: #6b7280;
1243
+ }
1244
+
1245
+ .context-menu {
1246
+ background: #1a1d27;
1247
+ border-color: #2d3148;
1248
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1249
+ }
1250
+
1251
+ .context-menu button {
1252
+ color: #d1d5db;
1253
+ }
1254
+
1255
+ .context-menu button:hover {
1256
+ background: #252836;
1257
+ }
1258
+
1259
+ .context-menu button.danger {
1260
+ color: #f87171;
1261
+ }
1262
+
1263
+ .context-menu button.danger:hover {
1264
+ background: #2d1515;
1265
+ }
1266
+
1267
+ .context-menu button.muted {
1268
+ color: #4b5563;
1269
+ }
1270
+
1271
+ .context-menu .menu-divider {
1272
+ background: #2d3148;
1273
+ }
1274
+
1275
+ .preview-panel {
1276
+ border-top-color: #2d3148;
1277
+ }
1278
+
1279
+ .preview-panel embed,
1280
+ .preview-panel iframe {
1281
+ background: #252836;
1282
+ }
1283
+
1284
+ .preview-panel pre {
1285
+ background: #0f1117;
1286
+ border-color: #2d3148;
1287
+ color: #e5e7eb;
1288
+ }
1289
+
1290
+ .preview-truncated,
1291
+ .preview-error,
1292
+ .preview-loading {
1293
+ color: #6b7280;
1294
+ }
1295
+
1296
+ .markdown-body {
1297
+ color: #e5e7eb;
1298
+ }
1299
+
1300
+ .markdown-body code {
1301
+ background: #252836;
1302
+ color: #e5e7eb;
1303
+ }
1304
+
1305
+ .markdown-body pre {
1306
+ background: #0f1117;
1307
+ border-color: #2d3148;
1308
+ }
1309
+
1310
+ .markdown-body a {
1311
+ color: #60a5fa;
1312
+ }
1313
+
1314
+ .qr-card {
1315
+ background: #1a1d27;
1316
+ border-color: #2d3148;
1317
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
1318
+ }
1319
+
1320
+ .qr-card .qr-label {
1321
+ color: #f3f4f6;
1322
+ }
1323
+
1324
+ .qr-card .qr-url {
1325
+ color: #9ca3af;
1326
+ }
1327
+
1328
+ .undo-toast {
1329
+ background: #374151;
1330
+ }
1331
+
1332
+ .load-more-btn {
1333
+ background: #1a1d27;
1334
+ color: #d1d5db;
1335
+ border-color: #2d3148;
1336
+ }
1337
+
1338
+ .load-more-btn:hover {
1339
+ background: #2d3148;
1340
+ }
1341
+
1342
+ #uploadStatus {
1343
+ background: #1a1d27 !important;
1344
+ color: #e5e7eb !important;
1345
+ }
1346
+ }
1347
+ }
1348
+
1349
+ :root[data-theme="dark"] {
1350
+ body {
1351
+ background: #0f1117;
1352
+ }
1353
+
1354
+ .app-header {
1355
+ background: #1a1d27;
1356
+ border-bottom-color: #2d3148;
1357
+ }
1358
+
1359
+ .app-name {
1360
+ color: #f3f4f6;
1361
+ }
1362
+
1363
+ .logo {
1364
+ filter: invert(1) brightness(1.2);
1365
+ }
1366
+
1367
+ .username-display {
1368
+ color: #d1d5db;
1369
+ }
1370
+
1371
+ .username-display:hover {
1372
+ color: #f3f4f6;
1373
+ border-bottom-color: #6b7280;
1374
+ }
1375
+
1376
+ .online-count {
1377
+ color: #6b7280;
1378
+ }
1379
+
1380
+ .link-btn {
1381
+ color: #9ca3af;
1382
+ }
1383
+
1384
+ .link-btn:hover {
1385
+ color: #f3f4f6;
1386
+ }
1387
+
1388
+ .theme-toggle:hover {
1389
+ background: #2d3148;
1390
+ }
1391
+
1392
+ .logout-btn {
1393
+ border-color: #2d3148;
1394
+ color: #9ca3af;
1395
+ }
1396
+
1397
+ .logout-btn:hover {
1398
+ background: #2d1515;
1399
+ border-color: #7f1d1d;
1400
+ color: #f87171;
1401
+ }
1402
+
1403
+ .search-wrapper input {
1404
+ background: #252836;
1405
+ border-color: #2d3148;
1406
+ color: #f3f4f6;
1407
+ }
1408
+
1409
+ .search-wrapper input:focus {
1410
+ background: #2d3148;
1411
+ border-color: #4b5563;
1412
+ }
1413
+
1414
+ .search-wrapper input::placeholder {
1415
+ color: #6b7280;
1416
+ }
1417
+
1418
+ .search-icon {
1419
+ color: #6b7280;
1420
+ }
1421
+
1422
+ .channel-bar {
1423
+ background: #1a1d27;
1424
+ }
1425
+
1426
+ .channel-bar::after {
1427
+ background: linear-gradient(to right, transparent, #1a1d27);
1428
+ }
1429
+
1430
+ .channels button {
1431
+ color: #9ca3af;
1432
+ }
1433
+
1434
+ .channels button:hover {
1435
+ background: #2d3148;
1436
+ color: #f3f4f6;
1437
+ }
1438
+
1439
+ .channels button.active {
1440
+ background: #252836;
1441
+ color: #f3f4f6;
1442
+ }
1443
+
1444
+ .add-channel {
1445
+ color: #9ca3af;
1446
+ }
1447
+
1448
+ .add-channel:hover {
1449
+ background: #2d3148;
1450
+ }
1451
+
1452
+ .add-channel-mobile {
1453
+ color: #9ca3af;
1454
+ border-left-color: #2d3148;
1455
+ }
1456
+
1457
+ .add-channel-mobile:hover {
1458
+ background: #2d3148;
1459
+ color: #f3f4f6;
1460
+ }
1461
+
1462
+ .composer {
1463
+ background: #1a1d27;
1464
+ }
1465
+
1466
+ input[type=text] {
1467
+ background: #252836;
1468
+ border-color: #2d3148;
1469
+ color: #f3f4f6;
1470
+ }
1471
+
1472
+ input[type=text]::placeholder {
1473
+ color: #6b7280;
1474
+ }
1475
+
1476
+ .drop {
1477
+ background: #1a1d27;
1478
+ border-color: #2d3148;
1479
+ color: #6b7280;
1480
+ }
1481
+
1482
+ .item {
1483
+ background: #1a1d27;
1484
+ color: #e5e7eb;
1485
+ }
1486
+
1487
+ .item:hover {
1488
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
1489
+ }
1490
+
1491
+ .item a {
1492
+ color: #60a5fa;
1493
+ }
1494
+
1495
+ .left {
1496
+ color: #e5e7eb;
1497
+ }
1498
+
1499
+ .left.flash {
1500
+ background: #064e3b;
1501
+ }
1502
+
1503
+ .left:hover::after {
1504
+ background: #374151;
1505
+ color: #f3f4f6;
1506
+ }
1507
+
1508
+ .meta {
1509
+ color: #6b7280;
1510
+ }
1511
+
1512
+ .empty-state {
1513
+ color: #4b5563;
1514
+ }
1515
+
1516
+ .size-tag.warn {
1517
+ background: #422006;
1518
+ color: #fbbf24;
1519
+ }
1520
+
1521
+ .size-tag.danger-light {
1522
+ background: #2d1515;
1523
+ color: #f87171;
1524
+ }
1525
+
1526
+ .icon-btn {
1527
+ background: #252836;
1528
+ border-color: #2d3148;
1529
+ color: #9ca3af;
1530
+ }
1531
+
1532
+ .icon-btn:hover {
1533
+ background: #2d3148;
1534
+ }
1535
+
1536
+ .icon-btn.delete {
1537
+ background: #1a1d27;
1538
+ border-color: #7f1d1d;
1539
+ color: #f87171;
1540
+ }
1541
+
1542
+ .icon-btn.delete:hover {
1543
+ background: #2d1515;
1544
+ }
1545
+
1546
+ .icon-btn.preview-active {
1547
+ background: #1e3a5f;
1548
+ border-color: #2563eb;
1549
+ color: #60a5fa;
1550
+ }
1551
+
1552
+ .move-dropdown {
1553
+ background: #1a1d27;
1554
+ border-color: #2d3148;
1555
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
1556
+ }
1557
+
1558
+ .move-dropdown button {
1559
+ color: #d1d5db;
1560
+ }
1561
+
1562
+ .move-dropdown button:hover {
1563
+ background: #252836;
1564
+ color: #f3f4f6;
1565
+ }
1566
+
1567
+ .move-dropdown .dropdown-label {
1568
+ color: #6b7280;
1569
+ }
1570
+
1571
+ .context-menu {
1572
+ background: #1a1d27;
1573
+ border-color: #2d3148;
1574
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1575
+ }
1576
+
1577
+ .context-menu button {
1578
+ color: #d1d5db;
1579
+ }
1580
+
1581
+ .context-menu button:hover {
1582
+ background: #252836;
1583
+ }
1584
+
1585
+ .context-menu button.danger {
1586
+ color: #f87171;
1587
+ }
1588
+
1589
+ .context-menu button.danger:hover {
1590
+ background: #2d1515;
1591
+ }
1592
+
1593
+ .context-menu button.muted {
1594
+ color: #4b5563;
1595
+ }
1596
+
1597
+ .context-menu .menu-divider {
1598
+ background: #2d3148;
1599
+ }
1600
+
1601
+ .preview-panel {
1602
+ border-top-color: #2d3148;
1603
+ }
1604
+
1605
+ .preview-panel embed,
1606
+ .preview-panel iframe {
1607
+ background: #252836;
1608
+ }
1609
+
1610
+ .preview-panel pre {
1611
+ background: #0f1117;
1612
+ border-color: #2d3148;
1613
+ color: #e5e7eb;
1614
+ }
1615
+
1616
+ .preview-truncated,
1617
+ .preview-error,
1618
+ .preview-loading {
1619
+ color: #6b7280;
1620
+ }
1621
+
1622
+ .markdown-body {
1623
+ color: #e5e7eb;
1624
+ }
1625
+
1626
+ .markdown-body code {
1627
+ background: #252836;
1628
+ color: #e5e7eb;
1629
+ }
1630
+
1631
+ .markdown-body pre {
1632
+ background: #0f1117;
1633
+ border-color: #2d3148;
1634
+ }
1635
+
1636
+ .markdown-body a {
1637
+ color: #60a5fa;
1638
+ }
1639
+
1640
+ .qr-card {
1641
+ background: #1a1d27;
1642
+ border-color: #2d3148;
1643
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
1644
+ }
1645
+
1646
+ .qr-card .qr-label {
1647
+ color: #f3f4f6;
1648
+ }
1649
+
1650
+ .qr-card .qr-url {
1651
+ color: #9ca3af;
1652
+ }
1653
+
1654
+ .undo-toast {
1655
+ background: #374151;
1656
+ }
1657
+
1658
+ .load-more-btn {
1659
+ background: #1a1d27;
1660
+ color: #d1d5db;
1661
+ border-color: #2d3148;
1662
+ }
1663
+
1664
+ .load-more-btn:hover {
1665
+ background: #2d3148;
1666
+ }
1667
+
1668
+ #uploadStatus {
1669
+ background: #1a1d27 !important;
1670
+ color: #e5e7eb !important;
1671
+ }
813
1672
  }