vitepress-plugin-filelist 0.7.0 → 0.7.1

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.
@@ -916,8 +916,8 @@ const fileListLocales = {
916
916
  forgetPassword: "忘记",
917
917
  unlockFolder: "输入 {name} 的密码",
918
918
  networkHint: "可能被跨域拦截:请检查 OpenList 的 cors.allow_origins,或 OpenList-Worker 的 ALLOW_URLS。",
919
- deepHint: "只筛选了已加载的内容",
920
- deepSearch: "深度搜索",
919
+ deepHint: "只筛选了已加载的内容,",
920
+ deepSearch: "尝试深度搜索",
921
921
  deepRunning: "正在深度搜索 · 已查找 {count} 个文件夹",
922
922
  deepStop: "停止",
923
923
  deepDone: "已搜索全部 {count} 个文件夹",
@@ -925,6 +925,8 @@ const fileListLocales = {
925
925
  deepContinue: "继续",
926
926
  deepSkipped: "跳过 {count} 个加密文件夹",
927
927
  deepFailed: "{count} 个文件夹读取失败",
928
+ deepLocked: "未搜索(需要密码)",
929
+ clearFilter: "清除筛选",
928
930
  viewMode: "显示方式",
929
931
  viewSource: "源码",
930
932
  viewRendered: "渲染",
@@ -1010,8 +1012,8 @@ const fileListLocales = {
1010
1012
  forgetPassword: "Forget",
1011
1013
  unlockFolder: "Enter the password for {name}",
1012
1014
  networkHint: "Possibly blocked by CORS: check cors.allow_origins in OpenList, or ALLOW_URLS in OpenList-Worker.",
1013
- deepHint: "Only loaded folders are filtered",
1014
- deepSearch: "Deep search",
1015
+ deepHint: "Only loaded folders are filtered. ",
1016
+ deepSearch: "Try deep search",
1015
1017
  deepRunning: "Searching · {count} folders checked",
1016
1018
  deepStop: "Stop",
1017
1019
  deepDone: "Searched all {count} folders",
@@ -1019,6 +1021,8 @@ const fileListLocales = {
1019
1021
  deepContinue: "Continue",
1020
1022
  deepSkipped: "{count} locked folders skipped",
1021
1023
  deepFailed: "{count} folders could not be read",
1024
+ deepLocked: "Not searched (password needed)",
1025
+ clearFilter: "Clear filter",
1022
1026
  viewMode: "View",
1023
1027
  viewSource: "Source",
1024
1028
  viewRendered: "Rendered",
@@ -1567,6 +1571,14 @@ function sortTree(nodes, key, ascending, locale) {
1567
1571
  function descendantFiles(node) {
1568
1572
  return node.is_dir ? node.children.flatMap(descendantFiles) : [node];
1569
1573
  }
1574
+ /** Every loaded folder (expanded or not), e.g. what a deep search has read. */
1575
+ function loadedPathsOf(nodes, out = /* @__PURE__ */ new Set()) {
1576
+ for (const node of nodes) if (node.is_dir && node.loaded) {
1577
+ out.add(node.path);
1578
+ loadedPathsOf(node.children, out);
1579
+ }
1580
+ return out;
1581
+ }
1570
1582
  function expandedPathsOf(nodes, out = /* @__PURE__ */ new Set()) {
1571
1583
  for (const node of nodes) if (node.is_dir && node.expanded) {
1572
1584
  out.add(node.path);
@@ -1769,104 +1781,105 @@ const _hoisted_13 = { class: "fl-clear-text" };
1769
1781
  const _hoisted_14 = { class: "fl-tools" };
1770
1782
  const _hoisted_15 = { class: "fl-search" };
1771
1783
  const _hoisted_16 = ["placeholder", "aria-label"];
1772
- const _hoisted_17 = [
1784
+ const _hoisted_17 = ["aria-label", "title"];
1785
+ const _hoisted_18 = [
1773
1786
  "disabled",
1774
1787
  "aria-label",
1775
1788
  "title"
1776
1789
  ];
1777
- const _hoisted_18 = { class: "fl-row fl-head" };
1778
- const _hoisted_19 = {
1790
+ const _hoisted_19 = { class: "fl-row fl-head" };
1791
+ const _hoisted_20 = {
1779
1792
  key: 0,
1780
1793
  class: "fl-progress",
1781
1794
  "aria-hidden": "true"
1782
1795
  };
1783
- const _hoisted_20 = { class: "fl-cell fl-cell-check" };
1784
- const _hoisted_21 = [
1796
+ const _hoisted_21 = { class: "fl-cell fl-cell-check" };
1797
+ const _hoisted_22 = [
1785
1798
  "aria-label",
1786
1799
  "disabled",
1787
1800
  "checked",
1788
1801
  ".indeterminate"
1789
1802
  ];
1790
- const _hoisted_22 = ["aria-sort", "onClick"];
1791
- const _hoisted_23 = {
1803
+ const _hoisted_23 = ["aria-sort", "onClick"];
1804
+ const _hoisted_24 = {
1792
1805
  class: "fl-sort",
1793
1806
  "aria-hidden": "true"
1794
1807
  };
1795
- const _hoisted_24 = { class: "fl-cell fl-cell-op" };
1796
- const _hoisted_25 = { class: "fl-sort-select" };
1797
- const _hoisted_26 = {
1808
+ const _hoisted_25 = { class: "fl-cell fl-cell-op" };
1809
+ const _hoisted_26 = { class: "fl-sort-select" };
1810
+ const _hoisted_27 = {
1798
1811
  class: "fl-sort-current",
1799
1812
  "aria-hidden": "true"
1800
1813
  };
1801
- const _hoisted_27 = ["aria-label"];
1802
- const _hoisted_28 = ["value"];
1803
- const _hoisted_29 = {
1814
+ const _hoisted_28 = ["aria-label"];
1815
+ const _hoisted_29 = ["value"];
1816
+ const _hoisted_30 = {
1804
1817
  key: 0,
1805
1818
  class: "fl-status"
1806
1819
  };
1807
- const _hoisted_30 = ["for"];
1808
- const _hoisted_31 = ["id"];
1809
- const _hoisted_32 = { class: "fl-unlock" };
1810
- const _hoisted_33 = [
1820
+ const _hoisted_31 = ["for"];
1821
+ const _hoisted_32 = ["id"];
1822
+ const _hoisted_33 = { class: "fl-unlock" };
1823
+ const _hoisted_34 = [
1811
1824
  "id",
1812
1825
  "data-unlock",
1813
1826
  "placeholder",
1814
1827
  "aria-invalid",
1815
1828
  "aria-describedby"
1816
1829
  ];
1817
- const _hoisted_34 = [
1830
+ const _hoisted_35 = [
1818
1831
  "aria-pressed",
1819
1832
  "aria-label",
1820
1833
  "title"
1821
1834
  ];
1822
- const _hoisted_35 = ["disabled"];
1823
- const _hoisted_36 = {
1835
+ const _hoisted_36 = ["disabled"];
1836
+ const _hoisted_37 = {
1824
1837
  key: 2,
1825
1838
  class: "fl-status fl-error"
1826
1839
  };
1827
- const _hoisted_37 = {
1840
+ const _hoisted_38 = {
1828
1841
  key: 0,
1829
1842
  class: "fl-hint"
1830
1843
  };
1831
- const _hoisted_38 = {
1844
+ const _hoisted_39 = {
1832
1845
  key: 1,
1833
1846
  class: "fl-hint"
1834
1847
  };
1835
- const _hoisted_39 = {
1848
+ const _hoisted_40 = {
1836
1849
  key: 3,
1837
1850
  class: "fl-status"
1838
1851
  };
1839
- const _hoisted_40 = { class: "fl-cell fl-more-cell" };
1840
- const _hoisted_41 = { class: "fl-more-count" };
1841
- const _hoisted_42 = ["onClick"];
1842
- const _hoisted_43 = { class: "fl-more-page" };
1843
- const _hoisted_44 = ["onClick"];
1852
+ const _hoisted_41 = { class: "fl-cell fl-more-cell" };
1853
+ const _hoisted_42 = { class: "fl-more-count" };
1854
+ const _hoisted_43 = ["onClick"];
1855
+ const _hoisted_44 = { class: "fl-more-page" };
1844
1856
  const _hoisted_45 = ["onClick"];
1845
- const _hoisted_46 = { class: "fl-cell fl-cell-check" };
1846
- const _hoisted_47 = [
1857
+ const _hoisted_46 = ["onClick"];
1858
+ const _hoisted_47 = { class: "fl-cell fl-cell-check" };
1859
+ const _hoisted_48 = [
1847
1860
  "disabled",
1848
1861
  "aria-label",
1849
1862
  "checked",
1850
1863
  ".indeterminate",
1851
1864
  "onChange"
1852
1865
  ];
1853
- const _hoisted_48 = ["title"];
1854
- const _hoisted_49 = [
1866
+ const _hoisted_49 = ["title"];
1867
+ const _hoisted_50 = [
1855
1868
  "aria-label",
1856
1869
  "title",
1857
1870
  "onClick"
1858
1871
  ];
1859
- const _hoisted_50 = [
1872
+ const _hoisted_51 = [
1860
1873
  "aria-label",
1861
1874
  "aria-expanded",
1862
1875
  "onClick"
1863
1876
  ];
1864
- const _hoisted_51 = {
1877
+ const _hoisted_52 = {
1865
1878
  key: 2,
1866
1879
  class: "fl-arrow-placeholder",
1867
1880
  "aria-hidden": "true"
1868
1881
  };
1869
- const _hoisted_52 = {
1882
+ const _hoisted_53 = {
1870
1883
  key: 3,
1871
1884
  class: "fl-folder-icon",
1872
1885
  viewBox: "0 0 24 24",
@@ -1874,31 +1887,39 @@ const _hoisted_52 = {
1874
1887
  height: "18",
1875
1888
  "aria-hidden": "true"
1876
1889
  };
1877
- const _hoisted_53 = ["data-kind"];
1878
- const _hoisted_54 = { class: "fl-label" };
1879
- const _hoisted_55 = ["onClick"];
1880
- const _hoisted_56 = {
1890
+ const _hoisted_54 = ["data-kind"];
1891
+ const _hoisted_55 = { class: "fl-label" };
1892
+ const _hoisted_56 = ["onClick"];
1893
+ const _hoisted_57 = {
1881
1894
  key: 0,
1882
1895
  class: "fl-hit"
1883
1896
  };
1884
- const _hoisted_57 = { class: "fl-meta" };
1885
- const _hoisted_58 = {
1897
+ const _hoisted_58 = { class: "fl-meta" };
1898
+ const _hoisted_59 = {
1899
+ key: 2,
1900
+ class: "fl-locked-note"
1901
+ };
1902
+ const _hoisted_60 = {
1886
1903
  key: 5,
1904
+ class: "fl-locked-note fl-locked-hint"
1905
+ };
1906
+ const _hoisted_61 = {
1907
+ key: 6,
1887
1908
  class: "fl-count"
1888
1909
  };
1889
- const _hoisted_59 = ["id"];
1890
- const _hoisted_60 = [
1910
+ const _hoisted_62 = ["id"];
1911
+ const _hoisted_63 = [
1891
1912
  "aria-label",
1892
1913
  "title",
1893
1914
  "onClick"
1894
1915
  ];
1895
- const _hoisted_61 = {
1896
- key: 8,
1916
+ const _hoisted_64 = {
1917
+ key: 9,
1897
1918
  class: "fl-loading",
1898
1919
  "aria-hidden": "true"
1899
1920
  };
1900
- const _hoisted_62 = ["onSubmit", "onKeydown"];
1901
- const _hoisted_63 = [
1921
+ const _hoisted_65 = ["onSubmit", "onKeydown"];
1922
+ const _hoisted_66 = [
1902
1923
  "onUpdate:modelValue",
1903
1924
  "data-unlock",
1904
1925
  "placeholder",
@@ -1906,48 +1927,50 @@ const _hoisted_63 = [
1906
1927
  "aria-invalid",
1907
1928
  "aria-describedby"
1908
1929
  ];
1909
- const _hoisted_64 = [
1930
+ const _hoisted_67 = [
1910
1931
  "aria-pressed",
1911
1932
  "aria-label",
1912
1933
  "title",
1913
1934
  "onClick"
1914
1935
  ];
1915
- const _hoisted_65 = ["disabled"];
1916
- const _hoisted_66 = [
1936
+ const _hoisted_68 = ["disabled"];
1937
+ const _hoisted_69 = [
1917
1938
  "aria-label",
1918
1939
  "title",
1919
1940
  "onClick"
1920
1941
  ];
1921
- const _hoisted_67 = { class: "fl-cell fl-cell-size" };
1922
- const _hoisted_68 = { class: "fl-cell fl-cell-date" };
1923
- const _hoisted_69 = { class: "fl-cell fl-cell-op" };
1924
- const _hoisted_70 = ["aria-label", "onClick"];
1925
- const _hoisted_71 = [
1942
+ const _hoisted_70 = { class: "fl-cell fl-cell-size" };
1943
+ const _hoisted_71 = { class: "fl-cell fl-cell-date" };
1944
+ const _hoisted_72 = { class: "fl-cell fl-cell-op" };
1945
+ const _hoisted_73 = ["aria-label", "onClick"];
1946
+ const _hoisted_74 = [
1926
1947
  "aria-label",
1927
1948
  "aria-expanded",
1928
1949
  "onClick"
1929
1950
  ];
1930
- const _hoisted_72 = [
1951
+ const _hoisted_75 = [
1931
1952
  "aria-label",
1932
1953
  "title",
1933
1954
  "onClick"
1934
1955
  ];
1935
- const _hoisted_73 = [
1956
+ const _hoisted_76 = [
1936
1957
  "aria-label",
1937
1958
  "title",
1938
1959
  "onClick"
1939
1960
  ];
1940
- const _hoisted_74 = {
1961
+ const _hoisted_77 = {
1941
1962
  key: 4,
1942
- class: "fl-row fl-deep",
1963
+ class: "fl-deep",
1943
1964
  role: "status"
1944
1965
  };
1945
- const _hoisted_75 = { class: "fl-cell fl-more-cell" };
1946
- const _hoisted_76 = { class: "fl-more-count" };
1947
- const _hoisted_77 = { class: "fl-more-count" };
1948
- const _hoisted_78 = { class: "fl-more-count" };
1949
- const _hoisted_79 = { class: "fl-foot" };
1950
- const _hoisted_80 = {
1966
+ const _hoisted_78 = { class: "fl-deep-text" };
1967
+ const _hoisted_79 = {
1968
+ key: 0,
1969
+ class: "fl-deep-bar",
1970
+ "aria-hidden": "true"
1971
+ };
1972
+ const _hoisted_80 = { class: "fl-foot" };
1973
+ const _hoisted_81 = {
1951
1974
  key: 5,
1952
1975
  class: "fl-toast",
1953
1976
  role: "status"
@@ -1973,6 +1996,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
1973
1996
  },
1974
1997
  pageSize: { default: 200 },
1975
1998
  deepSearchLimit: { default: 500 },
1999
+ deepSearch: { default: "manual" },
1976
2000
  zipWarnSize: {},
1977
2001
  zipMaxSize: {},
1978
2002
  locale: { default: "zh-CN" },
@@ -2205,6 +2229,21 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2205
2229
  zipPath: [item.is_dir ? name : item.name || sourceName(path)]
2206
2230
  };
2207
2231
  }
2232
+ /** Run at most `size` tasks at once. */
2233
+ function concurrency(size) {
2234
+ let active = 0;
2235
+ const waiting = [];
2236
+ return async (task) => {
2237
+ if (active >= size) await new Promise((resolve) => waiting.push(resolve));
2238
+ active += 1;
2239
+ try {
2240
+ return await task();
2241
+ } finally {
2242
+ active -= 1;
2243
+ waiting.shift()?.();
2244
+ }
2245
+ };
2246
+ }
2208
2247
  class RootLockedError extends Error {
2209
2248
  rememberedAt;
2210
2249
  constructor(rememberedAt) {
@@ -2216,7 +2255,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2216
2255
  * Build a fresh tree. `expandedPaths` re-opens those folders (refresh keeps
2217
2256
  * what was open); without it the configured `expanded` defaults apply.
2218
2257
  */
2219
- async function buildTree(expandedPaths) {
2258
+ async function buildTree(expandedPaths, loadedPaths) {
2220
2259
  let nodes;
2221
2260
  if (props.sources.length) nodes = await Promise.all(props.sources.map((source) => loadSourceRoot(source, expandedPaths ? expandedPaths.has(source.path) : source.expanded ?? props.expanded)));
2222
2261
  else {
@@ -2227,13 +2266,16 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2227
2266
  throw isPasswordError(error) ? new RootLockedError(rememberedAt) : error;
2228
2267
  }
2229
2268
  }
2269
+ const limit = concurrency(4);
2230
2270
  const open = async (list) => {
2231
- for (const node of list) {
2232
- const wanted = node.expanded || expandedPaths?.has(node.path);
2233
- if (!node.is_dir || node.lock || !wanted) continue;
2234
- node.expanded = await loadChildren(node, "show");
2235
- if (node.expanded && expandedPaths) await open(node.children);
2236
- }
2271
+ await Promise.all(list.map(async (node) => {
2272
+ const wanted = !!(node.expanded || expandedPaths?.has(node.path));
2273
+ const keep = !!loadedPaths?.has(node.path);
2274
+ if (!node.is_dir || node.lock || !(wanted || keep)) return;
2275
+ const ok = await limit(() => loadChildren(node, wanted ? "show" : false, !wanted));
2276
+ node.expanded = wanted && ok;
2277
+ if (ok && (expandedPaths || loadedPaths)) await open(node.children);
2278
+ }));
2237
2279
  };
2238
2280
  await open(nodes);
2239
2281
  return nodes;
@@ -2277,7 +2319,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2277
2319
  const seq = ++refreshSeq;
2278
2320
  refreshing.value = true;
2279
2321
  try {
2280
- const fresh = await buildTree(expandedPathsOf(roots.value));
2322
+ const fresh = await buildTree(expandedPathsOf(roots.value), deepMode.value ? loadedPathsOf(roots.value) : void 0);
2281
2323
  if (seq !== refreshSeq) return;
2282
2324
  roots.value = fresh;
2283
2325
  const existing = new Set(fresh.flatMap(descendantFiles).map((file) => file.path));
@@ -2350,7 +2392,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2350
2392
  const rows = computed(() => {
2351
2393
  const out = [];
2352
2394
  const query = keyword.value.trim().toLowerCase();
2353
- const matches = (node) => !query || node.name.toLowerCase().includes(query) || node.is_dir && node.children.some(matches);
2395
+ const matches = (node) => !query || node.name.toLowerCase().includes(query) || node.is_dir && (node.children.some(matches) || deepMode.value && !!node.lock);
2354
2396
  const walk = (nodes, key, depth) => {
2355
2397
  const list = nodes.filter(matches);
2356
2398
  const limit = query ? list.length : Math.min(list.length, limitOf(key));
@@ -2404,11 +2446,16 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2404
2446
  const deep = reactive({
2405
2447
  running: false,
2406
2448
  searched: 0,
2407
- skipped: 0,
2408
2449
  failed: 0,
2409
2450
  capped: false,
2410
2451
  done: false
2411
2452
  });
2453
+ /**
2454
+ * Deep search mode: entered by “Try deep search” (or at once with
2455
+ * `deep-search="auto"`), left by clearing the filter. While on, new keywords,
2456
+ * refreshes and newly unlocked folders are searched without asking again.
2457
+ */
2458
+ const deepMode = ref(false);
2412
2459
  let deepSeq = 0;
2413
2460
  /** Folders that are known but not loaded yet (locked ones excluded). */
2414
2461
  function unloadedFolders() {
@@ -2428,19 +2475,19 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2428
2475
  if (!keyword.value.trim()) return null;
2429
2476
  if (deep.running) return "running";
2430
2477
  if (deep.capped) return "capped";
2431
- if (hasUnloaded.value) return "idle";
2478
+ if (!deepMode.value) return hasUnloaded.value ? "idle" : null;
2432
2479
  return deep.done ? "done" : null;
2433
2480
  });
2481
+ /** “Try deep search”, “Continue”, and the automatic runs of deep search mode. */
2434
2482
  async function deepSearch() {
2483
+ deepMode.value = true;
2435
2484
  const seq = ++deepSeq;
2436
2485
  const limit = Math.max(1, Math.floor(props.deepSearchLimit ?? 500));
2437
2486
  const runStart = deep.searched;
2438
2487
  Object.assign(deep, {
2439
2488
  running: true,
2440
2489
  capped: false,
2441
- done: false,
2442
- skipped: 0,
2443
- failed: 0
2490
+ done: false
2444
2491
  });
2445
2492
  let wave = unloadedFolders();
2446
2493
  while (wave.length && seq === deepSeq) {
@@ -2451,8 +2498,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2451
2498
  if (deep.searched - runStart >= limit) return;
2452
2499
  deep.searched += 1;
2453
2500
  if (!await loadChildren(node, false, true)) {
2454
- if (node.lock) deep.skipped += 1;
2455
- else deep.failed += 1;
2501
+ if (!node.lock) deep.failed += 1;
2456
2502
  continue;
2457
2503
  }
2458
2504
  for (const child of node.children) if (child.is_dir && !child.loaded && !child.lock) next.push(child);
@@ -2467,24 +2513,68 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2467
2513
  deep.capped = hasUnloaded.value && deep.searched - runStart >= limit;
2468
2514
  deep.done = !deep.capped;
2469
2515
  }
2516
+ /** Pause a run (internal: refresh, reload). */
2470
2517
  function stopDeepSearch() {
2471
2518
  deepSeq += 1;
2472
2519
  deep.running = false;
2473
2520
  }
2521
+ /** The user's Stop: keep the mode, offer “Continue”, do not restart by itself. */
2522
+ function pauseDeepSearch() {
2523
+ const wasRunning = deep.running;
2524
+ stopDeepSearch();
2525
+ if (wasRunning && hasUnloaded.value) deep.capped = true;
2526
+ }
2527
+ function clearFilter() {
2528
+ keyword.value = "";
2529
+ }
2474
2530
  watch(keyword, (value) => {
2475
- if (value.trim()) return;
2531
+ if (value.trim()) {
2532
+ if (props.deepSearch === "auto") deepMode.value = true;
2533
+ return;
2534
+ }
2476
2535
  stopDeepSearch();
2536
+ deepMode.value = false;
2477
2537
  Object.assign(deep, {
2478
2538
  searched: 0,
2479
- skipped: 0,
2480
2539
  failed: 0,
2481
2540
  capped: false,
2482
2541
  done: false
2483
2542
  });
2484
2543
  });
2544
+ watch(() => deepMode.value && hasUnloaded.value && !deep.running && !deep.capped && !refreshing.value, (ready) => {
2545
+ if (ready) deepSearch();
2546
+ });
2547
+ /**
2548
+ * Counted from the tree, so a refresh that re-reads the same folders shows the
2549
+ * same numbers: folders read (or found locked), and the locked ones.
2550
+ */
2551
+ const folderCounts = computed(() => {
2552
+ const counts = {
2553
+ checked: 0,
2554
+ locked: 0
2555
+ };
2556
+ const walk = (nodes) => {
2557
+ for (const node of nodes) {
2558
+ if (!node.is_dir) continue;
2559
+ if (node.lock) {
2560
+ counts.checked += 1;
2561
+ counts.locked += 1;
2562
+ } else if (node.loaded) {
2563
+ counts.checked += 1;
2564
+ walk(node.children);
2565
+ }
2566
+ }
2567
+ };
2568
+ walk(roots.value);
2569
+ return counts;
2570
+ });
2571
+ const lockedFolders = computed(() => folderCounts.value.locked);
2572
+ function lockedInSearch(node) {
2573
+ return deepMode.value && !!node.lock && !!keyword.value.trim();
2574
+ }
2485
2575
  const deepSummary = computed(() => [
2486
- deepRow.value === "capped" ? t("deepCapped", { count: deep.searched }) : t("deepDone", { count: deep.searched }),
2487
- deep.skipped ? t("deepSkipped", { count: deep.skipped }) : "",
2576
+ t(deepRow.value === "capped" ? "deepCapped" : "deepDone", { count: folderCounts.value.checked }),
2577
+ lockedFolders.value ? t("deepSkipped", { count: lockedFolders.value }) : "",
2488
2578
  deep.failed ? t("deepFailed", { count: deep.failed }) : ""
2489
2579
  ].filter(Boolean).join(" · "));
2490
2580
  const stats = computed(() => folderStats(roots.value, selected.value));
@@ -2812,15 +2902,30 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2812
2902
  name: "close",
2813
2903
  size: 18
2814
2904
  }), createElementVNode("span", _hoisted_13, toDisplayString(t("clear")), 1)], 8, _hoisted_12)) : createCommentVNode("v-if", true),
2815
- createElementVNode("div", _hoisted_14, [createElementVNode("label", _hoisted_15, [createVNode(_sfc_main$2, {
2816
- name: "search",
2817
- size: 15
2818
- }), withDirectives(createElementVNode("input", {
2819
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => keyword.value = $event),
2820
- type: "text",
2821
- placeholder: t("filter"),
2822
- "aria-label": t("filter")
2823
- }, null, 8, _hoisted_16), [[vModelText, keyword.value]])]), createElementVNode("button", {
2905
+ createElementVNode("div", _hoisted_14, [createElementVNode("label", _hoisted_15, [
2906
+ createVNode(_sfc_main$2, {
2907
+ name: "search",
2908
+ size: 15
2909
+ }),
2910
+ withDirectives(createElementVNode("input", {
2911
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => keyword.value = $event),
2912
+ type: "text",
2913
+ placeholder: t("filter"),
2914
+ "aria-label": t("filter"),
2915
+ onKeydown: _cache[1] || (_cache[1] = withKeys(($event) => keyword.value && ($event.preventDefault(), clearFilter()), ["esc"]))
2916
+ }, null, 40, _hoisted_16), [[vModelText, keyword.value]]),
2917
+ keyword.value ? (openBlock(), createElementBlock("button", {
2918
+ key: 0,
2919
+ class: "fl-search-clear",
2920
+ type: "button",
2921
+ "aria-label": t("clearFilter"),
2922
+ title: t("clearFilter"),
2923
+ onClick: clearFilter
2924
+ }, [createVNode(_sfc_main$2, {
2925
+ name: "close",
2926
+ size: 12
2927
+ })], 8, _hoisted_17)) : createCommentVNode("v-if", true)
2928
+ ]), createElementVNode("button", {
2824
2929
  class: normalizeClass(["fl-icon-btn fl-refresh", { "fl-spinning": refreshing.value }]),
2825
2930
  type: "button",
2826
2931
  disabled: refreshing.value || loadingRoot.value,
@@ -2830,7 +2935,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2830
2935
  }, [createVNode(_sfc_main$2, {
2831
2936
  name: "refresh",
2832
2937
  size: 15
2833
- })], 10, _hoisted_17)]),
2938
+ })], 10, _hoisted_18)]),
2834
2939
  batchBusy.value ? (openBlock(), createElementBlock("button", {
2835
2940
  key: 4,
2836
2941
  class: "fl-btn fl-zip-cancel",
@@ -2846,16 +2951,16 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2846
2951
  size: 15
2847
2952
  }), createTextVNode(" " + toDisplayString(t("batch")), 1)])) : createCommentVNode("v-if", true)
2848
2953
  ]),
2849
- createElementVNode("div", _hoisted_18, [
2850
- refreshing.value ? (openBlock(), createElementBlock("span", _hoisted_19)) : createCommentVNode("v-if", true),
2851
- createElementVNode("label", _hoisted_20, [createElementVNode("input", {
2954
+ createElementVNode("div", _hoisted_19, [
2955
+ refreshing.value ? (openBlock(), createElementBlock("span", _hoisted_20)) : createCommentVNode("v-if", true),
2956
+ createElementVNode("label", _hoisted_21, [createElementVNode("input", {
2852
2957
  type: "checkbox",
2853
2958
  "aria-label": t("selectAll"),
2854
2959
  disabled: batchBusy.value,
2855
2960
  checked: allChecked.value,
2856
2961
  ".indeterminate": someChecked.value,
2857
2962
  onChange: toggleCheckAll
2858
- }, null, 40, _hoisted_21)]),
2963
+ }, null, 40, _hoisted_22)]),
2859
2964
  (openBlock(), createElementBlock(Fragment, null, renderList([
2860
2965
  "name",
2861
2966
  "size",
@@ -2869,23 +2974,23 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2869
2974
  type: "button",
2870
2975
  "aria-sort": sortKey.value === column ? sortAsc.value ? "ascending" : "descending" : void 0,
2871
2976
  onClick: ($event) => setSort(column)
2872
- }, [createTextVNode(toDisplayString(t(column === "name" ? "columnName" : column === "size" ? "columnSize" : "columnDate")), 1), createElementVNode("span", _hoisted_23, toDisplayString(sortKey.value === column ? sortAsc.value ? "▲" : "▼" : ""), 1)], 8, _hoisted_22)], 2);
2977
+ }, [createTextVNode(toDisplayString(t(column === "name" ? "columnName" : column === "size" ? "columnSize" : "columnDate")), 1), createElementVNode("span", _hoisted_24, toDisplayString(sortKey.value === column ? sortAsc.value ? "▲" : "▼" : ""), 1)], 8, _hoisted_23)], 2);
2873
2978
  }), 64)),
2874
- createElementVNode("span", _hoisted_24, [createElementVNode("label", _hoisted_25, [
2979
+ createElementVNode("span", _hoisted_25, [createElementVNode("label", _hoisted_26, [
2875
2980
  createElementVNode("span", null, toDisplayString(t("sortBy")), 1),
2876
- createElementVNode("span", _hoisted_26, toDisplayString(sortOptions.value.find((option) => option.value === sortValue.value)?.label), 1),
2981
+ createElementVNode("span", _hoisted_27, toDisplayString(sortOptions.value.find((option) => option.value === sortValue.value)?.label), 1),
2877
2982
  withDirectives(createElementVNode("select", {
2878
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => sortValue.value = $event),
2983
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => sortValue.value = $event),
2879
2984
  "aria-label": t("sortBy")
2880
2985
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(sortOptions.value, (option) => {
2881
2986
  return openBlock(), createElementBlock("option", {
2882
2987
  key: option.value,
2883
2988
  value: option.value
2884
- }, toDisplayString(option.label), 9, _hoisted_28);
2885
- }), 128))], 8, _hoisted_27), [[vModelSelect, sortValue.value]])
2989
+ }, toDisplayString(option.label), 9, _hoisted_29);
2990
+ }), 128))], 8, _hoisted_28), [[vModelSelect, sortValue.value]])
2886
2991
  ])])
2887
2992
  ]),
2888
- loadingRoot.value ? (openBlock(), createElementBlock("div", _hoisted_29, toDisplayString(t("loading")), 1)) : rootLock.value ? (openBlock(), createElementBlock("form", {
2993
+ loadingRoot.value ? (openBlock(), createElementBlock("div", _hoisted_30, toDisplayString(t("loading")), 1)) : rootLock.value ? (openBlock(), createElementBlock("form", {
2889
2994
  key: 1,
2890
2995
  class: normalizeClass(["fl-unlock-root", { "fl-unlock-error": rootLock.value.error }]),
2891
2996
  onSubmit: withModifiers(submitRootUnlock, ["prevent"])
@@ -2897,24 +3002,24 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2897
3002
  createElementVNode("label", {
2898
3003
  class: "fl-unlock-label",
2899
3004
  for: `${unref(uid)}-root`
2900
- }, toDisplayString(t("passwordPrompt")), 9, _hoisted_30),
3005
+ }, toDisplayString(t("passwordPrompt")), 9, _hoisted_31),
2901
3006
  rootLock.value.error ? (openBlock(), createElementBlock("span", {
2902
3007
  key: 0,
2903
3008
  id: `${unref(uid)}-root-error`,
2904
3009
  class: "fl-unlock-message",
2905
3010
  role: "alert"
2906
- }, toDisplayString(unlockErrorText(rootLock.value.error)), 9, _hoisted_31)) : createCommentVNode("v-if", true),
2907
- createElementVNode("span", _hoisted_32, [
3011
+ }, toDisplayString(unlockErrorText(rootLock.value.error)), 9, _hoisted_32)) : createCommentVNode("v-if", true),
3012
+ createElementVNode("span", _hoisted_33, [
2908
3013
  withDirectives(createElementVNode("input", {
2909
3014
  id: `${unref(uid)}-root`,
2910
- "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => rootLock.value.input = $event),
3015
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => rootLock.value.input = $event),
2911
3016
  type: "password",
2912
3017
  autocomplete: "off",
2913
3018
  "data-unlock": __props.path,
2914
3019
  placeholder: t("passwordPlaceholder"),
2915
3020
  "aria-invalid": !!rootLock.value.error,
2916
3021
  "aria-describedby": rootLock.value.error ? `${unref(uid)}-root-error` : void 0
2917
- }, null, 8, _hoisted_33), [[vModelText, rootLock.value.input]]),
3022
+ }, null, 8, _hoisted_34), [[vModelText, rootLock.value.input]]),
2918
3023
  canRemember.value ? (openBlock(), createElementBlock("button", {
2919
3024
  key: 0,
2920
3025
  class: "fl-unlock-remember",
@@ -2922,49 +3027,49 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2922
3027
  "aria-pressed": rootLock.value.remember,
2923
3028
  "aria-label": t("rememberPassword"),
2924
3029
  title: t("rememberPassword"),
2925
- onClick: _cache[3] || (_cache[3] = ($event) => rootLock.value.remember = !rootLock.value.remember)
2926
- }, [createVNode(_sfc_main$2, { name: "key" })], 8, _hoisted_34)) : createCommentVNode("v-if", true),
3030
+ onClick: _cache[4] || (_cache[4] = ($event) => rootLock.value.remember = !rootLock.value.remember)
3031
+ }, [createVNode(_sfc_main$2, { name: "key" })], 8, _hoisted_35)) : createCommentVNode("v-if", true),
2927
3032
  createElementVNode("button", {
2928
3033
  class: "fl-unlock-submit",
2929
3034
  type: "submit",
2930
3035
  disabled: rootLock.value.busy || !rootLock.value.input
2931
- }, toDisplayString(t("open")), 9, _hoisted_35)
3036
+ }, toDisplayString(t("open")), 9, _hoisted_36)
2932
3037
  ])
2933
- ], 34)) : errorMsg.value ? (openBlock(), createElementBlock("div", _hoisted_36, [
3038
+ ], 34)) : errorMsg.value ? (openBlock(), createElementBlock("div", _hoisted_37, [
2934
3039
  createTextVNode(toDisplayString(t("loadFailed", { message: errorMsg.value })) + " ", 1),
2935
- /guest/i.test(errorMsg.value) ? (openBlock(), createElementBlock("p", _hoisted_37, toDisplayString(t("guestHint")), 1)) : createCommentVNode("v-if", true),
2936
- unref(isNetworkError)(errorMsg.value) ? (openBlock(), createElementBlock("p", _hoisted_38, toDisplayString(t("corsHint")), 1)) : createCommentVNode("v-if", true),
3040
+ /guest/i.test(errorMsg.value) ? (openBlock(), createElementBlock("p", _hoisted_38, toDisplayString(t("guestHint")), 1)) : createCommentVNode("v-if", true),
3041
+ unref(isNetworkError)(errorMsg.value) ? (openBlock(), createElementBlock("p", _hoisted_39, toDisplayString(t("corsHint")), 1)) : createCommentVNode("v-if", true),
2937
3042
  createElementVNode("button", {
2938
3043
  class: "fl-btn",
2939
3044
  type: "button",
2940
3045
  onClick: loadRoot
2941
3046
  }, toDisplayString(t("retry")), 1)
2942
- ])) : visible.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_39, toDisplayString(t("empty")), 1)) : createCommentVNode("v-if", true),
3047
+ ])) : visible.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_40, toDisplayString(t("empty")), 1)) : createCommentVNode("v-if", true),
2943
3048
  (openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (node, index) => {
2944
3049
  return openBlock(), createElementBlock(Fragment, { key: isMore(node) ? `more:${node.key}` : node.path }, [isMore(node) ? (openBlock(), createElementBlock("div", {
2945
3050
  key: 0,
2946
3051
  class: "fl-row fl-more",
2947
3052
  style: normalizeStyle({ "--fl-depth": node.depth })
2948
- }, [_cache[9] || (_cache[9] = createElementVNode("span", { class: "fl-cell fl-cell-check" }, null, -1)), createElementVNode("span", _hoisted_40, [
2949
- _cache[8] || (_cache[8] = createElementVNode("span", {
3053
+ }, [_cache[10] || (_cache[10] = createElementVNode("span", { class: "fl-cell fl-cell-check" }, null, -1)), createElementVNode("span", _hoisted_41, [
3054
+ _cache[9] || (_cache[9] = createElementVNode("span", {
2950
3055
  class: "fl-indent",
2951
3056
  "aria-hidden": "true"
2952
3057
  }, null, -1)),
2953
- createElementVNode("span", _hoisted_41, toDisplayString(t("moreRemaining", { count: node.remaining })), 1),
3058
+ createElementVNode("span", _hoisted_42, toDisplayString(t("moreRemaining", { count: node.remaining })), 1),
2954
3059
  node.remaining > (__props.pageSize || 0) ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("button", {
2955
3060
  class: "fl-more-btn",
2956
3061
  type: "button",
2957
3062
  onClick: ($event) => showMore(node, false)
2958
- }, [createTextVNode(toDisplayString(t("showMore")), 1), createElementVNode("span", _hoisted_43, toDisplayString(` ${t("folderItems", { count: __props.pageSize })}`), 1)], 8, _hoisted_42), createElementVNode("button", {
3063
+ }, [createTextVNode(toDisplayString(t("showMore")), 1), createElementVNode("span", _hoisted_44, toDisplayString(` ${t("folderItems", { count: __props.pageSize })}`), 1)], 8, _hoisted_43), createElementVNode("button", {
2959
3064
  class: "fl-more-btn fl-more-all",
2960
3065
  type: "button",
2961
3066
  onClick: ($event) => showMore(node, true)
2962
- }, toDisplayString(t("showAll")), 9, _hoisted_44)], 64)) : (openBlock(), createElementBlock("button", {
3067
+ }, toDisplayString(t("showAll")), 9, _hoisted_45)], 64)) : (openBlock(), createElementBlock("button", {
2963
3068
  key: 1,
2964
3069
  class: "fl-more-btn",
2965
3070
  type: "button",
2966
3071
  onClick: ($event) => showMore(node, true)
2967
- }, toDisplayString(t("showRest", { count: node.remaining })), 9, _hoisted_45))
3072
+ }, toDisplayString(t("showRest", { count: node.remaining })), 9, _hoisted_46))
2968
3073
  ])], 4)) : (openBlock(), createElementBlock("div", {
2969
3074
  key: 1,
2970
3075
  class: normalizeClass(["fl-row", {
@@ -2977,19 +3082,19 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
2977
3082
  }]),
2978
3083
  style: normalizeStyle({ "--fl-depth": node.depth })
2979
3084
  }, [
2980
- createElementVNode("label", _hoisted_46, [createElementVNode("input", {
3085
+ createElementVNode("label", _hoisted_47, [createElementVNode("input", {
2981
3086
  type: "checkbox",
2982
3087
  disabled: !!node.lock || batchBusy.value,
2983
3088
  "aria-label": t("selectItem", { name: node.name }),
2984
3089
  checked: isChecked(node),
2985
3090
  ".indeterminate": isIndeterminate(node),
2986
3091
  onChange: ($event) => toggleCheck(node, $event)
2987
- }, null, 40, _hoisted_47)]),
3092
+ }, null, 40, _hoisted_48)]),
2988
3093
  createElementVNode("span", {
2989
3094
  class: "fl-cell fl-cell-name",
2990
3095
  title: node.isRoot ? node.path : void 0
2991
3096
  }, [
2992
- _cache[11] || (_cache[11] = createElementVNode("span", {
3097
+ _cache[12] || (_cache[12] = createElementVNode("span", {
2993
3098
  class: "fl-indent",
2994
3099
  "aria-hidden": "true"
2995
3100
  }, null, -1)),
@@ -3003,7 +3108,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3003
3108
  }, [createVNode(_sfc_main$2, {
3004
3109
  name: "lock",
3005
3110
  size: 14
3006
- })], 8, _hoisted_49)) : node.is_dir ? (openBlock(), createElementBlock("button", {
3111
+ })], 8, _hoisted_50)) : node.is_dir ? (openBlock(), createElementBlock("button", {
3007
3112
  key: 1,
3008
3113
  class: normalizeClass(["fl-arrow", { "fl-arrow-open": node.expanded }]),
3009
3114
  type: "button",
@@ -3013,28 +3118,29 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3013
3118
  }, [createVNode(_sfc_main$2, {
3014
3119
  name: "next",
3015
3120
  size: 14
3016
- })], 10, _hoisted_50)) : (openBlock(), createElementBlock("span", _hoisted_51)),
3017
- node.is_dir ? (openBlock(), createElementBlock("svg", _hoisted_52, [..._cache[10] || (_cache[10] = [createElementVNode("path", { d: "M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" }, null, -1)])])) : (openBlock(), createElementBlock("span", {
3121
+ })], 10, _hoisted_51)) : (openBlock(), createElementBlock("span", _hoisted_52)),
3122
+ node.is_dir ? (openBlock(), createElementBlock("svg", _hoisted_53, [..._cache[11] || (_cache[11] = [createElementVNode("path", { d: "M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" }, null, -1)])])) : (openBlock(), createElementBlock("span", {
3018
3123
  key: 4,
3019
3124
  class: "fl-type",
3020
3125
  "data-kind": unref(fileKind)(node.name),
3021
3126
  "aria-hidden": "true"
3022
- }, toDisplayString(unref(extOf)(node.name) || "FILE"), 9, _hoisted_53)),
3023
- createElementVNode("span", _hoisted_54, [createElementVNode("span", {
3127
+ }, toDisplayString(unref(extOf)(node.name) || "FILE"), 9, _hoisted_54)),
3128
+ createElementVNode("span", _hoisted_55, [createElementVNode("span", {
3024
3129
  class: normalizeClass(["fl-name", { "fl-name-dir": node.is_dir }]),
3025
3130
  onClick: ($event) => node.lock || node.is_dir ? toggleExpand(node) : download(node)
3026
3131
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(nameParts(node.name), (part, at) => {
3027
- return openBlock(), createElementBlock(Fragment, { key: at }, [part.hit ? (openBlock(), createElementBlock("mark", _hoisted_56, toDisplayString(part.text), 1)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(part.text), 1)], 64))], 64);
3028
- }), 128))], 10, _hoisted_55), createElementVNode("span", _hoisted_57, [!node.is_dir ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(unref(formatSize)(node.size)) + " · " + toDisplayString(unref(formatDate)(node.modified)), 1)], 64)) : node.loaded ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(t("folderItems", { count: statsOf(node).files })) + " · " + toDisplayString(unref(formatSize)(statsOf(node).bytes)), 1)], 64)) : createCommentVNode("v-if", true)])]),
3029
- node.is_dir && node.loaded ? (openBlock(), createElementBlock("span", _hoisted_58, toDisplayString(t("folderItems", { count: statsOf(node).files })), 1)) : createCommentVNode("v-if", true),
3132
+ return openBlock(), createElementBlock(Fragment, { key: at }, [part.hit ? (openBlock(), createElementBlock("mark", _hoisted_57, toDisplayString(part.text), 1)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(part.text), 1)], 64))], 64);
3133
+ }), 128))], 10, _hoisted_56), createElementVNode("span", _hoisted_58, [!node.is_dir ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(unref(formatSize)(node.size)) + " · " + toDisplayString(unref(formatDate)(node.modified)), 1)], 64)) : node.loaded ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(t("folderItems", { count: statsOf(node).files })) + " · " + toDisplayString(unref(formatSize)(statsOf(node).bytes)), 1)], 64)) : lockedInSearch(node) ? (openBlock(), createElementBlock("span", _hoisted_59, toDisplayString(t("deepLocked")), 1)) : createCommentVNode("v-if", true)])]),
3134
+ lockedInSearch(node) && !node.lock?.prompting ? (openBlock(), createElementBlock("span", _hoisted_60, toDisplayString(t("deepLocked")), 1)) : createCommentVNode("v-if", true),
3135
+ node.is_dir && node.loaded ? (openBlock(), createElementBlock("span", _hoisted_61, toDisplayString(t("folderItems", { count: statsOf(node).files })), 1)) : createCommentVNode("v-if", true),
3030
3136
  node.lock?.prompting && node.lock.error ? (openBlock(), createElementBlock("span", {
3031
- key: 6,
3137
+ key: 7,
3032
3138
  id: `${unref(uid)}-error-${index}`,
3033
3139
  class: "fl-unlock-message",
3034
3140
  role: "alert"
3035
- }, toDisplayString(unlockErrorText(node.lock.error)), 9, _hoisted_59)) : createCommentVNode("v-if", true),
3141
+ }, toDisplayString(unlockErrorText(node.lock.error)), 9, _hoisted_62)) : createCommentVNode("v-if", true),
3036
3142
  !node.lock && unref(remembered).has(node.path) ? (openBlock(), createElementBlock("button", {
3037
- key: 7,
3143
+ key: 8,
3038
3144
  class: "fl-remembered",
3039
3145
  type: "button",
3040
3146
  "aria-label": `${t("forgetPassword")} ${node.name}`,
@@ -3043,9 +3149,9 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3043
3149
  }, [createVNode(_sfc_main$2, {
3044
3150
  name: "key",
3045
3151
  size: 11
3046
- }), createTextVNode(" " + toDisplayString(t("remembered")) + " · " + toDisplayString(t("forgetPassword")), 1)], 8, _hoisted_60)) : createCommentVNode("v-if", true),
3047
- node.loading ? (openBlock(), createElementBlock("span", _hoisted_61, "…")) : createCommentVNode("v-if", true)
3048
- ], 8, _hoisted_48),
3152
+ }), createTextVNode(" " + toDisplayString(t("remembered")) + " · " + toDisplayString(t("forgetPassword")), 1)], 8, _hoisted_63)) : createCommentVNode("v-if", true),
3153
+ node.loading ? (openBlock(), createElementBlock("span", _hoisted_64, "…")) : createCommentVNode("v-if", true)
3154
+ ], 8, _hoisted_49),
3049
3155
  node.lock?.prompting ? (openBlock(), createElementBlock("form", {
3050
3156
  key: 0,
3051
3157
  class: "fl-unlock fl-unlock-row",
@@ -3066,7 +3172,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3066
3172
  "aria-label": t("passwordFor", { name: node.name }),
3067
3173
  "aria-invalid": !!node.lock.error,
3068
3174
  "aria-describedby": node.lock.error ? `${unref(uid)}-error-${index}` : void 0
3069
- }, null, 8, _hoisted_63), [[vModelText, node.lock.input]]),
3175
+ }, null, 8, _hoisted_66), [[vModelText, node.lock.input]]),
3070
3176
  canRemember.value ? (openBlock(), createElementBlock("button", {
3071
3177
  key: 0,
3072
3178
  class: "fl-unlock-remember",
@@ -3075,12 +3181,12 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3075
3181
  "aria-label": t("rememberPassword"),
3076
3182
  title: t("rememberPassword"),
3077
3183
  onClick: ($event) => node.lock.remember = !node.lock.remember
3078
- }, [createVNode(_sfc_main$2, { name: "key" })], 8, _hoisted_64)) : createCommentVNode("v-if", true),
3184
+ }, [createVNode(_sfc_main$2, { name: "key" })], 8, _hoisted_67)) : createCommentVNode("v-if", true),
3079
3185
  createElementVNode("button", {
3080
3186
  class: "fl-unlock-submit",
3081
3187
  type: "submit",
3082
3188
  disabled: node.lock.busy || !node.lock.input
3083
- }, toDisplayString(t("open")), 9, _hoisted_65),
3189
+ }, toDisplayString(t("open")), 9, _hoisted_68),
3084
3190
  createElementVNode("button", {
3085
3191
  class: "fl-unlock-cancel",
3086
3192
  type: "button",
@@ -3090,11 +3196,11 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3090
3196
  }, [createVNode(_sfc_main$2, {
3091
3197
  name: "close",
3092
3198
  size: 14
3093
- })], 8, _hoisted_66)
3094
- ], 40, _hoisted_62)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
3095
- createElementVNode("span", _hoisted_67, toDisplayString(node.is_dir ? "—" : unref(formatSize)(node.size)), 1),
3096
- createElementVNode("span", _hoisted_68, toDisplayString(unref(formatDate)(node.modified)), 1),
3097
- createElementVNode("span", _hoisted_69, [node.lock ? (openBlock(), createElementBlock("button", {
3199
+ })], 8, _hoisted_69)
3200
+ ], 40, _hoisted_65)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
3201
+ createElementVNode("span", _hoisted_70, toDisplayString(node.is_dir ? "—" : unref(formatSize)(node.size)), 1),
3202
+ createElementVNode("span", _hoisted_71, toDisplayString(unref(formatDate)(node.modified)), 1),
3203
+ createElementVNode("span", _hoisted_72, [node.lock ? (openBlock(), createElementBlock("button", {
3098
3204
  key: 0,
3099
3205
  class: "fl-action fl-arrow-end fl-lock",
3100
3206
  type: "button",
@@ -3103,7 +3209,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3103
3209
  }, [createVNode(_sfc_main$2, {
3104
3210
  name: "lock",
3105
3211
  size: 18
3106
- })], 8, _hoisted_70)) : node.is_dir ? (openBlock(), createElementBlock("button", {
3212
+ })], 8, _hoisted_73)) : node.is_dir ? (openBlock(), createElementBlock("button", {
3107
3213
  key: 1,
3108
3214
  class: normalizeClass(["fl-action fl-arrow-end", { "fl-arrow-open": node.expanded }]),
3109
3215
  type: "button",
@@ -3113,49 +3219,38 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3113
3219
  }, [createVNode(_sfc_main$2, {
3114
3220
  name: "next",
3115
3221
  size: 18
3116
- })], 10, _hoisted_71)) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [canPreview(node) ? (openBlock(), createElementBlock("button", {
3222
+ })], 10, _hoisted_74)) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [canPreview(node) ? (openBlock(), createElementBlock("button", {
3117
3223
  key: 0,
3118
3224
  class: "fl-action fl-preview-btn",
3119
3225
  type: "button",
3120
3226
  "aria-label": `${t("preview")} ${node.name}`,
3121
3227
  title: t("preview"),
3122
3228
  onClick: ($event) => preview(node)
3123
- }, [createVNode(_sfc_main$2, { name: "eye" })], 8, _hoisted_72)) : createCommentVNode("v-if", true), createElementVNode("button", {
3229
+ }, [createVNode(_sfc_main$2, { name: "eye" })], 8, _hoisted_75)) : createCommentVNode("v-if", true), createElementVNode("button", {
3124
3230
  class: "fl-action fl-download",
3125
3231
  type: "button",
3126
3232
  "aria-label": `${t("download")} ${node.name}`,
3127
3233
  title: t("download"),
3128
3234
  onClick: ($event) => download(node)
3129
- }, [createVNode(_sfc_main$2, { name: "download" })], 8, _hoisted_73)], 64))])
3235
+ }, [createVNode(_sfc_main$2, { name: "download" })], 8, _hoisted_76)], 64))])
3130
3236
  ], 64))
3131
3237
  ], 6))], 64);
3132
3238
  }), 128)),
3133
- deepRow.value ? (openBlock(), createElementBlock("div", _hoisted_74, [_cache[14] || (_cache[14] = createElementVNode("span", { class: "fl-cell fl-cell-check" }, null, -1)), createElementVNode("span", _hoisted_75, [_cache[13] || (_cache[13] = createElementVNode("span", {
3134
- class: "fl-indent",
3135
- "aria-hidden": "true"
3136
- }, null, -1)), deepRow.value === "running" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
3137
- createElementVNode("span", _hoisted_76, toDisplayString(t("deepRunning", { count: deep.searched })), 1),
3138
- createElementVNode("button", {
3139
- class: "fl-more-btn fl-more-all",
3140
- type: "button",
3141
- onClick: stopDeepSearch
3142
- }, toDisplayString(t("deepStop")), 1),
3143
- _cache[12] || (_cache[12] = createElementVNode("span", {
3144
- class: "fl-deep-bar",
3145
- "aria-hidden": "true"
3146
- }, null, -1))
3147
- ], 64)) : deepRow.value === "idle" ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createElementVNode("span", _hoisted_77, toDisplayString(deep.searched ? deepSummary.value : t("deepHint")), 1), createElementVNode("button", {
3148
- class: "fl-more-btn",
3239
+ deepRow.value ? (openBlock(), createElementBlock("div", _hoisted_77, [createElementVNode("p", _hoisted_78, [deepRow.value === "running" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(toDisplayString(t("deepRunning", { count: folderCounts.value.checked })) + " · ", 1), createElementVNode("button", {
3240
+ class: "fl-deep-link",
3241
+ type: "button",
3242
+ onClick: pauseDeepSearch
3243
+ }, toDisplayString(t("deepStop")), 1)], 64)) : deepRow.value === "idle" ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(t("deepHint")), 1), createElementVNode("button", {
3244
+ class: "fl-deep-link",
3149
3245
  type: "button",
3150
3246
  onClick: deepSearch
3151
- }, toDisplayString(t("deepSearch")), 1)], 64)) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createElementVNode("span", _hoisted_78, toDisplayString(deepSummary.value), 1), deepRow.value === "capped" ? (openBlock(), createElementBlock("button", {
3152
- key: 0,
3153
- class: "fl-more-btn",
3247
+ }, toDisplayString(t("deepSearch")), 1)], 64)) : deepRow.value === "capped" ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createTextVNode(toDisplayString(deepSummary.value) + " · ", 1), createElementVNode("button", {
3248
+ class: "fl-deep-link",
3154
3249
  type: "button",
3155
3250
  onClick: deepSearch
3156
- }, toDisplayString(t("deepContinue")), 1)) : createCommentVNode("v-if", true)], 64))])])) : createCommentVNode("v-if", true),
3157
- createElementVNode("div", _hoisted_79, [createElementVNode("span", null, toDisplayString(t("loaded", { count: allFiles.value.length })) + " · " + toDisplayString(t("totalSize", { size: unref(formatSize)(unref(totalSize)(allFiles.value)) })), 1)]),
3158
- toast.value ? (openBlock(), createElementBlock("div", _hoisted_80, toDisplayString(toast.value), 1)) : createCommentVNode("v-if", true),
3251
+ }, toDisplayString(t("deepContinue")), 1)], 64)) : (openBlock(), createElementBlock(Fragment, { key: 3 }, [createTextVNode(toDisplayString(deepSummary.value), 1)], 64))]), deepRow.value === "running" ? (openBlock(), createElementBlock("span", _hoisted_79)) : createCommentVNode("v-if", true)])) : createCommentVNode("v-if", true),
3252
+ createElementVNode("div", _hoisted_80, [createElementVNode("span", null, toDisplayString(t("loaded", { count: allFiles.value.length })) + " · " + toDisplayString(t("totalSize", { size: unref(formatSize)(unref(totalSize)(allFiles.value)) })), 1)]),
3253
+ toast.value ? (openBlock(), createElementBlock("div", _hoisted_81, toDisplayString(toast.value), 1)) : createCommentVNode("v-if", true),
3159
3254
  createVNode(_sfc_main$3, {
3160
3255
  open: !!zipDialog.value,
3161
3256
  title: zipDialog.value?.title ?? "",
@@ -3164,7 +3259,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3164
3259
  "confirm-label": zipDialog.value?.confirm,
3165
3260
  "cancel-label": zipDialog.value?.cancel ?? "",
3166
3261
  onConfirm: confirmZip,
3167
- onClose: _cache[4] || (_cache[4] = ($event) => zipNotice.value = null)
3262
+ onClose: _cache[5] || (_cache[5] = ($event) => zipNotice.value = null)
3168
3263
  }, null, 8, [
3169
3264
  "open",
3170
3265
  "title",
@@ -3185,9 +3280,9 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
3185
3280
  position: previewPosition.value,
3186
3281
  total: previewPosition.value ? previewList.value.length : 0,
3187
3282
  onClose: closePreview,
3188
- onPrev: _cache[5] || (_cache[5] = ($event) => stepPreview(-1)),
3189
- onNext: _cache[6] || (_cache[6] = ($event) => stepPreview(1)),
3190
- onDownload: _cache[7] || (_cache[7] = ($event) => previewNode.value && download(previewNode.value))
3283
+ onPrev: _cache[6] || (_cache[6] = ($event) => stepPreview(-1)),
3284
+ onNext: _cache[7] || (_cache[7] = ($event) => stepPreview(1)),
3285
+ onDownload: _cache[8] || (_cache[8] = ($event) => previewNode.value && download(previewNode.value))
3191
3286
  }, null, 8, [
3192
3287
  "open",
3193
3288
  "file",