testdeep123 commited on
Commit
3841702
·
verified ·
1 Parent(s): 79ef1fc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +2 -848
app.py CHANGED
@@ -19,854 +19,8 @@ TEMPLATE = """
19
  <meta charset="UTF-8">
20
  <title>HuggingFace Drive - {{ path or 'Root' }}</title>
21
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
22
- <style>
23
- * {
24
- margin: 0;
25
- padding: 0;
26
- box-sizing: border-box;
27
- }
28
-
29
- :root {
30
- --primary: #6366f1;
31
- --primary-hover: #5855eb;
32
- --primary-light: rgba(99, 102, 241, 0.1);
33
- --secondary: #64748b;
34
- --secondary-hover: #475569;
35
- --success: #10b981;
36
- --success-hover: #059669;
37
- --warning: #f59e0b;
38
- --warning-hover: #d97706;
39
- --danger: #ef4444;
40
- --danger-hover: #dc2626;
41
-
42
- --bg-primary: #0f172a;
43
- --bg-secondary: #1e293b;
44
- --bg-tertiary: #334155;
45
- --bg-card: #1e293b;
46
- --bg-overlay: rgba(15, 23, 42, 0.9);
47
-
48
- --text-primary: #f8fafc;
49
- --text-secondary: #cbd5e1;
50
- --text-muted: #94a3b8;
51
-
52
- --border: #334155;
53
- --border-light: #475569;
54
- --border-focus: var(--primary);
55
-
56
- --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.1);
57
- --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
58
- --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
59
- --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.25);
60
-
61
- --radius-sm: 0.375rem;
62
- --radius-md: 0.5rem;
63
- --radius-lg: 0.75rem;
64
- --radius-xl: 1rem;
65
-
66
- --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
67
- --transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);
68
- --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
69
- --transition-spring: 500ms cubic-bezier(0.34, 1.56, 0.64, 1);
70
- }
71
-
72
- /* Base Styles */
73
- body {
74
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
75
- background: var(--bg-primary);
76
- color: var(--text-primary);
77
- line-height: 1.6;
78
- min-height: 100vh;
79
- -webkit-font-smoothing: antialiased;
80
- -moz-osx-font-smoothing: grayscale;
81
- }
82
-
83
- /* Layout */
84
- .container {
85
- max-width: 1200px;
86
- margin: 0 auto;
87
- padding: clamp(1rem, 3vw, 1.5rem);
88
- }
89
-
90
- /* Header */
91
- .header {
92
- background: var(--bg-card);
93
- border: 1px solid var(--border);
94
- border-radius: var(--radius-xl);
95
- padding: clamp(1.5rem, 4vw, 2rem);
96
- margin-bottom: 2rem;
97
- box-shadow: var(--shadow-lg);
98
- animation: slideDown var(--transition-spring);
99
- will-change: transform;
100
- }
101
-
102
- @keyframes slideDown {
103
- from {
104
- opacity: 0;
105
- transform: translateY(-20px);
106
- }
107
- to {
108
- opacity: 1;
109
- transform: translateY(0);
110
- }
111
- }
112
-
113
- .title {
114
- font-size: clamp(1.75rem, 5vw, 2.5rem);
115
- font-weight: 800;
116
- color: var(--primary);
117
- margin-bottom: 1.5rem;
118
- display: flex;
119
- align-items: center;
120
- gap: clamp(0.5rem, 2vw, 1rem);
121
- animation: fadeIn var(--transition-slow) var(--transition-fast);
122
- }
123
-
124
- @keyframes fadeIn {
125
- from {
126
- opacity: 0;
127
- }
128
- to {
129
- opacity: 1;
130
- }
131
- }
132
-
133
- .title-icon {
134
- width: clamp(2.5rem, 6vw, 3rem);
135
- height: clamp(2.5rem, 6vw, 3rem);
136
- color: var(--primary);
137
- animation: pulse 2s ease-in-out infinite;
138
- }
139
-
140
- @keyframes pulse {
141
- 0%, 100% {
142
- transform: scale(1);
143
- }
144
- 50% {
145
- transform: scale(1.05);
146
- }
147
- }
148
-
149
- /* Breadcrumb */
150
- .breadcrumb {
151
- display: flex;
152
- align-items: center;
153
- gap: 0.5rem;
154
- margin-bottom: 2rem;
155
- flex-wrap: wrap;
156
- animation: fadeIn var(--transition-slow) calc(var(--transition-fast) * 2);
157
- }
158
-
159
- .breadcrumb-item {
160
- background: var(--bg-tertiary);
161
- color: var(--text-secondary);
162
- padding: 0.5rem 1rem;
163
- border-radius: var(--radius-md);
164
- font-size: clamp(0.75rem, 2vw, 0.875rem);
165
- cursor: pointer;
166
- transition: all var(--transition-fast);
167
- display: flex;
168
- align-items: center;
169
- gap: 0.5rem;
170
- max-width: 200px;
171
- overflow: hidden;
172
- text-overflow: ellipsis;
173
- white-space: nowrap;
174
- transform: translateZ(0);
175
- backface-visibility: hidden;
176
- }
177
-
178
- .breadcrumb-item:hover {
179
- background: var(--primary);
180
- color: white;
181
- transform: translateY(-2px) scale(1.05);
182
- box-shadow: var(--shadow-md);
183
- }
184
-
185
- .breadcrumb-item.active {
186
- background: var(--primary);
187
- color: white;
188
- animation: scaleIn var(--transition-spring);
189
- }
190
-
191
- @keyframes scaleIn {
192
- from {
193
- transform: scale(0.9);
194
- }
195
- to {
196
- transform: scale(1);
197
- }
198
- }
199
-
200
- .breadcrumb-separator {
201
- color: var(--text-muted);
202
- font-size: 1.25rem;
203
- opacity: 0.5;
204
- }
205
-
206
- /* Actions */
207
- .actions {
208
- display: grid;
209
- grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
210
- gap: 1rem;
211
- animation: fadeIn var(--transition-slow) calc(var(--transition-fast) * 3);
212
- }
213
-
214
- /* Buttons */
215
- .btn {
216
- display: inline-flex;
217
- align-items: center;
218
- justify-content: center;
219
- gap: 0.5rem;
220
- padding: 0.75rem 1.5rem;
221
- border: none;
222
- border-radius: var(--radius-md);
223
- font-weight: 600;
224
- font-size: clamp(0.8rem, 2vw, 0.875rem);
225
- cursor: pointer;
226
- transition: all var(--transition-fast);
227
- text-decoration: none;
228
- min-height: 2.75rem;
229
- position: relative;
230
- overflow: hidden;
231
- transform: translateZ(0);
232
- backface-visibility: hidden;
233
- -webkit-tap-highlight-color: transparent;
234
- }
235
-
236
- .btn::before {
237
- content: '';
238
- position: absolute;
239
- top: 50%;
240
- left: 50%;
241
- width: 0;
242
- height: 0;
243
- border-radius: 50%;
244
- background: rgba(255, 255, 255, 0.2);
245
- transform: translate(-50%, -50%);
246
- transition: width var(--transition-slow), height var(--transition-slow);
247
- }
248
-
249
- .btn:active::before {
250
- width: 300px;
251
- height: 300px;
252
- }
253
-
254
- .btn:disabled {
255
- opacity: 0.6;
256
- cursor: not-allowed;
257
- transform: none !important;
258
- }
259
-
260
- .btn-primary {
261
- background: var(--primary);
262
- color: white;
263
- box-shadow: var(--shadow-md);
264
- }
265
-
266
- .btn-primary:hover:not(:disabled) {
267
- background: var(--primary-hover);
268
- transform: translateY(-2px);
269
- box-shadow: var(--shadow-lg);
270
- }
271
-
272
- .btn-secondary {
273
- background: var(--bg-tertiary);
274
- color: var(--text-primary);
275
- border: 1px solid var(--border);
276
- }
277
-
278
- .btn-secondary:hover:not(:disabled) {
279
- background: var(--secondary);
280
- border-color: var(--border-light);
281
- transform: translateY(-1px);
282
- }
283
-
284
- .btn-success {
285
- background: var(--success);
286
- color: white;
287
- }
288
-
289
- .btn-success:hover:not(:disabled) {
290
- background: var(--success-hover);
291
- transform: translateY(-2px);
292
- }
293
-
294
- .btn-danger {
295
- background: var(--danger);
296
- color: white;
297
- }
298
-
299
- .btn-danger:hover:not(:disabled) {
300
- background: var(--danger-hover);
301
- transform: translateY(-2px);
302
- }
303
-
304
- /* File Input */
305
- .file-input-wrapper {
306
- position: relative;
307
- overflow: hidden;
308
- display: inline-block;
309
- width: 100%;
310
- }
311
-
312
- .file-input {
313
- position: absolute;
314
- left: 0;
315
- top: 0;
316
- width: 100%;
317
- height: 100%;
318
- opacity: 0;
319
- cursor: pointer;
320
- }
321
-
322
- /* File Grid */
323
- .file-grid {
324
- display: grid;
325
- grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr));
326
- gap: clamp(1rem, 2vw, 1.5rem);
327
- animation: staggerIn var(--transition-slow);
328
- }
329
-
330
- @keyframes staggerIn {
331
- from {
332
- opacity: 0;
333
- }
334
- to {
335
- opacity: 1;
336
- }
337
- }
338
-
339
- .file-item {
340
- background: var(--bg-card);
341
- border: 1px solid var(--border);
342
- border-radius: var(--radius-lg);
343
- overflow: hidden;
344
- transition: all var(--transition-base);
345
- position: relative;
346
- transform: translateZ(0);
347
- backface-visibility: hidden;
348
- animation: itemFadeIn var(--transition-slow) backwards;
349
- animation-delay: calc(var(--item-index, 0) * 50ms);
350
- }
351
-
352
- @keyframes itemFadeIn {
353
- from {
354
- opacity: 0;
355
- transform: translateY(20px);
356
- }
357
- to {
358
- opacity: 1;
359
- transform: translateY(0);
360
- }
361
- }
362
-
363
- .file-item:hover {
364
- transform: translateY(-4px);
365
- box-shadow: var(--shadow-xl);
366
- border-color: var(--primary);
367
- }
368
-
369
- .file-item-content {
370
- padding: clamp(1rem, 3vw, 1.5rem);
371
- cursor: pointer;
372
- }
373
-
374
- .file-info {
375
- display: flex;
376
- align-items: center;
377
- gap: clamp(0.75rem, 2vw, 1rem);
378
- }
379
-
380
- .file-icon {
381
- width: clamp(2.5rem, 6vw, 3rem);
382
- height: clamp(2.5rem, 6vw, 3rem);
383
- border-radius: var(--radius-md);
384
- display: flex;
385
- align-items: center;
386
- justify-content: center;
387
- flex-shrink: 0;
388
- font-size: clamp(1.25rem, 3vw, 1.5rem);
389
- transition: transform var(--transition-fast);
390
- }
391
-
392
- .file-item:hover .file-icon {
393
- transform: scale(1.1) rotate(5deg);
394
- }
395
-
396
- .file-icon.folder {
397
- background: var(--warning);
398
- color: white;
399
- }
400
-
401
- .file-icon.file {
402
- background: var(--primary-light);
403
- color: var(--primary);
404
- }
405
-
406
- .file-details {
407
- flex: 1;
408
- min-width: 0;
409
- }
410
-
411
- .file-name {
412
- font-weight: 600;
413
- color: var(--text-primary);
414
- margin-bottom: 0.25rem;
415
- word-break: break-word;
416
- font-size: clamp(0.875rem, 2vw, 1rem);
417
- }
418
-
419
- .file-meta {
420
- font-size: clamp(0.7rem, 1.5vw, 0.75rem);
421
- color: var(--text-muted);
422
- }
423
-
424
- /* Dropdown */
425
- .dropdown {
426
- position: absolute;
427
- top: 1rem;
428
- right: 1rem;
429
- }
430
-
431
- .dropdown-toggle {
432
- width: 2.5rem;
433
- height: 2.5rem;
434
- border-radius: var(--radius-md);
435
- background: var(--bg-tertiary);
436
- border: 1px solid var(--border);
437
- color: var(--text-secondary);
438
- cursor: pointer;
439
- transition: all var(--transition-fast);
440
- display: flex;
441
- align-items: center;
442
- justify-content: center;
443
- transform: translateZ(0);
444
- }
445
-
446
- .dropdown-toggle:hover {
447
- background: var(--primary);
448
- color: white;
449
- border-color: var(--primary);
450
- transform: scale(1.1);
451
- }
452
-
453
- .dropdown-menu {
454
- position: absolute;
455
- top: calc(100% + 0.5rem);
456
- right: 0;
457
- background: var(--bg-card);
458
- border: 1px solid var(--border);
459
- border-radius: var(--radius-lg);
460
- padding: 0.5rem;
461
- min-width: 180px;
462
- opacity: 0;
463
- visibility: hidden;
464
- transform: translateY(-10px) scale(0.95);
465
- transition: all var(--transition-fast);
466
- z-index: 1000;
467
- box-shadow: var(--shadow-xl);
468
- backdrop-filter: blur(10px);
469
- }
470
-
471
- .dropdown.active .dropdown-menu {
472
- opacity: 1;
473
- visibility: visible;
474
- transform: translateY(0) scale(1);
475
- }
476
-
477
- .dropdown-item {
478
- display: flex;
479
- align-items: center;
480
- gap: 0.75rem;
481
- padding: 0.75rem;
482
- border-radius: var(--radius-md);
483
- cursor: pointer;
484
- transition: all var(--transition-fast);
485
- font-size: 0.875rem;
486
- color: var(--text-secondary);
487
- width: 100%;
488
- text-align: left;
489
- border: none;
490
- background: none;
491
- position: relative;
492
- overflow: hidden;
493
- }
494
-
495
- .dropdown-item::before {
496
- content: '';
497
- position: absolute;
498
- left: 0;
499
- top: 0;
500
- width: 0;
501
- height: 100%;
502
- background: var(--bg-tertiary);
503
- transition: width var(--transition-fast);
504
- z-index: -1;
505
- }
506
-
507
- .dropdown-item:hover::before {
508
- width: 100%;
509
- }
510
-
511
- .dropdown-item:hover {
512
- color: var(--text-primary);
513
- transform: translateX(4px);
514
- }
515
-
516
- .dropdown-item.danger:hover {
517
- background: var(--danger);
518
- color: white;
519
- }
520
-
521
- .dropdown-item.danger:hover::before {
522
- background: var(--danger);
523
- }
524
-
525
- /* Modal */
526
- .modal-overlay {
527
- position: fixed;
528
- inset: 0;
529
- background: var(--bg-overlay);
530
- backdrop-filter: blur(8px);
531
- display: flex;
532
- align-items: center;
533
- justify-content: center;
534
- z-index: 2000;
535
- opacity: 0;
536
- visibility: hidden;
537
- transition: all var(--transition-base);
538
- padding: 1rem;
539
- }
540
-
541
- .modal-overlay.active {
542
- opacity: 1;
543
- visibility: visible;
544
- }
545
-
546
- .modal {
547
- background: var(--bg-card);
548
- border: 1px solid var(--border);
549
- border-radius: var(--radius-xl);
550
- padding: clamp(1.5rem, 4vw, 2rem);
551
- width: 100%;
552
- max-width: min(500px, 90vw);
553
- transform: scale(0.9) translateY(20px);
554
- transition: all var(--transition-spring);
555
- box-shadow: var(--shadow-xl);
556
- max-height: 90vh;
557
- overflow-y: auto;
558
- }
559
-
560
- .modal-overlay.active .modal {
561
- transform: scale(1) translateY(0);
562
- }
563
-
564
- .modal-title {
565
- font-size: clamp(1.25rem, 3vw, 1.5rem);
566
- font-weight: 700;
567
- margin-bottom: 1.5rem;
568
- color: var(--text-primary);
569
- animation: slideInLeft var(--transition-base) var(--transition-fast);
570
- }
571
-
572
- @keyframes slideInLeft {
573
- from {
574
- opacity: 0;
575
- transform: translateX(-20px);
576
- }
577
- to {
578
- opacity: 1;
579
- transform: translateX(0);
580
- }
581
- }
582
-
583
- .modal-body {
584
- margin-bottom: 2rem;
585
- animation: fadeIn var(--transition-base) calc(var(--transition-fast) * 2);
586
- }
587
-
588
- .modal-input, .modal-textarea {
589
- width: 100%;
590
- background: var(--bg-tertiary);
591
- border: 1px solid var(--border);
592
- border-radius: var(--radius-md);
593
- padding: clamp(0.75rem, 2vw, 1rem);
594
- color: var(--text-primary);
595
- font-size: clamp(0.875rem, 2vw, 1rem);
596
- transition: all var(--transition-fast);
597
- resize: vertical;
598
- }
599
-
600
- .modal-textarea {
601
- min-height: 120px;
602
- font-family: inherit;
603
- }
604
-
605
- .modal-input:focus, .modal-textarea:focus {
606
- outline: none;
607
- border-color: var(--border-focus);
608
- box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
609
- transform: translateY(-1px);
610
- }
611
-
612
- .modal-actions {
613
- display: flex;
614
- gap: 1rem;
615
- justify-content: flex-end;
616
- animation: slideInUp var(--transition-base) calc(var(--transition-fast) * 3);
617
- }
618
-
619
- @keyframes slideInUp {
620
- from {
621
- opacity: 0;
622
- transform: translateY(10px);
623
- }
624
- to {
625
- opacity: 1;
626
- transform: translateY(0);
627
- }
628
- }
629
-
630
- /* Upload Overlay */
631
- .upload-overlay {
632
- position: fixed;
633
- inset: 0;
634
- background: var(--bg-overlay);
635
- backdrop-filter: blur(12px);
636
- display: flex;
637
- flex-direction: column;
638
- align-items: center;
639
- justify-content: center;
640
- z-index: 9999;
641
- opacity: 0;
642
- visibility: hidden;
643
- transition: all var(--transition-base);
644
- gap: 1.5rem;
645
- }
646
-
647
- .upload-overlay.active {
648
- opacity: 1;
649
- visibility: visible;
650
- }
651
-
652
- .upload-text {
653
- font-size: clamp(1rem, 3vw, 1.25rem);
654
- font-weight: 600;
655
- color: var(--text-primary);
656
- animation: fadeInScale var(--transition-spring);
657
- }
658
-
659
- @keyframes fadeInScale {
660
- from {
661
- opacity: 0;
662
- transform: scale(0.8);
663
- }
664
- to {
665
- opacity: 1;
666
- transform: scale(1);
667
- }
668
- }
669
-
670
- /* Loading Spinner */
671
- .loading-spinner {
672
- width: 2rem;
673
- height: 2rem;
674
- border: 3px solid rgba(255, 255, 255, 0.3);
675
- border-top-color: var(--primary);
676
- border-radius: 50%;
677
- animation: spin 0.8s linear infinite;
678
- will-change: transform;
679
- }
680
-
681
- .upload-overlay .loading-spinner {
682
- width: clamp(2.5rem, 6vw, 3rem);
683
- height: clamp(2.5rem, 6vw, 3rem);
684
- border-width: 4px;
685
- animation: spinScale 0.8s linear infinite;
686
- }
687
-
688
- @keyframes spin {
689
- to { transform: rotate(360deg); }
690
- }
691
-
692
- @keyframes spinScale {
693
- 0% { transform: rotate(0deg) scale(1); }
694
- 50% { transform: rotate(180deg) scale(1.1); }
695
- 100% { transform: rotate(360deg) scale(1); }
696
- }
697
-
698
- /* Utilities */
699
- .icon {
700
- width: 1.25rem;
701
- height: 1.25rem;
702
- flex-shrink: 0;
703
- transition: transform var(--transition-fast);
704
- }
705
-
706
- .sr-only {
707
- position: absolute;
708
- width: 1px;
709
- height: 1px;
710
- padding: 0;
711
- margin: -1px;
712
- overflow: hidden;
713
- clip: rect(0, 0, 0, 0);
714
- white-space: nowrap;
715
- border: 0;
716
- }
717
-
718
- /* Empty State */
719
- .empty-state {
720
- text-align: center;
721
- padding: clamp(3rem, 8vw, 4rem) 2rem;
722
- color: var(--text-muted);
723
- animation: fadeIn var(--transition-slow);
724
- }
725
-
726
- .empty-state .icon {
727
- width: clamp(3rem, 8vw, 4rem);
728
- height: clamp(3rem, 8vw, 4rem);
729
- margin: 0 auto 1rem;
730
- opacity: 0.5;
731
- animation: float 3s ease-in-out infinite;
732
- }
733
-
734
- @keyframes float {
735
- 0%, 100% { transform: translateY(0); }
736
- 50% { transform: translateY(-10px); }
737
- }
738
-
739
- .empty-state h3 {
740
- font-size: clamp(1.25rem, 3vw, 1.5rem);
741
- margin-bottom: 0.5rem;
742
- }
743
-
744
- .empty-state p {
745
- font-size: clamp(0.875rem, 2vw, 1rem);
746
- }
747
-
748
- /* Performance optimizations */
749
- @media (prefers-reduced-motion: reduce) {
750
- *, *::before, *::after {
751
- animation-duration: 0.01ms !important;
752
- animation-iteration-count: 1 !important;
753
- transition-duration: 0.01ms !important;
754
- }
755
- }
756
-
757
- /* Responsive Design */
758
- @media (max-width: 768px) {
759
- .breadcrumb-separator {
760
- display: none;
761
- }
762
-
763
- .breadcrumb {
764
- gap: 0.25rem;
765
- }
766
-
767
- .breadcrumb-item {
768
- padding: 0.375rem 0.75rem;
769
- font-size: 0.75rem;
770
- }
771
-
772
- .file-grid {
773
- grid-template-columns: 1fr;
774
- }
775
-
776
- .modal-actions {
777
- flex-direction: column-reverse;
778
- }
779
-
780
- .modal-actions .btn {
781
- width: 100%;
782
- }
783
-
784
- .dropdown-menu {
785
- position: fixed;
786
- top: auto;
787
- bottom: 1rem;
788
- right: 1rem;
789
- left: 1rem;
790
- max-width: 400px;
791
- margin: 0 auto;
792
- }
793
- }
794
-
795
- @media (max-width: 480px) {
796
- .breadcrumb-item {
797
- max-width: 120px;
798
- }
799
-
800
- .file-item {
801
- animation: none;
802
- }
803
-
804
- .title {
805
- flex-wrap: wrap;
806
- text-align: center;
807
- justify-content: center;
808
- }
809
-
810
- .actions {
811
- gap: 0.75rem;
812
- }
813
- }
814
-
815
- /* Touch device optimizations */
816
- @media (hover: none) and (pointer: coarse) {
817
- .btn {
818
- min-height: 3rem;
819
- padding: 1rem 1.5rem;
820
- }
821
-
822
- .dropdown-toggle {
823
- width: 3rem;
824
- height: 3rem;
825
- }
826
-
827
- .file-item:active {
828
- transform: scale(0.98);
829
- }
830
-
831
- .btn:active {
832
- transform: scale(0.95);
833
- }
834
- }
835
-
836
- /* High contrast mode support */
837
- @media (prefers-contrast: high) {
838
- :root {
839
- --primary: #818cf8;
840
- --bg-primary: #000;
841
- --bg-secondary: #1a1a1a;
842
- --text-primary: #fff;
843
- --border: #666;
844
- }
845
- }
846
-
847
- /* Dark mode optimizations */
848
- @media (prefers-color-scheme: dark) {
849
- .loading-spinner {
850
- filter: brightness(1.2);
851
- }
852
- }
853
-
854
- /* Print styles */
855
- @media print {
856
- .header, .actions, .dropdown, .modal-overlay, .upload-overlay {
857
- display: none !important;
858
- }
859
-
860
- .file-grid {
861
- grid-template-columns: 1fr;
862
- gap: 0.5rem;
863
- }
864
-
865
- .file-item {
866
- border: 1px solid #000;
867
- page-break-inside: avoid;
868
- }
869
- }
870
  </style>
871
  </head>
872
  <body>
 
19
  <meta charset="UTF-8">
20
  <title>HuggingFace Drive - {{ path or 'Root' }}</title>
21
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
22
+ <style>
23
+ *{margin:0;padding:0;box-sizing:border-box}:root{--bg:#0a0a0a;--bg-secondary:#1a1a1a;--bg-tertiary:#2a2a2a;--text:#e0e0e0;--text-muted:#888;--primary:#3b82f6;--primary-hover:#2563eb;--success:#10b981;--success-hover:#059669;--danger:#ef4444;--danger-hover:#dc2626;--border:#333;--shadow:0 4px 20px rgba(0,0,0,0.3);--radius:8px}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:var(--bg);color:var(--text);line-height:1.6;overflow-x:hidden}.container{max-width:1200px;margin:0 auto;padding:1rem;min-height:100vh}.header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:2rem;padding:1rem;background:var(--bg-secondary);border-radius:var(--radius);box-shadow:var(--shadow);backdrop-filter:blur(10px);transition:all 0.3s ease}.title{display:flex;align-items:center;gap:0.5rem;font-size:1.5rem;font-weight:700;color:var(--primary);margin:0}.title-icon{width:24px;height:24px;transition:transform 0.3s ease}.title:hover .title-icon{transform:rotate(10deg) scale(1.1)}.breadcrumb{display:flex;align-items:center;flex-wrap:wrap;gap:0.5rem;font-size:0.9rem}.breadcrumb-item{display:flex;align-items:center;gap:0.25rem;padding:0.25rem 0.5rem;border-radius:4px;cursor:pointer;transition:all 0.2s ease;color:var(--text-muted)}.breadcrumb-item:hover{background:var(--bg-tertiary);color:var(--text);transform:translateY(-1px)}.breadcrumb-item.active{color:var(--primary);background:rgba(59,130,246,0.1)}.breadcrumb-separator{color:var(--text-muted);user-select:none}.actions{display:flex;flex-wrap:wrap;gap:0.5rem}.btn{display:flex;align-items:center;gap:0.5rem;padding:0.5rem 1rem;border:none;border-radius:var(--radius);font-size:0.875rem;font-weight:500;cursor:pointer;transition:all 0.2s ease;text-decoration:none;position:relative;overflow:hidden}.btn::before{content:'';position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.1),transparent);transition:left 0.5s ease;z-index:1}.btn:hover::before{left:100%}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-hover);transform:translateY(-2px);box-shadow:0 6px 20px rgba(59,130,246,0.3)}.btn-secondary{background:var(--bg-tertiary);color:var(--text);border:1px solid var(--border)}.btn-secondary:hover{background:var(--bg-secondary);border-color:var(--primary);transform:translateY(-2px)}.btn-success{background:var(--success);color:#fff}.btn-success:hover{background:var(--success-hover);transform:translateY(-2px);box-shadow:0 6px 20px rgba(16,185,129,0.3)}.btn-danger{background:var(--danger);color:#fff}.btn-danger:hover{background:var(--danger-hover);transform:translateY(-2px);box-shadow:0 6px 20px rgba(239,68,68,0.3)}.file-input-wrapper{position:relative;overflow:hidden;display:inline-block}.file-input{position:absolute;left:-9999px;opacity:0}.icon{width:16px;height:16px;flex-shrink:0}.file-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1rem;animation:fadeInUp 0.5s ease}.file-item{background:var(--bg-secondary);border-radius:var(--radius);overflow:hidden;transition:all 0.3s ease;position:relative;border:1px solid var(--border)}.file-item:hover{transform:translateY(-4px);box-shadow:var(--shadow);border-color:var(--primary)}.file-item-content{padding:1rem;cursor:pointer;display:flex;align-items:center;gap:1rem}.file-info{display:flex;align-items:center;gap:1rem;flex:1}.file-icon{width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:all 0.3s ease}.file-icon.dir{background:rgba(59,130,246,0.1);color:var(--primary)}.file-icon.file{background:rgba(16,185,129,0.1);color:var(--success)}.file-item:hover .file-icon{transform:scale(1.1)}.file-details{flex:1}.file-name{font-weight:500;margin-bottom:0.25rem;word-break:break-word}.file-meta{font-size:0.75rem;color:var(--text-muted)}.dropdown{position:relative}.dropdown-toggle{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:0.5rem;border-radius:4px;transition:all 0.2s ease}.dropdown-toggle:hover{background:var(--bg-tertiary);color:var(--text)}.dropdown-menu{position:absolute;top:100%;right:0;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);min-width:150px;z-index:1000;opacity:0;visibility:hidden;transform:translateY(-10px);transition:all 0.2s ease}.dropdown.active .dropdown-menu{opacity:1;visibility:visible;transform:translateY(0)}.dropdown-item{display:flex;align-items:center;gap:0.5rem;width:100%;padding:0.5rem 1rem;border:none;background:none;color:var(--text);font-size:0.875rem;cursor:pointer;transition:all 0.2s ease;text-align:left}.dropdown-item:hover{background:var(--bg-tertiary)}.dropdown-item.danger{color:var(--danger)}.dropdown-item.danger:hover{background:rgba(239,68,68,0.1)}.empty-state{text-align:center;padding:4rem 2rem;color:var(--text-muted)}.empty-state .icon{width:64px;height:64px;margin:0 auto 1rem;opacity:0.5}.empty-state h3{margin-bottom:0.5rem;color:var(--text)}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.8);display:flex;align-items:center;justify-content:center;z-index:2000;opacity:0;visibility:hidden;transition:all 0.3s ease;backdrop-filter:blur(4px)}.modal-overlay.active{opacity:1;visibility:visible}.modal{background:var(--bg-secondary);border-radius:var(--radius);box-shadow:var(--shadow);width:90%;max-width:400px;max-height:90vh;overflow-y:auto;transform:scale(0.9);transition:all 0.3s ease;border:1px solid var(--border)}.modal-overlay.active .modal{transform:scale(1)}.modal-title{padding:1.5rem 1.5rem 0;font-size:1.25rem;font-weight:600}.modal-body{padding:1.5rem}.modal-input{width:100%;padding:0.75rem;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-tertiary);color:var(--text);font-size:0.875rem;transition:all 0.2s ease}.modal-input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px rgba(59,130,246,0.1)}.modal-actions{padding:0 1.5rem 1.5rem;display:flex;gap:0.5rem;justify-content:flex-end}.upload-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.9);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:3000;opacity:0;visibility:hidden;transition:all 0.3s ease}.upload-overlay.active{opacity:1;visibility:visible}.loading-spinner{width:40px;height:40px;border:3px solid var(--border);border-top:3px solid var(--primary);border-radius:50%;animation:spin 1s linear infinite;margin-bottom:1rem}.upload-text{font-size:1.125rem;color:var(--text)}.btn .loading-spinner{width:16px;height:16px;border-width:2px;margin:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fadeInUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.container{padding:0.5rem}.header{flex-direction:column;align-items:stretch;gap:1rem}.title{justify-content:center}.breadcrumb{justify-content:center}.actions{justify-content:center}.file-grid{grid-template-columns:1fr;gap:0.5rem}.modal{width:95%;margin:1rem}.modal-actions{flex-direction:column}.btn{justify-content:center;padding:0.75rem 1rem}}@media (max-width:480px){.file-item-content{padding:0.75rem}.file-icon{width:32px;height:32px}.file-name{font-size:0.875rem}.actions{flex-direction:column}.btn{width:100%}}@media (prefers-reduced-motion:reduce){*{animation-duration:0.01ms!important;animation-iteration-count:1!important;transition-duration:0.01ms!important}}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:var(--bg-tertiary)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  </style>
25
  </head>
26
  <body>