@burdenoff/microfe-files 2026.510.101

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 (289) hide show
  1. package/README.md +12 -0
  2. package/dist/config/index.d.ts +33 -0
  3. package/dist/config/index.d.ts.map +1 -0
  4. package/dist/config/index.js +28 -0
  5. package/dist/config/index.js.map +1 -0
  6. package/dist/dev/main.d.ts +1 -0
  7. package/dist/dev/main.d.ts.map +1 -0
  8. package/dist/files/FilesRoot.d.ts +31 -0
  9. package/dist/files/FilesRoot.d.ts.map +1 -0
  10. package/dist/files/FilesRoot.js +63 -0
  11. package/dist/files/FilesRoot.js.map +1 -0
  12. package/dist/files/FilesRoutes.d.ts +12 -0
  13. package/dist/files/FilesRoutes.d.ts.map +1 -0
  14. package/dist/files/FilesRoutes.js +45 -0
  15. package/dist/files/FilesRoutes.js.map +1 -0
  16. package/dist/files/components/ActionMenu.d.ts +19 -0
  17. package/dist/files/components/ActionMenu.d.ts.map +1 -0
  18. package/dist/files/components/ActionMenu.js +73 -0
  19. package/dist/files/components/ActionMenu.js.map +1 -0
  20. package/dist/files/components/ConfirmDialog.d.ts +14 -0
  21. package/dist/files/components/ConfirmDialog.d.ts.map +1 -0
  22. package/dist/files/components/ConfirmDialog.js +85 -0
  23. package/dist/files/components/ConfirmDialog.js.map +1 -0
  24. package/dist/files/components/ContextMenu.d.ts +59 -0
  25. package/dist/files/components/ContextMenu.d.ts.map +1 -0
  26. package/dist/files/components/ContextMenu.js +136 -0
  27. package/dist/files/components/ContextMenu.js.map +1 -0
  28. package/dist/files/components/CopyDialog.d.ts +12 -0
  29. package/dist/files/components/CopyDialog.d.ts.map +1 -0
  30. package/dist/files/components/CopyDialog.js +139 -0
  31. package/dist/files/components/CopyDialog.js.map +1 -0
  32. package/dist/files/components/EmptyState.d.ts +8 -0
  33. package/dist/files/components/EmptyState.d.ts.map +1 -0
  34. package/dist/files/components/EmptyState.js +66 -0
  35. package/dist/files/components/EmptyState.js.map +1 -0
  36. package/dist/files/components/FileBrowser.d.ts +37 -0
  37. package/dist/files/components/FileBrowser.d.ts.map +1 -0
  38. package/dist/files/components/FileBrowser.js +421 -0
  39. package/dist/files/components/FileBrowser.js.map +1 -0
  40. package/dist/files/components/FileCard.d.ts +30 -0
  41. package/dist/files/components/FileCard.d.ts.map +1 -0
  42. package/dist/files/components/FileCard.js +233 -0
  43. package/dist/files/components/FileCard.js.map +1 -0
  44. package/dist/files/components/FileInfoPanel.d.ts +9 -0
  45. package/dist/files/components/FileInfoPanel.d.ts.map +1 -0
  46. package/dist/files/components/FileInfoPanel.js +224 -0
  47. package/dist/files/components/FileInfoPanel.js.map +1 -0
  48. package/dist/files/components/FileListItem.d.ts +46 -0
  49. package/dist/files/components/FileListItem.d.ts.map +1 -0
  50. package/dist/files/components/FileListItem.js +235 -0
  51. package/dist/files/components/FileListItem.js.map +1 -0
  52. package/dist/files/components/FilePreviewModal.d.ts +17 -0
  53. package/dist/files/components/FilePreviewModal.d.ts.map +1 -0
  54. package/dist/files/components/FilePreviewModal.js +175 -0
  55. package/dist/files/components/FilePreviewModal.js.map +1 -0
  56. package/dist/files/components/FileVersionPanel.d.ts +9 -0
  57. package/dist/files/components/FileVersionPanel.d.ts.map +1 -0
  58. package/dist/files/components/FileVersionPanel.js +227 -0
  59. package/dist/files/components/FileVersionPanel.js.map +1 -0
  60. package/dist/files/components/FolderCard.d.ts +34 -0
  61. package/dist/files/components/FolderCard.d.ts.map +1 -0
  62. package/dist/files/components/FolderCard.js +225 -0
  63. package/dist/files/components/FolderCard.js.map +1 -0
  64. package/dist/files/components/MoveDialog.d.ts +12 -0
  65. package/dist/files/components/MoveDialog.d.ts.map +1 -0
  66. package/dist/files/components/MoveDialog.js +123 -0
  67. package/dist/files/components/MoveDialog.js.map +1 -0
  68. package/dist/files/components/SearchBar.d.ts +13 -0
  69. package/dist/files/components/SearchBar.d.ts.map +1 -0
  70. package/dist/files/components/SearchBar.js +257 -0
  71. package/dist/files/components/SearchBar.js.map +1 -0
  72. package/dist/files/components/ShareDialog.d.ts +24 -0
  73. package/dist/files/components/ShareDialog.d.ts.map +1 -0
  74. package/dist/files/components/ShareDialog.js +201 -0
  75. package/dist/files/components/ShareDialog.js.map +1 -0
  76. package/dist/files/components/TabBar.d.ts +14 -0
  77. package/dist/files/components/TabBar.d.ts.map +1 -0
  78. package/dist/files/components/TabBar.js +65 -0
  79. package/dist/files/components/TabBar.js.map +1 -0
  80. package/dist/files/components/Toast.d.ts +14 -0
  81. package/dist/files/components/Toast.d.ts.map +1 -0
  82. package/dist/files/components/Toast.js +51 -0
  83. package/dist/files/components/Toast.js.map +1 -0
  84. package/dist/files/components/UploadQueue.d.ts +21 -0
  85. package/dist/files/components/UploadQueue.d.ts.map +1 -0
  86. package/dist/files/components/UploadQueue.js +171 -0
  87. package/dist/files/components/UploadQueue.js.map +1 -0
  88. package/dist/files/components/index.d.ts +43 -0
  89. package/dist/files/components/index.d.ts.map +1 -0
  90. package/dist/files/components/viewers/AudioPlayer.d.ts +8 -0
  91. package/dist/files/components/viewers/AudioPlayer.d.ts.map +1 -0
  92. package/dist/files/components/viewers/AudioPlayer.js +102 -0
  93. package/dist/files/components/viewers/AudioPlayer.js.map +1 -0
  94. package/dist/files/components/viewers/CodeViewer.d.ts +16 -0
  95. package/dist/files/components/viewers/CodeViewer.d.ts.map +1 -0
  96. package/dist/files/components/viewers/CodeViewer.js +113 -0
  97. package/dist/files/components/viewers/CodeViewer.js.map +1 -0
  98. package/dist/files/components/viewers/ImageViewer.d.ts +8 -0
  99. package/dist/files/components/viewers/ImageViewer.d.ts.map +1 -0
  100. package/dist/files/components/viewers/ImageViewer.js +138 -0
  101. package/dist/files/components/viewers/ImageViewer.js.map +1 -0
  102. package/dist/files/components/viewers/PDFViewer.d.ts +15 -0
  103. package/dist/files/components/viewers/PDFViewer.d.ts.map +1 -0
  104. package/dist/files/components/viewers/PDFViewer.js +80 -0
  105. package/dist/files/components/viewers/PDFViewer.js.map +1 -0
  106. package/dist/files/components/viewers/TextViewer.d.ts +8 -0
  107. package/dist/files/components/viewers/TextViewer.d.ts.map +1 -0
  108. package/dist/files/components/viewers/TextViewer.js +121 -0
  109. package/dist/files/components/viewers/TextViewer.js.map +1 -0
  110. package/dist/files/components/viewers/VideoPlayer.d.ts +8 -0
  111. package/dist/files/components/viewers/VideoPlayer.d.ts.map +1 -0
  112. package/dist/files/components/viewers/VideoPlayer.js +138 -0
  113. package/dist/files/components/viewers/VideoPlayer.js.map +1 -0
  114. package/dist/files/components/viewers/index.d.ts +7 -0
  115. package/dist/files/components/viewers/index.d.ts.map +1 -0
  116. package/dist/files/components/viewers/index.js +6 -0
  117. package/dist/files/graphql-types.d.ts +317 -0
  118. package/dist/files/graphql-types.d.ts.map +1 -0
  119. package/dist/files/hooks/useBatchOperations.d.ts +32 -0
  120. package/dist/files/hooks/useBatchOperations.d.ts.map +1 -0
  121. package/dist/files/hooks/useBatchOperations.js +18 -0
  122. package/dist/files/hooks/useBatchOperations.js.map +1 -0
  123. package/dist/files/hooks/useBinItems.d.ts +11 -0
  124. package/dist/files/hooks/useBinItems.d.ts.map +1 -0
  125. package/dist/files/hooks/useBinItems.js +27 -0
  126. package/dist/files/hooks/useBinItems.js.map +1 -0
  127. package/dist/files/hooks/useBrowsePage.d.ts +18 -0
  128. package/dist/files/hooks/useBrowsePage.d.ts.map +1 -0
  129. package/dist/files/hooks/useBrowsePage.js +34 -0
  130. package/dist/files/hooks/useBrowsePage.js.map +1 -0
  131. package/dist/files/hooks/useCopyFile.d.ts +14 -0
  132. package/dist/files/hooks/useCopyFile.d.ts.map +1 -0
  133. package/dist/files/hooks/useCopyFile.js +22 -0
  134. package/dist/files/hooks/useCopyFile.js.map +1 -0
  135. package/dist/files/hooks/useCreateFolder.d.ts +14 -0
  136. package/dist/files/hooks/useCreateFolder.d.ts.map +1 -0
  137. package/dist/files/hooks/useCreateFolder.js +14 -0
  138. package/dist/files/hooks/useCreateFolder.js.map +1 -0
  139. package/dist/files/hooks/useCreateFolderShare.d.ts +16 -0
  140. package/dist/files/hooks/useCreateFolderShare.d.ts.map +1 -0
  141. package/dist/files/hooks/useCreateFolderShare.js +14 -0
  142. package/dist/files/hooks/useCreateFolderShare.js.map +1 -0
  143. package/dist/files/hooks/useCreateShare.d.ts +16 -0
  144. package/dist/files/hooks/useCreateShare.d.ts.map +1 -0
  145. package/dist/files/hooks/useCreateShare.js +14 -0
  146. package/dist/files/hooks/useCreateShare.js.map +1 -0
  147. package/dist/files/hooks/useDeleteFile.d.ts +9 -0
  148. package/dist/files/hooks/useDeleteFile.d.ts.map +1 -0
  149. package/dist/files/hooks/useDeleteFile.js +20 -0
  150. package/dist/files/hooks/useDeleteFile.js.map +1 -0
  151. package/dist/files/hooks/useDeleteFolder.d.ts +10 -0
  152. package/dist/files/hooks/useDeleteFolder.d.ts.map +1 -0
  153. package/dist/files/hooks/useDeleteFolder.js +24 -0
  154. package/dist/files/hooks/useDeleteFolder.js.map +1 -0
  155. package/dist/files/hooks/useDragDrop.d.ts +31 -0
  156. package/dist/files/hooks/useDragDrop.d.ts.map +1 -0
  157. package/dist/files/hooks/useDragDrop.js +45 -0
  158. package/dist/files/hooks/useDragDrop.js.map +1 -0
  159. package/dist/files/hooks/useFileVersions.d.ts +52 -0
  160. package/dist/files/hooks/useFileVersions.d.ts.map +1 -0
  161. package/dist/files/hooks/useFileVersions.js +52 -0
  162. package/dist/files/hooks/useFileVersions.js.map +1 -0
  163. package/dist/files/hooks/useFiles.d.ts +18 -0
  164. package/dist/files/hooks/useFiles.d.ts.map +1 -0
  165. package/dist/files/hooks/useFolder.d.ts +7 -0
  166. package/dist/files/hooks/useFolder.d.ts.map +1 -0
  167. package/dist/files/hooks/useFolderPath.d.ts +2 -0
  168. package/dist/files/hooks/useFolderPath.d.ts.map +1 -0
  169. package/dist/files/hooks/useFoldersQuery.d.ts +7 -0
  170. package/dist/files/hooks/useFoldersQuery.d.ts.map +1 -0
  171. package/dist/files/hooks/useFoldersQuery.js +13 -0
  172. package/dist/files/hooks/useFoldersQuery.js.map +1 -0
  173. package/dist/files/hooks/useKeyboardNavigation.d.ts +17 -0
  174. package/dist/files/hooks/useKeyboardNavigation.d.ts.map +1 -0
  175. package/dist/files/hooks/useKeyboardNavigation.js +105 -0
  176. package/dist/files/hooks/useKeyboardNavigation.js.map +1 -0
  177. package/dist/files/hooks/useMoveFile.d.ts +10 -0
  178. package/dist/files/hooks/useMoveFile.d.ts.map +1 -0
  179. package/dist/files/hooks/useMoveFile.js +21 -0
  180. package/dist/files/hooks/useMoveFile.js.map +1 -0
  181. package/dist/files/hooks/useMoveFolder.d.ts +10 -0
  182. package/dist/files/hooks/useMoveFolder.d.ts.map +1 -0
  183. package/dist/files/hooks/useMoveFolder.js +21 -0
  184. package/dist/files/hooks/useMoveFolder.js.map +1 -0
  185. package/dist/files/hooks/usePermanentlyDeleteFile.d.ts +9 -0
  186. package/dist/files/hooks/usePermanentlyDeleteFile.d.ts.map +1 -0
  187. package/dist/files/hooks/usePermanentlyDeleteFile.js +18 -0
  188. package/dist/files/hooks/usePermanentlyDeleteFile.js.map +1 -0
  189. package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts +9 -0
  190. package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts.map +1 -0
  191. package/dist/files/hooks/usePermanentlyDeleteFolder.js +18 -0
  192. package/dist/files/hooks/usePermanentlyDeleteFolder.js.map +1 -0
  193. package/dist/files/hooks/useRecentFiles.d.ts +10 -0
  194. package/dist/files/hooks/useRecentFiles.d.ts.map +1 -0
  195. package/dist/files/hooks/useRecentFiles.js +24 -0
  196. package/dist/files/hooks/useRecentFiles.js.map +1 -0
  197. package/dist/files/hooks/useRenameFile.d.ts +10 -0
  198. package/dist/files/hooks/useRenameFile.d.ts.map +1 -0
  199. package/dist/files/hooks/useRenameFile.js +21 -0
  200. package/dist/files/hooks/useRenameFile.js.map +1 -0
  201. package/dist/files/hooks/useRenameFolder.d.ts +10 -0
  202. package/dist/files/hooks/useRenameFolder.d.ts.map +1 -0
  203. package/dist/files/hooks/useRenameFolder.js +21 -0
  204. package/dist/files/hooks/useRenameFolder.js.map +1 -0
  205. package/dist/files/hooks/useRestoreFile.d.ts +9 -0
  206. package/dist/files/hooks/useRestoreFile.d.ts.map +1 -0
  207. package/dist/files/hooks/useRestoreFile.js +21 -0
  208. package/dist/files/hooks/useRestoreFile.js.map +1 -0
  209. package/dist/files/hooks/useRestoreFolder.d.ts +9 -0
  210. package/dist/files/hooks/useRestoreFolder.d.ts.map +1 -0
  211. package/dist/files/hooks/useRestoreFolder.js +21 -0
  212. package/dist/files/hooks/useRestoreFolder.js.map +1 -0
  213. package/dist/files/hooks/useSearch.d.ts +15 -0
  214. package/dist/files/hooks/useSearch.d.ts.map +1 -0
  215. package/dist/files/hooks/useSearch.js +27 -0
  216. package/dist/files/hooks/useSearch.js.map +1 -0
  217. package/dist/files/hooks/useStarredItems.d.ts +10 -0
  218. package/dist/files/hooks/useStarredItems.d.ts.map +1 -0
  219. package/dist/files/hooks/useStarredItems.js +18 -0
  220. package/dist/files/hooks/useStarredItems.js.map +1 -0
  221. package/dist/files/hooks/useToast.d.ts +11 -0
  222. package/dist/files/hooks/useToast.d.ts.map +1 -0
  223. package/dist/files/hooks/useToast.js +28 -0
  224. package/dist/files/hooks/useToast.js.map +1 -0
  225. package/dist/files/hooks/useToggleStar.d.ts +10 -0
  226. package/dist/files/hooks/useToggleStar.d.ts.map +1 -0
  227. package/dist/files/hooks/useToggleStar.js +26 -0
  228. package/dist/files/hooks/useToggleStar.js.map +1 -0
  229. package/dist/files/hooks/useUploadFile.d.ts +25 -0
  230. package/dist/files/hooks/useUploadFile.d.ts.map +1 -0
  231. package/dist/files/hooks/useUploadFile.js +74 -0
  232. package/dist/files/hooks/useUploadFile.js.map +1 -0
  233. package/dist/files/index.d.ts +29 -0
  234. package/dist/files/index.d.ts.map +1 -0
  235. package/dist/files/index.js +3 -0
  236. package/dist/files/pages/BrowserPage.d.ts +5 -0
  237. package/dist/files/pages/BrowserPage.d.ts.map +1 -0
  238. package/dist/files/pages/BrowserPage.js +1014 -0
  239. package/dist/files/pages/BrowserPage.js.map +1 -0
  240. package/dist/files/pages/ShareAccessPage.d.ts +2 -0
  241. package/dist/files/pages/ShareAccessPage.d.ts.map +1 -0
  242. package/dist/files/pages/ShareAccessPage.js +162 -0
  243. package/dist/files/pages/ShareAccessPage.js.map +1 -0
  244. package/dist/files/providers/FilesProvider.d.ts +25 -0
  245. package/dist/files/providers/FilesProvider.d.ts.map +1 -0
  246. package/dist/files/providers/FilesProvider.js +18 -0
  247. package/dist/files/providers/FilesProvider.js.map +1 -0
  248. package/dist/files/store/filesStore.d.ts +99 -0
  249. package/dist/files/store/filesStore.d.ts.map +1 -0
  250. package/dist/files/store/filesStore.js +129 -0
  251. package/dist/files/store/filesStore.js.map +1 -0
  252. package/dist/files/types.d.ts +266 -0
  253. package/dist/files/types.d.ts.map +1 -0
  254. package/dist/files/utils/events.d.ts +6 -0
  255. package/dist/files/utils/events.d.ts.map +1 -0
  256. package/dist/files/utils/events.js +16 -0
  257. package/dist/files/utils/events.js.map +1 -0
  258. package/dist/files/utils/i18n.d.ts +5 -0
  259. package/dist/files/utils/i18n.d.ts.map +1 -0
  260. package/dist/files/utils/i18n.js +15 -0
  261. package/dist/files/utils/i18n.js.map +1 -0
  262. package/dist/files/utils/index.d.ts +74 -0
  263. package/dist/files/utils/index.d.ts.map +1 -0
  264. package/dist/files/utils/index.js +50 -0
  265. package/dist/files/utils/index.js.map +1 -0
  266. package/dist/files/utils/thumbnail.d.ts +5 -0
  267. package/dist/files/utils/thumbnail.d.ts.map +1 -0
  268. package/dist/files/utils/thumbnail.js +39 -0
  269. package/dist/files/utils/thumbnail.js.map +1 -0
  270. package/dist/files.d.ts +2 -0
  271. package/dist/files.js +6 -0
  272. package/dist/generated/global-operations.d.ts +2 -0
  273. package/dist/generated/global-operations.d.ts.map +1 -0
  274. package/dist/generated/global-types.d.ts +21253 -0
  275. package/dist/generated/global-types.d.ts.map +1 -0
  276. package/dist/generated/wspace-operations.d.ts +2706 -0
  277. package/dist/generated/wspace-operations.d.ts.map +1 -0
  278. package/dist/generated/wspace-operations.js +1085 -0
  279. package/dist/generated/wspace-operations.js.map +1 -0
  280. package/dist/generated/wspace-types.d.ts +55214 -0
  281. package/dist/generated/wspace-types.d.ts.map +1 -0
  282. package/dist/index.d.ts +30 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/shared/types/index.d.ts +101 -0
  285. package/dist/shared/types/index.d.ts.map +1 -0
  286. package/dist/utils/nativeBridge.d.ts +3 -0
  287. package/dist/utils/nativeBridge.d.ts.map +1 -0
  288. package/dist/utils/nativeBridge.js +2 -0
  289. package/package.json +126 -0
@@ -0,0 +1,136 @@
1
+ import { tWithFallback as e } from "../utils/i18n.js";
2
+ import { useEffect as t, useRef as n } from "react";
3
+ import { Clock as r, Copy as i, Download as a, Edit3 as o, FolderInput as s, Info as c, RotateCcw as l, Share2 as u, Star as d, Trash2 as f } from "lucide-react";
4
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
5
+ //#region src/files/components/ContextMenu.tsx
6
+ function h({ x: e, y: r, onClose: i, items: a }) {
7
+ let o = n(null);
8
+ return t(() => {
9
+ let e = (e) => {
10
+ o.current && !o.current.contains(e.target) && i();
11
+ }, t = (e) => {
12
+ e.key === "Escape" && i();
13
+ };
14
+ return document.addEventListener("mousedown", e), document.addEventListener("keydown", t), () => {
15
+ document.removeEventListener("mousedown", e), document.removeEventListener("keydown", t);
16
+ };
17
+ }, [i]), /* @__PURE__ */ p("div", {
18
+ ref: o,
19
+ className: "fixed bg-bg-elevated rounded-lg shadow-xl border border-border-default py-1 min-w-48 z-50 animate-in fade-in-0 zoom-in-95 duration-150",
20
+ style: {
21
+ left: `${e}px`,
22
+ top: `${r}px`
23
+ },
24
+ children: a.map((e, t) => /* @__PURE__ */ m("button", {
25
+ onClick: () => {
26
+ e.onClick(), i();
27
+ },
28
+ disabled: e.disabled,
29
+ className: `
30
+ w-full flex items-center gap-3 px-4 py-2 text-sm transition-all duration-150 text-left
31
+ ${e.variant === "danger" ? "text-status-error-text hover:bg-status-error-bg-subtle" : "text-text-primary hover:bg-action-ghost-bg-hover"}
32
+ ${e.disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"}
33
+ `,
34
+ children: [e.icon, e.label]
35
+ }, t))
36
+ });
37
+ }
38
+ function g(t, n) {
39
+ return [
40
+ ...t.onShare ? [{
41
+ label: e(n, "files.contextMenu.share", "Share"),
42
+ icon: /* @__PURE__ */ p(u, { className: "size-4" }),
43
+ onClick: t.onShare
44
+ }] : [],
45
+ ...t.onDownload ? [{
46
+ label: e(n, "files.contextMenu.download", "Download"),
47
+ icon: /* @__PURE__ */ p(a, { className: "size-4" }),
48
+ onClick: t.onDownload
49
+ }] : [],
50
+ ...t.onCopy ? [{
51
+ label: e(n, "files.contextMenu.makeCopy", "Make a copy"),
52
+ icon: /* @__PURE__ */ p(i, { className: "size-4" }),
53
+ onClick: t.onCopy
54
+ }] : [],
55
+ ...t.onRename ? [{
56
+ label: e(n, "files.contextMenu.rename", "Rename"),
57
+ icon: /* @__PURE__ */ p(o, { className: "size-4" }),
58
+ onClick: t.onRename
59
+ }] : [],
60
+ ...t.onStar ? [{
61
+ label: t.isStarred ? e(n, "files.contextMenu.removeStar", "Remove star") : e(n, "files.contextMenu.addToStarred", "Add to starred"),
62
+ icon: /* @__PURE__ */ p(d, { className: "size-4" }),
63
+ onClick: t.onStar
64
+ }] : [],
65
+ ...t.onMove ? [{
66
+ label: e(n, "files.contextMenu.moveTo", "Move to"),
67
+ icon: /* @__PURE__ */ p(s, { className: "size-4" }),
68
+ onClick: t.onMove
69
+ }] : [],
70
+ ...t.onInfo ? [{
71
+ label: e(n, "files.contextMenu.fileInfo", "File information"),
72
+ icon: /* @__PURE__ */ p(c, { className: "size-4" }),
73
+ onClick: t.onInfo
74
+ }] : [],
75
+ ...t.onActivity ? [{
76
+ label: e(n, "files.contextMenu.activity", "Activity"),
77
+ icon: /* @__PURE__ */ p(r, { className: "size-4" }),
78
+ onClick: t.onActivity
79
+ }] : [],
80
+ ...t.onRestore ? [{
81
+ label: e(n, "files.contextMenu.restore", "Restore"),
82
+ icon: /* @__PURE__ */ p(l, { className: "size-4" }),
83
+ onClick: t.onRestore
84
+ }] : [],
85
+ ...t.onDelete ? [{
86
+ label: e(n, "files.contextMenu.delete", "Delete"),
87
+ icon: /* @__PURE__ */ p(f, { className: "size-4" }),
88
+ onClick: t.onDelete,
89
+ variant: "danger"
90
+ }] : []
91
+ ];
92
+ }
93
+ function _(t, n) {
94
+ return [
95
+ ...t.onShare ? [{
96
+ label: e(n, "files.contextMenu.share", "Share"),
97
+ icon: /* @__PURE__ */ p(u, { className: "size-4" }),
98
+ onClick: t.onShare
99
+ }] : [],
100
+ ...t.onRename ? [{
101
+ label: e(n, "files.contextMenu.rename", "Rename"),
102
+ icon: /* @__PURE__ */ p(o, { className: "size-4" }),
103
+ onClick: t.onRename
104
+ }] : [],
105
+ ...t.onStar ? [{
106
+ label: t.isStarred ? e(n, "files.contextMenu.removeStar", "Remove star") : e(n, "files.contextMenu.addToStarred", "Add to starred"),
107
+ icon: /* @__PURE__ */ p(d, { className: "size-4" }),
108
+ onClick: t.onStar
109
+ }] : [],
110
+ ...t.onMove ? [{
111
+ label: e(n, "files.contextMenu.moveTo", "Move to"),
112
+ icon: /* @__PURE__ */ p(s, { className: "size-4" }),
113
+ onClick: t.onMove
114
+ }] : [],
115
+ ...t.onInfo ? [{
116
+ label: e(n, "files.contextMenu.folderInfo", "Folder information"),
117
+ icon: /* @__PURE__ */ p(c, { className: "size-4" }),
118
+ onClick: t.onInfo
119
+ }] : [],
120
+ ...t.onRestore ? [{
121
+ label: e(n, "files.contextMenu.restore", "Restore"),
122
+ icon: /* @__PURE__ */ p(l, { className: "size-4" }),
123
+ onClick: t.onRestore
124
+ }] : [],
125
+ ...t.onDelete ? [{
126
+ label: e(n, "files.contextMenu.delete", "Delete"),
127
+ icon: /* @__PURE__ */ p(f, { className: "size-4" }),
128
+ onClick: t.onDelete,
129
+ variant: "danger"
130
+ }] : []
131
+ ];
132
+ }
133
+ //#endregion
134
+ export { h as ContextMenu, g as createFileMenuItems, _ as createFolderMenuItems };
135
+
136
+ //# sourceMappingURL=ContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMenu.js","names":[],"sources":["../../../src/files/components/ContextMenu.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport {\n Share2,\n Download,\n Copy,\n Trash2,\n Edit3,\n Star,\n FolderInput,\n Info,\n Clock,\n RotateCcw,\n} from \"lucide-react\";\nimport type { I18nContextValue } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ninterface ContextMenuProps {\n x: number;\n y: number;\n onClose: () => void;\n items: {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n variant?: \"default\" | \"danger\";\n disabled?: boolean;\n }[];\n}\n\nexport function ContextMenu({ x, y, onClose, items }: ContextMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n onClose();\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscape);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [onClose]);\n\n return (\n <div\n ref={menuRef}\n className=\"fixed bg-bg-elevated rounded-lg shadow-xl border border-border-default py-1 min-w-48 z-50 animate-in fade-in-0 zoom-in-95 duration-150\"\n style={{\n left: `${x}px`,\n top: `${y}px`,\n }}\n >\n {items.map((item, index) => (\n <button\n key={index}\n onClick={() => {\n item.onClick();\n onClose();\n }}\n disabled={item.disabled}\n className={`\n w-full flex items-center gap-3 px-4 py-2 text-sm transition-all duration-150 text-left\n ${\n item.variant === \"danger\"\n ? \"text-status-error-text hover:bg-status-error-bg-subtle\"\n : \"text-text-primary hover:bg-action-ghost-bg-hover\"\n }\n ${item.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"}\n `}\n >\n {item.icon}\n {item.label}\n </button>\n ))}\n </div>\n );\n}\n\n// Helper to create menu items\nexport function createFileMenuItems(\n options: {\n onShare?: () => void;\n onDownload?: () => void;\n onCopy?: () => void;\n onRename?: () => void;\n onStar?: () => void;\n onMove?: () => void;\n onInfo?: () => void;\n onActivity?: () => void;\n onRestore?: () => void;\n onDelete?: () => void;\n isStarred?: boolean;\n },\n t: I18nContextValue[\"t\"],\n) {\n return [\n ...(options.onShare\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.share\", \"Share\"),\n icon: <Share2 className=\"size-4\" />,\n onClick: options.onShare,\n },\n ]\n : []),\n ...(options.onDownload\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.download\", \"Download\"),\n icon: <Download className=\"size-4\" />,\n onClick: options.onDownload,\n },\n ]\n : []),\n ...(options.onCopy\n ? [\n {\n label: tWithFallback(\n t,\n \"files.contextMenu.makeCopy\",\n \"Make a copy\",\n ),\n icon: <Copy className=\"size-4\" />,\n onClick: options.onCopy,\n },\n ]\n : []),\n ...(options.onRename\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.rename\", \"Rename\"),\n icon: <Edit3 className=\"size-4\" />,\n onClick: options.onRename,\n },\n ]\n : []),\n ...(options.onStar\n ? [\n {\n label: options.isStarred\n ? tWithFallback(t, \"files.contextMenu.removeStar\", \"Remove star\")\n : tWithFallback(\n t,\n \"files.contextMenu.addToStarred\",\n \"Add to starred\",\n ),\n icon: <Star className=\"size-4\" />,\n onClick: options.onStar,\n },\n ]\n : []),\n ...(options.onMove\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.moveTo\", \"Move to\"),\n icon: <FolderInput className=\"size-4\" />,\n onClick: options.onMove,\n },\n ]\n : []),\n ...(options.onInfo\n ? [\n {\n label: tWithFallback(\n t,\n \"files.contextMenu.fileInfo\",\n \"File information\",\n ),\n icon: <Info className=\"size-4\" />,\n onClick: options.onInfo,\n },\n ]\n : []),\n ...(options.onActivity\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.activity\", \"Activity\"),\n icon: <Clock className=\"size-4\" />,\n onClick: options.onActivity,\n },\n ]\n : []),\n ...(options.onRestore\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.restore\", \"Restore\"),\n icon: <RotateCcw className=\"size-4\" />,\n onClick: options.onRestore,\n },\n ]\n : []),\n ...(options.onDelete\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.delete\", \"Delete\"),\n icon: <Trash2 className=\"size-4\" />,\n onClick: options.onDelete,\n variant: \"danger\" as const,\n },\n ]\n : []),\n ];\n}\n\nexport function createFolderMenuItems(\n options: {\n onShare?: () => void;\n onRename?: () => void;\n onStar?: () => void;\n onMove?: () => void;\n onInfo?: () => void;\n onRestore?: () => void;\n onDelete?: () => void;\n isStarred?: boolean;\n },\n t: I18nContextValue[\"t\"],\n) {\n return [\n ...(options.onShare\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.share\", \"Share\"),\n icon: <Share2 className=\"size-4\" />,\n onClick: options.onShare,\n },\n ]\n : []),\n ...(options.onRename\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.rename\", \"Rename\"),\n icon: <Edit3 className=\"size-4\" />,\n onClick: options.onRename,\n },\n ]\n : []),\n ...(options.onStar\n ? [\n {\n label: options.isStarred\n ? tWithFallback(t, \"files.contextMenu.removeStar\", \"Remove star\")\n : tWithFallback(\n t,\n \"files.contextMenu.addToStarred\",\n \"Add to starred\",\n ),\n icon: <Star className=\"size-4\" />,\n onClick: options.onStar,\n },\n ]\n : []),\n ...(options.onMove\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.moveTo\", \"Move to\"),\n icon: <FolderInput className=\"size-4\" />,\n onClick: options.onMove,\n },\n ]\n : []),\n ...(options.onInfo\n ? [\n {\n label: tWithFallback(\n t,\n \"files.contextMenu.folderInfo\",\n \"Folder information\",\n ),\n icon: <Info className=\"size-4\" />,\n onClick: options.onInfo,\n },\n ]\n : []),\n ...(options.onRestore\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.restore\", \"Restore\"),\n icon: <RotateCcw className=\"size-4\" />,\n onClick: options.onRestore,\n },\n ]\n : []),\n ...(options.onDelete\n ? [\n {\n label: tWithFallback(t, \"files.contextMenu.delete\", \"Delete\"),\n icon: <Trash2 className=\"size-4\" />,\n onClick: options.onDelete,\n variant: \"danger\" as const,\n },\n ]\n : []),\n ];\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { FC } from 'react';
2
+ import { FileItem, FolderItem } from '../types';
3
+ interface CopyDialogProps {
4
+ item: FileItem | FolderItem;
5
+ type: "file" | "folder";
6
+ onClose: () => void;
7
+ onCopy: (destinationFolderId: string | null, newName?: string) => Promise<void>;
8
+ isLoading?: boolean;
9
+ }
10
+ export declare const CopyDialog: FC<CopyDialogProps>;
11
+ export {};
12
+ //# sourceMappingURL=CopyDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyDialog.d.ts","sourceRoot":"","sources":["../../../src/files/components/CopyDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAY,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIrD,UAAU,eAAe;IACvB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CACN,mBAAmB,EAAE,MAAM,GAAG,IAAI,EAClC,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA4N1C,CAAC"}
@@ -0,0 +1,139 @@
1
+ import { tWithFallback as e } from "../utils/i18n.js";
2
+ import { useFoldersQuery as t } from "../hooks/useFoldersQuery.js";
3
+ import { useState as n } from "react";
4
+ import { ChevronRight as r, Folder as i, Home as a, Loader2 as o, X as s } from "lucide-react";
5
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ //#region src/files/components/CopyDialog.tsx
8
+ var d = ({ item: d, type: f, onClose: p, onCopy: m, isLoading: h = !1 }) => {
9
+ let { t: g } = u(), [_, v] = n(null), [y, b] = n([]), [x, S] = n(null), [C, w] = n(`${e(g, "files.copyDialog.copyOf", "Copy of")} ${d.name}`), { data: T, loading: E } = t(_ || void 0), D = T?.getFolders?.folders || [], O = (e) => {
10
+ v(e.id), b([...y, {
11
+ id: e.id,
12
+ name: e.name
13
+ }]);
14
+ }, k = (e) => {
15
+ if (e === -1) v(null), b([]);
16
+ else {
17
+ let t = y[e];
18
+ v(t.id), b(y.slice(0, e + 1));
19
+ }
20
+ };
21
+ return /* @__PURE__ */ c("div", {
22
+ className: "fixed inset-0 backdrop-blur-sm flex items-center justify-center z-[100] animate-in fade-in duration-200",
23
+ role: "dialog",
24
+ "aria-modal": "true",
25
+ "aria-label": e(g, "files.copyDialog.title", "Copy"),
26
+ children: /* @__PURE__ */ l("div", {
27
+ className: "bg-bg-surface rounded-lg shadow-xl w-full max-w-md mx-4 max-h-[80vh] flex flex-col animate-in zoom-in-95 duration-200",
28
+ children: [
29
+ /* @__PURE__ */ l("div", {
30
+ className: "flex items-center justify-between px-6 py-4 border-b border-border-default",
31
+ children: [/* @__PURE__ */ l("h2", {
32
+ className: "text-lg font-semibold text-text-primary",
33
+ children: [
34
+ e(g, "files.copyDialog.makeCopyOf", "Make a copy of"),
35
+ " ",
36
+ "\"",
37
+ d.name,
38
+ "\""
39
+ ]
40
+ }), /* @__PURE__ */ c("button", {
41
+ onClick: p,
42
+ className: "p-1 text-text-tertiary hover:text-text-secondary hover:bg-action-ghost-bg-hover rounded transition-colors duration-200",
43
+ "aria-label": e(g, "files.copyDialog.close", "Close copy dialog"),
44
+ children: /* @__PURE__ */ c(s, { className: "size-5" })
45
+ })]
46
+ }),
47
+ /* @__PURE__ */ l("div", {
48
+ className: "px-6 py-4 border-b border-border-default",
49
+ children: [/* @__PURE__ */ c("label", {
50
+ className: "block text-sm font-medium text-text-primary mb-2",
51
+ children: e(g, "files.copyDialog.name", "Name")
52
+ }), /* @__PURE__ */ c("input", {
53
+ type: "text",
54
+ value: C,
55
+ onChange: (e) => w(e.target.value),
56
+ className: "w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:ring-2 focus:ring-action-primary-border text-sm transition-colors duration-200",
57
+ placeholder: e(g, "files.copyDialog.enterName", "Enter name for the copy")
58
+ })]
59
+ }),
60
+ /* @__PURE__ */ c("div", {
61
+ className: "px-6 py-3 border-b border-border-default bg-bg-muted",
62
+ children: /* @__PURE__ */ l("div", {
63
+ className: "flex items-center gap-2 text-sm overflow-x-auto",
64
+ children: [/* @__PURE__ */ l("button", {
65
+ onClick: () => k(-1),
66
+ className: "flex items-center gap-1.5 text-text-primary hover:bg-action-ghost-bg-hover px-2 py-1 rounded transition-colors duration-200 whitespace-nowrap",
67
+ children: [/* @__PURE__ */ c(a, { className: "size-4" }), /* @__PURE__ */ c("span", { children: e(g, "files.copyDialog.myDrive", "My Drive") })]
68
+ }), y.map((e, t) => /* @__PURE__ */ l("div", {
69
+ className: "flex items-center gap-2 whitespace-nowrap",
70
+ children: [/* @__PURE__ */ c(r, { className: "size-4 text-text-tertiary" }), /* @__PURE__ */ c("button", {
71
+ onClick: () => k(t),
72
+ className: `hover:bg-action-ghost-bg-hover px-2 py-1 rounded transition-colors duration-200 ${t === y.length - 1 ? "text-text-primary font-medium" : "text-text-secondary"}`,
73
+ children: e.name
74
+ })]
75
+ }, e.id))]
76
+ })
77
+ }),
78
+ /* @__PURE__ */ c("div", {
79
+ className: "flex-1 overflow-y-auto px-6 py-4",
80
+ children: E ? /* @__PURE__ */ c("div", {
81
+ className: "flex items-center justify-center py-8",
82
+ children: /* @__PURE__ */ c(o, { className: "size-6 text-text-tertiary animate-spin" })
83
+ }) : D.length === 0 ? /* @__PURE__ */ l("div", {
84
+ className: "text-center py-8",
85
+ children: [/* @__PURE__ */ c(i, { className: "size-12 text-text-tertiary mx-auto mb-3" }), /* @__PURE__ */ c("p", {
86
+ className: "text-sm text-text-secondary",
87
+ children: e(g, "files.copyDialog.noFolders", "No folders here")
88
+ })]
89
+ }) : /* @__PURE__ */ l("div", {
90
+ className: "space-y-1",
91
+ children: [/* @__PURE__ */ l("button", {
92
+ onClick: () => S(_),
93
+ className: `w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-left transition-all duration-200 ${x === _ ? "bg-bg-accent border-2 border-action-primary-border" : "hover:bg-action-ghost-bg-hover border-2 border-transparent"}`,
94
+ children: [/* @__PURE__ */ c(i, { className: "size-5 text-text-link" }), /* @__PURE__ */ c("span", {
95
+ className: "font-medium text-text-primary",
96
+ children: e(g, "files.copyDialog.copyHere", "Copy here")
97
+ })]
98
+ }), D.map((t) => /* @__PURE__ */ l("div", {
99
+ className: `flex items-center justify-between gap-3 px-3 py-2.5 rounded-lg transition-all duration-200 ${x === t.id ? "bg-bg-accent border-2 border-action-primary-border" : "hover:bg-action-ghost-bg-hover border-2 border-transparent"}`,
100
+ children: [/* @__PURE__ */ l("button", {
101
+ onClick: () => S(t.id),
102
+ className: "flex items-center gap-3 flex-1 min-w-0",
103
+ children: [/* @__PURE__ */ c(i, { className: "size-5 text-text-link flex-shrink-0" }), /* @__PURE__ */ c("span", {
104
+ className: "font-medium text-text-primary truncate",
105
+ children: t.name
106
+ })]
107
+ }), /* @__PURE__ */ c("button", {
108
+ onClick: () => O(t),
109
+ className: "p-1.5 text-text-tertiary hover:text-text-secondary hover:bg-action-ghost-bg-hover rounded transition-colors duration-200 flex-shrink-0",
110
+ title: e(g, "files.copyDialog.openFolder", "Open folder"),
111
+ "aria-label": `Open ${t.name}`,
112
+ children: /* @__PURE__ */ c(r, { className: "size-4" })
113
+ })]
114
+ }, t.id))]
115
+ })
116
+ }),
117
+ /* @__PURE__ */ l("div", {
118
+ className: "flex items-center justify-end gap-2 px-6 py-4 border-t border-border-default",
119
+ children: [/* @__PURE__ */ c("button", {
120
+ onClick: p,
121
+ className: "px-4 py-2 text-sm font-medium text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
122
+ children: e(g, "files.common.actions.cancel", "Cancel")
123
+ }), /* @__PURE__ */ l("button", {
124
+ onClick: async () => {
125
+ await m(x, C.trim() || void 0), p();
126
+ },
127
+ disabled: h || x === void 0 || !C.trim(),
128
+ className: "px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover disabled:bg-bg-muted disabled:text-text-tertiary disabled:cursor-not-allowed transition-colors duration-200 flex items-center gap-2",
129
+ children: [h && /* @__PURE__ */ c(o, { className: "size-4 animate-spin" }), h ? e(g, "files.copyDialog.copying", "Copying...") : e(g, "files.copyDialog.copy", "Copy")]
130
+ })]
131
+ })
132
+ ]
133
+ })
134
+ });
135
+ };
136
+ //#endregion
137
+ export { d as CopyDialog };
138
+
139
+ //# sourceMappingURL=CopyDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyDialog.js","names":[],"sources":["../../../src/files/components/CopyDialog.tsx"],"sourcesContent":["import { type FC, useState } from \"react\";\nimport { Folder, Home, ChevronRight, Loader2, X } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFoldersQuery } from \"../hooks/useFoldersQuery\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ninterface CopyDialogProps {\n item: FileItem | FolderItem;\n type: \"file\" | \"folder\";\n onClose: () => void;\n onCopy: (\n destinationFolderId: string | null,\n newName?: string,\n ) => Promise<void>;\n isLoading?: boolean;\n}\n\nexport const CopyDialog: FC<CopyDialogProps> = ({\n item,\n type,\n onClose,\n onCopy,\n isLoading = false,\n}) => {\n const { t } = useI18n();\n const [currentFolderId, setCurrentFolderId] = useState<string | null>(null);\n const [breadcrumbs, setBreadcrumbs] = useState<\n Array<{ id: string; name: string }>\n >([]);\n const [selectedDestination, setSelectedDestination] = useState<string | null>(\n null,\n );\n const [newName, setNewName] = useState(\n `${tWithFallback(t, \"files.copyDialog.copyOf\", \"Copy of\")} ${item.name}`,\n );\n\n // Fetch folders in current location\n const { data, loading: loadingFolders } = useFoldersQuery(\n currentFolderId || undefined,\n );\n const folders = (data?.getFolders?.folders || []) as FolderItem[];\n\n const handleFolderClick = (folder: FolderItem) => {\n setCurrentFolderId(folder.id);\n setBreadcrumbs([...breadcrumbs, { id: folder.id, name: folder.name }]);\n };\n\n const handleBreadcrumbClick = (index: number) => {\n if (index === -1) {\n // Go to root\n setCurrentFolderId(null);\n setBreadcrumbs([]);\n } else {\n const crumb = breadcrumbs[index];\n setCurrentFolderId(crumb.id);\n setBreadcrumbs(breadcrumbs.slice(0, index + 1));\n }\n };\n\n const handleCopy = async () => {\n await onCopy(selectedDestination, newName.trim() || undefined);\n onClose();\n };\n\n return (\n <div\n className=\"fixed inset-0 backdrop-blur-sm flex items-center justify-center z-[100] animate-in fade-in duration-200\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={tWithFallback(t, \"files.copyDialog.title\", \"Copy\")}\n >\n <div className=\"bg-bg-surface rounded-lg shadow-xl w-full max-w-md mx-4 max-h-[80vh] flex flex-col animate-in zoom-in-95 duration-200\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border-default\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tWithFallback(t, \"files.copyDialog.makeCopyOf\", \"Make a copy of\")}{\" \"}\n \"{item.name}\"\n </h2>\n <button\n onClick={onClose}\n className=\"p-1 text-text-tertiary hover:text-text-secondary hover:bg-action-ghost-bg-hover rounded transition-colors duration-200\"\n aria-label={tWithFallback(\n t,\n \"files.copyDialog.close\",\n \"Close copy dialog\",\n )}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n {/* Name input */}\n <div className=\"px-6 py-4 border-b border-border-default\">\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n {tWithFallback(t, \"files.copyDialog.name\", \"Name\")}\n </label>\n <input\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n className=\"w-full px-3 py-2 border border-border-default rounded-lg focus:outline-none focus:ring-2 focus:ring-action-primary-border text-sm transition-colors duration-200\"\n placeholder={tWithFallback(\n t,\n \"files.copyDialog.enterName\",\n \"Enter name for the copy\",\n )}\n />\n </div>\n\n {/* Breadcrumb navigation */}\n <div className=\"px-6 py-3 border-b border-border-default bg-bg-muted\">\n <div className=\"flex items-center gap-2 text-sm overflow-x-auto\">\n <button\n onClick={() => handleBreadcrumbClick(-1)}\n className=\"flex items-center gap-1.5 text-text-primary hover:bg-action-ghost-bg-hover px-2 py-1 rounded transition-colors duration-200 whitespace-nowrap\"\n >\n <Home className=\"size-4\" />\n <span>\n {tWithFallback(t, \"files.copyDialog.myDrive\", \"My Drive\")}\n </span>\n </button>\n {breadcrumbs.map((crumb, index) => (\n <div\n key={crumb.id}\n className=\"flex items-center gap-2 whitespace-nowrap\"\n >\n <ChevronRight className=\"size-4 text-text-tertiary\" />\n <button\n onClick={() => handleBreadcrumbClick(index)}\n className={`hover:bg-action-ghost-bg-hover px-2 py-1 rounded transition-colors duration-200 ${\n index === breadcrumbs.length - 1\n ? \"text-text-primary font-medium\"\n : \"text-text-secondary\"\n }`}\n >\n {crumb.name}\n </button>\n </div>\n ))}\n </div>\n </div>\n\n {/* Folder list */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n {loadingFolders ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"size-6 text-text-tertiary animate-spin\" />\n </div>\n ) : folders.length === 0 ? (\n <div className=\"text-center py-8\">\n <Folder className=\"size-12 text-text-tertiary mx-auto mb-3\" />\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n \"files.copyDialog.noFolders\",\n \"No folders here\",\n )}\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {/* Option to copy to current folder */}\n <button\n onClick={() => setSelectedDestination(currentFolderId)}\n className={`w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-left transition-all duration-200 ${\n selectedDestination === currentFolderId\n ? \"bg-bg-accent border-2 border-action-primary-border\"\n : \"hover:bg-action-ghost-bg-hover border-2 border-transparent\"\n }`}\n >\n <Folder className=\"size-5 text-text-link\" />\n <span className=\"font-medium text-text-primary\">\n {tWithFallback(t, \"files.copyDialog.copyHere\", \"Copy here\")}\n </span>\n </button>\n\n {/* List of subfolders */}\n {folders.map((folder) => (\n <div\n key={folder.id}\n className={`flex items-center justify-between gap-3 px-3 py-2.5 rounded-lg transition-all duration-200 ${\n selectedDestination === folder.id\n ? \"bg-bg-accent border-2 border-action-primary-border\"\n : \"hover:bg-action-ghost-bg-hover border-2 border-transparent\"\n }`}\n >\n <button\n onClick={() => setSelectedDestination(folder.id)}\n className=\"flex items-center gap-3 flex-1 min-w-0\"\n >\n <Folder className=\"size-5 text-text-link flex-shrink-0\" />\n <span className=\"font-medium text-text-primary truncate\">\n {folder.name}\n </span>\n </button>\n <button\n onClick={() => handleFolderClick(folder)}\n className=\"p-1.5 text-text-tertiary hover:text-text-secondary hover:bg-action-ghost-bg-hover rounded transition-colors duration-200 flex-shrink-0\"\n title={tWithFallback(\n t,\n \"files.copyDialog.openFolder\",\n \"Open folder\",\n )}\n aria-label={`Open ${folder.name}`}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-end gap-2 px-6 py-4 border-t border-border-default\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n >\n {tWithFallback(t, \"files.common.actions.cancel\", \"Cancel\")}\n </button>\n <button\n onClick={handleCopy}\n disabled={\n isLoading || selectedDestination === undefined || !newName.trim()\n }\n className=\"px-4 py-2 text-sm font-medium text-text-inverse bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover disabled:bg-bg-muted disabled:text-text-tertiary disabled:cursor-not-allowed transition-colors duration-200 flex items-center gap-2\"\n >\n {isLoading && <Loader2 className=\"size-4 animate-spin\" />}\n {isLoading\n ? tWithFallback(t, \"files.copyDialog.copying\", \"Copying...\")\n : tWithFallback(t, \"files.copyDialog.copy\", \"Copy\")}\n </button>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface EmptyStateProps {
2
+ type: "all" | "recent" | "starred" | "bin";
3
+ onUpload?: () => void;
4
+ onNewFolder?: () => void;
5
+ }
6
+ export declare function EmptyState({ type, onUpload, onNewFolder }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../src/files/components/EmptyState.tsx"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,eAAe,2CAqF1E"}
@@ -0,0 +1,66 @@
1
+ import { tWithFallback as e } from "../utils/i18n.js";
2
+ import { Clock as t, FolderOpen as n, Star as r, Trash2 as i } from "lucide-react";
3
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
+ //#region src/files/components/EmptyState.tsx
6
+ function c({ type: c, onUpload: l, onNewFolder: u }) {
7
+ let { t: d } = s(), f = {
8
+ all: {
9
+ icon: /* @__PURE__ */ a(n, { className: "size-16 text-text-tertiary" }),
10
+ title: e(d, "files.empty.all.title", "No files or folders yet"),
11
+ description: e(d, "files.empty.all.description", "Upload files or create folders to get started"),
12
+ showActions: !0
13
+ },
14
+ recent: {
15
+ icon: /* @__PURE__ */ a(t, { className: "size-16 text-text-tertiary" }),
16
+ title: e(d, "files.empty.recent.title", "No recent files"),
17
+ description: e(d, "files.empty.recent.description", "Files you recently opened will appear here"),
18
+ showActions: !1
19
+ },
20
+ starred: {
21
+ icon: /* @__PURE__ */ a(r, { className: "size-16 text-text-tertiary" }),
22
+ title: e(d, "files.empty.starred.title", "No starred items"),
23
+ description: e(d, "files.empty.starred.description", "Star files and folders to find them easily"),
24
+ showActions: !1
25
+ },
26
+ bin: {
27
+ icon: /* @__PURE__ */ a(i, { className: "size-16 text-text-tertiary" }),
28
+ title: e(d, "files.empty.bin.title", "Bin is empty"),
29
+ description: e(d, "files.empty.bin.description", "Deleted files and folders will appear here"),
30
+ showActions: !1
31
+ }
32
+ }[c];
33
+ return /* @__PURE__ */ o("div", {
34
+ className: "flex flex-col items-center justify-center py-20 px-4 animate-in fade-in duration-500",
35
+ children: [
36
+ /* @__PURE__ */ a("div", {
37
+ className: "mb-4 animate-in zoom-in duration-300 delay-100",
38
+ children: f.icon
39
+ }),
40
+ /* @__PURE__ */ a("h3", {
41
+ className: "text-lg font-semibold text-text-primary mb-2",
42
+ children: f.title
43
+ }),
44
+ /* @__PURE__ */ a("p", {
45
+ className: "text-sm text-text-secondary mb-6 text-center max-w-md",
46
+ children: f.description
47
+ }),
48
+ f.showActions && /* @__PURE__ */ o("div", {
49
+ className: "flex gap-3 animate-in fade-in slide-in-from-bottom-2 duration-300 delay-200",
50
+ children: [u && /* @__PURE__ */ a("button", {
51
+ onClick: u,
52
+ className: "px-4 py-2 text-sm font-medium text-text-primary bg-bg-surface border border-border-default rounded-lg hover:bg-action-ghost-bg-hover transition-all duration-200",
53
+ children: e(d, "files.empty.newFolder", "New Folder")
54
+ }), l && /* @__PURE__ */ a("button", {
55
+ onClick: l,
56
+ className: "px-4 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover transition-all duration-200",
57
+ children: e(d, "files.empty.uploadFiles", "Upload Files")
58
+ })]
59
+ })
60
+ ]
61
+ });
62
+ }
63
+ //#endregion
64
+ export { c as EmptyState };
65
+
66
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/files/components/EmptyState.tsx"],"sourcesContent":["import { FolderOpen, Star, Trash2, Clock } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ninterface EmptyStateProps {\n type: \"all\" | \"recent\" | \"starred\" | \"bin\";\n onUpload?: () => void;\n onNewFolder?: () => void;\n}\n\nexport function EmptyState({ type, onUpload, onNewFolder }: EmptyStateProps) {\n const { t } = useI18n();\n const configs = {\n all: {\n icon: <FolderOpen className=\"size-16 text-text-tertiary\" />,\n title: tWithFallback(\n t,\n \"files.empty.all.title\",\n \"No files or folders yet\",\n ),\n description: tWithFallback(\n t,\n \"files.empty.all.description\",\n \"Upload files or create folders to get started\",\n ),\n showActions: true,\n },\n recent: {\n icon: <Clock className=\"size-16 text-text-tertiary\" />,\n title: tWithFallback(t, \"files.empty.recent.title\", \"No recent files\"),\n description: tWithFallback(\n t,\n \"files.empty.recent.description\",\n \"Files you recently opened will appear here\",\n ),\n showActions: false,\n },\n starred: {\n icon: <Star className=\"size-16 text-text-tertiary\" />,\n title: tWithFallback(t, \"files.empty.starred.title\", \"No starred items\"),\n description: tWithFallback(\n t,\n \"files.empty.starred.description\",\n \"Star files and folders to find them easily\",\n ),\n showActions: false,\n },\n bin: {\n icon: <Trash2 className=\"size-16 text-text-tertiary\" />,\n title: tWithFallback(t, \"files.empty.bin.title\", \"Bin is empty\"),\n description: tWithFallback(\n t,\n \"files.empty.bin.description\",\n \"Deleted files and folders will appear here\",\n ),\n showActions: false,\n },\n };\n\n const config = configs[type];\n\n return (\n <div className=\"flex flex-col items-center justify-center py-20 px-4 animate-in fade-in duration-500\">\n <div className=\"mb-4 animate-in zoom-in duration-300 delay-100\">\n {config.icon}\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">\n {config.title}\n </h3>\n <p className=\"text-sm text-text-secondary mb-6 text-center max-w-md\">\n {config.description}\n </p>\n\n {config.showActions && (\n <div className=\"flex gap-3 animate-in fade-in slide-in-from-bottom-2 duration-300 delay-200\">\n {onNewFolder && (\n <button\n onClick={onNewFolder}\n className=\"px-4 py-2 text-sm font-medium text-text-primary bg-bg-surface border border-border-default rounded-lg hover:bg-action-ghost-bg-hover transition-all duration-200\"\n >\n {tWithFallback(t, \"files.empty.newFolder\", \"New Folder\")}\n </button>\n )}\n {onUpload && (\n <button\n onClick={onUpload}\n className=\"px-4 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg rounded-lg hover:bg-action-primary-bg-hover transition-all duration-200\"\n >\n {tWithFallback(t, \"files.empty.uploadFiles\", \"Upload Files\")}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AAUA,SAAgB,EAAW,EAAE,SAAM,aAAU,kBAAgC;CAC3E,IAAM,EAAE,SAAM,GAAS,EAgDjB,IA/CU;EACd,KAAK;GACH,MAAM,kBAAC,GAAD,EAAY,WAAU,8BAA+B,CAAA;GAC3D,OAAO,EACL,GACA,yBACA,0BACD;GACD,aAAa,EACX,GACA,+BACA,gDACD;GACD,aAAa;GACd;EACD,QAAQ;GACN,MAAM,kBAAC,GAAD,EAAO,WAAU,8BAA+B,CAAA;GACtD,OAAO,EAAc,GAAG,4BAA4B,kBAAkB;GACtE,aAAa,EACX,GACA,kCACA,6CACD;GACD,aAAa;GACd;EACD,SAAS;GACP,MAAM,kBAAC,GAAD,EAAM,WAAU,8BAA+B,CAAA;GACrD,OAAO,EAAc,GAAG,6BAA6B,mBAAmB;GACxE,aAAa,EACX,GACA,mCACA,6CACD;GACD,aAAa;GACd;EACD,KAAK;GACH,MAAM,kBAAC,GAAD,EAAQ,WAAU,8BAA+B,CAAA;GACvD,OAAO,EAAc,GAAG,yBAAyB,eAAe;GAChE,aAAa,EACX,GACA,+BACA,6CACD;GACD,aAAa;GACd;EACF,CAEsB;AAEvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAO;IACJ,CAAA;GACN,kBAAC,MAAD;IAAI,WAAU;cACX,EAAO;IACL,CAAA;GACL,kBAAC,KAAD;IAAG,WAAU;cACV,EAAO;IACN,CAAA;GAEH,EAAO,eACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,KACC,kBAAC,UAAD;KACE,SAAS;KACT,WAAU;eAET,EAAc,GAAG,yBAAyB,aAAa;KACjD,CAAA,EAEV,KACC,kBAAC,UAAD;KACE,SAAS;KACT,WAAU;eAET,EAAc,GAAG,2BAA2B,eAAe;KACrD,CAAA,CAEP;;GAEJ"}
@@ -0,0 +1,37 @@
1
+ import { FC } from 'react';
2
+ import { FileItem, FolderItem } from '../types';
3
+ interface FileBrowserProps {
4
+ files: FileItem[];
5
+ folders: FolderItem[];
6
+ loading?: boolean;
7
+ error?: Error | null;
8
+ preserveSortOrder?: boolean;
9
+ onFilePreview?: (file: FileItem) => void;
10
+ onFileShare?: (file: FileItem) => void;
11
+ onFileDelete?: (file: FileItem) => void;
12
+ onFileRestore?: (file: FileItem) => void;
13
+ onFileFavorite?: (file: FileItem) => void;
14
+ onFileRename?: (file: FileItem) => void;
15
+ onFileDownload?: (file: FileItem) => void;
16
+ onFileCopy?: (file: FileItem) => void;
17
+ onFileMove?: (file: FileItem) => void;
18
+ onFileInfo?: (file: FileItem) => void;
19
+ onFileActivity?: (file: FileItem) => void;
20
+ onFolderOpen?: (folder: FolderItem) => void;
21
+ onFolderShare?: (folder: FolderItem) => void;
22
+ onFolderDelete?: (folder: FolderItem) => void;
23
+ onFolderRestore?: (folder: FolderItem) => void;
24
+ onFolderRename?: (folder: FolderItem) => void;
25
+ onFolderFavorite?: (folder: FolderItem) => void;
26
+ onFolderCopy?: (folder: FolderItem) => void;
27
+ onFolderMove?: (folder: FolderItem) => void;
28
+ onFolderInfo?: (folder: FolderItem) => void;
29
+ onFolderActivity?: (folder: FolderItem) => void;
30
+ onMoveFile?: (fileId: string, targetFolderId: string) => Promise<void>;
31
+ onCopyFile?: (fileId: string, targetFolderId: string) => Promise<void>;
32
+ onMoveFolder?: (folderId: string, targetFolderId: string) => Promise<void>;
33
+ onCopyFolder?: (folderId: string, targetFolderId: string) => Promise<void>;
34
+ }
35
+ export declare const FileBrowser: FC<FileBrowserProps>;
36
+ export {};
37
+ //# sourceMappingURL=FileBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileBrowser.d.ts","sourceRoot":"","sources":["../../../src/files/components/FileBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAY,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAmBrD,UAAU,gBAAgB;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5E;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA0nB5C,CAAC"}