instbyte 1.7.0 → 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
-
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
55
 
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;
@@ -203,6 +99,77 @@ input[type=text]:focus {
203
99
  justify-content: center;
204
100
  }
205
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
+ ============================================================ */
206
173
  .search-wrapper {
207
174
  position: relative;
208
175
  width: 100%;
@@ -233,22 +200,53 @@ input[type=text]:focus {
233
200
  color: #9ca3af;
234
201
  }
235
202
 
236
- .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;
237
212
  display: flex;
238
213
  align-items: center;
239
- gap: 8px;
240
- font-size: 13px;
214
+ gap: 6px;
215
+ position: relative;
241
216
  }
242
217
 
243
- .link-btn {
244
- 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;
245
234
  border: none;
246
- color: #6b7280;
235
+ padding: 7px 12px;
236
+ border-radius: 10px;
247
237
  cursor: pointer;
248
- font-size: 13px;
238
+ font-size: 14px;
239
+ color: #4b5563;
240
+ transition: all 0.15s ease;
249
241
  }
250
242
 
251
- .link-btn:hover {
243
+ .channels button:hover {
244
+ background: #d1d5db;
245
+ color: #111827;
246
+ }
247
+
248
+ .channels button.active {
249
+ background: #f9fafb;
252
250
  color: #111827;
253
251
  }
254
252
 
@@ -262,42 +260,117 @@ input[type=text]:focus {
262
260
  cursor: pointer;
263
261
  }
264
262
 
263
+ .add-channel:hover {
264
+ background: #d1d5db;
265
+ }
266
+
265
267
  .add-channel-mobile {
266
268
  display: none;
267
269
  }
268
270
 
269
- .add-channel:hover {
270
- 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;
271
278
  }
272
279
 
273
- .size-tag {
280
+ .ch-unread-dot {
274
281
  display: inline-block;
275
- font-size: 11px;
276
- font-weight: 500;
277
- 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;
278
296
  border-radius: 4px;
279
- margin-left: 6px;
280
- 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;
281
303
  }
282
304
 
283
- .size-tag.warn {
284
- background: #fef9c3;
285
- color: #854d0e;
305
+ .channels button:hover .ch-more,
306
+ .channels button.active .ch-more {
307
+ opacity: 1;
286
308
  }
287
309
 
288
- .size-tag.danger-light {
289
- background: #fee2e2;
290
- color: #b91c1c;
310
+ .ch-more:hover {
311
+ background: rgba(0, 0, 0, 0.1);
312
+ color: #111827;
291
313
  }
292
314
 
293
- .size-tag.danger-dark {
294
- background: #7f1d1d;
295
- color: #fff;
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;
361
+ }
362
+
363
+ .meta {
364
+ font-size: 12px;
365
+ color: #6b7280;
296
366
  }
297
367
 
298
368
  .left {
369
+ max-width: 70%;
370
+ word-break: break-word;
299
371
  cursor: pointer;
300
372
  position: relative;
373
+ color: #111827;
301
374
  }
302
375
 
303
376
  .left:hover::after {
@@ -321,68 +394,86 @@ input[type=text]:focus {
321
394
  transition: background 0.3s ease;
322
395
  }
323
396
 
324
- .qr-widget {
325
- position: fixed;
326
- bottom: 20px;
327
- right: 20px;
328
- z-index: 999;
397
+ .item-actions {
329
398
  display: flex;
330
- flex-direction: column;
331
- align-items: flex-end;
332
399
  gap: 8px;
333
400
  }
334
401
 
335
- .qr-card {
336
- background: #fff;
337
- border: 1px solid #e5e7eb;
338
- border-radius: 12px;
339
- padding: 16px;
402
+ .empty-state {
340
403
  text-align: center;
341
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
342
- display: none;
343
- width: 200px;
404
+ color: #9ca3af;
405
+ font-size: 14px;
406
+ padding: 60px 20px;
344
407
  }
345
408
 
346
- .qr-card.open {
347
- display: block;
348
- }
349
409
 
350
- .qr-card img {
351
- width: 160px;
352
- height: 160px;
353
- 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;
354
421
  }
355
422
 
356
- .qr-card .qr-url {
357
- font-size: 11px;
358
- color: #6b7280;
359
- margin-top: 8px;
360
- word-break: break-all;
361
- line-height: 1.4;
423
+ .size-tag.warn {
424
+ background: #fef9c3;
425
+ color: #854d0e;
362
426
  }
363
427
 
364
- .qr-card .qr-label {
365
- font-size: 12px;
366
- font-weight: 600;
367
- color: #111827;
368
- margin-bottom: 10px;
428
+ .size-tag.danger-light {
429
+ background: #fee2e2;
430
+ color: #b91c1c;
369
431
  }
370
432
 
371
- .qr-toggle {
372
- background: #111827;
433
+ .size-tag.danger-dark {
434
+ background: #7f1d1d;
373
435
  color: #fff;
374
- border: none;
375
- border-radius: 20px;
376
- padding: 8px 14px;
377
- 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;
378
447
  cursor: pointer;
379
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
448
+ font-size: 14px;
449
+ line-height: 1;
450
+ color: #6b7280;
380
451
  }
381
452
 
382
- .qr-toggle:hover {
383
- 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;
384
471
  }
385
472
 
473
+
474
+ /* ============================================================
475
+ MOVE DROPDOWN
476
+ ============================================================ */
386
477
  .move-wrapper {
387
478
  position: relative;
388
479
  }
@@ -412,61 +503,31 @@ input[type=text]:focus {
412
503
  background: none;
413
504
  border: none;
414
505
  padding: 9px 14px;
415
- font-size: 13px;
416
- color: #374151;
417
- cursor: pointer;
418
- border-radius: 0;
419
- }
420
-
421
- .move-dropdown button:hover {
422
- background: #f3f4f6;
423
- color: #111827;
424
- }
425
-
426
- .move-dropdown .dropdown-label {
427
- font-size: 11px;
428
- color: #9ca3af;
429
- padding: 8px 14px 4px;
430
- font-weight: 500;
431
- text-transform: uppercase;
432
- letter-spacing: 0.05em;
433
- cursor: default;
434
- }
435
-
436
- .ch-pin-dot {
437
- display: inline-block;
438
- width: 6px;
439
- height: 6px;
440
- background: #f59e0b;
441
- border-radius: 50%;
442
- flex-shrink: 0;
443
- }
444
-
445
- .ch-more {
446
- display: inline-flex;
447
- align-items: center;
448
- justify-content: center;
449
- width: 18px;
450
- height: 18px;
451
- border-radius: 4px;
452
- font-size: 13px;
453
- color: #6b7280;
454
- opacity: 0;
455
- transition: opacity 0.12s ease, background 0.12s ease;
456
- margin-left: 2px;
457
- line-height: 1;
506
+ font-size: 13px;
507
+ color: #374151;
508
+ cursor: pointer;
509
+ border-radius: 0;
458
510
  }
459
511
 
460
- .channels button:hover .ch-more,
461
- .channels button.active .ch-more {
462
- opacity: 1;
512
+ .move-dropdown button:hover {
513
+ background: #f3f4f6;
514
+ color: #111827;
463
515
  }
464
516
 
465
- .ch-more:hover {
466
- background: rgba(0, 0, 0, 0.1);
467
- color: #111827;
517
+ .move-dropdown .dropdown-label {
518
+ font-size: 11px;
519
+ color: #9ca3af;
520
+ padding: 8px 14px 4px;
521
+ font-weight: 500;
522
+ text-transform: uppercase;
523
+ letter-spacing: 0.05em;
524
+ cursor: default;
468
525
  }
469
526
 
527
+
528
+ /* ============================================================
529
+ CONTEXT MENU
530
+ ============================================================ */
470
531
  .context-menu {
471
532
  position: fixed;
472
533
  background: #fff;
@@ -526,6 +587,10 @@ input[type=text]:focus {
526
587
  margin: 4px 0;
527
588
  }
528
589
 
590
+
591
+ /* ============================================================
592
+ MARKDOWN
593
+ ============================================================ */
529
594
  .markdown-body {
530
595
  line-height: 1.5;
531
596
  font-size: 14px;
@@ -580,6 +645,10 @@ input[type=text]:focus {
580
645
  padding-left: 20px;
581
646
  }
582
647
 
648
+
649
+ /* ============================================================
650
+ PREVIEW PANEL
651
+ ============================================================ */
583
652
  .preview-panel {
584
653
  display: none;
585
654
  margin-top: 10px;
@@ -657,57 +726,165 @@ input[type=text]:focus {
657
726
  padding: 12px 0;
658
727
  }
659
728
 
660
- .icon-btn.preview-active {
661
- background: #eff6ff;
662
- border-color: #bfdbfe;
663
- color: #1d4ed8;
664
- }
665
729
 
666
- /* Make item flex-direction column to allow panel below content */
667
- .item {
730
+ /* ============================================================
731
+ QR WIDGET
732
+ ============================================================ */
733
+ .qr-widget {
734
+ position: fixed;
735
+ bottom: 20px;
736
+ right: 20px;
737
+ z-index: 999;
738
+ display: flex;
668
739
  flex-direction: column;
669
- align-items: stretch;
670
- transition: box-shadow 0.15s ease;
740
+ align-items: flex-end;
741
+ gap: 8px;
671
742
  }
672
743
 
673
- .item-top {
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;
793
+ }
794
+
795
+
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;
674
809
  display: flex;
675
- justify-content: space-between;
676
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;
677
818
  }
678
819
 
679
- .item:hover {
680
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
820
+ .undo-toast.show {
821
+ transform: translateX(-50%) translateY(0);
822
+ opacity: 1;
681
823
  }
682
824
 
683
- .empty-state {
684
- text-align: center;
685
- color: #9ca3af;
686
- font-size: 14px;
687
- padding: 60px 20px;
825
+ .undo-toast #undoBtn {
826
+ background: none;
827
+ border: 1px solid #4b5563;
828
+ color: #f3f4f6;
829
+ padding: 4px 10px;
830
+ border-radius: 6px;
831
+ font-size: 12px;
832
+ cursor: pointer;
833
+ flex-shrink: 0;
688
834
  }
689
835
 
690
- .theme-toggle {
691
- font-size: 15px;
692
- padding: 2px 6px;
693
- border-radius: 6px;
694
- transition: background 0.15s ease;
836
+ .undo-toast #undoBtn:hover {
837
+ background: #374151;
695
838
  }
696
839
 
697
- .theme-toggle:hover {
698
- background: #f3f4f6;
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;
699
849
  }
700
850
 
701
- @media (prefers-color-scheme: dark) {
702
- :root:not([data-theme="light"]) .theme-toggle:hover {
703
- background: #2d3148;
851
+ .undo-progress.running {
852
+ animation: drain 5s linear forwards;
853
+ }
854
+
855
+ @keyframes drain {
856
+ from {
857
+ transform: scaleX(1);
858
+ }
859
+
860
+ to {
861
+ transform: scaleX(0);
704
862
  }
705
863
  }
706
864
 
707
- :root[data-theme="dark"] .theme-toggle:hover {
708
- background: #2d3148;
865
+
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;
878
+ }
879
+
880
+ .load-more-btn:hover {
881
+ background: #e5e7eb;
709
882
  }
710
883
 
884
+
885
+ /* ============================================================
886
+ MOBILE
887
+ ============================================================ */
711
888
  @media (max-width: 640px) {
712
889
  .app-header {
713
890
  flex-wrap: wrap;
@@ -834,9 +1011,16 @@ input[type=text]:focus {
834
1011
  }
835
1012
  }
836
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
+
837
1022
  @media (prefers-color-scheme: dark) {
838
1023
  :root:not([data-theme="light"]) {
839
-
840
1024
  body {
841
1025
  background: #0f1117;
842
1026
  }
@@ -850,6 +1034,46 @@ input[type=text]:focus {
850
1034
  color: #f3f4f6;
851
1035
  }
852
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
+
853
1077
  .search-wrapper input {
854
1078
  background: #252836;
855
1079
  border-color: #2d3148;
@@ -869,18 +1093,6 @@ input[type=text]:focus {
869
1093
  color: #6b7280;
870
1094
  }
871
1095
 
872
- .logo {
873
- filter: invert(1) brightness(1.2);
874
- }
875
-
876
- .link-btn {
877
- color: #9ca3af;
878
- }
879
-
880
- .link-btn:hover {
881
- color: #f3f4f6;
882
- }
883
-
884
1096
  .channel-bar {
885
1097
  background: #1a1d27;
886
1098
  }
@@ -943,6 +1155,7 @@ input[type=text]:focus {
943
1155
 
944
1156
  .item {
945
1157
  background: #1a1d27;
1158
+ color: #e5e7eb;
946
1159
  }
947
1160
 
948
1161
  .item:hover {
@@ -953,29 +1166,35 @@ input[type=text]:focus {
953
1166
  color: #60a5fa;
954
1167
  }
955
1168
 
956
- .meta {
957
- color: #6b7280;
1169
+ .left {
1170
+ color: #e5e7eb;
958
1171
  }
959
1172
 
960
- .preview-panel {
961
- border-top-color: #2d3148;
1173
+ .left.flash {
1174
+ background: #064e3b;
962
1175
  }
963
1176
 
964
- .preview-panel embed,
965
- .preview-panel iframe {
966
- background: #252836;
1177
+ .left:hover::after {
1178
+ background: #374151;
1179
+ color: #f3f4f6;
967
1180
  }
968
1181
 
969
- .preview-panel pre {
970
- background: #0f1117;
971
- border-color: #2d3148;
972
- color: #e5e7eb;
1182
+ .meta {
1183
+ color: #6b7280;
973
1184
  }
974
1185
 
975
- .preview-truncated,
976
- .preview-error,
977
- .preview-loading {
978
- color: #6b7280;
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;
979
1198
  }
980
1199
 
981
1200
  .icon-btn {
@@ -1053,18 +1272,25 @@ input[type=text]:focus {
1053
1272
  background: #2d3148;
1054
1273
  }
1055
1274
 
1056
- .qr-card {
1057
- background: #1a1d27;
1058
- border-color: #2d3148;
1059
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
1275
+ .preview-panel {
1276
+ border-top-color: #2d3148;
1060
1277
  }
1061
1278
 
1062
- .qr-card .qr-label {
1063
- color: #f3f4f6;
1279
+ .preview-panel embed,
1280
+ .preview-panel iframe {
1281
+ background: #252836;
1064
1282
  }
1065
1283
 
1066
- .qr-card .qr-url {
1067
- color: #9ca3af;
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;
1068
1294
  }
1069
1295
 
1070
1296
  .markdown-body {
@@ -1085,37 +1311,42 @@ input[type=text]:focus {
1085
1311
  color: #60a5fa;
1086
1312
  }
1087
1313
 
1088
- .size-tag.warn {
1089
- background: #422006;
1090
- color: #fbbf24;
1314
+ .qr-card {
1315
+ background: #1a1d27;
1316
+ border-color: #2d3148;
1317
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
1091
1318
  }
1092
1319
 
1093
- .size-tag.danger-light {
1094
- background: #2d1515;
1095
- color: #f87171;
1320
+ .qr-card .qr-label {
1321
+ color: #f3f4f6;
1096
1322
  }
1097
1323
 
1098
- .left.flash {
1099
- background: #064e3b;
1324
+ .qr-card .qr-url {
1325
+ color: #9ca3af;
1100
1326
  }
1101
1327
 
1102
- .left:hover::after {
1328
+ .undo-toast {
1103
1329
  background: #374151;
1104
- color: #f3f4f6;
1105
1330
  }
1106
1331
 
1107
- .empty-state {
1108
- color: #4b5563;
1332
+ .load-more-btn {
1333
+ background: #1a1d27;
1334
+ color: #d1d5db;
1335
+ border-color: #2d3148;
1336
+ }
1337
+
1338
+ .load-more-btn:hover {
1339
+ background: #2d3148;
1109
1340
  }
1110
1341
 
1111
- .upload-status {
1342
+ #uploadStatus {
1112
1343
  background: #1a1d27 !important;
1344
+ color: #e5e7eb !important;
1113
1345
  }
1114
1346
  }
1115
1347
  }
1116
1348
 
1117
1349
  :root[data-theme="dark"] {
1118
-
1119
1350
  body {
1120
1351
  background: #0f1117;
1121
1352
  }
@@ -1129,6 +1360,46 @@ input[type=text]:focus {
1129
1360
  color: #f3f4f6;
1130
1361
  }
1131
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
+
1132
1403
  .search-wrapper input {
1133
1404
  background: #252836;
1134
1405
  border-color: #2d3148;
@@ -1148,18 +1419,6 @@ input[type=text]:focus {
1148
1419
  color: #6b7280;
1149
1420
  }
1150
1421
 
1151
- .logo {
1152
- filter: invert(1) brightness(1.2);
1153
- }
1154
-
1155
- .link-btn {
1156
- color: #9ca3af;
1157
- }
1158
-
1159
- .link-btn:hover {
1160
- color: #f3f4f6;
1161
- }
1162
-
1163
1422
  .channel-bar {
1164
1423
  background: #1a1d27;
1165
1424
  }
@@ -1186,10 +1445,6 @@ input[type=text]:focus {
1186
1445
  color: #9ca3af;
1187
1446
  }
1188
1447
 
1189
- .header-right span {
1190
- color: #f3f4f6;
1191
- }
1192
-
1193
1448
  .add-channel:hover {
1194
1449
  background: #2d3148;
1195
1450
  }
@@ -1226,6 +1481,7 @@ input[type=text]:focus {
1226
1481
 
1227
1482
  .item {
1228
1483
  background: #1a1d27;
1484
+ color: #e5e7eb;
1229
1485
  }
1230
1486
 
1231
1487
  .item:hover {
@@ -1236,29 +1492,35 @@ input[type=text]:focus {
1236
1492
  color: #60a5fa;
1237
1493
  }
1238
1494
 
1239
- .meta {
1240
- color: #6b7280;
1495
+ .left {
1496
+ color: #e5e7eb;
1241
1497
  }
1242
1498
 
1243
- .preview-panel {
1244
- border-top-color: #2d3148;
1499
+ .left.flash {
1500
+ background: #064e3b;
1245
1501
  }
1246
1502
 
1247
- .preview-panel embed,
1248
- .preview-panel iframe {
1249
- background: #252836;
1503
+ .left:hover::after {
1504
+ background: #374151;
1505
+ color: #f3f4f6;
1250
1506
  }
1251
1507
 
1252
- .preview-panel pre {
1253
- background: #0f1117;
1254
- border-color: #2d3148;
1255
- color: #e5e7eb;
1508
+ .meta {
1509
+ color: #6b7280;
1256
1510
  }
1257
1511
 
1258
- .preview-truncated,
1259
- .preview-error,
1260
- .preview-loading {
1261
- color: #6b7280;
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;
1262
1524
  }
1263
1525
 
1264
1526
  .icon-btn {
@@ -1336,18 +1598,25 @@ input[type=text]:focus {
1336
1598
  background: #2d3148;
1337
1599
  }
1338
1600
 
1339
- .qr-card {
1340
- background: #1a1d27;
1341
- border-color: #2d3148;
1342
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
1601
+ .preview-panel {
1602
+ border-top-color: #2d3148;
1343
1603
  }
1344
1604
 
1345
- .qr-card .qr-label {
1346
- color: #f3f4f6;
1605
+ .preview-panel embed,
1606
+ .preview-panel iframe {
1607
+ background: #252836;
1347
1608
  }
1348
1609
 
1349
- .qr-card .qr-url {
1350
- color: #9ca3af;
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;
1351
1620
  }
1352
1621
 
1353
1622
  .markdown-body {
@@ -1368,106 +1637,36 @@ input[type=text]:focus {
1368
1637
  color: #60a5fa;
1369
1638
  }
1370
1639
 
1371
- .size-tag.warn {
1372
- background: #422006;
1373
- color: #fbbf24;
1374
- }
1375
-
1376
- .size-tag.danger-light {
1377
- background: #2d1515;
1378
- color: #f87171;
1379
- }
1380
-
1381
- .left.flash {
1382
- background: #064e3b;
1640
+ .qr-card {
1641
+ background: #1a1d27;
1642
+ border-color: #2d3148;
1643
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
1383
1644
  }
1384
1645
 
1385
- .left:hover::after {
1386
- background: #374151;
1646
+ .qr-card .qr-label {
1387
1647
  color: #f3f4f6;
1388
1648
  }
1389
1649
 
1390
- .empty-state {
1391
- color: #4b5563;
1650
+ .qr-card .qr-url {
1651
+ color: #9ca3af;
1392
1652
  }
1393
1653
 
1394
- .upload-status {
1395
- background: #1a1d27 !important;
1654
+ .undo-toast {
1655
+ background: #374151;
1396
1656
  }
1397
- }
1398
-
1399
- .undo-toast {
1400
- position: fixed;
1401
- bottom: 30px;
1402
- left: 50%;
1403
- transform: translateX(-50%) translateY(80px);
1404
- background: #1f2937;
1405
- color: #f3f4f6;
1406
- padding: 12px 16px;
1407
- border-radius: 10px;
1408
- font-size: 13px;
1409
- display: flex;
1410
- align-items: center;
1411
- gap: 12px;
1412
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);
1413
- z-index: 9999;
1414
- opacity: 0;
1415
- transition: transform 0.2s ease, opacity 0.2s ease;
1416
- min-width: 220px;
1417
- overflow: hidden;
1418
- }
1419
-
1420
- .undo-toast.show {
1421
- transform: translateX(-50%) translateY(0);
1422
- opacity: 1;
1423
- }
1424
-
1425
- .undo-toast #undoBtn {
1426
- background: none;
1427
- border: 1px solid #4b5563;
1428
- color: #f3f4f6;
1429
- padding: 4px 10px;
1430
- border-radius: 6px;
1431
- font-size: 12px;
1432
- cursor: pointer;
1433
- flex-shrink: 0;
1434
- }
1435
-
1436
- .undo-toast #undoBtn:hover {
1437
- background: #374151;
1438
- }
1439
-
1440
- .undo-progress {
1441
- position: absolute;
1442
- bottom: 0;
1443
- left: 0;
1444
- height: 3px;
1445
- width: 100%;
1446
- background: #4b5563;
1447
- transform-origin: left;
1448
- animation: none;
1449
- }
1450
-
1451
- .undo-progress.running {
1452
- animation: drain 5s linear forwards;
1453
- }
1454
1657
 
1455
- @keyframes drain {
1456
- from {
1457
- transform: scaleX(1);
1658
+ .load-more-btn {
1659
+ background: #1a1d27;
1660
+ color: #d1d5db;
1661
+ border-color: #2d3148;
1458
1662
  }
1459
1663
 
1460
- to {
1461
- transform: scaleX(0);
1664
+ .load-more-btn:hover {
1665
+ background: #2d3148;
1462
1666
  }
1463
- }
1464
1667
 
1465
- @media (prefers-color-scheme: dark) {
1466
- :root:not([data-theme="light"]) .undo-toast {
1467
- background: #374151;
1668
+ #uploadStatus {
1669
+ background: #1a1d27 !important;
1670
+ color: #e5e7eb !important;
1468
1671
  }
1469
- }
1470
-
1471
- :root[data-theme="dark"] .undo-toast {
1472
- background: #374151;
1473
1672
  }