vitepress-plugin-filelist 0.3.1 → 0.5.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.
@@ -18,6 +18,10 @@
18
18
  --fl-sticky: var(--fl-sticky-top, var(--fl-sticky-top-auto, 0px));
19
19
  --fl-folder-fill: #f5c451;
20
20
  --fl-folder-stroke: #d9a22b;
21
+ --fl-lock-bg: #fbf7ec;
22
+ --fl-lock-fg: #8a5a08;
23
+ --fl-error-bg: #fdf0ef;
24
+ --fl-error-fg: #b42318;
21
25
 
22
26
  --fl-k-doc-bg: #e8f0fc;
23
27
  --fl-k-doc-fg: #1f5fbf;
@@ -50,6 +54,10 @@
50
54
  .dark .fl-root {
51
55
  --fl-folder-fill: #d8a634;
52
56
  --fl-folder-stroke: #b4851c;
57
+ --fl-lock-bg: rgb(216 166 52 / 12%);
58
+ --fl-lock-fg: #e3b45a;
59
+ --fl-error-bg: rgb(240 84 96 / 12%);
60
+ --fl-error-fg: #ff9aa0;
53
61
 
54
62
  --fl-k-doc-bg: rgb(88 142 240 / 18%);
55
63
  --fl-k-doc-fg: #9cc0ff;
@@ -276,28 +284,6 @@
276
284
  opacity: 0.7;
277
285
  }
278
286
 
279
- .fl-password {
280
- display: flex;
281
- flex-wrap: wrap;
282
- gap: 8px;
283
- align-items: center;
284
- padding: 10px 12px;
285
- color: var(--vp-c-text-1);
286
- background: var(--vp-c-warning-soft, var(--vp-c-bg-soft));
287
- border-bottom: 1px solid var(--vp-c-divider);
288
- }
289
-
290
- .fl-password input {
291
- height: 32px;
292
- box-sizing: border-box;
293
- padding: 0 10px;
294
- font: inherit;
295
- color: var(--vp-c-text-1);
296
- background: var(--vp-c-bg);
297
- border: 1px solid var(--vp-c-divider);
298
- border-radius: 8px;
299
- }
300
-
301
287
  /* ---------------- table ---------------- */
302
288
 
303
289
  .fl-row {
@@ -321,6 +307,7 @@
321
307
  }
322
308
 
323
309
  .fl-head {
310
+ position: relative;
324
311
  min-height: 36px;
325
312
  font-size: 12px;
326
313
  font-weight: 600;
@@ -531,6 +518,242 @@
531
518
  transform: rotate(90deg);
532
519
  }
533
520
 
521
+ /* ---------------- refresh ---------------- */
522
+
523
+ /* indeterminate bar on the header's top edge: overlays the border, takes no space */
524
+ .fl-progress {
525
+ position: absolute;
526
+ top: -1px;
527
+ left: 0;
528
+ width: 100%;
529
+ height: 2px;
530
+ overflow: hidden;
531
+ pointer-events: none;
532
+ background: var(--vp-c-brand-soft);
533
+ }
534
+
535
+ .fl-progress::after {
536
+ position: absolute;
537
+ inset: 0 auto 0 0;
538
+ width: 40%;
539
+ content: '';
540
+ background: var(--vp-c-brand-1);
541
+ animation: fl-progress 1.1s ease-in-out infinite;
542
+ }
543
+
544
+ @keyframes fl-progress {
545
+ from { transform: translateX(-100%); }
546
+ to { transform: translateX(250%); }
547
+ }
548
+
549
+ .fl-refreshing .fl-row:not(.fl-head) {
550
+ pointer-events: none;
551
+ opacity: 0.5;
552
+ transition: opacity 0.15s;
553
+ }
554
+
555
+ .fl-spinning svg {
556
+ animation: fl-spin 0.8s linear infinite;
557
+ }
558
+
559
+ .fl-icon-btn.fl-spinning {
560
+ color: var(--vp-c-brand-1);
561
+ border-color: var(--vp-c-brand-1);
562
+ }
563
+
564
+ .fl-icon-btn:disabled {
565
+ cursor: progress;
566
+ }
567
+
568
+ @keyframes fl-spin {
569
+ to { transform: rotate(360deg); }
570
+ }
571
+
572
+ @media (prefers-reduced-motion: reduce) {
573
+ .fl-progress::after {
574
+ animation: none;
575
+ transform: none;
576
+ }
577
+
578
+ .fl-spinning svg {
579
+ animation: none;
580
+ }
581
+ }
582
+
583
+ /* ---------------- folder passwords (same-row, no layout shift) ---------------- */
584
+
585
+ .fl-row.fl-row-locked {
586
+ background: var(--fl-lock-bg);
587
+ }
588
+
589
+ .fl-row.fl-row-error {
590
+ background: var(--fl-error-bg);
591
+ }
592
+
593
+ .fl-lock {
594
+ color: var(--fl-lock-fg);
595
+ }
596
+
597
+ .fl-row-error .fl-lock {
598
+ color: var(--fl-error-fg);
599
+ }
600
+
601
+ .fl-row-locked .fl-cell-check input {
602
+ cursor: not-allowed;
603
+ }
604
+
605
+ .fl-unlock {
606
+ display: flex;
607
+ gap: 6px;
608
+ align-items: center;
609
+ min-width: 0;
610
+ }
611
+
612
+ .fl-unlock-row {
613
+ grid-column: 3 / -1;
614
+ justify-content: flex-end;
615
+ padding-left: 8px;
616
+ }
617
+
618
+ .fl-unlock input {
619
+ flex: 1 1 auto;
620
+ width: 100%;
621
+ min-width: 60px;
622
+ height: 28px;
623
+ box-sizing: border-box;
624
+ padding: 0 8px;
625
+ font: inherit;
626
+ font-size: 13px;
627
+ color: var(--vp-c-text-1);
628
+ background: var(--vp-c-bg);
629
+ border: 1px solid var(--vp-c-brand-1);
630
+ border-radius: 7px;
631
+ }
632
+
633
+ .fl-unlock input[aria-invalid='true'] {
634
+ border-color: var(--fl-error-fg);
635
+ }
636
+
637
+ /* Wide rows show the error beside the folder name, so the empty input only turns red. */
638
+ .fl-unlock input[aria-invalid='true']::placeholder {
639
+ color: transparent;
640
+ }
641
+
642
+ .fl-unlock-remember,
643
+ .fl-unlock-cancel {
644
+ display: inline-flex;
645
+ flex: none;
646
+ align-items: center;
647
+ justify-content: center;
648
+ width: 28px;
649
+ height: 28px;
650
+ padding: 0;
651
+ color: var(--vp-c-text-2);
652
+ cursor: pointer;
653
+ background: var(--vp-c-bg);
654
+ border: 1px solid var(--vp-c-divider);
655
+ border-radius: 7px;
656
+ }
657
+
658
+ .fl-unlock-cancel {
659
+ background: transparent;
660
+ border-color: transparent;
661
+ }
662
+
663
+ .fl-unlock-remember[aria-pressed='true'] {
664
+ color: var(--vp-c-brand-1);
665
+ background: var(--vp-c-brand-soft);
666
+ border-color: var(--vp-c-brand-1);
667
+ }
668
+
669
+ .fl-unlock-submit {
670
+ flex: none;
671
+ height: 28px;
672
+ padding: 0 12px;
673
+ font-size: 13px;
674
+ font-weight: 600;
675
+ color: var(--vp-button-brand-text, #fff);
676
+ white-space: nowrap;
677
+ cursor: pointer;
678
+ background: var(--vp-button-brand-bg, var(--vp-c-brand-3));
679
+ border: 0;
680
+ border-radius: 7px;
681
+ }
682
+
683
+ .fl-unlock-submit:disabled {
684
+ cursor: not-allowed;
685
+ opacity: 0.55;
686
+ }
687
+
688
+ .fl-unlock-lock {
689
+ display: none;
690
+ flex: none;
691
+ color: var(--fl-lock-fg);
692
+ }
693
+
694
+ .fl-unlock-message {
695
+ flex: 0 1 auto;
696
+ min-width: 0;
697
+ overflow: hidden;
698
+ font-size: 12px;
699
+ color: var(--fl-error-fg);
700
+ text-overflow: ellipsis;
701
+ white-space: nowrap;
702
+ }
703
+
704
+ /* single-path mode: the listed folder itself is locked; sits where "loading" would */
705
+ .fl-unlock-root {
706
+ display: flex;
707
+ flex-wrap: wrap;
708
+ gap: 8px 10px;
709
+ align-items: center;
710
+ min-height: var(--fl-row-h);
711
+ box-sizing: border-box;
712
+ padding: 10px 16px;
713
+ color: var(--vp-c-text-1);
714
+ background: var(--fl-lock-bg);
715
+ border-bottom: 1px solid var(--vp-c-divider);
716
+ }
717
+
718
+ .fl-unlock-root.fl-unlock-error {
719
+ background: var(--fl-error-bg);
720
+ }
721
+
722
+ .fl-unlock-root .fl-unlock-lock {
723
+ display: block;
724
+ }
725
+
726
+ .fl-unlock-root .fl-unlock {
727
+ flex: 1 1 260px;
728
+ max-width: 420px;
729
+ }
730
+
731
+ .fl-unlock-label {
732
+ font-size: 13px;
733
+ color: var(--fl-lock-fg);
734
+ }
735
+
736
+ .fl-remembered {
737
+ display: inline-flex;
738
+ flex: none;
739
+ gap: 3px;
740
+ align-items: center;
741
+ height: 22px;
742
+ padding: 0 7px;
743
+ font-size: 11px;
744
+ color: var(--vp-c-text-2);
745
+ white-space: nowrap;
746
+ cursor: pointer;
747
+ background: var(--vp-c-bg);
748
+ border: 1px solid var(--vp-c-divider);
749
+ border-radius: 999px;
750
+ }
751
+
752
+ .fl-remembered:hover {
753
+ color: var(--vp-c-brand-1);
754
+ border-color: var(--vp-c-brand-1);
755
+ }
756
+
534
757
  /* ---------------- states & footer ---------------- */
535
758
 
536
759
  .fl-status {
@@ -571,11 +794,11 @@
571
794
  padding: 7px 14px;
572
795
  overflow: hidden;
573
796
  font-size: 13px;
797
+ line-height: 1.5;
574
798
  color: var(--vp-c-bg);
575
- text-overflow: ellipsis;
576
- white-space: nowrap;
799
+ text-align: center;
577
800
  background: var(--vp-c-text-1);
578
- border-radius: 999px;
801
+ border-radius: 14px;
579
802
  box-shadow: 0 6px 20px rgb(0 0 0 / 18%);
580
803
  transform: translateX(-50%);
581
804
  }
@@ -797,4 +1020,319 @@
797
1020
  .fl-foot {
798
1021
  padding: 10px 12px;
799
1022
  }
1023
+
1024
+ /* same-row password: the row keeps its 56px; the name gives way to the input */
1025
+ .fl-row-prompting .fl-cell-name {
1026
+ display: none;
1027
+ }
1028
+
1029
+ .fl-unlock-row {
1030
+ grid-column: 2 / -1;
1031
+ justify-content: flex-start;
1032
+ padding-left: 4px;
1033
+ }
1034
+
1035
+ .fl-unlock-row .fl-unlock-lock {
1036
+ display: block;
1037
+ margin: 0 4px;
1038
+ }
1039
+
1040
+ .fl-unlock input {
1041
+ height: 40px;
1042
+ padding: 0 10px;
1043
+ font-size: 16px;
1044
+ border-radius: 10px;
1045
+ }
1046
+
1047
+ .fl-unlock-remember,
1048
+ .fl-unlock-cancel {
1049
+ width: 40px;
1050
+ height: 44px;
1051
+ border-color: transparent;
1052
+ background: transparent;
1053
+ }
1054
+
1055
+ .fl-unlock-remember[aria-pressed='true'] {
1056
+ background: transparent;
1057
+ border-color: transparent;
1058
+ }
1059
+
1060
+ .fl-unlock-submit {
1061
+ height: 40px;
1062
+ padding: 0 14px;
1063
+ font-size: 15px;
1064
+ border-radius: 10px;
1065
+ }
1066
+
1067
+ /* The name is hidden while prompting: the error moves into the placeholder,
1068
+ and the message stays for screen readers only. */
1069
+ .fl-row .fl-unlock-message {
1070
+ position: absolute;
1071
+ width: 1px;
1072
+ height: 1px;
1073
+ overflow: hidden;
1074
+ clip: rect(0 0 0 0);
1075
+ white-space: nowrap;
1076
+ }
1077
+
1078
+ .fl-unlock-row input[aria-invalid='true']::placeholder {
1079
+ color: var(--fl-error-fg);
1080
+ }
1081
+
1082
+ .fl-unlock-root {
1083
+ padding: 10px 12px;
1084
+ }
1085
+ }
1086
+
1087
+ /* ---------------- preview dialog ---------------- */
1088
+
1089
+ .fl-preview {
1090
+ /* themes (VitePress included) reset margin, which drops the UA centring */
1091
+ position: fixed;
1092
+ inset: 0;
1093
+ box-sizing: border-box;
1094
+ width: min(1100px, calc(100vw - 48px));
1095
+ max-width: none;
1096
+ height: min(820px, calc(100dvh - 48px));
1097
+ max-height: none;
1098
+ padding: 0;
1099
+ overflow: hidden;
1100
+ color: var(--vp-c-text-1);
1101
+ background: var(--vp-c-bg);
1102
+ border: 1px solid var(--vp-c-divider);
1103
+ margin: auto;
1104
+ border-radius: 14px;
1105
+ box-shadow: 0 24px 64px rgb(0 0 0 / 28%);
1106
+ }
1107
+
1108
+ .fl-preview::backdrop {
1109
+ background: rgb(0 0 0 / 55%);
1110
+ }
1111
+
1112
+ .fl-preview-panel {
1113
+ display: flex;
1114
+ flex-direction: column;
1115
+ height: 100%;
1116
+ }
1117
+
1118
+ .fl-preview-head {
1119
+ display: flex;
1120
+ flex: none;
1121
+ gap: 10px;
1122
+ align-items: center;
1123
+ min-height: 56px;
1124
+ box-sizing: border-box;
1125
+ padding: 8px 8px 8px 16px;
1126
+ border-bottom: 1px solid var(--vp-c-divider);
1127
+ }
1128
+
1129
+ .fl-preview .fl-type {
1130
+ width: 40px;
1131
+ height: 22px;
1132
+ font-size: 10px;
1133
+ }
1134
+
1135
+ .fl-preview-title {
1136
+ display: flex;
1137
+ flex: 1 1 auto;
1138
+ flex-direction: column;
1139
+ min-width: 0;
1140
+ }
1141
+
1142
+ .fl-preview-name {
1143
+ overflow: hidden;
1144
+ font-size: 15px;
1145
+ text-overflow: ellipsis;
1146
+ white-space: nowrap;
1147
+ }
1148
+
1149
+ .fl-preview-meta {
1150
+ font-size: 12px;
1151
+ font-variant-numeric: tabular-nums;
1152
+ color: var(--vp-c-text-2);
1153
+ }
1154
+
1155
+ .fl-preview-tools {
1156
+ display: flex;
1157
+ flex: none;
1158
+ gap: 2px;
1159
+ align-items: center;
1160
+ }
1161
+
1162
+ .fl-preview-tool {
1163
+ display: inline-flex;
1164
+ align-items: center;
1165
+ justify-content: center;
1166
+ width: 40px;
1167
+ height: 40px;
1168
+ padding: 0;
1169
+ color: var(--vp-c-text-2);
1170
+ cursor: pointer;
1171
+ background: transparent;
1172
+ border: 0;
1173
+ border-radius: 10px;
1174
+ transition: color 0.15s, background-color 0.15s;
1175
+ }
1176
+
1177
+ .fl-preview-tool:hover,
1178
+ .fl-preview-tool[aria-pressed='true'] {
1179
+ color: var(--vp-c-brand-1);
1180
+ background: var(--vp-c-default-soft);
1181
+ }
1182
+
1183
+ .fl-preview-count {
1184
+ min-width: 44px;
1185
+ font-size: 12px;
1186
+ font-variant-numeric: tabular-nums;
1187
+ color: var(--vp-c-text-2);
1188
+ text-align: center;
1189
+ }
1190
+
1191
+ .fl-preview-body {
1192
+ position: relative;
1193
+ display: flex;
1194
+ flex: 1 1 auto;
1195
+ align-items: center;
1196
+ justify-content: center;
1197
+ min-height: 0;
1198
+ overflow: auto;
1199
+ background: var(--vp-c-bg-soft);
1200
+ }
1201
+
1202
+ .fl-preview-status {
1203
+ color: var(--vp-c-text-2);
1204
+ }
1205
+
1206
+ .fl-preview-image {
1207
+ max-width: 100%;
1208
+ max-height: 100%;
1209
+ object-fit: contain;
1210
+ transition: transform 0.2s;
1211
+ }
1212
+
1213
+ .fl-preview-image.fl-preview-actual {
1214
+ max-width: none;
1215
+ max-height: none;
1216
+ margin: auto;
1217
+ }
1218
+
1219
+ .fl-preview-video {
1220
+ max-width: 100%;
1221
+ max-height: 100%;
1222
+ background: #000;
1223
+ }
1224
+
1225
+ .fl-preview-audio {
1226
+ width: min(560px, calc(100% - 32px));
1227
+ }
1228
+
1229
+ .fl-preview-text {
1230
+ align-self: stretch;
1231
+ width: 100%;
1232
+ overflow: auto;
1233
+ background: var(--vp-c-bg);
1234
+ }
1235
+
1236
+ .fl-preview-text pre {
1237
+ box-sizing: border-box;
1238
+ margin: 0;
1239
+ padding: 16px 20px;
1240
+ font-family: var(--vp-font-family-mono, ui-monospace, monospace);
1241
+ font-size: 13px;
1242
+ line-height: 1.6;
1243
+ color: var(--vp-c-text-1);
1244
+ white-space: pre-wrap;
1245
+ overflow-wrap: anywhere;
1246
+ background: transparent;
1247
+ }
1248
+
1249
+ .fl-preview-note {
1250
+ position: sticky;
1251
+ top: 0;
1252
+ margin: 0;
1253
+ padding: 8px 20px;
1254
+ font-size: 12px;
1255
+ color: var(--vp-c-text-2);
1256
+ background: var(--vp-c-bg-soft);
1257
+ border-bottom: 1px solid var(--vp-c-divider);
1258
+ }
1259
+
1260
+ .fl-preview-frame {
1261
+ align-self: stretch;
1262
+ width: 100%;
1263
+ height: 100%;
1264
+ border: 0;
1265
+ background: #fff;
1266
+ }
1267
+
1268
+ .fl-preview-info {
1269
+ display: flex;
1270
+ flex-direction: column;
1271
+ gap: 14px;
1272
+ align-items: center;
1273
+ max-width: 420px;
1274
+ padding: 32px 24px;
1275
+ text-align: center;
1276
+ }
1277
+
1278
+ .fl-preview .fl-preview-badge {
1279
+ width: 72px;
1280
+ height: 44px;
1281
+ font-size: 15px;
1282
+ border-radius: 10px;
1283
+ }
1284
+
1285
+ .fl-preview-message {
1286
+ margin: 0;
1287
+ font-size: 14px;
1288
+ line-height: 1.6;
1289
+ color: var(--vp-c-text-2);
1290
+ }
1291
+
1292
+ .fl-preview-info .fl-btn-primary {
1293
+ height: 40px;
1294
+ padding: 0 18px;
1295
+ font-size: 14px;
1296
+ border-radius: 10px;
1297
+ }
1298
+
1299
+ @media (max-width: 640px) {
1300
+ .fl-preview {
1301
+ width: 100vw;
1302
+ height: 100dvh;
1303
+ border: 0;
1304
+ border-radius: 0;
1305
+ }
1306
+
1307
+ .fl-preview-head {
1308
+ flex-wrap: wrap;
1309
+ gap: 0 8px;
1310
+ padding: 6px 4px 0 12px;
1311
+ }
1312
+
1313
+ .fl-preview-actions {
1314
+ margin-left: auto;
1315
+ }
1316
+
1317
+ /* navigation and image tools drop to a second row */
1318
+ .fl-preview-nav {
1319
+ order: 3;
1320
+ flex: 1 0 100%;
1321
+ justify-content: center;
1322
+ margin: 0 -4px 0 -12px;
1323
+ border-top: 1px solid var(--vp-c-divider);
1324
+ }
1325
+
1326
+ .fl-preview-tool {
1327
+ width: 44px;
1328
+ height: 44px;
1329
+ }
1330
+
1331
+ .fl-preview-count {
1332
+ min-width: 36px;
1333
+ }
1334
+
1335
+ .fl-preview .fl-preview-head .fl-type {
1336
+ display: none;
1337
+ }
800
1338
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vitepress-plugin-filelist",
3
- "version": "0.3.1",
3
+ "version": "0.5.0",
4
4
  "packageManager": "pnpm@11.25.0",
5
5
  "type": "module",
6
6
  "description": "OpenList file browser for VitePress: tree view, batch ZIP download, i18n, password and token support.",