most-box 0.0.1 → 0.0.2

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.
package/public/app.css ADDED
@@ -0,0 +1,1519 @@
1
+ /* =============================================
2
+ MostBox - App Styles
3
+ Native CSS with Variables, Nesting, Responsive
4
+ ============================================= */
5
+
6
+ /* === CSS Variables (Theme) === */
7
+ :root {
8
+ --bg-primary: #f8fafc;
9
+ --bg-secondary: #ffffff;
10
+ --bg-tertiary: #f1f5f9;
11
+ --text-primary: #0f172a;
12
+ --text-secondary: #64748b;
13
+ --text-muted: #94a3b8;
14
+ --border-color: rgba(0, 0, 0, 0.06);
15
+ --accent-blue: #3b82f6;
16
+ --danger: #ef4444;
17
+ --success: #22c55e;
18
+ --warning: #f59e0b;
19
+ --info: #6366f1;
20
+ }
21
+
22
+ [data-theme="dark"] {
23
+ --bg-primary: #0f172a;
24
+ --bg-secondary: #1e293b;
25
+ --bg-tertiary: #334155;
26
+ --text-primary: #f8fafc;
27
+ --text-secondary: #94a3b8;
28
+ --text-muted: #64748b;
29
+ --border-color: rgba(255, 255, 255, 0.08);
30
+ --accent-blue: #60a5fa;
31
+ }
32
+
33
+ /* === Base / Reset === */
34
+ * {
35
+ margin: 0;
36
+ padding: 0;
37
+ box-sizing: border-box;
38
+ }
39
+
40
+ body {
41
+ font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;
42
+ }
43
+
44
+ ::-webkit-scrollbar {
45
+ width: 6px;
46
+ }
47
+
48
+ ::-webkit-scrollbar-thumb {
49
+ background: var(--text-muted);
50
+ border-radius: 4px;
51
+ }
52
+
53
+ /* === Layout === */
54
+ .app-layout {
55
+ display: flex;
56
+ min-height: 100vh;
57
+ background: var(--bg-primary);
58
+ color: var(--text-primary);
59
+ }
60
+
61
+ /* === Sidebar === */
62
+ .sidebar {
63
+ width: 200px;
64
+ background: var(--bg-tertiary);
65
+ display: flex;
66
+ flex-direction: column;
67
+ border-right: 1px solid var(--border-color);
68
+ flex-shrink: 0;
69
+
70
+ .sidebar-header {
71
+ padding: 20px 16px;
72
+ border-bottom: 1px solid var(--border-color);
73
+
74
+ h1 {
75
+ font-size: 18px;
76
+ font-weight: 700;
77
+ color: var(--accent-blue);
78
+ }
79
+ }
80
+
81
+ .sidebar-nav {
82
+ padding: 12px 8px;
83
+ flex: 1;
84
+ }
85
+
86
+ .sidebar-nav-btn {
87
+ width: 100%;
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 10px;
91
+ padding: 10px 12px;
92
+ border-radius: 8px;
93
+ border: none;
94
+ cursor: pointer;
95
+ margin-bottom: 4px;
96
+ background: transparent;
97
+ color: var(--text-secondary);
98
+ font-weight: 500;
99
+ font-size: 13px;
100
+ transition: background 0.15s;
101
+
102
+ &.active {
103
+ background: color-mix(in srgb, var(--accent-blue) 12%, transparent);
104
+ color: var(--accent-blue);
105
+ font-weight: 600;
106
+ }
107
+
108
+ &:hover:not(.active) {
109
+ background: color-mix(in srgb, var(--accent-blue) 6%, transparent);
110
+ }
111
+ }
112
+
113
+ .sidebar-footer {
114
+ padding: 12px 16px;
115
+ border-top: 1px solid var(--border-color);
116
+ }
117
+
118
+ .sidebar-footer-label {
119
+ display: flex;
120
+ align-items: center;
121
+ gap: 6px;
122
+ margin-bottom: 6px;
123
+ font-size: 11px;
124
+ color: var(--text-secondary);
125
+ }
126
+
127
+ .storage-bar {
128
+ height: 4px;
129
+ border-radius: 2px;
130
+ background: var(--bg-secondary);
131
+ overflow: hidden;
132
+ }
133
+
134
+ .storage-bar-fill {
135
+ height: 100%;
136
+ background: var(--accent-blue);
137
+ transition: width 0.3s;
138
+ }
139
+
140
+ .storage-info {
141
+ display: flex;
142
+ justify-content: space-between;
143
+ font-size: 10px;
144
+ color: var(--text-secondary);
145
+ margin-top: 4px;
146
+ }
147
+ }
148
+
149
+ /* === Mobile sidebar overlay === */
150
+ .sidebar-overlay {
151
+ display: none;
152
+ }
153
+
154
+ .mobile-menu-btn {
155
+ display: none;
156
+ }
157
+
158
+ /* === Main Content === */
159
+ .main-content {
160
+ flex: 1;
161
+ display: flex;
162
+ flex-direction: column;
163
+ min-width: 0;
164
+ }
165
+
166
+ /* === Header === */
167
+ .app-header {
168
+ display: flex;
169
+ justify-content: space-between;
170
+ align-items: center;
171
+ flex-wrap: wrap;
172
+ padding: 16px 24px;
173
+ border-bottom: 1px solid var(--border-color);
174
+ background: var(--bg-secondary);
175
+ gap: 16px;
176
+
177
+ .header-left {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 12px;
181
+ }
182
+
183
+ .header-title {
184
+ font-size: 16px;
185
+ font-weight: 600;
186
+ }
187
+
188
+ .header-badge {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 4px;
192
+ padding: 3px 8px;
193
+ border-radius: 12px;
194
+ background: var(--bg-tertiary);
195
+ font-size: 11px;
196
+ color: var(--text-secondary);
197
+ }
198
+
199
+ .header-badge-dot {
200
+ width: 6px;
201
+ height: 6px;
202
+ border-radius: 50%;
203
+ background: var(--warning);
204
+
205
+ &.connected {
206
+ background: var(--success);
207
+ }
208
+ }
209
+
210
+ .header-right {
211
+ display: flex;
212
+ align-items: center;
213
+ gap: 8px;
214
+ flex-wrap: wrap;
215
+ }
216
+ }
217
+
218
+ /* === Search === */
219
+ .search-box {
220
+ display: flex;
221
+ align-items: center;
222
+ gap: 8px;
223
+ padding: 6px 12px;
224
+ border-radius: 8px;
225
+ background: var(--bg-tertiary);
226
+ border: 1px solid var(--border-color);
227
+
228
+ input {
229
+ background: none;
230
+ border: none;
231
+ outline: none;
232
+ font-size: 12px;
233
+ color: var(--text-primary);
234
+ width: 120px;
235
+ }
236
+
237
+ button {
238
+ display: flex;
239
+ background: none;
240
+ border: none;
241
+ cursor: pointer;
242
+ color: var(--text-secondary);
243
+ padding: 0;
244
+ }
245
+ }
246
+
247
+ /* === Icon Button === */
248
+ .icon-btn {
249
+ width: 32px;
250
+ height: 32px;
251
+ border-radius: 8px;
252
+ border: none;
253
+ background: var(--bg-tertiary);
254
+ cursor: pointer;
255
+ color: var(--text-secondary);
256
+ position: relative;
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ transition: background 0.15s;
261
+
262
+ &:hover {
263
+ background: color-mix(in srgb, var(--accent-blue) 10%, var(--bg-tertiary));
264
+ }
265
+
266
+ &.accent {
267
+ color: var(--accent-blue);
268
+ }
269
+
270
+ &.theme-toggle {
271
+ color: #6366f1;
272
+ }
273
+ }
274
+
275
+ .icon-btn-badge {
276
+ position: absolute;
277
+ top: -4px;
278
+ right: -4px;
279
+ width: 14px;
280
+ height: 14px;
281
+ border-radius: 50%;
282
+ background: var(--danger);
283
+ color: #fff;
284
+ font-size: 9px;
285
+ font-weight: 700;
286
+ display: flex;
287
+ align-items: center;
288
+ justify-content: center;
289
+ }
290
+
291
+ /* === Upload / Download Grid === */
292
+ .action-grid {
293
+ display: grid;
294
+ grid-template-columns: 1fr 1fr;
295
+ gap: 12px;
296
+ padding: 16px 24px;
297
+ position: relative;
298
+ }
299
+
300
+ .action-card {
301
+ border: 2px dashed color-mix(in srgb, var(--accent-blue) 20%, transparent);
302
+ border-radius: 12px;
303
+ padding: 20px;
304
+ text-align: center;
305
+ cursor: pointer;
306
+ position: relative;
307
+ background: transparent;
308
+ transition: background 0.15s, border-color 0.15s;
309
+
310
+ &:hover {
311
+ background: color-mix(in srgb, var(--accent-blue) 4%, transparent);
312
+ }
313
+
314
+ p {
315
+ font-size: 12px;
316
+ color: var(--accent-blue);
317
+ font-weight: 500;
318
+ }
319
+ }
320
+
321
+ .action-card.upload.drag-over {
322
+ border-color: var(--accent-blue);
323
+ background: color-mix(in srgb, var(--accent-blue) 5%, transparent);
324
+ }
325
+
326
+ .action-card-download {
327
+ p {
328
+ color: #6366f1;
329
+ }
330
+ }
331
+
332
+ .action-card-input {
333
+ position: absolute;
334
+ inset: 0;
335
+ width: 100%;
336
+ height: 100%;
337
+ opacity: 0;
338
+ cursor: pointer;
339
+ z-index: 1;
340
+ }
341
+
342
+ /* === Breadcrumb === */
343
+ .breadcrumb {
344
+ display: flex;
345
+ align-items: center;
346
+ gap: 4px;
347
+ padding: 0 24px;
348
+ font-size: 12px;
349
+
350
+ button {
351
+ background: none;
352
+ border: none;
353
+ color: var(--text-muted);
354
+ cursor: pointer;
355
+ }
356
+
357
+ button.current {
358
+ color: var(--text-secondary);
359
+ }
360
+
361
+ .breadcrumb-edit-btn {
362
+ background: none;
363
+ border: none;
364
+ cursor: pointer;
365
+ color: var(--text-secondary);
366
+ padding: 2px;
367
+ display: flex;
368
+ align-items: center;
369
+ }
370
+ }
371
+
372
+ /* === File Grid === */
373
+ .content-grid {
374
+ flex: 1;
375
+ padding: 12px 24px;
376
+ overflow: auto;
377
+ }
378
+
379
+ .file-grid {
380
+ display: grid;
381
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
382
+ gap: 16px;
383
+ }
384
+
385
+ /* === Empty State === */
386
+ .empty-state {
387
+ text-align: center;
388
+ color: var(--text-muted);
389
+ padding: 48px;
390
+ font-size: 13px;
391
+ }
392
+
393
+ /* === File / Folder Card === */
394
+ .card {
395
+ display: flex;
396
+ flex-direction: column;
397
+ align-items: center;
398
+ padding: 16px;
399
+ border-radius: 12px;
400
+ cursor: pointer;
401
+ background: var(--bg-secondary);
402
+ border: 1px solid var(--border-color);
403
+ transition: all 0.15s;
404
+
405
+ &:hover {
406
+ border-color: var(--accent-blue);
407
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
408
+ }
409
+
410
+ &.selected {
411
+ background: color-mix(in srgb, var(--accent-blue) 8%, transparent);
412
+ border-color: var(--accent-blue);
413
+ }
414
+ }
415
+
416
+ .card-icon {
417
+ width: 56px;
418
+ height: 56px;
419
+ border-radius: 12px;
420
+ margin-bottom: 10px;
421
+ display: flex;
422
+ align-items: center;
423
+ justify-content: center;
424
+ }
425
+
426
+ .card-icon.folder {
427
+ background: linear-gradient(135deg, #818cf8, #6366f1);
428
+ }
429
+
430
+ .card-icon.file {
431
+ background: linear-gradient(135deg, #a78bfa, #8b5cf6);
432
+ }
433
+
434
+ .card-icon.starred {
435
+ background: linear-gradient(135deg, #fbbf24, #f59e0b);
436
+ }
437
+
438
+ .card-icon.trash {
439
+ background: linear-gradient(135deg, #94a3b8, #64748b);
440
+ }
441
+
442
+ .card-name {
443
+ font-size: 12px;
444
+ font-weight: 500;
445
+ text-align: center;
446
+ max-width: 100%;
447
+ overflow: hidden;
448
+ text-overflow: ellipsis;
449
+ white-space: nowrap;
450
+ color: var(--text-primary);
451
+ }
452
+
453
+ .card-date {
454
+ font-size: 10px;
455
+ color: var(--text-muted);
456
+ margin-top: 2px;
457
+ }
458
+
459
+ /* === Modal Overlay === */
460
+ .modal-overlay {
461
+ position: fixed;
462
+ inset: 0;
463
+ z-index: 200;
464
+ background: rgba(0, 0, 0, 0.5);
465
+ backdrop-filter: blur(4px);
466
+ display: flex;
467
+ align-items: center;
468
+ justify-content: center;
469
+ }
470
+
471
+ .modal-container {
472
+ width: 380px;
473
+ max-width: calc(100vw - 32px);
474
+ padding: 24px;
475
+ border-radius: 16px;
476
+ background: var(--bg-secondary);
477
+ border: 1px solid var(--border-color);
478
+ }
479
+
480
+ .modal-header {
481
+ display: flex;
482
+ justify-content: space-between;
483
+ align-items: center;
484
+ margin-bottom: 16px;
485
+
486
+ h3 {
487
+ font-size: 16px;
488
+ font-weight: 600;
489
+ }
490
+
491
+ button {
492
+ background: none;
493
+ border: none;
494
+ cursor: pointer;
495
+ color: var(--text-muted);
496
+ }
497
+ }
498
+
499
+ .modal-close-btn {
500
+ background: none;
501
+ border: none;
502
+ cursor: pointer;
503
+ color: var(--text-muted);
504
+ }
505
+
506
+ /* === Welcome Guide === */
507
+ .welcome-modal {
508
+ width: 380px;
509
+ max-width: calc(100vw - 32px);
510
+ padding: 28px;
511
+ border-radius: 16px;
512
+ background: #fff;
513
+ text-align: center;
514
+
515
+ h2 {
516
+ font-size: 18px;
517
+ font-weight: 600;
518
+ margin-bottom: 12px;
519
+ }
520
+
521
+ p {
522
+ font-size: 13px;
523
+ color: #64748b;
524
+ line-height: 1.6;
525
+ margin-bottom: 20px;
526
+ }
527
+ }
528
+
529
+ .welcome-steps {
530
+ display: flex;
531
+ justify-content: center;
532
+ gap: 6px;
533
+ margin-bottom: 20px;
534
+ }
535
+
536
+ .welcome-step-dot {
537
+ width: 6px;
538
+ height: 6px;
539
+ border-radius: 50%;
540
+ background: #e2e8f0;
541
+
542
+ &.active {
543
+ background: #3b82f6;
544
+ }
545
+ }
546
+
547
+ .welcome-actions {
548
+ display: flex;
549
+ gap: 10px;
550
+ justify-content: center;
551
+ }
552
+
553
+ .welcome-success-icon {
554
+ width: 48px;
555
+ height: 48px;
556
+ border-radius: 50%;
557
+ background: #dcfce7;
558
+ display: flex;
559
+ align-items: center;
560
+ justify-content: center;
561
+ margin: 0 auto 16px;
562
+ }
563
+
564
+ /* === Buttons === */
565
+ .btn {
566
+ padding: 10px 20px;
567
+ border-radius: 10px;
568
+ border: none;
569
+ cursor: pointer;
570
+ font-size: 14px;
571
+ transition: opacity 0.15s;
572
+
573
+ &.primary {
574
+ background: #3b82f6;
575
+ color: #fff;
576
+ }
577
+
578
+ &.secondary {
579
+ background: transparent;
580
+ border: 1px solid #e5e7eb;
581
+ color: #6b7280;
582
+ }
583
+
584
+ &.danger {
585
+ background: var(--danger);
586
+ color: #fff;
587
+ }
588
+
589
+ &.small {
590
+ padding: 6px 12px;
591
+ border-radius: 8px;
592
+ font-size: 12px;
593
+ }
594
+
595
+ &.full {
596
+ width: 100%;
597
+ display: flex;
598
+ align-items: center;
599
+ justify-content: center;
600
+ gap: 6px;
601
+ }
602
+
603
+ &:disabled {
604
+ opacity: 0.5;
605
+ cursor: not-allowed;
606
+ }
607
+ }
608
+
609
+ /* === Settings Modal === */
610
+ .settings-modal {
611
+ width: 420px;
612
+ max-width: calc(100vw - 32px);
613
+ padding: 28px;
614
+ border-radius: 16px;
615
+ background: var(--bg-secondary);
616
+ border: 1px solid var(--border-color);
617
+
618
+ .settings-title {
619
+ font-size: 18px;
620
+ font-weight: 600;
621
+ color: var(--text-primary);
622
+ }
623
+
624
+ .settings-label {
625
+ display: block;
626
+ font-size: 13px;
627
+ font-weight: 500;
628
+ margin-bottom: 8px;
629
+ color: var(--text-primary);
630
+ }
631
+
632
+ .settings-row {
633
+ display: flex;
634
+ gap: 8px;
635
+ align-items: center;
636
+ }
637
+
638
+ .settings-input {
639
+ flex: 1;
640
+ padding: 10px 12px;
641
+ border-radius: 8px;
642
+ border: 1.5px solid var(--border-color);
643
+ font-size: 13px;
644
+ outline: none;
645
+ background: var(--bg-tertiary);
646
+ color: var(--text-primary);
647
+ }
648
+
649
+ .settings-hint {
650
+ font-size: 11px;
651
+ color: var(--text-muted);
652
+ margin-top: 8px;
653
+ }
654
+
655
+ .settings-divider {
656
+ border-top: 1px solid var(--border-color);
657
+ padding-top: 16px;
658
+ }
659
+
660
+ .settings-about {
661
+ text-align: center;
662
+ margin-bottom: 16px;
663
+
664
+ h3 {
665
+ font-size: 16px;
666
+ font-weight: 600;
667
+ margin-bottom: 4px;
668
+ color: var(--text-primary);
669
+ }
670
+
671
+ p {
672
+ font-size: 12px;
673
+ color: var(--text-muted);
674
+ }
675
+ }
676
+ }
677
+
678
+ /* === Input Modal === */
679
+ .input-modal {
680
+ width: 360px;
681
+ max-width: calc(100vw - 32px);
682
+ padding: 24px;
683
+ border-radius: 16px;
684
+ background: var(--bg-secondary);
685
+ border: 1px solid var(--border-color);
686
+
687
+ h3 {
688
+ font-size: 16px;
689
+ font-weight: 600;
690
+ margin-bottom: 16px;
691
+ color: var(--text-primary);
692
+ }
693
+ }
694
+
695
+ .modal-input {
696
+ width: 100%;
697
+ padding: 10px 12px;
698
+ border-radius: 8px;
699
+ border: 1.5px solid var(--border-color);
700
+ font-size: 13px;
701
+ outline: none;
702
+ background: var(--bg-tertiary);
703
+ color: var(--text-primary);
704
+ margin-bottom: 16px;
705
+ }
706
+
707
+ .modal-actions {
708
+ display: flex;
709
+ gap: 8px;
710
+
711
+ .btn {
712
+ flex: 1;
713
+ padding: 10px;
714
+ border-radius: 8px;
715
+ font-size: 13px;
716
+ }
717
+ }
718
+
719
+ /* === Confirm Modal === */
720
+ .confirm-modal {
721
+ width: 360px;
722
+ max-width: calc(100vw - 32px);
723
+ padding: 24px;
724
+ border-radius: 16px;
725
+ background: var(--bg-secondary);
726
+ border: 1px solid var(--border-color);
727
+
728
+ h3 {
729
+ font-size: 16px;
730
+ font-weight: 600;
731
+ margin-bottom: 12px;
732
+ color: var(--text-primary);
733
+ }
734
+
735
+ p {
736
+ font-size: 13px;
737
+ color: var(--text-secondary);
738
+ margin-bottom: 20px;
739
+ }
740
+ }
741
+
742
+ /* === Move Modal === */
743
+ .move-modal {
744
+ width: 400px;
745
+ max-width: calc(100vw - 32px);
746
+ padding: 24px;
747
+ border-radius: 16px;
748
+ background: var(--bg-secondary);
749
+ border: 1px solid var(--border-color);
750
+
751
+ .move-breadcrumb {
752
+ display: flex;
753
+ gap: 6px;
754
+ margin-bottom: 12px;
755
+ flex-wrap: wrap;
756
+ }
757
+
758
+ .move-breadcrumb-btn {
759
+ padding: 4px 8px;
760
+ border-radius: 6px;
761
+ border: none;
762
+ background: var(--bg-tertiary);
763
+ color: var(--text-secondary);
764
+ cursor: pointer;
765
+ font-size: 12px;
766
+
767
+ &.active {
768
+ background: color-mix(in srgb, var(--accent-blue) 12%, transparent);
769
+ color: var(--accent-blue);
770
+ }
771
+ }
772
+
773
+ .move-folder-list {
774
+ max-height: 200px;
775
+ overflow: auto;
776
+ margin-bottom: 16px;
777
+ }
778
+
779
+ .move-folder-item {
780
+ width: 100%;
781
+ display: flex;
782
+ align-items: center;
783
+ gap: 8px;
784
+ padding: 8px 10px;
785
+ border-radius: 8px;
786
+ border: none;
787
+ background: transparent;
788
+ cursor: pointer;
789
+ font-size: 13px;
790
+ color: var(--text-primary);
791
+ text-align: left;
792
+
793
+ &:hover {
794
+ background: var(--bg-tertiary);
795
+ }
796
+
797
+ &.selected {
798
+ background: color-mix(in srgb, var(--accent-blue) 12%, transparent);
799
+ color: var(--accent-blue);
800
+ }
801
+ }
802
+
803
+ .move-new-folder {
804
+ display: flex;
805
+ gap: 8px;
806
+ margin-bottom: 16px;
807
+
808
+ input {
809
+ flex: 1;
810
+ padding: 8px 10px;
811
+ border-radius: 8px;
812
+ border: 1.5px solid var(--border-color);
813
+ font-size: 12px;
814
+ outline: none;
815
+ background: var(--bg-tertiary);
816
+ color: var(--text-primary);
817
+ }
818
+ }
819
+ }
820
+
821
+ /* === Share Modal === */
822
+ .share-modal {
823
+ width: 420px;
824
+ max-width: calc(100vw - 32px);
825
+ padding: 24px;
826
+ border-radius: 16px;
827
+ background: var(--bg-secondary);
828
+ border: 1px solid var(--border-color);
829
+
830
+ .share-link-box {
831
+ display: flex;
832
+ gap: 10px;
833
+ margin-bottom: 16px;
834
+ }
835
+
836
+ .share-link-text {
837
+ flex: 1;
838
+ padding: 12px 14px;
839
+ border-radius: 10px;
840
+ background: var(--bg-tertiary);
841
+ font-size: 13px;
842
+ font-family: monospace;
843
+ color: var(--text-primary);
844
+ word-break: break-all;
845
+ }
846
+
847
+ .share-copy-btn {
848
+ width: 44px;
849
+ border-radius: 10px;
850
+ border: none;
851
+ background: var(--accent-blue);
852
+ color: #fff;
853
+ cursor: pointer;
854
+
855
+ &.copied {
856
+ background: var(--success);
857
+ }
858
+ }
859
+ }
860
+
861
+ /* === Download Modal === */
862
+ .download-modal {
863
+ width: 400px;
864
+ max-width: calc(100vw - 32px);
865
+ padding: 24px;
866
+ border-radius: 16px;
867
+ background: var(--bg-secondary);
868
+ border: 1px solid var(--border-color);
869
+
870
+ .download-input {
871
+ width: 100%;
872
+ padding: 12px 14px;
873
+ border-radius: 10px;
874
+ border: 1.5px solid var(--border-color);
875
+ font-size: 13px;
876
+ font-family: monospace;
877
+ outline: none;
878
+ background: var(--bg-tertiary);
879
+ color: var(--text-primary);
880
+ margin-bottom: 16px;
881
+ }
882
+
883
+ .download-btn {
884
+ width: 100%;
885
+ padding: 12px;
886
+ border-radius: 10px;
887
+ border: none;
888
+ background: var(--info);
889
+ color: #fff;
890
+ font-size: 13px;
891
+ font-weight: 600;
892
+ cursor: pointer;
893
+
894
+ &:disabled {
895
+ background: var(--bg-tertiary);
896
+ color: var(--text-muted);
897
+ cursor: not-allowed;
898
+ }
899
+ }
900
+ }
901
+
902
+ /* === Preview === */
903
+ .preview-overlay {
904
+ position: fixed;
905
+ inset: 0;
906
+ z-index: 200;
907
+ background: rgba(0, 0, 0, 0.9);
908
+ display: flex;
909
+ align-items: center;
910
+ justify-content: center;
911
+ padding: 24px;
912
+
913
+ .preview-close {
914
+ position: absolute;
915
+ top: 20px;
916
+ right: 20px;
917
+ width: 36px;
918
+ height: 36px;
919
+ border-radius: 10px;
920
+ border: none;
921
+ background: rgba(255, 255, 255, 0.1);
922
+ cursor: pointer;
923
+ color: #fff;
924
+ }
925
+
926
+ img,
927
+ video {
928
+ max-width: 100%;
929
+ max-height: 80vh;
930
+ border-radius: 12px;
931
+ }
932
+
933
+ .preview-audio {
934
+ background: rgba(255, 255, 255, 0.05);
935
+ border-radius: 16px;
936
+ padding: 40px 48px;
937
+ display: flex;
938
+ flex-direction: column;
939
+ align-items: center;
940
+ gap: 20px;
941
+ min-width: 320px;
942
+ }
943
+
944
+ .preview-audio-icon {
945
+ width: 72px;
946
+ height: 72px;
947
+ border-radius: 50%;
948
+ background: rgba(59, 130, 246, 0.15);
949
+ display: flex;
950
+ align-items: center;
951
+ justify-content: center;
952
+ }
953
+
954
+ .preview-audio-filename {
955
+ font-size: 14px;
956
+ color: var(--text-secondary);
957
+ margin: 0;
958
+ text-align: center;
959
+ max-width: 100%;
960
+ overflow: hidden;
961
+ text-overflow: ellipsis;
962
+ white-space: nowrap;
963
+ }
964
+
965
+ .preview-audio-player {
966
+ width: 100%;
967
+ max-width: 400px;
968
+ height: 40px;
969
+ }
970
+
971
+ .preview-audio-player::-webkit-media-controls-panel {
972
+ background: var(--bg-tertiary);
973
+ }
974
+ }
975
+
976
+ /* === Batch Action Bar === */
977
+ .batch-bar {
978
+ position: fixed;
979
+ bottom: 24px;
980
+ left: 50%;
981
+ transform: translateX(-50%);
982
+ display: flex;
983
+ align-items: center;
984
+ gap: 8px;
985
+ padding: 10px 16px;
986
+ border-radius: 12px;
987
+ background: var(--bg-secondary);
988
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
989
+ border: 1px solid var(--border-color);
990
+ z-index: 100;
991
+
992
+ .batch-info {
993
+ font-size: 12px;
994
+ color: var(--text-secondary);
995
+ }
996
+
997
+ .batch-dismiss {
998
+ background: none;
999
+ border: none;
1000
+ cursor: pointer;
1001
+ color: var(--text-muted);
1002
+ padding: 4px;
1003
+ }
1004
+
1005
+ .batch-divider {
1006
+ width: 1px;
1007
+ height: 20px;
1008
+ background: var(--border-color);
1009
+ }
1010
+ }
1011
+
1012
+ /* === Transfer Panel === */
1013
+ .transfer-modal {
1014
+ width: 380px;
1015
+ max-width: calc(100vw - 32px);
1016
+ max-height: 70vh;
1017
+ padding: 24px;
1018
+ border-radius: 16px;
1019
+ background: var(--bg-secondary);
1020
+ border: 1px solid var(--border-color);
1021
+ overflow: auto;
1022
+
1023
+ .transfer-item {
1024
+ padding: 10px 0;
1025
+ border-bottom: 1px solid var(--border-color);
1026
+ }
1027
+
1028
+ .transfer-item-header {
1029
+ display: flex;
1030
+ align-items: center;
1031
+ gap: 8px;
1032
+ margin-bottom: 4px;
1033
+ }
1034
+
1035
+ .transfer-item-name {
1036
+ font-size: 12px;
1037
+ font-weight: 500;
1038
+ flex: 1;
1039
+ overflow: hidden;
1040
+ text-overflow: ellipsis;
1041
+ white-space: nowrap;
1042
+ }
1043
+
1044
+ .transfer-item-cancel {
1045
+ background: none;
1046
+ border: none;
1047
+ cursor: pointer;
1048
+ color: var(--danger);
1049
+ padding: 2px;
1050
+ }
1051
+
1052
+ .transfer-progress-row {
1053
+ display: flex;
1054
+ align-items: center;
1055
+ gap: 8px;
1056
+ }
1057
+
1058
+ .transfer-progress-bar {
1059
+ flex: 1;
1060
+ height: 4px;
1061
+ border-radius: 2px;
1062
+ background: var(--bg-tertiary);
1063
+ }
1064
+
1065
+ .transfer-progress-fill {
1066
+ height: 100%;
1067
+ border-radius: 2px;
1068
+ background: var(--accent-blue);
1069
+ transition: width 0.2s;
1070
+
1071
+ &.download {
1072
+ background: var(--info);
1073
+ }
1074
+
1075
+ &.error {
1076
+ background: var(--danger);
1077
+ }
1078
+
1079
+ &.cancelled {
1080
+ background: var(--warning);
1081
+ }
1082
+ }
1083
+
1084
+ .transfer-progress-text {
1085
+ font-size: 10px;
1086
+ color: var(--text-muted);
1087
+ min-width: 32px;
1088
+ text-align: right;
1089
+ }
1090
+ }
1091
+
1092
+ /* === Toast === */
1093
+ @keyframes toastSlideIn {
1094
+ from {
1095
+ transform: translateX(100%);
1096
+ opacity: 0;
1097
+ }
1098
+
1099
+ to {
1100
+ transform: translateX(0);
1101
+ opacity: 1;
1102
+ }
1103
+ }
1104
+
1105
+ .toast {
1106
+ position: fixed;
1107
+ right: 24px;
1108
+ z-index: 9999;
1109
+ color: #fff;
1110
+ padding: 12px 20px;
1111
+ border-radius: 12px;
1112
+ font-size: 13px;
1113
+ font-weight: 500;
1114
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
1115
+ animation: toastSlideIn 0.2s ease;
1116
+
1117
+ &.success {
1118
+ background: var(--success);
1119
+ }
1120
+
1121
+ &.error {
1122
+ background: var(--danger);
1123
+ }
1124
+
1125
+ &.warning {
1126
+ background: var(--warning);
1127
+ }
1128
+
1129
+ &.info {
1130
+ background: var(--accent-blue);
1131
+ }
1132
+ }
1133
+
1134
+ /* === Welcome Guide Path Step === */
1135
+ .welcome-path-section {
1136
+ text-align: left;
1137
+ margin-bottom: 20px;
1138
+
1139
+ .path-label {
1140
+ font-size: 12px;
1141
+ color: #9ca3af;
1142
+ margin-bottom: 4px;
1143
+ }
1144
+
1145
+ .path-value {
1146
+ font-size: 12px;
1147
+ color: #374151;
1148
+ font-family: monospace;
1149
+ background: #f3f4f6;
1150
+ padding: 8px 10px;
1151
+ border-radius: 6px;
1152
+ word-break: break-all;
1153
+ margin-bottom: 12px;
1154
+ }
1155
+
1156
+ .path-input {
1157
+ width: 100%;
1158
+ padding: 10px 12px;
1159
+ border-radius: 8px;
1160
+ border: 1.5px solid #e5e7eb;
1161
+ font-size: 13px;
1162
+ outline: none;
1163
+ box-sizing: border-box;
1164
+ }
1165
+
1166
+ .path-hint {
1167
+ font-size: 11px;
1168
+ color: #9ca3af;
1169
+ margin-top: 4px;
1170
+ }
1171
+ }
1172
+
1173
+ /* =============================================
1174
+ Responsive Design
1175
+ ============================================= */
1176
+ @media (max-width: 768px) {
1177
+
1178
+ /* Sidebar: drawer mode */
1179
+ .sidebar {
1180
+ position: fixed;
1181
+ top: 0;
1182
+ left: 0;
1183
+ bottom: 0;
1184
+ z-index: 300;
1185
+ transform: translateX(-100%);
1186
+ transition: transform 0.25s ease;
1187
+ width: 240px;
1188
+
1189
+ &.open {
1190
+ transform: translateX(0);
1191
+ }
1192
+ }
1193
+
1194
+ .sidebar-overlay {
1195
+ display: block;
1196
+ position: fixed;
1197
+ inset: 0;
1198
+ z-index: 299;
1199
+ background: rgba(0, 0, 0, 0.4);
1200
+ opacity: 0;
1201
+ visibility: hidden;
1202
+ transition: opacity 0.25s ease, visibility 0.25s ease;
1203
+
1204
+ &.visible {
1205
+ opacity: 1;
1206
+ visibility: visible;
1207
+ }
1208
+ }
1209
+
1210
+ .mobile-menu-btn {
1211
+ display: flex;
1212
+ }
1213
+
1214
+ /* Header */
1215
+ .app-header {
1216
+ padding: 12px 16px;
1217
+ gap: 8px;
1218
+
1219
+ .header-right {
1220
+ gap: 4px;
1221
+ }
1222
+ }
1223
+
1224
+ /* Upload/Download */
1225
+ .action-grid {
1226
+ grid-template-columns: 1fr;
1227
+ padding: 12px 16px;
1228
+ gap: 8px;
1229
+ }
1230
+
1231
+ .action-card {
1232
+ padding: 14px;
1233
+ }
1234
+
1235
+ /* Breadcrumb */
1236
+ .breadcrumb {
1237
+ padding: 0 16px;
1238
+ }
1239
+
1240
+ /* Content */
1241
+ .content-grid {
1242
+ padding: 12px 16px;
1243
+ }
1244
+
1245
+ .file-grid {
1246
+ grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
1247
+ gap: 10px;
1248
+ }
1249
+
1250
+ /* Card */
1251
+ .card {
1252
+ padding: 12px;
1253
+ }
1254
+
1255
+ .card-icon {
1256
+ width: 44px;
1257
+ height: 44px;
1258
+ border-radius: 10px;
1259
+ margin-bottom: 8px;
1260
+ }
1261
+
1262
+ .card-name {
1263
+ font-size: 11px;
1264
+ }
1265
+
1266
+ /* Modals: bottom sheet style */
1267
+ .modal-overlay {
1268
+ align-items: flex-end;
1269
+ padding: 0;
1270
+ }
1271
+
1272
+ .modal-container {
1273
+ width: 100%;
1274
+ max-width: 100%;
1275
+ border-radius: 16px 16px 0 0;
1276
+ max-height: 85vh;
1277
+ overflow: auto;
1278
+ }
1279
+
1280
+ .welcome-modal {
1281
+ width: 100%;
1282
+ max-width: 100%;
1283
+ border-radius: 16px 16px 0 0;
1284
+ }
1285
+
1286
+ .settings-modal {
1287
+ width: 100%;
1288
+ max-width: 100%;
1289
+ border-radius: 16px 16px 0 0;
1290
+ }
1291
+
1292
+ .input-modal {
1293
+ width: 100%;
1294
+ max-width: 100%;
1295
+ border-radius: 16px 16px 0 0;
1296
+ }
1297
+
1298
+ .confirm-modal {
1299
+ width: 100%;
1300
+ max-width: 100%;
1301
+ border-radius: 16px 16px 0 0;
1302
+ }
1303
+
1304
+ .move-modal {
1305
+ width: 100%;
1306
+ max-width: 100%;
1307
+ border-radius: 16px 16px 0 0;
1308
+ }
1309
+
1310
+ .share-modal {
1311
+ width: 100%;
1312
+ max-width: 100%;
1313
+ border-radius: 16px 16px 0 0;
1314
+ }
1315
+
1316
+ .download-modal {
1317
+ width: 100%;
1318
+ max-width: 100%;
1319
+ border-radius: 16px 16px 0 0;
1320
+ }
1321
+
1322
+ .transfer-modal {
1323
+ width: 100%;
1324
+ max-width: 100%;
1325
+ border-radius: 16px 16px 0 0;
1326
+ }
1327
+
1328
+ /* Toast */
1329
+ .toast {
1330
+ right: 12px;
1331
+ left: 12px;
1332
+ }
1333
+
1334
+ /* Batch bar */
1335
+ .batch-bar {
1336
+ left: 8px;
1337
+ right: 8px;
1338
+ transform: none;
1339
+ flex-wrap: wrap;
1340
+ justify-content: center;
1341
+ bottom: 12px;
1342
+ gap: 6px;
1343
+ }
1344
+
1345
+ /* Preview */
1346
+ .preview-overlay {
1347
+ padding: 12px;
1348
+ }
1349
+ }
1350
+
1351
+ @media (max-width: 480px) {
1352
+ .file-grid {
1353
+ grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
1354
+ gap: 8px;
1355
+ }
1356
+
1357
+ .card {
1358
+ padding: 10px;
1359
+ }
1360
+
1361
+ .card-icon {
1362
+ width: 40px;
1363
+ height: 40px;
1364
+ margin-bottom: 6px;
1365
+ }
1366
+
1367
+ .card-name {
1368
+ font-size: 10px;
1369
+ }
1370
+
1371
+ .app-header {
1372
+ padding: 10px 12px;
1373
+
1374
+ .header-title {
1375
+ font-size: 14px;
1376
+ }
1377
+
1378
+ .header-badge {
1379
+ font-size: 10px;
1380
+ padding: 2px 6px;
1381
+ }
1382
+ }
1383
+
1384
+ .action-grid {
1385
+ padding: 10px 12px;
1386
+ }
1387
+
1388
+ .content-grid {
1389
+ padding: 10px 12px;
1390
+ }
1391
+
1392
+ .breadcrumb {
1393
+ padding: 0 12px;
1394
+ font-size: 11px;
1395
+ }
1396
+
1397
+ .batch-bar {
1398
+ padding: 8px 12px;
1399
+ gap: 4px;
1400
+
1401
+ .batch-info {
1402
+ font-size: 11px;
1403
+ }
1404
+ }
1405
+ }
1406
+
1407
+ /* Preview Text Container */
1408
+ .preview-text-container {
1409
+ width: 90vw;
1410
+ max-width: 900px;
1411
+ max-height: 80vh;
1412
+ overflow: auto;
1413
+ background: var(--bg-secondary);
1414
+ border-radius: 12px;
1415
+ padding: 20px;
1416
+ display: flex;
1417
+ flex-direction: column;
1418
+ }
1419
+
1420
+ .preview-text-header {
1421
+ display: flex;
1422
+ justify-content: space-between;
1423
+ align-items: center;
1424
+ margin-bottom: 16px;
1425
+ padding-bottom: 12px;
1426
+ border-bottom: 1px solid var(--border-color);
1427
+ font-size: 13px;
1428
+ color: var(--text-secondary);
1429
+ }
1430
+
1431
+ .preview-text {
1432
+ color: #0f172a;
1433
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
1434
+ font-size: 13px;
1435
+ line-height: 1.6;
1436
+ white-space: pre-wrap;
1437
+ word-break: break-all;
1438
+ margin: 0;
1439
+ overflow: auto;
1440
+ max-height: 100%;
1441
+ }
1442
+
1443
+ .preview-text-loading {
1444
+ display: flex;
1445
+ flex-direction: column;
1446
+ align-items: center;
1447
+ justify-content: center;
1448
+ padding: 40px 20px;
1449
+ color: var(--text-secondary);
1450
+ gap: 12px;
1451
+ }
1452
+
1453
+ .preview-text-spinner {
1454
+ animation: spin 0.8s linear infinite;
1455
+ opacity: 0.6;
1456
+ }
1457
+
1458
+ .preview-text-loading-hint {
1459
+ font-size: 12px;
1460
+ opacity: 0.6;
1461
+ text-align: center;
1462
+ max-width: 300px;
1463
+ }
1464
+
1465
+ .preview-media-wrapper {
1466
+ position: relative;
1467
+ display: flex;
1468
+ align-items: center;
1469
+ justify-content: center;
1470
+ min-width: 100px;
1471
+ min-height: 100px;
1472
+ }
1473
+
1474
+ .preview-media-wrapper .preview-loading {
1475
+ position: absolute;
1476
+ inset: 0;
1477
+ display: flex;
1478
+ align-items: center;
1479
+ justify-content: center;
1480
+ z-index: 1;
1481
+ }
1482
+
1483
+ .preview-loading-spinner {
1484
+ width: 32px;
1485
+ height: 32px;
1486
+ border: 3px solid rgba(255, 255, 255, 0.2);
1487
+ border-top-color: #fff;
1488
+ border-radius: 50%;
1489
+ animation: spin 0.8s linear infinite;
1490
+ }
1491
+
1492
+ @keyframes spin {
1493
+ to { transform: rotate(360deg); }
1494
+ }
1495
+
1496
+ .preview-media-wrapper img,
1497
+ .preview-media-wrapper video {
1498
+ max-width: 100%;
1499
+ max-height: 80vh;
1500
+ border-radius: 12px;
1501
+ }
1502
+
1503
+ .preview-unsupported {
1504
+ background: var(--bg-secondary);
1505
+ border-radius: 12px;
1506
+ padding: 40px;
1507
+ text-align: center;
1508
+ color: var(--text-primary);
1509
+ }
1510
+
1511
+ .preview-unsupported p:first-of-type {
1512
+ font-size: 14px;
1513
+ font-weight: 500;
1514
+ word-break: break-all;
1515
+ }
1516
+
1517
+ [data-theme="dark"] .preview-text {
1518
+ color: #e2e8f0;
1519
+ }