@burdenoff/microfe-files 2026.527.2 → 2026.527.4

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.
Files changed (32) hide show
  1. package/dist/files/components/ActionMenu.js +44 -40
  2. package/dist/files/components/ActionMenu.js.map +1 -1
  3. package/dist/files/components/ConfirmDialog.js +42 -40
  4. package/dist/files/components/ConfirmDialog.js.map +1 -1
  5. package/dist/files/components/CopyDialog.js +1 -0
  6. package/dist/files/components/CopyDialog.js.map +1 -1
  7. package/dist/files/components/FileCard.js.map +1 -1
  8. package/dist/files/components/FileInfoPanel.js +102 -102
  9. package/dist/files/components/FileInfoPanel.js.map +1 -1
  10. package/dist/files/components/FileListItem.js.map +1 -1
  11. package/dist/files/components/FolderCard.js.map +1 -1
  12. package/dist/files/components/SearchBar.js +125 -117
  13. package/dist/files/components/SearchBar.js.map +1 -1
  14. package/dist/files/components/ShareDialog.js +5 -0
  15. package/dist/files/components/ShareDialog.js.map +1 -1
  16. package/dist/files/components/Toast.js +27 -24
  17. package/dist/files/components/Toast.js.map +1 -1
  18. package/dist/files/components/UploadQueue.js +1 -1
  19. package/dist/files/components/UploadQueue.js.map +1 -1
  20. package/dist/files/components/viewers/AudioPlayer.js +3 -0
  21. package/dist/files/components/viewers/AudioPlayer.js.map +1 -1
  22. package/dist/files/components/viewers/TextViewer.js +1 -0
  23. package/dist/files/components/viewers/TextViewer.js.map +1 -1
  24. package/dist/files/components/viewers/VideoPlayer.js +3 -0
  25. package/dist/files/components/viewers/VideoPlayer.js.map +1 -1
  26. package/dist/files/hooks/useKeyboardNavigation.js +51 -51
  27. package/dist/files/hooks/useKeyboardNavigation.js.map +1 -1
  28. package/dist/files/pages/BrowserPage.js +210 -214
  29. package/dist/files/pages/BrowserPage.js.map +1 -1
  30. package/dist/files/pages/ShareAccessPage.js +1 -0
  31. package/dist/files/pages/ShareAccessPage.js.map +1 -1
  32. package/package.json +1 -1
@@ -1,105 +1,105 @@
1
1
  import { useFilesStore as e } from "../store/filesStore.js";
2
- import { useCallback as t, useEffect as n, useRef as r } from "react";
2
+ import { useCallback as t, useEffect as n, useMemo as r, useRef as i } from "react";
3
3
  //#region src/files/hooks/useKeyboardNavigation.ts
4
- function i({ files: i, folders: a, onFilePreview: o, onFileDelete: s, onFolderOpen: c, onFolderDelete: l, activeTab: u }) {
5
- let d = r(-1), { selectedFiles: f, selectedFolders: p, clearSelection: m, selectFile: h, selectFolder: g, toggleFileSelection: _, toggleFolderSelection: v, selectAllFiles: y, selectAllFolders: b } = e(), x = [...a, ...i], S = x.length, C = t((e) => {
6
- d.current = Math.max(-1, Math.min(e, S - 1));
7
- }, [S]), w = t(() => d.current >= 0 && d.current < S ? x[d.current] : null, [x, S]), T = t((e) => e < a.length, [a.length]), E = t((e) => e >= a.length, [a.length]), D = t(() => {
8
- let e = d.current;
9
- return E(e) ? i[e - a.length] ?? null : null;
4
+ function a({ files: a, folders: o, onFilePreview: s, onFileDelete: c, onFolderOpen: l, onFolderDelete: u, activeTab: d }) {
5
+ let f = i(-1), { selectedFiles: p, selectedFolders: m, clearSelection: h, selectFile: g, selectFolder: _, toggleFileSelection: v, toggleFolderSelection: y, selectAllFiles: b, selectAllFolders: x } = e(), S = r(() => [...o, ...a], [o, a]), C = S.length, w = t((e) => {
6
+ f.current = Math.max(-1, Math.min(e, C - 1));
7
+ }, [C]), T = t(() => f.current >= 0 && f.current < C ? S[f.current] : null, [S, C]), E = t((e) => e < o.length, [o.length]), D = t((e) => e >= o.length, [o.length]), O = t(() => {
8
+ let e = f.current;
9
+ return D(e) ? a[e - o.length] ?? null : null;
10
10
  }, [
11
- i,
12
- a.length,
13
- E
14
- ]), O = t(() => {
15
- let e = d.current;
16
- return T(e) ? a[e] ?? null : null;
17
- }, [a, T]), k = t((e) => {
11
+ a,
12
+ o.length,
13
+ D
14
+ ]), k = t(() => {
15
+ let e = f.current;
16
+ return E(e) ? o[e] ?? null : null;
17
+ }, [o, E]), A = t((e) => {
18
18
  let t = e.target;
19
19
  if (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.isContentEditable) return;
20
- let n = u === "bin";
20
+ let n = d === "bin";
21
21
  switch (e.key) {
22
22
  case "ArrowDown":
23
- e.preventDefault(), C(d.current + 1);
23
+ e.preventDefault(), w(f.current + 1);
24
24
  break;
25
25
  case "ArrowUp":
26
- e.preventDefault(), C(d.current - 1);
26
+ e.preventDefault(), w(f.current - 1);
27
27
  break;
28
28
  case "ArrowRight":
29
- e.preventDefault(), C(d.current + 1);
29
+ e.preventDefault(), w(f.current + 1);
30
30
  break;
31
31
  case "ArrowLeft":
32
- e.preventDefault(), C(d.current - 1);
32
+ e.preventDefault(), w(f.current - 1);
33
33
  break;
34
34
  case "Enter": {
35
35
  e.preventDefault();
36
- let t = O();
37
- if (t) c?.(t);
36
+ let t = k();
37
+ if (t) l?.(t);
38
38
  else {
39
- let e = D();
40
- e && o?.(e);
39
+ let e = O();
40
+ e && s?.(e);
41
41
  }
42
42
  break;
43
43
  }
44
44
  case " ": {
45
45
  e.preventDefault();
46
- let t = O();
47
- if (t) v(t.id);
46
+ let t = k();
47
+ if (t) y(t.id);
48
48
  else {
49
- let e = D();
50
- e && _(e.id);
49
+ let e = O();
50
+ e && v(e.id);
51
51
  }
52
52
  break;
53
53
  }
54
54
  case "Delete":
55
55
  case "Backspace": {
56
56
  if (e.preventDefault(), n) return;
57
- let t = O();
58
- if (t) l?.(t);
57
+ let t = k();
58
+ if (t) u?.(t);
59
59
  else {
60
- let e = D();
61
- e && s?.(e);
60
+ let e = O();
61
+ e && c?.(e);
62
62
  }
63
63
  break;
64
64
  }
65
65
  case "Escape":
66
- e.preventDefault(), m(), C(-1);
66
+ e.preventDefault(), h(), w(-1);
67
67
  break;
68
68
  case "a":
69
69
  case "A":
70
70
  if (e.ctrlKey || e.metaKey) {
71
71
  e.preventDefault();
72
- let t = i.map((e) => e.id), n = a.map((e) => e.id);
73
- y(t), b(n);
72
+ let t = a.map((e) => e.id), n = o.map((e) => e.id);
73
+ b(t), x(n);
74
74
  }
75
75
  break;
76
76
  }
77
77
  }, [
78
- u,
79
- m,
80
- i,
78
+ d,
79
+ h,
81
80
  a,
82
- D,
81
+ o,
83
82
  O,
83
+ k,
84
+ c,
84
85
  s,
85
- o,
86
+ u,
86
87
  l,
87
- c,
88
- y,
89
88
  b,
90
- C,
91
- _,
92
- v
89
+ x,
90
+ w,
91
+ v,
92
+ y
93
93
  ]);
94
- return n(() => (document.addEventListener("keydown", k), () => {
95
- document.removeEventListener("keydown", k);
96
- }), [k]), {
97
- focusedIndex: d.current,
98
- setFocusedIndex: C,
99
- getFocusedItem: w
94
+ return n(() => (document.addEventListener("keydown", A), () => {
95
+ document.removeEventListener("keydown", A);
96
+ }), [A]), {
97
+ focusedIndex: f.current,
98
+ setFocusedIndex: w,
99
+ getFocusedItem: T
100
100
  };
101
101
  }
102
102
  //#endregion
103
- export { i as useKeyboardNavigation };
103
+ export { a as useKeyboardNavigation };
104
104
 
105
105
  //# sourceMappingURL=useKeyboardNavigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyboardNavigation.js","names":[],"sources":["../../../src/files/hooks/useKeyboardNavigation.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\n\ninterface UseKeyboardNavigationOptions {\n files: FileItem[];\n folders: FolderItem[];\n onFilePreview?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n activeTab: string;\n}\n\nexport function useKeyboardNavigation({\n files,\n folders,\n onFilePreview,\n onFileDelete,\n onFolderOpen,\n onFolderDelete,\n activeTab,\n}: UseKeyboardNavigationOptions) {\n const focusedIndexRef = useRef<number>(-1);\n const {\n selectedFiles,\n selectedFolders,\n clearSelection,\n selectFile,\n selectFolder,\n toggleFileSelection,\n toggleFolderSelection,\n selectAllFiles,\n selectAllFolders,\n } = useFilesStore();\n\n const allItems = [...folders, ...files];\n const totalItems = allItems.length;\n\n const setFocusedIndex = useCallback(\n (index: number) => {\n const clampedIndex = Math.max(-1, Math.min(index, totalItems - 1));\n focusedIndexRef.current = clampedIndex;\n },\n [totalItems],\n );\n\n const getFocusedItem = useCallback(() => {\n if (focusedIndexRef.current >= 0 && focusedIndexRef.current < totalItems) {\n return allItems[focusedIndexRef.current];\n }\n return null;\n }, [allItems, totalItems]);\n\n const isFocusedFolder = useCallback(\n (index: number): boolean => {\n return index < folders.length;\n },\n [folders.length],\n );\n\n const isFocusedFile = useCallback(\n (index: number): boolean => {\n return index >= folders.length;\n },\n [folders.length],\n );\n\n const getFocusedFile = useCallback((): FileItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFile(idx)) {\n return files[idx - folders.length] ?? null;\n }\n return null;\n }, [files, folders.length, isFocusedFile]);\n\n const getFocusedFolder = useCallback((): FolderItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFolder(idx)) {\n return folders[idx] ?? null;\n }\n return null;\n }, [folders, isFocusedFolder]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const isInputFocused =\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable;\n\n if (isInputFocused) {\n return;\n }\n\n const isBinTab = activeTab === \"bin\";\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"Enter\": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n onFolderOpen?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFilePreview?.(file);\n }\n }\n break;\n }\n case \" \": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n toggleFolderSelection(folder.id);\n } else {\n const file = getFocusedFile();\n if (file) {\n toggleFileSelection(file.id);\n }\n }\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n event.preventDefault();\n if (isBinTab) {\n return;\n }\n const folder = getFocusedFolder();\n if (folder) {\n onFolderDelete?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFileDelete?.(file);\n }\n }\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n clearSelection();\n setFocusedIndex(-1);\n break;\n }\n case \"a\":\n case \"A\": {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const fileIds = files.map((f) => f.id);\n const folderIds = folders.map((f) => f.id);\n selectAllFiles(fileIds);\n selectAllFolders(folderIds);\n }\n break;\n }\n }\n },\n [\n activeTab,\n clearSelection,\n files,\n folders,\n getFocusedFile,\n getFocusedFolder,\n onFileDelete,\n onFilePreview,\n onFolderDelete,\n onFolderOpen,\n selectAllFiles,\n selectAllFolders,\n setFocusedIndex,\n toggleFileSelection,\n toggleFolderSelection,\n ],\n );\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return {\n focusedIndex: focusedIndexRef.current,\n setFocusedIndex,\n getFocusedItem,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useKeyboardNavigation.js","names":[],"sources":["../../../src/files/hooks/useKeyboardNavigation.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\n\ninterface UseKeyboardNavigationOptions {\n files: FileItem[];\n folders: FolderItem[];\n onFilePreview?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n activeTab: string;\n}\n\nexport function useKeyboardNavigation({\n files,\n folders,\n onFilePreview,\n onFileDelete,\n onFolderOpen,\n onFolderDelete,\n activeTab,\n}: UseKeyboardNavigationOptions) {\n const focusedIndexRef = useRef<number>(-1);\n const {\n selectedFiles,\n selectedFolders,\n clearSelection,\n selectFile,\n selectFolder,\n toggleFileSelection,\n toggleFolderSelection,\n selectAllFiles,\n selectAllFolders,\n } = useFilesStore();\n\n const allItems = useMemo(() => [...folders, ...files], [folders, files]);\n const totalItems = allItems.length;\n\n const setFocusedIndex = useCallback(\n (index: number) => {\n const clampedIndex = Math.max(-1, Math.min(index, totalItems - 1));\n focusedIndexRef.current = clampedIndex;\n },\n [totalItems],\n );\n\n const getFocusedItem = useCallback(() => {\n if (focusedIndexRef.current >= 0 && focusedIndexRef.current < totalItems) {\n return allItems[focusedIndexRef.current];\n }\n return null;\n }, [allItems, totalItems]);\n\n const isFocusedFolder = useCallback(\n (index: number): boolean => {\n return index < folders.length;\n },\n [folders.length],\n );\n\n const isFocusedFile = useCallback(\n (index: number): boolean => {\n return index >= folders.length;\n },\n [folders.length],\n );\n\n const getFocusedFile = useCallback((): FileItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFile(idx)) {\n return files[idx - folders.length] ?? null;\n }\n return null;\n }, [files, folders.length, isFocusedFile]);\n\n const getFocusedFolder = useCallback((): FolderItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFolder(idx)) {\n return folders[idx] ?? null;\n }\n return null;\n }, [folders, isFocusedFolder]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const isInputFocused =\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable;\n\n if (isInputFocused) {\n return;\n }\n\n const isBinTab = activeTab === \"bin\";\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"Enter\": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n onFolderOpen?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFilePreview?.(file);\n }\n }\n break;\n }\n case \" \": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n toggleFolderSelection(folder.id);\n } else {\n const file = getFocusedFile();\n if (file) {\n toggleFileSelection(file.id);\n }\n }\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n event.preventDefault();\n if (isBinTab) {\n return;\n }\n const folder = getFocusedFolder();\n if (folder) {\n onFolderDelete?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFileDelete?.(file);\n }\n }\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n clearSelection();\n setFocusedIndex(-1);\n break;\n }\n case \"a\":\n case \"A\": {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const fileIds = files.map((f) => f.id);\n const folderIds = folders.map((f) => f.id);\n selectAllFiles(fileIds);\n selectAllFolders(folderIds);\n }\n break;\n }\n }\n },\n [\n activeTab,\n clearSelection,\n files,\n folders,\n getFocusedFile,\n getFocusedFolder,\n onFileDelete,\n onFilePreview,\n onFolderDelete,\n onFolderOpen,\n selectAllFiles,\n selectAllFolders,\n setFocusedIndex,\n toggleFileSelection,\n toggleFolderSelection,\n ],\n );\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return {\n focusedIndex: focusedIndexRef.current,\n setFocusedIndex,\n getFocusedItem,\n };\n}\n"],"mappings":"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"}